psb_cmdbuf.c revision 680952832ef474a95bb0c4fee50c06e5126ad66d
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Waldo Bastian <waldo.bastian@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h> 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h" 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h" 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h" 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h" 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h" 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h" 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h" 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h" 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h> 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h" 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h> 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h> 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h> 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout: 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cmd_base <= cmd_idx < CMD_END() == lldma_base 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size) 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout: 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size) 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf) (cmdbuf->reloc_base) 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf) (cmdbuf->MTX_msg + cmdbuf->reloc_size) 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf) (cmdbuf->lldma_base) 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE (0x1000) 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE (0x3000) 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE (0x3000) 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE (0x2000) 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN (0x0040) 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN (0x0800) 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN (0x0400) 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN (0x0400) 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT 12 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE (0x0800) 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_lldma_create_internal(psb_cmdbuf_p cmdbuf, 99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_CMD *pLLDMACmd, 100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p bitstream_buf, 101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset, 102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size, 103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dest_offset, 104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE cmd); 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data, 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_p cmdbuf 111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int size = CMD_SIZE + LLDMA_SIZE; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE; 116bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_base = NULL; 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_idx = NULL; 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 10; 1382befccec034c13d34746a9e87149889d59ac767bFei Jiang cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == cmdbuf->buffer_refs) { 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf); 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = size; 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf); 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = reloc_size; 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf); 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = regio_size; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) { 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_destroy(cmdbuf); 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf) 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->size) { 168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->buf); 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->reloc_size) { 172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->reloc_buf); 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->regio_size) { 176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->regio_buf); 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->buffer_refs_allocated) { 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = NULL; 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf) 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count = 0; 208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count = 0; 209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->host_be_opp_count = 0; 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->frame_info_count = 0; 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE; 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = cmdbuf->lldma_base; 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE; 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add ourselves to the buffer list */ 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */ 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */ 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf) 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = NULL; 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->reloc_buf); 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf) 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int item_loc = 0; 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun // buf->next = NULL; /* buf->next only used for buffer list validation */ 270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((item_loc < cmdbuf->buffer_refs_count) 272bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 273bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) { 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun item_loc++; 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc == cmdbuf->buffer_refs_count) { 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Add new entry */ 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc >= cmdbuf->buffer_refs_allocated) { 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Allocate more entries */ 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int new_size = cmdbuf->buffer_refs_allocated + 10; 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p *new_array; 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == new_array) { 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return -1; /* Allocation failure */ 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_allocated = new_size; 289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs = new_array; 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs[item_loc] = buf; 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count++; 293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* only for RAR buffers */ 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((cmdbuf->buffer_refs[item_loc] != buf) 300bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (buf->rar_handle != 0)) { 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc]; 302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n", 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((tmp->next != NULL)) { 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = tmp->next; 306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp == buf) /* found same buffer */ 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp != buf) { 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp->next = buf; /* link it */ 312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("RAR: buffer aleady in the list, skip\n", 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return item_loc; 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf" 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer" 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift". 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background". 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf, 332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *addr_in_cmdbuf, 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p ref_buffer, 334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buf_offset, 335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t mask, 336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t background, 337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t align_shift, 338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */ 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check that address is within buffer range */ 344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (dst_buffer) { 345e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base); 346e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf)); 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */ 348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 349e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg); 350e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf)); 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */ 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer); 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(reloc->buffer != -1); 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n", reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset); 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (presumed_offset) { 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t new_val = presumed_offset + buf_offset; 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = (background & ~mask) | (new_val & mask); 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = new_val; 368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = PSB_RELOC_MAGIC; 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->mask = mask; 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->pre_add = buf_offset; 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->background = background; 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->dst_buffer = dst_buffer; 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx++; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 379e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf)); 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context) 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf) { 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current++; 397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) { 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current = 0; 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current]; 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_cmdbuf_reset(cmdbuf); 402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!ret) { 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Success */ 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = cmdbuf; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then) 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang long long val; 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = now->tv_sec - then->tv_sec; 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val *= 1000000LL; 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val += now->tv_usec; 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val -= then->tv_usec; 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val < 1LL) 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun val = 1LL; 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (unsigned) val; 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1). 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle, 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned relocBufHandle, unsigned relocBufOffset, 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned numRelocs, drm_clip_rect_t * clipRects, int damage, 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg) 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drm_psb_cmdbuf_arg_t ca; 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg_list; 444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i; 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct timeval then, now; 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool have_then = FALSE; 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count); 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg_list == NULL) { 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Malloc failed \n"); 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -ENOMEM; 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_req *req = &arg->d.req; 4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->next = (unsigned long) & (arg_list[i+1]); 461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->group = 0; 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_flags = PSB_USE_PRESUMED; 4694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo req->pad64 = (uint32_t)buffer_list[i]->pl_flags; 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list[buffer_count-1].d.req.next = 0; 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.buffer_list = (uint64_t)((unsigned long)arg_list); 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.clip_rects = (uint64_t)((unsigned long)clipRects); 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.fence_arg = (uint64_t)((unsigned long)fence_arg); 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_handle = 0; 4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_offset = 0; 4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_size = 0; 481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_handle = cmdBufHandle; 4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_offset = cmdBufOffset; 4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_size = cmdBufSize; 485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_handle = relocBufHandle; 4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_offset = relocBufOffset; 4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.num_relocs = numRelocs; 489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_flags = fence_flags; 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.engine = engine; 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 493bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0 494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: buffer_list = %08x\n", ca.buffer_list); 495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: clip_rects = %08x\n", ca.clip_rects); 496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle); 497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset); 498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: cmdbuf_size = %08x\n", ca.cmdbuf_size); 499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: reloc_handle = %08x\n", ca.reloc_handle); 500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: reloc_offset = %08x\n", ca.reloc_offset); 501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: num_relocs = %08x\n", ca.num_relocs); 502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: engine = %08x\n", ca.engine); 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("PSB submit: fence_flags = %08x\n", ca.fence_flags); 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * X server Signals will clobber the kernel time out mechanism. 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * we need a user-space timeout as well. 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == EAGAIN) { 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!have_then) { 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&then, NULL)) { 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang have_then = TRUE; 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&now, NULL)) { 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC)); 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("command write return is %d\n", ret); 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_rep *rep = &arg->d.rep; 537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!arg->handled) { 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = -EFAULT; 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (arg->ret != 0) { 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = arg->ret; 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout: 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(arg_list); 552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer no longer queued in userspace 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = buffer_list[i]; 557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * RAR slice buffer/surface buffer are share one BO, and then only one in 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer_list, but they are linked in psb_cmdbuf_buffer_ref 561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buffer_list[i]->rar_handle == 0) 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized */ 565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p p = tmp; 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->status) { 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_queued: 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p->status = psb_bs_ready; 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_abandoned: 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy(p); 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(p); 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Not supposed to happen */ 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(0); 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (tmp); 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...) psb__trace_message(fmt, ##arg) 593e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang#define DB(fmt, arg1, arg...) psb__trace_message("[%08x] %08x = " fmt, ((unsigned char *) arg1) - cmd_start, *arg1, ##arg) 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */ 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes) 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t); 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *cmd_end = cmd_idx + cmd_size; 600e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *cmd_start = cmd_idx; 601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct { 602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int start; 603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int end; 604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang char *name; 605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } msvdx_regs[10] = {{0x04800000, 0x048003FF, "MTX_MTX"}, 606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800400, 0x0480047F, "VDMC_MTX"}, 607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800480, 0x048004FF, "VDEB_MTX"}, 608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800500, 0x048005FF, "DMAC_MTX"}, 609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800600, 0x048006FF, "SYS_MTX"}, 610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800700, 0x048007FF, "VEC_IQRAM_MTX"}, 611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04800800, 0x04800FFF, "VEC_MTX"}, 612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04801000, 0x04801FFF, "CMD_MTX"}, 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04802000, 0x04802FFF, "VEC_RAM_MTX"}, 614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun {0x04803000, 0x04804FFF, "VEC_VLC_M"} 615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }; 616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size); 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (cmd_idx < cmd_end) { 619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t cmd = *cmd_idx; 620dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* What about CMD_MAGIC_BEGIN ?*/ 621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (cmd & CMD_MASK) { 622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_NOP: { 623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_NOPE\n", cmd_idx); 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_HEADER: { 629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK; 630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_HEADER context = %08x\n", cmd_idx, context); 631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("StatusBufferAddress\n", cmd_idx); 633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("PreloadSave\n", cmd_idx); 635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("PreloadRestore\n", cmd_idx); 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_REGVALPAIR_WRITE: { 641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT; 642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count); 643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 645dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (count--) { 646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i; 647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < 10; i++) { 648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((*cmd_idx >= msvdx_regs[i].start) && 649bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (*cmd_idx <= msvdx_regs[i].end)) 650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff); 653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("value\n", cmd_idx); 655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_RENDEC_WRITE: { 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t encoding; 661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT; 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count); 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("RENDEC_SL_HDR\n", cmd_idx); 666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("RENDEC_SL_NULL\n", cmd_idx); 669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun do { 672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t chk_hdr = *cmd_idx; 673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun count = 1 + ((chk_hdr & 0x07FF0000) >> 16); 674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4; 675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun encoding = (chk_hdr & 0x07); 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((count == 1) && (encoding == 7)) { 677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun count = 0; 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("SLICE_SEPARATOR\n", cmd_idx); 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding); 681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (count && (count < 0x1000)) { 685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("value\n", cmd_idx); 686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun count -= 2; 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } while (encoding != 0x07); 691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_COMPLETION: { 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (*cmd_idx == PSB_RELOC_MAGIC) { 696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_COMPLETION\n", cmd_idx); 701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 702dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// DB("interrupt\n", cmd_idx); 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// cmd_idx++; 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_LLDMA: { 709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_LLDMA\n", cmd_idx); 710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_SLLDMA: { 714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_SLLDMA\n", cmd_idx); 715dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case CMD_SR_SETUP: { 719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_SR_SETUP\n", cmd_idx); 720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("offset in bits\n", cmd_idx); 722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("size in bytes\n", cmd_idx); 724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (*cmd_idx == PSB_RELOC_MAGIC) { 729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DB("*** Unknown command ***\n", cmd_idx); 734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmd_idx++; 735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } /* switch */ 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } /* while */ 7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence) 7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmFenceUnreference(&pFence); 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject * 751bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data, 752bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang struct psb_ttm_fence_rep *fence_rep, int *status) 7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence = NULL; 7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = -1; 757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* copy fence information */ 7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence_rep->error != 0) { 7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("drm failed to create a fence" 7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang " and has idled the HW\n"); 7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_rep->fence_type, 768e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)fence_rep->handle, 7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0); 770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (fence) 771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0); 772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return fence; 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT]; 7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT]; 7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count; 7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count; 7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start; 7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 784bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define MAX_DUMP_COUNT 20 7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT]; 7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT]; 7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_offset[MAX_DUMP_COUNT]; 7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_size[MAX_DUMP_COUNT]; 7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_count = 0; 7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from); 7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from); 7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from) 7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (bit_to < 31) { 798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun val &= ~(0xffffffff << (bit_to + 1)); 7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = val >> bit_from; 8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(fmt, val); 8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0; 8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size) 8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (offset + size > 8) 8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size = 8 - offset; 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("[%04x]", g_hexdump_offset); 8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += offset; 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += size; 813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (offset-- > 0) { 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" --"); 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (size-- > 0) { 8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" %02x", *p++); 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("\n"); 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 822e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangstatic void psb__hexdump(unsigned char *addr, int size) 8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned char *p = (unsigned char *) addr; 825dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int offset = g_hexdump_offset % 8; 8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset -= offset; 828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (offset) { 8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, offset, size); 8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8 - offset; 8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8 - offset; 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (1) { 835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (size < 8) { 836dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (size > 0) { 8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, 0, size); 8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("[%04x] %02x %02x %02x %02x %02x %02x %02x %02x\n", g_hexdump_offset, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); 8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8; 8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8; 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += 8; 8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size) 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(debug_dump_count < MAX_DUMP_COUNT); 8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_name[debug_dump_count] = name; 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_buf[debug_dump_count] = buf; 8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_offset[debug_dump_count] = offset; 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_size[debug_dump_count] = size; 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count++; 8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment 8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p cmdbuf) 8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 866e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE; 867e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used; 868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */, 870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bytes_used, 871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* destination offset */, 872dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE_RENDER_BUFF_MC); 8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = CMD_NEXT_SEG; 874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf)); 875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *(cmdbuf->last_next_segment_cmd + 1) = bytes_used; 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_deblock(object_context_p obj_context) 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 881bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_DEBLOCK_SIZE; 882e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBLOCKPARAMS* pdbParams; 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("Send two pass deblock cmd\n"); 886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->cmd_count) { 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("two pass deblock cmdbuf has render msg!\n"); 888dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 1; 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count++; 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */ 895bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_DEBLOCK); 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 897bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 898bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_FLAGS, FW_VA_RENDER_HOST_INT); 899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pdbParams = (DEBLOCKPARAMS*)(msg + 16 / sizeof(uint32_t)); 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf)); 903437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */ 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->buffer_size = cmdbuf->regio_size; 905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pdbParams->ctxid = (obj_context->msvdx_context & 0xfff); 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */ 9114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context, 9124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_a, 9134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_b, 9144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p colocate_buffer, 9154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t picture_widht_mb, 9164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t frame_height_mb, 9174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t rotation_flags, 918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t field_type, 919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t ext_stride_a, 9204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_a, 9214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_b, 9224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t is_oold) 9234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 9244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 9254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 9264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE; 9274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 9284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo FW_VA_DEBLOCK_MSG *deblock_msg; 9294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 930dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (IS_MFLD(driver_data)) 9314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 9324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 933bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang item_size = FW_VA_RENDER_SIZE; 9344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 935e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count); 9364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 9384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 9394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_size = msg_size; 941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (is_oold) 9424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD; 9434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 9444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD; 945bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE; 9464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->flags.bits.slice_type = field_type; 9474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->operating_mode = obj_context->operating_mode; 948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context); 9494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 950dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 9514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->ext_stride_a = ext_stride_a; 9524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->rotation_flags = rotation_flags; 9534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 9554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buf_b) { 9574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 9584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 9604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer); 9624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->deblock_count++; 9634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return 0; 9644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_oold(object_context_p obj_context, 967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p src_buf, 968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p dst_buf, 969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p colocate_buffer, 970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t picture_width_in_mb, 971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t frame_height_in_mb, 972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t field_type, 973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t chroma_offset) 974437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 975437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 976bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_OOLD_SIZE; 977e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE); 978bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang FW_VA_OOLD_MSG *oold_msg; 979437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer) { 981dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("%s L%d Invalide src_buf, dst_buf or colocate_buffer\n", 982dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun __FUNCTION__, __LINE__); 983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_BUFFER; 9842befccec034c13d34746a9e87149889d59ac767bFei Jiang } 9852befccec034c13d34746a9e87149889d59ac767bFei Jiang 986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("Send out of loop deblock cmd\n"); 987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count++; 989437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(msg, 0, msg_size); 990bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang oold_msg = (FW_VA_OOLD_MSG *) msg; 991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 992bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_OOLD_SIZE); 993bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_OOLD); 994bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 995437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 996bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_OPERATING_MODE, obj_context->operating_mode); 997bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb); 998bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb); 999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf); 1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf); 1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf); 1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf); 1004437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer); 1006437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1007bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_SLICE_FIELD_TYPE, field_type); 1008dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 1011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1012dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_host_be_opp(object_context_p obj_context, psb_buffer_p dst_buf, 1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t stride, uint32_t size, 1014dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t picture_width_mb, 1015dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size_mb) 1016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{ 1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 1018bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_HOST_BE_OPP_SIZE; 1019680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_driver_data_p driver_data = obj_context->driver_data; 1020680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t *msg; 1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1022e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang if ((NULL == cmdbuf) || (((0 == cmdbuf->cmd_count) && (0 == cmdbuf->host_be_opp_count) && 1023e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (0 == cmdbuf->deblock_count)) || (0 == cmdbuf->frame_info_count))) { 1024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_context_get_next_cmdbuf(obj_context); 1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf = obj_context->cmdbuf; 1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1027680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1028680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if (!IS_MFLD(driver_data)) 1029680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE + 1030680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->oold_count * FW_VA_OOLD_SIZE + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE; 1031680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1032680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DEVA_DECODE_SIZE + 1033680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->oold_count * FW_VA_OOLD_SIZE + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE; 1034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1035bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /* psb__information_message("Send host be opp cmd\n"); */ 1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->host_be_opp_count++; 1038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(msg, 0, msg_size); 1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1040680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_HOST_BE_OPP_SIZE); 1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DAVA_MSGID_HOST_BE_OPP); 1042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1043680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if (!IS_MFLD(driver_data)) { 1044680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_CONTEXT, ((obj_context->msvdx_context >> 8) | 0x1)); 1045680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } else { 1046680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* context is 8 bits on MFLD DDK3.0 */ 1047680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_CONTEXT, (obj_context->msvdx_context)); 1048680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1049bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_FLAGS, FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY); 1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 1052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_frame_info(object_context_p obj_context, psb_buffer_p dst_buf, 1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t stride, uint32_t size, 1056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t picture_width_mb, 1057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size_mb) 1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{ 1059dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun FRAME_INFO_PARAMS* frame_info; 1060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 1061bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_FRAME_INFO_SIZE; 1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1063e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1065bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /* psb__information_message("Send frame info cmd\n"); */ 1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->frame_info_count++; 1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(msg, 0, msg_size); 1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*first word is used to store message id and message size*/ 1070bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_FRAME_INFO_SIZE); /* Deblock message size is 16 bytes */ 1071bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_FRAME_INFO); 1072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1073dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info = (FRAME_INFO_PARAMS*)(msg + 4 / sizeof(uint32_t)); 1074dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1075dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info->handle = wsbmKBufHandle(wsbmKBuf(dst_buf->drm_buf)); 1076dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info->buffer_size = size; 1077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info->buffer_stride = stride; 1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info->picture_width_mb = picture_width_mb; 1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun frame_info->size_mb = size_mb; 1080437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 1081437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1082437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf 10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context) 10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 10914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 10924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 10934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (IS_MFLD(driver_data)) 10954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 10964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 1097bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang item_size = FW_VA_RENDER_SIZE; 10984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1099e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->last_next_segment_cmd) { 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size = cmdbuf->first_segment_size; 1103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_close_segment(cmdbuf); 11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = item_size; 1107e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE); 11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base; 1111e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 1112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun debug_cmd_count = cmdbuf->cmd_count + 1; 11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define DUMP_CMDBUF 0 11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if DUMP_CMDBUF 11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static int c = 0; 11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static char pFileName[30]; 11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sprintf(pFileName , "cmdbuf%i.txt", c++); 1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun FILE* pF = fopen(pFileName, "w"); 11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF); 11264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fclose(pF); 11274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 11284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count++; 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case. 11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 1134e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, msg_size); 1137bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_RENDER); 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!IS_MFLD(driver_data)) { 11404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* TODO: Need to make context more unique */ 1141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->ec_enabled) { /* ec firmware hw issue, unknown reason */ 1142bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_CONTEXT, ((obj_context->msvdx_context >> 8) | 0x1)); 1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1144bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_CONTEXT, obj_context->msvdx_context); 1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 11464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Point to CMDBUFFER */ 1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 1149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */, 1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuffer_size, 1151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* destination offset */, 1152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC); 11534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* This is the last relocation */ 1154bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang RELOC_MSG(*(msg + (FW_VA_RENDER_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))), 1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lldma_record_offset, &(cmdbuf->buf)); 1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1157bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE, cmdbuffer_size); // In bytes 1158bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_OPERATING_MODE, obj_context->operating_mode); 1159bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME, obj_context->last_mb); 1160bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE, obj_context->first_mb); 1161bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FLAGS, obj_context->flags); 1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1163439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */ 11644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Point to CMDBUFFER */ 1166680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifndef DE3_FIRMWARE 1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */, 1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuffer_size, 1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* destination offset */, 1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC); 11724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* This is the last relocation */ 1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))), 1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lldma_record_offset, &(cmdbuf->buf)); 1175680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else 1176680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))), 1177680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf)); 1178680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 11794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE, cmdbuffer_size / 4); // In dwords 11804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE, obj_context->operating_mode); 11814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, obj_context->flags); 11824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList); 11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base; 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Indicate last LLDMA record (for debugging) */ 11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ((uint32_t *)cmdbuf->lldma_idx)[1] = 0; 11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1190e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx; 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb_context_flush_cmdbuf(obj_context); 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) || 1196e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) || 1197e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) || 1198bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) || 1199e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) { 1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb_context_flush_cmdbuf(obj_context); 12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs 12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context) 12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data = obj_context->driver_data; 12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int fence_flags; 1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* unsigned int fence_handle = 0; */ 12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep fence_rep; 12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_offset; 12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int num_relocs; 12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 12194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 12204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (IS_MFLD(driver_data)) 12224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 12234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 1224bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang item_size = FW_VA_RENDER_SIZE; 12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((NULL == cmdbuf) || 1227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) { 12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; // Nothing to do 12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = 0; 1232e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LOCK */ 12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 12417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->frame_info_count; i++) { 1244bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_FRAME_INFO_SIZE; 1245bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t); 1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->cmd_count; i++) { 12494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t flags; 1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (IS_MFLD(driver_data)) 12524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS); 12534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 1254bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang flags = MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS); 12554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update flags */ 1257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count 1258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + cmdbuf->host_be_opp_count)); 1259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= 1260bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG) | 1261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (obj_context->video_op == psb_video_vld ? FW_VA_RENDER_IS_VLD_NOT_MC : 0); 12627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1263680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifdef MFLD_ERROR_CONCEALMENT 1264680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if (driver_data->ec_enabled) 1265680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else 1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->ec_enabled && IS_MRST(driver_data)) 1267680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 1268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= FW_ERROR_DETECTION_AND_RECOVERY; 12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (IS_MFLD(driver_data)) { 1271bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang flags &= ~FW_VA_RENDER_IS_VLD_NOT_MC; 12724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags); 1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1274bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FLAGS, flags); 12754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!IS_MFLD(driver_data)) { 1279bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE)); 1280bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_OPERATING_MODE)); 1281bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__trace_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME)); 1282bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE)); 1283bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS)); 1284bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 1285bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE)); 1286bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_OPERATING_MODE)); 1287bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME)); 1288bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE)); 1289bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang psb__information_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS)); 1290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 1291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 1292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 1293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 1294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 1296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 1297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 1298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 12997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0 /* todo */ 13024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Update SAREA */ 13034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context; 13044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 13054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg += item_size / sizeof(uint32_t); 13064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += item_size; 13077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Assume deblock message is following render messages and no more render message behand deblock message */ 1310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->deblock_count; i++) { 1311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!IS_MFLD(driver_data)) 1312bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_DEBLOCK_SIZE; 13134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 13144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += FW_DEVA_DEBLOCK_SIZE; 13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->oold_count; i++) { 1318bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_OOLD_SIZE; 1319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->host_be_opp_count; i++) { 1322bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_HOST_BE_OPP_SIZE; 1323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now calculate the total number of relocations */ 13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg; 1327e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE); 1331e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang psb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n", (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE); 1332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE); 1333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE); 13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_unmap(cmdbuf); 13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(NULL); /* Flush trace */ 13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->MTX_msg); 1343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->reloc_base); 13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = 0; 13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* cmdbuf will be validated as part of the buffer list */ 13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Submit */ 13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1 13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteLockKernelBO(); 1355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs, 1356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count, 1357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 1358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, msg_size, 1359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 1360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc_offset, num_relocs, 1361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep); 13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteUnlockKernelBO(); 13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = 1; 13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun static int error_count = 0; 13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int status = 0; 1379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun struct _WsbmFenceObject *fence = NULL; 13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = psb_fence_wait(driver_data, &fence_rep, &status); 1382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence); 1383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 1384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 1386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 13877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (getenv("PSB_VIDEO_TRACE_LLDMA")) { 1389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("lldma_count = %d, vitual=0x%08x\n", 1390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_lldma_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE); 1391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < debug_lldma_count; i++) { 1392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start); 1393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pasDmaList += i; 1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base); 1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, BSWAP, 31, 31) 1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, DIR, 30, 30) 1398437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, PW, 29, 28) 1399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_FIN, 31, 31) 1400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_INT, 30, 30) 1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, PI, 18, 17) 1402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, INCR, 16, 16) 1403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, LEN, 15, 0) 1404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(2, ADDR, 22, 0) 1405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, ACC_DEL, 31, 29) 1406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, BURST, 28, 26) 1407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(3, EXT_SA, 3, 0) 1408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, 2D_MODE, 16, 16) 1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, REP_COUNT, 10, 0) 1410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(5, LINE_ADD_OFF, 25, 16) 1411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(5, ROW_LENGTH, 9, 0) 1412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(6, SA, 31, 0) 1413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(7, LISTPTR, 27, 0) 1414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("debug_dump_count = %d\n", debug_dump_count); 1420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < debug_dump_count; i++) { 1421e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *buf_addr; 14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("Buffer %d = '%s' offset = %08x size = %08x\n", i, debug_dump_name[i], debug_dump_offset[i], debug_dump_size[i]); 1423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (debug_dump_buf[i]->rar_handle 1424bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang || (psb_buffer_map(debug_dump_buf[i], &buf_addr) != 0)) { 1425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("Unmappable buffer,e.g. RAR buffer\n"); 1426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang continue; 1427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset = 0; 1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__hexdump(buf_addr + debug_dump_offset[i], debug_dump_size[i]); 1431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(debug_dump_buf[i]); 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count = 0; 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("cmd_count = %d, virtual=0x%08x\n", 1436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf)); 1437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < debug_cmd_count; i++) { 1438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *msg = cmdbuf->MTX_msg + i * item_size; 1439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int j; 1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]); 1441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i]); 1442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (j = 0; j < item_size / 4; j++) { 1444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j)); 1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (j) { 1446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 0: 1447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[BufferSize|ID|MSG_SIZE]\n"); 1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 1: 1450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[MMUPTD]\n"); 1451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 2: 1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[LLDMA_address]\n"); 1454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 3: 1456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[Context]\n"); 1457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 4: 1459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[Fence_Value]\n"); 1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 5: 1462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[Operating_Mode]\n"); 1463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 6: 1465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[LastMB|FirstMB]\n"); 1466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case 7: 1468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[Flags]\n"); 1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__trace_message("[overflow]\n"); 1472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 1473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 1477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->reloc_buf); 1478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (status) { 14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status); 14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang error_count++; 1484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(status != 2); 14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(error_count < 40); /* Exit on 40 errors */ 14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence) 1488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_fence_destroy(fence); 1489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 1490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 1493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0 = 0, 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1 = 1, 15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP; 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX = 0, 15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST = 1, 15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION; 15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct { 1509bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_UINT32 ui32DevDestAddr ; /* destination address */ 1510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePW ePeripheralWidth; 1511bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncrSize ePeriphIncrSize; 1512bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncr ePeriphIncr; 1513bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_BOOL bSynchronous; 1514bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MMU_GROUP eMMUGroup; 1515bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_DIRECTION eDMADir; 1516bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_eBurst eDMA_eBurst; 15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP; 15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = { 1521bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /* LLDMA_TYPE_VLC_TABLE */ { 1522bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang REG_MSVDX_VEC_VLC_OFFSET , 1523bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PWIDTH_16_BIT, /* 16 bit wide data*/ 1524bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PERIPH_INCR_4, /* Incrament the dest by 32 bits */ 1525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_2 1530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* LLDMA_TYPE_BITSTREAM */ { 1532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET), 1533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_8_BIT, 1534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1541bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /*LLDMA_TYPE_RESIDUAL*/ { 1542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET), 1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_MC*/{ 1553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1560bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_VLD*/{ 1563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1570bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1571dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{ 1573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1580bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* From VLR */ 1581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{ 1583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* Into VLR */ 1591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{ 1593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1597bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1600bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* From MTX */ 1601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{ 1603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1607bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1610bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{ 1613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1617bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1620bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 //2 /* From MTX */ 1621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{ 1623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1627bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1630bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MEM_SET */{ 1633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0), 1634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, /* na */ 1638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 /* From VLR */ 1641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN ( 0xffff ) 16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_cmdbuf(psb_cmdbuf_p cmdbuf, 1649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p bitstream_buf, 1650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset, 1651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size, 1652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dest_offset, 1653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE cmd) 16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++; 16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size, 1657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_offset, cmd); 16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1660680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size) 1661680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1662680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang void *pos = (void *)cmdbuf->cmd_idx; 1663680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(!(byte_size % 4)); 1664680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1665680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx += (byte_size / 4); 1666680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1667680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang return pos; 1668680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1669680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1670680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf, 1671680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1672680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1673680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size, 1674680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t dest_offset, 1675680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_TYPE type) 1676680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1677680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(size < 0xFFFF); 1678680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(buffer_offset < 0xFFFF); 1679680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1680680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_CMD_WITH_OFFSET* dma_cmd; 1681680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1682680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(dest_offset==0) 1683680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1684680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD)); 1685680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = 0; 1686680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1687680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1688680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1689680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET)); 1690680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined 1691680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32ByteOffset = dest_offset; 1692680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1693680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1694680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= CMD_DMA; 1695680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= (IMG_UINT32)type; 1696680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= size; 1697680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* dma_cmd->ui32DevVirtAdd = ui32DevVirtAddress; */ 1698680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf); 1699680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1700680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunuint32_t psb_cmdbuf_lldma_create(psb_cmdbuf_p cmdbuf, 17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 17057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1708e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t lldma_record_offset = (((unsigned char *)cmdbuf->lldma_idx) - ((unsigned char *) cmdbuf->cmd_base)); 17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size, 1710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun dest_offset, cmd); 17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return lldma_record_offset; 17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_bitstream(psb_cmdbuf_p cmdbuf, 17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size_in_bytes, 17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t offset_in_bits, 17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t flags) 17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 1725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * We use byte alignment instead of 32bit alignment. 1726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * The third frame of sa10164.vc1 results in the following bitstream 1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * patttern: 1728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * [0000] 00 00 03 01 76 dc 04 8d 1729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * with offset_in_bits = 0x1e 1730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * This causes an ENTDEC failure because 00 00 03 is a start code 1731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * By byte aligning the datastream the start code will be eliminated. 1732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define ALIGNMENT sizeof(uint8_t) 1736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t bs_offset_in_dwords = ((offset_in_bits / 8) / ALIGNMENT); 17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = offset_in_bits; 17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = size_in_bytes; 1746dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_lldma_write_cmdbuf(cmdbuf, bitstream_buf, buffer_offset, 1748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size_in_bytes, 0, LLDMA_TYPE_BITSTREAM); 17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1751437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes); 17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1756680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 1757680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1758680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf, 1759680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1760680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1761680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes, 1762680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t offset_in_bits, 1763680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t flags) 1764680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1765680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* 1766680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * We use byte alignment instead of 32bit alignment. 1767680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * The third frame of sa10164.vc1 results in the following bitstream 1768680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * patttern: 1769680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * [0000] 00 00 03 01 76 dc 04 8d 1770680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * with offset_in_bits = 0x1e 1771680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * This causes an ENTDEC failure because 00 00 03 is a start code 1772680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * By byte aligning the datastream the start code will be eliminated. 1773680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1774680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 1775680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0 1776680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT sizeof(uint8_t) 1777680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t bs_offset_in_dwords = ((offset_in_bits / 8) / ALIGNMENT); 1778680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 1779680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 1780680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 1781680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 1782680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1783680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 1784680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = offset_in_bits; 1785680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 1786680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = size_in_bytes; 1787680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1788680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf); 1789680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1790680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1791680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1792680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/* 17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one 17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_bitstream_chained(psb_cmdbuf_p cmdbuf, 1796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p bitstream_buf, 1797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size_in_bytes) 17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last; 1800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs, 1801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size_in_bytes, 0, LLDMA_TYPE_BITSTREAM); 18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update WD7 of last LLDMA record to point to this one */ 18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf)); 18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1808437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes); 18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1814680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/* 1815680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one 1816680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1817680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf, 1818680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1819680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes) 1820680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1821680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1822680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf); 1823680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1824680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 1825680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1826680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_lldma_create_internal(psb_cmdbuf_p cmdbuf, 1828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_CMD *pLLDMACmd, 1829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p bitstream_buf, 1830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset, 1831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size, 1832dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dest_offset, 1833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE cmd) 18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang const DMA_DETAIL_LOOKUP* pDmaDetail; 18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd; 18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList; 1838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun static IMG_UINT32 lu[] = {4, 2, 1}; 18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* See if we will fit */ 1841dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(cmdbuf->lldma_idx + sizeof(DMA_sLinkedList) < LLDMA_END(cmdbuf)); 18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pDmaDetail = &DmaDetailLookUp[cmd]; 18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth]; 18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA list must be 16byte alligned if it is done in Hw */ 1848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pasDmaList = (DMA_sLinkedList*)(cmdbuf->lldma_idx) ; 18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f ); 18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Offset of LLDMA record in cmdbuf */ 1852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) - ((IMG_UINT8*) cmdbuf->cmd_base)); 18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1854bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang ASSERT(0 == (ui32LLDMA_Offset & 0xf)); 18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset; 18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write the header */ 1859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pLLDMACmd) { 1860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA); 1861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf)); 18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while (ui32DMACount) { 1865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memset(pasDmaList , 0 , sizeof(DMA_sLinkedList)); 18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr); 18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD6 with relocation */ 18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_SA_SHIFT == 0); 18717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf); 18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ui32DMACount > MAX_DMA_LEN) { 1875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32LLDMA_Offset += sizeof(DMA_sLinkedList); 18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD7 with relocation */ 18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_LISTPTR_SHIFT == 0); 18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf)); 18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1883dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN); /* size */ 18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32DMACount -= MAX_DMA_LEN; 1886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1887dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON) { 18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Destination pointers */ 1889dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32DMADestAddr += ((MAX_DMA_LEN) * lu[pDmaDetail->ePeriphIncrSize]); 18907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Source Pointer */ 1893dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buffer_offset += ((MAX_DMA_LEN) * lu[pDmaDetail->ePeripheralWidth]); 1894dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 18957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This also set LIST_FIN in WD1 to 1*/ 18967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD7(pasDmaList, IMG_NULL); // next linked list 1897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount); /* size */ 18987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ui32DMACount = 0; 19007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 19017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Keep pointer in case we need to chain another LLDMA command */ 1903e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->lldma_last = (unsigned char *) pasDmaList; 19047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP, 1906dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (pDmaDetail->eDMADir == HOST_TO_MSVDX) ? DMA_DIR_MEM_TO_PERIPH : DMA_DIR_PERIPH_TO_MEM , 1907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pDmaDetail->ePeripheralWidth); 19087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1909dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup); 19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0); // 2d 19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD5(pasDmaList, 0, 0); // 2d 19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pasDmaList++; 19157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 19167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* there can be up to 3 Bytes of padding after header */ 1918e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->lldma_idx = (unsigned char *)pasDmaList; 19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1921680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifndef DE3_FIRMWARE 19227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers 19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1925680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags) 19264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 19274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 19284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 19294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->reg_start = cmdbuf->cmd_idx++; 19304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->reg_start = flags; 1931dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 19327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf, 1934dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t reg, 1935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buffer, 1936dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset) 19377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = reg; 19397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers 19447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1945dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf) 19467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2; 1948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 19494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->reg_start |= CMD_REGVALPAIR_WRITE | reg_count; 19507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 19517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1952680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else 1953680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags) 1954680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1955680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */ 1956680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1957680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_wt_p = cmdbuf->cmd_idx; 1958680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = 0; 1959680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */ 1960680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 1961680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1962680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1963680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val) 1964680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1965680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1966680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1967680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1968680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1969680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1970680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1971680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1972680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1973680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1974680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1975680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_wt_p++ = val; 1976680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1977680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1978680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1979680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf, 1980680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t reg, 1981680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p buffer, 1982680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset) 1983680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1984680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1985680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1986680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1987680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1988680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1989680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1990680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1991680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1992680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1993680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1994680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1995680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer); 1996680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1997680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1998680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1999680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf) 2000680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 2001680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx = cmdbuf->reg_wt_p; 2002680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 2003680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 2004680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 20057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2006dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum { 20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MTX_CTRL_HEADER = 0, 20087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_HDR, 20097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_NULL, 20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_CK_HDR, 20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS; 20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block 20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start_block(psb_cmdbuf_p cmdbuf) 20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 20197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = cmdbuf->cmd_idx; 20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0; 2022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO, 1); 2023dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD, 3); 2024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1); 20257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */ 20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += RENDEC_CK_HDR; 2029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 20307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block 20337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start_chunk(psb_cmdbuf_p cmdbuf, uint32_t dest_address) 20357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */ 20377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 20387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->rendec_chunk_start = 0; 20407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3); 2041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, (dest_address >> 2)); 2042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 20437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 20454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format 20464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 2047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address) 20484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 2049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(((dest_address >> 2)& ~0xfff) == 0); 20504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 20514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | ((dest_address >> 2) << 4); 2053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 20544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf, 2056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *block, 2057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size) 20587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((size & 0x3) == 0); 2060e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 2061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < size; i += 4) { 20627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24); 2063dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_rendec_write(cmdbuf, val); 20647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf, 2068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buffer, 2069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset) 20707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 20727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk 20767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end_chunk(psb_cmdbuf_p cmdbuf) 20787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 20807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 20817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1; 20827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, 2084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RENDEC_SLICE_INFO, 2085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun CK_HDR, 2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun CK_NUM_SYMBOLS_LESS1, 2087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (2 * dword_count) - 1); /* Number of 16-bit symbols, minus 1.*/ 20887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 20907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block 20947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf) 20964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 20974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 20984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start; 20994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 2100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT((dword_count - 1) <= 0xff); 21014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 21024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16); 21034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = NULL; 21044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 21054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 21064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 21074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Finish a RENDEC block 21084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 2109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end_block(psb_cmdbuf_p cmdbuf) 21107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 21117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 21127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */ 21137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start; /* Include separator but not mtx block header*/ 21157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Write separator (footer-type thing) */ 21177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; 2118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun REGIO_WRITE_FIELD(*cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7); 21197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx++; 21207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write CMD Header */ 21227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size; 21237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 21257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 21287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment 21297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunuint32_t psb_cmdbuf_segment_space(psb_cmdbuf_p cmdbuf) 21317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2132e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t bytes_used = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 21337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t); 21347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 21377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment 21387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_next_segment(psb_cmdbuf_p cmdbuf) 21407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 21417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *next_segment_cmd = cmdbuf->cmd_idx; 21427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += 2; 2143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t words_free = psb_cmdbuf_segment_space(cmdbuf); 2144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->last_next_segment_cmd) { 2146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_close_segment(cmdbuf); 2147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 2148e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->first_segment_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 21497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 21507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */ 2152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 21537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = next_segment_cmd; 21547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 21577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block 21587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition) 21607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 21617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */ 21627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */ 21637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/ 2164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 21657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_condition = skip_condition; 21667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = cmdbuf->cmd_idx++; 21677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 21687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 21707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block 21717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf) 21737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 21747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */ 21757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */ 21767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */ 21777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 21787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1); 21797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size; 21817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 21827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2183