psb_cmdbuf.c revision 437b3eda28a4bf098efa80598cab67f190275266
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 27e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Copyright (c) 2007 Intel Corporation. All Rights Reserved. 37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Copyright (c) Imagination Technologies Limited, UK 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 57e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Permission is hereby granted, free of charge, to any person obtaining a 67e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * copy of this software and associated documentation files (the 77e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "Software"), to deal in the Software without restriction, including 87e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * without limitation the rights to use, copy, modify, merge, publish, 97e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * distribute, sub license, and/or sell copies of the Software, and to 107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * permit persons to whom the Software is furnished to do so, subject to 117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the following conditions: 127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The above copyright notice and this permission notice (including the 147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * next paragraph) shall be included in all copies or substantial portions 157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * of the Software. 167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h> 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h" 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h" 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h" 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h" 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h" 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h" 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h" 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h" 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h> 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h" 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h> 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h> 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h> 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout: 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cmd_base <= cmd_idx < CMD_END() == lldma_base 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size) 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout: 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size) 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf) (cmdbuf->reloc_base) 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf) (cmdbuf->MTX_msg + cmdbuf->reloc_size) 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf) (cmdbuf->lldma_base) 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE (0x1000) 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE (0x3000) 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE (0x3000) 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE (0x2000) 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN (0x0040) 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN (0x0800) 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN (0x0400) 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN (0x0400) 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT 12 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE (0x0800) 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf, 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd, 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd); 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data, 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ) 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int size = CMD_SIZE + LLDMA_SIZE; 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 128; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_base = NULL; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_idx = NULL; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 10; 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = (psb_buffer_p *) malloc(sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == cmdbuf->buffer_refs) 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb_buffer_create( driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf ); 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = size; 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb_buffer_create( driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf ); 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = reloc_size; 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 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 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS != vaStatus) 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_destroy(cmdbuf); 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_destroy( psb_cmdbuf_p cmdbuf ) 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->size) 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->buf ); 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->reloc_size) 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->reloc_buf ); 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->regio_size) 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->regio_buf ); 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->buffer_refs_allocated) 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free( cmdbuf->buffer_refs ); 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = NULL; 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_reset( psb_cmdbuf_p cmdbuf ) 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count = 0; 213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count = 0; 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base ); 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg ); 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->buf ); 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE; 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = cmdbuf->lldma_base; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE; 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add ourselves to the buffer list */ 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */ 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */ 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_unmap( psb_cmdbuf_p cmdbuf ) 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = NULL; 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->buf ); 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->reloc_buf ); 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_buffer_ref( psb_cmdbuf_p cmdbuf, psb_buffer_p buf ) 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int item_loc = 0; 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // buf->next = NULL; /* buf->next only used for buffer list validation */ 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( (item_loc < cmdbuf->buffer_refs_count) 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang item_loc++; 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (item_loc == cmdbuf->buffer_refs_count) 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add new entry */ 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (item_loc >= cmdbuf->buffer_refs_allocated) 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Allocate more entries */ 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int new_size = cmdbuf->buffer_refs_allocated+10; 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p *new_array; 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_array = (psb_buffer_p *) malloc(sizeof(psb_buffer_p) * new_size); 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == new_array) 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; /* Allocation failure */ 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(cmdbuf->buffer_refs); 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = new_size; 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = new_array; 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs[item_loc] = buf; 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count++; 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_queued; 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->next = NULL; 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only for RAR buffers */ 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((cmdbuf->buffer_refs[item_loc] != buf) 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang && (buf->rar_handle != 0)) { 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc]; 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n", 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp, buf); 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while ((tmp->next != NULL)) { 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp == buf) /* found same buffer */ 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp != buf) { 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = buf; /* link it */ 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_queued; 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->next = NULL; 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("RAR: buffer aleady in the list, skip\n", 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp, buf); 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return item_loc; 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf" 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer" 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift". 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background". 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_add_relocation( psb_cmdbuf_p cmdbuf, 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *addr_in_cmdbuf, 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p ref_buffer, 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buf_offset, 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t mask, 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t background, 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t align_shift, 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */ 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check that address is within buffer range */ 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (dst_buffer) 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->cmd_base ); 3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) < LLDMA_END(cmdbuf) ); 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */ 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->MTX_msg ); 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) < MTXMSG_END(cmdbuf) ); 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */ 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->buffer = psb_cmdbuf_buffer_ref( cmdbuf, ref_buffer ); 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( reloc->buffer != -1 ); 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 372437b3eda28a4bf098efa80598cab67f190275266Fei 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); 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (presumed_offset) 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t new_val = presumed_offset + buf_offset; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = (background & ~mask) | (new_val & mask); 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = new_val; 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = PSB_RELOC_MAGIC; 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->mask = mask; 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->pre_add = buf_offset; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->background = background; 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->dst_buffer = dst_buffer; 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx++; 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (cmdbuf->reloc_idx)) < RELOC_END(cmdbuf) ); 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_get_next_cmdbuf( object_context_p obj_context ) 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_context->cmdbuf) 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current++; 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current = 0; 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current]; 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_cmdbuf_reset( cmdbuf ); 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!ret) 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Success */ 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = cmdbuf; 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then) 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang long long val; 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = now->tv_sec - then->tv_sec; 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val *= 1000000LL; 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val += now->tv_usec; 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val -= then->tv_usec; 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val < 1LL) 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = 1LL; 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (unsigned) val; 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1). 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list,int buffer_count,unsigned cmdBufHandle, 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned relocBufHandle, unsigned relocBufOffset, 4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned numRelocs, drm_clip_rect_t * clipRects, int damage, 4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned engine, unsigned fence_flags,struct psb_ttm_fence_rep *fence_arg) 4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drm_psb_cmdbuf_arg_t ca; 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg_list; 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct timeval then, now; 4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool have_then = FALSE; 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list = (struct psb_validate_arg *) malloc(sizeof(struct psb_validate_arg)*buffer_count); 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg_list == NULL) { 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Malloc failed \n"); 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -ENOMEM; 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_req *req = &arg->d.req; 4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(arg, 0, sizeof(*arg)); 4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->next = (unsigned long) &(arg_list[i+1]); 4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->group = 0; 4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_flags = PSB_USE_PRESUMED; 4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list[buffer_count-1].d.req.next = 0; 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.buffer_list = (uint64_t)((unsigned long)arg_list); 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.clip_rects = (uint64_t)((unsigned long)clipRects); 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.scene_arg = 0; 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_arg = (uint64_t) ((unsigned long)fence_arg); 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_flags = 0; 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_handle = 0; 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_offset = 0; 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_size = 0; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_handle = 0; 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_offset = 0; 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_size = 0; 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_handle = cmdBufHandle; 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_offset = cmdBufOffset; 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_size = cmdBufSize; 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_handle = relocBufHandle; 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_offset = relocBufOffset; 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.num_relocs = numRelocs; 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.damage = damage; 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_flags = fence_flags; 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.engine = engine; 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_ops = 0; 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_handle = 0; 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_offset = 0; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_breakpoints = 0; 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_size = 0; 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: buffer_list = %08x\n", ca.buffer_list); 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: clip_rects = %08x\n", ca.clip_rects); 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle); 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset); 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_size = %08x\n", ca.cmdbuf_size); 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_handle = %08x\n", ca.reloc_handle); 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_offset = %08x\n", ca.reloc_offset); 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: num_relocs = %08x\n", ca.num_relocs); 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: engine = %08x\n", ca.engine); 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: fence_flags = %08x\n", ca.fence_flags); 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * X server Signals will clobber the kernel time out mechanism. 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * we need a user-space timeout as well. 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == EAGAIN) { 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!have_then) { 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&then, NULL)) { 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang have_then = TRUE; 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&now, NULL)) { 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC)); 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("command write return is %d\n", ret); 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("command write return is %d\n", ret); 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_rep *rep = &arg->d.rep; 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!arg->handled) { 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = -EFAULT; 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg->ret != 0) 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = arg->ret; 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang out: 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(arg_list); 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer no longer queued in userspace 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = buffer_list[i]; 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * RAR slice buffer/surface buffer are share one BO, and then only one in 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer_list, but they are linked in psb_cmdbuf_buffer_ref 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buffer_list[i]->rar_handle==0) 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized */ 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p p = tmp; 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->status) { 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_queued: 6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p->status = psb_bs_ready; 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_abandoned: 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy(p); 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(p); 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Not supposed to happen */ 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(0); 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (tmp); 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...) psb__trace_message(fmt, ##arg) 6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DB(fmt, arg1, arg...) psb__trace_message("[%08x] %08x = " fmt, ((void *) arg1) - cmd_start, *arg1, ##arg) 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */ 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes) 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t); 6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *cmd_end = cmd_idx + cmd_size; 6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *cmd_start = cmd_idx; 639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct { 640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int start; 641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int end; 642437b3eda28a4bf098efa80598cab67f190275266Fei Jiang char *name; 643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } msvdx_regs[10] = {{0x04800000,0x048003FF,"MTX_MTX"}, 644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800400,0x0480047F,"VDMC_MTX"}, 645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800480,0x048004FF,"VDEB_MTX"}, 646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800500,0x048005FF,"DMAC_MTX"}, 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800600,0x048006FF,"SYS_MTX"}, 648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800700,0x048007FF,"VEC_IQRAM_MTX"}, 649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800800,0x04800FFF,"VEC_MTX"}, 650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04801000,0x04801FFF,"CMD_MTX"}, 651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04802000,0x04802FFF,"VEC_RAM_MTX"}, 652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04803000,0x04804FFF,"VEC_VLC_M"} 653437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }; 654437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size); 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangwhile(cmd_idx < cmd_end) 6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = *cmd_idx; 6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* What about CMD_MAGIC_BEGIN ?*/ 6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch(cmd & CMD_MASK) 6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case CMD_NOP: 663437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DB("CMD_NOPE\n", cmd_idx); 665437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmd_idx++; 666437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 667437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 668437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_HEADER: 6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK; 6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_HEADER context = %08x\n", cmd_idx, context); 6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("StatusBufferAddress\n", cmd_idx); 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("PreloadSave\n", cmd_idx); 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("PreloadRestore\n", cmd_idx); 6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_REGVALPAIR_WRITE: 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT; 6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count); 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while(count--) 6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (i=0; i<10; i++) { 692437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((*cmd_idx >= msvdx_regs[i].start) && 693437b3eda28a4bf098efa80598cab67f190275266Fei Jiang (*cmd_idx <= msvdx_regs[i].end)) 694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 695437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 696437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff); 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("value\n", cmd_idx); 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_RENDEC_WRITE: 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t encoding; 7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT; 7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count); 7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_SL_HDR\n", cmd_idx); 7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_SL_NULL\n", cmd_idx); 7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do 7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t chk_hdr = *cmd_idx; 7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count = 1 + ((chk_hdr & 0x07FF0000) >> 16); 7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4; 7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang encoding = (chk_hdr & 0x07); 7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((count == 1) && (encoding == 7)) 7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count = 0; 7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("SLICE_SEPARATOR\n", cmd_idx); 7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding); 7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while(count && (count < 0x1000)) 7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("value\n", cmd_idx); 7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count -= 2; 7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while (encoding != 0x07); 7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_COMPLETION: 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*cmd_idx == PSB_RELOC_MAGIC) 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_COMPLETION\n", cmd_idx); 7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// DB("interrupt\n", cmd_idx); 7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// cmd_idx++; 7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_LLDMA: 7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_LLDMA\n", cmd_idx); 7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_SLLDMA: 7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_SLLDMA\n", cmd_idx); 7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_SR_SETUP: 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_SR_SETUP\n", cmd_idx); 7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("offset in bits\n", cmd_idx); 7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("size in bytes\n", cmd_idx); 7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*cmd_idx == PSB_RELOC_MAGIC) 7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("*** Unknown command ***\n", cmd_idx); 7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } /* switch */ 7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} /* while */ 8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence) 8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmFenceUnreference(&pFence); 8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject * 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_fence_wait(psb_driver_data_p driver_data, 8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep *fence_rep, int *status) 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence = NULL; 8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = -1; 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* copy fence information */ 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence_rep->error != 0) { 8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("drm failed to create a fence" 8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang " and has idled the HW\n"); 8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_rep->fence_type, 8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void *)fence_rep->handle, 8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0); 8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence) 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *status = wsbmFenceFinish(fence,fence_rep->fence_type,0); 8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return fence; 8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT]; 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT]; 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count; 8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count; 8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start; 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DUMP_COUNT 20 8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT]; 8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT]; 8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_offset[MAX_DUMP_COUNT]; 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_size[MAX_DUMP_COUNT]; 8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_count = 0; 8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from); 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from); 8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from) 8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (bit_to < 31) 8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val &= ~(0xffffffff << (bit_to+1)); 8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = val >> bit_from; 8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(fmt, val); 8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0; 8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size) 8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (offset + size > 8) 8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size = 8 - offset; 8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("[%04x]", g_hexdump_offset); 8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += offset; 8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += size; 8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( offset-- > 0) 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" --"); 8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( size-- > 0) 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" %02x", *p++); 8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("\n"); 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump(void *addr, int size) 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned char *p = (unsigned char *) addr; 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int offset = g_hexdump_offset % 8; 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset -= offset; 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (offset) 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, offset, size); 8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8 - offset; 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8 - offset; 8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( 1 ) 9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (size < 8) 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (size > 0) 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, 0, size); 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]); 9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8; 9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8; 9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += 8; 9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size) 9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(debug_dump_count < MAX_DUMP_COUNT); 9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_name[debug_dump_count] = name; 9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_buf[debug_dump_count] = buf; 9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_offset[debug_dump_count] = offset; 9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_size[debug_dump_count] = size; 9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count++; 9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment 9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_close_segment( psb_cmdbuf_p cmdbuf ) 9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bytes_used = ((void *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE; 9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *segment_start = (void *) cmdbuf->cmd_idx - bytes_used; 9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 9377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */, 9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang bytes_used, 9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* destination offset */, 9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE_RENDER_BUFF_MC); 9417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = CMD_NEXT_SEG; 9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4( *cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf)); 9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *(cmdbuf->last_next_segment_cmd+1) = bytes_used; 9447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 946437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_deblock( object_context_p obj_context ) 9477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = FW_DXVA_DEBLOCK_SIZE; 9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *msg = cmdbuf->MTX_msg; 9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBLOCKPARAMS* pdbParams; 9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("Send two pass deblock cmd\n"); 9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if(cmdbuf->cmd_count) { 9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("two pass deblock cmdbuf has render msg!\n"); 9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 1; 9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count++; 9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */ 9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_DEBLOCK); 9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 9667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_FLAGS, FW_DXVA_RENDER_HOST_INT ); 9677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams = (DEBLOCKPARAMS*) (msg + 16 / sizeof(uint32_t)); 9697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf)); 971437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */ 9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->buffer_size = cmdbuf->regio_size; 9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->ctxid = obj_context->msvdx_context; 9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 979437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_oold( object_context_p obj_context, 980437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p src_buf, 981437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p dst_buf, 982437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p colocate_buffer, 983437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t picture_width_in_mb, 984437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t frame_height_in_mb, 985437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t field_type, 986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t chroma_offset ) 987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 989437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t msg_size = FW_DXVA_OOLD_SIZE; 990437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE; 991437b3eda28a4bf098efa80598cab67f190275266Fei Jiang FW_DXVA_OOLD_MSG *oold_msg; 992437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 993437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("Send out of loop deblock cmd\n"); 994437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 995437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count++; 996437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(msg, 0, msg_size); 997437b3eda28a4bf098efa80598cab67f190275266Fei Jiang oold_msg = (FW_DXVA_OOLD_MSG *) msg; 998437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_DXVA_OOLD_SIZE); 1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_OOLD); 1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_OPERATING_MODE, obj_context->operating_mode); 1004437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb); 1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb); 1006437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1007437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf); 1008437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf); 1009437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf); 1010437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf); 1011437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1012437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer); 1013437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1014437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_SLICE_FIELD_TYPE, field_type); 1015437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1016437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 1017437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 10207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf 10217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_submit_cmdbuf( object_context_p obj_context ) 10257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 10267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 10277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmdbuffer_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes 10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->last_next_segment_cmd) 10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size = cmdbuf->first_segment_size; 10327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_close_segment( cmdbuf ); 10337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = FW_DXVA_RENDER_SIZE; 10367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE; 10377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 10397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base; 10407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_size[cmdbuf->cmd_count] = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 10417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_count = cmdbuf->cmd_count+1; 10427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count++; 10457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 10467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case. 10487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 10497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 10507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_DXVA_RENDER_SIZE); 10527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_RENDER); 10537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO: Need to make context more unique */ 10547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_CONTEXT, obj_context->msvdx_context ); 10557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Point to CMDBUFFER */ 10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */, 10597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size, 10607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* destination offset */, 10617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC); 10627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This is the last relocation */ 10637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_MSG( *(msg + (FW_DXVA_RENDER_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))), 10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lldma_record_offset, &(cmdbuf->buf)); 10657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE, cmdbuffer_size); // In bytes 10677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE, obj_context->operating_mode); 10687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME, obj_context->last_mb); 10697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE, obj_context->first_mb); 10707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, obj_context->flags); 10717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 10737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList); 10747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base; 10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Indicate last LLDMA record (for debugging) */ 10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ((uint32_t *)cmdbuf->lldma_idx)[1] = 0; 10777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_idx; 10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_context_flush_cmdbuf( obj_context ); 10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) || 10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (MTXMSG_END(cmdbuf) - (void *) msg < MTXMSG_MARGIN) || 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (CMD_END(cmdbuf) - (void *) cmdbuf->cmd_idx < CMD_MARGIN) || 10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) || 10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (RELOC_END(cmdbuf) - (void *) cmdbuf->reloc_idx < RELOC_MARGIN)) 10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_context_flush_cmdbuf( obj_context ); 10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_flush_cmdbuf( object_context_p obj_context ) 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data = obj_context->driver_data; 11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int fence_flags; 1104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* unsigned int fence_handle = 0; */ 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep fence_rep; 11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_offset; 11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int num_relocs; 11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((NULL == cmdbuf) || ((0 == cmdbuf->cmd_count) && (0 == cmdbuf->deblock_count))) 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; // Nothing to do 11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = 0; 11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *msg = cmdbuf->MTX_msg; 11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LOCK */ 11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 1; i <= cmdbuf->cmd_count; i++) 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t flags = MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS); 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update flags */ 1133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int bBatchEnd = (i == cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count); 11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags |= 11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (bBatchEnd ? (FW_DXVA_RENDER_HOST_INT | FW_DXVA_LAST_SLICE_OF_EXT_DMA) : FW_DXVA_RENDER_NO_RESPONCE_MSG) | 11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (obj_context->video_op == psb_video_vld ? FW_DXVA_RENDER_IS_VLD_NOT_MC : 0); 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( i == cmdbuf->cmd_count ) 11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags |= FW_DXVA_LAST_SLICE_OF_EXT_DMA; 11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* VXD385 DDK406 not use FW_DXVA_LAST_SLICE_OF_EXT_DMA, this flags should be cleaned later */ 1143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if(IS_MFLD(driver_data)) 1144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang flags &= ~FW_DXVA_LAST_SLICE_OF_EXT_DMA; 1145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, flags); 11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) ); 11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) ); 11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) ); 11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) ); 11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) ); 11547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) ); 11567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) ); 11577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) ); 11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) ); 11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) ); 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 /* todo */ 11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update SAREA */ 11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context; 11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang msg += FW_DXVA_RENDER_SIZE / sizeof(uint32_t); 11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang msg_size += FW_DXVA_RENDER_SIZE; 11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Assume deblock message is following render messages and no more render message behand deblock message */ 11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 1; i <= cmdbuf->deblock_count; i++) 11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 11747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang msg_size += FW_DXVA_DEBLOCK_SIZE; 11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 1; i <= cmdbuf->oold_count; i++) 1178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang msg_size += FW_DXVA_OOLD_SIZE; 1180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 11817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now calculate the total number of relocations */ 11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg; 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang num_relocs = (((void *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE); 11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n", (void *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE); 11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE); 11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE); 11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_unmap( cmdbuf ); 11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(NULL); /* Flush trace */ 11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( NULL == cmdbuf->MTX_msg ); 11997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( NULL == cmdbuf->reloc_base ); 12007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = 0; 12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* cmdbuf will be validated as part of the buffer list */ 12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Submit */ 12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1 12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteLockKernelBO(); 12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset,cmdbuf->buffer_refs, 12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count, 12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 12147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0, msg_size, 12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset, num_relocs, 12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep); 12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteUnlockKernelBO(); 12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = 1; 12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int error_count = 0; 12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int status = 0; 12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence=NULL; 12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = psb_fence_wait(driver_data, &fence_rep, &status); 12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n",status, fence); 12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base ); 1243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg ); 12447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (getenv("PSB_VIDEO_TRACE_LLDMA")) { 1246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("lldma_count = %d, vitual=0x%08x\n", 1247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_lldma_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE); 1248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 0; i < debug_lldma_count; i++) 1249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) (cmdbuf->cmd_base + debug_lldma_start); 1251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pasDmaList += i; 1252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base); 1254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, BSWAP, 31, 31) 1255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, DIR, 30, 30) 1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, PW, 29, 28) 1257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_FIN, 31, 31) 1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_INT, 30, 30) 1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, PI, 18, 17) 1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, INCR, 16, 16) 1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, LEN, 15, 0) 1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(2, ADDR, 22, 0) 1263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, ACC_DEL, 31, 29) 1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, BURST, 28, 26) 1265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(3, EXT_SA, 3, 0) 1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, 2D_MODE, 16, 16) 1267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, REP_COUNT, 10, 0) 1268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(5, LINE_ADD_OFF, 25, 16) 1269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(5, ROW_LENGTH, 9, 0) 1270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(6, SA, 31, 0) 1271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(7, LISTPTR, 27, 0) 1272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("debug_dump_count = %d\n", debug_dump_count); 12787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 0; i < debug_dump_count; i++) 12797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *buf_addr; 12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]); 1282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (debug_dump_buf[i]->rar_handle 1283437b3eda28a4bf098efa80598cab67f190275266Fei Jiang || (psb_buffer_map( debug_dump_buf[i], &buf_addr) != 0)) { 1284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("Unmappable buffer,e.g. RAR buffer\n"); 1285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang continue; 1286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset = 0; 12897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump( buf_addr + debug_dump_offset[i], debug_dump_size[i]); 12907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( debug_dump_buf[i] ); 12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count = 0; 12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("cmd_count = %d, virtual=0x%08x\n", 1295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf)); 1296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 0; i < debug_cmd_count; i++) 1297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t *msg = cmdbuf->MTX_msg + i * FW_DXVA_RENDER_SIZE; 1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int j; 1300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]); 1301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_dump_cmdbuf( (uint32_t *) (cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i] ); 1302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (j=0; j<FW_DXVA_RENDER_SIZE/4; j++) 1304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("MTX msg[%d] = 0x%08x\n", j, *(msg+j)); 1305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap( &cmdbuf->buf ); 1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap( &cmdbuf->reloc_buf); 1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 1310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (status) 13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 13137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status); 13147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang error_count++; 13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(status != 2); 13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(error_count < 40); /* Exit on 40 errors */ 13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence) 13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_fence_destroy(fence); 13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 13237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 13247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0 = 0, 13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1 = 1, 13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP; 13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX = 0, 13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST = 1, 13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION; 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct { 13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT32 ui32DevDestAddr ; /* destination address */ 13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePW ePeripheralWidth; 13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePeriphIncrSize ePeriphIncrSize; 13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePeriphIncr ePeriphIncr; 13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_BOOL bSynchronous; 13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP eMMUGroup; 13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_DIRECTION eDMADir; 13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_eBurst eDMA_eBurst; 13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP; 13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = 13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LLDMA_TYPE_VLC_TABLE */ { REG_MSVDX_VEC_VLC_OFFSET , 13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_16_BIT, /* 16 bit wide data*/ 13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, /* Incrament the dest by 32 bits */ 13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LLDMA_TYPE_BITSTREAM */ { 13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET ), 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_8_BIT, 13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_FALSE, 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_4 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RESIDUAL*/ { 13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET), 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 13757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 13777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_FALSE, 13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 13827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RENDER_BUFF_MC*/{ 13847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 13857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 13867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 13877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RENDER_BUFF_VLD*/{ 13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{ 14047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_VEC_RAM_OFFSET + 0x700 ), 14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, 14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 14097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 /* From VLR */ 14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{ 14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_VEC_RAM_OFFSET + 0x700 ), 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, 14177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 14207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 /* Into VLR */ 14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{ 14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* From MTX */ 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{ 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 14387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 14397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 14417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{ 14447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 //2 /* From MTX */ 14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{ 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 1463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*LLDMA_TYPE_IDCT_INSERTION*/{ 1464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_DIRECT_MODE_DATA0_OFFSET ), 1465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PWIDTH_32_BIT, 1466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_1, 1467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_OFF, 1468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang IMG_FALSE, 1469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MMU_GROUP1, 1470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang HOST_TO_MSVDX, 1471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_BURST_4 1472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }, 1473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*LLDMA_TYPE_RENDER_BUFF_ALTERNATE */ 1474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET ), 1476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PWIDTH_8_BIT, 1477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_1, 1478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_OFF, 1479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang IMG_FALSE, 1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MMU_GROUP0, 1481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang HOST_TO_MSVDX, 1482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_BURST_4 1483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }, 14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN ( 0xffff ) 14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_cmdbuf( psb_cmdbuf_p cmdbuf, 14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++; 14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size, 14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dest_offset, cmd); 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_lldma_create( psb_cmdbuf_p cmdbuf, 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = (((void*)cmdbuf->lldma_idx) - ((void *) cmdbuf->cmd_base)); 15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size, 15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dest_offset, cmd); 15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return lldma_record_offset; 15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream( psb_cmdbuf_p cmdbuf, 15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size_in_bytes, 15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t offset_in_bits, 15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t flags) 15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * We use byte alignment instead of 32bit alignment. 15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The third frame of sa10164.vc1 results in the following bitstream 15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * patttern: 15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * [0000] 00 00 03 01 76 dc 04 8d 15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * with offset_in_bits = 0x1e 15307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This causes an ENTDEC failure because 00 00 03 is a start code 15317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * By byte aligning the datastream the start code will be eliminated. 15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALIGNMENT sizeof(uint8_t) 15367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bs_offset_in_dwords = ((offset_in_bits /8) / ALIGNMENT); 15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 15387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = offset_in_bits; 15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = size_in_bytes; 15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_write_cmdbuf( cmdbuf, bitstream_buf, buffer_offset, 15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes, 0, LLDMA_TYPE_BITSTREAM ); 15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1551437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes); 15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 15567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one 15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 15587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream_chained( psb_cmdbuf_p cmdbuf, 15597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size_in_bytes) 15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last; 15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = psb_cmdbuf_lldma_create( cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs, 15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes, 0, LLDMA_TYPE_BITSTREAM ); 15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update WD7 of last LLDMA record to point to this one */ 15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf)); 15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes); 15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf, 15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd, 15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 15817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 15827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 15837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 15857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang const DMA_DETAIL_LOOKUP* pDmaDetail; 15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd; 15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList; 15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang static IMG_UINT32 lu[] = {4,2,1}; 15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* See if we will fit */ 15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( cmdbuf->lldma_idx + sizeof( DMA_sLinkedList ) < LLDMA_END(cmdbuf) ); 15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pDmaDetail = &DmaDetailLookUp[cmd]; 15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth]; 15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA list must be 16byte alligned if it is done in Hw */ 15987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pasDmaList = (DMA_sLinkedList*) (cmdbuf->lldma_idx) ; 15997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f ); 16007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Offset of LLDMA record in cmdbuf */ 16027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) -((IMG_UINT8*) cmdbuf->cmd_base)); 16037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( 0 == (ui32LLDMA_Offset&0xf) ); 16057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset; 16077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write the header */ 16097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pLLDMACmd) 16107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 16117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA ); 16127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf)); 16137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( ui32DMACount ) 16167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 16177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset( pasDmaList , 0 ,sizeof(DMA_sLinkedList) ); 16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr ); 16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD6 with relocation */ 16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_SA_SHIFT == 0); 16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf); 16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( ui32DMACount > MAX_DMA_LEN ) 16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 16287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32LLDMA_Offset+=sizeof(DMA_sLinkedList); 16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD7 with relocation */ 16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_LISTPTR_SHIFT == 0); 16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf)); 16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN ); /* size */ 16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount-= MAX_DMA_LEN; 16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON ) 16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Destination pointers */ 16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMADestAddr += ((MAX_DMA_LEN)* lu[pDmaDetail->ePeriphIncrSize] ); 16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Source Pointer */ 16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buffer_offset += ((MAX_DMA_LEN)*lu[pDmaDetail->ePeripheralWidth]); 16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This also set LIST_FIN in WD1 to 1*/ 16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD7(pasDmaList, IMG_NULL); // next linked list 16537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD1(pasDmaList,pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount ); /* size */ 16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount =0; 16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Keep pointer in case we need to chain another LLDMA command */ 16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_last = (void *) pasDmaList; 16607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP, 16627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (pDmaDetail->eDMADir==HOST_TO_MSVDX)?DMA_DIR_MEM_TO_PERIPH:DMA_DIR_PERIPH_TO_MEM , 16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pDmaDetail->ePeripheralWidth); 16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup ); 16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0); // 2d 16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD5(pasDmaList, 0, 0); // 2d 16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pasDmaList++; 16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* there can be up to 3 Bytes of padding after header */ 16747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = (void *)pasDmaList; 16757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers 16807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_start_block( psb_cmdbuf_p cmdbuf ) 16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = cmdbuf->cmd_idx++; 16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_set_address( psb_cmdbuf_p cmdbuf, 16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t reg, 16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p buffer, 16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset ) 16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = reg; 16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers 16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 17007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_end_block( psb_cmdbuf_p cmdbuf ) 17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2; 17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | reg_count; 17057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum 17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MTX_CTRL_HEADER = 0, 17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_HDR, 17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_NULL, 17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_CK_HDR, 17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS; 17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block 17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_block( psb_cmdbuf_p cmdbuf ) 17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = cmdbuf->cmd_idx; 17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0; 17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO, 1); 17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD, 3); 17277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1); 17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */ 17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += RENDEC_CK_HDR; 17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block 17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_chunk( psb_cmdbuf_p cmdbuf, uint32_t dest_address ) 17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */ 17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->rendec_chunk_start = 0; 17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3); 17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, ( dest_address >> 2)); 17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_block( psb_cmdbuf_p cmdbuf, 17487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned char *block, 17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size ) 17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((size & 0x3) == 0); 17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < size; i += 4) 17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24); 17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_rendec_write( cmdbuf, val ); 17577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_address( psb_cmdbuf_p cmdbuf, 17617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p buffer, 17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset ) 17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk 17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_chunk( psb_cmdbuf_p cmdbuf ) 17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 17737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1; 17757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (*cmdbuf->rendec_chunk_start, 17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SLICE_INFO, 17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CK_HDR, 17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CK_NUM_SYMBOLS_LESS1, 17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (2 * dword_count) - 1); /* Number of 16-bit symbols, minus 1.*/ 17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 17837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 17867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block 17877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_block( psb_cmdbuf_p cmdbuf ) 17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */ 17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start; /* Include separator but not mtx block header*/ 17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write separator (footer-type thing) */ 17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; 17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD( *cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7); 17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx++; 17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write CMD Header */ 18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size; 18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment 18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_segment_space( psb_cmdbuf_p cmdbuf ) 18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bytes_used = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t); 18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment 18177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_next_segment( psb_cmdbuf_p cmdbuf ) 18197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *next_segment_cmd = cmdbuf->cmd_idx; 18217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += 2; 18227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t words_free = psb_cmdbuf_segment_space( cmdbuf ); 18237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->last_next_segment_cmd) 18257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_close_segment( cmdbuf ); 18277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->first_segment_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */ 18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = next_segment_cmd; 18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block 18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_start_block( psb_cmdbuf_p cmdbuf, uint32_t skip_condition ) 18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */ 18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */ 18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/ 18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_condition = skip_condition; 18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = cmdbuf->cmd_idx++; 18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block 18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_end_block( psb_cmdbuf_p cmdbuf ) 18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */ 18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */ 18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */ 18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1); 18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20 ) | block_size; 18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1865