psb_cmdbuf.c revision 680952832ef474a95bb0c4fee50c06e5126ad66d
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a
6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the
7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including
8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish,
9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to
10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to
11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions:
123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the
14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions
15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software.
163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang *
17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors:
26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *    Waldo Bastian <waldo.bastian@intel.com>
27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_cmdbuf.h"
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdio.h>
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/mem_io.h"
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_offsets.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dma_api.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/reg_io2.h"
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vec_reg_io2.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_vdmc_reg_io2.h"
427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_mtx_reg_io2.h"
437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_dmac_linked_list.h"
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_rendec_mtx_slice_cntrl_reg_io2.h"
457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_cmdseq_msg.h"
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_fw_ctrl.h"
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/fwrk_msg_mem_io.h"
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/dxva_msg.h"
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "hwdefs/msvdx_cmds_io2.h"
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <string.h>
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <sys/time.h>
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h"
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h>
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h>
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h>
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout:
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         cmd_base <= cmd_idx < CMD_END() == lldma_base
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size)
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout:
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size)
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf)    (cmdbuf->reloc_base)
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf)     (cmdbuf->MTX_msg + cmdbuf->reloc_size)
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf)       (cmdbuf->lldma_base)
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf)     (cmdbuf->cmd_base + cmdbuf->size)
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE           (0x1000)
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE            (0x3000)
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE              (0x3000)
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE            (0x2000)
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN         (0x0040)
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN          (0x0800)
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN            (0x0400)
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN          (0x0400)
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_CMD_COUNT         12
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTX_SEG_SIZE          (0x0800)
957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define PSB_TIMEOUT_USEC 990000
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_lldma_create_internal(psb_cmdbuf_p cmdbuf,
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        LLDMA_CMD *pLLDMACmd,
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p bitstream_buf,
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t buffer_offset,
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t size,
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t dest_offset,
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        LLDMA_TYPE cmd);
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data,
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_cmdbuf_p cmdbuf
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int size = CMD_SIZE + LLDMA_SIZE;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE;
116bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->size = 0;
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_size = 0;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_size = 0;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_base = NULL;
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_idx = NULL;
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_allocated = 10;
1382befccec034c13d34746a9e87149889d59ac767bFei Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == cmdbuf->buffer_refs) {
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf);
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = size;
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf);
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = reloc_size;
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        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
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_destroy(cmdbuf);
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf)
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->size) {
168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->buf);
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = 0;
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->reloc_size) {
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->reloc_buf);
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = 0;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->regio_size) {
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->regio_buf);
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = 0;
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->buffer_refs_allocated) {
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(cmdbuf->buffer_refs);
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs = NULL;
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf)
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count = 0;
208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count = 0;
209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->host_be_opp_count = 0;
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->frame_info_count = 0;
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(&cmdbuf->buf);
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE;
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = cmdbuf->lldma_base;
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE;
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Add ourselves to the buffer list */
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf)
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = NULL;
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->buf);
255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->reloc_buf);
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream
2627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf)
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int item_loc = 0;
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    // buf->next = NULL; /* buf->next only used for buffer list validation */
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while ((item_loc < cmdbuf->buffer_refs_count)
272bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang           && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
273bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) {
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        item_loc++;
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (item_loc == cmdbuf->buffer_refs_count) {
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Add new entry */
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (item_loc >= cmdbuf->buffer_refs_allocated) {
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Allocate more entries */
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            int new_size = cmdbuf->buffer_refs_allocated + 10;
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_p *new_array;
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == new_array) {
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return -1; /* Allocation failure */
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(cmdbuf->buffer_refs);
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs_allocated = new_size;
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs = new_array;
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs[item_loc] = buf;
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs_count++;
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->status = psb_bs_queued;
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->next = NULL;
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* only for RAR buffers */
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((cmdbuf->buffer_refs[item_loc] != buf)
300bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        && (buf->rar_handle != 0)) {
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc];
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("RAR: found same drm buffer with different psb buffer, link them\n",
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 tmp, buf);
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while ((tmp->next != NULL)) {
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = tmp->next;
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (tmp == buf) /* found same buffer */
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (tmp != buf) {
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp->next = buf; /* link it */
312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->status = psb_bs_queued;
313dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->next = NULL;
314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("RAR: buffer aleady in the list, skip\n",
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     tmp, buf);
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return item_loc;
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf"
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer"
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift".
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background".
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf,
332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t *addr_in_cmdbuf,
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_buffer_p ref_buffer,
334dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t buf_offset,
335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t mask,
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t background,
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t align_shift,
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check that address is within buffer range */
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (dst_buffer) {
345e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base);
346e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf));
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
349e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg);
350e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf));
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
354dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer);
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(reloc->buffer != -1);
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
360437b3eda28a4bf098efa80598cab67f190275266Fei 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);
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (presumed_offset) {
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t new_val =  presumed_offset + buf_offset;
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = (background & ~mask) | (new_val & mask);
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = new_val;
368dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = PSB_RELOC_MAGIC;
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->mask = mask;
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->pre_add =  buf_offset;
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->background = background;
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->dst_buffer = dst_buffer;
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx++;
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
379e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf));
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context)
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf;
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf) {
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf_current++;
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) {
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf_current = 0;
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current];
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_cmdbuf_reset(cmdbuf);
402dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ret) {
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Success */
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = cmdbuf;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then)
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    long long val;
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = now->tv_sec - then->tv_sec;
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val *= 1000000LL;
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val += now->tv_usec;
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val -= then->tv_usec;
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (val < 1LL)
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        val = 1LL;
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (unsigned) val;
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1).
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned numRelocs, drm_clip_rect_t * clipRects, int damage,
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg)
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drm_psb_cmdbuf_arg_t ca;
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_validate_arg *arg_list;
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int i;
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct timeval then, now;
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool have_then = FALSE;
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (arg_list == NULL) {
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("Malloc failed \n");
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -ENOMEM;
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_req *req = &arg->d.req;
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->next = (unsigned long) & (arg_list[i+1]);
461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
4637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->group = 0;
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_flags = PSB_USE_PRESUMED;
4694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        req->pad64 = (uint32_t)buffer_list[i]->pl_flags;
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list[buffer_count-1].d.req.next = 0;
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
4747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.clip_rects = (uint64_t)((unsigned long)clipRects);
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.fence_arg = (uint64_t)((unsigned long)fence_arg);
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_handle = 0;
4797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_offset = 0;
4807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.oom_size = 0;
481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_handle = cmdBufHandle;
4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_offset = cmdBufOffset;
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_size = cmdBufSize;
485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_handle = relocBufHandle;
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_offset = relocBufOffset;
4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.num_relocs = numRelocs;
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_flags = fence_flags;
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.engine = engine;
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
493bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0
494dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: buffer_list   = %08x\n", ca.buffer_list);
495dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: clip_rects    = %08x\n", ca.clip_rects);
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle);
497dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset);
498dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: cmdbuf_size   = %08x\n", ca.cmdbuf_size);
499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: reloc_handle  = %08x\n", ca.reloc_handle);
500dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: reloc_offset  = %08x\n", ca.reloc_offset);
501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: num_relocs    = %08x\n", ca.num_relocs);
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: engine        = %08x\n", ca.engine);
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("PSB submit: fence_flags   = %08x\n", ca.fence_flags);
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
5077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * X server Signals will clobber the kernel time out mechanism.
5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * we need a user-space timeout as well.
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    do {
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (ret == EAGAIN) {
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (!have_then) {
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (gettimeofday(&then, NULL)) {
5157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    psb__error_message("Gettimeofday error.\n");
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
518dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                have_then = TRUE;
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (gettimeofday(&now, NULL)) {
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__error_message("Gettimeofday error.\n");
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC));
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("command write return is %d\n", ret);
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        goto out;
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_rep *rep = &arg->d.rep;
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!arg->handled) {
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = -EFAULT;
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (arg->ret != 0) {
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = arg->ret;
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout:
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(arg_list);
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Buffer no longer queued in userspace
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p tmp = buffer_list[i];
557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * RAR slice buffer/surface buffer are share one BO, and then only one in
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * buffer_list, but they are linked in psb_cmdbuf_buffer_ref
561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (buffer_list[i]->rar_handle == 0)
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized  */
565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        do {
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p p = tmp;
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp = tmp->next;
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            switch (p->status) {
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_queued:
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                p->status = psb_bs_ready;
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_abandoned:
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_buffer_destroy(p);
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(p);
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Not supposed to happen */
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ASSERT(0);
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } while (tmp);
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DBH(fmt, arg...)        psb__trace_message(fmt, ##arg)
593e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang#define DB(fmt, arg1, arg...)        psb__trace_message("[%08x] %08x = " fmt, ((unsigned char *) arg1) - cmd_start, *arg1, ##arg)
5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* See also MsvdxGpuSim() in msvdxgpu.c */
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void debug_dump_cmdbuf(uint32_t *cmd_idx, uint32_t cmd_size_in_bytes)
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd_size = cmd_size_in_bytes / sizeof(uint32_t);
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *cmd_end = cmd_idx + cmd_size;
600e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *cmd_start = cmd_idx;
601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct {
602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int start;
603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        unsigned int end;
604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        char *name;
605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } msvdx_regs[10] = {{0x04800000, 0x048003FF, "MTX_MTX"},
606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800400, 0x0480047F, "VDMC_MTX"},
607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800480, 0x048004FF, "VDEB_MTX"},
608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800500, 0x048005FF, "DMAC_MTX"},
609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800600, 0x048006FF, "SYS_MTX"},
610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800700, 0x048007FF, "VEC_IQRAM_MTX"},
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04800800, 0x04800FFF, "VEC_MTX"},
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04801000, 0x04801FFF, "CMD_MTX"},
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04802000, 0x04802FFF, "VEC_RAM_MTX"},
614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        {0x04803000, 0x04804FFF, "VEC_VLC_M"}
615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    };
616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DBH("CMD BUFFER [%08x] - [%08x], %08x bytes, %08x dwords\n", (uint32_t) cmd_idx, cmd_end, cmd_size_in_bytes, cmd_size);
618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (cmd_idx < cmd_end) {
619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t cmd = *cmd_idx;
620dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* What about CMD_MAGIC_BEGIN ?*/
621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (cmd & CMD_MASK) {
622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_NOP: {
623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_NOPE\n", cmd_idx);
624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_HEADER: {
629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            uint32_t context = cmd & CMD_HEADER_CONTEXT_MASK;
630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_HEADER context = %08x\n", cmd_idx, context);
631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("StatusBufferAddress\n", cmd_idx);
633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("PreloadSave\n", cmd_idx);
635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("PreloadRestore\n", cmd_idx);
637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_REGVALPAIR_WRITE: {
641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            uint32_t count = (cmd & CMD_REGVALPAIR_COUNT_MASK) >> CMD_REGVALPAIR_COUNT_SHIFT;
642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_REGVALPAIR_WRITE count = %08x\n", cmd_idx, count);
643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
645dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            while (count--) {
646dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                int i;
647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                for (i = 0; i < 10; i++) {
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    if ((*cmd_idx >= msvdx_regs[i].start) &&
649bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                        (*cmd_idx <= msvdx_regs[i].end))
650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                        break;
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("%s_%04x\n", cmd_idx, msvdx_regs[i].name, *cmd_idx & 0xffff);
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
654dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("value\n", cmd_idx);
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
6567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
6587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_RENDEC_WRITE: {
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            uint32_t encoding;
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            uint32_t count = (cmd & CMD_RENDEC_COUNT_MASK) >> CMD_RENDEC_COUNT_SHIFT;
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_RENDEC_WRITE count = %08x\n", cmd_idx, count);
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("RENDEC_SL_HDR\n", cmd_idx);
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("RENDEC_SL_NULL\n", cmd_idx);
669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            do {
672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                uint32_t chk_hdr = *cmd_idx;
673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                count = 1 + ((chk_hdr & 0x07FF0000) >> 16);
674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                uint32_t start_address = (chk_hdr & 0x0000FFF0) >> 4;
675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                encoding = (chk_hdr & 0x07);
676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if ((count == 1) && (encoding == 7)) {
677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    count = 0;
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    DB("SLICE_SEPARATOR\n", cmd_idx);
679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else {
680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    DB("RENDEC_CK_HDR #symbols = %d address = %08x encoding = %01x\n", cmd_idx, count, start_address, encoding);
681dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
683dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                while (count && (count < 0x1000)) {
685dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    DB("value\n", cmd_idx);
686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    cmd_idx++;
687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
688dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    count -= 2;
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                }
690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } while (encoding != 0x07);
691dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_COMPLETION: {
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (*cmd_idx == PSB_RELOC_MAGIC) {
696dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
699dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("CMD_COMPLETION\n", cmd_idx);
701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
702dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              DB("interrupt\n", cmd_idx);
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//              cmd_idx++;
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_LLDMA: {
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_LLDMA\n", cmd_idx);
710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
713dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_SLLDMA: {
714dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_SLLDMA\n", cmd_idx);
715dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
716dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
718dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case CMD_SR_SETUP: {
719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("CMD_SR_SETUP\n", cmd_idx);
720dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("offset in bits\n", cmd_idx);
722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
723dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DB("size in bytes\n", cmd_idx);
724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmd_idx++;
725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        default:
728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (*cmd_idx == PSB_RELOC_MAGIC) {
729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("CMD_(S)LLDMA (assumed)\n", cmd_idx);
730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else {
733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                DB("*** Unknown command ***\n", cmd_idx);
734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                cmd_idx++;
735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } /* switch */
738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } /* while */
7397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
7417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence)
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmFenceUnreference(&pFence);
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject *
751bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data,
752bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               struct psb_ttm_fence_rep *fence_rep, int *status)
7537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence = NULL;
7567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = -1;
757dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* copy fence information */
7597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence_rep->error != 0) {
7607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("drm failed to create a fence"
7617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           " and has idled the HW\n");
7627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
7637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
7647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
7677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            fence_rep->fence_type,
768e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                            (unsigned char *)fence_rep->handle,
7697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            0);
770dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (fence)
771dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
772dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return fence;
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_start[MAX_CMD_COUNT];
7797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_size[MAX_CMD_COUNT];
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_cmd_count;
7817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_count;
7827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t debug_lldma_start;
7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
784bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define MAX_DUMP_COUNT  20
7857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangconst char * debug_dump_name[MAX_DUMP_COUNT];
7867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangpsb_buffer_p debug_dump_buf[MAX_DUMP_COUNT];
7877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_offset[MAX_DUMP_COUNT];
7887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_size[MAX_DUMP_COUNT];
7897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jianguint32_t     debug_dump_count = 0;
7907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
7917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
7937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DW(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %d\n", to, from);
7947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define DWH(wd, sym, to, from) psb__debug_w(((uint32_t *)pasDmaList)[wd], "LLDMA: " #sym " = %08x\n", to, from);
7957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__debug_w(uint32_t val, char *fmt, uint32_t bit_to, uint32_t bit_from)
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (bit_to < 31) {
798dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        val &= ~(0xffffffff << (bit_to + 1));
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = val >> bit_from;
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(fmt, val);
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic uint32_t g_hexdump_offset = 0;
8057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic void psb__hexdump2(unsigned char *p, int offset, int size)
8077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (offset + size > 8)
8097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size = 8 - offset;
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("[%04x]", g_hexdump_offset);
8117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += offset;
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset += size;
813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (offset-- > 0) {
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" --");
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (size-- > 0) {
8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__trace_message(" %02x", *p++);
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("\n");
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
822e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangstatic void psb__hexdump(unsigned char *addr, int size)
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned char *p = (unsigned char *) addr;
825dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int offset = g_hexdump_offset % 8;
8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    g_hexdump_offset -= offset;
828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (offset) {
8297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__hexdump2(p, offset, size);
8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8 - offset;
8317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8 - offset;
8327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (1) {
835dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (size < 8) {
836dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (size > 0) {
8377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb__hexdump2(p, 0, size);
8387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
8397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            return;
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]);
8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        p += 8;
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        size -= 8;
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset += 8;
8457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangvoid psb__debug_schedule_hexdump(const char *name, psb_buffer_p buf, uint32_t offset, uint32_t size)
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(debug_dump_count < MAX_DUMP_COUNT);
8517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_name[debug_dump_count] = name;
8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_buf[debug_dump_count] = buf;
8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_offset[debug_dump_count] = offset;
8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_size[debug_dump_count] = size;
8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count++;
8567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
8597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
8627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment
8637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p cmdbuf)
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
866e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE;
867e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used;
868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */,
870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   bytes_used,
871dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   0 /* destination offset */,
872dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   LLDMA_TYPE_RENDER_BUFF_MC);
8737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = CMD_NEXT_SEG;
874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf));
875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *(cmdbuf->last_next_segment_cmd + 1) = bytes_used;
8767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
878dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_deblock(object_context_p obj_context)
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
881bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_DEBLOCK_SIZE;
882e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DEBLOCKPARAMS* pdbParams;
8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__information_message("Send two pass deblock cmd\n");
886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->cmd_count) {
8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("two pass deblock cmdbuf has render msg!\n");
888dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 1;
8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count++;
8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */
895bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_DEBLOCK);
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
897bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
898bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_FLAGS, FW_VA_RENDER_HOST_INT);
899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pdbParams = (DEBLOCKPARAMS*)(msg + 16 / sizeof(uint32_t));
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf));
903437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->buffer_size = cmdbuf->regio_size;
905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pdbParams->ctxid = (obj_context->msvdx_context & 0xfff);
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
9087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9104b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */
9114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context,
9124b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_a,
9134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_b,
9144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p colocate_buffer,
9154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t picture_widht_mb,
9164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t frame_height_mb,
9174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t rotation_flags,
918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t field_type,
919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t ext_stride_a,
9204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_a,
9214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_b,
9224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t is_oold)
9234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
9244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
9254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
9264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE;
9274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
9284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    FW_VA_DEBLOCK_MSG *deblock_msg;
9294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
930dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (IS_MFLD(driver_data))
9314b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
9324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
933bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        item_size = FW_VA_RENDER_SIZE;
9344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
935e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count);
9364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
9384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
9394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->header.bits.msg_size = msg_size;
941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (is_oold)
9424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD;
9434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
9444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD;
945bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE;
9464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->flags.bits.slice_type = field_type;
9474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->operating_mode = obj_context->operating_mode;
948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context);
9494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
950dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
9514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->ext_stride_a = ext_stride_a;
9524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->rotation_flags = rotation_flags;
9534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
9554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (buf_b) {
9574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
9584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
9604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer);
9624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->deblock_count++;
9634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return 0;
9644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
9657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_oold(object_context_p obj_context,
967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p src_buf,
968dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p dst_buf,
969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p colocate_buffer,
970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t picture_width_in_mb,
971dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t frame_height_in_mb,
972dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t field_type,
973dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t chroma_offset)
974437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
975437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
976bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_OOLD_SIZE;
977e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE);
978bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    FW_VA_OOLD_MSG *oold_msg;
979437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer) {
981dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__error_message("%s L%d Invalide src_buf, dst_buf or colocate_buffer\n",
982dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           __FUNCTION__, __LINE__);
983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_INVALID_BUFFER;
9842befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
9852befccec034c13d34746a9e87149889d59ac767bFei Jiang
986437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb__information_message("Send out of loop deblock cmd\n");
987437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
988437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count++;
989437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(msg, 0, msg_size);
990bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    oold_msg = (FW_VA_OOLD_MSG *) msg;
991dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
992bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_OOLD_SIZE);
993bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_OOLD);
994bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
995437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
996bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_OPERATING_MODE, obj_context->operating_mode);
997bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb);
998bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb);
999437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1000437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf);
1001437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf);
1002437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf);
1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf);
1004437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1005437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer);
1006437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1007bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_SLICE_FIELD_TYPE, field_type);
1008dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1009dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return 0;
1010dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
1011dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1012dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_host_be_opp(object_context_p obj_context, psb_buffer_p dst_buf,
1013dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t stride, uint32_t size,
1014dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t picture_width_mb,
1015dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t size_mb)
1016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{
1017dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
1018bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_HOST_BE_OPP_SIZE;
1019680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    psb_driver_data_p driver_data = obj_context->driver_data;
1020680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    uint32_t *msg;
1021dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1022e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    if ((NULL == cmdbuf) || (((0 == cmdbuf->cmd_count) && (0 == cmdbuf->host_be_opp_count) &&
1023e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                              (0 == cmdbuf->deblock_count)) || (0 == cmdbuf->frame_info_count))) {
1024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_context_get_next_cmdbuf(obj_context);
1025dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf = obj_context->cmdbuf;
1026dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
1027680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1028680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if (!IS_MFLD(driver_data))
1029680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE +
1030680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang              cmdbuf->oold_count * FW_VA_OOLD_SIZE + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE;
1031680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1032680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        msg = cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_DEVA_DECODE_SIZE +
1033680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang              cmdbuf->oold_count * FW_VA_OOLD_SIZE + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE;
1034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1035bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* psb__information_message("Send host be opp cmd\n"); */
1036dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1037dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->host_be_opp_count++;
1038dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    memset(msg, 0, msg_size);
1039dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1040680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_HOST_BE_OPP_SIZE);
1041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, DAVA_MSGID_HOST_BE_OPP);
1042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1043680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if (!IS_MFLD(driver_data)) {
1044680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_CONTEXT, ((obj_context->msvdx_context >> 8) | 0x1));
1045680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    } else {
1046680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* context is 8 bits on MFLD DDK3.0 */
1047680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_CONTEXT, (obj_context->msvdx_context));
1048680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1049bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_HOST_BE_OPP_FLAGS, FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY);
1050dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1051dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return 0;
1052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1054dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_frame_info(object_context_p obj_context, psb_buffer_p dst_buf,
1055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t stride, uint32_t size,
1056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t picture_width_mb,
1057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t size_mb)
1058dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun{
1059dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    FRAME_INFO_PARAMS* frame_info;
1060dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
1061bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_FRAME_INFO_SIZE;
1062dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1063e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1065bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* psb__information_message("Send frame info cmd\n"); */
1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->frame_info_count++;
1068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    memset(msg, 0, msg_size);
1069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*first word is used to store message id and message size*/
1070bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_FRAME_INFO_SIZE); /* Deblock message size is 16 bytes */
1071bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_FRAME_INFO);
1072dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1073dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info = (FRAME_INFO_PARAMS*)(msg + 4 / sizeof(uint32_t));
1074dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1075dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info->handle = wsbmKBufHandle(wsbmKBuf(dst_buf->drm_buf));
1076dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info->buffer_size = size;
1077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info->buffer_stride = stride;
1078dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info->picture_width_mb = picture_width_mb;
1079dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    frame_info->size_mb = size_mb;
1080437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
1081437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
1082437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf
10857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1088dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context)
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
10914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
10924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
10934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1094dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (IS_MFLD(driver_data))
10954b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
10964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
1097bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        item_size = FW_VA_RENDER_SIZE;
10984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1099e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes
11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->last_next_segment_cmd) {
11027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuffer_size = cmdbuf->first_segment_size;
1103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_close_segment(cmdbuf);
11047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
11057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = item_size;
1107e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE);
11087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base;
1111e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
1112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    debug_cmd_count = cmdbuf->cmd_count + 1;
11137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11154b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#define DUMP_CMDBUF 0
11164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11174b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if DUMP_CMDBUF
11184b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static int c = 0;
11194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static char pFileName[30];
11204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11214b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sprintf(pFileName , "cmdbuf%i.txt", c++);
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    FILE* pF = fopen(pFileName, "w");
11244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11254b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF);
11264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fclose(pF);
11274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
11284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count++;
11307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
11317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case.
11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
1134e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE,                  msg_size);
1137bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID,                    VA_MSGID_RENDER);
11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!IS_MFLD(driver_data)) {
11404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* TODO: Need to make context more unique */
1141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (driver_data->ec_enabled) { /* ec firmware hw issue, unknown reason */
1142bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_CONTEXT, ((obj_context->msvdx_context >> 8) | 0x1));
1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
1144bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_CONTEXT,            obj_context->msvdx_context);
1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
11464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Point to CMDBUFFER */
1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
1149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */,
1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       cmdbuffer_size,
1151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       0 /* destination offset */,
1152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC);
11534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* This is the last relocation */
1154bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        RELOC_MSG(*(msg + (FW_VA_RENDER_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))),
1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                  lldma_record_offset, &(cmdbuf->buf));
1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1157bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE,          cmdbuffer_size); // In bytes
1158bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_OPERATING_MODE,       obj_context->operating_mode);
1159bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME,     obj_context->last_mb);
1160bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE,    obj_context->first_mb);
1161bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FLAGS,                obj_context->flags);
1162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
1163439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */
11644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
11654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Point to CMDBUFFER */
1166680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifndef DE3_FIRMWARE
1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       &(cmdbuf->buf), (cmdbuf->cmd_start - cmdbuf->cmd_base) /* offset */,
1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       cmdbuffer_size,
1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       0 /* destination offset */,
1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       (obj_context->video_op == psb_video_vld) ? LLDMA_TYPE_RENDER_BUFF_VLD : LLDMA_TYPE_RENDER_BUFF_MC);
11724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* This is the last relocation */
1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))),
1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                  lldma_record_offset, &(cmdbuf->buf));
1175680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else
1176680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))),
1177680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                  (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf));
1178680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
11794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE,          cmdbuffer_size / 4); // In dwords
11804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE,       obj_context->operating_mode);
11814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS,                obj_context->flags);
11824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
11837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
11847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList);
11857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base;
11867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Indicate last LLDMA record (for debugging) */
11877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ((uint32_t *)cmdbuf->lldma_idx)[1] = 0;
11887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
11897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1190e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx;
11917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return psb_context_flush_cmdbuf(obj_context);
11947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
11957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) ||
1196e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) ||
1197e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) ||
1198bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) ||
1199e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) {
1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return psb_context_flush_cmdbuf(obj_context);
12017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
12037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
12047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
12057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
12077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs
12087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context)
12107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
12117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
12127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
12137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int fence_flags;
1214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* unsigned int fence_handle = 0; */
12157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_ttm_fence_rep fence_rep;
12167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_offset;
12177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int num_relocs;
12187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
12194b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    unsigned int item_size; /* Size of a render/deocde msg */
12204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (IS_MFLD(driver_data))
12224b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        item_size = FW_DEVA_DECODE_SIZE;
12234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
1224bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        item_size = FW_VA_RENDER_SIZE;
12257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((NULL == cmdbuf) ||
1227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) {
12287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0; // Nothing to do
12297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
12307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = 0;
1232e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
12337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
12347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LOCK */
12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
12397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
12407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
12417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->frame_info_count; i++) {
1244bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_FRAME_INFO_SIZE;
1245bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t);
1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1248dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->cmd_count; i++) {
12494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t flags;
1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1251dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (IS_MFLD(driver_data))
12524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS);
12534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
1254bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            flags = MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS);
12554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
12567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update flags */
1257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count
1258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               + cmdbuf->host_be_opp_count));
1259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        flags |=
1260bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG) |
1261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            (obj_context->video_op == psb_video_vld    ? FW_VA_RENDER_IS_VLD_NOT_MC : 0);
12627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1263680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifdef MFLD_ERROR_CONCEALMENT
1264680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        if (driver_data->ec_enabled)
1265680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else
1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (driver_data->ec_enabled && IS_MRST(driver_data))
1267680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
1268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            flags |= FW_ERROR_DETECTION_AND_RECOVERY;
12697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (IS_MFLD(driver_data)) {
1271bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            flags &= ~FW_VA_RENDER_IS_VLD_NOT_MC;
12724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags);
1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
1274bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            MEMIO_WRITE_FIELD(msg, FW_VA_RENDER_FLAGS, flags);
12754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        }
12767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!IS_MFLD(driver_data)) {
1279bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE));
1280bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_OPERATING_MODE));
1281bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__trace_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME));
1282bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__trace_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE));
1283bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS));
1284bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
1285bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__information_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_BUFFER_SIZE));
1286bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__information_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_OPERATING_MODE));
1287bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__information_message("MSG LAST_MB_IN_FRAME  = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_LAST_MB_IN_FRAME));
1288bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__information_message("MSG FIRST_MB_IN_SLICE = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FIRST_MB_IN_SLICE));
1289bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            psb__information_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_VA_RENDER_FLAGS));
1290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
1291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
1292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
1293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
1294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
1296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
1297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
1298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
12997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
13007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0  /* todo */
13024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Update SAREA */
13034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context;
13044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
13054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg += item_size / sizeof(uint32_t);
13064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg_size += item_size;
13077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Assume deblock message is following render messages and no more render message behand deblock message */
1310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->deblock_count; i++) {
1311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (!IS_MFLD(driver_data))
1312bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            msg_size += FW_VA_DEBLOCK_SIZE;
13134b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
13144b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo            msg_size += FW_DEVA_DEBLOCK_SIZE;
13157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->oold_count; i++) {
1318bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_OOLD_SIZE;
1319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->host_be_opp_count; i++) {
1322bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_HOST_BE_OPP_SIZE;
1323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
1324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Now calculate the total number of relocations */
13267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg;
1327e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
13287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE);
1331e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    psb__information_message("Cmdbuf CMD size = %08x - %d[%08x]\n", (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE);
1332dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE);
1333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE);
13347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1335dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_unmap(cmdbuf);
13377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(NULL); /* Flush trace */
13407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->MTX_msg);
1343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->reloc_base);
13447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
13467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = 0;
13477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
13487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence_flags = DRM_PSB_FENCE_NO_USER;
1349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
13507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cmdbuf will be validated as part of the buffer list */
13527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Submit */
13537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 1
13547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteLockKernelBO();
1355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs,
1356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       cmdbuf->buffer_refs_count,
1357dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
1358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       0, msg_size,
1359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
1360dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       reloc_offset, num_relocs,
1361dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       0 /* clipRects */, 0, PSB_ENGINE_VIDEO, fence_flags, &fence_rep);
13627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteUnlockKernelBO();
13637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    UNLOCK_HARDWARE(driver_data);
13647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
13657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = 1;
13667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
13687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = NULL;
13697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->slice_count++;
13707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
13717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
13727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
13737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
13747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
13767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    static int error_count = 0;
13787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int status = 0;
1379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    struct _WsbmFenceObject *fence = NULL;
13807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
13817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = psb_fence_wait(driver_data, &fence_rep, &status);
1382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__information_message("psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
1383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
1384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
1386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
13877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (getenv("PSB_VIDEO_TRACE_LLDMA")) {
1389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__trace_message("lldma_count = %d, vitual=0x%08x\n",
1390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                           debug_lldma_count,  wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE);
1391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (i = 0; i < debug_lldma_count; i++) {
1392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start);
1393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            pasDmaList += i;
1394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("\nLLDMA record at offset %08x\n", ((void*)pasDmaList) - cmdbuf->cmd_base);
1396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, BSWAP,    31, 31)
1397437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, DIR,    30, 30)
1398437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(0, PW,    29, 28)
1399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_FIN, 31, 31)
1400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, List_INT, 30, 30)
1401437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, PI,    18, 17)
1402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, INCR,    16, 16)
1403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(1, LEN,    15, 0)
1404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(2, ADDR,    22, 0)
1405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, ACC_DEL,    31, 29)
1406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(3, BURST,    28, 26)
1407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(3, EXT_SA,    3, 0)
1408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, 2D_MODE,    16, 16)
1409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(4, REP_COUNT, 10, 0)
1410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(5, LINE_ADD_OFF, 25, 16)
1411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DW(5, ROW_LENGTH, 9, 0)
1412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(6, SA, 31, 0)
1413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DWH(7, LISTPTR, 27, 0)
1414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message("debug_dump_count = %d\n", debug_dump_count);
1420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < debug_dump_count; i++) {
1421e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        unsigned char *buf_addr;
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,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]);
1423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (debug_dump_buf[i]->rar_handle
1424bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            || (psb_buffer_map(debug_dump_buf[i], &buf_addr) != 0)) {
1425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__trace_message("Unmappable buffer,e.g. RAR buffer\n");
1426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            continue;
1427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        g_hexdump_offset = 0;
1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__hexdump(buf_addr + debug_dump_offset[i], debug_dump_size[i]);
1431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(debug_dump_buf[i]);
14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    debug_dump_count = 0;
14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb__trace_message("cmd_count = %d, virtual=0x%08x\n",
1436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf));
1437dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < debug_cmd_count; i++) {
1438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t *msg = cmdbuf->MTX_msg + i * item_size;
1439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        int j;
1440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb__information_message("start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]);
1441dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i]);
1442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        for (j = 0; j < item_size / 4; j++) {
1444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j));
1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            switch (j) {
1446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 0:
1447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[BufferSize|ID|MSG_SIZE]\n");
1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 1:
1450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[MMUPTD]\n");
1451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 2:
1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[LLDMA_address]\n");
1454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 3:
1456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[Context]\n");
1457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 4:
1459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[Fence_Value]\n");
1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 5:
1462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[Operating_Mode]\n");
1463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 6:
1465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[LastMB|FirstMB]\n");
1466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            case 7:
1468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[Flags]\n");
1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            default:
1471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__trace_message("[overflow]\n");
1472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
1473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
1476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->buf);
1477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->reloc_buf);
1478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
1480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (status) {
14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status);
14837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        error_count++;
1484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ASSERT(status != 2);
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(error_count < 40); /* Exit on 40 errors */
14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence)
1488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_fence_destroy(fence);
1489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
1490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf = NULL;
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->slice_count++;
1493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum {
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP0 = 0,
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP1 = 1,
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP;
15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum    {
15047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HOST_TO_MSVDX = 0,
15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MSXDX_TO_HOST = 1,
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION;
15077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct {
1509bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32 ui32DevDestAddr ;        /* destination address */
1510bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePW     ePeripheralWidth;
1511bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncrSize ePeriphIncrSize;
1512bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncr     ePeriphIncr;
1513bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL            bSynchronous;
1514bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MMU_GROUP           eMMUGroup;
1515bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_DIRECTION       eDMADir;
1516bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_eBurst          eDMA_eBurst;
15177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP;
15187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = {
1521bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* LLDMA_TYPE_VLC_TABLE */ {
1522bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REG_MSVDX_VEC_VLC_OFFSET  ,
1523bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PWIDTH_16_BIT,      /* 16 bit wide data*/
1524bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PERIPH_INCR_4,      /* Incrament the dest by 32 bits */
1525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1526dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_2
1530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* LLDMA_TYPE_BITSTREAM */ {
1532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET),
1533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_8_BIT,
1534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1541bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /*LLDMA_TYPE_RESIDUAL*/             {
1542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET),
1543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_MC*/{
1553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1557dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1558dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1560bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1562dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_VLD*/{
1563dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1568dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1570bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1571dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{
1573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1580bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2              /* From VLR */
1581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1582dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{
1583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1584dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2             /* Into VLR */
1591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{
1593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1597bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1600bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* From MTX */
1601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{
1603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1607bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1610bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{
1613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1616dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1617bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1619dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1620bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             //2     /* From MTX */
1621dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{
1623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1627bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1630bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1631dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MEM_SET */{
1633dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0),
1634dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1635dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,       /* na */
1638dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1639dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1640dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4                     /* From VLR */
1641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
16437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
16447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN     ( 0xffff )
16467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
16477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_cmdbuf(psb_cmdbuf_p cmdbuf,
1649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   psb_buffer_p bitstream_buf,
1650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t buffer_offset,
1651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t size,
1652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t dest_offset,
1653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   LLDMA_TYPE cmd)
16547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
16557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    LLDMA_CMD *pLLDMACmd = (LLDMA_CMD*) cmdbuf->cmd_idx++;
16567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, pLLDMACmd, bitstream_buf, buffer_offset, size,
1657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     dest_offset, cmd);
16587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
16597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1660680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size)
1661680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1662680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    void *pos = (void *)cmdbuf->cmd_idx;
1663680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(!(byte_size % 4));
1664680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1665680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx += (byte_size / 4);
1666680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1667680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    return pos;
1668680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1669680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1670680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf,
1671680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   psb_buffer_p bitstream_buf,
1672680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t buffer_offset,
1673680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t size,
1674680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t dest_offset,
1675680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   DMA_TYPE type)
1676680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1677680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(size < 0xFFFF);
1678680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(buffer_offset < 0xFFFF);
1679680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1680680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    DMA_CMD_WITH_OFFSET* dma_cmd;
1681680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1682680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(dest_offset==0)
1683680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1684680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD));
1685680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = 0;
1686680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1687680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1688680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1689680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET));
1690680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined
1691680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32ByteOffset = dest_offset;
1692680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1693680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1694680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= CMD_DMA;
1695680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= (IMG_UINT32)type;
1696680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= size;
1697680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /* dma_cmd->ui32DevVirtAdd  = ui32DevVirtAddress; */
1698680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf);
1699680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1700680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunuint32_t psb_cmdbuf_lldma_create(psb_cmdbuf_p cmdbuf,
17027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 psb_buffer_p bitstream_buf,
17037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t buffer_offset,
17047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t size,
17057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 uint32_t dest_offset,
17067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                 LLDMA_TYPE cmd)
17077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1708e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t lldma_record_offset = (((unsigned char *)cmdbuf->lldma_idx) - ((unsigned char *) cmdbuf->cmd_base));
17097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_lldma_create_internal(cmdbuf, 0, bitstream_buf, buffer_offset, size,
1710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     dest_offset, cmd);
17117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return lldma_record_offset;
17127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
17157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
17167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1717dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_bitstream(psb_cmdbuf_p cmdbuf,
17187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      psb_buffer_p bitstream_buf,
17197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t buffer_offset,
17207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t size_in_bytes,
17217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t offset_in_bits,
17227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                                      uint32_t flags)
17237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1724dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*
1725dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * We use byte alignment instead of 32bit alignment.
1726dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * The third frame of sa10164.vc1 results in the following bitstream
1727dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * patttern:
1728dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * [0000] 00 00 03 01 76 dc 04 8d
1729dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * with offset_in_bits = 0x1e
1730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * This causes an ENTDEC failure because 00 00 03 is a start code
1731dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     * By byte aligning the datastream the start code will be eliminated.
1732dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun     */
17337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
17347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
1735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#define ALIGNMENT        sizeof(uint8_t)
1736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t bs_offset_in_dwords    = ((offset_in_bits / 8) / ALIGNMENT);
17377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
17387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
17397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
17407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
17417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
17437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = offset_in_bits;
17447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
17457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = size_in_bytes;
1746dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_lldma_write_cmdbuf(cmdbuf, bitstream_buf, buffer_offset,
1748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  size_in_bytes, 0, LLDMA_TYPE_BITSTREAM);
17497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1751437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream", bitstream_buf, buffer_offset, size_in_bytes);
17527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
17537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
17547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
17557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1756680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
1757680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1758680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf,
1759680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      psb_buffer_p bitstream_buf,
1760680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t buffer_offset,
1761680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t size_in_bytes,
1762680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t offset_in_bits,
1763680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t flags)
1764680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1765680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /*
1766680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * We use byte alignment instead of 32bit alignment.
1767680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * The third frame of sa10164.vc1 results in the following bitstream
1768680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * patttern:
1769680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * [0000] 00 00 03 01 76 dc 04 8d
1770680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * with offset_in_bits = 0x1e
1771680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * This causes an ENTDEC failure because 00 00 03 is a start code
1772680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * By byte aligning the datastream the start code will be eliminated.
1773680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     */
1774680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
1775680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0
1776680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT        sizeof(uint8_t)
1777680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    uint32_t bs_offset_in_dwords    = ((offset_in_bits / 8) / ALIGNMENT);
1778680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
1779680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
1780680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
1781680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
1782680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1783680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
1784680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = offset_in_bits;
1785680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
1786680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = size_in_bytes;
1787680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1788680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf);
1789680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1790680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1791680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1792680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/*
17937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Chain a LLDMA bitstream command to the previous one
17947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_lldma_write_bitstream_chained(psb_cmdbuf_p cmdbuf,
1796dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p bitstream_buf,
1797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t size_in_bytes)
17987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
17997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*) cmdbuf->lldma_last;
1800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf, bitstream_buf, bitstream_buf->buffer_ofs,
1801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   size_in_bytes, 0, LLDMA_TYPE_BITSTREAM);
18027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Update WD7 of last LLDMA record to point to this one */
18037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC_SHIFT4(pasDmaList->ui32Word_7, lldma_record_offset, 0, &(cmdbuf->buf));
18047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* This touches WD1 */
18057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
18067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
1808437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    //psb__debug_schedule_hexdump("Bitstream (chained)", bitstream_buf, 0, size_in_bytes);
18097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
18107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
18127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
18137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1814680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/*
1815680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one
1816680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1817680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf,
1818680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        psb_buffer_p bitstream_buf,
1819680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        uint32_t size_in_bytes)
1820680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1821680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1822680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf);
1823680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1824680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
1825680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1826680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_lldma_create_internal(psb_cmdbuf_p cmdbuf,
1828dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        LLDMA_CMD *pLLDMACmd,
1829dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p bitstream_buf,
1830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t buffer_offset,
1831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t size,
1832dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        uint32_t dest_offset,
1833dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        LLDMA_TYPE cmd)
18347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
18357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    const DMA_DETAIL_LOOKUP* pDmaDetail;
18367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    IMG_UINT32 ui32DMACount, ui32LLDMA_Offset, ui32DMADestAddr, ui32Cmd;
18377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DMA_sLinkedList* pasDmaList;
1838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    static IMG_UINT32 lu[] = {4, 2, 1};
18397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* See if we will fit */
1841dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(cmdbuf->lldma_idx + sizeof(DMA_sLinkedList) < LLDMA_END(cmdbuf));
18427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pDmaDetail = &DmaDetailLookUp[cmd];
18447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMACount = size / lu[pDmaDetail->ePeripheralWidth];
18467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* DMA list must be 16byte alligned if it is done in Hw */
1848dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pasDmaList = (DMA_sLinkedList*)(cmdbuf->lldma_idx) ;
18497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    // psaDmaList = (DMA_sLinkedList*) ((( cmdbuf->lldma_idx )+0x0f) & ~0x0f );
18507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Offset of LLDMA record in cmdbuf */
1852dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ui32LLDMA_Offset = (IMG_UINT32)(((IMG_UINT8*)pasDmaList) - ((IMG_UINT8*) cmdbuf->cmd_base));
18537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1854bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    ASSERT(0 == (ui32LLDMA_Offset & 0xf));
18557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ui32DMADestAddr = pDmaDetail->ui32DevDestAddr + dest_offset;
18577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write the header */
1859dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (pLLDMACmd) {
1860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        ui32Cmd = ((pDmaDetail->bSynchronous) ? CMD_SLLDMA : CMD_LLDMA);
1861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        RELOC_SHIFT4(pLLDMACmd->ui32CmdAndDevLinAddr, ui32LLDMA_Offset, ui32Cmd, &(cmdbuf->buf));
18627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
18637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while (ui32DMACount) {
1865dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        memset(pasDmaList , 0 , sizeof(DMA_sLinkedList));
18667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1867dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_LL_SET_WD2(pasDmaList, ui32DMADestAddr);
18687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* DMA_LL_SET_WD6 with relocation */
18707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(DMAC_LL_SA_SHIFT == 0);
18717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        RELOC(pasDmaList->ui32Word_6, buffer_offset, bitstream_buf);
18737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1874dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (ui32DMACount > MAX_DMA_LEN) {
1875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32LLDMA_Offset += sizeof(DMA_sLinkedList);
18767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* DMA_LL_SET_WD7 with relocation */
18787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ASSERT(DMAC_LL_LISTPTR_SHIFT == 0);
18797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            RELOC_SHIFT4(pasDmaList->ui32Word_7, ui32LLDMA_Offset, 0, &(cmdbuf->buf));
18807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This touches WD1 */
18817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            MEMIO_WRITE_FIELD(pasDmaList, DMAC_LL_LIST_FIN, 0);
18827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1883dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, MAX_DMA_LEN);     /* size */
18847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32DMACount -= MAX_DMA_LEN;
1886dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1887dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pDmaDetail->ePeriphIncr == DMA_PERIPH_INCR_ON) {
18887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Update Destination pointers */
1889dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                ui32DMADestAddr += ((MAX_DMA_LEN) * lu[pDmaDetail->ePeriphIncrSize]);
18907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
18917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
18927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* Update Source Pointer */
1893dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buffer_offset += ((MAX_DMA_LEN) * lu[pDmaDetail->ePeripheralWidth]);
1894dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
18957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            /* This also set LIST_FIN in WD1 to 1*/
18967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            DMA_LL_SET_WD7(pasDmaList, IMG_NULL);                // next linked list
1897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            DMA_LL_SET_WD1(pasDmaList, pDmaDetail->ePeriphIncr, pDmaDetail->ePeriphIncrSize, ui32DMACount);    /* size */
18987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1899dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            ui32DMACount = 0;
19007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
19017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Keep pointer in case we need to chain another LLDMA command */
1903e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        cmdbuf->lldma_last = (unsigned char *) pasDmaList;
19047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_LL_SET_WD0(pasDmaList, DMA_BSWAP_NO_SWAP,
1906dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       (pDmaDetail->eDMADir == HOST_TO_MSVDX) ? DMA_DIR_MEM_TO_PERIPH : DMA_DIR_PERIPH_TO_MEM ,
1907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       pDmaDetail->ePeripheralWidth);
19087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1909dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_LL_SET_WD3(pasDmaList, DMA_ACC_DEL_0, pDmaDetail->eDMA_eBurst, pDmaDetail->eMMUGroup);
19107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD4(pasDmaList, DMA_MODE_2D_OFF, 0);    // 2d
19117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DMA_LL_SET_WD5(pasDmaList, 0, 0);                    // 2d
19127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        pasDmaList++;
19157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
19167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* there can be up to 3 Bytes of padding after header */
1918e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    cmdbuf->lldma_idx    = (unsigned char *)pasDmaList;
19197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1921680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#ifndef DE3_FIRMWARE
19227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a command to set registers
19247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1925680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags)
19264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
19274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
19284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
19294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->reg_start = cmdbuf->cmd_idx++;
19304b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->reg_start = flags;
1931dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
19327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf,
1934dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                uint32_t reg,
1935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                psb_buffer_p buffer,
1936dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                uint32_t buffer_offset)
19377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx++ = reg;
19397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
19407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
19417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
19427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
19437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a command to set registers
19447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1945dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf)
19467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
19477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t reg_count = ((cmdbuf->cmd_idx - cmdbuf->reg_start) - 1) / 2;
1948dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
19494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->reg_start |= CMD_REGVALPAIR_WRITE | reg_count;
19507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
19517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1952680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else
1953680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags)
1954680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1955680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */
1956680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1957680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_wt_p = cmdbuf->cmd_idx;
1958680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = 0;
1959680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */
1960680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
1961680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1962680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1963680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val)
1964680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1965680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1966680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1967680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1968680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1969680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1970680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1971680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1972680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1973680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1974680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1975680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->reg_wt_p++ = val;
1976680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1977680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1978680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1979680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf,
1980680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t reg,
1981680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         psb_buffer_p buffer,
1982680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t buffer_offset)
1983680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1984680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1985680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1986680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1987680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1988680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1989680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1990680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1991680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1992680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1993680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1994680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1995680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer);
1996680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1997680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1998680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1999680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf)
2000680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
2001680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx = cmdbuf->reg_wt_p;
2002680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
2003680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
2004680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
20057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2006dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
20077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_CTRL_HEADER = 0,
20087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_HDR,
20097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_NULL,
20107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_CK_HDR,
20117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS;
20127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a RENDEC command block
20157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2016dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start_block(psb_cmdbuf_p cmdbuf)
20177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't have both */
20197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = cmdbuf->cmd_idx;
20207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_HDR] = 0;
2022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ROUTING_INFO,      1);
2023dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_ENCODING_METHOD,   3);
2024dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(cmdbuf->rendec_block_start[RENDEC_SL_HDR], RENDEC_SLICE_INFO, SL_HDR_CK_START, SL_NUM_SYMBOLS_LESS1, 1);
20257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[RENDEC_SL_NULL] = 0; /* empty */
20277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += RENDEC_CK_HDR;
2029dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
20307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Start a new chunk in a RENDEC command block
20337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2034dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start_chunk(psb_cmdbuf_p cmdbuf, uint32_t dest_address)
20357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have a RENDEC block open */
20377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
20387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->rendec_chunk_start = 0;
20407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_ENCODING_METHOD, 3);
2041dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start, RENDEC_SLICE_INFO, CK_HDR, CK_START_ADDRESS, (dest_address >> 2));
2042dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
20437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
20454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format
20464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
2047dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address)
20484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
2049dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(((dest_address >> 2)& ~0xfff) == 0);
20504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
20514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2052dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | ((dest_address >> 2) << 4);
2053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
20544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2055dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf,
2056dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   unsigned char *block,
2057dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t size)
20587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((size & 0x3) == 0);
2060e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
2061dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < size; i += 4) {
20627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24);
2063dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, val);
20647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
20657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2067dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf,
2068dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_buffer_p buffer,
2069dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     uint32_t buffer_offset)
20707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
20727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC chunk
20767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2077dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end_chunk(psb_cmdbuf_p cmdbuf)
20787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
20797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
20807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
20817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t dword_count = (cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start) - 1;
20827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2083dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD_LITE(*cmdbuf->rendec_chunk_start,
2084dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           RENDEC_SLICE_INFO,
2085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           CK_HDR,
2086dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           CK_NUM_SYMBOLS_LESS1,
2087dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           (2 * dword_count) - 1);        /* Number of 16-bit symbols, minus 1.*/
20887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
20907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
20917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
20927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
20937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block
20947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2095dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf)
20964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
20974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
20984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start;
20994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
2100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT((dword_count - 1) <= 0xff);
21014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16);
21034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = NULL;
21044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
21054b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
21064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
21074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Finish a RENDEC block
21084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
2109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end_block(psb_cmdbuf_p cmdbuf)
21107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
21117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->rendec_block_start); /* Must have an open RENDEC block */
21127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_chunk_start); /* All chunks must be closed */
21137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - cmdbuf->rendec_block_start;  /* Include separator but not mtx block header*/
21157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* Write separator (footer-type thing)    */
21177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0;
2118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    REGIO_WRITE_FIELD(*cmdbuf->cmd_idx, RENDEC_SLICE_INFO, SLICE_SEPARATOR, SL_SEP_SUFFIX, 7);
21197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx++;
21207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Write CMD Header    */
21227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start[MTX_CTRL_HEADER] = CMD_RENDEC_WRITE | block_size;
21237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
21257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
21287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns the number of words left in the current segment
21297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunuint32_t psb_cmdbuf_segment_space(psb_cmdbuf_p cmdbuf)
21317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2132e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t bytes_used = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
21337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (MTX_SEG_SIZE - (bytes_used % MTX_SEG_SIZE)) / sizeof(uint32_t);
21347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
21377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Forwards the command buffer index to the next segment
21387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_next_segment(psb_cmdbuf_p cmdbuf)
21407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
21417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t *next_segment_cmd = cmdbuf->cmd_idx;
21427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += 2;
2143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t words_free = psb_cmdbuf_segment_space(cmdbuf);
2144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->last_next_segment_cmd) {
2146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_close_segment(cmdbuf);
2147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
2148e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        cmdbuf->first_segment_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
21497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
21507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx += words_free; /* move pui32CmdBuffer to start of next segment */
2152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = next_segment_cmd;
21547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
21577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block
21587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition)
21607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
21617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */
21627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */
21637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/
2164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
21657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_condition = skip_condition;
21667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = cmdbuf->cmd_idx++;
21677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
21687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
21707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block
21717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
2172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf)
21737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
21747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */
21757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */
21767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */
21777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
21787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1);
21797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size;
21817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
21827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2183