tng_cmdbuf.c revision 082d96d0cb7fa139e386c5e01dc0871321adb0bf
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
132e26d82700f9514cc175d2b54733ebdeb8824922ehding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start\n", __FUNCTION__);
133e26d82700f9514cc175d2b54733ebdeb8824922ehding
1348e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->size = 0;
1358e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_base = NULL;
1368e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx = NULL;
1378e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_base = NULL;
1388e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_idx = NULL;
1398e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->buffer_refs_count = 0;
1408e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->buffer_refs_allocated = 10;
1418e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
1428e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (NULL == cmdbuf->buffer_refs) {
1438e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->buffer_refs_allocated = 0;
1448e9a21e730449c10cac6e6f69d255611c93f63c2hding        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1458e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
146e26d82700f9514cc175d2b54733ebdeb8824922ehding
1478e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (VA_STATUS_SUCCESS == vaStatus) {
1488e9a21e730449c10cac6e6f69d255611c93f63c2hding        vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_only, &cmdbuf->buf);
1498e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->size = size;
1508e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1518e9a21e730449c10cac6e6f69d255611c93f63c2hding
1528e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (VA_STATUS_SUCCESS != vaStatus) {
1537bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 0 \n", __FUNCTION__);
1547bb84b457d5658da0c850ed13dff3d212af70771Edward Lin	tng_cmdbuf_clear(cmdbuf, 1);
1558e9a21e730449c10cac6e6f69d255611c93f63c2hding        free(cmdbuf->buffer_refs);
1568e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->buffer_refs = NULL;
1578e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->buffer_refs_allocated = 0;
1588e9a21e730449c10cac6e6f69d255611c93f63c2hding        return vaStatus;
1598e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1608e9a21e730449c10cac6e6f69d255611c93f63c2hding
161430ce5c32361119ed81a62c918be6afbdd053eddhding    cmdbuf->mem_size = tng_align_KB(TNG_HEADER_SIZE);
162082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing    drv_debug_msg(VIDEO_DEBUG_GENERAL, "mem size %d\n", __FUNCTION__, cmdbuf->mem_size);
1638e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* create buffer information buffer */
1647bb84b457d5658da0c850ed13dff3d212af70771Edward Lin    //DEBUG-FIXME
1657bb84b457d5658da0c850ed13dff3d212af70771Edward Lin    //tng__alloc_init_buffer(driver_data, COMM_CMD_FRAME_BUF_NUM * cmdbuf->mem_size, psb_bt_cpu_vpu, &cmdbuf->frame_mem);
1668e9a21e730449c10cac6e6f69d255611c93f63c2hding
1677bb84b457d5658da0c850ed13dff3d212af70771Edward Lin    vaStatus = psb_buffer_create(driver_data, COMM_CMD_FRAME_BUF_NUM * cmdbuf->mem_size, psb_bt_cpu_vpu, &cmdbuf->frame_mem);
1687bb84b457d5658da0c850ed13dff3d212af70771Edward Lin    if (VA_STATUS_SUCCESS != vaStatus) {
1697bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create xx \n", __FUNCTION__);
1707bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        free(cmdbuf->buffer_refs);
1717bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        cmdbuf->buffer_refs = NULL;
1727bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        cmdbuf->buffer_refs_allocated = 0;
1737bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        return vaStatus;
1747bb84b457d5658da0c850ed13dff3d212af70771Edward Lin    }
1758e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* all cmdbuf share one MTX_CURRENT_IN_PARAMS since every MB has a MTX_CURRENT_IN_PARAMS structure
1768e9a21e730449c10cac6e6f69d255611c93f63c2hding     * and filling this structure for all MB is very time-consuming
1778e9a21e730449c10cac6e6f69d255611c93f63c2hding     */
1788e9a21e730449c10cac6e6f69d255611c93f63c2hding
1798e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* create JPEG quantization buffer */
1808e9a21e730449c10cac6e6f69d255611c93f63c2hding    vaStatus = psb_buffer_create(driver_data, ctx->jpeg_pic_params_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_pic_params);
1818e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (VA_STATUS_SUCCESS != vaStatus) {
1827bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 1 \n", __FUNCTION__);
183430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_clear(cmdbuf, 2);
1848e9a21e730449c10cac6e6f69d255611c93f63c2hding        return vaStatus;
1858e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1868e9a21e730449c10cac6e6f69d255611c93f63c2hding
1878e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* create JPEG MTX setup buffer */
1888e9a21e730449c10cac6e6f69d255611c93f63c2hding    vaStatus = psb_buffer_create(driver_data, ctx->jpeg_header_mem_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_header_mem);
1898e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (VA_STATUS_SUCCESS != vaStatus) {
1907bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 2 \n", __FUNCTION__);
191430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_clear(cmdbuf, 3);
1928e9a21e730449c10cac6e6f69d255611c93f63c2hding        return vaStatus;
1938e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
1948e9a21e730449c10cac6e6f69d255611c93f63c2hding
1958e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* create JPEG MTX setup interface buffer */
1968e9a21e730449c10cac6e6f69d255611c93f63c2hding    vaStatus = psb_buffer_create(driver_data, ctx->jpeg_header_interface_mem_size, psb_bt_cpu_vpu, &cmdbuf->jpeg_header_interface_mem);
1978e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (VA_STATUS_SUCCESS != vaStatus) {
1987bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        drv_debug_msg(VIDEO_DEBUG_ERROR, "psb buffer create 3 \n", __FUNCTION__);
199430ce5c32361119ed81a62c918be6afbdd053eddhding        tng_cmdbuf_clear(cmdbuf, 4);
2008e9a21e730449c10cac6e6f69d255611c93f63c2hding        return vaStatus;
2018e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
202e26d82700f9514cc175d2b54733ebdeb8824922ehding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: end\n", __FUNCTION__);
2038e9a21e730449c10cac6e6f69d255611c93f63c2hding    return vaStatus;
2048e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2058e9a21e730449c10cac6e6f69d255611c93f63c2hding
2068e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
2078e9a21e730449c10cac6e6f69d255611c93f63c2hding * Destroy buffer
2088e9a21e730449c10cac6e6f69d255611c93f63c2hding */
209430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_destroy(tng_cmdbuf_p cmdbuf)
2108e9a21e730449c10cac6e6f69d255611c93f63c2hding{
211e26d82700f9514cc175d2b54733ebdeb8824922ehding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start\n", __FUNCTION__);
212e26d82700f9514cc175d2b54733ebdeb8824922ehding
213e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_buffer_destroy(&cmdbuf->frame_mem);
214e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_buffer_destroy(&cmdbuf->jpeg_header_mem);
215e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_buffer_destroy(&cmdbuf->jpeg_pic_params);
216e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_buffer_destroy(&cmdbuf->jpeg_header_interface_mem);
217e26d82700f9514cc175d2b54733ebdeb8824922ehding
218e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmdbuf->size) {
219e26d82700f9514cc175d2b54733ebdeb8824922ehding        psb_buffer_destroy(&cmdbuf->buf);
220e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmdbuf->size = 0;
221e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
222e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmdbuf->buffer_refs_allocated) {
223e26d82700f9514cc175d2b54733ebdeb8824922ehding        free(cmdbuf->buffer_refs);
224e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmdbuf->buffer_refs = NULL;
225e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmdbuf->buffer_refs_allocated = 0;
226e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
227e26d82700f9514cc175d2b54733ebdeb8824922ehding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: end\n", __FUNCTION__);
2288e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2298e9a21e730449c10cac6e6f69d255611c93f63c2hding
2308e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
2318e9a21e730449c10cac6e6f69d255611c93f63c2hding * Reset buffer & map
2328e9a21e730449c10cac6e6f69d255611c93f63c2hding *
2338e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
2348e9a21e730449c10cac6e6f69d255611c93f63c2hding */
235430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_reset(tng_cmdbuf_p cmdbuf)
2368e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2378e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
2388e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_base = NULL;
2398e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx = NULL;
2408e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_base = NULL;
2418e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_idx = NULL;
2428e9a21e730449c10cac6e6f69d255611c93f63c2hding
2438e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->buffer_refs_count = 0;
2448e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->frame_mem_index = 0;
2458e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_count = 0;
246430ce5c32361119ed81a62c918be6afbdd053eddhding    cmdbuf->mem_size = tng_align_KB(TNG_HEADER_SIZE);
2478e9a21e730449c10cac6e6f69d255611c93f63c2hding
2488e9a21e730449c10cac6e6f69d255611c93f63c2hding    ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
2498e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret) {
2508e9a21e730449c10cac6e6f69d255611c93f63c2hding        return ret;
2518e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
2528e9a21e730449c10cac6e6f69d255611c93f63c2hding
2538e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_start = cmdbuf->cmd_base;
2548e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx = (IMG_UINT32 *) cmdbuf->cmd_base;
2558e9a21e730449c10cac6e6f69d255611c93f63c2hding
2568e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_base = cmdbuf->cmd_base + CMD_SIZE;
2578e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2588e9a21e730449c10cac6e6f69d255611c93f63c2hding
2598e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* Add ourselves to the buffer list */
260430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 0 */
2618e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ret;
2628e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2638e9a21e730449c10cac6e6f69d255611c93f63c2hding
2648e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
2658e9a21e730449c10cac6e6f69d255611c93f63c2hding * Unmap buffer
2668e9a21e730449c10cac6e6f69d255611c93f63c2hding *
2678e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
2688e9a21e730449c10cac6e6f69d255611c93f63c2hding */
269430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_unmap(tng_cmdbuf_p cmdbuf)
2708e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2718e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_base = NULL;
2728e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_start = NULL;
2738e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_idx = NULL;
2748e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_base = NULL;
2758e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_idx = NULL;
2768e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->cmd_count = 0;
2778e9a21e730449c10cac6e6f69d255611c93f63c2hding    psb_buffer_unmap(&cmdbuf->buf);
2788e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
2798e9a21e730449c10cac6e6f69d255611c93f63c2hding}
2808e9a21e730449c10cac6e6f69d255611c93f63c2hding
2818e9a21e730449c10cac6e6f69d255611c93f63c2hding
2828e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
2838e9a21e730449c10cac6e6f69d255611c93f63c2hding * Reference an addtional buffer "buf" in the command stream
2848e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns a reference index that can be used to refer to "buf" in
2858e9a21e730449c10cac6e6f69d255611c93f63c2hding * relocation records, -1 on error
2868e9a21e730449c10cac6e6f69d255611c93f63c2hding */
287430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_cmdbuf_buffer_ref(tng_cmdbuf_p cmdbuf, psb_buffer_p buf)
2888e9a21e730449c10cac6e6f69d255611c93f63c2hding{
2898e9a21e730449c10cac6e6f69d255611c93f63c2hding    int item_loc = 0;
2908e9a21e730449c10cac6e6f69d255611c93f63c2hding
2918e9a21e730449c10cac6e6f69d255611c93f63c2hding    /*Reserve the same TTM BO twice will cause kernel lock up*/
2928e9a21e730449c10cac6e6f69d255611c93f63c2hding    while ((item_loc < cmdbuf->buffer_refs_count)
2938e9a21e730449c10cac6e6f69d255611c93f63c2hding           && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
2948e9a21e730449c10cac6e6f69d255611c93f63c2hding               != wsbmKBufHandle(wsbmKBuf(buf->drm_buf))))
2958e9a21e730449c10cac6e6f69d255611c93f63c2hding        //while( (item_loc < cmdbuf->buffer_refs_count) && (cmdbuf->buffer_refs[item_loc] != buf) )
2968e9a21e730449c10cac6e6f69d255611c93f63c2hding    {
2978e9a21e730449c10cac6e6f69d255611c93f63c2hding        item_loc++;
2988e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
2998e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (item_loc == cmdbuf->buffer_refs_count) {
3008e9a21e730449c10cac6e6f69d255611c93f63c2hding        /* Add new entry */
3018e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (item_loc >= cmdbuf->buffer_refs_allocated) {
3028e9a21e730449c10cac6e6f69d255611c93f63c2hding            /* Allocate more entries */
3038e9a21e730449c10cac6e6f69d255611c93f63c2hding            int new_size = cmdbuf->buffer_refs_allocated + 10;
3048e9a21e730449c10cac6e6f69d255611c93f63c2hding            psb_buffer_p *new_array;
3058e9a21e730449c10cac6e6f69d255611c93f63c2hding            new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
3068e9a21e730449c10cac6e6f69d255611c93f63c2hding            if (NULL == new_array) {
3078e9a21e730449c10cac6e6f69d255611c93f63c2hding                return -1; /* Allocation failure */
3088e9a21e730449c10cac6e6f69d255611c93f63c2hding            }
3098e9a21e730449c10cac6e6f69d255611c93f63c2hding            memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
3108e9a21e730449c10cac6e6f69d255611c93f63c2hding            free(cmdbuf->buffer_refs);
3118e9a21e730449c10cac6e6f69d255611c93f63c2hding            cmdbuf->buffer_refs_allocated = new_size;
3128e9a21e730449c10cac6e6f69d255611c93f63c2hding            cmdbuf->buffer_refs = new_array;
3138e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
3148e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->buffer_refs[item_loc] = buf;
3158e9a21e730449c10cac6e6f69d255611c93f63c2hding        cmdbuf->buffer_refs_count++;
3168e9a21e730449c10cac6e6f69d255611c93f63c2hding        buf->status = psb_bs_queued;
3178e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
3188e9a21e730449c10cac6e6f69d255611c93f63c2hding    return item_loc;
3198e9a21e730449c10cac6e6f69d255611c93f63c2hding}
3208e9a21e730449c10cac6e6f69d255611c93f63c2hding
3218e9a21e730449c10cac6e6f69d255611c93f63c2hding/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3228e9a21e730449c10cac6e6f69d255611c93f63c2hding * "addr_in_cmdbuf"
3238e9a21e730449c10cac6e6f69d255611c93f63c2hding * The relocation is based on the device virtual address of "ref_buffer"
3248e9a21e730449c10cac6e6f69d255611c93f63c2hding * "buf_offset" is be added to the device virtual address, and the sum is then
3258e9a21e730449c10cac6e6f69d255611c93f63c2hding * right shifted with "align_shift".
3268e9a21e730449c10cac6e6f69d255611c93f63c2hding * "mask" determines which bits of the target DWORD will be updated with the so
3278e9a21e730449c10cac6e6f69d255611c93f63c2hding * constructed address. The remaining bits will be filled with bits from "background".
3288e9a21e730449c10cac6e6f69d255611c93f63c2hding */
329430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_add_relocation(tng_cmdbuf_p cmdbuf,
3308e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 *addr_in_dst_buffer,/*addr of dst_buffer for the DWORD*/
3318e9a21e730449c10cac6e6f69d255611c93f63c2hding                               psb_buffer_p ref_buffer,
3328e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 buf_offset,
3338e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 mask,
3348e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 background,
3358e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 align_shift,
3368e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 dst_buffer,
3378e9a21e730449c10cac6e6f69d255611c93f63c2hding                               IMG_UINT32 *start_of_dst_buffer) /*Index of the list refered by cmdbuf->buffer_refs */
3388e9a21e730449c10cac6e6f69d255611c93f63c2hding{
3398e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3408e9a21e730449c10cac6e6f69d255611c93f63c2hding    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3418e9a21e730449c10cac6e6f69d255611c93f63c2hding
3428e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->where = addr_in_dst_buffer - start_of_dst_buffer; /* Offset in DWORDs */
3438e9a21e730449c10cac6e6f69d255611c93f63c2hding
344430ce5c32361119ed81a62c918be6afbdd053eddhding    reloc->buffer = tng_cmdbuf_buffer_ref(cmdbuf, ref_buffer);
3458e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(reloc->buffer != -1);
3468e9a21e730449c10cac6e6f69d255611c93f63c2hding
3478e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
3488e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifndef VA_EMULATOR
3498e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (presumed_offset) {
3508e9a21e730449c10cac6e6f69d255611c93f63c2hding        IMG_UINT32 new_val =  presumed_offset + buf_offset;
3518e9a21e730449c10cac6e6f69d255611c93f63c2hding
3528e9a21e730449c10cac6e6f69d255611c93f63c2hding        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3538e9a21e730449c10cac6e6f69d255611c93f63c2hding        new_val = (background & ~mask) | (new_val & mask);
3548e9a21e730449c10cac6e6f69d255611c93f63c2hding        *addr_in_dst_buffer = new_val;
3558e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else {
3568e9a21e730449c10cac6e6f69d255611c93f63c2hding        *addr_in_dst_buffer = PSB_RELOC_MAGIC;
3578e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
3588e9a21e730449c10cac6e6f69d255611c93f63c2hding#else
3598e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* indicate subscript of relocation buffer */
3608e9a21e730449c10cac6e6f69d255611c93f63c2hding    *addr_in_dst_buffer = reloc - (struct drm_psb_reloc *)cmdbuf->reloc_base;
3618e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
3628e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->mask = mask;
3638e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3648e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->pre_add = buf_offset;
3658e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->background = background;
3668e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc->dst_buffer = dst_buffer;
3678e9a21e730449c10cac6e6f69d255611c93f63c2hding    cmdbuf->reloc_idx++;
3688e9a21e730449c10cac6e6f69d255611c93f63c2hding
3698e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(((void *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf));
3708e9a21e730449c10cac6e6f69d255611c93f63c2hding}
3718e9a21e730449c10cac6e6f69d255611c93f63c2hding
3728e9a21e730449c10cac6e6f69d255611c93f63c2hding/* Prepare one command package */
373381e313cd06b652a08bef36b3e9d44ae096e72b2pingshixvoid tng_cmdbuf_insert_command(
374e26d82700f9514cc175d2b54733ebdeb8824922ehding    object_context_p obj_context,
375e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 stream_id,
376e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 cmd_id,
377e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 cmd_data,
378e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_buffer_p data_addr,
379e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 offset)
380e26d82700f9514cc175d2b54733ebdeb8824922ehding{
381e26d82700f9514cc175d2b54733ebdeb8824922ehding    IMG_UINT32 cmd_word;
382e26d82700f9514cc175d2b54733ebdeb8824922ehding    context_ENC_p ctx = (context_ENC_p) obj_context->format_data;
383e26d82700f9514cc175d2b54733ebdeb8824922ehding    context_ENC_cmdbuf *ps_cmd = &(ctx->ctx_cmdbuf[stream_id]);
384e26d82700f9514cc175d2b54733ebdeb8824922ehding    tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf;
385e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_driver_data_p driver_data = ctx->obj_context->driver_data;
386e26d82700f9514cc175d2b54733ebdeb8824922ehding    int interrupt_flags;
387e26d82700f9514cc175d2b54733ebdeb8824922ehding
388e26d82700f9514cc175d2b54733ebdeb8824922ehding    //CMD composed by user space does not generate Interrupt
389e26d82700f9514cc175d2b54733ebdeb8824922ehding    interrupt_flags = 0;
390e26d82700f9514cc175d2b54733ebdeb8824922ehding
391e26d82700f9514cc175d2b54733ebdeb8824922ehding    assert(stream_id <= TOPAZHP_MAX_NUM_STREAMS);
392e26d82700f9514cc175d2b54733ebdeb8824922ehding
393e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* Write command to FIFO */
394e26d82700f9514cc175d2b54733ebdeb8824922ehding    {
395e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmd_word = F_ENCODE(stream_id, MTX_MSG_CORE) |
396e26d82700f9514cc175d2b54733ebdeb8824922ehding            F_ENCODE(cmd_id, MTX_MSG_CMD_ID);
397e26d82700f9514cc175d2b54733ebdeb8824922ehding
398e26d82700f9514cc175d2b54733ebdeb8824922ehding        if (cmd_id & MTX_CMDID_PRIORITY) {
399e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* increment the command counter */
400e26d82700f9514cc175d2b54733ebdeb8824922ehding            ps_cmd->ui32HighCmdCount++;
401e26d82700f9514cc175d2b54733ebdeb8824922ehding
402e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* Prepare high priority command */
403e26d82700f9514cc175d2b54733ebdeb8824922ehding            cmd_word |= F_ENCODE(1, MTX_MSG_PRIORITY) |
404e26d82700f9514cc175d2b54733ebdeb8824922ehding                F_ENCODE(((ps_cmd->ui32LowCmdCount - 1) & 0xff) |(ps_cmd->ui32HighCmdCount << 8), MTX_MSG_COUNT);
405e26d82700f9514cc175d2b54733ebdeb8824922ehding        } else {
406e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* Prepare low priority command */
407e26d82700f9514cc175d2b54733ebdeb8824922ehding            cmd_word |=
408e26d82700f9514cc175d2b54733ebdeb8824922ehding            F_ENCODE(ps_cmd->ui32LowCmdCount & 0xff, MTX_MSG_COUNT);
409e26d82700f9514cc175d2b54733ebdeb8824922ehding            ++(ps_cmd->ui32LowCmdCount);
410e26d82700f9514cc175d2b54733ebdeb8824922ehding        }
411e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
412e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_id = 0x%08x\n",
413e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, cmd_word);
414e26d82700f9514cc175d2b54733ebdeb8824922ehding        *cmdbuf->cmd_idx++ = cmd_word;
415e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
416e26d82700f9514cc175d2b54733ebdeb8824922ehding
417e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* write command word into cmdbuf */
418e26d82700f9514cc175d2b54733ebdeb8824922ehding    *cmdbuf->cmd_idx++ = cmd_data;
419e26d82700f9514cc175d2b54733ebdeb8824922ehding/* Command data address */
420e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (data_addr) {
421082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        if ((cmd_id >= MTX_CMDID_SETQUANT) && (cmd_id <= MTX_CMDID_SETUP)) {
422082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0);
423082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        }
424082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        else {
425381e313cd06b652a08bef36b3e9d44ae096e72b2pingshix#ifdef _TNG_RELOC_
426082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            TNG_RELOC_CMDBUF_START(cmdbuf->cmd_idx, offset, data_addr);
427e26d82700f9514cc175d2b54733ebdeb8824922ehding#else
428082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0);
429e26d82700f9514cc175d2b54733ebdeb8824922ehding#endif
430082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        }
431e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
432e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: data_addr = 0x%08x\n",
433e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx));
434e26d82700f9514cc175d2b54733ebdeb8824922ehding
435e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmdbuf->cmd_idx++;
436e26d82700f9514cc175d2b54733ebdeb8824922ehding    } else {
437e26d82700f9514cc175d2b54733ebdeb8824922ehding        *cmdbuf->cmd_idx++ = 0;
438e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
439e26d82700f9514cc175d2b54733ebdeb8824922ehding
440e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* Command data address */
441e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SETVIDEO) {
442e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf));
443e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
444e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
445e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
446e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
447e26d82700f9514cc175d2b54733ebdeb8824922ehding
448e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SETUP_INTERFACE) {
449e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf));
450e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
451e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
452e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
453e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
454e26d82700f9514cc175d2b54733ebdeb8824922ehding
455e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SHUTDOWN) {
456e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = ctx->eCodec;
457e26d82700f9514cc175d2b54733ebdeb8824922ehding
458e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
459e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
460e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
461e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
462e26d82700f9514cc175d2b54733ebdeb8824922ehding
463e26d82700f9514cc175d2b54733ebdeb8824922ehding    return ;
464e26d82700f9514cc175d2b54733ebdeb8824922ehding}
465e26d82700f9514cc175d2b54733ebdeb8824922ehding
466e26d82700f9514cc175d2b54733ebdeb8824922ehding
4678e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
4688e9a21e730449c10cac6e6f69d255611c93f63c2hding * Advances "obj_context" to the next cmdbuf
4698e9a21e730449c10cac6e6f69d255611c93f63c2hding *
4708e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
4718e9a21e730449c10cac6e6f69d255611c93f63c2hding */
472430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_get_next_cmdbuf(object_context_p obj_context)
4738e9a21e730449c10cac6e6f69d255611c93f63c2hding{
474430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf;
4758e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
476430ce5c32361119ed81a62c918be6afbdd053eddhding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: start obj_context->tng_cmdbuf = %x\n", __FUNCTION__, obj_context->tng_cmdbuf);
4778e9a21e730449c10cac6e6f69d255611c93f63c2hding
478430ce5c32361119ed81a62c918be6afbdd053eddhding    if (obj_context->tng_cmdbuf) {
4798e9a21e730449c10cac6e6f69d255611c93f63c2hding        return 0;
4808e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4818e9a21e730449c10cac6e6f69d255611c93f63c2hding
4828e9a21e730449c10cac6e6f69d255611c93f63c2hding    obj_context->cmdbuf_current++;
483430ce5c32361119ed81a62c918be6afbdd053eddhding    if (obj_context->cmdbuf_current >= TNG_MAX_CMDBUFS_ENCODE) {
4848e9a21e730449c10cac6e6f69d255611c93f63c2hding        obj_context->cmdbuf_current = 0;
4858e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4868e9a21e730449c10cac6e6f69d255611c93f63c2hding
487430ce5c32361119ed81a62c918be6afbdd053eddhding    cmdbuf = obj_context->tng_cmdbuf_list[obj_context->cmdbuf_current];
488430ce5c32361119ed81a62c918be6afbdd053eddhding    ret = tng_cmdbuf_reset(cmdbuf);
4898e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (!ret) {
4908e9a21e730449c10cac6e6f69d255611c93f63c2hding        /* Success */
491430ce5c32361119ed81a62c918be6afbdd053eddhding        obj_context->tng_cmdbuf = cmdbuf;
4928e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
4938e9a21e730449c10cac6e6f69d255611c93f63c2hding
494430ce5c32361119ed81a62c918be6afbdd053eddhding//    tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->pic_params);
495430ce5c32361119ed81a62c918be6afbdd053eddhding//    tng_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->slice_mem);
496430ce5c32361119ed81a62c918be6afbdd053eddhding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: end\n", __FUNCTION__);
4978e9a21e730449c10cac6e6f69d255611c93f63c2hding
4988e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ret;
4998e9a21e730449c10cac6e6f69d255611c93f63c2hding}
5008e9a21e730449c10cac6e6f69d255611c93f63c2hding
5018e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
5028e9a21e730449c10cac6e6f69d255611c93f63c2hding * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
5038e9a21e730449c10cac6e6f69d255611c93f63c2hding * It allows different buffers as command- and reloc buffer. A list of
5048e9a21e730449c10cac6e6f69d255611c93f63c2hding * cliprects to apply and whether to copy the clipRect content to all
5058e9a21e730449c10cac6e6f69d255611c93f63c2hding * scanout buffers (damage = 1).
5068e9a21e730449c10cac6e6f69d255611c93f63c2hding */
5078e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
5088e9a21e730449c10cac6e6f69d255611c93f63c2hding * Don't add debug statements in this function, it gets called with the
5098e9a21e730449c10cac6e6f69d255611c93f63c2hding * DRM lock held and output to an X terminal can cause X to deadlock
5108e9a21e730449c10cac6e6f69d255611c93f63c2hding */
5118e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic int
5128e9a21e730449c10cac6e6f69d255611c93f63c2hdingptgDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
5138e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned cmdBufOffset, unsigned cmdBufSize,
5148e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned relocBufHandle, unsigned relocBufOffset,
515cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang             unsigned numRelocs, int damage,
5168e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_rep)
5178e9a21e730449c10cac6e6f69d255611c93f63c2hding{
5188e9a21e730449c10cac6e6f69d255611c93f63c2hding    drm_psb_cmdbuf_arg_t ca;
5198e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct psb_validate_arg *arg_list;
5208e9a21e730449c10cac6e6f69d255611c93f63c2hding    int i;
5218e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
5228e9a21e730449c10cac6e6f69d255611c93f63c2hding    uint64_t mask = PSB_GPU_ACCESS_MASK;
5238e9a21e730449c10cac6e6f69d255611c93f63c2hding
5248e9a21e730449c10cac6e6f69d255611c93f63c2hding    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
5258e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (arg_list == NULL) {
5268e9a21e730449c10cac6e6f69d255611c93f63c2hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "Allocate memory failed\n");
5278e9a21e730449c10cac6e6f69d255611c93f63c2hding        return -ENOMEM;
5288e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5298e9a21e730449c10cac6e6f69d255611c93f63c2hding
5308e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5318e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_arg *arg = &(arg_list[i]);
5328e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_req *req = &arg->d.req;
5338e9a21e730449c10cac6e6f69d255611c93f63c2hding
5347bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        //memset(arg, 0, sizeof(*arg));
5358e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->next = (unsigned long) & (arg_list[i+1]);
5368e9a21e730449c10cac6e6f69d255611c93f63c2hding
5378e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
5388e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->group = 0;
5398e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
5408e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
5418e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 1
5428e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
5438e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_flags = PSB_USE_PRESUMED;
5448e9a21e730449c10cac6e6f69d255611c93f63c2hding#else
5458e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_flags = 0;
5468e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
5478e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->pad64 = (IMG_UINT32)buffer_list[i]->pl_flags;
5488e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5498e9a21e730449c10cac6e6f69d255611c93f63c2hding    arg_list[buffer_count-1].d.req.next = 0;
5508e9a21e730449c10cac6e6f69d255611c93f63c2hding
5518e9a21e730449c10cac6e6f69d255611c93f63c2hding    memset(&ca, 0, sizeof(ca));
5528e9a21e730449c10cac6e6f69d255611c93f63c2hding
5538e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
5548e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_handle = cmdBufHandle;
5558e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_offset = cmdBufOffset;
5568e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_size = cmdBufSize;
5578e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.reloc_handle = relocBufHandle;
5588e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.reloc_offset = relocBufOffset;
5598e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.num_relocs = numRelocs;
5608e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.engine = engine;
5618e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.fence_flags = fence_flags;
5628e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.fence_arg = (uint64_t)((unsigned long)fence_rep);
5638e9a21e730449c10cac6e6f69d255611c93f63c2hding    //ca.damage = damage;
5648e9a21e730449c10cac6e6f69d255611c93f63c2hding
5658e9a21e730449c10cac6e6f69d255611c93f63c2hding
5668e9a21e730449c10cac6e6f69d255611c93f63c2hding    do {
5678e9a21e730449c10cac6e6f69d255611c93f63c2hding        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
5688e9a21e730449c10cac6e6f69d255611c93f63c2hding    } while (ret == EAGAIN);
5698e9a21e730449c10cac6e6f69d255611c93f63c2hding
5708e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret)
5718e9a21e730449c10cac6e6f69d255611c93f63c2hding        goto out;
5728e9a21e730449c10cac6e6f69d255611c93f63c2hding
5738e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5748e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_arg *arg = &(arg_list[i]);
5758e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_rep *rep = &arg->d.rep;
5768e9a21e730449c10cac6e6f69d255611c93f63c2hding
5778e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (!arg->handled) {
5788e9a21e730449c10cac6e6f69d255611c93f63c2hding            ret = -EFAULT;
5798e9a21e730449c10cac6e6f69d255611c93f63c2hding            goto out;
5808e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
5818e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (arg->ret != 0) {
5828e9a21e730449c10cac6e6f69d255611c93f63c2hding            ret = arg->ret;
5838e9a21e730449c10cac6e6f69d255611c93f63c2hding            goto out;
5848e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
5858e9a21e730449c10cac6e6f69d255611c93f63c2hding        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5868e9a21e730449c10cac6e6f69d255611c93f63c2hding                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5878e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5888e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
5898e9a21e730449c10cac6e6f69d255611c93f63c2hding    free(arg_list);
5908e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5918e9a21e730449c10cac6e6f69d255611c93f63c2hding        /*
5928e9a21e730449c10cac6e6f69d255611c93f63c2hding         * Buffer no longer queued in userspace
5938e9a21e730449c10cac6e6f69d255611c93f63c2hding         */
5948e9a21e730449c10cac6e6f69d255611c93f63c2hding        switch (buffer_list[i]->status) {
5958e9a21e730449c10cac6e6f69d255611c93f63c2hding        case psb_bs_queued:
5968e9a21e730449c10cac6e6f69d255611c93f63c2hding            buffer_list[i]->status = psb_bs_ready;
5978e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
5988e9a21e730449c10cac6e6f69d255611c93f63c2hding
5998e9a21e730449c10cac6e6f69d255611c93f63c2hding        case psb_bs_abandoned:
6008e9a21e730449c10cac6e6f69d255611c93f63c2hding            psb_buffer_destroy(buffer_list[i]);
6018e9a21e730449c10cac6e6f69d255611c93f63c2hding            free(buffer_list[i]);
6028e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
6038e9a21e730449c10cac6e6f69d255611c93f63c2hding
6048e9a21e730449c10cac6e6f69d255611c93f63c2hding        default:
6058e9a21e730449c10cac6e6f69d255611c93f63c2hding            /* Not supposed to happen */
6068e9a21e730449c10cac6e6f69d255611c93f63c2hding            ASSERT(0);
6078e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
6088e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6098e9a21e730449c10cac6e6f69d255611c93f63c2hding
6108e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ret;
6118e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6128e9a21e730449c10cac6e6f69d255611c93f63c2hding
6138e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0
6148e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic struct _WsbmFenceObject *
6158e9a21e730449c10cac6e6f69d255611c93f63c2hdinglnc_fence_wait(psb_driver_data_p driver_data,
6168e9a21e730449c10cac6e6f69d255611c93f63c2hding               struct psb_ttm_fence_rep *fence_rep, int *status)
6178e9a21e730449c10cac6e6f69d255611c93f63c2hding
6188e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6198e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct _WsbmFenceObject *fence = NULL;
6208e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret = -1;
6218e9a21e730449c10cac6e6f69d255611c93f63c2hding
6228e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* copy fence information */
6238e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence_rep->error != 0) {
6248e9a21e730449c10cac6e6f69d255611c93f63c2hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence"
6258e9a21e730449c10cac6e6f69d255611c93f63c2hding                           " and has idled the HW\n");
6268e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
6278e9a21e730449c10cac6e6f69d255611c93f63c2hding        return NULL;
6288e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6298e9a21e730449c10cac6e6f69d255611c93f63c2hding
6308e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
6318e9a21e730449c10cac6e6f69d255611c93f63c2hding                            fence_rep->fence_type,
6328e9a21e730449c10cac6e6f69d255611c93f63c2hding                            (void *)fence_rep->handle,
6338e9a21e730449c10cac6e6f69d255611c93f63c2hding                            0);
6348e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence)
6358e9a21e730449c10cac6e6f69d255611c93f63c2hding        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
6368e9a21e730449c10cac6e6f69d255611c93f63c2hding
6378e9a21e730449c10cac6e6f69d255611c93f63c2hding    return fence;
6388e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6398e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
6408e9a21e730449c10cac6e6f69d255611c93f63c2hding
6418e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
6428e9a21e730449c10cac6e6f69d255611c93f63c2hding * Submits the current cmdbuf
6438e9a21e730449c10cac6e6f69d255611c93f63c2hding *
6448e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
6458e9a21e730449c10cac6e6f69d255611c93f63c2hding */
646430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_submit_cmdbuf(object_context_p obj_context)
6478e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6488e9a21e730449c10cac6e6f69d255611c93f63c2hding
6498e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
6508e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6518e9a21e730449c10cac6e6f69d255611c93f63c2hding
6528e9a21e730449c10cac6e6f69d255611c93f63c2hding
6538e9a21e730449c10cac6e6f69d255611c93f63c2hding
6548e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
6558e9a21e730449c10cac6e6f69d255611c93f63c2hding * FrameSkip is only meaningful for RC enabled mode
6568e9a21e730449c10cac6e6f69d255611c93f63c2hding * Topaz raises this flag after surface N encoding is finished (vaSyncSurface gets back)
6578e9a21e730449c10cac6e6f69d255611c93f63c2hding * then for the next encode surface N+1 (ctx->src_surface) frameskip flag is cleared in vaBeginPicuture
6588e9a21e730449c10cac6e6f69d255611c93f63c2hding * and is always set in vaEndPicture:lnc_PatchRCMode
6598e9a21e730449c10cac6e6f69d255611c93f63c2hding * vaQuerySurfaceStatus is supposed only to be called after vaEndPicture/vaSyncSurface,
6608e9a21e730449c10cac6e6f69d255611c93f63c2hding * The caller should ensure the surface pertains to an encode context
6618e9a21e730449c10cac6e6f69d255611c93f63c2hding */
662430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_surface_get_frameskip(psb_driver_data_p driver_data,
6638e9a21e730449c10cac6e6f69d255611c93f63c2hding                              psb_surface_p surface,
6648e9a21e730449c10cac6e6f69d255611c93f63c2hding                              int *frame_skip)
6658e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6668e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* bit31 indicate if frameskip is already settled, it is used to record the frame skip flag for old surfaces
6678e9a21e730449c10cac6e6f69d255611c93f63c2hding     * bit31 is cleared when the surface is used as encode render target or reference/reconstrucure target
6688e9a21e730449c10cac6e6f69d255611c93f63c2hding     */
6698e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (GET_SURFACE_INFO_skipped_flag(surface) & SURFACE_INFO_SKIP_FLAG_SETTLED) {
6708e9a21e730449c10cac6e6f69d255611c93f63c2hding        *frame_skip = GET_SURFACE_INFO_skipped_flag(surface) & 1;
6718e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else
6728e9a21e730449c10cac6e6f69d255611c93f63c2hding        *frame_skip = 0;
6738e9a21e730449c10cac6e6f69d255611c93f63c2hding
6748e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
6758e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6768e9a21e730449c10cac6e6f69d255611c93f63c2hding
677e79deb274ba55edd65e6c5d55f8e50954ff5b967edward linVAStatus tng_set_frame_skip_flag(object_context_p obj_context)
678e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin{
679e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    VAStatus vaStatus = VA_STATUS_SUCCESS;
680e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    context_ENC_p ctx = (context_ENC_p) obj_context->format_data;
681e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    context_ENC_frame_buf *ps_buf = &(ctx->ctx_frame_buf);
682e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
683e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    if (ctx && ps_buf->previous_src_surface) {
684e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        SET_SURFACE_INFO_skipped_flag(ps_buf->previous_src_surface->psb_surface, 1);
685e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Detected a skipped frame for surface 0x%08x.\n",
686e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            ps_buf->previous_src_surface->psb_surface);
687e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    }
688e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
689e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    return vaStatus;
690e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin}
691e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
6928e9a21e730449c10cac6e6f69d255611c93f63c2hding
6938e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
6948e9a21e730449c10cac6e6f69d255611c93f63c2hding * Flushes all cmdbufs
6958e9a21e730449c10cac6e6f69d255611c93f63c2hding */
696430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_flush_cmdbuf(object_context_p obj_context)
6978e9a21e730449c10cac6e6f69d255611c93f63c2hding{
698430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf;
6998e9a21e730449c10cac6e6f69d255611c93f63c2hding    psb_driver_data_p driver_data = obj_context->driver_data;
7008e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int fence_flags;
7018e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct psb_ttm_fence_rep fence_rep;
7028e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int reloc_offset;
7038e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int num_relocs;
7048e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
7058e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int cmdbuffer_size = (unsigned int) (((unsigned char *)(cmdbuf->cmd_idx)) - cmdbuf->cmd_start); /* In bytes */
7068e9a21e730449c10cac6e6f69d255611c93f63c2hding
7078e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(cmdbuffer_size < CMD_SIZE);
7088e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
7098e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* LOCK */
7108e9a21e730449c10cac6e6f69d255611c93f63c2hding    ret = LOCK_HARDWARE(driver_data);
7118e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret) {
7128e9a21e730449c10cac6e6f69d255611c93f63c2hding        UNLOCK_HARDWARE(driver_data);
7138e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
7148e9a21e730449c10cac6e6f69d255611c93f63c2hding        return ret;
7158e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
7168e9a21e730449c10cac6e6f69d255611c93f63c2hding
7178e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* Now calculate the total number of relocations */
7188e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc_offset = cmdbuf->reloc_base - cmdbuf->cmd_base;
7198e9a21e730449c10cac6e6f69d255611c93f63c2hding    num_relocs = (((unsigned char *) (cmdbuf->reloc_idx)) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
7208e9a21e730449c10cac6e6f69d255611c93f63c2hding
721430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_unmap(cmdbuf);
7228e9a21e730449c10cac6e6f69d255611c93f63c2hding
7238e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(NULL == cmdbuf->reloc_base);
7248e9a21e730449c10cac6e6f69d255611c93f63c2hding
7258e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifdef DEBUG_TRACE
7268e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence_flags = 0;
7278e9a21e730449c10cac6e6f69d255611c93f63c2hding#else
7288e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence_flags = DRM_PSB_FENCE_NO_USER;
7298e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
7308e9a21e730449c10cac6e6f69d255611c93f63c2hding
7318e9a21e730449c10cac6e6f69d255611c93f63c2hding
7328e9a21e730449c10cac6e6f69d255611c93f63c2hding    wsbmWriteLockKernelBO();
7337bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#if 1 //_PO_DEBUG_
7348e9a21e730449c10cac6e6f69d255611c93f63c2hding    ret = ptgDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, /* FIXME Still use ioctl cmd? */
7358e9a21e730449c10cac6e6f69d255611c93f63c2hding                       cmdbuf->buffer_refs, cmdbuf->buffer_refs_count, wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)),
7368e9a21e730449c10cac6e6f69d255611c93f63c2hding                       0, cmdbuffer_size,/*unsigned cmdBufSize*/
7378e9a21e730449c10cac6e6f69d255611c93f63c2hding                       wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), reloc_offset, num_relocs,
738cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang                       0, LNC_ENGINE_ENCODE, fence_flags, &fence_rep); /* FIXME use LNC_ENGINE_ENCODE */
7397bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#endif
7408e9a21e730449c10cac6e6f69d255611c93f63c2hding    wsbmWriteUnlockKernelBO();
7418e9a21e730449c10cac6e6f69d255611c93f63c2hding
7428e9a21e730449c10cac6e6f69d255611c93f63c2hding    UNLOCK_HARDWARE(driver_data);
7438e9a21e730449c10cac6e6f69d255611c93f63c2hding
7448e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret) {
745430ce5c32361119ed81a62c918be6afbdd053eddhding        obj_context->tng_cmdbuf = NULL;
7468e9a21e730449c10cac6e6f69d255611c93f63c2hding
7478e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
7488e9a21e730449c10cac6e6f69d255611c93f63c2hding        return ret;
7498e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
7508e9a21e730449c10cac6e6f69d255611c93f63c2hding
7518e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 /*DEBUG_TRACE*/
7528e9a21e730449c10cac6e6f69d255611c93f63c2hding    int status = -1;
7538e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct _WsbmFenceObject *fence = NULL;
7548e9a21e730449c10cac6e6f69d255611c93f63c2hding
7558e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence = lnc_fence_wait(driver_data, &fence_rep, &status);
7568e9a21e730449c10cac6e6f69d255611c93f63c2hding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
7578e9a21e730449c10cac6e6f69d255611c93f63c2hding
7588e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence)
7598e9a21e730449c10cac6e6f69d255611c93f63c2hding        wsbmFenceUnreference(fence);
7608e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
7618e9a21e730449c10cac6e6f69d255611c93f63c2hding
762430ce5c32361119ed81a62c918be6afbdd053eddhding    obj_context->tng_cmdbuf = NULL;
7638e9a21e730449c10cac6e6f69d255611c93f63c2hding
7648e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
7658e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7668e9a21e730449c10cac6e6f69d255611c93f63c2hding
7678e9a21e730449c10cac6e6f69d255611c93f63c2hding
768430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_set_phys(IMG_UINT32 *dest_buf, int dest_num,
7698e9a21e730449c10cac6e6f69d255611c93f63c2hding    psb_buffer_p ref_buf, unsigned int ref_ofs, unsigned int ref_len)
7708e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7718e9a21e730449c10cac6e6f69d255611c93f63c2hding    int i = 0;
7728e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 addr_phys = (IMG_UINT32)wsbmBOOffsetHint(ref_buf->drm_buf) + ref_ofs;
773e26d82700f9514cc175d2b54733ebdeb8824922ehding
774e26d82700f9514cc175d2b54733ebdeb8824922ehding//    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 );
775e26d82700f9514cc175d2b54733ebdeb8824922ehding
7768e9a21e730449c10cac6e6f69d255611c93f63c2hding    do {
7778e9a21e730449c10cac6e6f69d255611c93f63c2hding        dest_buf[i] =  addr_phys;
7788e9a21e730449c10cac6e6f69d255611c93f63c2hding        ++i;
7798e9a21e730449c10cac6e6f69d255611c93f63c2hding        addr_phys += ref_len;
7808e9a21e730449c10cac6e6f69d255611c93f63c2hding    } while(i < dest_num);
7818e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ;
7828e9a21e730449c10cac6e6f69d255611c93f63c2hding}
783ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
784ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
785ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingint tng_get_pipe_number(object_context_p obj_context)
786ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding{
787ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
788ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    context_ENC_p ctx = (context_ENC_p)(obj_context->format_data);
789ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    return ctx->ui8PipesToUse;
790ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
791ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding}
792ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
793