tng_cmdbuf.c revision 6050921724f3c8543f04ad8a4a3d13e5620f8e4b
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]);
380e26d82700f9514cc175d2b54733ebdeb8824922ehding    tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf;
381e26d82700f9514cc175d2b54733ebdeb8824922ehding    psb_driver_data_p driver_data = ctx->obj_context->driver_data;
382e26d82700f9514cc175d2b54733ebdeb8824922ehding    int interrupt_flags;
383e26d82700f9514cc175d2b54733ebdeb8824922ehding
384e26d82700f9514cc175d2b54733ebdeb8824922ehding    //CMD composed by user space does not generate Interrupt
385e26d82700f9514cc175d2b54733ebdeb8824922ehding    interrupt_flags = 0;
386e26d82700f9514cc175d2b54733ebdeb8824922ehding
387e26d82700f9514cc175d2b54733ebdeb8824922ehding    assert(stream_id <= TOPAZHP_MAX_NUM_STREAMS);
388e26d82700f9514cc175d2b54733ebdeb8824922ehding
389e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* Write command to FIFO */
390e26d82700f9514cc175d2b54733ebdeb8824922ehding    {
391e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmd_word = F_ENCODE(stream_id, MTX_MSG_CORE) |
392e26d82700f9514cc175d2b54733ebdeb8824922ehding            F_ENCODE(cmd_id, MTX_MSG_CMD_ID);
393e26d82700f9514cc175d2b54733ebdeb8824922ehding
394e26d82700f9514cc175d2b54733ebdeb8824922ehding        if (cmd_id & MTX_CMDID_PRIORITY) {
395e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* increment the command counter */
396e26d82700f9514cc175d2b54733ebdeb8824922ehding            ps_cmd->ui32HighCmdCount++;
397e26d82700f9514cc175d2b54733ebdeb8824922ehding
398e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* Prepare high priority command */
399e26d82700f9514cc175d2b54733ebdeb8824922ehding            cmd_word |= F_ENCODE(1, MTX_MSG_PRIORITY) |
400e26d82700f9514cc175d2b54733ebdeb8824922ehding                F_ENCODE(((ps_cmd->ui32LowCmdCount - 1) & 0xff) |(ps_cmd->ui32HighCmdCount << 8), MTX_MSG_COUNT);
401e26d82700f9514cc175d2b54733ebdeb8824922ehding        } else {
402e26d82700f9514cc175d2b54733ebdeb8824922ehding            /* Prepare low priority command */
403e26d82700f9514cc175d2b54733ebdeb8824922ehding            cmd_word |=
404e26d82700f9514cc175d2b54733ebdeb8824922ehding            F_ENCODE(ps_cmd->ui32LowCmdCount & 0xff, MTX_MSG_COUNT);
405e26d82700f9514cc175d2b54733ebdeb8824922ehding            ++(ps_cmd->ui32LowCmdCount);
406e26d82700f9514cc175d2b54733ebdeb8824922ehding        }
407e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
408e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_id = 0x%08x\n",
409e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, cmd_word);
410e26d82700f9514cc175d2b54733ebdeb8824922ehding        *cmdbuf->cmd_idx++ = cmd_word;
411e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
412e26d82700f9514cc175d2b54733ebdeb8824922ehding
413e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* write command word into cmdbuf */
414e26d82700f9514cc175d2b54733ebdeb8824922ehding    *cmdbuf->cmd_idx++ = cmd_data;
415e26d82700f9514cc175d2b54733ebdeb8824922ehding/* Command data address */
416e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (data_addr) {
417082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        if ((cmd_id >= MTX_CMDID_SETQUANT) && (cmd_id <= MTX_CMDID_SETUP)) {
418082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0);
419082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        }
420082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        else {
421381e313cd06b652a08bef36b3e9d44ae096e72b2pingshix#ifdef _TNG_RELOC_
422082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            TNG_RELOC_CMDBUF_START(cmdbuf->cmd_idx, offset, data_addr);
423e26d82700f9514cc175d2b54733ebdeb8824922ehding#else
424082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing            tng_cmdbuf_set_phys(cmdbuf->cmd_idx, 0, data_addr, offset, 0);
425e26d82700f9514cc175d2b54733ebdeb8824922ehding#endif
426082d96d0cb7fa139e386c5e01dc0871321adb0bfSUN,Jing        }
427e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
428e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: data_addr = 0x%08x\n",
429e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx));
430e26d82700f9514cc175d2b54733ebdeb8824922ehding
431e26d82700f9514cc175d2b54733ebdeb8824922ehding        cmdbuf->cmd_idx++;
432e26d82700f9514cc175d2b54733ebdeb8824922ehding    } else {
433e26d82700f9514cc175d2b54733ebdeb8824922ehding        *cmdbuf->cmd_idx++ = 0;
434e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
435e26d82700f9514cc175d2b54733ebdeb8824922ehding
436e26d82700f9514cc175d2b54733ebdeb8824922ehding    /* Command data address */
437e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SETVIDEO) {
438e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf));
439e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
440e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
441e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
4424a9f370494d95905305e89135da22858a7e45435Ren Zhaohan
4434a9f370494d95905305e89135da22858a7e45435Ren Zhaohan	if (data_addr)
444e14f466f0976595332583a86773f8ab53e4e479cRen Zhaohan	    *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(data_addr->drm_buf));
445e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
446e26d82700f9514cc175d2b54733ebdeb8824922ehding
447e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SETUP_INTERFACE) {
448e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = wsbmKBufHandle(wsbmKBuf(ctx->bufs_writeback.drm_buf));
449e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
450e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
451e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
452e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
453e26d82700f9514cc175d2b54733ebdeb8824922ehding
454e26d82700f9514cc175d2b54733ebdeb8824922ehding    if (cmd_id == MTX_CMDID_SHUTDOWN) {
455e26d82700f9514cc175d2b54733ebdeb8824922ehding        *(cmdbuf->cmd_idx)++ = ctx->eCodec;
456e26d82700f9514cc175d2b54733ebdeb8824922ehding
457e26d82700f9514cc175d2b54733ebdeb8824922ehding        drv_debug_msg(VIDEO_DEBUG_GENERAL,
458e26d82700f9514cc175d2b54733ebdeb8824922ehding            "%s: cmd_param = 0x%08x\n",
459e26d82700f9514cc175d2b54733ebdeb8824922ehding            __FUNCTION__, *(cmdbuf->cmd_idx - 1));
460e26d82700f9514cc175d2b54733ebdeb8824922ehding    }
461e26d82700f9514cc175d2b54733ebdeb8824922ehding
462e26d82700f9514cc175d2b54733ebdeb8824922ehding    return ;
463e26d82700f9514cc175d2b54733ebdeb8824922ehding}
464e26d82700f9514cc175d2b54733ebdeb8824922ehding
465e26d82700f9514cc175d2b54733ebdeb8824922ehding
4668e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
4678e9a21e730449c10cac6e6f69d255611c93f63c2hding * Advances "obj_context" to the next cmdbuf
4688e9a21e730449c10cac6e6f69d255611c93f63c2hding *
4698e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
4708e9a21e730449c10cac6e6f69d255611c93f63c2hding */
471430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_get_next_cmdbuf(object_context_p obj_context)
4728e9a21e730449c10cac6e6f69d255611c93f63c2hding{
473430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf;
4748e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
475dd0a0b792078d587a2e266f146ccd287c39a742dedward lin
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);
4968e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ret;
4978e9a21e730449c10cac6e6f69d255611c93f63c2hding}
4988e9a21e730449c10cac6e6f69d255611c93f63c2hding
4998e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
5008e9a21e730449c10cac6e6f69d255611c93f63c2hding * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
5018e9a21e730449c10cac6e6f69d255611c93f63c2hding * It allows different buffers as command- and reloc buffer. A list of
5028e9a21e730449c10cac6e6f69d255611c93f63c2hding * cliprects to apply and whether to copy the clipRect content to all
5038e9a21e730449c10cac6e6f69d255611c93f63c2hding * scanout buffers (damage = 1).
5048e9a21e730449c10cac6e6f69d255611c93f63c2hding */
5058e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
5068e9a21e730449c10cac6e6f69d255611c93f63c2hding * Don't add debug statements in this function, it gets called with the
5078e9a21e730449c10cac6e6f69d255611c93f63c2hding * DRM lock held and output to an X terminal can cause X to deadlock
5088e9a21e730449c10cac6e6f69d255611c93f63c2hding */
5098e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic int
5108e9a21e730449c10cac6e6f69d255611c93f63c2hdingptgDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
5118e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned cmdBufOffset, unsigned cmdBufSize,
5128e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned relocBufHandle, unsigned relocBufOffset,
513cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang             unsigned numRelocs, int damage,
5148e9a21e730449c10cac6e6f69d255611c93f63c2hding             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_rep)
5158e9a21e730449c10cac6e6f69d255611c93f63c2hding{
5168e9a21e730449c10cac6e6f69d255611c93f63c2hding    drm_psb_cmdbuf_arg_t ca;
5178e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct psb_validate_arg *arg_list;
5186050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan    int i, ret;
5196050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan    unsigned int retry = 0;
5208e9a21e730449c10cac6e6f69d255611c93f63c2hding    uint64_t mask = PSB_GPU_ACCESS_MASK;
5218e9a21e730449c10cac6e6f69d255611c93f63c2hding
5228e9a21e730449c10cac6e6f69d255611c93f63c2hding    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
5238e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (arg_list == NULL) {
5248e9a21e730449c10cac6e6f69d255611c93f63c2hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "Allocate memory failed\n");
5258e9a21e730449c10cac6e6f69d255611c93f63c2hding        return -ENOMEM;
5268e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5278e9a21e730449c10cac6e6f69d255611c93f63c2hding
5288e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5298e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_arg *arg = &(arg_list[i]);
5308e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_req *req = &arg->d.req;
5318e9a21e730449c10cac6e6f69d255611c93f63c2hding
5327bb84b457d5658da0c850ed13dff3d212af70771Edward Lin        //memset(arg, 0, sizeof(*arg));
5338e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->next = (unsigned long) & (arg_list[i+1]);
5348e9a21e730449c10cac6e6f69d255611c93f63c2hding
5358e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
5368e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->group = 0;
5378e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
5388e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
5398e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 1
5408e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
5418e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_flags = PSB_USE_PRESUMED;
5428e9a21e730449c10cac6e6f69d255611c93f63c2hding#else
5438e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->presumed_flags = 0;
5448e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
5458e9a21e730449c10cac6e6f69d255611c93f63c2hding        req->pad64 = (IMG_UINT32)buffer_list[i]->pl_flags;
5468e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5478e9a21e730449c10cac6e6f69d255611c93f63c2hding    arg_list[buffer_count-1].d.req.next = 0;
5488e9a21e730449c10cac6e6f69d255611c93f63c2hding
5498e9a21e730449c10cac6e6f69d255611c93f63c2hding    memset(&ca, 0, sizeof(ca));
5508e9a21e730449c10cac6e6f69d255611c93f63c2hding
5518e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
5528e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_handle = cmdBufHandle;
5538e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_offset = cmdBufOffset;
5548e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.cmdbuf_size = cmdBufSize;
5558e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.reloc_handle = relocBufHandle;
5568e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.reloc_offset = relocBufOffset;
5578e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.num_relocs = numRelocs;
5588e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.engine = engine;
5598e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.fence_flags = fence_flags;
5608e9a21e730449c10cac6e6f69d255611c93f63c2hding    ca.fence_arg = (uint64_t)((unsigned long)fence_rep);
5618e9a21e730449c10cac6e6f69d255611c93f63c2hding    //ca.damage = damage;
5628e9a21e730449c10cac6e6f69d255611c93f63c2hding
5638e9a21e730449c10cac6e6f69d255611c93f63c2hding
5648e9a21e730449c10cac6e6f69d255611c93f63c2hding    do {
5658e9a21e730449c10cac6e6f69d255611c93f63c2hding        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
5666050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan        if (ret == -EAGAIN || ret == -EBUSY) {
5676050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan            drv_debug_msg(VIDEO_DEBUG_ERROR, "drmCommandWrite returns with %s, retry\n",
5686050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan                          ret==-EAGAIN?"EAGAIN":"EBUSY");
5696050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan            retry++;
5706050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan        }
5716050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan    } while (ret == -EAGAIN || ret == -EBUSY);
5726050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan
5736050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan    if (retry > 0)
5746050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan        drv_debug_msg(VIDEO_DEBUG_ERROR,"drmCommandWrite tries %d time, finally %s with ret=%d\n",
5756050921724f3c8543f04ad8a4a3d13e5620f8e4bRen Zhaohan                      retry, ret==0?"okay":"failed!", ret);
5768e9a21e730449c10cac6e6f69d255611c93f63c2hding
5778e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret)
5788e9a21e730449c10cac6e6f69d255611c93f63c2hding        goto out;
5798e9a21e730449c10cac6e6f69d255611c93f63c2hding
5808e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5818e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_arg *arg = &(arg_list[i]);
5828e9a21e730449c10cac6e6f69d255611c93f63c2hding        struct psb_validate_rep *rep = &arg->d.rep;
5838e9a21e730449c10cac6e6f69d255611c93f63c2hding
5848e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (!arg->handled) {
5858e9a21e730449c10cac6e6f69d255611c93f63c2hding            ret = -EFAULT;
5868e9a21e730449c10cac6e6f69d255611c93f63c2hding            goto out;
5878e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
5888e9a21e730449c10cac6e6f69d255611c93f63c2hding        if (arg->ret != 0) {
5898e9a21e730449c10cac6e6f69d255611c93f63c2hding            ret = arg->ret;
5908e9a21e730449c10cac6e6f69d255611c93f63c2hding            goto out;
5918e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
5928e9a21e730449c10cac6e6f69d255611c93f63c2hding        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5938e9a21e730449c10cac6e6f69d255611c93f63c2hding                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5948e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
5958e9a21e730449c10cac6e6f69d255611c93f63c2hdingout:
5968e9a21e730449c10cac6e6f69d255611c93f63c2hding    free(arg_list);
5978e9a21e730449c10cac6e6f69d255611c93f63c2hding    for (i = 0; i < buffer_count; i++) {
5988e9a21e730449c10cac6e6f69d255611c93f63c2hding        /*
5998e9a21e730449c10cac6e6f69d255611c93f63c2hding         * Buffer no longer queued in userspace
6008e9a21e730449c10cac6e6f69d255611c93f63c2hding         */
6018e9a21e730449c10cac6e6f69d255611c93f63c2hding        switch (buffer_list[i]->status) {
6028e9a21e730449c10cac6e6f69d255611c93f63c2hding        case psb_bs_queued:
6038e9a21e730449c10cac6e6f69d255611c93f63c2hding            buffer_list[i]->status = psb_bs_ready;
6048e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
6058e9a21e730449c10cac6e6f69d255611c93f63c2hding
6068e9a21e730449c10cac6e6f69d255611c93f63c2hding        case psb_bs_abandoned:
6078e9a21e730449c10cac6e6f69d255611c93f63c2hding            psb_buffer_destroy(buffer_list[i]);
6088e9a21e730449c10cac6e6f69d255611c93f63c2hding            free(buffer_list[i]);
6098e9a21e730449c10cac6e6f69d255611c93f63c2hding            break;
6108e9a21e730449c10cac6e6f69d255611c93f63c2hding
6118e9a21e730449c10cac6e6f69d255611c93f63c2hding        default:
6128e9a21e730449c10cac6e6f69d255611c93f63c2hding            /* Not supposed to happen */
6138e9a21e730449c10cac6e6f69d255611c93f63c2hding            ASSERT(0);
6148e9a21e730449c10cac6e6f69d255611c93f63c2hding        }
6158e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6168e9a21e730449c10cac6e6f69d255611c93f63c2hding
6178e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ret;
6188e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6198e9a21e730449c10cac6e6f69d255611c93f63c2hding
6208e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0
6218e9a21e730449c10cac6e6f69d255611c93f63c2hdingstatic struct _WsbmFenceObject *
6228e9a21e730449c10cac6e6f69d255611c93f63c2hdinglnc_fence_wait(psb_driver_data_p driver_data,
6238e9a21e730449c10cac6e6f69d255611c93f63c2hding               struct psb_ttm_fence_rep *fence_rep, int *status)
6248e9a21e730449c10cac6e6f69d255611c93f63c2hding
6258e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6268e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct _WsbmFenceObject *fence = NULL;
6278e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret = -1;
6288e9a21e730449c10cac6e6f69d255611c93f63c2hding
6298e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* copy fence information */
6308e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence_rep->error != 0) {
6318e9a21e730449c10cac6e6f69d255611c93f63c2hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence"
6328e9a21e730449c10cac6e6f69d255611c93f63c2hding                           " and has idled the HW\n");
6338e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
6348e9a21e730449c10cac6e6f69d255611c93f63c2hding        return NULL;
6358e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
6368e9a21e730449c10cac6e6f69d255611c93f63c2hding
6378e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
6388e9a21e730449c10cac6e6f69d255611c93f63c2hding                            fence_rep->fence_type,
6398e9a21e730449c10cac6e6f69d255611c93f63c2hding                            (void *)fence_rep->handle,
6408e9a21e730449c10cac6e6f69d255611c93f63c2hding                            0);
6418e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence)
6428e9a21e730449c10cac6e6f69d255611c93f63c2hding        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
6438e9a21e730449c10cac6e6f69d255611c93f63c2hding
6448e9a21e730449c10cac6e6f69d255611c93f63c2hding    return fence;
6458e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6468e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
6478e9a21e730449c10cac6e6f69d255611c93f63c2hding
6488e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
6498e9a21e730449c10cac6e6f69d255611c93f63c2hding * Submits the current cmdbuf
6508e9a21e730449c10cac6e6f69d255611c93f63c2hding *
6518e9a21e730449c10cac6e6f69d255611c93f63c2hding * Returns 0 on success
6528e9a21e730449c10cac6e6f69d255611c93f63c2hding */
653430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_submit_cmdbuf(object_context_p obj_context)
6548e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6558e9a21e730449c10cac6e6f69d255611c93f63c2hding
6568e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
6578e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6588e9a21e730449c10cac6e6f69d255611c93f63c2hding
6598e9a21e730449c10cac6e6f69d255611c93f63c2hding
6608e9a21e730449c10cac6e6f69d255611c93f63c2hding
6618e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
6628e9a21e730449c10cac6e6f69d255611c93f63c2hding * FrameSkip is only meaningful for RC enabled mode
6638e9a21e730449c10cac6e6f69d255611c93f63c2hding * Topaz raises this flag after surface N encoding is finished (vaSyncSurface gets back)
6648e9a21e730449c10cac6e6f69d255611c93f63c2hding * then for the next encode surface N+1 (ctx->src_surface) frameskip flag is cleared in vaBeginPicuture
6658e9a21e730449c10cac6e6f69d255611c93f63c2hding * and is always set in vaEndPicture:lnc_PatchRCMode
6668e9a21e730449c10cac6e6f69d255611c93f63c2hding * vaQuerySurfaceStatus is supposed only to be called after vaEndPicture/vaSyncSurface,
6678e9a21e730449c10cac6e6f69d255611c93f63c2hding * The caller should ensure the surface pertains to an encode context
6688e9a21e730449c10cac6e6f69d255611c93f63c2hding */
669430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_surface_get_frameskip(psb_driver_data_p driver_data,
6708e9a21e730449c10cac6e6f69d255611c93f63c2hding                              psb_surface_p surface,
6718e9a21e730449c10cac6e6f69d255611c93f63c2hding                              int *frame_skip)
6728e9a21e730449c10cac6e6f69d255611c93f63c2hding{
6738e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* bit31 indicate if frameskip is already settled, it is used to record the frame skip flag for old surfaces
6748e9a21e730449c10cac6e6f69d255611c93f63c2hding     * bit31 is cleared when the surface is used as encode render target or reference/reconstrucure target
6758e9a21e730449c10cac6e6f69d255611c93f63c2hding     */
6768e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (GET_SURFACE_INFO_skipped_flag(surface) & SURFACE_INFO_SKIP_FLAG_SETTLED) {
6778e9a21e730449c10cac6e6f69d255611c93f63c2hding        *frame_skip = GET_SURFACE_INFO_skipped_flag(surface) & 1;
6788e9a21e730449c10cac6e6f69d255611c93f63c2hding    } else
6798e9a21e730449c10cac6e6f69d255611c93f63c2hding        *frame_skip = 0;
6808e9a21e730449c10cac6e6f69d255611c93f63c2hding
6818e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
6828e9a21e730449c10cac6e6f69d255611c93f63c2hding}
6838e9a21e730449c10cac6e6f69d255611c93f63c2hding
684e79deb274ba55edd65e6c5d55f8e50954ff5b967edward linVAStatus tng_set_frame_skip_flag(object_context_p obj_context)
685e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin{
686e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    VAStatus vaStatus = VA_STATUS_SUCCESS;
687e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    context_ENC_p ctx = (context_ENC_p) obj_context->format_data;
688e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    context_ENC_frame_buf *ps_buf = &(ctx->ctx_frame_buf);
689e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
690e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    if (ctx && ps_buf->previous_src_surface) {
691e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        SET_SURFACE_INFO_skipped_flag(ps_buf->previous_src_surface->psb_surface, 1);
692e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Detected a skipped frame for surface 0x%08x.\n",
693e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            ps_buf->previous_src_surface->psb_surface);
694e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    }
695e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
696e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin    return vaStatus;
697e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin}
698e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
6998e9a21e730449c10cac6e6f69d255611c93f63c2hding
7008e9a21e730449c10cac6e6f69d255611c93f63c2hding/*
7018e9a21e730449c10cac6e6f69d255611c93f63c2hding * Flushes all cmdbufs
7028e9a21e730449c10cac6e6f69d255611c93f63c2hding */
703430ce5c32361119ed81a62c918be6afbdd053eddhdingint tng_context_flush_cmdbuf(object_context_p obj_context)
7048e9a21e730449c10cac6e6f69d255611c93f63c2hding{
705430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_p cmdbuf = obj_context->tng_cmdbuf;
7068e9a21e730449c10cac6e6f69d255611c93f63c2hding    psb_driver_data_p driver_data = obj_context->driver_data;
7078e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int fence_flags;
7088e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct psb_ttm_fence_rep fence_rep;
7098e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int reloc_offset;
7108e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int num_relocs;
7118e9a21e730449c10cac6e6f69d255611c93f63c2hding    int ret;
7128e9a21e730449c10cac6e6f69d255611c93f63c2hding    unsigned int cmdbuffer_size = (unsigned int) (((unsigned char *)(cmdbuf->cmd_idx)) - cmdbuf->cmd_start); /* In bytes */
7138e9a21e730449c10cac6e6f69d255611c93f63c2hding
7148e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(cmdbuffer_size < CMD_SIZE);
7158e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
7168e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* LOCK */
7178e9a21e730449c10cac6e6f69d255611c93f63c2hding    ret = LOCK_HARDWARE(driver_data);
7188e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret) {
7198e9a21e730449c10cac6e6f69d255611c93f63c2hding        UNLOCK_HARDWARE(driver_data);
7208e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
7218e9a21e730449c10cac6e6f69d255611c93f63c2hding        return ret;
7228e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
7238e9a21e730449c10cac6e6f69d255611c93f63c2hding
7248e9a21e730449c10cac6e6f69d255611c93f63c2hding    /* Now calculate the total number of relocations */
7258e9a21e730449c10cac6e6f69d255611c93f63c2hding    reloc_offset = cmdbuf->reloc_base - cmdbuf->cmd_base;
7268e9a21e730449c10cac6e6f69d255611c93f63c2hding    num_relocs = (((unsigned char *) (cmdbuf->reloc_idx)) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
7278e9a21e730449c10cac6e6f69d255611c93f63c2hding
728430ce5c32361119ed81a62c918be6afbdd053eddhding    tng_cmdbuf_unmap(cmdbuf);
7298e9a21e730449c10cac6e6f69d255611c93f63c2hding
7308e9a21e730449c10cac6e6f69d255611c93f63c2hding    ASSERT(NULL == cmdbuf->reloc_base);
7318e9a21e730449c10cac6e6f69d255611c93f63c2hding
7328e9a21e730449c10cac6e6f69d255611c93f63c2hding#ifdef DEBUG_TRACE
7338e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence_flags = 0;
7348e9a21e730449c10cac6e6f69d255611c93f63c2hding#else
7358e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence_flags = DRM_PSB_FENCE_NO_USER;
7368e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
7378e9a21e730449c10cac6e6f69d255611c93f63c2hding
7388e9a21e730449c10cac6e6f69d255611c93f63c2hding
7398e9a21e730449c10cac6e6f69d255611c93f63c2hding    wsbmWriteLockKernelBO();
7407bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#if 1 //_PO_DEBUG_
7418e9a21e730449c10cac6e6f69d255611c93f63c2hding    ret = ptgDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, /* FIXME Still use ioctl cmd? */
7428e9a21e730449c10cac6e6f69d255611c93f63c2hding                       cmdbuf->buffer_refs, cmdbuf->buffer_refs_count, wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)),
7438e9a21e730449c10cac6e6f69d255611c93f63c2hding                       0, cmdbuffer_size,/*unsigned cmdBufSize*/
7448e9a21e730449c10cac6e6f69d255611c93f63c2hding                       wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), reloc_offset, num_relocs,
745cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang                       0, LNC_ENGINE_ENCODE, fence_flags, &fence_rep); /* FIXME use LNC_ENGINE_ENCODE */
7467bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#endif
7478e9a21e730449c10cac6e6f69d255611c93f63c2hding    wsbmWriteUnlockKernelBO();
7488e9a21e730449c10cac6e6f69d255611c93f63c2hding
7498e9a21e730449c10cac6e6f69d255611c93f63c2hding    UNLOCK_HARDWARE(driver_data);
7508e9a21e730449c10cac6e6f69d255611c93f63c2hding
7518e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (ret) {
752430ce5c32361119ed81a62c918be6afbdd053eddhding        obj_context->tng_cmdbuf = NULL;
7538e9a21e730449c10cac6e6f69d255611c93f63c2hding
7548e9a21e730449c10cac6e6f69d255611c93f63c2hding        DEBUG_FAILURE_RET;
7558e9a21e730449c10cac6e6f69d255611c93f63c2hding        return ret;
7568e9a21e730449c10cac6e6f69d255611c93f63c2hding    }
7578e9a21e730449c10cac6e6f69d255611c93f63c2hding
7588e9a21e730449c10cac6e6f69d255611c93f63c2hding#if 0 /*DEBUG_TRACE*/
7598e9a21e730449c10cac6e6f69d255611c93f63c2hding    int status = -1;
7608e9a21e730449c10cac6e6f69d255611c93f63c2hding    struct _WsbmFenceObject *fence = NULL;
7618e9a21e730449c10cac6e6f69d255611c93f63c2hding
7628e9a21e730449c10cac6e6f69d255611c93f63c2hding    fence = lnc_fence_wait(driver_data, &fence_rep, &status);
7638e9a21e730449c10cac6e6f69d255611c93f63c2hding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
7648e9a21e730449c10cac6e6f69d255611c93f63c2hding
7658e9a21e730449c10cac6e6f69d255611c93f63c2hding    if (fence)
7668e9a21e730449c10cac6e6f69d255611c93f63c2hding        wsbmFenceUnreference(fence);
7678e9a21e730449c10cac6e6f69d255611c93f63c2hding#endif
7688e9a21e730449c10cac6e6f69d255611c93f63c2hding
769430ce5c32361119ed81a62c918be6afbdd053eddhding    obj_context->tng_cmdbuf = NULL;
7708e9a21e730449c10cac6e6f69d255611c93f63c2hding
7718e9a21e730449c10cac6e6f69d255611c93f63c2hding    return 0;
7728e9a21e730449c10cac6e6f69d255611c93f63c2hding}
7738e9a21e730449c10cac6e6f69d255611c93f63c2hding
7748e9a21e730449c10cac6e6f69d255611c93f63c2hding
775430ce5c32361119ed81a62c918be6afbdd053eddhdingvoid tng_cmdbuf_set_phys(IMG_UINT32 *dest_buf, int dest_num,
7768e9a21e730449c10cac6e6f69d255611c93f63c2hding    psb_buffer_p ref_buf, unsigned int ref_ofs, unsigned int ref_len)
7778e9a21e730449c10cac6e6f69d255611c93f63c2hding{
7788e9a21e730449c10cac6e6f69d255611c93f63c2hding    int i = 0;
7798e9a21e730449c10cac6e6f69d255611c93f63c2hding    IMG_UINT32 addr_phys = (IMG_UINT32)wsbmBOOffsetHint(ref_buf->drm_buf) + ref_ofs;
780e26d82700f9514cc175d2b54733ebdeb8824922ehding
781e26d82700f9514cc175d2b54733ebdeb8824922ehding//    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 );
782e26d82700f9514cc175d2b54733ebdeb8824922ehding
7838e9a21e730449c10cac6e6f69d255611c93f63c2hding    do {
7848e9a21e730449c10cac6e6f69d255611c93f63c2hding        dest_buf[i] =  addr_phys;
7858e9a21e730449c10cac6e6f69d255611c93f63c2hding        ++i;
7868e9a21e730449c10cac6e6f69d255611c93f63c2hding        addr_phys += ref_len;
7878e9a21e730449c10cac6e6f69d255611c93f63c2hding    } while(i < dest_num);
7888e9a21e730449c10cac6e6f69d255611c93f63c2hding    return ;
7898e9a21e730449c10cac6e6f69d255611c93f63c2hding}
790ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
791ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
792ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingint tng_get_pipe_number(object_context_p obj_context)
793ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding{
794ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
795ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    context_ENC_p ctx = (context_ENC_p)(obj_context->format_data);
796ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    return ctx->ui8PipesToUse;
797ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
798ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding}
799ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
800