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