psb_cmdbuf.c revision 437b3eda28a4bf098efa80598cab67f190275266
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
27e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
37e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Copyright (c) Imagination Technologies Limited, UK
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
57e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Permission is hereby granted, free of charge, to any person obtaining a
67e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * copy of this software and associated documentation files (the
77e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "Software"), to deal in the Software without restriction, including
87e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * without limitation the rights to use, copy, modify, merge, publish,
97e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * distribute, sub license, and/or sell copies of the Software, and to
107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * permit persons to whom the Software is furnished to do so, subject to
117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * the following conditions:
127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The above copyright notice and this permission notice (including the
147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * next paragraph) shall be included in all copies or substantial portions
157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * of the Software.
167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h>
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h"
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h"
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h"
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h"
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h"
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h"
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h"
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h"
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h"
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h"
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h"
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h>
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h"
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h>
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h>
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h>
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout:
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         cmd_base <= cmd_idx < CMD_END() == lldma_base
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size)
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout:
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size)
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf)    (cmdbuf->reloc_base)
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf)     (cmdbuf->MTX_msg + cmdbuf->reloc_size)
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf)       (cmdbuf->lldma_base)
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf)     (cmdbuf->cmd_base + cmdbuf->size)
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE           (0x1000)
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE            (0x3000)
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE              (0x3000)
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE            (0x2000)
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN         (0x0040)
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN          (0x0800)
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN            (0x0400)
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN          (0x0400)
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT         12
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE          (0x0800)
917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf,
957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                 LLDMA_CMD *pLLDMACmd,
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd);
1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data,
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_p cmdbuf
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang   )
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int size = CMD_SIZE + LLDMA_SIZE;
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE;
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 128;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->size = 0;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_size = 0;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_size = 0;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_base = NULL;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_idx = NULL;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_allocated = 10;
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) malloc(sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (NULL == cmdbuf->buffer_refs)
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf );
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = size;
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf );
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = reloc_size;
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS == vaStatus)
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = psb_buffer_create( driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf );
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = regio_size;
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (VA_STATUS_SUCCESS != vaStatus)
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_destroy(cmdbuf);
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_destroy( psb_cmdbuf_p cmdbuf )
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->size)
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->buf );
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = 0;
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->reloc_size)
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->reloc_buf );
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = 0;
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->regio_size)
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_destroy( &cmdbuf->regio_buf );
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = 0;
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->buffer_refs_allocated)
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        free( cmdbuf->buffer_refs );
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs = NULL;
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_reset( psb_cmdbuf_p cmdbuf )
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count = 0;
213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count = 0;
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base );
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg );
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_unmap( &cmdbuf->buf );
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE;
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = cmdbuf->lldma_base;
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE;
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Add ourselves to the buffer list */
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_unmap( psb_cmdbuf_p cmdbuf )
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = NULL;
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_unmap( &cmdbuf->buf );
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_unmap( &cmdbuf->reloc_buf );
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_cmdbuf_buffer_ref( psb_cmdbuf_p cmdbuf, psb_buffer_p buf )
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	int item_loc = 0;
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        // buf->next = NULL; /* buf->next only used for buffer list validation */
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        while( (item_loc < cmdbuf->buffer_refs_count)
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    != wsbmKBufHandle(wsbmKBuf(buf->drm_buf))))
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	{
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		item_loc++;
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	}
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	if (item_loc == cmdbuf->buffer_refs_count)
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	{
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		/* Add new entry */
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		if (item_loc >= cmdbuf->buffer_refs_allocated)
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		{
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			/* Allocate more entries */
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			int new_size = cmdbuf->buffer_refs_allocated+10;
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			psb_buffer_p *new_array;
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			new_array = (psb_buffer_p *) malloc(sizeof(psb_buffer_p) * new_size);
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			if (NULL == new_array)
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			{
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang				return -1; /* Allocation failure */
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			}
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			free(cmdbuf->buffer_refs);
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			cmdbuf->buffer_refs_allocated = new_size;
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang			cmdbuf->buffer_refs = new_array;
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		}
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		cmdbuf->buffer_refs[item_loc] = buf;
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		cmdbuf->buffer_refs_count++;
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		buf->status = psb_bs_queued;
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->next = NULL;
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	}
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* only for RAR buffers */
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if ((cmdbuf->buffer_refs[item_loc] != buf)
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            && (buf->rar_handle != 0)) {
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc];
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n",
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                               tmp, buf);
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            while ((tmp->next != NULL)) {
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                tmp = tmp->next;
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (tmp == buf) /* found same buffer */
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (tmp != buf) {
3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                tmp->next = buf; /* link it */
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->status = psb_bs_queued;
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                buf->next = NULL;
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            } else {
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__information_message("RAR: buffer aleady in the list, skip\n",
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                   tmp, buf);
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	return item_loc;
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf"
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer"
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift".
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background".
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_add_relocation( psb_cmdbuf_p cmdbuf,
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t *addr_in_cmdbuf,
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                psb_buffer_p ref_buffer,
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t buf_offset,
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t mask,
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t background,
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t align_shift,
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check that address is within buffer range */
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (dst_buffer)
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->cmd_base );
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) < LLDMA_END(cmdbuf) );
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) >= cmdbuf->MTX_msg );
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT( ((void *) (addr_in_cmdbuf)) < MTXMSG_END(cmdbuf) );
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->buffer = psb_cmdbuf_buffer_ref( cmdbuf, ref_buffer );
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( reloc->buffer != -1 );
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
372437b3eda28a4bf098efa80598cab67f190275266Fei 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);
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (presumed_offset)
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t new_val =  presumed_offset + buf_offset;
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = (background & ~mask) | (new_val & mask);
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = new_val;
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = PSB_RELOC_MAGIC;
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->mask = mask;
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->pre_add =  buf_offset;
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->background = background;
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->dst_buffer = dst_buffer;
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx++;
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( ((void *) (cmdbuf->reloc_idx)) < RELOC_END(cmdbuf) );
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_get_next_cmdbuf( object_context_p obj_context )
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_context->cmdbuf)
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf_current++;
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS)
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf_current = 0;
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current];
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psb_cmdbuf_reset( cmdbuf );
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!ret)
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Success */
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = cmdbuf;
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then)
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    long long val;
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = now->tv_sec - then->tv_sec;
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val *= 1000000LL;
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val += now->tv_usec;
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val -= then->tv_usec;
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (val < 1LL)
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	val = 1LL;
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (unsigned) val;
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1).
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list,int buffer_count,unsigned cmdBufHandle,
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned numRelocs, drm_clip_rect_t * clipRects, int damage,
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned engine, unsigned fence_flags,struct psb_ttm_fence_rep *fence_arg)
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drm_psb_cmdbuf_arg_t ca;
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_validate_arg *arg_list;
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct timeval then, now;
4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool have_then = FALSE;
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list = (struct psb_validate_arg *) malloc(sizeof(struct psb_validate_arg)*buffer_count);
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (arg_list == NULL) {
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("Malloc failed \n");
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -ENOMEM;
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_req *req = &arg->d.req;
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memset(arg, 0, sizeof(*arg));
4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->next = (unsigned long) &(arg_list[i+1]);
4817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->group = 0;
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_flags = PSB_USE_PRESUMED;
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list[buffer_count-1].d.req.next = 0;
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.clip_rects = (uint64_t)((unsigned long)clipRects);
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.scene_arg = 0;
4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_arg = (uint64_t) ((unsigned long)fence_arg);
4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_flags = 0;
4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_handle = 0;
5007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_offset = 0;
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.ta_size = 0;
5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_handle = 0;
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_offset = 0;
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_size = 0;
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_handle = cmdBufHandle;
5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_offset = cmdBufOffset;
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_size = cmdBufSize;
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_handle = relocBufHandle;
5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_offset = relocBufOffset;
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.num_relocs = numRelocs;
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.damage = damage;
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_flags = fence_flags;
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.engine = engine;
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_ops = 0;
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_handle = 0;
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_offset = 0;
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_breakpoints = 0;
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.feedback_size = 0;
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: buffer_list   = %08x\n", ca.buffer_list);
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: clip_rects    = %08x\n", ca.clip_rects);
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle);
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset);
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: cmdbuf_size   = %08x\n", ca.cmdbuf_size);
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_handle  = %08x\n", ca.reloc_handle);
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: reloc_offset  = %08x\n", ca.reloc_offset);
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: num_relocs    = %08x\n", ca.num_relocs);
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: engine        = %08x\n", ca.engine);
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("PSB submit: fence_flags   = %08x\n", ca.fence_flags);
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * X server Signals will clobber the kernel time out mechanism.
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * we need a user-space timeout as well.
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    do {
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (ret == EAGAIN) {
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (!have_then) {
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (gettimeofday(&then, NULL)) {
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    psb__error_message("Gettimeofday error.\n");
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                have_then = TRUE;
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (gettimeofday(&now, NULL)) {
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__error_message("Gettimeofday error.\n");
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC));
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("command write return is %d\n", ret);
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("command write return is %d\n", ret);
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        goto out;
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_rep *rep = &arg->d.rep;
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!arg->handled) {
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = -EFAULT;
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (arg->ret != 0)
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = arg->ret;
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang  out:
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(arg_list);
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < buffer_count; i++)
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Buffer no longer queued in userspace
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p tmp = buffer_list[i];
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * RAR slice buffer/surface buffer are share one BO, and then only one in
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * buffer_list, but they are linked in psb_cmdbuf_buffer_ref
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buffer_list[i]->rar_handle==0)
6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized  */
6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        do {
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p p = tmp;
6067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp = tmp->next;
6087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            switch (p->status) {
6097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_queued:
6107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                p->status = psb_bs_ready;
6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_abandoned:
6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_buffer_destroy(p);
6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(p);
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Not supposed to happen */
6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ASSERT(0);
6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
6227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } while (tmp);
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
6267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
6297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...)        psb__trace_message(fmt, ##arg)
6317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DB(fmt, arg1, arg...)        psb__trace_message("[%08x] %08x = " fmt, ((void *) arg1) - cmd_start, *arg1, ##arg)
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes)
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t);
6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *cmd_end = cmd_idx + cmd_size;
6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    void *cmd_start = cmd_idx;
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct {
640437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int start;
641437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int end;
642437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        char *name;
643437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } msvdx_regs[10] = {{0x04800000,0x048003FF,"MTX_MTX"},
644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800400,0x0480047F,"VDMC_MTX"},
645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800480,0x048004FF,"VDEB_MTX"},
646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800500,0x048005FF,"DMAC_MTX"},
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800600,0x048006FF,"SYS_MTX"},
648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800700,0x048007FF,"VEC_IQRAM_MTX"},
649437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04800800,0x04800FFF,"VEC_MTX"},
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04801000,0x04801FFF,"CMD_MTX"},
651437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04802000,0x04802FFF,"VEC_RAM_MTX"},
652437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      {0x04803000,0x04804FFF,"VEC_VLC_M"}
653437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    };
654437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size);
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangwhile(cmd_idx < cmd_end)
6577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = *cmd_idx;
6597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* What about CMD_MAGIC_BEGIN ?*/
6607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    switch(cmd & CMD_MASK)
6617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
662437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      case CMD_NOP:
663437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      {
664437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          DB("CMD_NOPE\n", cmd_idx);
665437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          cmd_idx++;
666437b3eda28a4bf098efa80598cab67f190275266Fei Jiang          break;
667437b3eda28a4bf098efa80598cab67f190275266Fei Jiang      }
668437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_HEADER:
6707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
6717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK;
6727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_HEADER context = %08x\n", cmd_idx, context);
6737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("StatusBufferAddress\n", cmd_idx);
6757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("PreloadSave\n", cmd_idx);
6777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("PreloadRestore\n", cmd_idx);
6797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
6817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
6827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_REGVALPAIR_WRITE:
6837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT;
6857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count);
6867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
6877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          while(count--)
6897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              int i;
691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              for (i=0; i<10; i++) {
692437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                  if ((*cmd_idx >= msvdx_regs[i].start) &&
693437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      (*cmd_idx <= msvdx_regs[i].end))
694437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                      break;
695437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              }
696437b3eda28a4bf098efa80598cab67f190275266Fei Jiang              DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff);
6977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
6987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("value\n", cmd_idx);
6997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_RENDEC_WRITE:
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t encoding;
7067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT;
7077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count);
7087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("RENDEC_SL_HDR\n", cmd_idx);
7117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("RENDEC_SL_NULL\n", cmd_idx);
7147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          do
7177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              uint32_t chk_hdr = *cmd_idx;
7197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              count = 1 + ((chk_hdr & 0x07FF0000) >> 16);
7207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4;
7217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              encoding = (chk_hdr & 0x07);
7227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              if ((count == 1) && (encoding == 7))
7237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  count = 0;
7257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("SLICE_SEPARATOR\n", cmd_idx);
7267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              }
7277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              else
7287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding);
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              while(count && (count < 0x1000))
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              {
7357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  DB("value\n", cmd_idx);
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  cmd_idx++;
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                  count -= 2;
7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              }
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        while (encoding != 0x07);
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_COMPLETION:
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          if (*cmd_idx == PSB_RELOC_MAGIC)
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          else
7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_COMPLETION\n", cmd_idx);
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              DB("interrupt\n", cmd_idx);
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              cmd_idx++;
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_LLDMA:
7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_LLDMA\n", cmd_idx);
7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_SLLDMA:
7707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_SLLDMA\n", cmd_idx);
7727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      case CMD_SR_SETUP:
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      {
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("CMD_SR_SETUP\n", cmd_idx);
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("offset in bits\n", cmd_idx);
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          DB("size in bytes\n", cmd_idx);
7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          cmd_idx++;
7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      }
7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang      default:
7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          if (*cmd_idx == PSB_RELOC_MAGIC)
7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          else
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          {
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              DB("*** Unknown command ***\n", cmd_idx);
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang              cmd_idx++;
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          }
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang          break;
7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } /* switch */
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} /* while */
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence)
8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmFenceUnreference(&pFence);
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject *
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_fence_wait(psb_driver_data_p driver_data,
8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang               struct psb_ttm_fence_rep *fence_rep, int *status)
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence = NULL;
8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = -1;
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* copy fence information */
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence_rep->error != 0) {
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("drm failed to create a fence"
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           " and has idled the HW\n");
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            fence_rep->fence_type,
8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            (void *)fence_rep->handle,
8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            0);
8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence)
8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *status = wsbmFenceFinish(fence,fence_rep->fence_type,0);
8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return fence;
8357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT];
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT];
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count;
8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count;
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start;
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DUMP_COUNT 	20
8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT];
8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT];
8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_offset[MAX_DUMP_COUNT];
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_size[MAX_DUMP_COUNT];
8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_count = 0;
8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from);
8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from);
8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from)
8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (bit_to < 31)
8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        val &= ~(0xffffffff << (bit_to+1));
8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = val >> bit_from;
8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(fmt, val);
8647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0;
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size)
8697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (offset + size > 8)
8717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size = 8 - offset;
8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("[%04x]", g_hexdump_offset);
8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += offset;
8747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += size;
8757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( offset-- > 0)
8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" --");
8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( size-- > 0)
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" %02x", *p++);
8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("\n");
8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump(void *addr, int size)
8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned char *p = (unsigned char *) addr;
8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int offset = g_hexdump_offset % 8;
8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset -= offset;
8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (offset)
8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__hexdump2(p, offset, size);
8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8 - offset;
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8 - offset;
8977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( 1 )
9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (size < 8)
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
9037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (size > 0)
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            {
9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__hexdump2(p, 0, size);
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]);
9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8;
9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8;
9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset += 8;
9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size)
9177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(debug_dump_count < MAX_DUMP_COUNT);
9197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_name[debug_dump_count] = name;
9207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_buf[debug_dump_count] = buf;
9217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_offset[debug_dump_count] = offset;
9227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_size[debug_dump_count] = size;
9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count++;
9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
9277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
9307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment
9317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
9327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_close_segment( psb_cmdbuf_p cmdbuf )
9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bytes_used = ((void *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE;
9357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    void *segment_start = (void *) cmdbuf->cmd_idx - bytes_used;
9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
9377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */,
9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          bytes_used,
9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          0 /* destination offset */,
9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                          LLDMA_TYPE_RENDER_BUFF_MC);
9417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = CMD_NEXT_SEG;
9427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_SHIFT4( *cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf));
9437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(cmdbuf->last_next_segment_cmd+1) = bytes_used;
9447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
946437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_deblock( object_context_p obj_context )
9477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = FW_DXVA_DEBLOCK_SIZE;
9507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *msg = cmdbuf->MTX_msg;
9517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DEBLOCKPARAMS* pdbParams;
9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("Send two pass deblock cmd\n");
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if(cmdbuf->cmd_count) {
9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("two pass deblock cmdbuf has render msg!\n");
9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	return 1;
9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count++;
9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */
9637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_DEBLOCK);
9647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
9667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_FLAGS, FW_DXVA_RENDER_HOST_INT );
9677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams = (DEBLOCKPARAMS*) (msg + 16 / sizeof(uint32_t));
9697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf));
971437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */
9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->buffer_size = cmdbuf->regio_size;
9737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->ctxid = obj_context->msvdx_context;
9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
9767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
979437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_context_submit_oold( object_context_p obj_context,
980437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p src_buf,
981437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p dst_buf,
982437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               psb_buffer_p colocate_buffer,
983437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t picture_width_in_mb,
984437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t frame_height_in_mb,
985437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t field_type,
986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                               uint32_t chroma_offset )
987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
989437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t msg_size = FW_DXVA_OOLD_SIZE;
990437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE;
991437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    FW_DXVA_OOLD_MSG *oold_msg;
992437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
993437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("Send out of loop deblock cmd\n");
994437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
995437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count++;
996437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(msg, 0, msg_size);
997437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    oold_msg = (FW_DXVA_OOLD_MSG *) msg;
998437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_DXVA_OOLD_SIZE);
1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DXVA_MSGID_OOLD);
1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_OPERATING_MODE, obj_context->operating_mode);
1004437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb);
1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb);
1006437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1007437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf);
1008437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf);
1009437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf);
1010437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf);
1011437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1012437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer);
1013437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1014437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_OOLD_SLICE_FIELD_TYPE, field_type);
1015437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1016437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
1017437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1018437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
10197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
10207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf
10217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
10227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
10237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
10247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_submit_cmdbuf( object_context_p obj_context )
10257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
10277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmdbuffer_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes
10287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->last_next_segment_cmd)
10307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
10317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuffer_size = cmdbuf->first_segment_size;
10327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_close_segment( cmdbuf );
10337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = FW_DXVA_RENDER_SIZE;
10367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DXVA_RENDER_SIZE;
10377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
10397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base;
10407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_size[cmdbuf->cmd_count] = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
10417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_count = cmdbuf->cmd_count+1;
10427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
10437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count++;
10457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
10467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case.
10487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
10497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((void *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
10507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE,                  FW_DXVA_RENDER_SIZE);
10527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID,                    DXVA_MSGID_RENDER);
10537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Need to make context more unique */
10547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_CONTEXT,            obj_context->msvdx_context );
10557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Point to CMDBUFFER */
10577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
10587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                            &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */,
10597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                            cmdbuffer_size,
10607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                            0 /* destination offset */,
10617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                            (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC);
10627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* This is the last relocation */
10637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_MSG( *(msg + (FW_DXVA_RENDER_LLDMA_ADDRESS_OFFSET/sizeof(uint32_t))),
10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang               lldma_record_offset, &(cmdbuf->buf));
10657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE,          cmdbuffer_size); // In bytes
10677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE,       obj_context->operating_mode);
10687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME,     obj_context->last_mb);
10697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE,    obj_context->first_mb);
10707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS,                obj_context->flags);
10717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
10737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList);
10747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base;
10757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Indicate last LLDMA record (for debugging) */
10767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ((uint32_t *)cmdbuf->lldma_idx)[1] = 0;
10777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
10787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_idx;
10807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
10827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return psb_context_flush_cmdbuf( obj_context );
10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) ||
10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (MTXMSG_END(cmdbuf) - (void *) msg < MTXMSG_MARGIN) ||
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (CMD_END(cmdbuf) - (void *) cmdbuf->cmd_idx < CMD_MARGIN) ||
10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) ||
10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (RELOC_END(cmdbuf) - (void *) cmdbuf->reloc_idx < RELOC_MARGIN))
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return psb_context_flush_cmdbuf( obj_context );
10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_context_flush_cmdbuf( object_context_p obj_context )
11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
11017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
11037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int fence_flags;
1104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* unsigned int fence_handle = 0; */
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_ttm_fence_rep fence_rep;
11067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_offset;
11077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int num_relocs;
11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((NULL == cmdbuf) || ((0 == cmdbuf->cmd_count) && (0 == cmdbuf->deblock_count)))
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
11127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0; // Nothing to do
11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = 0;
11167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *msg = cmdbuf->MTX_msg;
11177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
11187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LOCK */
11207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
11217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
11227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
11237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
11247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
11257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
11267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 1; i <= cmdbuf->cmd_count; i++)
11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t flags = MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS);
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update flags */
1133437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        int bBatchEnd = (i == cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count);
11347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        flags |=
11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (bBatchEnd ? (FW_DXVA_RENDER_HOST_INT | FW_DXVA_LAST_SLICE_OF_EXT_DMA)    : FW_DXVA_RENDER_NO_RESPONCE_MSG) |
11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (obj_context->video_op == psb_video_vld    ? FW_DXVA_RENDER_IS_VLD_NOT_MC : 0);
11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	if( i == cmdbuf->cmd_count )
11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            flags |= FW_DXVA_LAST_SLICE_OF_EXT_DMA;
11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* VXD385 DDK406 not use FW_DXVA_LAST_SLICE_OF_EXT_DMA, this flags should be cleaned later */
1143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if(IS_MFLD(driver_data))
1144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            flags &= ~FW_DXVA_LAST_SLICE_OF_EXT_DMA;
1145437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        MEMIO_WRITE_FIELD(msg, FW_DXVA_RENDER_FLAGS, flags);
11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) );
11507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) );
11517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) );
11527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) );
11537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) );
11547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_BUFFER_SIZE) );
11567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_OPERATING_MODE) );
11577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_LAST_MB_IN_FRAME) );
11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FIRST_MB_IN_SLICE) );
11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DXVA_RENDER_FLAGS) );
11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0  /* todo */
11637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update SAREA */
11647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context;
11657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        msg += FW_DXVA_RENDER_SIZE / sizeof(uint32_t);
11687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        msg_size += FW_DXVA_RENDER_SIZE;
11697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Assume deblock message is following render messages and no more render message behand deblock message */
11727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 1; i <= cmdbuf->deblock_count; i++)
11737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
11747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        msg_size += FW_DXVA_DEBLOCK_SIZE;
11757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for(i = 1; i <= cmdbuf->oold_count; i++)
1178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    {
1179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        msg_size += FW_DXVA_OOLD_SIZE;
1180437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
11817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Now calculate the total number of relocations */
11827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg;
11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    num_relocs = (((void *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE);
11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n",  (void *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE);
11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE);
11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE);
11907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_unmap( cmdbuf );
11937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(NULL); /* Flush trace */
11967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( NULL == cmdbuf->MTX_msg );
11997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( NULL == cmdbuf->reloc_base );
12007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
12027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = 0;
12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = DRM_PSB_FENCE_NO_USER;
12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cmdbuf will be validated as part of the buffer list */
12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Submit */
12097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1
12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteLockKernelBO();
12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset,cmdbuf->buffer_refs,
12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    cmdbuf->buffer_refs_count,
12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
12147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    0, msg_size,
12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    reloc_offset, num_relocs,
12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang		    0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep);
12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteUnlockKernelBO();
12197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    UNLOCK_HARDWARE(driver_data);
12207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
12217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = 1;
12227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
12237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret)
12247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = NULL;
12267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->slice_count++;
12277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int error_count = 0;
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int status = 0;
12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence=NULL;
12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = psb_fence_wait(driver_data, &fence_rep, &status);
12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n",status, fence);
12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_buffer_map( &cmdbuf->buf, &cmdbuf->cmd_base );
1243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_map( &cmdbuf->reloc_buf, &cmdbuf->MTX_msg );
12447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (getenv("PSB_VIDEO_TRACE_LLDMA")) {
1246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__trace_message("lldma_count = %d, vitual=0x%08x\n",
1247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                           debug_lldma_count,  wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE);
1248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        for(i = 0; i < debug_lldma_count; i++)
1249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        {
1250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) (cmdbuf->cmd_base + debug_lldma_start);
1251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pasDmaList += i;
1252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base);
1254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, BSWAP,    31, 31)
1255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, DIR,    30, 30)
1256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, PW,    29, 28)
1257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_FIN, 31, 31)
1258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_INT, 30, 30)
1259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, PI,    18, 17)
1260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, INCR,    16, 16)
1261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, LEN,    15, 0)
1262437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(2, ADDR,    22, 0)
1263437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, ACC_DEL,    31, 29)
1264437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, BURST,    28, 26)
1265437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(3, EXT_SA,    3, 0)
1266437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, 2D_MODE,    16, 16)
1267437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, REP_COUNT, 10, 0)
1268437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(5, LINE_ADD_OFF, 25, 16)
1269437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(5, ROW_LENGTH, 9, 0)
1270437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(6, SA, 31, 0)
1271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(7, LISTPTR, 27, 0)
1272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
12737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("debug_dump_count = %d\n", debug_dump_count);
12787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for(i = 0; i < debug_dump_count; i++)
12797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        void *buf_addr;
12817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]);
1282437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (debug_dump_buf[i]->rar_handle
1283437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            || (psb_buffer_map( debug_dump_buf[i], &buf_addr) != 0)) {
1284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("Unmappable buffer,e.g. RAR buffer\n");
1285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            continue;
1286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
12887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset = 0;
12897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__hexdump( buf_addr + debug_dump_offset[i], debug_dump_size[i]);
12907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_unmap( debug_dump_buf[i] );
12917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count = 0;
12937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1294437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__trace_message("cmd_count = %d, virtual=0x%08x\n",
1295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    		       debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf));
1296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    for(i = 0; i < debug_cmd_count; i++)
1297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    {
1298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	uint32_t *msg = cmdbuf->MTX_msg + i * FW_DXVA_RENDER_SIZE;
1299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	int j;
1300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]);
1301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        debug_dump_cmdbuf( (uint32_t *) (cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i] );
1302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	for (j=0; j<FW_DXVA_RENDER_SIZE/4; j++)
1304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("MTX msg[%d] = 0x%08x\n", j, *(msg+j));
1305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1306437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap( &cmdbuf->buf );
1307437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_unmap( &cmdbuf->reloc_buf);
1308437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
1310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
13117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (status)
13127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
13137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status);
13147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        error_count++;
13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	ASSERT(status != 2);
13167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(error_count < 40); /* Exit on 40 errors */
13177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence)
13197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_fence_destroy(fence);
13207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf = NULL;
13237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->slice_count++;
13247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
13277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum {
13307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP0 = 0,
13317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP1 = 1,
13327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP;
13337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum    {
13357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HOST_TO_MSVDX = 0,
13367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MSXDX_TO_HOST = 1,
13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION;
13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct {
13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	IMG_UINT32 ui32DevDestAddr ;	/* destination address */
13417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePW	ePeripheralWidth;
13427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePeriphIncrSize	ePeriphIncrSize;
13437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_ePeriphIncr	ePeriphIncr;
13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	IMG_BOOL		bSynchronous;
13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	MMU_GROUP		eMMUGroup;
13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_DIRECTION	eDMADir;
13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	DMA_eBurst		eDMA_eBurst;
13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP;
13497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] =
13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/* LLDMA_TYPE_VLC_TABLE */ { 	REG_MSVDX_VEC_VLC_OFFSET  ,
13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_16_BIT,	/* 16 bit wide data*/
13557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,	/* Incrament the dest by 32 bits */
13567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
13577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
13587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
13597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
13607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2
13617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/* LLDMA_TYPE_BITSTREAM */ {
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET  ),
13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_8_BIT,
13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
13677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_FALSE,
13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_4
13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RESIDUAL*/		{
13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET),
13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
13757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
13777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_FALSE,
13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
13797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2
13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
13827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RENDER_BUFF_MC*/{
13847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
13857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
13867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
13877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
13887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
13897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
13907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
13917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
13927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
13937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_RENDER_BUFF_VLD*/{
13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
13957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{
14047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_VEC_RAM_OFFSET + 0x700 ),
14057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,
14077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
14087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
14097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
14107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
14117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2		 /* From VLR */
14127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{
14147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_VEC_RAM_OFFSET + 0x700 ),
14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_4,
14177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_ON,
14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,
14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP0,
14207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_2		/* Into VLR */
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_H264_PRELOAD_SAVE*/{
14247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
14257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* From MTX */
14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{
14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
14387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
14397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
14407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
14417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
14427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{
14447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
14457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
14487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MSXDX_TO_HOST,
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		//2	/* From MTX */
14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
14537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang	/*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									(REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET ),
14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PWIDTH_32_BIT,
14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_1,
14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_PERIPH_INCR_OFF,
14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									IMG_TRUE,	/* na */
14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									MMU_GROUP1,
14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									HOST_TO_MSVDX,
14617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang									DMA_BURST_1		/* Into MTX */
14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang								},
1463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	/*LLDMA_TYPE_IDCT_INSERTION*/{
1464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									(REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_DIRECT_MODE_DATA0_OFFSET ),
1465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PWIDTH_32_BIT,
1466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_1,
1467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_OFF,
1468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									IMG_FALSE,
1469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									MMU_GROUP1,
1470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									HOST_TO_MSVDX,
1471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_BURST_4
1472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang								},
1473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	/*LLDMA_TYPE_RENDER_BUFF_ALTERNATE */
1474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang	 {
1475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									( REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET  ),
1476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PWIDTH_8_BIT,
1477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_1,
1478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_PERIPH_INCR_OFF,
1479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									IMG_FALSE,
1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									MMU_GROUP0,
1481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									HOST_TO_MSVDX,
1482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang									DMA_BURST_4
1483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang								},
14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN     ( 0xffff )
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_cmdbuf( psb_cmdbuf_p cmdbuf,
14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++;
14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size,
14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                dest_offset, cmd);
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_lldma_create( psb_cmdbuf_p cmdbuf,
15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = (((void*)cmdbuf->lldma_idx) - ((void *) cmdbuf->cmd_base));
15097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size,
15107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                dest_offset, cmd);
15117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return lldma_record_offset;
15127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
15137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
15157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
15167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream( psb_cmdbuf_p cmdbuf,
15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p bitstream_buf,
15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t buffer_offset,
15207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t size_in_bytes,
15217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t offset_in_bits,
15227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t flags)
15237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
15247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
15257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * We use byte alignment instead of 32bit alignment.
15267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The third frame of sa10164.vc1 results in the following bitstream
15277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * patttern:
15287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * [0000] 00 00 03 01 76 dc 04 8d
15297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * with offset_in_bits = 0x1e
15307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This causes an ENTDEC failure because 00 00 03 is a start code
15317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * By byte aligning the datastream the start code will be eliminated.
15327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
15337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
15347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
15357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define ALIGNMENT	 sizeof(uint8_t)
15367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bs_offset_in_dwords    = ((offset_in_bits /8) / ALIGNMENT);
15377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
15387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
15397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
15407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
15417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
15437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = offset_in_bits;
15447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
15457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = size_in_bytes;
15467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_write_cmdbuf( cmdbuf, bitstream_buf, buffer_offset,
15487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            size_in_bytes, 0, LLDMA_TYPE_BITSTREAM );
15497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1551437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes);
15527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
15537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
15547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
15567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one
15577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
15587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_lldma_write_bitstream_chained( psb_cmdbuf_p cmdbuf,
15597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p bitstream_buf,
15607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t size_in_bytes)
15617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
15627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last;
15637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create( cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs,
15647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            size_in_bytes, 0, LLDMA_TYPE_BITSTREAM );
15657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Update WD7 of last LLDMA record to point to this one */
15667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf));
15677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* This touches WD1 */
15687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
15697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes);
15727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
15737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
15757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
15767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb_cmdbuf_lldma_create_internal( psb_cmdbuf_p cmdbuf,
15787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                 LLDMA_CMD *pLLDMACmd,
15797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
15807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
15817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
15827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
15837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
15847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
15857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    const DMA_DETAIL_LOOKUP* pDmaDetail;
15867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd;
15877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList;
15887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    static IMG_UINT32 lu[] = {4,2,1};
15897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* See if we will fit */
15917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( cmdbuf->lldma_idx + sizeof( DMA_sLinkedList ) < LLDMA_END(cmdbuf) );
15927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pDmaDetail = &DmaDetailLookUp[cmd];
15947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth];
15967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* DMA list must be 16byte alligned if it is done in Hw */
15987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pasDmaList = (DMA_sLinkedList*) (cmdbuf->lldma_idx) ;
15997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f );
16007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Offset of LLDMA record in cmdbuf */
16027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) -((IMG_UINT8*) cmdbuf->cmd_base));
16037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT( 0 == (ui32LLDMA_Offset&0xf) );
16057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset;
16077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write the header */
16097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (pLLDMACmd)
16107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
16117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA );
16127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf));
16137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
16147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    while( ui32DMACount )
16167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
16177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        memset( pasDmaList , 0 ,sizeof(DMA_sLinkedList) );
16187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr );
16207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* DMA_LL_SET_WD6 with relocation */
16227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(DMAC_LL_SA_SHIFT == 0);
16237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf);
16257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if( ui32DMACount > MAX_DMA_LEN )
16277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
16287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32LLDMA_Offset+=sizeof(DMA_sLinkedList);
16297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* DMA_LL_SET_WD7 with relocation */
16317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(DMAC_LL_LISTPTR_SHIFT == 0);
16327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf));
16337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This touches WD1 */
16347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
16357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN );    /* size */
16377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32DMACount-= MAX_DMA_LEN;
16397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if(  pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON )
16417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            {
16427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Update Destination pointers */
16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ui32DMADestAddr += ((MAX_DMA_LEN)* lu[pDmaDetail->ePeriphIncrSize] );
16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Update Source Pointer */
16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            buffer_offset += ((MAX_DMA_LEN)*lu[pDmaDetail->ePeripheralWidth]);
16487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
16497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        else
16507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        {
16517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This also set LIST_FIN in WD1 to 1*/
16527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD7(pasDmaList, IMG_NULL);                // next linked list
16537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD1(pasDmaList,pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount );    /* size */
16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ui32DMACount =0;
16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
16577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Keep pointer in case we need to chain another LLDMA command */
16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->lldma_last = (void *) pasDmaList;
16607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP,
16627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            (pDmaDetail->eDMADir==HOST_TO_MSVDX)?DMA_DIR_MEM_TO_PERIPH:DMA_DIR_PERIPH_TO_MEM ,
16637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            pDmaDetail->ePeripheralWidth);
16647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup );
16667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0);    // 2d
16677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD5(pasDmaList, 0, 0);                    // 2d
16687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pasDmaList++;
16717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
16727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* there can be up to 3 Bytes of padding after header */
16747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx    = (void *)pasDmaList;
16757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers
16807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
16817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_start_block( psb_cmdbuf_p cmdbuf )
16827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
16847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = cmdbuf->cmd_idx++;
16867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_set_address( psb_cmdbuf_p cmdbuf,
16897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t reg,
16907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p buffer,
16917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset )
16927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = reg;
16947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
16957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
16987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers
16997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_reg_end_block( psb_cmdbuf_p cmdbuf )
17017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2;
17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | reg_count;
17057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum
17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_CTRL_HEADER = 0,
17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_HDR,
17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_NULL,
17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_CK_HDR,
17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS;
17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
17177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block
17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_block( psb_cmdbuf_p cmdbuf )
17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = cmdbuf->cmd_idx;
17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0;
17257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO,      1);
17267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD,   3);
17277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1);
17287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */
17307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += RENDEC_CK_HDR;
17327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
17357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block
17367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_start_chunk( psb_cmdbuf_p cmdbuf, uint32_t dest_address )
17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */
17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->rendec_chunk_start = 0;
17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3);
17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, ( dest_address >> 2));
17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_block( psb_cmdbuf_p cmdbuf,
17487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                    unsigned char *block,
17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                    uint32_t size )
17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((size & 0x3) == 0);
17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    for( i = 0; i < size; i += 4)
17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24);
17567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_rendec_write( cmdbuf, val );
17577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
17587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_write_address( psb_cmdbuf_p cmdbuf,
17617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p buffer,
17627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t buffer_offset )
17637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
17657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
17687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk
17697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_chunk( psb_cmdbuf_p cmdbuf )
17717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
17737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
17747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1;
17757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE (*cmdbuf->rendec_chunk_start,
17777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                RENDEC_SLICE_INFO,
17787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                CK_HDR,
17797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                CK_NUM_SYMBOLS_LESS1,
17807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                (2 * dword_count) - 1);        /* Number of 16-bit symbols, minus 1.*/
17817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
17837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
17867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block
17877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
17887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_rendec_end_block( psb_cmdbuf_p cmdbuf )
17897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
17917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */
17927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start;  /* Include separator but not mtx block header*/
17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write separator (footer-type thing)    */
17967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0;
17977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD( *cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7);
17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx++;
17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write CMD Header    */
18017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size;
18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment
18087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t psb_cmdbuf_segment_space( psb_cmdbuf_p cmdbuf )
18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t bytes_used = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t);
18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment
18177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_next_segment( psb_cmdbuf_p cmdbuf )
18197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *next_segment_cmd = cmdbuf->cmd_idx;
18217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += 2;
18227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t words_free = psb_cmdbuf_segment_space( cmdbuf );
18237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (cmdbuf->last_next_segment_cmd)
18257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
18267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_close_segment( cmdbuf );
18277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
18287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    else
18297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    {
18307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->first_segment_size = (void *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
18317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
18327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */
18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = next_segment_cmd;
18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block
18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_start_block( psb_cmdbuf_p cmdbuf, uint32_t skip_condition )
18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */
18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */
18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/
18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_condition = skip_condition;
18487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = cmdbuf->cmd_idx++;
18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
18527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block
18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
18547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb_cmdbuf_skip_end_block( psb_cmdbuf_p cmdbuf )
18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */
18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */
18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */
18597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1);
18617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20 ) | block_size;
18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
18647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1865