psb_cmdbuf.c revision 38f419a75e2994d6afe2ffb360d5f5b7670ce077
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Waldo Bastian <waldo.bastian@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h" 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h> 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h" 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h" 407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h" 427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h" 437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h" 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h" 457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h" 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h" 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h" 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h" 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h" 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h> 537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h> 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 56c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h" 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h> 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h> 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h> 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout: 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cmd_base <= cmd_idx < CMD_END() == lldma_base 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size) 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout: 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size) 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf) (cmdbuf->reloc_base) 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf) (cmdbuf->MTX_msg + cmdbuf->reloc_size) 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf) (cmdbuf->lldma_base) 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE (0x1000) 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE (0x3000) 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE (0x3000) 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE (0x2000) 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN (0x0040) 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN (0x0800) 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN (0x0400) 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN (0x0400) 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data, 95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_p cmdbuf 96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int size = CMD_SIZE + LLDMA_SIZE; 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE; 101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172; 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_base = NULL; 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_idx = NULL; 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 10; 1232befccec034c13d34746a9e87149889d59ac767bFei Jiang cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == cmdbuf->buffer_refs) { 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf); 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = size; 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf); 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = reloc_size; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf); 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = regio_size; 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) { 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_destroy(cmdbuf); 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf) 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->size) { 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->buf); 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->reloc_size) { 157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->reloc_buf); 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->regio_size) { 161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->regio_buf); 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->buffer_refs_allocated) { 165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = NULL; 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf) 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count = 0; 193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count = 0; 194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->host_be_opp_count = 0; 195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->frame_info_count = 0; 1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE; 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = cmdbuf->lldma_base; 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE; 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add ourselves to the buffer list */ 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */ 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */ 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf) 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = NULL; 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->reloc_buf); 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf) 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int item_loc = 0; 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun // buf->next = NULL; /* buf->next only used for buffer list validation */ 255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((item_loc < cmdbuf->buffer_refs_count) 257bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) { 259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun item_loc++; 260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc == cmdbuf->buffer_refs_count) { 262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Add new entry */ 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc >= cmdbuf->buffer_refs_allocated) { 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Allocate more entries */ 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int new_size = cmdbuf->buffer_refs_allocated + 10; 266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p *new_array; 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == new_array) { 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return -1; /* Allocation failure */ 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_allocated = new_size; 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs = new_array; 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs[item_loc] = buf; 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count++; 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* only for RAR buffers */ 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((cmdbuf->buffer_refs[item_loc] != buf) 285bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (buf->rar_handle != 0)) { 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc]; 287c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: found same drm buffer with different psb buffer, link them\n", 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((tmp->next != NULL)) { 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = tmp->next; 291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp == buf) /* found same buffer */ 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp != buf) { 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp->next = buf; /* link it */ 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 300c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: buffer aleady in the list, skip\n", 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return item_loc; 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf" 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer" 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift". 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background". 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf, 317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *addr_in_cmdbuf, 318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p ref_buffer, 319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buf_offset, 320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t mask, 321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t background, 322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t align_shift, 323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */ 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check that address is within buffer range */ 329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (dst_buffer) { 330e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base); 331e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf)); 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */ 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 334e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg); 335e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf)); 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */ 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer); 340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(reloc->buffer != -1); 341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 344c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n", 345c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset); 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (presumed_offset) { 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t new_val = presumed_offset + buf_offset; 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = (background & ~mask) | (new_val & mask); 3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = new_val; 352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = PSB_RELOC_MAGIC; 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->mask = mask; 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->pre_add = buf_offset; 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->background = background; 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->dst_buffer = dst_buffer; 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx++; 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 363e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf)); 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context) 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf; 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf) { 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current++; 381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) { 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current = 0; 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current]; 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_cmdbuf_reset(cmdbuf); 386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!ret) { 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Success */ 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = cmdbuf; 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then) 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang long long val; 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = now->tv_sec - then->tv_sec; 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val *= 1000000LL; 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val += now->tv_usec; 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val -= then->tv_usec; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val < 1LL) 404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun val = 1LL; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (unsigned) val; 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1). 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle, 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned relocBufHandle, unsigned relocBufOffset, 423cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang unsigned numRelocs, int damage, 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg) 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drm_psb_cmdbuf_arg_t ca; 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg_list; 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i; 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct timeval then, now; 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool have_then = FALSE; 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count); 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg_list == NULL) { 436c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Malloc failed \n"); 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -ENOMEM; 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_req *req = &arg->d.req; 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->next = (unsigned long) & (arg_list[i+1]); 445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->group = 0; 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_flags = PSB_USE_PRESUMED; 4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo req->pad64 = (uint32_t)buffer_list[i]->pl_flags; 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list[buffer_count-1].d.req.next = 0; 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.buffer_list = (uint64_t)((unsigned long)arg_list); 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.fence_arg = (uint64_t)((unsigned long)fence_arg); 459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_handle = cmdBufHandle; 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_offset = cmdBufOffset; 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_size = cmdBufSize; 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_handle = relocBufHandle; 4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_offset = relocBufOffset; 4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.num_relocs = numRelocs; 467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_flags = fence_flags; 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.engine = engine; 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 471bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0 472c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: buffer_list = %08x\n", ca.buffer_list); 473c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: clip_rects = %08x\n", ca.clip_rects); 474c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle); 475c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset); 476c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_size = %08x\n", ca.cmdbuf_size); 477c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_handle = %08x\n", ca.reloc_handle); 478c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_offset = %08x\n", ca.reloc_offset); 479c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: num_relocs = %08x\n", ca.num_relocs); 480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: engine = %08x\n", ca.engine); 481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: fence_flags = %08x\n", ca.fence_flags); 4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * X server Signals will clobber the kernel time out mechanism. 4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * we need a user-space timeout as well. 4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == EAGAIN) { 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!have_then) { 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&then, NULL)) { 493c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n"); 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang have_then = TRUE; 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&now, NULL)) { 500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n"); 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC)); 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 508c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "command write return is %d\n", ret); 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_rep *rep = &arg->d.rep; 515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!arg->handled) { 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = -EFAULT; 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (arg->ret != 0) { 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = arg->ret; 5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout: 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(arg_list); 530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer no longer queued in userspace 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = buffer_list[i]; 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * RAR slice buffer/surface buffer are share one BO, and then only one in 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer_list, but they are linked in psb_cmdbuf_buffer_ref 539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buffer_list[i]->rar_handle == 0) 5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized */ 543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p p = tmp; 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->status) { 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_queued: 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p->status = psb_bs_ready; 5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_abandoned: 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy(p); 5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(p); 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Not supposed to happen */ 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(0); 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (tmp); 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 56838f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence) 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmFenceUnreference(&pFence); 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject * 577bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data, 578bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang struct psb_ttm_fence_rep *fence_rep, int *status) 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence = NULL; 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = -1; 583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* copy fence information */ 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence_rep->error != 0) { 586c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence" 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang " and has idled the HW\n"); 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_rep->fence_type, 594e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)fence_rep->handle, 5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0); 596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (fence) 597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0); 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return fence; 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 60138f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p cmdbuf) 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 60838f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0 609e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE; 610e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used; 611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */, 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bytes_used, 614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* destination offset */, 615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE_RENDER_BUFF_MC); 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = CMD_NEXT_SEG; 617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf)); 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *(cmdbuf->last_next_segment_cmd + 1) = bytes_used; 61938f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif 6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_deblock(object_context_p obj_context) 6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 625bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_DEBLOCK_SIZE; 626e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBLOCKPARAMS* pdbParams; 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 629c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Send two pass deblock cmd\n"); 630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->cmd_count) { 631c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "two pass deblock cmdbuf has render msg!\n"); 632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 1; 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count++; 6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */ 639bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_DEBLOCK); 6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 641bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 642bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_FLAGS, FW_VA_RENDER_HOST_INT); 643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pdbParams = (DEBLOCKPARAMS*)(msg + 16 / sizeof(uint32_t)); 6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf)); 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */ 6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang pdbParams->buffer_size = cmdbuf->regio_size; 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pdbParams->ctxid = (obj_context->msvdx_context & 0xfff); 6507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */ 6554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context, 6564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_a, 6574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_b, 6584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p colocate_buffer, 6594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t picture_widht_mb, 6604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t frame_height_mb, 6614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t rotation_flags, 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t field_type, 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t ext_stride_a, 6644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_a, 6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_b, 6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t is_oold) 6674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 6684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 6694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE; 67106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo FW_VA_DEBLOCK_MSG *deblock_msg; 6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 674e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count); 6754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 6774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 6784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6799769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE; 680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (is_oold) 6814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD; 6824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 6834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD; 6845ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE | FW_DEVA_DEBLOCK_ENABLE; 6854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->flags.bits.slice_type = field_type; 6864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->operating_mode = obj_context->operating_mode; 687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context); 6884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 6904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->ext_stride_a = ext_stride_a; 6914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->rotation_flags = rotation_flags; 6924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 6944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buf_b) { 6964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 6974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 6984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 6994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer); 7014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->deblock_count++; 7024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return 0; 7034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_oold(object_context_p obj_context, 706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p src_buf, 707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p dst_buf, 708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p colocate_buffer, 709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t picture_width_in_mb, 710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t frame_height_in_mb, 711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t field_type, 712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t chroma_offset) 713437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 714437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 715bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang uint32_t msg_size = FW_VA_OOLD_SIZE; 716e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE); 717bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang FW_VA_OOLD_MSG *oold_msg; 718437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer) { 720c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "%s L%d Invalide src_buf, dst_buf or colocate_buffer\n", 721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun __FUNCTION__, __LINE__); 722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_INVALID_BUFFER; 7232befccec034c13d34746a9e87149889d59ac767bFei Jiang } 7242befccec034c13d34746a9e87149889d59ac767bFei Jiang 725c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Send out of loop deblock cmd\n"); 726437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 727437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count++; 728437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(msg, 0, msg_size); 729bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang oold_msg = (FW_VA_OOLD_MSG *) msg; 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 731bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_OOLD_SIZE); 732bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_OOLD); 733bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context); 734437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_OPERATING_MODE, obj_context->operating_mode); 736bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb); 737bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb); 738437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 739437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf); 740437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf); 741437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf); 742437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf); 743437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 744437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer); 745437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 746bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_SLICE_FIELD_TYPE, field_type); 747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return 0; 749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 751f31d5416a60f83e184b0906a7ec77ba021840531hdingint psb_context_submit_host_be_opp(object_context_p obj_context, 752f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_p buf_a, 753f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_p buf_b, 7549769d6a0972207564efb82e397f19ec002841f65Li Zeng psb_buffer_p buf_c, 755f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t picture_widht_mb, 756f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t frame_height_mb, 757f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t rotation_flags, 758f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t field_type, 759f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t ext_stride_a, 760f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t chroma_offset_a, 761f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t chroma_offset_b) 762f31d5416a60f83e184b0906a7ec77ba021840531hding{ 763f31d5416a60f83e184b0906a7ec77ba021840531hding psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 764f31d5416a60f83e184b0906a7ec77ba021840531hding psb_driver_data_p driver_data = obj_context->driver_data; 7659769d6a0972207564efb82e397f19ec002841f65Li Zeng uint32_t msg_size = sizeof(FW_VA_DEBLOCK_MSG); 76606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 767f31d5416a60f83e184b0906a7ec77ba021840531hding FW_VA_DEBLOCK_MSG *deblock_msg; 768f31d5416a60f83e184b0906a7ec77ba021840531hding 769f31d5416a60f83e184b0906a7ec77ba021840531hding 770f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count + cmdbuf->deblock_count * msg_size); 771f31d5416a60f83e184b0906a7ec77ba021840531hding 772f31d5416a60f83e184b0906a7ec77ba021840531hding memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 773f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 774f31d5416a60f83e184b0906a7ec77ba021840531hding 7759769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE; 776f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->header.bits.msg_type = VA_MSGID_HOST_BE_OPP_MFLD; 777f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY; 778f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->flags.bits.slice_type = field_type; 779f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->operating_mode = obj_context->operating_mode; 780f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context); 781f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 782f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 783f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->ext_stride_a = ext_stride_a; 784f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->rotation_flags = rotation_flags; 785f31d5416a60f83e184b0906a7ec77ba021840531hding 786f31d5416a60f83e184b0906a7ec77ba021840531hding RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 787f31d5416a60f83e184b0906a7ec77ba021840531hding RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 7889769d6a0972207564efb82e397f19ec002841f65Li Zeng RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 7899769d6a0972207564efb82e397f19ec002841f65Li Zeng RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 790f31d5416a60f83e184b0906a7ec77ba021840531hding 7919769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->mb_param_address = wsbmKBufHandle(wsbmKBuf(buf_a->drm_buf)); 7929769d6a0972207564efb82e397f19ec002841f65Li Zeng cmdbuf->deblock_count++; 793f31d5416a60f83e184b0906a7ec77ba021840531hding return 0; 794f31d5416a60f83e184b0906a7ec77ba021840531hding} 795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf 7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context) 8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 8044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 80506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 806c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang int ret; 8074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 809e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes 8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->last_next_segment_cmd) { 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size = cmdbuf->first_segment_size; 813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_close_segment(cmdbuf); 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = item_size; 817e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE); 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 819c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp && (psb_video_trace_level & CMDMSG_TRACE)) { 820c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base; 821c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 822c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count = cmdbuf->cmd_count + 1; 823c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 8244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 825fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static int c = 0; 8274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static char pFileName[30]; 8284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sprintf(pFileName , "cmdbuf%i.txt", c++); 831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun FILE* pF = fopen(pFileName, "w"); 8324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF); 8344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fclose(pF); 835fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang*/ 836fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = psb_cmdbuf_dump((unsigned int *)cmdbuf->cmd_start, cmdbuffer_size); 837fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if(ret) 838c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_cmdbuf: dump cmdbuf fail\n"); 8394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count++; 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case. 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 845e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, msg_size); 848bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_RENDER); 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 850439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */ 8514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 85206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Point to CMDBUFFER */ 85306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))), 85406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf)); 85506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE, cmdbuffer_size / 4); // In dwords 85606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE, obj_context->operating_mode); 85706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, obj_context->flags); 858c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 859c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp && (psb_video_trace_level & LLDMA_TRACE)) { 860c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList); 861c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base; 862c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang /* Indicate last LLDMA record (for debugging) */ 863c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ((uint32_t *)cmdbuf->lldma_idx)[1] = 0; 864c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 866e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx; 8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 868c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb_context_flush_cmdbuf(obj_context); 870c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } else { 871c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) || 872c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) || 873c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) || 874c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) || 875c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) { 876c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang return psb_context_flush_cmdbuf(obj_context); 877c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs 8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context) 8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data = obj_context->driver_data; 8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int fence_flags; 890437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* unsigned int fence_handle = 0; */ 8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep fence_rep; 8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_offset; 8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int num_relocs; 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 89506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((NULL == cmdbuf) || 898bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) { 8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; // Nothing to do 9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = 0; 903e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int i; 9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LOCK */ 9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 908dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 913dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->frame_info_count; i++) { 915bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_FRAME_INFO_SIZE; 916bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t); 917dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->cmd_count; i++) { 9204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t flags; 921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 92206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS); 9234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update flags */ 925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count 926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + cmdbuf->host_be_opp_count)); 927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= 9289769d6a0972207564efb82e397f19ec002841f65Li Zeng (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG); 9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 930f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_EC 931680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if (driver_data->ec_enabled) 932680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else 933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (driver_data->ec_enabled && IS_MRST(driver_data)) 934680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= FW_ERROR_DETECTION_AND_RECOVERY; 9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 93706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags); 9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 93906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 94006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 94106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 94306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 94406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 94506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 9467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0 /* todo */ 9484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Update SAREA */ 9494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context; 9504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 9514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg += item_size / sizeof(uint32_t); 9524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += item_size; 9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Assume deblock message is following render messages and no more render message behand deblock message */ 956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->deblock_count; i++) { 9579769d6a0972207564efb82e397f19ec002841f65Li Zeng if (IS_MRST(driver_data)) 958bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_DEBLOCK_SIZE; 9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 9609769d6a0972207564efb82e397f19ec002841f65Li Zeng msg_size += sizeof(FW_VA_DEBLOCK_MSG); 9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 962dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 963dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->oold_count; i++) { 9649769d6a0972207564efb82e397f19ec002841f65Li Zeng msg_size += sizeof(FW_VA_DEBLOCK_MSG); 965437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->host_be_opp_count; i++) { 968bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_HOST_BE_OPP_SIZE; 969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now calculate the total number of relocations */ 9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg; 973e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 975c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE); 976c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf CMD size = %08x - %d[%08x]\n", (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE); 977c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE); 978c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE); 979dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_unmap(cmdbuf); 9817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(NULL); /* Flush trace */ 983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 984dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->MTX_msg); 985dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->reloc_base); 9867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 987c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) 988c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = 0; 989c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang else 990c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 9917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* cmdbuf will be validated as part of the buffer list */ 9937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Submit */ 9947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteLockKernelBO(); 995dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs, 996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count, 997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 998dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, msg_size, 999dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 1000dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc_offset, num_relocs, 1001cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang 0, PSB_ENGINE_DECODE, fence_flags, &fence_rep); 10027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteUnlockKernelBO(); 10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 1004c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 1005dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1013c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 1015c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang static int error_count = 0; 1016c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang int status = 0; 1017c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang struct _WsbmFenceObject *fence = NULL; 1018c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence = psb_fence_wait(driver_data, &fence_rep, &status); 1019c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence); 1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 1021437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1022c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 1023c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 1024c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 1025c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & LLDMA_TRACE) { 1026c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("lldma_count = %d, vitual=0x%08x\n", 1027c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE); 1028c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang for (i = 0; i < debug_lldma_count; i++) { 1029c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start); 1030c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang pasDmaList += i; 1031c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 1032c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("\nLLDMA record at offset %08x\n", ((unsigned char*)pasDmaList) - cmdbuf->cmd_base); 1033c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, BSWAP, 31, 31) 1034c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, DIR, 30, 30) 1035c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, PW, 29, 28) 1036c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, List_FIN, 31, 31) 1037c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, List_INT, 30, 30) 1038c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, PI, 18, 17) 1039c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, INCR, 16, 16) 1040c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, LEN, 15, 0) 1041c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(2, ADDR, 22, 0) 1042c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(3, ACC_DEL, 31, 29) 1043c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(3, BURST, 28, 26) 1044c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(3, EXT_SA, 3, 0) 1045c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(4, 2D_MODE, 16, 16) 1046c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(4, REP_COUNT, 10, 0) 1047c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(5, LINE_ADD_OFF, 25, 16) 1048c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(5, ROW_LENGTH, 9, 0) 1049c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(6, SA, 31, 0) 1050c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(7, LISTPTR, 27, 0) 1051c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1052437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1054c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & AUXBUF_TRACE) { 1055c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("debug_dump_count = %d\n", debug_dump_count); 1056c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang for (i = 0; i < debug_dump_count; i++) { 1057c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang unsigned char *buf_addr; 1058c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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]); 1059c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (debug_dump_buf[i]->rar_handle 1060c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang || (psb_buffer_map(debug_dump_buf[i], &buf_addr) != 0)) { 1061c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("Unmappable buffer,e.g. RAR buffer\n"); 1062c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang continue; 1063c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1065c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang g_hexdump_offset = 0; 1066c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__hexdump(buf_addr + debug_dump_offset[i], debug_dump_size[i]); 1067c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_unmap(debug_dump_buf[i]); 1068c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1069c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_dump_count = 0; 1070437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1072c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & CMDMSG_TRACE) { 1073c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("cmd_count = %d, virtual=0x%08x\n", 1074c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf)); 1075c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang for (i = 0; i < debug_cmd_count; i++) { 1076c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang uint32_t *msg = cmdbuf->MTX_msg + i * item_size; 1077c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang int j; 1078c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]); 1079c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i]); 1080c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 1081c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang for (j = 0; j < item_size / 4; j++) { 1082c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j)); 1083c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang switch (j) { 1084c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 0: 1085c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[BufferSize|ID|MSG_SIZE]\n"); 1086c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1087c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 1: 1088c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[MMUPTD]\n"); 1089c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1090c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 2: 1091c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[LLDMA_address]\n"); 1092c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1093c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 3: 1094c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Context]\n"); 1095c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1096c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 4: 1097c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Fence_Value]\n"); 1098c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1099c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 5: 1100c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Operating_Mode]\n"); 1101c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1102c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 6: 1103c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[LastMB|FirstMB]\n"); 1104c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1105c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 7: 1106c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Flags]\n"); 1107c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1108c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang default: 1109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[overflow]\n"); 1110c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1111c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1114c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count = 0; 1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1116c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_unmap(&cmdbuf->buf); 1117c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_unmap(&cmdbuf->reloc_buf); 1118437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1119c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang cmdbuf->cmd_base = NULL; 1120c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0 1121c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (status) { 1122c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status); 1123c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang error_count++; 1124c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ASSERT(status != 2); 1125c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ASSERT(error_count < 40); /* Exit on 40 errors */ 1126c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1127c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (fence) 1128c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_fence_destroy(fence); 1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 1130c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 1134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0 = 0, 11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1 = 1, 11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP; 11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX = 0, 11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST = 1, 11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION; 11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct { 1150bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_UINT32 ui32DevDestAddr ; /* destination address */ 1151bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePW ePeripheralWidth; 1152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncrSize ePeriphIncrSize; 1153bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncr ePeriphIncr; 1154bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_BOOL bSynchronous; 1155bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MMU_GROUP eMMUGroup; 1156bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_DIRECTION eDMADir; 1157bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_eBurst eDMA_eBurst; 11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP; 11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = { 1162bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /* LLDMA_TYPE_VLC_TABLE */ { 1163bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang REG_MSVDX_VEC_VLC_OFFSET , 1164bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PWIDTH_16_BIT, /* 16 bit wide data*/ 1165bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PERIPH_INCR_4, /* Incrament the dest by 32 bits */ 1166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_2 1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* LLDMA_TYPE_BITSTREAM */ { 1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET), 1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_8_BIT, 1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /*LLDMA_TYPE_RESIDUAL*/ { 1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET), 1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_MC*/{ 1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1201bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_VLD*/{ 1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1211bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{ 1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1221bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* From VLR */ 1222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{ 1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1231bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* Into VLR */ 1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{ 1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1238bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1241bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* From MTX */ 1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{ 1244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1248bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1251bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{ 1254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 //2 /* From MTX */ 1262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{ 1264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1268bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1271bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MEM_SET */{ 1274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0), 1275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, /* na */ 1279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 /* From VLR */ 1282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 12857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN ( 0xffff ) 12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1288680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size) 1289680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1290680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang void *pos = (void *)cmdbuf->cmd_idx; 1291680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(!(byte_size % 4)); 1292680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1293680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx += (byte_size / 4); 1294680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1295680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang return pos; 1296680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1297680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1298680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf, 1299680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1300680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1301680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size, 1302680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t dest_offset, 1303680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_TYPE type) 1304680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1305680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(size < 0xFFFF); 1306680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(buffer_offset < 0xFFFF); 1307680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1308680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_CMD_WITH_OFFSET* dma_cmd; 1309680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1310680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(dest_offset==0) 1311680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1312680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD)); 1313680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = 0; 1314680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1315680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1316680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1317680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET)); 1318680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined 1319680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32ByteOffset = dest_offset; 1320680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1321680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1322680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= CMD_DMA; 1323680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= (IMG_UINT32)type; 1324680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= size; 1325680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* dma_cmd->ui32DevVirtAdd = ui32DevVirtAddress; */ 1326680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf); 1327680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1328680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1330680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 1331680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1332680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf, 1333680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1334680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1335680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes, 1336680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t offset_in_bits, 1337680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t flags) 1338680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1339680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* 1340680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * We use byte alignment instead of 32bit alignment. 1341680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * The third frame of sa10164.vc1 results in the following bitstream 1342680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * patttern: 1343680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * [0000] 00 00 03 01 76 dc 04 8d 1344680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * with offset_in_bits = 0x1e 1345680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * This causes an ENTDEC failure because 00 00 03 is a start code 1346680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * By byte aligning the datastream the start code will be eliminated. 1347680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1348680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 1349680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0 1350680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT sizeof(uint8_t) 1351680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t bs_offset_in_dwords = ((offset_in_bits / 8) / ALIGNMENT); 1352680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 1353680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 1354680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 1355680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 1356680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1357680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 1358680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = offset_in_bits; 1359680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 1360680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = size_in_bytes; 1361680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1362680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf); 1363680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1364680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1365680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/* 1366680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one 1367680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1368680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf, 1369680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1370680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes) 1371680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1372680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1373680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf); 1374680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1375680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 1376680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1377680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1378680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags) 1379680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1380680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */ 1381680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1382680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_wt_p = cmdbuf->cmd_idx; 1383680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = 0; 1384680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */ 1385680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 1386680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1387680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1388680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val) 1389680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1390680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1391680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1392680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1393680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1394680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1395680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1396680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1397680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1398680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1399680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1400680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_wt_p++ = val; 1401680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1402680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1403680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1404680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf, 1405680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t reg, 1406680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p buffer, 1407680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset) 1408680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1409680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1410680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1411680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1412680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1413680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1414680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1415680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1416680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1417680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1418680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1419680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1420680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer); 1421680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1422680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1423680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1424680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf) 1425680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1426680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx = cmdbuf->reg_wt_p; 1427680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 1428680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum { 14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MTX_CTRL_HEADER = 0, 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_HDR, 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_NULL, 14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_CK_HDR, 14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS; 14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format 14394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 1440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address) 14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 1442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(((dest_address >> 2)& ~0xfff) == 0); 14434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 1444c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | dest_address; 1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 14464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf, 1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *block, 1449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size) 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((size & 0x3) == 0); 1452e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < size; i += 4) { 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24); 1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_rendec_write(cmdbuf, val); 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf, 1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buffer, 1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset) 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block 14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf) 14704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 14714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 14724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start; 14734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT((dword_count - 1) <= 0xff); 14754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 14764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16); 14774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = NULL; 14784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 14794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 14804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block 14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition) 14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */ 14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */ 14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/ 1488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_condition = skip_condition; 14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = cmdbuf->cmd_idx++; 14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block 14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf) 14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */ 14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */ 15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */ 15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1); 15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size; 15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1507