1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 4437b3eda28a4bf098efa80598cab67f190275266Fei 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 * Zeng Li <zeng.li@intel.com> 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_cmdbuf.h" 33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <unistd.h> 35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdio.h> 36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h> 37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <errno.h> 38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h> 39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h> 40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h" 42c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h" 44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_ws_driver.h" 45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Buffer layout: 48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * cmd_base <= cmd_idx < CMD_END() == reloc_base 49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * reloc_base <= reloc_idx < RELOC_END() == (reloc_size) 50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 51437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_END(cmdbuf) (cmdbuf->cmd_base + cmdbuf->size) 53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_END(cmdbuf) (cmdbuf->reloc_base) 55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_SIZE (0x3000) 57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_SIZE (0x3000) 59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_MARGIN (0x0800) 61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_MARGIN (0x0400) 63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define MAX_CMD_COUNT 12 66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define MTX_SEG_SIZE (0x0800) 68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Create command buffer 72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 73437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus pnw_cmdbuf_create( 74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_context_p obj_context, 75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_driver_data_p driver_data, 76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf) 77437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang context_ENC_p ctx = (context_ENC_p) obj_context->format_data; 79437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 80437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int size = CMD_SIZE + RELOC_SIZE; 81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 82437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->size = 0; 83437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 84437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_idx = NULL; 85437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_base = NULL; 86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_idx = NULL; 87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_count = 0; 88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_allocated = 10; 892befccec034c13d34746a9e87149889d59ac767bFei Jiang cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == cmdbuf->buffer_refs) { 91437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_allocated = 0; 92437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 93437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS == vaStatus) { 95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_only, &cmdbuf->buf); 96437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->size = size; 97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (VA_STATUS_SUCCESS != vaStatus) { 100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(cmdbuf->buffer_refs); 101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs = NULL; 102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_allocated = 0; 103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* create topaz parameter buffer */ 107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = psb_buffer_create(driver_data, ctx->pic_params_size * MAX_TOPAZ_CORES, psb_bt_cpu_vpu, &cmdbuf->pic_params); 108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 1094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo goto error_out5; 110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* create header buffer */ 112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = psb_buffer_create(driver_data, ctx->header_buffer_size, psb_bt_cpu_vpu, &cmdbuf->header_mem); 113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang goto error_out2; 115437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* create slice parameter buffer */ 117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = psb_buffer_create(driver_data, ctx->sliceparam_buffer_size, psb_bt_cpu_vpu, &cmdbuf->slice_params); 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VA_STATUS_SUCCESS != vaStatus) 119437b3eda28a4bf098efa80598cab67f190275266Fei Jiang goto error_out1; 120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* all cmdbuf share one MTX_CURRENT_IN_PARAMS since every MB has a MTX_CURRENT_IN_PARAMS structure 122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * and filling this structure for all MB is very time-consuming 123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->topaz_in_params_I = &ctx->topaz_in_params_I; 126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->topaz_in_params_P = &ctx->topaz_in_params_P; 127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->topaz_below_params = &ctx->topaz_below_params; 129643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang cmdbuf->topaz_above_params = &ctx->topaz_above_params; 130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out1: 134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_destroy(&cmdbuf->header_mem); 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out2: 136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_destroy(&cmdbuf->pic_params); 137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out5: 138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_destroy(cmdbuf); 139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Destroy buffer 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_destroy(pnw_cmdbuf_p cmdbuf) 147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->size) { 149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->buf); 150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->size = 0; 151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (cmdbuf->buffer_refs_allocated) { 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun free(cmdbuf->buffer_refs); 154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs = NULL; 155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_allocated = 0; 156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->pic_params); 159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->header_mem); 160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_destroy(&cmdbuf->slice_params); 161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Reset buffer & map 166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_reset(pnw_cmdbuf_p cmdbuf) 170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_idx = NULL; 175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_base = NULL; 176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_idx = NULL; 177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_count = 0; 179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_count = 0; 180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base); 182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_start = cmdbuf->cmd_base; 187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base; 188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 189437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_base = cmdbuf->cmd_base + CMD_SIZE; 190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base; 191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Add ourselves to the buffer list */ 193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 0 */ 194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Unmap buffer 199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_unmap(pnw_cmdbuf_p cmdbuf) 203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_base = NULL; 205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_start = NULL; 206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_idx = NULL; 207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_base = NULL; 208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_idx = NULL; 209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_count = 0; 210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(&cmdbuf->buf); 211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Reference an addtional buffer "buf" in the command stream 217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns a reference index that can be used to refer to "buf" in 218437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * relocation records, -1 on error 219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_buffer_ref(pnw_cmdbuf_p cmdbuf, psb_buffer_p buf) 221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int item_loc = 0; 223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /*Reserve the same TTM BO twice will cause kernel lock up*/ 225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun while ((item_loc < cmdbuf->buffer_refs_count) 226bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf)) 227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) 228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun //while( (item_loc < cmdbuf->buffer_refs_count) && (cmdbuf->buffer_refs[item_loc] != buf) ) 229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang { 230437b3eda28a4bf098efa80598cab67f190275266Fei Jiang item_loc++; 231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc == cmdbuf->buffer_refs_count) { 233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Add new entry */ 234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (item_loc >= cmdbuf->buffer_refs_allocated) { 235437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Allocate more entries */ 236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int new_size = cmdbuf->buffer_refs_allocated + 10; 237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_p *new_array; 2382befccec034c13d34746a9e87149889d59ac767bFei Jiang new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size); 239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == new_array) { 240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return -1; /* Allocation failure */ 241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 242437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated); 243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(cmdbuf->buffer_refs); 244437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_allocated = new_size; 245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs = new_array; 246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs[item_loc] = buf; 248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->buffer_refs_count++; 249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang buf->status = psb_bs_queued; 250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return item_loc; 252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address 255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "addr_in_cmdbuf" 256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * The relocation is based on the device virtual address of "ref_buffer" 257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "buf_offset" is be added to the device virtual address, and the sum is then 258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * right shifted with "align_shift". 259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "mask" determines which bits of the target DWORD will be updated with the so 260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * constructed address. The remaining bits will be filled with bits from "background". 261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_add_relocation(pnw_cmdbuf_p cmdbuf, 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *addr_in_dst_buffer,/*addr of dst_buffer for the DWORD*/ 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p ref_buffer, 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t buf_offset, 266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t mask, 267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t background, 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t align_shift, 269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t dst_buffer, 270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t *start_of_dst_buffer) /*Index of the list refered by cmdbuf->buffer_refs */ 271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct drm_psb_reloc *reloc = cmdbuf->reloc_idx; 273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf); 274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->where = addr_in_dst_buffer - start_of_dst_buffer; /* Offset in DWORDs */ 276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun reloc->buffer = pnw_cmdbuf_buffer_ref(cmdbuf, ref_buffer); 278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(reloc->buffer != -1); 279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->reloc_op = PSB_RELOC_OP_OFFSET; 281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#ifndef VA_EMULATOR 282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (presumed_offset) { 283437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t new_val = presumed_offset + buf_offset; 284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT)); 286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang new_val = (background & ~mask) | (new_val & mask); 287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *addr_in_dst_buffer = new_val; 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *addr_in_dst_buffer = PSB_RELOC_MAGIC; 290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else 292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* indicate subscript of relocation buffer */ 293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *addr_in_dst_buffer = reloc - (struct drm_psb_reloc *)cmdbuf->reloc_base; 294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif 295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->mask = mask; 296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT; 297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->pre_add = buf_offset; 298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->background = background; 299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc->dst_buffer = dst_buffer; 300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->reloc_idx++; 301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 302e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf)); 303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Prepare one command package */ 306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_insert_command_package(object_context_p obj_context, 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int32_t core, 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t cmd_id, 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p command_data, 310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun uint32_t offset) 311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint32_t cmd_word; 313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang context_ENC_p ctx = (context_ENC_p) obj_context->format_data; 314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = obj_context->pnw_cmdbuf; 315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int interrupt_flags; 316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* only MTX_CMDID_END_PIC by master core generate interrupt */ 318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang interrupt_flags = (cmd_id == MTX_CMDID_END_PIC) | (core == 0); 319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang interrupt_flags = 0; /*CMD composed by user space does not generate Interrupt*/ 320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Calculate command word */ 322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmd_id &= MTX_CMDWORD_ID_MASK; 323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang core &= MTX_CMDWORD_CORE_MASK; 324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang core %= MAX_TOPAZ_CORES; 326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmd_word = ((ctx->CmdCount & MTX_CMDWORD_COUNT_MASK) << MTX_CMDWORD_COUNT_SHIFT) 328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun | ((0 & MTX_CMDWORD_INT_MASK) << MTX_CMDWORD_INT_SHIFT) /* Do not generate interrupt */ 329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun | (core << MTX_CMDWORD_CORE_SHIFT) 330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun | (cmd_id << MTX_CMDWORD_ID_SHIFT); 331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* write command word into cmdbuf */ 333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *cmdbuf->cmd_idx++ = cmd_word; 334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Command data address */ 336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (command_data) { 337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang RELOC_CMDBUF_PNW(cmdbuf->cmd_idx, offset, command_data); 338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf->cmd_idx++; 339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *cmdbuf->cmd_idx++ = 0; 341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 343437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 344437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *cmdbuf->cmd_idx++ = 0; /* Write back buffer address */ 345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *cmdbuf->cmd_idx++ = 0; /*ctx->CmdCount; */ /* Write back value */ 347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 348437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->LastSync[(ctx->FrmIdx) & 0x1][core] = ctx->CmdCount; 349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* increment the command counter */ 351437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ctx->CmdCount = (ctx->CmdCount + 1) % MAX_TOPAZ_CMD_COUNT; 352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 354437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Advances "obj_context" to the next cmdbuf 356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_context_get_next_cmdbuf(object_context_p obj_context) 360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf; 362437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->pnw_cmdbuf) { 365437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 366437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 367437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_context->cmdbuf_current++; 369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (obj_context->cmdbuf_current >= PNW_MAX_CMDBUFS_ENCODE) { 370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_context->cmdbuf_current = 0; 371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang cmdbuf = obj_context->pnw_cmdbuf_list[obj_context->cmdbuf_current]; 374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = pnw_cmdbuf_reset(cmdbuf); 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (!ret) { 376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Success */ 377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_context->pnw_cmdbuf = cmdbuf; 378437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* added pic_params/slice_params into ref, so the index is 1/2 */ 381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->pic_params); 382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->slice_params); 383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl. 389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * It allows different buffers as command- and reloc buffer. A list of 390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * cliprects to apply and whether to copy the clipRect content to all 391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * scanout buffers (damage = 1). 392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Don't add debug statements in this function, it gets called with the 395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * DRM lock held and output to an X terminal can cause X to deadlock 396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 397437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int 398437b3eda28a4bf098efa80598cab67f190275266Fei JiangpnwDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle, 399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned cmdBufOffset, unsigned cmdBufSize, 400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned relocBufHandle, unsigned relocBufOffset, 401cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan unsigned numRelocs, int __maybe_unused damage, 402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_rep) 403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang drm_psb_cmdbuf_arg_t ca; 405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_validate_arg *arg_list; 406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int i; 407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang uint64_t mask = PSB_GPU_ACCESS_MASK; 409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count); 411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (arg_list == NULL) { 412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Allocate memory failed\n"); 413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return -ENOMEM; 414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 415437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_validate_arg *arg = &(arg_list[i]); 418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_validate_req *req = &arg->d.req; 419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->next = (unsigned long) & (arg_list[i+1]); 421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 422437b3eda28a4bf098efa80598cab67f190275266Fei Jiang req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf)); 42358c96451d7ea53930d4eb94b6573571a51170de4Fei Jiang //req->group = 0; 424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask; 425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask; 426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1 427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf); 428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang req->presumed_flags = PSB_USE_PRESUMED; 429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else 430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->presumed_flags = 0; 431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun req->pad64 = (uint32_t)buffer_list[i]->pl_flags; 433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang arg_list[buffer_count-1].d.req.next = 0; 435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.buffer_list = (uint64_t)((unsigned long)arg_list); 437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.cmdbuf_handle = cmdBufHandle; 438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.cmdbuf_offset = cmdBufOffset; 439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.cmdbuf_size = cmdBufSize; 440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.reloc_handle = relocBufHandle; 441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.reloc_offset = relocBufOffset; 442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.num_relocs = numRelocs; 443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.engine = engine; 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ca.fence_flags = fence_flags; 445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ca.fence_arg = (uint64_t)((unsigned long)fence_rep); 446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang do { 448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca)); 449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } while (ret == EAGAIN); 450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (ret) 452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang goto out; 453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_validate_arg *arg = &(arg_list[i]); 456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_validate_rep *rep = &arg->d.rep; 457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (!arg->handled) { 459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ret = -EFAULT; 460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang goto out; 461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (arg->ret != 0) { 463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ret = arg->ret; 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang goto out; 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf), 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang rep->gpu_offset, rep->placement, rep->fence_type_mask); 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout: 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(arg_list); 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < buffer_count; i++) { 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Buffer no longer queued in userspace 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (buffer_list[i]->status) { 476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case psb_bs_queued: 477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang buffer_list[i]->status = psb_bs_ready; 478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case psb_bs_abandoned: 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_destroy(buffer_list[i]); 482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang free(buffer_list[i]); 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Not supposed to happen */ 487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(0); 488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic struct _WsbmFenceObject * 496bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wanglnc_fence_wait(psb_driver_data_p driver_data, 497bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang struct psb_ttm_fence_rep *fence_rep, int *status) 498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct _WsbmFenceObject *fence = NULL; 501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret = -1; 502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* copy fence information */ 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fence_rep->error != 0) { 505f31d5416a60f83e184b0906a7ec77ba021840531hding drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence" 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang " and has idled the HW\n"); 507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE_RET; 508437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return NULL; 509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class, 512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang fence_rep->fence_type, 513e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang (unsigned char *)fence_rep->handle, 514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 0); 515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (fence) 516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0); 517dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return fence; 519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 522437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 523437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Submits the current cmdbuf 524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 525437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 526437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 527cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint pnw_context_submit_cmdbuf(object_context_p __maybe_unused obj_context) 528437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 529437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 5322befccec034c13d34746a9e87149889d59ac767bFei Jiang 5332befccec034c13d34746a9e87149889d59ac767bFei Jiang 534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 535437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * FrameSkip is only meaningful for RC enabled mode 536437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Topaz raises this flag after surface N encoding is finished (vaSyncSurface gets back) 537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * then for the next encode surface N+1 (ctx->src_surface) frameskip flag is cleared in vaBeginPicuture 538437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * and is always set in vaEndPicture:lnc_PatchRCMode 539437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * vaQuerySurfaceStatus is supposed only to be called after vaEndPicture/vaSyncSurface, 540437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * The caller should ensure the surface pertains to an encode context 541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 542cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint pnw_surface_get_frameskip(psb_driver_data_p __maybe_unused driver_data, 543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_surface_p surface, 544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int *frame_skip) 545437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 546437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* bit31 indicate if frameskip is already settled, it is used to record the frame skip flag for old surfaces 547437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * bit31 is cleared when the surface is used as encode render target or reference/reconstrucure target 548437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 549437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (GET_SURFACE_INFO_skipped_flag(surface) & SURFACE_INFO_SKIP_FLAG_SETTLED) { 550437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *frame_skip = GET_SURFACE_INFO_skipped_flag(surface) & 1; 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *frame_skip = 0; 553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 5542befccec034c13d34746a9e87149889d59ac767bFei Jiang return 0; 555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Flushes all cmdbufs 560437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_context_flush_cmdbuf(object_context_p obj_context) 562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 563437b3eda28a4bf098efa80598cab67f190275266Fei Jiang pnw_cmdbuf_p cmdbuf = obj_context->pnw_cmdbuf; 564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_driver_data_p driver_data = obj_context->driver_data; 565437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int fence_flags; 566437b3eda28a4bf098efa80598cab67f190275266Fei Jiang struct psb_ttm_fence_rep fence_rep; 567437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int reloc_offset; 568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang unsigned int num_relocs; 569437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int ret; 570e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned int cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; /* In bytes */ 571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 572437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ASSERT(cmdbuffer_size < CMD_SIZE); 573e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf)); 574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* LOCK */ 575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ret = LOCK_HARDWARE(driver_data); 576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang UNLOCK_HARDWARE(driver_data); 578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE_RET; 579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* Now calculate the total number of relocations */ 583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang reloc_offset = cmdbuf->reloc_base - cmdbuf->cmd_base; 584e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc); 585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_cmdbuf_unmap(cmdbuf); 587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(NULL == cmdbuf->reloc_base); 589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 590c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) 591c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = 0; 592c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang else 593c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang fence_flags = DRM_PSB_FENCE_NO_USER; 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#ifndef LNC_ENGINE_ENCODE 596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define LNC_ENGINE_ENCODE 5 597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang wsbmWriteLockKernelBO(); 600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang ret = pnwDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, /* FIXME Still use ioctl cmd? */ 601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun cmdbuf->buffer_refs, cmdbuf->buffer_refs_count, wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), 602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 0, cmdbuffer_size,/*unsigned cmdBufSize*/ 603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), reloc_offset, num_relocs, 604cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang 0, LNC_ENGINE_ENCODE, fence_flags, &fence_rep); /* FIXME use LNC_ENGINE_ENCODE */ 605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmWriteUnlockKernelBO(); 607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang UNLOCK_HARDWARE(driver_data); 608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_context->pnw_cmdbuf = NULL; 611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE_RET; 613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return ret; 614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 616c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0 617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang int status = -1; 618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun struct _WsbmFenceObject *fence = NULL; 619437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 620437b3eda28a4bf098efa80598cab67f190275266Fei Jiang fence = lnc_fence_wait(driver_data, &fence_rep, &status); 621c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence); 622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 623437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (fence) 624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmFenceUnreference(fence); 625437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif 626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 627437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_context->pnw_cmdbuf = NULL; 628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 629437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 630437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 631437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6322befccec034c13d34746a9e87149889d59ac767bFei Jiang 6332befccec034c13d34746a9e87149889d59ac767bFei Jiangint pnw_get_parallel_core_number(object_context_p obj_context) 6342befccec034c13d34746a9e87149889d59ac767bFei Jiang{ 6352befccec034c13d34746a9e87149889d59ac767bFei Jiang 636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun context_ENC_p ctx = (context_ENC_p)(obj_context->format_data); 637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return ctx->ParallelCores; 6382befccec034c13d34746a9e87149889d59ac767bFei Jiang 6392befccec034c13d34746a9e87149889d59ac767bFei Jiang} 640