18e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 2430ce5c32361119ed81a62c918be6afbdd053eddhding * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 3430ce5c32361119ed81a62c918be6afbdd053eddhding * Copyright (c) Imagination Technologies Limited, UK 48e9a21e730449c10cac6e6f69d255611c93f63c2hding * 5430ce5c32361119ed81a62c918be6afbdd053eddhding * Permission is hereby granted, free of charge, to any person obtaining a 6430ce5c32361119ed81a62c918be6afbdd053eddhding * copy of this software and associated documentation files (the 7430ce5c32361119ed81a62c918be6afbdd053eddhding * "Software"), to deal in the Software without restriction, including 8430ce5c32361119ed81a62c918be6afbdd053eddhding * without limitation the rights to use, copy, modify, merge, publish, 9430ce5c32361119ed81a62c918be6afbdd053eddhding * distribute, sub license, and/or sell copies of the Software, and to 10430ce5c32361119ed81a62c918be6afbdd053eddhding * permit persons to whom the Software is furnished to do so, subject to 11430ce5c32361119ed81a62c918be6afbdd053eddhding * the following conditions: 12430ce5c32361119ed81a62c918be6afbdd053eddhding * 13430ce5c32361119ed81a62c918be6afbdd053eddhding * The above copyright notice and this permission notice (including the 14430ce5c32361119ed81a62c918be6afbdd053eddhding * next paragraph) shall be included in all copies or substantial portions 15430ce5c32361119ed81a62c918be6afbdd053eddhding * of the Software. 16430ce5c32361119ed81a62c918be6afbdd053eddhding * 17430ce5c32361119ed81a62c918be6afbdd053eddhding * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18430ce5c32361119ed81a62c918be6afbdd053eddhding * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19430ce5c32361119ed81a62c918be6afbdd053eddhding * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20430ce5c32361119ed81a62c918be6afbdd053eddhding * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21430ce5c32361119ed81a62c918be6afbdd053eddhding * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22430ce5c32361119ed81a62c918be6afbdd053eddhding * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23430ce5c32361119ed81a62c918be6afbdd053eddhding * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 248e9a21e730449c10cac6e6f69d255611c93f63c2hding * 258e9a21e730449c10cac6e6f69d255611c93f63c2hding * Authors: 268e9a21e730449c10cac6e6f69d255611c93f63c2hding * Waldo Bastian <waldo.bastian@intel.com> 278e9a21e730449c10cac6e6f69d255611c93f63c2hding * Zeng Li <zeng.li@intel.com> 288e9a21e730449c10cac6e6f69d255611c93f63c2hding * Edward Lin <edward.lin@intel.com> 298e9a21e730449c10cac6e6f69d255611c93f63c2hding * 308e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 318e9a21e730449c10cac6e6f69d255611c93f63c2hding 328e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <unistd.h> 338e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <stdio.h> 348e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <stdlib.h> 358e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <errno.h> 368e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <string.h> 378e9a21e730449c10cac6e6f69d255611c93f63c2hding#include <wsbm/wsbm_manager.h> 388e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_buffer.h" 39430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_cmdbuf.h" 408e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_def.h" 418e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_drv_debug.h" 42430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_hostcode.h" 438e9a21e730449c10cac6e6f69d255611c93f63c2hding#include "psb_ws_driver.h" 44e26d82700f9514cc175d2b54733ebdeb8824922ehding 45e26d82700f9514cc175d2b54733ebdeb8824922ehding#ifdef ANDROID 46e26d82700f9514cc175d2b54733ebdeb8824922ehding#include <linux/psb_drm.h> 47e26d82700f9514cc175d2b54733ebdeb8824922ehding#else 48e26d82700f9514cc175d2b54733ebdeb8824922ehding#include "psb_drm.h" 49e26d82700f9514cc175d2b54733ebdeb8824922ehding#endif 50e26d82700f9514cc175d2b54733ebdeb8824922ehding 51430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_trace.h" 528e9a21e730449c10cac6e6f69d255611c93f63c2hding 538e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 548e9a21e730449c10cac6e6f69d255611c93f63c2hding * Buffer layout: 558e9a21e730449c10cac6e6f69d255611c93f63c2hding * cmd_base <= cmd_idx < CMD_END() == reloc_base 568e9a21e730449c10cac6e6f69d255611c93f63c2hding * reloc_base <= reloc_idx < RELOC_END() == (reloc_size) 578e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 588e9a21e730449c10cac6e6f69d255611c93f63c2hding 598e9a21e730449c10cac6e6f69d255611c93f63c2hding#define RELOC_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 608e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CMD_END(cmdbuf) (cmdbuf->reloc_base) 618e9a21e730449c10cac6e6f69d255611c93f63c2hding#define RELOC_SIZE (0x3000) 628e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CMD_SIZE (0x3000) 638e9a21e730449c10cac6e6f69d255611c93f63c2hding#define RELOC_MARGIN (0x0800) 648e9a21e730449c10cac6e6f69d255611c93f63c2hding#define CMD_MARGIN (0x0400) 658e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MAX_CMD_COUNT 12 668e9a21e730449c10cac6e6f69d255611c93f63c2hding#define MTX_SEG_SIZE (0x0800) 678e9a21e730449c10cac6e6f69d255611c93f63c2hding 688e9a21e730449c10cac6e6f69d255611c93f63c2hding/*! 698e9a21e730449c10cac6e6f69d255611c93f63c2hding ***************************************************************************** 708e9a21e730449c10cac6e6f69d255611c93f63c2hding * 718e9a21e730449c10cac6e6f69d255611c93f63c2hding * @Name Command word format 728e9a21e730449c10cac6e6f69d255611c93f63c2hding * 738e9a21e730449c10cac6e6f69d255611c93f63c2hding * @details Mask and shift values for command word 748e9a21e730449c10cac6e6f69d255611c93f63c2hding * 758e9a21e730449c10cac6e6f69d255611c93f63c2hding ****************************************************************************/ 768e9a21e730449c10cac6e6f69d255611c93f63c2hding 778e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 788e9a21e730449c10cac6e6f69d255611c93f63c2hding * clear buffer 798e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 80430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_mem_unmap(tng_cmdbuf_p cmdbuf) 818e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 828e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->frame_mem); 838e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->jpeg_pic_params); 848e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->jpeg_header_mem); 858e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->jpeg_header_interface_mem); 868e9a21e730449c10cac6e6f69d255611c93f63c2hding return ; 878e9a21e730449c10cac6e6f69d255611c93f63c2hding} 888e9a21e730449c10cac6e6f69d255611c93f63c2hding 898e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 908e9a21e730449c10cac6e6f69d255611c93f63c2hding * clear buffer 918e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 92430ce5c32361119ed81a62c918be6afbdd053eddhdingstatic void tng_cmdbuf_clear(tng_cmdbuf_p cmdbuf, int flag) 938e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 948e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (flag) { 958e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 968e9a21e730449c10cac6e6f69d255611c93f63c2hding case 4: 978e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(&cmdbuf->jpeg_header_mem); 988e9a21e730449c10cac6e6f69d255611c93f63c2hding case 3: 998e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(&cmdbuf->jpeg_pic_params); 1008e9a21e730449c10cac6e6f69d255611c93f63c2hding case 2: 1018e9a21e730449c10cac6e6f69d255611c93f63c2hding case 1: 1028e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(&cmdbuf->frame_mem); 1038e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 1048e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1058e9a21e730449c10cac6e6f69d255611c93f63c2hding 1068e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cmdbuf->size) { 1078e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(&cmdbuf->buf); 1088e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->size = 0; 1098e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1108e9a21e730449c10cac6e6f69d255611c93f63c2hding if (cmdbuf->buffer_refs_allocated) { 1118e9a21e730449c10cac6e6f69d255611c93f63c2hding free(cmdbuf->buffer_refs); 1128e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs = NULL; 1138e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_allocated = 0; 1148e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1158e9a21e730449c10cac6e6f69d255611c93f63c2hding} 1168e9a21e730449c10cac6e6f69d255611c93f63c2hding 1178e9a21e730449c10cac6e6f69d255611c93f63c2hding 1188e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 1198e9a21e730449c10cac6e6f69d255611c93f63c2hding * Create command buffer 1208e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 1218e9a21e730449c10cac6e6f69d255611c93f63c2hding 122430ce5c32361119ed81a62c918be6afbdd053eddhdingVAStatus tng_cmdbuf_create( 1238e9a21e730449c10cac6e6f69d255611c93f63c2hding object_context_p obj_context, 1248e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data, 125430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_p cmdbuf) 1268e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 1278e9a21e730449c10cac6e6f69d255611c93f63c2hding context_ENC_p ctx = (context_ENC_p) obj_context->format_data; 1288e9a21e730449c10cac6e6f69d255611c93f63c2hding 1298e9a21e730449c10cac6e6f69d255611c93f63c2hding VAStatus vaStatus = VA_STATUS_SUCCESS; 1308e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int size = CMD_SIZE + RELOC_SIZE; 1318e9a21e730449c10cac6e6f69d255611c93f63c2hding 1328e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->size = 0; 1338e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_base = NULL; 1348e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_idx = NULL; 1358e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_base = NULL; 1368e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_idx = NULL; 1378e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_count = 0; 1388e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_allocated = 10; 1398e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 1408e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == cmdbuf->buffer_refs) { 1418e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_allocated = 0; 1428e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1438e9a21e730449c10cac6e6f69d255611c93f63c2hding } 144e26d82700f9514cc175d2b54733ebdeb8824922ehding 1458e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS == vaStatus) { 1468e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_only, &cmdbuf->buf); 1478e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->size = size; 1488e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1498e9a21e730449c10cac6e6f69d255611c93f63c2hding 1508e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 1517bb84b457d5658da0c850ed13dff3d212af70771Edward Lin drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 0 \n", __FUNCTION__); 1527bb84b457d5658da0c850ed13dff3d212af70771Edward Lin tng_cmdbuf_clear(cmdbuf, 1); 1538e9a21e730449c10cac6e6f69d255611c93f63c2hding free(cmdbuf->buffer_refs); 1548e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs = NULL; 1558e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_allocated = 0; 1568e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 1578e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1588e9a21e730449c10cac6e6f69d255611c93f63c2hding 159430ce5c32361119ed81a62c918be6afbdd053eddhding cmdbuf->mem_size = tng_align_KB(TNG_HEADER_SIZE); 160082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing drv_debug_msg(VIDEO_DEBUG_GENERAL, "mem size %d\n", __FUNCTION__, cmdbuf->mem_size); 1618e9a21e730449c10cac6e6f69d255611c93f63c2hding /* create buffer information buffer */ 1627bb84b457d5658da0c850ed13dff3d212af70771Edward Lin //DEBUG-FIXME 1637bb84b457d5658da0c850ed13dff3d212af70771Edward Lin //tng__alloc_init_buffer(driver_data, COMM_CMD_FRAME_BUF_NUM * cmdbuf->mem_size, psb_bt_cpu_vpu, &cmdbuf->frame_mem); 1648e9a21e730449c10cac6e6f69d255611c93f63c2hding 1657bb84b457d5658da0c850ed13dff3d212af70771Edward Lin vaStatus = psb_buffer_create(driver_data, COMM_CMD_FRAME_BUF_NUM * cmdbuf->mem_size, psb_bt_cpu_vpu, &cmdbuf->frame_mem); 1667bb84b457d5658da0c850ed13dff3d212af70771Edward Lin if (VA_STATUS_SUCCESS != vaStatus) { 1677bb84b457d5658da0c850ed13dff3d212af70771Edward Lin drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create xx \n", __FUNCTION__); 1687bb84b457d5658da0c850ed13dff3d212af70771Edward Lin free(cmdbuf->buffer_refs); 1697bb84b457d5658da0c850ed13dff3d212af70771Edward Lin cmdbuf->buffer_refs = NULL; 1707bb84b457d5658da0c850ed13dff3d212af70771Edward Lin cmdbuf->buffer_refs_allocated = 0; 1717bb84b457d5658da0c850ed13dff3d212af70771Edward Lin return vaStatus; 1727bb84b457d5658da0c850ed13dff3d212af70771Edward Lin } 1738e9a21e730449c10cac6e6f69d255611c93f63c2hding /* all cmdbuf share one MTX_CURRENT_IN_PARAMS since every MB has a MTX_CURRENT_IN_PARAMS structure 1748e9a21e730449c10cac6e6f69d255611c93f63c2hding * and filling this structure for all MB is very time-consuming 1758e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 1768e9a21e730449c10cac6e6f69d255611c93f63c2hding 1778e9a21e730449c10cac6e6f69d255611c93f63c2hding /* create JPEG quantization buffer */ 1788e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_create(driver_data, ctx->jpeg_pic_params_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_pic_params); 1798e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 1807bb84b457d5658da0c850ed13dff3d212af70771Edward Lin drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 1 \n", __FUNCTION__); 181430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_clear(cmdbuf, 2); 1828e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 1838e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1848e9a21e730449c10cac6e6f69d255611c93f63c2hding 1858e9a21e730449c10cac6e6f69d255611c93f63c2hding /* create JPEG MTX setup buffer */ 1868e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_create(driver_data, ctx->jpeg_header_mem_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_header_mem); 1878e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 1887bb84b457d5658da0c850ed13dff3d212af70771Edward Lin drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 2 \n", __FUNCTION__); 189430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_clear(cmdbuf, 3); 1908e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 1918e9a21e730449c10cac6e6f69d255611c93f63c2hding } 1928e9a21e730449c10cac6e6f69d255611c93f63c2hding 1938e9a21e730449c10cac6e6f69d255611c93f63c2hding /* create JPEG MTX setup interface buffer */ 1948e9a21e730449c10cac6e6f69d255611c93f63c2hding vaStatus = psb_buffer_create(driver_data, ctx->jpeg_header_interface_mem_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_header_interface_mem); 1958e9a21e730449c10cac6e6f69d255611c93f63c2hding if (VA_STATUS_SUCCESS != vaStatus) { 1967bb84b457d5658da0c850ed13dff3d212af70771Edward Lin drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 3 \n", __FUNCTION__); 197430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_clear(cmdbuf, 4); 1988e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 1998e9a21e730449c10cac6e6f69d255611c93f63c2hding } 200dd0a0b792078d587a2e266f146ccd287c39a742dedward lin 2018e9a21e730449c10cac6e6f69d255611c93f63c2hding return vaStatus; 2028e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2038e9a21e730449c10cac6e6f69d255611c93f63c2hding 2048e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 2058e9a21e730449c10cac6e6f69d255611c93f63c2hding * Destroy buffer 2068e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 207430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_destroy(tng_cmdbuf_p cmdbuf) 2088e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 209e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_destroy(&cmdbuf->frame_mem); 210e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_destroy(&cmdbuf->jpeg_header_mem); 211e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_destroy(&cmdbuf->jpeg_pic_params); 212e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_destroy(&cmdbuf->jpeg_header_interface_mem); 213e26d82700f9514cc175d2b54733ebdeb8824922ehding 214e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmdbuf->size) { 215e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_destroy(&cmdbuf->buf); 216e26d82700f9514cc175d2b54733ebdeb8824922ehding cmdbuf->size = 0; 217e26d82700f9514cc175d2b54733ebdeb8824922ehding } 218e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmdbuf->buffer_refs_allocated) { 219e26d82700f9514cc175d2b54733ebdeb8824922ehding free(cmdbuf->buffer_refs); 220e26d82700f9514cc175d2b54733ebdeb8824922ehding cmdbuf->buffer_refs = NULL; 221e26d82700f9514cc175d2b54733ebdeb8824922ehding cmdbuf->buffer_refs_allocated = 0; 222e26d82700f9514cc175d2b54733ebdeb8824922ehding } 223dd0a0b792078d587a2e266f146ccd287c39a742dedward lin return ; 2248e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2258e9a21e730449c10cac6e6f69d255611c93f63c2hding 2268e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 2278e9a21e730449c10cac6e6f69d255611c93f63c2hding * Reset buffer & map 2288e9a21e730449c10cac6e6f69d255611c93f63c2hding * 2298e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success 2308e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 231430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_reset(tng_cmdbuf_p cmdbuf) 2328e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2338e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 2348e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_base = NULL; 2358e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_idx = NULL; 2368e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_base = NULL; 2378e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_idx = NULL; 2388e9a21e730449c10cac6e6f69d255611c93f63c2hding 2398e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_count = 0; 2408e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->frame_mem_index = 0; 2418e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_count = 0; 242430ce5c32361119ed81a62c918be6afbdd053eddhding cmdbuf->mem_size = tng_align_KB(TNG_HEADER_SIZE); 2438e9a21e730449c10cac6e6f69d255611c93f63c2hding 2448e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 2458e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 2468e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 2478e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2488e9a21e730449c10cac6e6f69d255611c93f63c2hding 2498e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_start = cmdbuf->cmd_base; 2508e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_idx = (IMG_UINT32 *) cmdbuf->cmd_base; 2518e9a21e730449c10cac6e6f69d255611c93f63c2hding 2528e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_base = cmdbuf->cmd_base + CMD_SIZE; 2538e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 2548e9a21e730449c10cac6e6f69d255611c93f63c2hding 2558e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Add ourselves to the buffer list */ 256430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 0 */ 2578e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 2588e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2598e9a21e730449c10cac6e6f69d255611c93f63c2hding 2608e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 2618e9a21e730449c10cac6e6f69d255611c93f63c2hding * Unmap buffer 2628e9a21e730449c10cac6e6f69d255611c93f63c2hding * 2638e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success 2648e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 265430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_unmap(tng_cmdbuf_p cmdbuf) 2668e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2678e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_base = NULL; 2688e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_start = NULL; 2698e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_idx = NULL; 2708e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_base = NULL; 2718e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_idx = NULL; 2728e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->cmd_count = 0; 2738e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_unmap(&cmdbuf->buf); 2748e9a21e730449c10cac6e6f69d255611c93f63c2hding return 0; 2758e9a21e730449c10cac6e6f69d255611c93f63c2hding} 2768e9a21e730449c10cac6e6f69d255611c93f63c2hding 2778e9a21e730449c10cac6e6f69d255611c93f63c2hding 2788e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 2798e9a21e730449c10cac6e6f69d255611c93f63c2hding * Reference an addtional buffer "buf" in the command stream 2808e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns a reference index that can be used to refer to "buf" in 2818e9a21e730449c10cac6e6f69d255611c93f63c2hding * relocation records, -1 on error 2828e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 283430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_buffer_ref(tng_cmdbuf_p cmdbuf, psb_buffer_p buf) 2848e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 2858e9a21e730449c10cac6e6f69d255611c93f63c2hding int item_loc = 0; 2868e9a21e730449c10cac6e6f69d255611c93f63c2hding 2878e9a21e730449c10cac6e6f69d255611c93f63c2hding /*Reserve the same TTM BO twice will cause kernel lock up*/ 2888e9a21e730449c10cac6e6f69d255611c93f63c2hding while ((item_loc < cmdbuf->buffer_refs_count) 2898e9a21e730449c10cac6e6f69d255611c93f63c2hding && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 2908e9a21e730449c10cac6e6f69d255611c93f63c2hding != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) 2918e9a21e730449c10cac6e6f69d255611c93f63c2hding //while( (item_loc < cmdbuf->buffer_refs_count) && (cmdbuf->buffer_refs[item_loc] != buf) ) 2928e9a21e730449c10cac6e6f69d255611c93f63c2hding { 2938e9a21e730449c10cac6e6f69d255611c93f63c2hding item_loc++; 2948e9a21e730449c10cac6e6f69d255611c93f63c2hding } 2958e9a21e730449c10cac6e6f69d255611c93f63c2hding if (item_loc == cmdbuf->buffer_refs_count) { 2968e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Add new entry */ 2978e9a21e730449c10cac6e6f69d255611c93f63c2hding if (item_loc >= cmdbuf->buffer_refs_allocated) { 2988e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Allocate more entries */ 2998e9a21e730449c10cac6e6f69d255611c93f63c2hding int new_size = cmdbuf->buffer_refs_allocated + 10; 3008e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_p *new_array; 3018e9a21e730449c10cac6e6f69d255611c93f63c2hding new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 3028e9a21e730449c10cac6e6f69d255611c93f63c2hding if (NULL == new_array) { 3038e9a21e730449c10cac6e6f69d255611c93f63c2hding return -1; /* Allocation failure */ 3048e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3058e9a21e730449c10cac6e6f69d255611c93f63c2hding memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 3068e9a21e730449c10cac6e6f69d255611c93f63c2hding free(cmdbuf->buffer_refs); 3078e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_allocated = new_size; 3088e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs = new_array; 3098e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3108e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs[item_loc] = buf; 3118e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs_count++; 3128e9a21e730449c10cac6e6f69d255611c93f63c2hding buf->status = psb_bs_queued; 3138e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3148e9a21e730449c10cac6e6f69d255611c93f63c2hding return item_loc; 3158e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3168e9a21e730449c10cac6e6f69d255611c93f63c2hding 3178e9a21e730449c10cac6e6f69d255611c93f63c2hding/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 3188e9a21e730449c10cac6e6f69d255611c93f63c2hding * "addr_in_cmdbuf" 3198e9a21e730449c10cac6e6f69d255611c93f63c2hding * The relocation is based on the device virtual address of "ref_buffer" 3208e9a21e730449c10cac6e6f69d255611c93f63c2hding * "buf_offset" is be added to the device virtual address, and the sum is then 3218e9a21e730449c10cac6e6f69d255611c93f63c2hding * right shifted with "align_shift". 3228e9a21e730449c10cac6e6f69d255611c93f63c2hding * "mask" determines which bits of the target DWORD will be updated with the so 3238e9a21e730449c10cac6e6f69d255611c93f63c2hding * constructed address. The remaining bits will be filled with bits from "background". 3248e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 325430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_add_relocation(tng_cmdbuf_p cmdbuf, 3268e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 *addr_in_dst_buffer,/*addr of dst_buffer for the DWORD*/ 3278e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_p ref_buffer, 3288e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 buf_offset, 3298e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 mask, 3308e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 background, 3318e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 align_shift, 3328e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 dst_buffer, 3338e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 *start_of_dst_buffer) /*Index of the list refered by cmdbuf->buffer_refs */ 3348e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 3358e9a21e730449c10cac6e6f69d255611c93f63c2hding struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 3368e9a21e730449c10cac6e6f69d255611c93f63c2hding uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 3378e9a21e730449c10cac6e6f69d255611c93f63c2hding 3388e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->where = addr_in_dst_buffer - start_of_dst_buffer; /* Offset in DWORDs */ 3398e9a21e730449c10cac6e6f69d255611c93f63c2hding 340430ce5c32361119ed81a62c918be6afbdd053eddhding reloc->buffer = tng_cmdbuf_buffer_ref(cmdbuf, ref_buffer); 3418e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT(reloc->buffer != -1); 3428e9a21e730449c10cac6e6f69d255611c93f63c2hding 3438e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->reloc_op = PSB_RELOC_OP_OFFSET; 3448e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifndef VA_EMULATOR 3458e9a21e730449c10cac6e6f69d255611c93f63c2hding if (presumed_offset) { 3468e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 new_val = presumed_offset + buf_offset; 3478e9a21e730449c10cac6e6f69d255611c93f63c2hding 3488e9a21e730449c10cac6e6f69d255611c93f63c2hding new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 3498e9a21e730449c10cac6e6f69d255611c93f63c2hding new_val = (background & ~mask) | (new_val & mask); 3508e9a21e730449c10cac6e6f69d255611c93f63c2hding *addr_in_dst_buffer = new_val; 3518e9a21e730449c10cac6e6f69d255611c93f63c2hding } else { 3528e9a21e730449c10cac6e6f69d255611c93f63c2hding *addr_in_dst_buffer = PSB_RELOC_MAGIC; 3538e9a21e730449c10cac6e6f69d255611c93f63c2hding } 3548e9a21e730449c10cac6e6f69d255611c93f63c2hding#else 3558e9a21e730449c10cac6e6f69d255611c93f63c2hding /* indicate subscript of relocation buffer */ 3568e9a21e730449c10cac6e6f69d255611c93f63c2hding *addr_in_dst_buffer = reloc - (struct drm_psb_reloc *)cmdbuf->reloc_base; 3578e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 3588e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->mask = mask; 3598e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 3608e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->pre_add = buf_offset; 3618e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->background = background; 3628e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc->dst_buffer = dst_buffer; 3638e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->reloc_idx++; 3648e9a21e730449c10cac6e6f69d255611c93f63c2hding 3658e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT(((void *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf)); 3668e9a21e730449c10cac6e6f69d255611c93f63c2hding} 3678e9a21e730449c10cac6e6f69d255611c93f63c2hding 3688e9a21e730449c10cac6e6f69d255611c93f63c2hding/* Prepare one command package */ 369381e313cd06b652a08bef36b3e9d44ae096e72b2pingshixvoid tng_cmdbuf_insert_command( 370e26d82700f9514cc175d2b54733ebdeb8824922ehding object_context_p obj_context, 371e26d82700f9514cc175d2b54733ebdeb8824922ehding IMG_UINT32 stream_id, 372e26d82700f9514cc175d2b54733ebdeb8824922ehding IMG_UINT32 cmd_id, 373e26d82700f9514cc175d2b54733ebdeb8824922ehding IMG_UINT32 cmd_data, 374e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_buffer_p data_addr, 375e26d82700f9514cc175d2b54733ebdeb8824922ehding IMG_UINT32 offset) 376e26d82700f9514cc175d2b54733ebdeb8824922ehding{ 377e26d82700f9514cc175d2b54733ebdeb8824922ehding IMG_UINT32 cmd_word; 378e26d82700f9514cc175d2b54733ebdeb8824922ehding context_ENC_p ctx = (context_ENC_p) obj_context->format_data; 379e26d82700f9514cc175d2b54733ebdeb8824922ehding context_ENC_cmdbuf *ps_cmd = &(ctx->ctx_cmdbuf[stream_id]); 380d8bdef29bee0d7e15685d1ae2ad74ad6b356ce89Ren, Zhaohan context_ENC_mem *ps_mem = &(ctx->ctx_mem[stream_id]); 381e26d82700f9514cc175d2b54733ebdeb8824922ehding tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf; 382e26d82700f9514cc175d2b54733ebdeb8824922ehding psb_driver_data_p driver_data = ctx->obj_context->driver_data; 383e26d82700f9514cc175d2b54733ebdeb8824922ehding int interrupt_flags; 384e26d82700f9514cc175d2b54733ebdeb8824922ehding 385e26d82700f9514cc175d2b54733ebdeb8824922ehding //CMD composed by user space does not generate Interrupt 386e26d82700f9514cc175d2b54733ebdeb8824922ehding interrupt_flags = 0; 387e26d82700f9514cc175d2b54733ebdeb8824922ehding 388e26d82700f9514cc175d2b54733ebdeb8824922ehding assert(stream_id <= TOPAZHP_MAX_NUM_STREAMS); 389e26d82700f9514cc175d2b54733ebdeb8824922ehding 390e26d82700f9514cc175d2b54733ebdeb8824922ehding /* Write command to FIFO */ 391e26d82700f9514cc175d2b54733ebdeb8824922ehding { 392e26d82700f9514cc175d2b54733ebdeb8824922ehding cmd_word = F_ENCODE(stream_id, MTX_MSG_CORE) | 393e26d82700f9514cc175d2b54733ebdeb8824922ehding F_ENCODE(cmd_id, MTX_MSG_CMD_ID); 394e26d82700f9514cc175d2b54733ebdeb8824922ehding 395e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmd_id & MTX_CMDID_PRIORITY) { 396e26d82700f9514cc175d2b54733ebdeb8824922ehding /* increment the command counter */ 397e26d82700f9514cc175d2b54733ebdeb8824922ehding ps_cmd->ui32HighCmdCount++; 398e26d82700f9514cc175d2b54733ebdeb8824922ehding 399e26d82700f9514cc175d2b54733ebdeb8824922ehding /* Prepare high priority command */ 400e26d82700f9514cc175d2b54733ebdeb8824922ehding cmd_word |= F_ENCODE(1, MTX_MSG_PRIORITY) | 401e26d82700f9514cc175d2b54733ebdeb8824922ehding F_ENCODE(((ps_cmd->ui32LowCmdCount - 1) & 0xff) |(ps_cmd->ui32HighCmdCount << 8), MTX_MSG_COUNT); 402e26d82700f9514cc175d2b54733ebdeb8824922ehding } else { 403e26d82700f9514cc175d2b54733ebdeb8824922ehding /* Prepare low priority command */ 404e26d82700f9514cc175d2b54733ebdeb8824922ehding cmd_word |= 405e26d82700f9514cc175d2b54733ebdeb8824922ehding F_ENCODE(ps_cmd->ui32LowCmdCount & 0xff, MTX_MSG_COUNT); 406e26d82700f9514cc175d2b54733ebdeb8824922ehding ++(ps_cmd->ui32LowCmdCount); 407e26d82700f9514cc175d2b54733ebdeb8824922ehding } 408e26d82700f9514cc175d2b54733ebdeb8824922ehding drv_debug_msg(VIDEO_DEBUG_GENERAL, 409e26d82700f9514cc175d2b54733ebdeb8824922ehding "%s: cmd_id = 0x%08x\n", 410e26d82700f9514cc175d2b54733ebdeb8824922ehding __FUNCTION__, cmd_word); 411e26d82700f9514cc175d2b54733ebdeb8824922ehding *cmdbuf->cmd_idx++ = cmd_word; 412e26d82700f9514cc175d2b54733ebdeb8824922ehding } 413e26d82700f9514cc175d2b54733ebdeb8824922ehding 414e26d82700f9514cc175d2b54733ebdeb8824922ehding /* write command word into cmdbuf */ 415e26d82700f9514cc175d2b54733ebdeb8824922ehding *cmdbuf->cmd_idx++ = cmd_data; 416e26d82700f9514cc175d2b54733ebdeb8824922ehding/* Command data address */ 417e26d82700f9514cc175d2b54733ebdeb8824922ehding if (data_addr) { 418cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan if (cmd_id == MTX_CMDID_RC_UPDATE) { 419cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = (IMG_UINT32)data_addr; 420cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan drv_debug_msg(VIDEO_DEBUG_GENERAL, 421cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan "%s: data_addr = 0x%08x\n", 422cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan __FUNCTION__, *(cmdbuf->cmd_idx)); 423cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan } else { 42498be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin if ((cmd_id >= MTX_CMDID_SETQUANT) && (cmd_id <= MTX_CMDID_SETUP)) { 42598be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin if (cmd_id == MTX_CMDID_ISSUEBUFF) 42698be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin TNG_RELOC_CMDBUF_START(cmdbuf->cmd_idx, offset, data_addr); 427cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan else 42898be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0); 429cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan } else { 430381e313cd06b652a08bef36b3e9d44ae096e72b2pingshix#ifdef _TNG_RELOC_ 431cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan TNG_RELOC_CMDBUF_START(cmdbuf->cmd_idx, offset, data_addr); 432e26d82700f9514cc175d2b54733ebdeb8824922ehding#else 433cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0); 434e26d82700f9514cc175d2b54733ebdeb8824922ehding#endif 435cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan } 43698be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, 43798be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin "%s: data_addr = 0x%08x\n", 43898be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin __FUNCTION__, *(cmdbuf->cmd_idx)); 43998be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin cmdbuf->cmd_idx++; 440cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan } 441e26d82700f9514cc175d2b54733ebdeb8824922ehding } else { 442cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = 0; 443d8bdef29bee0d7e15685d1ae2ad74ad6b356ce89Ren, Zhaohan } 444d8bdef29bee0d7e15685d1ae2ad74ad6b356ce89Ren, Zhaohan 4455bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan if (cmd_id == MTX_CMDID_SW_FILL_INPUT_CTRL) { 446cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ui16IntraRefresh; 447cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->sRCParams.ui32InitialQp; 448cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->sRCParams.iMinQP; 449cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ctx_mem_size.mb_ctrl_in_params; 450cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ui32pseudo_rand_seed; 451e26d82700f9514cc175d2b54733ebdeb8824922ehding } 452e26d82700f9514cc175d2b54733ebdeb8824922ehding 4535bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan if (cmd_id == MTX_CMDID_SW_UPDATE_AIR_SEND) { 454cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->sAirInfo.i16AIRSkipCnt; 455cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->sAirInfo.i32NumAIRSPerFrame; 456cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ctx_mem_size.mb_ctrl_in_params; 457cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ui32FrameCount[0]; 4585bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan } 4595bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan 4605bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan if (cmd_id == MTX_CMDID_SW_UPDATE_AIR_CALC) { 461cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ctx_mem_size.first_pass_out_best_multipass_param; 462cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->sAirInfo.i32SAD_Threshold; 463cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *cmdbuf->cmd_idx++ = ctx->ui8EnableSelStatsFlags; 4645bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan } 4655bda8779f054b9e2da23725643d0559618bb5f8cRen, Zhaohan 466e26d82700f9514cc175d2b54733ebdeb8824922ehding /* Command data address */ 467e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmd_id == MTX_CMDID_SETVIDEO) { 468e26d82700f9514cc175d2b54733ebdeb8824922ehding *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf)); 469e26d82700f9514cc175d2b54733ebdeb8824922ehding drv_debug_msg(VIDEO_DEBUG_GENERAL, 470e26d82700f9514cc175d2b54733ebdeb8824922ehding "%s: cmd_param = 0x%08x\n", 471e26d82700f9514cc175d2b54733ebdeb8824922ehding __FUNCTION__, *(cmdbuf->cmd_idx - 1)); 4724a9f370494d95905305e89135da22858a7e45435Ren Zhaohan 473cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan if (data_addr) 474cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(data_addr->drm_buf)); 475d8bdef29bee0d7e15685d1ae2ad74ad6b356ce89Ren, Zhaohan 476cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ps_mem->bufs_mb_ctrl_in_params.drm_buf)); 477cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ps_mem->bufs_first_pass_out_params.drm_buf)); 478cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ps_mem->bufs_first_pass_out_best_multipass_param.drm_buf)); 479e26d82700f9514cc175d2b54733ebdeb8824922ehding } 480e26d82700f9514cc175d2b54733ebdeb8824922ehding 481e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmd_id == MTX_CMDID_SETUP_INTERFACE) { 482e26d82700f9514cc175d2b54733ebdeb8824922ehding *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf)); 483e26d82700f9514cc175d2b54733ebdeb8824922ehding drv_debug_msg(VIDEO_DEBUG_GENERAL, 484e26d82700f9514cc175d2b54733ebdeb8824922ehding "%s: cmd_param = 0x%08x\n", 485e26d82700f9514cc175d2b54733ebdeb8824922ehding __FUNCTION__, *(cmdbuf->cmd_idx - 1)); 486e26d82700f9514cc175d2b54733ebdeb8824922ehding } 487e26d82700f9514cc175d2b54733ebdeb8824922ehding 488e26d82700f9514cc175d2b54733ebdeb8824922ehding if (cmd_id == MTX_CMDID_SHUTDOWN) { 489e26d82700f9514cc175d2b54733ebdeb8824922ehding *(cmdbuf->cmd_idx)++ = ctx->eCodec; 490e26d82700f9514cc175d2b54733ebdeb8824922ehding 491e26d82700f9514cc175d2b54733ebdeb8824922ehding drv_debug_msg(VIDEO_DEBUG_GENERAL, 492e26d82700f9514cc175d2b54733ebdeb8824922ehding "%s: cmd_param = 0x%08x\n", 493e26d82700f9514cc175d2b54733ebdeb8824922ehding __FUNCTION__, *(cmdbuf->cmd_idx - 1)); 494e26d82700f9514cc175d2b54733ebdeb8824922ehding } 495e26d82700f9514cc175d2b54733ebdeb8824922ehding 496e26d82700f9514cc175d2b54733ebdeb8824922ehding return ; 497e26d82700f9514cc175d2b54733ebdeb8824922ehding} 498e26d82700f9514cc175d2b54733ebdeb8824922ehding 499e26d82700f9514cc175d2b54733ebdeb8824922ehding 5008e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 5018e9a21e730449c10cac6e6f69d255611c93f63c2hding * Advances "obj_context" to the next cmdbuf 5028e9a21e730449c10cac6e6f69d255611c93f63c2hding * 5038e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success 5048e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 505430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_get_next_cmdbuf(object_context_p obj_context) 5068e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 507430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_p cmdbuf; 5088e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 509dd0a0b792078d587a2e266f146ccd287c39a742dedward lin 510430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start obj_context->tng_cmdbuf = %x\n", __FUNCTION__, obj_context->tng_cmdbuf); 5118e9a21e730449c10cac6e6f69d255611c93f63c2hding 512430ce5c32361119ed81a62c918be6afbdd053eddhding if (obj_context->tng_cmdbuf) { 5138e9a21e730449c10cac6e6f69d255611c93f63c2hding return 0; 5148e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5158e9a21e730449c10cac6e6f69d255611c93f63c2hding 5168e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->cmdbuf_current++; 517430ce5c32361119ed81a62c918be6afbdd053eddhding if (obj_context->cmdbuf_current >= TNG_MAX_CMDBUFS_ENCODE) { 5188e9a21e730449c10cac6e6f69d255611c93f63c2hding obj_context->cmdbuf_current = 0; 5198e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5208e9a21e730449c10cac6e6f69d255611c93f63c2hding 521430ce5c32361119ed81a62c918be6afbdd053eddhding cmdbuf = obj_context->tng_cmdbuf_list[obj_context->cmdbuf_current]; 522430ce5c32361119ed81a62c918be6afbdd053eddhding ret = tng_cmdbuf_reset(cmdbuf); 5238e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!ret) { 5248e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Success */ 525430ce5c32361119ed81a62c918be6afbdd053eddhding obj_context->tng_cmdbuf = cmdbuf; 5268e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5278e9a21e730449c10cac6e6f69d255611c93f63c2hding 528430ce5c32361119ed81a62c918be6afbdd053eddhding// tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->pic_params); 529430ce5c32361119ed81a62c918be6afbdd053eddhding// tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->slice_mem); 5308e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 5318e9a21e730449c10cac6e6f69d255611c93f63c2hding} 5328e9a21e730449c10cac6e6f69d255611c93f63c2hding 5338e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 5348e9a21e730449c10cac6e6f69d255611c93f63c2hding * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 5358e9a21e730449c10cac6e6f69d255611c93f63c2hding * It allows different buffers as command- and reloc buffer. A list of 5368e9a21e730449c10cac6e6f69d255611c93f63c2hding * cliprects to apply and whether to copy the clipRect content to all 5378e9a21e730449c10cac6e6f69d255611c93f63c2hding * scanout buffers (damage = 1). 5388e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 5398e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 5408e9a21e730449c10cac6e6f69d255611c93f63c2hding * Don't add debug statements in this function, it gets called with the 5418e9a21e730449c10cac6e6f69d255611c93f63c2hding * DRM lock held and output to an X terminal can cause X to deadlock 5428e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 5438e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic int 5448e9a21e730449c10cac6e6f69d255611c93f63c2hdingptgDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle, 5458e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned cmdBufOffset, unsigned cmdBufSize, 5468e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned relocBufHandle, unsigned relocBufOffset, 547cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan unsigned numRelocs, int __maybe_unused damage, 5488e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_rep) 5498e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 5508e9a21e730449c10cac6e6f69d255611c93f63c2hding drm_psb_cmdbuf_arg_t ca; 5518e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_validate_arg *arg_list; 5526050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan int i, ret; 5536050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan unsigned int retry = 0; 5548e9a21e730449c10cac6e6f69d255611c93f63c2hding uint64_t mask = PSB_GPU_ACCESS_MASK; 5558e9a21e730449c10cac6e6f69d255611c93f63c2hding 5568e9a21e730449c10cac6e6f69d255611c93f63c2hding arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count); 5578e9a21e730449c10cac6e6f69d255611c93f63c2hding if (arg_list == NULL) { 5588e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Allocate memory failed\n"); 5598e9a21e730449c10cac6e6f69d255611c93f63c2hding return -ENOMEM; 5608e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5618e9a21e730449c10cac6e6f69d255611c93f63c2hding 5628e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < buffer_count; i++) { 5638e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_validate_arg *arg = &(arg_list[i]); 5648e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_validate_req *req = &arg->d.req; 5658e9a21e730449c10cac6e6f69d255611c93f63c2hding 5667bb84b457d5658da0c850ed13dff3d212af70771Edward Lin //memset(arg, 0, sizeof(*arg)); 5678e9a21e730449c10cac6e6f69d255611c93f63c2hding req->next = (unsigned long) & (arg_list[i+1]); 5688e9a21e730449c10cac6e6f69d255611c93f63c2hding 5698e9a21e730449c10cac6e6f69d255611c93f63c2hding req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 57058c96451d7ea53930d4eb94b6573571a51170de4Fei Jiang //req->group = 0; 5718e9a21e730449c10cac6e6f69d255611c93f63c2hding req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 5728e9a21e730449c10cac6e6f69d255611c93f63c2hding req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 5738e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 1 5748e9a21e730449c10cac6e6f69d255611c93f63c2hding req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 5758e9a21e730449c10cac6e6f69d255611c93f63c2hding req->presumed_flags = PSB_USE_PRESUMED; 5768e9a21e730449c10cac6e6f69d255611c93f63c2hding#else 5778e9a21e730449c10cac6e6f69d255611c93f63c2hding req->presumed_flags = 0; 5788e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 5798e9a21e730449c10cac6e6f69d255611c93f63c2hding req->pad64 = (IMG_UINT32)buffer_list[i]->pl_flags; 58098be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin#ifndef BAYTRAIL 58198be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin req->unfence_flag = buffer_list[i]->unfence_flag; 58298be9b15fdf9dd710170f4d47d9be9ad754614b8edward lin#endif 5838e9a21e730449c10cac6e6f69d255611c93f63c2hding } 5848e9a21e730449c10cac6e6f69d255611c93f63c2hding arg_list[buffer_count-1].d.req.next = 0; 5858e9a21e730449c10cac6e6f69d255611c93f63c2hding 5868e9a21e730449c10cac6e6f69d255611c93f63c2hding memset(&ca, 0, sizeof(ca)); 5878e9a21e730449c10cac6e6f69d255611c93f63c2hding 5888e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.buffer_list = (uint64_t)((unsigned long)arg_list); 5898e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.cmdbuf_handle = cmdBufHandle; 5908e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.cmdbuf_offset = cmdBufOffset; 5918e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.cmdbuf_size = cmdBufSize; 5928e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.reloc_handle = relocBufHandle; 5938e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.reloc_offset = relocBufOffset; 5948e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.num_relocs = numRelocs; 5958e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.engine = engine; 5968e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.fence_flags = fence_flags; 5978e9a21e730449c10cac6e6f69d255611c93f63c2hding ca.fence_arg = (uint64_t)((unsigned long)fence_rep); 5988e9a21e730449c10cac6e6f69d255611c93f63c2hding //ca.damage = damage; 5998e9a21e730449c10cac6e6f69d255611c93f63c2hding 6008e9a21e730449c10cac6e6f69d255611c93f63c2hding 6018e9a21e730449c10cac6e6f69d255611c93f63c2hding do { 6028e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 6036050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan if (ret == -EAGAIN || ret == -EBUSY) { 6046050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan drv_debug_msg(VIDEO_DEBUG_ERROR, "drmCommandWrite returns with %s, retry\n", 6056050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan ret==-EAGAIN?"EAGAIN":"EBUSY"); 6066050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan retry++; 6076050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan } 6086050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan } while (ret == -EAGAIN || ret == -EBUSY); 6096050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan 6106050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan if (retry > 0) 6116050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan drv_debug_msg(VIDEO_DEBUG_ERROR,"drmCommandWrite tries %d time, finally %s with ret=%d\n", 6126050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan retry, ret==0?"okay":"failed!", ret); 6138e9a21e730449c10cac6e6f69d255611c93f63c2hding 6148e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) 6158e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 6168e9a21e730449c10cac6e6f69d255611c93f63c2hding 6178e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < buffer_count; i++) { 6188e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_validate_arg *arg = &(arg_list[i]); 6198e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_validate_rep *rep = &arg->d.rep; 6208e9a21e730449c10cac6e6f69d255611c93f63c2hding 6218e9a21e730449c10cac6e6f69d255611c93f63c2hding if (!arg->handled) { 6228e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = -EFAULT; 6238e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 6248e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6258e9a21e730449c10cac6e6f69d255611c93f63c2hding if (arg->ret != 0) { 6268e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = arg->ret; 6278e9a21e730449c10cac6e6f69d255611c93f63c2hding goto out; 6288e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6298e9a21e730449c10cac6e6f69d255611c93f63c2hding wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 6308e9a21e730449c10cac6e6f69d255611c93f63c2hding rep->gpu_offset, rep->placement, rep->fence_type_mask); 6318e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6328e9a21e730449c10cac6e6f69d255611c93f63c2hdingout: 6338e9a21e730449c10cac6e6f69d255611c93f63c2hding free(arg_list); 6348e9a21e730449c10cac6e6f69d255611c93f63c2hding for (i = 0; i < buffer_count; i++) { 6358e9a21e730449c10cac6e6f69d255611c93f63c2hding /* 6368e9a21e730449c10cac6e6f69d255611c93f63c2hding * Buffer no longer queued in userspace 6378e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 6388e9a21e730449c10cac6e6f69d255611c93f63c2hding switch (buffer_list[i]->status) { 6398e9a21e730449c10cac6e6f69d255611c93f63c2hding case psb_bs_queued: 6408e9a21e730449c10cac6e6f69d255611c93f63c2hding buffer_list[i]->status = psb_bs_ready; 6418e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6428e9a21e730449c10cac6e6f69d255611c93f63c2hding 6438e9a21e730449c10cac6e6f69d255611c93f63c2hding case psb_bs_abandoned: 6448e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_destroy(buffer_list[i]); 6458e9a21e730449c10cac6e6f69d255611c93f63c2hding free(buffer_list[i]); 6468e9a21e730449c10cac6e6f69d255611c93f63c2hding break; 6478e9a21e730449c10cac6e6f69d255611c93f63c2hding 6488e9a21e730449c10cac6e6f69d255611c93f63c2hding default: 6498e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Not supposed to happen */ 6508e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT(0); 6518e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6528e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6538e9a21e730449c10cac6e6f69d255611c93f63c2hding 6548e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 6558e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6568e9a21e730449c10cac6e6f69d255611c93f63c2hding 6578e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 6588e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic struct _WsbmFenceObject * 6598e9a21e730449c10cac6e6f69d255611c93f63c2hdinglnc_fence_wait(psb_driver_data_p driver_data, 6608e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_ttm_fence_rep *fence_rep, int *status) 6618e9a21e730449c10cac6e6f69d255611c93f63c2hding 6628e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6638e9a21e730449c10cac6e6f69d255611c93f63c2hding struct _WsbmFenceObject *fence = NULL; 6648e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret = -1; 6658e9a21e730449c10cac6e6f69d255611c93f63c2hding 6668e9a21e730449c10cac6e6f69d255611c93f63c2hding /* copy fence information */ 6678e9a21e730449c10cac6e6f69d255611c93f63c2hding if (fence_rep->error != 0) { 6688e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence" 6698e9a21e730449c10cac6e6f69d255611c93f63c2hding " and has idled the HW\n"); 6708e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE_RET; 6718e9a21e730449c10cac6e6f69d255611c93f63c2hding return NULL; 6728e9a21e730449c10cac6e6f69d255611c93f63c2hding } 6738e9a21e730449c10cac6e6f69d255611c93f63c2hding 6748e9a21e730449c10cac6e6f69d255611c93f63c2hding fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 6758e9a21e730449c10cac6e6f69d255611c93f63c2hding fence_rep->fence_type, 6768e9a21e730449c10cac6e6f69d255611c93f63c2hding (void *)fence_rep->handle, 6778e9a21e730449c10cac6e6f69d255611c93f63c2hding 0); 6788e9a21e730449c10cac6e6f69d255611c93f63c2hding if (fence) 6798e9a21e730449c10cac6e6f69d255611c93f63c2hding *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0); 6808e9a21e730449c10cac6e6f69d255611c93f63c2hding 6818e9a21e730449c10cac6e6f69d255611c93f63c2hding return fence; 6828e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6838e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 6848e9a21e730449c10cac6e6f69d255611c93f63c2hding 6858e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 6868e9a21e730449c10cac6e6f69d255611c93f63c2hding * Submits the current cmdbuf 6878e9a21e730449c10cac6e6f69d255611c93f63c2hding * 6888e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success 6898e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 690cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint tng_context_submit_cmdbuf(object_context_p __maybe_unused obj_context) 6918e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 6928e9a21e730449c10cac6e6f69d255611c93f63c2hding return 0; 6938e9a21e730449c10cac6e6f69d255611c93f63c2hding} 6948e9a21e730449c10cac6e6f69d255611c93f63c2hding 6958e9a21e730449c10cac6e6f69d255611c93f63c2hding 6968e9a21e730449c10cac6e6f69d255611c93f63c2hding 6978e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 6988e9a21e730449c10cac6e6f69d255611c93f63c2hding * FrameSkip is only meaningful for RC enabled mode 6998e9a21e730449c10cac6e6f69d255611c93f63c2hding * Topaz raises this flag after surface N encoding is finished (vaSyncSurface gets back) 7008e9a21e730449c10cac6e6f69d255611c93f63c2hding * then for the next encode surface N+1 (ctx->src_surface) frameskip flag is cleared in vaBeginPicuture 7018e9a21e730449c10cac6e6f69d255611c93f63c2hding * and is always set in vaEndPicture:lnc_PatchRCMode 7028e9a21e730449c10cac6e6f69d255611c93f63c2hding * vaQuerySurfaceStatus is supposed only to be called after vaEndPicture/vaSyncSurface, 7038e9a21e730449c10cac6e6f69d255611c93f63c2hding * The caller should ensure the surface pertains to an encode context 7048e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 705cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint tng_surface_get_frameskip(psb_driver_data_p __maybe_unused driver_data, 7068e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_surface_p surface, 7078e9a21e730449c10cac6e6f69d255611c93f63c2hding int *frame_skip) 7088e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 7098e9a21e730449c10cac6e6f69d255611c93f63c2hding /* bit31 indicate if frameskip is already settled, it is used to record the frame skip flag for old surfaces 7108e9a21e730449c10cac6e6f69d255611c93f63c2hding * bit31 is cleared when the surface is used as encode render target or reference/reconstrucure target 7118e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 7128e9a21e730449c10cac6e6f69d255611c93f63c2hding if (GET_SURFACE_INFO_skipped_flag(surface) & SURFACE_INFO_SKIP_FLAG_SETTLED) { 7138e9a21e730449c10cac6e6f69d255611c93f63c2hding *frame_skip = GET_SURFACE_INFO_skipped_flag(surface) & 1; 7148e9a21e730449c10cac6e6f69d255611c93f63c2hding } else 7158e9a21e730449c10cac6e6f69d255611c93f63c2hding *frame_skip = 0; 7168e9a21e730449c10cac6e6f69d255611c93f63c2hding 7178e9a21e730449c10cac6e6f69d255611c93f63c2hding return 0; 7188e9a21e730449c10cac6e6f69d255611c93f63c2hding} 7198e9a21e730449c10cac6e6f69d255611c93f63c2hding 720e79deb274ba55edd65e6c5d55f8e50954ff5b967edward linVAStatus tng_set_frame_skip_flag(object_context_p obj_context) 721e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin{ 722e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin VAStatus vaStatus = VA_STATUS_SUCCESS; 723e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin context_ENC_p ctx = (context_ENC_p) obj_context->format_data; 724e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin context_ENC_frame_buf *ps_buf = &(ctx->ctx_frame_buf); 725e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 726e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin if (ctx && ps_buf->previous_src_surface) { 727e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin SET_SURFACE_INFO_skipped_flag(ps_buf->previous_src_surface->psb_surface, 1); 728e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, "Detected a skipped frame for surface 0x%08x.\n", 729e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin ps_buf->previous_src_surface->psb_surface); 730e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } 731e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 732e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin return vaStatus; 733e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin} 734e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 7358e9a21e730449c10cac6e6f69d255611c93f63c2hding 7368e9a21e730449c10cac6e6f69d255611c93f63c2hding/* 7378e9a21e730449c10cac6e6f69d255611c93f63c2hding * Flushes all cmdbufs 7388e9a21e730449c10cac6e6f69d255611c93f63c2hding */ 739430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_flush_cmdbuf(object_context_p obj_context) 7408e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 741430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf; 7428e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_driver_data_p driver_data = obj_context->driver_data; 7438e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int fence_flags; 7448e9a21e730449c10cac6e6f69d255611c93f63c2hding struct psb_ttm_fence_rep fence_rep; 7458e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int reloc_offset; 7468e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int num_relocs; 7478e9a21e730449c10cac6e6f69d255611c93f63c2hding int ret; 7488e9a21e730449c10cac6e6f69d255611c93f63c2hding unsigned int cmdbuffer_size = (unsigned int) (((unsigned char *)(cmdbuf->cmd_idx)) - cmdbuf->cmd_start); /* In bytes */ 7498e9a21e730449c10cac6e6f69d255611c93f63c2hding 7508e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT(cmdbuffer_size < CMD_SIZE); 7518e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 7528e9a21e730449c10cac6e6f69d255611c93f63c2hding /* LOCK */ 7538e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = LOCK_HARDWARE(driver_data); 7548e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 7558e9a21e730449c10cac6e6f69d255611c93f63c2hding UNLOCK_HARDWARE(driver_data); 7568e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE_RET; 7578e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 7588e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7598e9a21e730449c10cac6e6f69d255611c93f63c2hding 7608e9a21e730449c10cac6e6f69d255611c93f63c2hding /* Now calculate the total number of relocations */ 7618e9a21e730449c10cac6e6f69d255611c93f63c2hding reloc_offset = cmdbuf->reloc_base - cmdbuf->cmd_base; 7628e9a21e730449c10cac6e6f69d255611c93f63c2hding num_relocs = (((unsigned char *) (cmdbuf->reloc_idx)) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 7638e9a21e730449c10cac6e6f69d255611c93f63c2hding 764430ce5c32361119ed81a62c918be6afbdd053eddhding tng_cmdbuf_unmap(cmdbuf); 7658e9a21e730449c10cac6e6f69d255611c93f63c2hding 7668e9a21e730449c10cac6e6f69d255611c93f63c2hding ASSERT(NULL == cmdbuf->reloc_base); 7678e9a21e730449c10cac6e6f69d255611c93f63c2hding 7688e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifdef DEBUG_TRACE 7698e9a21e730449c10cac6e6f69d255611c93f63c2hding fence_flags = 0; 7708e9a21e730449c10cac6e6f69d255611c93f63c2hding#else 7718e9a21e730449c10cac6e6f69d255611c93f63c2hding fence_flags = DRM_PSB_FENCE_NO_USER; 7728e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 7738e9a21e730449c10cac6e6f69d255611c93f63c2hding 7748e9a21e730449c10cac6e6f69d255611c93f63c2hding 7758e9a21e730449c10cac6e6f69d255611c93f63c2hding wsbmWriteLockKernelBO(); 7767bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#if 1 //_PO_DEBUG_ 7778e9a21e730449c10cac6e6f69d255611c93f63c2hding ret = ptgDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, /* FIXME Still use ioctl cmd? */ 7788e9a21e730449c10cac6e6f69d255611c93f63c2hding cmdbuf->buffer_refs, cmdbuf->buffer_refs_count, wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), 7798e9a21e730449c10cac6e6f69d255611c93f63c2hding 0, cmdbuffer_size,/*unsigned cmdBufSize*/ 7808e9a21e730449c10cac6e6f69d255611c93f63c2hding wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), reloc_offset, num_relocs, 781cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang 0, LNC_ENGINE_ENCODE, fence_flags, &fence_rep); /* FIXME use LNC_ENGINE_ENCODE */ 7827bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#endif 7838e9a21e730449c10cac6e6f69d255611c93f63c2hding wsbmWriteUnlockKernelBO(); 7848e9a21e730449c10cac6e6f69d255611c93f63c2hding 7858e9a21e730449c10cac6e6f69d255611c93f63c2hding UNLOCK_HARDWARE(driver_data); 7868e9a21e730449c10cac6e6f69d255611c93f63c2hding 7878e9a21e730449c10cac6e6f69d255611c93f63c2hding if (ret) { 788430ce5c32361119ed81a62c918be6afbdd053eddhding obj_context->tng_cmdbuf = NULL; 7898e9a21e730449c10cac6e6f69d255611c93f63c2hding 7908e9a21e730449c10cac6e6f69d255611c93f63c2hding DEBUG_FAILURE_RET; 7918e9a21e730449c10cac6e6f69d255611c93f63c2hding return ret; 7928e9a21e730449c10cac6e6f69d255611c93f63c2hding } 7938e9a21e730449c10cac6e6f69d255611c93f63c2hding 7948e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 /*DEBUG_TRACE*/ 7958e9a21e730449c10cac6e6f69d255611c93f63c2hding int status = -1; 7968e9a21e730449c10cac6e6f69d255611c93f63c2hding struct _WsbmFenceObject *fence = NULL; 7978e9a21e730449c10cac6e6f69d255611c93f63c2hding 7988e9a21e730449c10cac6e6f69d255611c93f63c2hding fence = lnc_fence_wait(driver_data, &fence_rep, &status); 7998e9a21e730449c10cac6e6f69d255611c93f63c2hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence); 8008e9a21e730449c10cac6e6f69d255611c93f63c2hding 8018e9a21e730449c10cac6e6f69d255611c93f63c2hding if (fence) 8028e9a21e730449c10cac6e6f69d255611c93f63c2hding wsbmFenceUnreference(fence); 8038e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif 8048e9a21e730449c10cac6e6f69d255611c93f63c2hding 805430ce5c32361119ed81a62c918be6afbdd053eddhding obj_context->tng_cmdbuf = NULL; 8068e9a21e730449c10cac6e6f69d255611c93f63c2hding 8078e9a21e730449c10cac6e6f69d255611c93f63c2hding return 0; 8088e9a21e730449c10cac6e6f69d255611c93f63c2hding} 8098e9a21e730449c10cac6e6f69d255611c93f63c2hding 8108e9a21e730449c10cac6e6f69d255611c93f63c2hding 811430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_set_phys(IMG_UINT32 *dest_buf, int dest_num, 8128e9a21e730449c10cac6e6f69d255611c93f63c2hding psb_buffer_p ref_buf, unsigned int ref_ofs, unsigned int ref_len) 8138e9a21e730449c10cac6e6f69d255611c93f63c2hding{ 8148e9a21e730449c10cac6e6f69d255611c93f63c2hding int i = 0; 8158e9a21e730449c10cac6e6f69d255611c93f63c2hding IMG_UINT32 addr_phys = (IMG_UINT32)wsbmBOOffsetHint(ref_buf->drm_buf) + ref_ofs; 816e26d82700f9514cc175d2b54733ebdeb8824922ehding 817e26d82700f9514cc175d2b54733ebdeb8824922ehding// drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: drm_buf 0x%08x, addr_phys 0x%08x, virt addr 0x%08x\n", __FUNCTION__, ref_buf->drm_buf, addr_phys, ref_buf->virtual_addr ); 818e26d82700f9514cc175d2b54733ebdeb8824922ehding 8198e9a21e730449c10cac6e6f69d255611c93f63c2hding do { 8208e9a21e730449c10cac6e6f69d255611c93f63c2hding dest_buf[i] = addr_phys; 8218e9a21e730449c10cac6e6f69d255611c93f63c2hding ++i; 8228e9a21e730449c10cac6e6f69d255611c93f63c2hding addr_phys += ref_len; 8238e9a21e730449c10cac6e6f69d255611c93f63c2hding } while(i < dest_num); 8248e9a21e730449c10cac6e6f69d255611c93f63c2hding return ; 8258e9a21e730449c10cac6e6f69d255611c93f63c2hding} 826ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 827ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 828ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingint tng_get_pipe_number(object_context_p obj_context) 829ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding{ 830ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 831ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding context_ENC_p ctx = (context_ENC_p)(obj_context->format_data); 832ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding return ctx->ui8PipesToUse; 833ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 834ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding} 835ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 836