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" 57b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h" 59b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h> 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h> 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h> 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout: 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cmd_base <= cmd_idx < CMD_END() == lldma_base 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size) 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout: 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size) 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf) (cmdbuf->reloc_base) 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf) (cmdbuf->MTX_msg + cmdbuf->reloc_size) 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf) (cmdbuf->lldma_base) 787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE (0x1000) 817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE (0x3000) 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE (0x3000) 847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE (0x2000) 857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN (0x0040) 877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN (0x0800) 887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN (0x0400) 907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN (0x0400) 91913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#define PSB_SLICE_EXTRACT_UPDATE (0x2) 927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer 957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data, 97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_p cmdbuf 98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int size = CMD_SIZE + LLDMA_SIZE; 1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE; 103bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172; 1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_base = NULL; 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_idx = NULL; 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reg_start = NULL; 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_block_start = NULL; 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->rendec_chunk_start = NULL; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 10; 1252befccec034c13d34746a9e87149889d59ac767bFei Jiang cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == cmdbuf->buffer_refs) { 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf); 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = size; 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf); 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = reloc_size; 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf); 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = regio_size; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) { 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_destroy(cmdbuf); 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf) 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->size) { 155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->buf); 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->size = 0; 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->reloc_size) { 159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->reloc_buf); 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_size = 0; 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->regio_size) { 163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->regio_buf); 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->regio_size = 0; 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->buffer_refs_allocated) { 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs = NULL; 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_allocated = 0; 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf) 1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->last_next_segment_cmd = NULL; 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->buffer_refs_count = 0; 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->deblock_count = 0; 195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->oold_count = 0; 196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->host_be_opp_count = 0; 197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->frame_info_count = 0; 198e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 199e853beb775a5de607bd080d7d43e638f95199e68Nana GUo cmdbuf->parse_count = 0; 200e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE; 2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = cmdbuf->lldma_base; 2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE; 2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Add ourselves to the buffer list */ 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */ 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */ 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf) 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->MTX_msg = NULL; 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_base = NULL; 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_start = NULL; 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_idx = NULL; 2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_bitstream_size = NULL; 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_base = NULL; 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->lldma_idx = NULL; 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_base = NULL; 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx = NULL; 2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count = 0; 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->reloc_buf); 2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in 2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf) 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int item_loc = 0; 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun // buf->next = NULL; /* buf->next only used for buffer list validation */ 259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((item_loc < cmdbuf->buffer_refs_count) 260bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) { 262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun item_loc++; 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc == cmdbuf->buffer_refs_count) { 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Add new entry */ 266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc >= cmdbuf->buffer_refs_allocated) { 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Allocate more entries */ 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int new_size = cmdbuf->buffer_refs_allocated + 10; 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p *new_array; 270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == new_array) { 272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return -1; /* Allocation failure */ 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_allocated = new_size; 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs = new_array; 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs[item_loc] = buf; 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count++; 281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 28479aba326cdfb39a46fc869927999f5002e879871Li Zeng buf->unfence_flag = 0; 285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* only for RAR buffers */ 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((cmdbuf->buffer_refs[item_loc] != buf) 289bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (buf->rar_handle != 0)) { 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc]; 291c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: found same drm buffer with different psb buffer, link them\n", 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((tmp->next != NULL)) { 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp = tmp->next; 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp == buf) /* found same buffer */ 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (tmp != buf) { 300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp->next = buf; /* link it */ 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->status = psb_bs_queued; 302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun buf->next = NULL; 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 304c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: buffer aleady in the list, skip\n", 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun tmp, buf); 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return item_loc; 3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf" 3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer" 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift". 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background". 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf, 321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *addr_in_cmdbuf, 322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p ref_buffer, 323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buf_offset, 324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t mask, 325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t background, 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t align_shift, 327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */ 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Check that address is within buffer range */ 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (dst_buffer) { 334e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base); 335e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf)); 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */ 337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 338e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg); 339e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf)); 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */ 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer); 344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(reloc->buffer != -1); 345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 348c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n", 349c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset); 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (presumed_offset) { 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t new_val = presumed_offset + buf_offset; 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang new_val = (background & ~mask) | (new_val & mask); 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = new_val; 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *addr_in_cmdbuf = PSB_RELOC_MAGIC; 3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->mask = mask; 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->pre_add = buf_offset; 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->background = background; 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc->dst_buffer = dst_buffer; 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->reloc_idx++; 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 367e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf)); 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf 3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context) 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf) { 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current++; 385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) { 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf_current = 0; 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current]; 389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_cmdbuf_reset(cmdbuf); 390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!ret) { 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Success */ 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = cmdbuf; 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then) 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang long long val; 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val = now->tv_sec - then->tv_sec; 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val *= 1000000LL; 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val += now->tv_usec; 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang val -= then->tv_usec; 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (val < 1LL) 408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun val = 1LL; 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return (unsigned) val; 4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1). 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle, 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned relocBufHandle, unsigned relocBufOffset, 427cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan unsigned numRelocs, int __maybe_unused damage, 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg) 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang drm_psb_cmdbuf_arg_t ca; 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg_list; 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int i; 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct timeval then, now; 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang Bool have_then = FALSE; 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count); 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (arg_list == NULL) { 440c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Malloc failed \n"); 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -ENOMEM; 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_req *req = &arg->d.req; 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->next = (unsigned long) & (arg_list[i+1]); 449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 45158c96451d7ea53930d4eb94b6573571a51170de4Fei Jiang //req->group = 0; 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang req->presumed_flags = PSB_USE_PRESUMED; 4574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo req->pad64 = (uint32_t)buffer_list[i]->pl_flags; 458367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#ifndef BAYTRAIL 459367040d221af4e32e54530425f87fb576bc28ae0Li Zeng req->unfence_flag = buffer_list[i]->unfence_flag; 460367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#endif 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang arg_list[buffer_count-1].d.req.next = 0; 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.buffer_list = (uint64_t)((unsigned long)arg_list); 465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.fence_arg = (uint64_t)((unsigned long)fence_arg); 466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_handle = cmdBufHandle; 4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_offset = cmdBufOffset; 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.cmdbuf_size = cmdBufSize; 470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_handle = relocBufHandle; 4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.reloc_offset = relocBufOffset; 4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.num_relocs = numRelocs; 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.fence_flags = fence_flags; 4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ca.engine = engine; 4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 478bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0 479c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: buffer_list = %08x\n", ca.buffer_list); 480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: clip_rects = %08x\n", ca.clip_rects); 481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle); 482c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset); 483c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_size = %08x\n", ca.cmdbuf_size); 484c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_handle = %08x\n", ca.reloc_handle); 485c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_offset = %08x\n", ca.reloc_offset); 486c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: num_relocs = %08x\n", ca.num_relocs); 487c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: engine = %08x\n", ca.engine); 488c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: fence_flags = %08x\n", ca.fence_flags); 4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * X server Signals will clobber the kernel time out mechanism. 4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * we need a user-space timeout as well. 4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == EAGAIN) { 4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!have_then) { 4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&then, NULL)) { 500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n"); 5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang have_then = TRUE; 5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (gettimeofday(&now, NULL)) { 507c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n"); 5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC)); 5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 515c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "command write return is %d\n", ret); 5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_arg *arg = &(arg_list[i]); 5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_validate_rep *rep = &arg->d.rep; 522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 523367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#ifndef BAYTRAIL 524367040d221af4e32e54530425f87fb576bc28ae0Li Zeng if (arg->d.req.unfence_flag) 525367040d221af4e32e54530425f87fb576bc28ae0Li Zeng continue; 526367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#endif 527367040d221af4e32e54530425f87fb576bc28ae0Li Zeng 5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!arg->handled) { 5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = -EFAULT; 5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (arg->ret != 0) { 5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = arg->ret; 5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang goto out; 5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout: 5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(arg_list); 542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer no longer queued in userspace 5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p tmp = buffer_list[i]; 547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* 5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * RAR slice buffer/surface buffer are share one BO, and then only one in 5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer_list, but they are linked in psb_cmdbuf_buffer_ref 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buffer_list[i]->rar_handle == 0) 5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized */ 555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang do { 5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_p p = tmp; 5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang tmp = tmp->next; 5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang switch (p->status) { 5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_queued: 5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang p->status = psb_bs_ready; 5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang case psb_bs_abandoned: 5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_buffer_destroy(p); 5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang free(p); 5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang break; 5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang default: 5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Not supposed to happen */ 5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(0); 5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } while (tmp); 5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 58038f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0 5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence) 5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmFenceUnreference(&pFence); 5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject * 589bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data, 590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang struct psb_ttm_fence_rep *fence_rep, int *status) 5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct _WsbmFenceObject *fence = NULL; 5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = -1; 595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* copy fence information */ 5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (fence_rep->error != 0) { 598c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence" 5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang " and has idled the HW\n"); 6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return NULL; 6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang fence_rep->fence_type, 606e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)fence_rep->handle, 6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 0); 608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (fence) 609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0); 610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return fence; 6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 61338f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif 6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment 6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 618cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p __maybe_unused cmdbuf) 6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 62038f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0 621e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE; 622e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used; 623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */, 625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun bytes_used, 626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0 /* destination offset */, 627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun LLDMA_TYPE_RENDER_BUFF_MC); 6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t cmd = CMD_NEXT_SEG; 629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf)); 630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *(cmdbuf->last_next_segment_cmd + 1) = bytes_used; 63138f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif 6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 6344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */ 6354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context, 6364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_a, 6374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p buf_b, 6384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_buffer_p colocate_buffer, 6394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t picture_widht_mb, 6404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t frame_height_mb, 6414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t rotation_flags, 642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t field_type, 643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t ext_stride_a, 6444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_a, 6454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t chroma_offset_b, 6464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t is_oold) 6474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 6484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 6494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 6504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE; 65106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 6524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo FW_VA_DEBLOCK_MSG *deblock_msg; 6534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 654e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count); 6554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 6574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 6584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6599769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE; 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (is_oold) 6614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD; 6624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo else 6634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD; 6645ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE | FW_DEVA_DEBLOCK_ENABLE; 6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->flags.bits.slice_type = field_type; 6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->operating_mode = obj_context->operating_mode; 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context); 6684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->ext_stride_a = ext_stride_a; 6714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo deblock_msg->rotation_flags = rotation_flags; 6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 6744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (buf_b) { 6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 6774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 6784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo } 6794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 6804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer); 6814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->deblock_count++; 6824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo return 0; 6834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 68517f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#ifdef PSBVIDEO_MSVDX_EC 686f31d5416a60f83e184b0906a7ec77ba021840531hdingint psb_context_submit_host_be_opp(object_context_p obj_context, 687f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_p buf_a, 688f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_p buf_b, 689cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan psb_buffer_p __maybe_unused buf_c, 690f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t picture_widht_mb, 691f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t frame_height_mb, 692f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t rotation_flags, 693f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t field_type, 694f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t ext_stride_a, 695f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t chroma_offset_a, 696f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t chroma_offset_b) 697f31d5416a60f83e184b0906a7ec77ba021840531hding{ 698f31d5416a60f83e184b0906a7ec77ba021840531hding psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 699f31d5416a60f83e184b0906a7ec77ba021840531hding psb_driver_data_p driver_data = obj_context->driver_data; 7009769d6a0972207564efb82e397f19ec002841f65Li Zeng uint32_t msg_size = sizeof(FW_VA_DEBLOCK_MSG); 70106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 702f31d5416a60f83e184b0906a7ec77ba021840531hding FW_VA_DEBLOCK_MSG *deblock_msg; 703f31d5416a60f83e184b0906a7ec77ba021840531hding 704f31d5416a60f83e184b0906a7ec77ba021840531hding uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count + cmdbuf->deblock_count * msg_size); 705f31d5416a60f83e184b0906a7ec77ba021840531hding 706f31d5416a60f83e184b0906a7ec77ba021840531hding memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG)); 707f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg = (FW_VA_DEBLOCK_MSG *)msg; 708f31d5416a60f83e184b0906a7ec77ba021840531hding 7099769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE; 710f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->header.bits.msg_type = VA_MSGID_HOST_BE_OPP_MFLD; 711f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY; 712f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->flags.bits.slice_type = field_type; 713f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->operating_mode = obj_context->operating_mode; 714f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context); 715f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb; 716f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb; 717f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->ext_stride_a = ext_stride_a; 718f31d5416a60f83e184b0906a7ec77ba021840531hding deblock_msg->rotation_flags = rotation_flags; 719f31d5416a60f83e184b0906a7ec77ba021840531hding 720f31d5416a60f83e184b0906a7ec77ba021840531hding RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a); 721f31d5416a60f83e184b0906a7ec77ba021840531hding RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a); 7229769d6a0972207564efb82e397f19ec002841f65Li Zeng RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b); 7239769d6a0972207564efb82e397f19ec002841f65Li Zeng RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b); 724f31d5416a60f83e184b0906a7ec77ba021840531hding 7259769d6a0972207564efb82e397f19ec002841f65Li Zeng deblock_msg->mb_param_address = wsbmKBufHandle(wsbmKBuf(buf_a->drm_buf)); 7269769d6a0972207564efb82e397f19ec002841f65Li Zeng cmdbuf->deblock_count++; 727f31d5416a60f83e184b0906a7ec77ba021840531hding return 0; 728f31d5416a60f83e184b0906a7ec77ba021840531hding} 72917f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif 7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf 7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context) 7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 7384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo psb_driver_data_p driver_data = obj_context->driver_data; 73906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 740c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang int ret; 7414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 743e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes 7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->last_next_segment_cmd) { 7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuffer_size = cmdbuf->first_segment_size; 747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_close_segment(cmdbuf); 7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t msg_size = item_size; 751e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE); 7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 753c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp && (psb_video_trace_level & CMDMSG_TRACE)) { 754c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base; 755c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; 756c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count = cmdbuf->cmd_count + 1; 757c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 7584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 759fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 7604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static int c = 0; 7614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo static char pFileName[30]; 7624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun sprintf(pFileName , "cmdbuf%i.txt", c++); 765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun FILE* pF = fopen(pFileName, "w"); 7664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF); 7684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo fclose(pF); 769fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang*/ 770fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = psb_cmdbuf_dump((unsigned int *)cmdbuf->cmd_start, cmdbuffer_size); 771fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if(ret) 772c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_cmdbuf: dump cmdbuf fail\n"); 7734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->cmd_count++; 7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memset(msg, 0, msg_size); 7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case. 7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 779e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 7814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, msg_size); 782bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_RENDER); 7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 784439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */ 7854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 78606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng /* Point to CMDBUFFER */ 78706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))), 78806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf)); 78906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE, cmdbuffer_size / 4); // In dwords 79006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE, obj_context->operating_mode); 79106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, obj_context->flags); 792c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 793c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp && (psb_video_trace_level & LLDMA_TRACE)) { 794c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList); 795c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base; 796c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang /* Indicate last LLDMA record (for debugging) */ 797c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ((uint32_t *)cmdbuf->lldma_idx)[1] = 0; 798c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 800e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx; 8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 802c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return psb_context_flush_cmdbuf(obj_context); 804c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } else { 805c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) || 806c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) || 807c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) || 808c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) || 809c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) { 810c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang return psb_context_flush_cmdbuf(obj_context); 811c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs 8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context) 8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_cmdbuf_p cmdbuf = obj_context->cmdbuf; 8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb_driver_data_p driver_data = obj_context->driver_data; 8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int fence_flags; 824437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* unsigned int fence_handle = 0; */ 8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang struct psb_ttm_fence_rep fence_rep; 8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int reloc_offset; 8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang unsigned int num_relocs; 8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 82906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */ 8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 831e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 832e853beb775a5de607bd080d7d43e638f95199e68Nana GUo if ((NULL == cmdbuf) || 833e853beb775a5de607bd080d7d43e638f95199e68Nana GUo (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + 834e853beb775a5de607bd080d7d43e638f95199e68Nana GUo cmdbuf->frame_info_count + cmdbuf->parse_count))) { 835e853beb775a5de607bd080d7d43e638f95199e68Nana GUo return 0; // Nothing to do 836e853beb775a5de607bd080d7d43e638f95199e68Nana GUo } 837e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#else 838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if ((NULL == cmdbuf) || 839bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) { 8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; // Nothing to do 8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 842e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t msg_size = 0; 845e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg; 846cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan int32_t i; 847cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan uint32_t index; 8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* LOCK */ 8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->frame_info_count; i++) { 858bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_FRAME_INFO_SIZE; 859bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t); 860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->cmd_count; i++) { 8634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t flags; 864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 86506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS); 8664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Update flags */ 868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count 869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun + cmdbuf->host_be_opp_count)); 870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= 8719769d6a0972207564efb82e397f19ec002841f65Li Zeng (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG); 8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 873f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_EC 874680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if (driver_data->ec_enabled) 875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun flags |= FW_ERROR_DETECTION_AND_RECOVERY; 8769c84210c502eba75e1db7a5284eb584452963c67hding#endif 8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 87806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags); 8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 88006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 88106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 88206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng psb__trace_message("MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 883dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 88406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG BUFFER_SIZE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE)); 88506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG OPERATING_MODE = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE)); 88606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG FLAGS = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS)); 8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0 /* todo */ 8894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo /* Update SAREA */ 8904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context; 8914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif 8924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg += item_size / sizeof(uint32_t); 8934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo msg_size += item_size; 8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Assume deblock message is following render messages and no more render message behand deblock message */ 897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->deblock_count; i++) { 8989769d6a0972207564efb82e397f19ec002841f65Li Zeng msg_size += sizeof(FW_VA_DEBLOCK_MSG); 8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 901dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->oold_count; i++) { 9029769d6a0972207564efb82e397f19ec002841f65Li Zeng msg_size += sizeof(FW_VA_DEBLOCK_MSG); 903437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 904dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 1; i <= cmdbuf->host_be_opp_count; i++) { 906bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang msg_size += FW_VA_HOST_BE_OPP_SIZE; 907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 908e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 909e853beb775a5de607bd080d7d43e638f95199e68Nana GUo for (i = 1; i <= cmdbuf->parse_count; i++) { 910e853beb775a5de607bd080d7d43e638f95199e68Nana GUo msg_size += sizeof(struct fw_slice_header_extract_msg); 911e853beb775a5de607bd080d7d43e638f95199e68Nana GUo } 912e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Now calculate the total number of relocations */ 9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg; 915e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 917c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE); 918c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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); 919c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE); 920c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE); 921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 922dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_unmap(cmdbuf); 9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__trace_message(NULL); /* Flush trace */ 925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->MTX_msg); 927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->reloc_base); 9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 929c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) 930c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = 0; 931c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang else 932c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 934913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#ifdef SLICE_HEADER_PARSING 935913999933b93af5ec1cc99a28b961fa12834c085Nana GUo if (obj_context->msvdx_frame_end) 936913999933b93af5ec1cc99a28b961fa12834c085Nana GUo fence_flags |= PSB_SLICE_EXTRACT_UPDATE; 937913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#endif 9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* cmdbuf will be validated as part of the buffer list */ 9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* Submit */ 9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteLockKernelBO(); 941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs, 942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs_count, 943dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 944dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0, msg_size, 945dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)), 946dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc_offset, num_relocs, 947cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang 0, PSB_ENGINE_DECODE, fence_flags, &fence_rep); 9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmWriteUnlockKernelBO(); 9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 950c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 951dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 959c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0 961c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang static int error_count = 0; 962c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang int status = 0; 963c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang struct _WsbmFenceObject *fence = NULL; 964c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence = psb_fence_wait(driver_data, &fence_rep, &status); 965c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence); 966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 967437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 968c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 9698bc6a6aa815a18f936036b5a47106b47aa904b1bhding int ret; 9708bc6a6aa815a18f936036b5a47106b47aa904b1bhding ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg); 9718bc6a6aa815a18f936036b5a47106b47aa904b1bhding if(ret) { 9728bc6a6aa815a18f936036b5a47106b47aa904b1bhding psb_buffer_unmap(&cmdbuf->buf); 9738bc6a6aa815a18f936036b5a47106b47aa904b1bhding return ret; 9748bc6a6aa815a18f936036b5a47106b47aa904b1bhding } 975c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 976c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & LLDMA_TRACE) { 977c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("lldma_count = %d, vitual=0x%08x\n", 978c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_lldma_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE); 979cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan for (index = 0; index < debug_lldma_count; index++) { 980c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start); 981cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan pasDmaList += index; 982c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 983c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("\nLLDMA record at offset %08x\n", ((unsigned char*)pasDmaList) - cmdbuf->cmd_base); 984c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, BSWAP, 31, 31) 985c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, DIR, 30, 30) 986c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(0, PW, 29, 28) 987c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, List_FIN, 31, 31) 988c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, List_INT, 30, 30) 989c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, PI, 18, 17) 990c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, INCR, 16, 16) 991c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(1, LEN, 15, 0) 992c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(2, ADDR, 22, 0) 993c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(3, ACC_DEL, 31, 29) 994c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(3, BURST, 28, 26) 995c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(3, EXT_SA, 3, 0) 996c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(4, 2D_MODE, 16, 16) 997c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(4, REP_COUNT, 10, 0) 998c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(5, LINE_ADD_OFF, 25, 16) 999c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DW(5, ROW_LENGTH, 9, 0) 1000c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(6, SA, 31, 0) 1001c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang DWH(7, LISTPTR, 27, 0) 1002c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1005c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & AUXBUF_TRACE) { 1006c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("debug_dump_count = %d\n", debug_dump_count); 1007cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan for (index = 0; index < debug_dump_count; index++) { 1008c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang unsigned char *buf_addr; 1009cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan psb__trace_message("Buffer %d = '%s' offset = %08x size = %08x\n", index, debug_dump_name[index], debug_dump_offset[index], debug_dump_size[index]); 1010cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan if (debug_dump_buf[index]->rar_handle 1011cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan || (psb_buffer_map(debug_dump_buf[index], &buf_addr) != 0)) { 1012c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("Unmappable buffer,e.g. RAR buffer\n"); 1013c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang continue; 1014c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1016c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang g_hexdump_offset = 0; 1017cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan psb__hexdump(buf_addr + debug_dump_offset[index], debug_dump_size[index]); 1018cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan psb_buffer_unmap(debug_dump_buf[index]); 1019c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1020c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_dump_count = 0; 1021437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 1022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1023c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_level & CMDMSG_TRACE) { 1024c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("cmd_count = %d, virtual=0x%08x\n", 1025c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf)); 1026cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan for (index = 0; index < debug_cmd_count; index++) { 1027cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + index * item_size); 1028cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan uint32_t j; 1029cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan drv_debug_msg(VIDEO_DEBUG_GENERAL, "start = %08x size = %08x\n", debug_cmd_start[index], debug_cmd_size[index]); 1030cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[index]), debug_cmd_size[index]); 1031c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang 1032c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang for (j = 0; j < item_size / 4; j++) { 1033c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j)); 1034c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang switch (j) { 1035c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 0: 1036c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[BufferSize|ID|MSG_SIZE]\n"); 1037c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1038c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 1: 1039c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[MMUPTD]\n"); 1040c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1041c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 2: 1042c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[LLDMA_address]\n"); 1043c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1044c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 3: 1045c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Context]\n"); 1046c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1047c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 4: 1048c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Fence_Value]\n"); 1049c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1050c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 5: 1051c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Operating_Mode]\n"); 1052c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1053c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 6: 1054c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[LastMB|FirstMB]\n"); 1055c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1056c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang case 7: 1057c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[Flags]\n"); 1058c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1059c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang default: 1060c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb__trace_message("[overflow]\n"); 1061c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang break; 1062c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1063c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1065c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang debug_cmd_count = 0; 1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 1067c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_unmap(&cmdbuf->buf); 1068c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_buffer_unmap(&cmdbuf->reloc_buf); 1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 1070c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang cmdbuf->cmd_base = NULL; 1071c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0 1072c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (status) { 1073c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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); 1074c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang error_count++; 1075c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ASSERT(status != 2); 1076c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ASSERT(error_count < 40); /* Exit on 40 errors */ 1077c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1078c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (fence) 1079c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang psb_fence_destroy(fence); 1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 1081c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 1082dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->cmdbuf = NULL; 10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang obj_context->slice_count++; 1085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP0 = 0, 10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MMU_GROUP1 = 1, 10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP; 10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum { 10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang HOST_TO_MSVDX = 0, 10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MSXDX_TO_HOST = 1, 10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION; 10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct { 1101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_UINT32 ui32DevDestAddr ; /* destination address */ 1102bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePW ePeripheralWidth; 1103bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncrSize ePeriphIncrSize; 1104bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_ePeriphIncr ePeriphIncr; 1105bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_BOOL bSynchronous; 1106bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang MMU_GROUP eMMUGroup; 1107bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_DIRECTION eDMADir; 1108bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_eBurst eDMA_eBurst; 11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP; 11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = { 1113bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /* LLDMA_TYPE_VLC_TABLE */ { 1114bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang REG_MSVDX_VEC_VLC_OFFSET , 1115bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PWIDTH_16_BIT, /* 16 bit wide data*/ 1116bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_PERIPH_INCR_4, /* Incrament the dest by 32 bits */ 1117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_2 1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* LLDMA_TYPE_BITSTREAM */ { 1124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET), 1125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_8_BIT, 1126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1133bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang /*LLDMA_TYPE_RESIDUAL*/ { 1134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET), 1135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_FALSE, 1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 1142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_MC*/{ 1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_RENDER_BUFF_VLD*/{ 1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1162bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{ 1165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1172bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* From VLR */ 1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{ 1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xB90), 1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_ON, 1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, 1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_2 /* Into VLR */ 1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{ 1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1189bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1192bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* From MTX */ 1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{ 1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1199bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP1, 1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1202bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{ 1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1209bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1212bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 //2 /* From MTX */ 1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{ 1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET), 1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_1, 1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1219bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang IMG_TRUE, /* na */ 1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun HOST_TO_MSVDX, 1222bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang DMA_BURST_1 /* Into MTX */ 1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*LLDMA_TYPE_MEM_SET */{ 1225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0), 1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PWIDTH_32_BIT, 1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_4, 1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_PERIPH_INCR_OFF, 1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun IMG_TRUE, /* na */ 1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MMU_GROUP0, 1231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun MSXDX_TO_HOST, 1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DMA_BURST_4 /* From VLR */ 1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun }, 1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}; 12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN ( 0xffff ) 12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1239680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size) 1240680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1241680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang void *pos = (void *)cmdbuf->cmd_idx; 1242680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(!(byte_size % 4)); 1243680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1244680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx += (byte_size / 4); 1245680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1246680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang return pos; 1247680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1248680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1249680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf, 1250680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1251680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1252680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size, 1253680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t dest_offset, 1254680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_TYPE type) 1255680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1256680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(size < 0xFFFF); 1257680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(buffer_offset < 0xFFFF); 1258680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1259680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang DMA_CMD_WITH_OFFSET* dma_cmd; 1260680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1261680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(dest_offset==0) 1262680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1263680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD)); 1264680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = 0; 1265680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1266680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1267680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1268680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET)); 1269680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined 1270680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32ByteOffset = dest_offset; 1271680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1272680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1273680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= CMD_DMA; 1274680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= (IMG_UINT32)type; 1275680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang dma_cmd->ui32Cmd |= size; 1276680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* dma_cmd->ui32DevVirtAdd = ui32DevVirtAddress; */ 1277680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf); 1278680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1279680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 1281680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 1282680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1283680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf, 1284680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1285680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset, 1286680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes, 1287680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t offset_in_bits, 1288680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t flags) 1289680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1290680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* 1291680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * We use byte alignment instead of 32bit alignment. 1292680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * The third frame of sa10164.vc1 results in the following bitstream 1293680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * patttern: 1294680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * [0000] 00 00 03 01 76 dc 04 8d 1295680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * with offset_in_bits = 0x1e 1296680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * This causes an ENTDEC failure because 00 00 03 is a start code 1297680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * By byte aligning the datastream the start code will be eliminated. 1298680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1299680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset 1300680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0 1301680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT sizeof(uint8_t) 1302680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t bs_offset_in_dwords = ((offset_in_bits / 8) / ALIGNMENT); 1303680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang size_in_bytes -= bs_offset_in_dwords * ALIGNMENT; 1304680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang offset_in_bits -= bs_offset_in_dwords * 8 * ALIGNMENT; 1305680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang buffer_offset += bs_offset_in_dwords * ALIGNMENT; 1306680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif 1307680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1308680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 1309680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = offset_in_bits; 1310680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx; 1311680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = size_in_bytes; 1312680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1313680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf); 1314680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1315680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1316e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING 1317e853beb775a5de607bd080d7d43e638f95199e68Nana GUo/* 1318e853beb775a5de607bd080d7d43e638f95199e68Nana GUo * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer 1319e853beb775a5de607bd080d7d43e638f95199e68Nana GUo */ 1320e853beb775a5de607bd080d7d43e638f95199e68Nana GUovoid psb_cmdbuf_dma_write_key(psb_cmdbuf_p cmdbuf, 1321e853beb775a5de607bd080d7d43e638f95199e68Nana GUo uint32_t flags, 1322e853beb775a5de607bd080d7d43e638f95199e68Nana GUo uint32_t key) 1323e853beb775a5de607bd080d7d43e638f95199e68Nana GUo{ 1324e853beb775a5de607bd080d7d43e638f95199e68Nana GUo drv_debug_msg(VIDEO_DEBUG_GENERAL, "pass key, flags is 0x%x, key is 0x%x.\n", flags, key); 1325e853beb775a5de607bd080d7d43e638f95199e68Nana GUo *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags; 1326e853beb775a5de607bd080d7d43e638f95199e68Nana GUo *cmdbuf->cmd_idx++ = key; 1327e853beb775a5de607bd080d7d43e638f95199e68Nana GUo} 1328e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif 1329e853beb775a5de607bd080d7d43e638f95199e68Nana GUo 1330680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/* 1331680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one 1332680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */ 1333680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf, 1334680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p bitstream_buf, 1335680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t size_in_bytes) 1336680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1337680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes); 1338680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf); 1339680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1340680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *(cmdbuf->cmd_bitstream_size) += size_in_bytes; 1341680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1342680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1343680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags) 1344680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1345680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */ 1346680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1347680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_wt_p = cmdbuf->cmd_idx; 1348680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = 0; 1349680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */ 1350680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 1351680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1352680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1353680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val) 1354680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1355680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1356680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1357680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1358680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1359680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1360680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1361680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1362680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1363680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1364680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1365680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_wt_p++ = val; 1366680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1367680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1368680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1369680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf, 1370680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t reg, 1371680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang psb_buffer_p buffer, 1372680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang uint32_t buffer_offset) 1373680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1374680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang if(cmdbuf->reg_start && (reg == cmdbuf->reg_next)) 1375680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1376680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang /* Incrament header size */ 1377680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start += (0x1 << 16); 1378680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1379680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang else 1380680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang { 1381680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = cmdbuf->reg_wt_p++; 1382680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */ 1383680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang } 1384680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1385680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer); 1386680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_next = reg + 4; 1387680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 1388680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang 1389680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf) 1390680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{ 1391680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->cmd_idx = cmdbuf->reg_wt_p; 1392680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang cmdbuf->reg_start = NULL; 1393680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang} 13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum { 13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang MTX_CTRL_HEADER = 0, 13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_HDR, 13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_SL_NULL, 13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RENDEC_CK_HDR, 14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS; 14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format 14044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */ 1405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address) 14064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 1407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(((dest_address >> 2)& ~0xfff) == 0); 14084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++; 1409c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | dest_address; 1410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun} 14114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf, 1413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned char *block, 1414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t size) 14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT((size & 0x3) == 0); 1417e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int i; 1418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < size; i += 4) { 14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24); 1420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_cmdbuf_rendec_write(cmdbuf, val); 14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf, 1425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buffer, 1426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buffer_offset) 14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer); 14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block 14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf) 14354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{ 14364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */ 14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start; 14384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 1439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT((dword_count - 1) <= 0xff); 14404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16); 14424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo cmdbuf->rendec_chunk_start = NULL; 14434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo} 14444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo 14454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* 14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block 14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition) 14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */ 14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */ 14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/ 1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_condition = skip_condition; 14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = cmdbuf->cmd_idx++; 14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block 14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf) 14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */ 14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */ 14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */ 14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1); 14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size; 14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang cmdbuf->skip_block_start = NULL; 14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1472