psb_cmdbuf.c revision 4b5b72d7dd3fe944d75029ff0ca6db1e74600e59
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL
32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved.
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
52befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to
62befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers
72befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its
82befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and
92befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its
102befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade
112befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used,
122befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted,
132befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written
142befccec034c13d34746a9e87149889d59ac767bFei Jiang * permission.
157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
162befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual
172befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery
182befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or
192befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be
202befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing.
217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h>
287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h"
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h"
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h"
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h"
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h"
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h"
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h"
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h"
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h"
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h"
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h>
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h"
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h>
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h>
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h>
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout:
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         cmd_base <= cmd_idx < CMD_END() == lldma_base
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size)
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout:
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size)
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf)    (cmdbuf->reloc_base)
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf)     (cmdbuf->MTX_msg + cmdbuf->reloc_size)
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf)       (cmdbuf->lldma_base)
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf)     (cmdbuf->cmd_base + cmdbuf->size)
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE           (0x1000)
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE            (0x3000)
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE              (0x3000)
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE            (0x2000)
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN         (0x0040)
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN          (0x0800)
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN            (0x0400)
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN          (0x0400)
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT         12
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE          (0x0800)
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf,
927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                 LLDMA_CMD *pLLDMACmd,
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd);
987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer
1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data,
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_p cmdbuf
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang   )
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int size = CMD_SIZE + LLDMA_SIZE;
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE;
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 128;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->size = 0;
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_size = 0;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_size = 0;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_base = NULL;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_idx = NULL;
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_allocated = 10;
1312befccec034c13d34746a9e87149889d59ac767bFei Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (NULL == cmdbuf->buffer_refs)
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf );
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = size;
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf );
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = reloc_size;
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf );
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = regio_size;
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS != vaStatus)
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_destroy(cmdbuf);
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_destroy( psb_cmdbuf_p cmdbuf )
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->size)
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->buf );
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = 0;
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->reloc_size)
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->reloc_buf );
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = 0;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->regio_size)
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->regio_buf );
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = 0;
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->buffer_refs_allocated)
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free( cmdbuf->buffer_refs );
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs = NULL;
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_reset( psb_cmdbuf_p cmdbuf )
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count = 0;
210437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count = 0;
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base );
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg );
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_unmap( &cmdbuf->buf );
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE;
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = cmdbuf->lldma_base;
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE;
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Add ourselves to the buffer list */
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_unmap( psb_cmdbuf_p cmdbuf )
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = NULL;
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_unmap( &cmdbuf->buf );
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_unmap( &cmdbuf->reloc_buf );
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in
2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_buffer_ref( psb_cmdbuf_p cmdbuf, psb_buffer_p buf )
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	int item_loc = 0;
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // buf->next = NULL; /* buf->next only used for buffer list validation */
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        while( (item_loc < cmdbuf->buffer_refs_count)
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    != wsbmKBufHandle(wsbmKBuf(buf->drm_buf))))
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	{
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		item_loc++;
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	}
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	if (item_loc == cmdbuf->buffer_refs_count)
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	{
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		/* Add new entry */
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		if (item_loc >= cmdbuf->buffer_refs_allocated)
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		{
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			/* Allocate more entries */
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			int new_size = cmdbuf->buffer_refs_allocated+10;
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			psb_buffer_p *new_array;
2872befccec034c13d34746a9e87149889d59ac767bFei Jiang			new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			if (NULL == new_array)
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			{
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang				return -1; /* Allocation failure */
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			}
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			free(cmdbuf->buffer_refs);
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			cmdbuf->buffer_refs_allocated = new_size;
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			cmdbuf->buffer_refs = new_array;
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		}
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		cmdbuf->buffer_refs[item_loc] = buf;
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		cmdbuf->buffer_refs_count++;
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		buf->status = psb_bs_queued;
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->next = NULL;
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	}
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* only for RAR buffers */
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((cmdbuf->buffer_refs[item_loc] != buf)
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            && (buf->rar_handle != 0)) {
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc];
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n",
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                               tmp, buf);
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            while ((tmp->next != NULL)) {
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                tmp = tmp->next;
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (tmp == buf) /* found same buffer */
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (tmp != buf) {
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                tmp->next = buf; /* link it */
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->status = psb_bs_queued;
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->next = NULL;
3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            } else {
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__information_message("RAR: buffer aleady in the list, skip\n",
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                   tmp, buf);
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	return item_loc;
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf"
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer"
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift".
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background".
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_add_relocation( psb_cmdbuf_p cmdbuf,
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t *addr_in_cmdbuf,
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                psb_buffer_p ref_buffer,
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t buf_offset,
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t mask,
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t background,
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t align_shift,
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check that address is within buffer range */
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (dst_buffer)
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->cmd_base );
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) < LLDMA_END(cmdbuf) );
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->MTX_msg );
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) < MTXMSG_END(cmdbuf) );
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->buffer = psb_cmdbuf_buffer_ref( cmdbuf, ref_buffer );
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( reloc->buffer != -1 );
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
369437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n", reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset);
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (presumed_offset)
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t new_val =  presumed_offset + buf_offset;
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = (background & ~mask) | (new_val & mask);
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = new_val;
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = PSB_RELOC_MAGIC;
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->mask = mask;
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->pre_add =  buf_offset;
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->background = background;
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->dst_buffer = dst_buffer;
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx++;
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( ((void *) (cmdbuf->reloc_idx)) < RELOC_END(cmdbuf) );
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_get_next_cmdbuf( object_context_p obj_context )
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf;
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_context->cmdbuf)
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf_current++;
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS)
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf_current = 0;
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current];
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_cmdbuf_reset( cmdbuf );
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!ret)
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Success */
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = cmdbuf;
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then)
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    long long val;
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = now->tv_sec - then->tv_sec;
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val *= 1000000LL;
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val += now->tv_usec;
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val -= then->tv_usec;
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (val < 1LL)
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	val = 1LL;
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (unsigned) val;
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all
4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1).
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list,int buffer_count,unsigned cmdBufHandle,
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned numRelocs, drm_clip_rect_t * clipRects, int damage,
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned engine, unsigned fence_flags,struct psb_ttm_fence_rep *fence_arg)
4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drm_psb_cmdbuf_arg_t ca;
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_validate_arg *arg_list;
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct timeval then, now;
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool have_then = FALSE;
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4652befccec034c13d34746a9e87149889d59ac767bFei Jiang    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg)*buffer_count);
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (arg_list == NULL) {
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("Malloc failed \n");
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -ENOMEM;
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_req *req = &arg->d.req;
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memset(arg, 0, sizeof(*arg));
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->next = (unsigned long) &(arg_list[i+1]);
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->group = 0;
4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_flags = PSB_USE_PRESUMED;
4864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        req->pad64 = (uint32_t)buffer_list[i]->pl_flags;
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list[buffer_count-1].d.req.next = 0;
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.clip_rects = (uint64_t)((unsigned long)clipRects);
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.scene_arg = 0;
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_arg = (uint64_t) ((unsigned long)fence_arg);
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_flags = 0;
4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_handle = 0;
4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_offset = 0;
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_size = 0;
5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_handle = 0;
5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_offset = 0;
5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_size = 0;
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_handle = cmdBufHandle;
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_offset = cmdBufOffset;
5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_size = cmdBufSize;
5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_handle = relocBufHandle;
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_offset = relocBufOffset;
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.num_relocs = numRelocs;
5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.damage = damage;
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_flags = fence_flags;
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.engine = engine;
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_ops = 0;
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_handle = 0;
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_offset = 0;
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_breakpoints = 0;
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_size = 0;
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: buffer_list   = %08x\n", ca.buffer_list);
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: clip_rects    = %08x\n", ca.clip_rects);
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle);
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset);
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_size   = %08x\n", ca.cmdbuf_size);
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_handle  = %08x\n", ca.reloc_handle);
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_offset  = %08x\n", ca.reloc_offset);
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: num_relocs    = %08x\n", ca.num_relocs);
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: engine        = %08x\n", ca.engine);
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: fence_flags   = %08x\n", ca.fence_flags);
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * X server Signals will clobber the kernel time out mechanism.
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * we need a user-space timeout as well.
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    do {
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (ret == EAGAIN) {
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (!have_then) {
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (gettimeofday(&then, NULL)) {
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    psb__error_message("Gettimeofday error.\n");
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                have_then = TRUE;
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (gettimeofday(&now, NULL)) {
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__error_message("Gettimeofday error.\n");
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC));
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("command write return is %d\n", ret);
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("command write return is %d\n", ret);
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        goto out;
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_rep *rep = &arg->d.rep;
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!arg->handled) {
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = -EFAULT;
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (arg->ret != 0)
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = arg->ret;
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  out:
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(arg_list);
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Buffer no longer queued in userspace
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p tmp = buffer_list[i];
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * RAR slice buffer/surface buffer are share one BO, and then only one in
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * buffer_list, but they are linked in psb_cmdbuf_buffer_ref
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buffer_list[i]->rar_handle==0)
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized  */
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        do {
6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p p = tmp;
6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp = tmp->next;
6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            switch (p->status) {
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_queued:
6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                p->status = psb_bs_ready;
6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_abandoned:
6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_buffer_destroy(p);
6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(p);
6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Not supposed to happen */
6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ASSERT(0);
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } while (tmp);
6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...)        psb__trace_message(fmt, ##arg)
6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DB(fmt, arg1, arg...)        psb__trace_message("[%08x] %08x = " fmt, ((void *) arg1) - cmd_start, *arg1, ##arg)
6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes)
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t);
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *cmd_end = cmd_idx + cmd_size;
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    void *cmd_start = cmd_idx;
637437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct {
638437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int start;
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int end;
640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        char *name;
641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } msvdx_regs[10] = {{0x04800000,0x048003FF,"MTX_MTX"},
642437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800400,0x0480047F,"VDMC_MTX"},
643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800480,0x048004FF,"VDEB_MTX"},
644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800500,0x048005FF,"DMAC_MTX"},
645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800600,0x048006FF,"SYS_MTX"},
646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800700,0x048007FF,"VEC_IQRAM_MTX"},
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800800,0x04800FFF,"VEC_MTX"},
648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04801000,0x04801FFF,"CMD_MTX"},
649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04802000,0x04802FFF,"VEC_RAM_MTX"},
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04803000,0x04804FFF,"VEC_VLC_M"}
651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    };
652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size);
6547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangwhile(cmd_idx < cmd_end)
6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = *cmd_idx;
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* What about CMD_MAGIC_BEGIN ?*/
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    switch(cmd & CMD_MASK)
6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
660437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      case CMD_NOP:
661437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      {
662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          DB("CMD_NOPE\n", cmd_idx);
663437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          cmd_idx++;
664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          break;
665437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      }
666437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_HEADER:
6687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK;
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_HEADER context = %08x\n", cmd_idx, context);
6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("StatusBufferAddress\n", cmd_idx);
6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("PreloadSave\n", cmd_idx);
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("PreloadRestore\n", cmd_idx);
6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_REGVALPAIR_WRITE:
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT;
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count);
6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          while(count--)
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
688437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              int i;
689437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              for (i=0; i<10; i++) {
690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                  if ((*cmd_idx >= msvdx_regs[i].start) &&
691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      (*cmd_idx <= msvdx_regs[i].end))
692437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      break;
693437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              }
694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff);
6957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
6967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("value\n", cmd_idx);
6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_RENDEC_WRITE:
7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t encoding;
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT;
7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count);
7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("RENDEC_SL_HDR\n", cmd_idx);
7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("RENDEC_SL_NULL\n", cmd_idx);
7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          do
7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              uint32_t chk_hdr = *cmd_idx;
7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              count = 1 + ((chk_hdr & 0x07FF0000) >> 16);
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4;
7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              encoding = (chk_hdr & 0x07);
7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              if ((count == 1) && (encoding == 7))
7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  count = 0;
7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("SLICE_SEPARATOR\n", cmd_idx);
7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              }
7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              else
7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding);
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              while(count && (count < 0x1000))
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("value\n", cmd_idx);
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  cmd_idx++;
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  count -= 2;
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              }
7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        while (encoding != 0x07);
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_COMPLETION:
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          if (*cmd_idx == PSB_RELOC_MAGIC)
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          else
7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_COMPLETION\n", cmd_idx);
7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              DB("interrupt\n", cmd_idx);
7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              cmd_idx++;
7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_LLDMA:
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_LLDMA\n", cmd_idx);
7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_SLLDMA:
7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_SLLDMA\n", cmd_idx);
7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_SR_SETUP:
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_SR_SETUP\n", cmd_idx);
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("offset in bits\n", cmd_idx);
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("size in bytes\n", cmd_idx);
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      default:
7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          if (*cmd_idx == PSB_RELOC_MAGIC)
7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          else
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("*** Unknown command ***\n", cmd_idx);
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } /* switch */
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} /* while */
7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence)
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmFenceUnreference(&pFence);
8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject *
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_fence_wait(psb_driver_data_p driver_data,
8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang               struct psb_ttm_fence_rep *fence_rep, int *status)
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence = NULL;
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = -1;
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* copy fence information */
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence_rep->error != 0) {
8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("drm failed to create a fence"
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           " and has idled the HW\n");
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            fence_rep->fence_type,
8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            (void *)fence_rep->handle,
8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            0);
8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence)
8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *status = wsbmFenceFinish(fence,fence_rep->fence_type,0);
8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return fence;
8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT];
8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT];
8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count;
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count;
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start;
8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DUMP_COUNT 	20
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT];
8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT];
8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_offset[MAX_DUMP_COUNT];
8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_size[MAX_DUMP_COUNT];
8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_count = 0;
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from);
8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from);
8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from)
8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (bit_to < 31)
8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        val &= ~(0xffffffff << (bit_to+1));
8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = val >> bit_from;
8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(fmt, val);
8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0;
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size)
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (offset + size > 8)
8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size = 8 - offset;
8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("[%04x]", g_hexdump_offset);
8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += offset;
8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += size;
8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( offset-- > 0)
8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" --");
8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( size-- > 0)
8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" %02x", *p++);
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("\n");
8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump(void *addr, int size)
8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned char *p = (unsigned char *) addr;
8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int offset = g_hexdump_offset % 8;
8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset -= offset;
8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (offset)
8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__hexdump2(p, offset, size);
8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8 - offset;
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8 - offset;
8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( 1 )
8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (size < 8)
9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (size > 0)
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            {
9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__hexdump2(p, 0, size);
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message("[%04x] %02x %02x %02x %02x %02x %02x %02x %02x\n", g_hexdump_offset, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8;
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8;
9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset += 8;
9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size)
9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(debug_dump_count < MAX_DUMP_COUNT);
9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_name[debug_dump_count] = name;
9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_buf[debug_dump_count] = buf;
9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_offset[debug_dump_count] = offset;
9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_size[debug_dump_count] = size;
9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count++;
9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment
9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_close_segment( psb_cmdbuf_p cmdbuf )
9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bytes_used = ((void *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE;
9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    void *segment_start = (void *) cmdbuf->cmd_idx - bytes_used;
9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */,
9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          bytes_used,
9377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          0 /* destination offset */,
9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          LLDMA_TYPE_RENDER_BUFF_MC);
9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = CMD_NEXT_SEG;
9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_SHIFT4( *cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf));
9417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(cmdbuf->last_next_segment_cmd+1) = bytes_used;
9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
944437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_deblock( object_context_p obj_context )
9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
9477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = FW_DXVA_DEBLOCK_SIZE;
9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *msg = cmdbuf->MTX_msg;
9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DEBLOCKPARAMS* pdbParams;
9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("Send two pass deblock cmd\n");
9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if(cmdbuf->cmd_count) {
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("two pass deblock cmdbuf has render msg!\n");
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	return 1;
9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count++;
9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
9597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */
9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_DEBLOCK);
9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_FLAGS, FW_DXVA_RENDER_HOST_INT );
9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams = (DEBLOCKPARAMS*) (msg + 16 / sizeof(uint32_t));
9677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf));
969437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */
9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->buffer_size = cmdbuf->regio_size;
9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->ctxid = obj_context->msvdx_context;
9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */
9774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context,
9784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_a,
9794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_b,
9804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p colocate_buffer,
9814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t picture_widht_mb,
9824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t frame_height_mb,
9834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t rotation_flags,
9844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo				  uint32_t field_type,
9854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo				  uint32_t ext_stride_a,
9864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_a,
9874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_b,
9884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t is_oold)
9894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
9904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
9914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
9924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE;
9934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
9944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    FW_VA_DEBLOCK_MSG *deblock_msg;
9954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(IS_MFLD(driver_data))
9974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
9984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
9994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DXVA_RENDER_SIZE;
10004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t *msg = cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count;
10024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
10044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
10054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->header.bits.msg_size = msg_size;
10074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(is_oold)
10084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD;
10094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
10104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD;
10114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->flags.bits.flags = FW_DXVA_RENDER_HOST_INT | FW_DXVA_RENDER_IS_LAST_SLICE;
10124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->flags.bits.slice_type = field_type;
10134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->operating_mode = obj_context->operating_mode;
10144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context >> 16);
10154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
10164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
10174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->ext_stride_a = ext_stride_a;
10184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->rotation_flags = rotation_flags;
10194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
10214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
10224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(buf_b) {
10234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
10244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
10254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
10264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer);
10284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->deblock_count++;
10294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return 0;
10304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1032437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_oold( object_context_p obj_context,
1033437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p src_buf,
1034437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p dst_buf,
1035437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p colocate_buffer,
1036437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t picture_width_in_mb,
1037437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t frame_height_in_mb,
1038437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t field_type,
1039437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t chroma_offset )
1040437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
1041437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
1042437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t msg_size = FW_DXVA_OOLD_SIZE;
1043437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE;
1044437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    FW_DXVA_OOLD_MSG *oold_msg;
1045437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
10462befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer)
10472befccec034c13d34746a9e87149889d59ac767bFei Jiang    {
10482befccec034c13d34746a9e87149889d59ac767bFei Jiang	psb__error_message("%s L%d Invalide src_buf, dst_buf or colocate_buffer\n",
10492befccec034c13d34746a9e87149889d59ac767bFei Jiang		__FUNCTION__, __LINE__);
10502befccec034c13d34746a9e87149889d59ac767bFei Jiang	return VA_STATUS_ERROR_INVALID_BUFFER;
10512befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
10522befccec034c13d34746a9e87149889d59ac767bFei Jiang
1053437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("Send out of loop deblock cmd\n");
1054437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1055437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count++;
1056437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(msg, 0, msg_size);
1057437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    oold_msg = (FW_DXVA_OOLD_MSG *) msg;
1058437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1059437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_DXVA_OOLD_SIZE);
1060437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_OOLD);
1061437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
1062437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1063437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_OPERATING_MODE, obj_context->operating_mode);
1064437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb);
1065437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb);
1066437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1067437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf);
1068437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf);
1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf);
1070437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf);
1071437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1072437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer);
1073437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1074437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_SLICE_FIELD_TYPE, field_type);
1075437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1076437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
1077437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1078437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
10797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf
10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_submit_cmdbuf( object_context_p obj_context )
10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
10874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
10884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
10894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(IS_MFLD(driver_data))
10914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
10924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
10934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DXVA_RENDER_SIZE;
10944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
10954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo   uint32_t cmdbuffer_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes
10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->last_next_segment_cmd)
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuffer_size = cmdbuf->first_segment_size;
11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_close_segment( cmdbuf );
11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = item_size;
11044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size;
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base;
11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_size[cmdbuf->cmd_count] = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_count = cmdbuf->cmd_count+1;
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define DUMP_CMDBUF 0
11134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if DUMP_CMDBUF
11154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static int c = 0;
11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static char pFileName[30];
11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    sprintf( pFileName , "cmdbuf%i.txt", c++);
11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    FILE* pF = fopen(pFileName,"w");
11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF);
11234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fclose(pF);
11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count++;
11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case.
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE,                  msg_size);
11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID,                    DXVA_MSGID_RENDER);
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(!IS_MFLD(driver_data))
11374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    {
11384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* TODO: Need to make context more unique */
11394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_CONTEXT,            obj_context->msvdx_context );
11404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Point to CMDBUFFER */
11424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
11434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */,
11444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      cmdbuffer_size,
11454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      0 /* destination offset */,
11464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC);
11474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* This is the last relocation */
11484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG( *(msg + (FW_DXVA_RENDER_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))),
11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang               lldma_record_offset, &(cmdbuf->buf));
11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE,          cmdbuffer_size); // In bytes
11524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE,       obj_context->operating_mode);
11534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME,     obj_context->last_mb);
11544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE,    obj_context->first_mb);
11554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS,                obj_context->flags);
11564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
11574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
11584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    {
11594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context >> 16) );/* context is 8 bits */
11604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Point to CMDBUFFER */
11624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
11634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */,
11644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      cmdbuffer_size,
11654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      0 /* destination offset */,
11664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                      (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC);
11674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* This is the last relocation */
11684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG( *(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))),
11694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo               lldma_record_offset, &(cmdbuf->buf));
11704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE,          cmdbuffer_size / 4); // In dwords
11724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE,       obj_context->operating_mode);
11734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS,                obj_context->flags);
11744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList);
11777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base;
11787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Indicate last LLDMA record (for debugging) */
11797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ((uint32_t *)cmdbuf->lldma_idx)[1] = 0;
11807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_idx;
11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return psb_context_flush_cmdbuf( obj_context );
11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) ||
11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (MTXMSG_END(cmdbuf) - (void *) msg < MTXMSG_MARGIN) ||
11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (CMD_END(cmdbuf) - (void *) cmdbuf->cmd_idx < CMD_MARGIN) ||
11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) ||
11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (RELOC_END(cmdbuf) - (void *) cmdbuf->reloc_idx < RELOC_MARGIN))
11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return psb_context_flush_cmdbuf( obj_context );
11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
12007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs
12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_flush_cmdbuf( object_context_p obj_context )
12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int fence_flags;
1207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* unsigned int fence_handle = 0; */
12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_ttm_fence_rep fence_rep;
12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_offset;
12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int num_relocs;
12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
12124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
12134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(IS_MFLD(driver_data))
12154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
12164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
12174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DXVA_RENDER_SIZE;
12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((NULL == cmdbuf) || ((0 == cmdbuf->cmd_count) && (0 == cmdbuf->deblock_count)))
12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0; // Nothing to do
12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = 0;
12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *msg = cmdbuf->MTX_msg;
12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LOCK */
12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 1; i <= cmdbuf->cmd_count; i++)
12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
12394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t flags;
12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if(IS_MFLD(driver_data))
12424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS);
12434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
12444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            flags = MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS);
12454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update flags */
12474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count));
12487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        flags |=
12507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (bBatchEnd ? (FW_DXVA_RENDER_HOST_INT | FW_DXVA_LAST_SLICE_OF_EXT_DMA)    : FW_DXVA_RENDER_NO_RESPONCE_MSG) |
12517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (obj_context->video_op == psb_video_vld    ? FW_DXVA_RENDER_IS_VLD_NOT_MC : 0);
12527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	if( i == cmdbuf->cmd_count )
12547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            flags |= FW_DXVA_LAST_SLICE_OF_EXT_DMA;
12557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* VXD385 DDK406 not use FW_DXVA_LAST_SLICE_OF_EXT_DMA, this flags should be cleaned later */
12574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if(IS_MFLD(driver_data))
12584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        {
1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            flags &= ~FW_DXVA_LAST_SLICE_OF_EXT_DMA;
12604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            flags &= ~FW_DXVA_RENDER_IS_VLD_NOT_MC;
12614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags);
12624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
12634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else {
12644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, flags);
12654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
12667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
12684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    if(!IS_MFLD(driver_data))
12694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    {
12704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) );
12714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) );
12724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) );
12734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) );
12744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) );
12754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) );
12774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) );
12784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) );
12794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) );
12804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) );
12814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
12834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    {
12844b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE) );
12854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE) );
12864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS) );
12874b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE) );
12894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE) );
12904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	psb__information_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS) );
12914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0  /* todo */
12954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Update SAREA */
12964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context;
12974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
12984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg += item_size / sizeof(uint32_t);
12994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg_size += item_size;
13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Assume deblock message is following render messages and no more render message behand deblock message */
13037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 1; i <= cmdbuf->deblock_count; i++)
13047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
13054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        if(!IS_MFLD(driver_data))
13064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            msg_size += FW_DXVA_DEBLOCK_SIZE;
13074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
13084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            msg_size += FW_DEVA_DEBLOCK_SIZE;
13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for(i = 1; i <= cmdbuf->oold_count; i++)
1312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    {
1313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        msg_size += FW_DXVA_OOLD_SIZE;
1314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Now calculate the total number of relocations */
13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg;
13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    num_relocs = (((void *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE);
13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n",  (void *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE);
13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE);
13237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE);
13247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_unmap( cmdbuf );
13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(NULL); /* Flush trace */
13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( NULL == cmdbuf->MTX_msg );
13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( NULL == cmdbuf->reloc_base );
13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = 0;
13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = DRM_PSB_FENCE_NO_USER;
13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cmdbuf will be validated as part of the buffer list */
13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Submit */
13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1
13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteLockKernelBO();
13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset,cmdbuf->buffer_refs,
13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    cmdbuf->buffer_refs_count,
13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    0, msg_size,
13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    reloc_offset, num_relocs,
13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep);
13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteUnlockKernelBO();
13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    UNLOCK_HARDWARE(driver_data);
13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = 1;
13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = NULL;
13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->slice_count++;
13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int error_count = 0;
13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int status = 0;
13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence=NULL;
13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = psb_fence_wait(driver_data, &fence_rep, &status);
13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n",status, fence);
13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1375437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base );
1377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg );
13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (getenv("PSB_VIDEO_TRACE_LLDMA")) {
1380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__trace_message("lldma_count = %d, vitual=0x%08x\n",
1381437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                           debug_lldma_count,  wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE);
1382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        for(i = 0; i < debug_lldma_count; i++)
1383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        {
1384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) (cmdbuf->cmd_base + debug_lldma_start);
1385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pasDmaList += i;
1386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base);
1388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, BSWAP,    31, 31)
1389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, DIR,    30, 30)
1390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, PW,    29, 28)
1391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_FIN, 31, 31)
1392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_INT, 30, 30)
1393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, PI,    18, 17)
1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, INCR,    16, 16)
1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, LEN,    15, 0)
1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(2, ADDR,    22, 0)
1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, ACC_DEL,    31, 29)
1398437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, BURST,    28, 26)
1399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(3, EXT_SA,    3, 0)
1400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, 2D_MODE,    16, 16)
1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, REP_COUNT, 10, 0)
1402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(5, LINE_ADD_OFF, 25, 16)
1403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(5, ROW_LENGTH, 9, 0)
1404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(6, SA, 31, 0)
1405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(7, LISTPTR, 27, 0)
1406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("debug_dump_count = %d\n", debug_dump_count);
14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 0; i < debug_dump_count; i++)
14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        void *buf_addr;
14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message("Buffer %d = '%s' offset = %08x size = %08x\n", i, debug_dump_name[i], debug_dump_offset[i], debug_dump_size[i]);
1416437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (debug_dump_buf[i]->rar_handle
1417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            || (psb_buffer_map( debug_dump_buf[i], &buf_addr) != 0)) {
1418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("Unmappable buffer,e.g. RAR buffer\n");
1419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            continue;
1420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset = 0;
14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__hexdump( buf_addr + debug_dump_offset[i], debug_dump_size[i]);
14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_unmap( debug_dump_buf[i] );
14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count = 0;
14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__trace_message("cmd_count = %d, virtual=0x%08x\n",
1429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    		       debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf));
1430437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for(i = 0; i < debug_cmd_count; i++)
1431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    {
14324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	uint32_t *msg = cmdbuf->MTX_msg + i * item_size;
1433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	int j;
1434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]);
1435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        debug_dump_cmdbuf( (uint32_t *) (cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i] );
1436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo	for (j=0; j<item_size/4; j++)
1438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("MTX msg[%d] = 0x%08x\n", j, *(msg+j));
1439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap( &cmdbuf->buf );
1441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap( &cmdbuf->reloc_buf);
1442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
1444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (status)
14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status);
14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        error_count++;
14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	ASSERT(status != 2);
14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(error_count < 40); /* Exit on 40 errors */
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence)
14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_fence_destroy(fence);
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf = NULL;
14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->slice_count++;
14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum {
14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP0 = 0,
14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP1 = 1,
14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP;
14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum    {
14697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HOST_TO_MSVDX = 0,
14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MSXDX_TO_HOST = 1,
14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION;
14727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct {
14747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	IMG_UINT32 ui32DevDestAddr ;	/* destination address */
14757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePW	ePeripheralWidth;
14767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePeriphIncrSize	ePeriphIncrSize;
14777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePeriphIncr	ePeriphIncr;
14787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	IMG_BOOL		bSynchronous;
14797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	MMU_GROUP		eMMUGroup;
14807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_DIRECTION	eDMADir;
14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_eBurst		eDMA_eBurst;
14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP;
14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] =
14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/* LLDMA_TYPE_VLC_TABLE */ { 	REG_MSVDX_VEC_VLC_OFFSET  ,
14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_16_BIT,	/* 16 bit wide data*/
14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,	/* Incrament the dest by 32 bits */
14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/* LLDMA_TYPE_BITSTREAM */ {
14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET  ),
14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_8_BIT,
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_FALSE,
15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_4
15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RESIDUAL*/		{
15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET),
15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_FALSE,
15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo									DMA_BURST_4
15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RENDER_BUFF_MC*/{
15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RENDER_BUFF_VLD*/{
15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
15367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{
15382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang									(REG_MSVDX_VEC_RAM_OFFSET + 0xB90 ),
15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,
15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2		 /* From VLR */
15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{
15482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang									(REG_MSVDX_VEC_RAM_OFFSET + 0xB90 ),
15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,
15517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2		/* Into VLR */
15567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_H264_PRELOAD_SAVE*/{
15587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* From MTX */
15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{
15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{
15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
15834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo									MMU_GROUP0,
15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
15857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		//2	/* From MTX */
15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{
15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
15934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo									MMU_GROUP0,
15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
1597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	/*LLDMA_TYPE_IDCT_INSERTION*/{
1598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									(REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_DIRECT_MODE_DATA0_OFFSET ),
1599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PWIDTH_32_BIT,
1600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_1,
1601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_OFF,
1602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									IMG_FALSE,
1603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									MMU_GROUP1,
1604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									HOST_TO_MSVDX,
1605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_BURST_4
1606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang								},
1607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	/*LLDMA_TYPE_RENDER_BUFF_ALTERNATE */
1608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	 {
1609437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET  ),
1610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PWIDTH_8_BIT,
1611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_1,
1612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_OFF,
1613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									IMG_FALSE,
1614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									MMU_GROUP0,
1615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									HOST_TO_MSVDX,
1616437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_BURST_4
1617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang								},
16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN     ( 0xffff )
16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_cmdbuf( psb_cmdbuf_p cmdbuf,
16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
16287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++;
16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size,
16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                dest_offset, cmd);
16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_lldma_create( psb_cmdbuf_p cmdbuf,
16367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = (((void*)cmdbuf->lldma_idx) - ((void *) cmdbuf->cmd_base));
16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size,
16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                dest_offset, cmd);
16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return lldma_record_offset;
16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream( psb_cmdbuf_p cmdbuf,
16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p bitstream_buf,
16537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t buffer_offset,
16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t size_in_bytes,
16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t offset_in_bits,
16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t flags)
16577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * We use byte alignment instead of 32bit alignment.
16607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The third frame of sa10164.vc1 results in the following bitstream
16617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * patttern:
16627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * [0000] 00 00 03 01 76 dc 04 8d
16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * with offset_in_bits = 0x1e
16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This causes an ENTDEC failure because 00 00 03 is a start code
16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * By byte aligning the datastream the start code will be eliminated.
16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALIGNMENT	 sizeof(uint8_t)
16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bs_offset_in_dwords    = ((offset_in_bits /8) / ALIGNMENT);
16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
16747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
16757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = offset_in_bits;
16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = size_in_bytes;
16807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_write_cmdbuf( cmdbuf, bitstream_buf, buffer_offset,
16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            size_in_bytes, 0, LLDMA_TYPE_BITSTREAM );
16837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1685437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes);
16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one
16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream_chained( psb_cmdbuf_p cmdbuf,
16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p bitstream_buf,
16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t size_in_bytes)
16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last;
16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create( cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs,
16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            size_in_bytes, 0, LLDMA_TYPE_BITSTREAM );
16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Update WD7 of last LLDMA record to point to this one */
17007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf));
17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* This touches WD1 */
17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1705437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes);
17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf,
17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                 LLDMA_CMD *pLLDMACmd,
17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    const DMA_DETAIL_LOOKUP* pDmaDetail;
17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd;
17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList;
17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    static IMG_UINT32 lu[] = {4,2,1};
17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* See if we will fit */
17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( cmdbuf->lldma_idx + sizeof( DMA_sLinkedList ) < LLDMA_END(cmdbuf) );
17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pDmaDetail = &DmaDetailLookUp[cmd];
17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth];
17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* DMA list must be 16byte alligned if it is done in Hw */
17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pasDmaList = (DMA_sLinkedList*) (cmdbuf->lldma_idx) ;
17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f );
17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Offset of LLDMA record in cmdbuf */
17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) -((IMG_UINT8*) cmdbuf->cmd_base));
17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( 0 == (ui32LLDMA_Offset&0xf) );
17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset;
17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write the header */
17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (pLLDMACmd)
17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA );
17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf));
17477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
17487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( ui32DMACount )
17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memset( pasDmaList , 0 ,sizeof(DMA_sLinkedList) );
17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr );
17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* DMA_LL_SET_WD6 with relocation */
17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(DMAC_LL_SA_SHIFT == 0);
17577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf);
17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if( ui32DMACount > MAX_DMA_LEN )
17617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32LLDMA_Offset+=sizeof(DMA_sLinkedList);
17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* DMA_LL_SET_WD7 with relocation */
17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(DMAC_LL_LISTPTR_SHIFT == 0);
17667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf));
17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This touches WD1 */
17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN );    /* size */
17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32DMACount-= MAX_DMA_LEN;
17737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if(  pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON )
17757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            {
17767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Update Destination pointers */
17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ui32DMADestAddr += ((MAX_DMA_LEN)* lu[pDmaDetail->ePeriphIncrSize] );
17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Update Source Pointer */
17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            buffer_offset += ((MAX_DMA_LEN)*lu[pDmaDetail->ePeripheralWidth]);
17827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
17837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        else
17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This also set LIST_FIN in WD1 to 1*/
17867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD7(pasDmaList, IMG_NULL);                // next linked list
17877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD1(pasDmaList,pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount );    /* size */
17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32DMACount =0;
17907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Keep pointer in case we need to chain another LLDMA command */
17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->lldma_last = (void *) pasDmaList;
17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP,
17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (pDmaDetail->eDMADir==HOST_TO_MSVDX)?DMA_DIR_MEM_TO_PERIPH:DMA_DIR_PERIPH_TO_MEM ,
17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            pDmaDetail->ePeripheralWidth);
17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup );
18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0);    // 2d
18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD5(pasDmaList, 0, 0);                    // 2d
18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pasDmaList++;
18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* there can be up to 3 Bytes of padding after header */
18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx    = (void *)pasDmaList;
18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers
18147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_start_block( psb_cmdbuf_p cmdbuf )
18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = cmdbuf->cmd_idx++;
18204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->reg_start = 0;
18214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
18224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_reg_start_block_flag( psb_cmdbuf_p cmdbuf, uint32_t flags )
18244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
18254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
18264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->reg_start = cmdbuf->cmd_idx++;
18284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->reg_start = flags;
18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_set_address( psb_cmdbuf_p cmdbuf,
18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t reg,
18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p buffer,
18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset )
18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = reg;
18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers
18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_end_block( psb_cmdbuf_p cmdbuf )
18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2;
18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->reg_start |= CMD_REGVALPAIR_WRITE | reg_count;
18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum
18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_CTRL_HEADER = 0,
18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_HDR,
18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_NULL,
18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_CK_HDR,
18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS;
18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block
18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_block( psb_cmdbuf_p cmdbuf )
18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
18657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = cmdbuf->cmd_idx;
18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0;
18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO,      1);
18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD,   3);
18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1);
18717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */
18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += RENDEC_CK_HDR;
18757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block
18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_chunk( psb_cmdbuf_p cmdbuf, uint32_t dest_address )
18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */
18837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->rendec_chunk_start = 0;
18867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3);
18877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, ( dest_address >> 2));
18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
18914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format
18924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
18934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_rendec_start( psb_cmdbuf_p cmdbuf, uint32_t dest_address )
18944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
18954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(   ((dest_address>>2)& ~0xfff) == 0  );
18964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
18974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
18984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | ((dest_address>>2) <<4 );
18994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
19004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_block( psb_cmdbuf_p cmdbuf,
19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                    unsigned char *block,
19037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                    uint32_t size )
19047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((size & 0x3) == 0);
19067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
19077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < size; i += 4)
19087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
19097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24);
19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_rendec_write( cmdbuf, val );
19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_address( psb_cmdbuf_p cmdbuf,
19157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p buffer,
19167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t buffer_offset )
19177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk
19237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_chunk( psb_cmdbuf_p cmdbuf )
19257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
19277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
19287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1;
19297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (*cmdbuf->rendec_chunk_start,
19317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                RENDEC_SLICE_INFO,
19327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                CK_HDR,
19337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                CK_NUM_SYMBOLS_LESS1,
19347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                (2 * dword_count) - 1);        /* Number of 16-bit symbols, minus 1.*/
19357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
19377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block
19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
19424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuovoid psb_cmdbuf_rendec_end( psb_cmdbuf_p cmdbuf )
19434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
19444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
19454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start;
19464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT( (dword_count-1) <= 0xff  );
19484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16);
19504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = NULL;
19514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
19524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
19544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Finish a RENDEC block
19554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
19567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_block( psb_cmdbuf_p cmdbuf )
19577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
19597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */
19607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start;  /* Include separator but not mtx block header*/
19627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write separator (footer-type thing)    */
19647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0;
19657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD( *cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7);
19667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx++;
19677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write CMD Header    */
19697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size;
19707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
19727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment
19767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
19777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_segment_space( psb_cmdbuf_p cmdbuf )
19787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bytes_used = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
19807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t);
19817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment
19857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
19867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_next_segment( psb_cmdbuf_p cmdbuf )
19877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *next_segment_cmd = cmdbuf->cmd_idx;
19897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += 2;
19907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t words_free = psb_cmdbuf_segment_space( cmdbuf );
19917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->last_next_segment_cmd)
19937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
19947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_close_segment( cmdbuf );
19957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
19967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
19977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
19987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->first_segment_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
19997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
20007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */
20027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = next_segment_cmd;
20047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block
20087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
20097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_start_block( psb_cmdbuf_p cmdbuf, uint32_t skip_condition )
20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */
20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */
20137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/
20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_condition = skip_condition;
20167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = cmdbuf->cmd_idx++;
20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block
20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
20227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_end_block( psb_cmdbuf_p cmdbuf )
20237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */
20257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */
20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */
20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1);
20297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20 ) | block_size;
20317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
20327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2033