psb_cmdbuf.c revision 4b5b72d7dd3fe944d75029ff0ca6db1e74600e59
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL 32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved. 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 52befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to 62befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers 72befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its 82befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and 92befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its 102befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade 112befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used, 122befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted, 132befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written 142befccec034c13d34746a9e87149889d59ac767bFei Jiang * permission. 157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 162befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual 172befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery 182befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or 192befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be 202befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing. 217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h> 287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h" 307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h" 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h" 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h" 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h" 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h" 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h" 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h" 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h" 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h> 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h" 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h> 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h> 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h> 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout: 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cmd_base <= cmd_idx < CMD_END() == lldma_base 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size) 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout: 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size) 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf) (cmdbuf->reloc_base) 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf) (cmdbuf->MTX_msg + cmdbuf->reloc_size) 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf) (cmdbuf->lldma_base) 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE (0x1000) 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE (0x3000) 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE (0x3000) 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE (0x2000) 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN (0x0040) 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN (0x0800) 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN (0x0400) 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN (0x0400) 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT 12 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE (0x0800) 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf, 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd, 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd); 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data, 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ) 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int size = CMD_SIZE + LLDMA_SIZE; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE; 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 128; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_base = NULL; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_idx = NULL; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 10; 1312befccec034c13d34746a9e87149889d59ac767bFei Jiang cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == cmdbuf->buffer_refs) 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb_buffer_create( driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf ); 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = size; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb_buffer_create( driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf ); 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = reloc_size; 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS == vaStatus) 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = psb_buffer_create( driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf ); 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = regio_size; 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (VA_STATUS_SUCCESS != vaStatus) 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_destroy(cmdbuf); 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_destroy( psb_cmdbuf_p cmdbuf ) 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->size) 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->buf ); 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->reloc_size) 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->reloc_buf ); 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->regio_size) 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy( &cmdbuf->regio_buf ); 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->buffer_refs_allocated) 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free( cmdbuf->buffer_refs ); 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = NULL; 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_reset( psb_cmdbuf_p cmdbuf ) 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count = 0; 210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count = 0; 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base ); 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg ); 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->buf ); 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE; 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = cmdbuf->lldma_base; 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE; 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add ourselves to the buffer list */ 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */ 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */ 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_unmap( psb_cmdbuf_p cmdbuf ) 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = NULL; 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->buf ); 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( &cmdbuf->reloc_buf ); 2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_buffer_ref( psb_cmdbuf_p cmdbuf, psb_buffer_p buf ) 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int item_loc = 0; 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // buf->next = NULL; /* buf->next only used for buffer list validation */ 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( (item_loc < cmdbuf->buffer_refs_count) 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang item_loc++; 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (item_loc == cmdbuf->buffer_refs_count) 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add new entry */ 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (item_loc >= cmdbuf->buffer_refs_allocated) 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Allocate more entries */ 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int new_size = cmdbuf->buffer_refs_allocated+10; 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p *new_array; 2872befccec034c13d34746a9e87149889d59ac767bFei Jiang new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (NULL == new_array) 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; /* Allocation failure */ 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(cmdbuf->buffer_refs); 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = new_size; 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = new_array; 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs[item_loc] = buf; 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count++; 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_queued; 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->next = NULL; 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* only for RAR buffers */ 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((cmdbuf->buffer_refs[item_loc] != buf) 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang && (buf->rar_handle != 0)) { 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc]; 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n", 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp, buf); 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while ((tmp->next != NULL)) { 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp == buf) /* found same buffer */ 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (tmp != buf) { 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = buf; /* link it */ 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_queued; 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->next = NULL; 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } else { 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("RAR: buffer aleady in the list, skip\n", 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp, buf); 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return item_loc; 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf" 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer" 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift". 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background". 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_add_relocation( psb_cmdbuf_p cmdbuf, 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *addr_in_cmdbuf, 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p ref_buffer, 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buf_offset, 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t mask, 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t background, 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t align_shift, 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */ 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check that address is within buffer range */ 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (dst_buffer) 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->cmd_base ); 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) < LLDMA_END(cmdbuf) ); 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */ 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->MTX_msg ); 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (addr_in_cmdbuf)) < MTXMSG_END(cmdbuf) ); 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */ 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->buffer = psb_cmdbuf_buffer_ref( cmdbuf, ref_buffer ); 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( reloc->buffer != -1 ); 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 369437b3eda28a4bf098efa80598cab67f190275266Fei 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); 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (presumed_offset) 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t new_val = presumed_offset + buf_offset; 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = (background & ~mask) | (new_val & mask); 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = new_val; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = PSB_RELOC_MAGIC; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->mask = mask; 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->pre_add = buf_offset; 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->background = background; 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->dst_buffer = dst_buffer; 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx++; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( ((void *) (cmdbuf->reloc_idx)) < RELOC_END(cmdbuf) ); 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_get_next_cmdbuf( object_context_p obj_context ) 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf; 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_context->cmdbuf) 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current++; 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current = 0; 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current]; 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psb_cmdbuf_reset( cmdbuf ); 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!ret) 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Success */ 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = cmdbuf; 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then) 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang long long val; 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = now->tv_sec - then->tv_sec; 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val *= 1000000LL; 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val += now->tv_usec; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val -= then->tv_usec; 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val < 1LL) 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = 1LL; 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (unsigned) val; 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all 4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1). 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list,int buffer_count,unsigned cmdBufHandle, 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned relocBufHandle, unsigned relocBufOffset, 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned numRelocs, drm_clip_rect_t * clipRects, int damage, 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned engine, unsigned fence_flags,struct psb_ttm_fence_rep *fence_arg) 4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drm_psb_cmdbuf_arg_t ca; 4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg_list; 4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct timeval then, now; 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool have_then = FALSE; 4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4652befccec034c13d34746a9e87149889d59ac767bFei Jiang arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg)*buffer_count); 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg_list == NULL) { 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Malloc failed \n"); 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -ENOMEM; 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_req *req = &arg->d.req; 4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(arg, 0, sizeof(*arg)); 4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->next = (unsigned long) &(arg_list[i+1]); 4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->group = 0; 4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_flags = PSB_USE_PRESUMED; 4864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo req->pad64 = (uint32_t)buffer_list[i]->pl_flags; 4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list[buffer_count-1].d.req.next = 0; 4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.buffer_list = (uint64_t)((unsigned long)arg_list); 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.clip_rects = (uint64_t)((unsigned long)clipRects); 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.scene_arg = 0; 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_arg = (uint64_t) ((unsigned long)fence_arg); 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_flags = 0; 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_handle = 0; 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_offset = 0; 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.ta_size = 0; 5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_handle = 0; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_offset = 0; 5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.oom_size = 0; 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_handle = cmdBufHandle; 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_offset = cmdBufOffset; 5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_size = cmdBufSize; 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_handle = relocBufHandle; 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_offset = relocBufOffset; 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.num_relocs = numRelocs; 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.damage = damage; 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_flags = fence_flags; 5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.engine = engine; 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_ops = 0; 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_handle = 0; 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_offset = 0; 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_breakpoints = 0; 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.feedback_size = 0; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: buffer_list = %08x\n", ca.buffer_list); 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: clip_rects = %08x\n", ca.clip_rects); 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle); 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset); 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_size = %08x\n", ca.cmdbuf_size); 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_handle = %08x\n", ca.reloc_handle); 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_offset = %08x\n", ca.reloc_offset); 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: num_relocs = %08x\n", ca.num_relocs); 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: engine = %08x\n", ca.engine); 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: fence_flags = %08x\n", ca.fence_flags); 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * X server Signals will clobber the kernel time out mechanism. 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * we need a user-space timeout as well. 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == EAGAIN) { 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!have_then) { 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&then, NULL)) { 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang have_then = TRUE; 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&now, NULL)) { 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("Gettimeofday error.\n"); 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC)); 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("command write return is %d\n", ret); 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("command write return is %d\n", ret); 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_rep *rep = &arg->d.rep; 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!arg->handled) { 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = -EFAULT; 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg->ret != 0) 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = arg->ret; 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang out: 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(arg_list); 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < buffer_count; i++) 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer no longer queued in userspace 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = buffer_list[i]; 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * RAR slice buffer/surface buffer are share one BO, and then only one in 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer_list, but they are linked in psb_cmdbuf_buffer_ref 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buffer_list[i]->rar_handle==0) 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized */ 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p p = tmp; 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->status) { 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_queued: 6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p->status = psb_bs_ready; 6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_abandoned: 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy(p); 6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(p); 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Not supposed to happen */ 6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(0); 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (tmp); 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...) psb__trace_message(fmt, ##arg) 6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DB(fmt, arg1, arg...) psb__trace_message("[%08x] %08x = " fmt, ((void *) arg1) - cmd_start, *arg1, ##arg) 6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */ 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes) 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t); 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *cmd_end = cmd_idx + cmd_size; 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *cmd_start = cmd_idx; 637437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct { 638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int start; 639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int end; 640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang char *name; 641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } msvdx_regs[10] = {{0x04800000,0x048003FF,"MTX_MTX"}, 642437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800400,0x0480047F,"VDMC_MTX"}, 643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800480,0x048004FF,"VDEB_MTX"}, 644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800500,0x048005FF,"DMAC_MTX"}, 645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800600,0x048006FF,"SYS_MTX"}, 646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800700,0x048007FF,"VEC_IQRAM_MTX"}, 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04800800,0x04800FFF,"VEC_MTX"}, 648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04801000,0x04801FFF,"CMD_MTX"}, 649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04802000,0x04802FFF,"VEC_RAM_MTX"}, 650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang {0x04803000,0x04804FFF,"VEC_VLC_M"} 651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }; 652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size); 6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangwhile(cmd_idx < cmd_end) 6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = *cmd_idx; 6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* What about CMD_MAGIC_BEGIN ?*/ 6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch(cmd & CMD_MASK) 6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 660437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case CMD_NOP: 661437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DB("CMD_NOPE\n", cmd_idx); 663437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmd_idx++; 664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 665437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 666437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_HEADER: 6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK; 6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_HEADER context = %08x\n", cmd_idx, context); 6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("StatusBufferAddress\n", cmd_idx); 6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("PreloadSave\n", cmd_idx); 6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("PreloadRestore\n", cmd_idx); 6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_REGVALPAIR_WRITE: 6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT; 6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count); 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while(count--) 6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 688437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 689437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for (i=0; i<10; i++) { 690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if ((*cmd_idx >= msvdx_regs[i].start) && 691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang (*cmd_idx <= msvdx_regs[i].end)) 692437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 693437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff); 6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("value\n", cmd_idx); 6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_RENDEC_WRITE: 7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t encoding; 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT; 7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count); 7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_SL_HDR\n", cmd_idx); 7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_SL_NULL\n", cmd_idx); 7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do 7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t chk_hdr = *cmd_idx; 7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count = 1 + ((chk_hdr & 0x07FF0000) >> 16); 7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4; 7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang encoding = (chk_hdr & 0x07); 7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((count == 1) && (encoding == 7)) 7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count = 0; 7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("SLICE_SEPARATOR\n", cmd_idx); 7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding); 7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while(count && (count < 0x1000)) 7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("value\n", cmd_idx); 7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang count -= 2; 7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while (encoding != 0x07); 7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_COMPLETION: 7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*cmd_idx == PSB_RELOC_MAGIC) 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_COMPLETION\n", cmd_idx); 7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// DB("interrupt\n", cmd_idx); 7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang// cmd_idx++; 7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_LLDMA: 7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_LLDMA\n", cmd_idx); 7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_SLLDMA: 7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_SLLDMA\n", cmd_idx); 7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case CMD_SR_SETUP: 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_SR_SETUP\n", cmd_idx); 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("offset in bits\n", cmd_idx); 7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("size in bytes\n", cmd_idx); 7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*cmd_idx == PSB_RELOC_MAGIC) 7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("CMD_(S)LLDMA (assumed)\n", cmd_idx); 7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DB("*** Unknown command ***\n", cmd_idx); 7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmd_idx++; 7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } /* switch */ 7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} /* while */ 7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence) 8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmFenceUnreference(&pFence); 8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject * 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_fence_wait(psb_driver_data_p driver_data, 8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep *fence_rep, int *status) 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence = NULL; 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = -1; 8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* copy fence information */ 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence_rep->error != 0) { 8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("drm failed to create a fence" 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang " and has idled the HW\n"); 8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_rep->fence_type, 8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void *)fence_rep->handle, 8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0); 8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence) 8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *status = wsbmFenceFinish(fence,fence_rep->fence_type,0); 8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return fence; 8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT]; 8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT]; 8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count; 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count; 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start; 8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DUMP_COUNT 20 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT]; 8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT]; 8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_offset[MAX_DUMP_COUNT]; 8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_size[MAX_DUMP_COUNT]; 8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_dump_count = 0; 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from); 8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from); 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from) 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (bit_to < 31) 8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val &= ~(0xffffffff << (bit_to+1)); 8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = val >> bit_from; 8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(fmt, val); 8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0; 8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size) 8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (offset + size > 8) 8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size = 8 - offset; 8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("[%04x]", g_hexdump_offset); 8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += offset; 8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += size; 8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( offset-- > 0) 8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" --"); 8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( size-- > 0) 8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(" %02x", *p++); 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("\n"); 8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump(void *addr, int size) 8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned char *p = (unsigned char *) addr; 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int offset = g_hexdump_offset % 8; 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset -= offset; 8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (offset) 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, offset, size); 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8 - offset; 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8 - offset; 8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( 1 ) 8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (size < 8) 9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (size > 0) 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump2(p, 0, size); 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return; 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]); 9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p += 8; 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size -= 8; 9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset += 8; 9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size) 9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(debug_dump_count < MAX_DUMP_COUNT); 9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_name[debug_dump_count] = name; 9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_buf[debug_dump_count] = buf; 9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_offset[debug_dump_count] = offset; 9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_size[debug_dump_count] = size; 9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count++; 9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment 9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_close_segment( psb_cmdbuf_p cmdbuf ) 9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bytes_used = ((void *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE; 9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *segment_start = (void *) cmdbuf->cmd_idx - bytes_used; 9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */, 9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang bytes_used, 9377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* destination offset */, 9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE_RENDER_BUFF_MC); 9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = CMD_NEXT_SEG; 9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4( *cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf)); 9417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *(cmdbuf->last_next_segment_cmd+1) = bytes_used; 9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 944437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_deblock( object_context_p obj_context ) 9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 9467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 9477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = FW_DXVA_DEBLOCK_SIZE; 9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *msg = cmdbuf->MTX_msg; 9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBLOCKPARAMS* pdbParams; 9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("Send two pass deblock cmd\n"); 9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if(cmdbuf->cmd_count) { 9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("two pass deblock cmdbuf has render msg!\n"); 9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 1; 9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count++; 9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 9597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */ 9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_DEBLOCK); 9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_FLAGS, FW_DXVA_RENDER_HOST_INT ); 9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams = (DEBLOCKPARAMS*) (msg + 16 / sizeof(uint32_t)); 9677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf)); 969437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */ 9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->buffer_size = cmdbuf->regio_size; 9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->ctxid = obj_context->msvdx_context; 9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */ 9774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context, 9784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_a, 9794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_b, 9804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p colocate_buffer, 9814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t picture_widht_mb, 9824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t frame_height_mb, 9834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t rotation_flags, 9844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t field_type, 9854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t ext_stride_a, 9864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_a, 9874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_b, 9884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t is_oold) 9894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 9904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 9914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 9924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE; 9934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 9944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo FW_VA_DEBLOCK_MSG *deblock_msg; 9954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(IS_MFLD(driver_data)) 9974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 9984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 9994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DXVA_RENDER_SIZE; 10004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t *msg = cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count; 10024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 10044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 10054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_size = msg_size; 10074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(is_oold) 10084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD; 10094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 10104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD; 10114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->flags.bits.flags = FW_DXVA_RENDER_HOST_INT | FW_DXVA_RENDER_IS_LAST_SLICE; 10124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->flags.bits.slice_type = field_type; 10134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->operating_mode = obj_context->operating_mode; 10144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context >> 16); 10154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 10164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 10174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->ext_stride_a = ext_stride_a; 10184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->rotation_flags = rotation_flags; 10194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 10214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 10224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(buf_b) { 10234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 10244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 10254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 10264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer); 10284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->deblock_count++; 10294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return 0; 10304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1032437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_oold( object_context_p obj_context, 1033437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p src_buf, 1034437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p dst_buf, 1035437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p colocate_buffer, 1036437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t picture_width_in_mb, 1037437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t frame_height_in_mb, 1038437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t field_type, 1039437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t chroma_offset ) 1040437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 1041437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 1042437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t msg_size = FW_DXVA_OOLD_SIZE; 1043437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE; 1044437b3eda28a4bf098efa80598cab67f190275266Fei Jiang FW_DXVA_OOLD_MSG *oold_msg; 1045437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10462befccec034c13d34746a9e87149889d59ac767bFei Jiang if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer) 10472befccec034c13d34746a9e87149889d59ac767bFei Jiang { 10482befccec034c13d34746a9e87149889d59ac767bFei Jiang psb__error_message("%s L%d Invalide src_buf, dst_buf or colocate_buffer\n", 10492befccec034c13d34746a9e87149889d59ac767bFei Jiang __FUNCTION__, __LINE__); 10502befccec034c13d34746a9e87149889d59ac767bFei Jiang return VA_STATUS_ERROR_INVALID_BUFFER; 10512befccec034c13d34746a9e87149889d59ac767bFei Jiang } 10522befccec034c13d34746a9e87149889d59ac767bFei Jiang 1053437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("Send out of loop deblock cmd\n"); 1054437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1055437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count++; 1056437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(msg, 0, msg_size); 1057437b3eda28a4bf098efa80598cab67f190275266Fei Jiang oold_msg = (FW_DXVA_OOLD_MSG *) msg; 1058437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1059437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_DXVA_OOLD_SIZE); 1060437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_OOLD); 1061437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 1062437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1063437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_OPERATING_MODE, obj_context->operating_mode); 1064437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb); 1065437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb); 1066437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1067437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf); 1068437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf); 1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf); 1070437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf); 1071437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1072437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer); 1073437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1074437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_SLICE_FIELD_TYPE, field_type); 1075437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1076437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 1077437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 1078437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 10797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf 10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_submit_cmdbuf( object_context_p obj_context ) 10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 10874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 10884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 10894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(IS_MFLD(driver_data)) 10914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 10924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 10934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DXVA_RENDER_SIZE; 10944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 10954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t cmdbuffer_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->last_next_segment_cmd) 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size = cmdbuf->first_segment_size; 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_close_segment( cmdbuf ); 11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = item_size; 11044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size; 11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base; 11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_size[cmdbuf->cmd_count] = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_cmd_count = cmdbuf->cmd_count+1; 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define DUMP_CMDBUF 0 11134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if DUMP_CMDBUF 11154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static int c = 0; 11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static char pFileName[30]; 11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo sprintf( pFileName , "cmdbuf%i.txt", c++); 11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo FILE* pF = fopen(pFileName,"w"); 11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF); 11234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fclose(pF); 11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count++; 11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case. 11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, msg_size); 11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_RENDER); 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(!IS_MFLD(driver_data)) 11374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo { 11384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* TODO: Need to make context more unique */ 11394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_CONTEXT, obj_context->msvdx_context ); 11404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Point to CMDBUFFER */ 11424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 11434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */, 11444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuffer_size, 11454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 0 /* destination offset */, 11464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC); 11474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* This is the last relocation */ 11484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG( *(msg + (FW_DXVA_RENDER_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))), 11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang lldma_record_offset, &(cmdbuf->buf)); 11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE, cmdbuffer_size); // In bytes 11524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE, obj_context->operating_mode); 11534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME, obj_context->last_mb); 11544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE, obj_context->first_mb); 11554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, obj_context->flags); 11564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 11584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo { 11594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context >> 16) );/* context is 8 bits */ 11604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Point to CMDBUFFER */ 11624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 11634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */, 11644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuffer_size, 11654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 0 /* destination offset */, 11664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC); 11674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* This is the last relocation */ 11684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG( *(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))), 11694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo lldma_record_offset, &(cmdbuf->buf)); 11704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 11714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE, cmdbuffer_size / 4); // In dwords 11724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE, obj_context->operating_mode); 11734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, obj_context->flags); 11744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList); 11777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base; 11787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Indicate last LLDMA record (for debugging) */ 11797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ((uint32_t *)cmdbuf->lldma_idx)[1] = 0; 11807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_idx; 11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_context_flush_cmdbuf( obj_context ); 11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) || 11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (MTXMSG_END(cmdbuf) - (void *) msg < MTXMSG_MARGIN) || 11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (CMD_END(cmdbuf) - (void *) cmdbuf->cmd_idx < CMD_MARGIN) || 11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) || 11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (RELOC_END(cmdbuf) - (void *) cmdbuf->reloc_idx < RELOC_MARGIN)) 11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return psb_context_flush_cmdbuf( obj_context ); 11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 12007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs 12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_flush_cmdbuf( object_context_p obj_context ) 12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data = obj_context->driver_data; 12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int fence_flags; 1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* unsigned int fence_handle = 0; */ 12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep fence_rep; 12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_offset; 12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int num_relocs; 12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 12124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo unsigned int item_size; /* Size of a render/deocde msg */ 12134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(IS_MFLD(driver_data)) 12154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DEVA_DECODE_SIZE; 12164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 12174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo item_size = FW_DXVA_RENDER_SIZE; 12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if ((NULL == cmdbuf) || ((0 == cmdbuf->cmd_count) && (0 == cmdbuf->deblock_count))) 12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; // Nothing to do 12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = 0; 12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *msg = cmdbuf->MTX_msg; 12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LOCK */ 12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 1; i <= cmdbuf->cmd_count; i++) 12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 12394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t flags; 12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(IS_MFLD(driver_data)) 12424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS); 12434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 12444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo flags = MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS); 12454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update flags */ 12474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count)); 12487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags |= 12507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (bBatchEnd ? (FW_DXVA_RENDER_HOST_INT | FW_DXVA_LAST_SLICE_OF_EXT_DMA) : FW_DXVA_RENDER_NO_RESPONCE_MSG) | 12517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (obj_context->video_op == psb_video_vld ? FW_DXVA_RENDER_IS_VLD_NOT_MC : 0); 12527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( i == cmdbuf->cmd_count ) 12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang flags |= FW_DXVA_LAST_SLICE_OF_EXT_DMA; 12557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* VXD385 DDK406 not use FW_DXVA_LAST_SLICE_OF_EXT_DMA, this flags should be cleaned later */ 12574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(IS_MFLD(driver_data)) 12584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo { 1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang flags &= ~FW_DXVA_LAST_SLICE_OF_EXT_DMA; 12604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo flags &= ~FW_DXVA_RENDER_IS_VLD_NOT_MC; 12614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags); 12624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else { 12644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, flags); 12654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 12684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(!IS_MFLD(driver_data)) 12694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo { 12704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) ); 12714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) ); 12724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) ); 12734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) ); 12744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) ); 12754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) ); 12774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) ); 12784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG LAST_MB_IN_FRAME = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) ); 12794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) ); 12804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) ); 12814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 12834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo { 12844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE) ); 12854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE) ); 12864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS) ); 12874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 12884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE) ); 12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE) ); 12904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb__information_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS) ); 12914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0 /* todo */ 12954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Update SAREA */ 12964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context; 12974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 12984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg += item_size / sizeof(uint32_t); 12994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += item_size; 13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Assume deblock message is following render messages and no more render message behand deblock message */ 13037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 1; i <= cmdbuf->deblock_count; i++) 13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 13054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo if(!IS_MFLD(driver_data)) 13064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += FW_DXVA_DEBLOCK_SIZE; 13074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 13084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += FW_DEVA_DEBLOCK_SIZE; 13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 1; i <= cmdbuf->oold_count; i++) 1312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang msg_size += FW_DXVA_OOLD_SIZE; 1314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now calculate the total number of relocations */ 13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg; 13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang num_relocs = (((void *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE); 13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n", (void *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE); 13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE); 13237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE); 13247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_unmap( cmdbuf ); 13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(NULL); /* Flush trace */ 13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( NULL == cmdbuf->MTX_msg ); 13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( NULL == cmdbuf->reloc_base ); 13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = 0; 13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* cmdbuf will be validated as part of the buffer list */ 13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Submit */ 13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1 13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteLockKernelBO(); 13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset,cmdbuf->buffer_refs, 13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count, 13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0, msg_size, 13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset, num_relocs, 13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep); 13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteUnlockKernelBO(); 13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = 1; 13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) 13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int error_count = 0; 13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int status = 0; 13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence=NULL; 13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = psb_fence_wait(driver_data, &fence_rep, &status); 13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n",status, fence); 13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base ); 1377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg ); 13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (getenv("PSB_VIDEO_TRACE_LLDMA")) { 1380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("lldma_count = %d, vitual=0x%08x\n", 1381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_lldma_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE); 1382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 0; i < debug_lldma_count; i++) 1383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) (cmdbuf->cmd_base + debug_lldma_start); 1385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pasDmaList += i; 1386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base); 1388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, BSWAP, 31, 31) 1389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, DIR, 30, 30) 1390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(0, PW, 29, 28) 1391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_FIN, 31, 31) 1392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, List_INT, 30, 30) 1393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, PI, 18, 17) 1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, INCR, 16, 16) 1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(1, LEN, 15, 0) 1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(2, ADDR, 22, 0) 1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, ACC_DEL, 31, 29) 1398437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(3, BURST, 28, 26) 1399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(3, EXT_SA, 3, 0) 1400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, 2D_MODE, 16, 16) 1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(4, REP_COUNT, 10, 0) 1402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(5, LINE_ADD_OFF, 25, 16) 1403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DW(5, ROW_LENGTH, 9, 0) 1404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(6, SA, 31, 0) 1405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DWH(7, LISTPTR, 27, 0) 1406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message("debug_dump_count = %d\n", debug_dump_count); 14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for(i = 0; i < debug_dump_count; i++) 14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang void *buf_addr; 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]); 1416437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (debug_dump_buf[i]->rar_handle 1417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang || (psb_buffer_map( debug_dump_buf[i], &buf_addr) != 0)) { 1418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("Unmappable buffer,e.g. RAR buffer\n"); 1419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang continue; 1420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang g_hexdump_offset = 0; 14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__hexdump( buf_addr + debug_dump_offset[i], debug_dump_size[i]); 14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_unmap( debug_dump_buf[i] ); 14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang debug_dump_count = 0; 14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("cmd_count = %d, virtual=0x%08x\n", 1429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf)); 1430437b3eda28a4bf098efa80598cab67f190275266Fei Jiang for(i = 0; i < debug_cmd_count; i++) 1431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 14324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t *msg = cmdbuf->MTX_msg + i * item_size; 1433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int j; 1434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]); 1435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang debug_dump_cmdbuf( (uint32_t *) (cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i] ); 1436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo for (j=0; j<item_size/4; j++) 1438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__trace_message("MTX msg[%d] = 0x%08x\n", j, *(msg+j)); 1439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap( &cmdbuf->buf ); 1441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap( &cmdbuf->reloc_buf); 1442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 1444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (status) 14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status); 14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang error_count++; 14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(status != 2); 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(error_count < 40); /* Exit on 40 errors */ 14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence) 14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_fence_destroy(fence); 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0 = 0, 14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1 = 1, 14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP; 14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 14697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX = 0, 14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST = 1, 14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION; 14727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct { 14747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT32 ui32DevDestAddr ; /* destination address */ 14757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePW ePeripheralWidth; 14767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePeriphIncrSize ePeriphIncrSize; 14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_ePeriphIncr ePeriphIncr; 14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_BOOL bSynchronous; 14797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP eMMUGroup; 14807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_DIRECTION eDMADir; 14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_eBurst eDMA_eBurst; 14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP; 14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = 14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LLDMA_TYPE_VLC_TABLE */ { REG_MSVDX_VEC_VLC_OFFSET , 14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_16_BIT, /* 16 bit wide data*/ 14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, /* Incrament the dest by 32 bits */ 14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LLDMA_TYPE_BITSTREAM */ { 14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET ), 14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_8_BIT, 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_FALSE, 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_4 15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RESIDUAL*/ { 15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET), 15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_FALSE, 15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo DMA_BURST_4 15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RENDER_BUFF_MC*/{ 15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_RENDER_BUFF_VLD*/{ 15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 15367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{ 15382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang (REG_MSVDX_VEC_RAM_OFFSET + 0xB90 ), 15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, 15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 /* From VLR */ 15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{ 15482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang (REG_MSVDX_VEC_RAM_OFFSET + 0xB90 ), 15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_4, 15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_ON, 15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, 15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0, 15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_2 /* Into VLR */ 15567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{ 15587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* From MTX */ 15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{ 15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1, 15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{ 15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 15834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MMU_GROUP0, 15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST, 15857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 //2 /* From MTX */ 15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{ 15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ), 15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PWIDTH_32_BIT, 15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_1, 15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_PERIPH_INCR_OFF, 15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_TRUE, /* na */ 15934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MMU_GROUP0, 15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX, 15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_BURST_1 /* Into MTX */ 15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang }, 1597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*LLDMA_TYPE_IDCT_INSERTION*/{ 1598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_DIRECT_MODE_DATA0_OFFSET ), 1599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PWIDTH_32_BIT, 1600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_1, 1601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_OFF, 1602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang IMG_FALSE, 1603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MMU_GROUP1, 1604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang HOST_TO_MSVDX, 1605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_BURST_4 1606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }, 1607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*LLDMA_TYPE_RENDER_BUFF_ALTERNATE */ 1608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 1609437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET ), 1610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PWIDTH_8_BIT, 1611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_1, 1612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_PERIPH_INCR_OFF, 1613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang IMG_FALSE, 1614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang MMU_GROUP0, 1615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang HOST_TO_MSVDX, 1616437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DMA_BURST_4 1617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang }, 16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN ( 0xffff ) 16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_cmdbuf( psb_cmdbuf_p cmdbuf, 16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 16287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++; 16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size, 16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dest_offset, cmd); 16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_lldma_create( psb_cmdbuf_p cmdbuf, 16367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = (((void*)cmdbuf->lldma_idx) - ((void *) cmdbuf->cmd_base)); 16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size, 16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang dest_offset, cmd); 16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return lldma_record_offset; 16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream( psb_cmdbuf_p cmdbuf, 16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 16537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size_in_bytes, 16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t offset_in_bits, 16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t flags) 16577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * We use byte alignment instead of 32bit alignment. 16607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The third frame of sa10164.vc1 results in the following bitstream 16617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * patttern: 16627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * [0000] 00 00 03 01 76 dc 04 8d 16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * with offset_in_bits = 0x1e 16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This causes an ENTDEC failure because 00 00 03 is a start code 16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * By byte aligning the datastream the start code will be eliminated. 16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALIGNMENT sizeof(uint8_t) 16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bs_offset_in_dwords = ((offset_in_bits /8) / ALIGNMENT); 16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 16747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 16757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = offset_in_bits; 16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = size_in_bytes; 16807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_lldma_write_cmdbuf( cmdbuf, bitstream_buf, buffer_offset, 16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes, 0, LLDMA_TYPE_BITSTREAM ); 16837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1685437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes); 16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one 16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream_chained( psb_cmdbuf_p cmdbuf, 16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size_in_bytes) 16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last; 16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t lldma_record_offset = psb_cmdbuf_lldma_create( cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs, 16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang size_in_bytes, 0, LLDMA_TYPE_BITSTREAM ); 16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update WD7 of last LLDMA record to point to this one */ 17007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf)); 17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 1705437b3eda28a4bf098efa80598cab67f190275266Fei Jiang //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes); 17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf, 17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_CMD *pLLDMACmd, 17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p bitstream_buf, 17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset, 17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size, 17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dest_offset, 17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang LLDMA_TYPE cmd) 17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang const DMA_DETAIL_LOOKUP* pDmaDetail; 17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd; 17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_sLinkedList* pasDmaList; 17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang static IMG_UINT32 lu[] = {4,2,1}; 17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* See if we will fit */ 17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( cmdbuf->lldma_idx + sizeof( DMA_sLinkedList ) < LLDMA_END(cmdbuf) ); 17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pDmaDetail = &DmaDetailLookUp[cmd]; 17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth]; 17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA list must be 16byte alligned if it is done in Hw */ 17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pasDmaList = (DMA_sLinkedList*) (cmdbuf->lldma_idx) ; 17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f ); 17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Offset of LLDMA record in cmdbuf */ 17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) -((IMG_UINT8*) cmdbuf->cmd_base)); 17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT( 0 == (ui32LLDMA_Offset&0xf) ); 17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset; 17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write the header */ 17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (pLLDMACmd) 17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA ); 17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf)); 17477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang while( ui32DMACount ) 17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset( pasDmaList , 0 ,sizeof(DMA_sLinkedList) ); 17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr ); 17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD6 with relocation */ 17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_SA_SHIFT == 0); 17577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf); 17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( ui32DMACount > MAX_DMA_LEN ) 17617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32LLDMA_Offset+=sizeof(DMA_sLinkedList); 17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* DMA_LL_SET_WD7 with relocation */ 17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(DMAC_LL_LISTPTR_SHIFT == 0); 17667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf)); 17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This touches WD1 */ 17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0); 17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN ); /* size */ 17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount-= MAX_DMA_LEN; 17737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if( pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON ) 17757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Destination pointers */ 17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMADestAddr += ((MAX_DMA_LEN)* lu[pDmaDetail->ePeriphIncrSize] ); 17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update Source Pointer */ 17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buffer_offset += ((MAX_DMA_LEN)*lu[pDmaDetail->ePeripheralWidth]); 17827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* This also set LIST_FIN in WD1 to 1*/ 17867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD7(pasDmaList, IMG_NULL); // next linked list 17877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD1(pasDmaList,pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount ); /* size */ 17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ui32DMACount =0; 17907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Keep pointer in case we need to chain another LLDMA command */ 17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_last = (void *) pasDmaList; 17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP, 17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (pDmaDetail->eDMADir==HOST_TO_MSVDX)?DMA_DIR_MEM_TO_PERIPH:DMA_DIR_PERIPH_TO_MEM , 17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pDmaDetail->ePeripheralWidth); 17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup ); 18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0); // 2d 18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DMA_LL_SET_WD5(pasDmaList, 0, 0); // 2d 18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pasDmaList++; 18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* there can be up to 3 Bytes of padding after header */ 18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = (void *)pasDmaList; 18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers 18147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_start_block( psb_cmdbuf_p cmdbuf ) 18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = cmdbuf->cmd_idx++; 18204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->reg_start = 0; 18214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 18224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 18234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_reg_start_block_flag( psb_cmdbuf_p cmdbuf, uint32_t flags ) 18244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 18254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 18264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 18274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->reg_start = cmdbuf->cmd_idx++; 18284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->reg_start = flags; 18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_set_address( psb_cmdbuf_p cmdbuf, 18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t reg, 18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p buffer, 18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset ) 18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx++ = reg; 18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers 18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_end_block( psb_cmdbuf_p cmdbuf ) 18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2; 18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->reg_start |= CMD_REGVALPAIR_WRITE | reg_count; 18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum 18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MTX_CTRL_HEADER = 0, 18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_HDR, 18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_NULL, 18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_CK_HDR, 18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS; 18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block 18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_block( psb_cmdbuf_p cmdbuf ) 18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */ 18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = cmdbuf->cmd_idx; 18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0; 18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO, 1); 18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD, 3); 18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1); 18717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */ 18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += RENDEC_CK_HDR; 18757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block 18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_chunk( psb_cmdbuf_p cmdbuf, uint32_t dest_address ) 18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */ 18837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->rendec_chunk_start = 0; 18867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3); 18877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, ( dest_address >> 2)); 18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 18897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 18904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 18914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format 18924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 18934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_rendec_start( psb_cmdbuf_p cmdbuf, uint32_t dest_address ) 18944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 18954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT( ((dest_address>>2)& ~0xfff) == 0 ); 18964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 18974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 18984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | ((dest_address>>2) <<4 ); 18994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 19004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 19017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_block( psb_cmdbuf_p cmdbuf, 19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned char *block, 19037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t size ) 19047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((size & 0x3) == 0); 19067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 19077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang for( i = 0; i < size; i += 4) 19087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 19097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24); 19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_rendec_write( cmdbuf, val ); 19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_address( psb_cmdbuf_p cmdbuf, 19157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p buffer, 19167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t buffer_offset ) 19177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk 19237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_chunk( psb_cmdbuf_p cmdbuf ) 19257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 19277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 19287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1; 19297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD_LITE (*cmdbuf->rendec_chunk_start, 19317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SLICE_INFO, 19327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CK_HDR, 19337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang CK_NUM_SYMBOLS_LESS1, 19347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (2 * dword_count) - 1); /* Number of 16-bit symbols, minus 1.*/ 19357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 19377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block 19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 19424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_rendec_end( psb_cmdbuf_p cmdbuf ) 19434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 19444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 19454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start; 19464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 19474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT( (dword_count-1) <= 0xff ); 19484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 19494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16); 19504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = NULL; 19514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 19524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 19534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 19544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Finish a RENDEC block 19554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 19567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_block( psb_cmdbuf_p cmdbuf ) 19577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */ 19597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */ 19607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start; /* Include separator but not mtx block header*/ 19627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write separator (footer-type thing) */ 19647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; 19657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang REGIO_WRITE_FIELD( *cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7); 19667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx++; 19677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Write CMD Header */ 19697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size; 19707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 19727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment 19767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 19777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_segment_space( psb_cmdbuf_p cmdbuf ) 19787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t bytes_used = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 19807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t); 19817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 19827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 19847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment 19857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 19867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_next_segment( psb_cmdbuf_p cmdbuf ) 19877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 19887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t *next_segment_cmd = cmdbuf->cmd_idx; 19897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += 2; 19907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t words_free = psb_cmdbuf_segment_space( cmdbuf ); 19917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 19927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (cmdbuf->last_next_segment_cmd) 19937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 19947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_close_segment( cmdbuf ); 19957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 19967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang else 19977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang { 19987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->first_segment_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 19997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 20007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */ 20027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = next_segment_cmd; 20047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block 20087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 20097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_start_block( psb_cmdbuf_p cmdbuf, uint32_t skip_condition ) 20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */ 20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */ 20137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/ 20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_condition = skip_condition; 20167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = cmdbuf->cmd_idx++; 20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block 20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 20227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_end_block( psb_cmdbuf_p cmdbuf ) 20237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 20247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */ 20257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */ 20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */ 20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1); 20297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 20307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20 ) | block_size; 20317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 20327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2033