psb_cmdbuf.c revision 38f419a75e2994d6afe2ffb360d5f5b7670ce077
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"
56c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h"
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h>
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h>
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h>
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 * Create command buffer
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data,
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_cmdbuf_p cmdbuf
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int size = CMD_SIZE + LLDMA_SIZE;
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE;
101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172;
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->size = 0;
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_size = 0;
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_size = 0;
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_base = NULL;
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_idx = NULL;
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_allocated = 10;
1232befccec034c13d34746a9e87149889d59ac767bFei Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == cmdbuf->buffer_refs) {
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf);
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = size;
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf);
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = reloc_size;
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf);
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = regio_size;
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_destroy(cmdbuf);
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf)
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->size) {
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->buf);
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = 0;
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->reloc_size) {
157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->reloc_buf);
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = 0;
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->regio_size) {
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->regio_buf);
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = 0;
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->buffer_refs_allocated) {
165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(cmdbuf->buffer_refs);
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs = NULL;
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf)
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count = 0;
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count = 0;
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->host_be_opp_count = 0;
195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->frame_info_count = 0;
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(&cmdbuf->buf);
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE;
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = cmdbuf->lldma_base;
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE;
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Add ourselves to the buffer list */
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf)
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = NULL;
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->buf);
240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->reloc_buf);
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf)
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int item_loc = 0;
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    // buf->next = NULL; /* buf->next only used for buffer list validation */
255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while ((item_loc < cmdbuf->buffer_refs_count)
257bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang           && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) {
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        item_loc++;
260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (item_loc == cmdbuf->buffer_refs_count) {
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Add new entry */
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (item_loc >= cmdbuf->buffer_refs_allocated) {
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Allocate more entries */
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            int new_size = cmdbuf->buffer_refs_allocated + 10;
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_p *new_array;
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == new_array) {
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return -1; /* Allocation failure */
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(cmdbuf->buffer_refs);
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs_allocated = new_size;
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs = new_array;
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs[item_loc] = buf;
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs_count++;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->status = psb_bs_queued;
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->next = NULL;
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* only for RAR buffers */
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((cmdbuf->buffer_refs[item_loc] != buf)
285bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        && (buf->rar_handle != 0)) {
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc];
287c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: found same drm buffer with different psb buffer, link them\n",
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 tmp, buf);
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while ((tmp->next != NULL)) {
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = tmp->next;
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (tmp == buf) /* found same buffer */
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (tmp != buf) {
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp->next = buf; /* link it */
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->status = psb_bs_queued;
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->next = NULL;
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
300c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: buffer aleady in the list, skip\n",
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     tmp, buf);
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return item_loc;
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf"
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer"
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift".
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background".
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf,
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t *addr_in_cmdbuf,
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_buffer_p ref_buffer,
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t buf_offset,
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t mask,
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t background,
322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t align_shift,
323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check that address is within buffer range */
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (dst_buffer) {
330e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base);
331e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf));
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
334e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg);
335e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf));
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer);
340dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(reloc->buffer != -1);
341dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
344c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n",
345c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset);
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (presumed_offset) {
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t new_val =  presumed_offset + buf_offset;
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = (background & ~mask) | (new_val & mask);
3517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = new_val;
352dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = PSB_RELOC_MAGIC;
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
355dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->mask = mask;
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->pre_add =  buf_offset;
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->background = background;
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->dst_buffer = dst_buffer;
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx++;
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
363e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf));
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context)
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf;
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf) {
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf_current++;
381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) {
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf_current = 0;
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current];
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_cmdbuf_reset(cmdbuf);
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ret) {
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Success */
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = cmdbuf;
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then)
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    long long val;
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = now->tv_sec - then->tv_sec;
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val *= 1000000LL;
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val += now->tv_usec;
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val -= then->tv_usec;
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (val < 1LL)
404dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        val = 1LL;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (unsigned) val;
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1).
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
423cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang             unsigned numRelocs, int damage,
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg)
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drm_psb_cmdbuf_arg_t ca;
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_validate_arg *arg_list;
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int i;
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct timeval then, now;
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool have_then = FALSE;
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (arg_list == NULL) {
436c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Malloc failed \n");
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -ENOMEM;
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_req *req = &arg->d.req;
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->next = (unsigned long) & (arg_list[i+1]);
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->group = 0;
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_flags = PSB_USE_PRESUMED;
4534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        req->pad64 = (uint32_t)buffer_list[i]->pl_flags;
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list[buffer_count-1].d.req.next = 0;
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.fence_arg = (uint64_t)((unsigned long)fence_arg);
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_handle = cmdBufHandle;
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_offset = cmdBufOffset;
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_size = cmdBufSize;
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_handle = relocBufHandle;
4657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_offset = relocBufOffset;
4667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.num_relocs = numRelocs;
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_flags = fence_flags;
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.engine = engine;
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
471bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0
472c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: buffer_list   = %08x\n", ca.buffer_list);
473c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: clip_rects    = %08x\n", ca.clip_rects);
474c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle);
475c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset);
476c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_size   = %08x\n", ca.cmdbuf_size);
477c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_handle  = %08x\n", ca.reloc_handle);
478c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_offset  = %08x\n", ca.reloc_offset);
479c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: num_relocs    = %08x\n", ca.num_relocs);
480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: engine        = %08x\n", ca.engine);
481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: fence_flags   = %08x\n", ca.fence_flags);
4827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
4837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
4857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * X server Signals will clobber the kernel time out mechanism.
4867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * we need a user-space timeout as well.
4877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
4887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    do {
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (ret == EAGAIN) {
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (!have_then) {
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (gettimeofday(&then, NULL)) {
493c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n");
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                have_then = TRUE;
4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (gettimeofday(&now, NULL)) {
500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n");
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC));
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
508c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "command write return is %d\n", ret);
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        goto out;
5107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
5147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_rep *rep = &arg->d.rep;
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!arg->handled) {
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = -EFAULT;
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
520dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (arg->ret != 0) {
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = arg->ret;
5227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout:
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(arg_list);
530dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Buffer no longer queued in userspace
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p tmp = buffer_list[i];
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * RAR slice buffer/surface buffer are share one BO, and then only one in
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * buffer_list, but they are linked in psb_cmdbuf_buffer_ref
539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (buffer_list[i]->rar_handle == 0)
5427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized  */
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        do {
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p p = tmp;
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp = tmp->next;
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            switch (p->status) {
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_queued:
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                p->status = psb_bs_ready;
5517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_abandoned:
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_buffer_destroy(p);
5557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(p);
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Not supposed to happen */
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ASSERT(0);
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } while (tmp);
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
564dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
56838f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence)
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmFenceUnreference(&pFence);
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject *
577bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data,
578bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               struct psb_ttm_fence_rep *fence_rep, int *status)
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence = NULL;
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = -1;
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* copy fence information */
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence_rep->error != 0) {
586c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence"
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           " and has idled the HW\n");
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
5897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
5907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            fence_rep->fence_type,
594e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                            (unsigned char *)fence_rep->handle,
5957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            0);
596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (fence)
597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return fence;
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
60138f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif
6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p cmdbuf)
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
60838f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0
609e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE;
610e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used;
611dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
612dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */,
613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   bytes_used,
614dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   0 /* destination offset */,
615dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   LLDMA_TYPE_RENDER_BUFF_MC);
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = CMD_NEXT_SEG;
617dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf));
618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *(cmdbuf->last_next_segment_cmd + 1) = bytes_used;
61938f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif
6207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_deblock(object_context_p obj_context)
6237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
6247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
625bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_DEBLOCK_SIZE;
626e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
6277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    DEBLOCKPARAMS* pdbParams;
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
629c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Send two pass deblock cmd\n");
630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->cmd_count) {
631c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "two pass deblock cmdbuf has render msg!\n");
632dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return 1;
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
6347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count++;
6367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
6377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, 16); /* Deblock message size is 16 bytes */
639bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_DEBLOCK);
6407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
641bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
642bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_FLAGS, FW_VA_RENDER_HOST_INT);
643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pdbParams = (DEBLOCKPARAMS*)(msg + 16 / sizeof(uint32_t));
6457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->handle = wsbmKBufHandle(wsbmKBuf(cmdbuf->regio_buf.drm_buf));
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* printf("regio buffer size is 0x%x\n", cmdbuf->regio_size); */
6487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    pdbParams->buffer_size = cmdbuf->regio_size;
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pdbParams->ctxid = (obj_context->msvdx_context & 0xfff);
6507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
6527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6544b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */
6554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context,
6564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_a,
6574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_b,
6584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p colocate_buffer,
6594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t picture_widht_mb,
6604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t frame_height_mb,
6614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t rotation_flags,
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t field_type,
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t ext_stride_a,
6644b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_a,
6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_b,
6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t is_oold)
6674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
6684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
6694b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE;
67106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    FW_VA_DEBLOCK_MSG *deblock_msg;
6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
674e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count);
6754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
6774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
6784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6799769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE;
680dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (is_oold)
6814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD;
6824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
6834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD;
6845ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE | FW_DEVA_DEBLOCK_ENABLE;
6854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->flags.bits.slice_type = field_type;
6864b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->operating_mode = obj_context->operating_mode;
687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context);
6884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
6904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->ext_stride_a = ext_stride_a;
6914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->rotation_flags = rotation_flags;
6924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
6944b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (buf_b) {
6964b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
6974b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
6984b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
6994b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7004b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer);
7014b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->deblock_count++;
7024b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return 0;
7034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
7047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
705dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_oold(object_context_p obj_context,
706dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p src_buf,
707dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p dst_buf,
708dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            psb_buffer_p colocate_buffer,
709dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t picture_width_in_mb,
710dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t frame_height_in_mb,
711dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t field_type,
712dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                            uint32_t chroma_offset)
713437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
714437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
715bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    uint32_t msg_size = FW_VA_OOLD_SIZE;
716e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * FW_VA_RENDER_SIZE);
717bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    FW_VA_OOLD_MSG *oold_msg;
718437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
719dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == src_buf || NULL == dst_buf || NULL == colocate_buffer) {
720c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "%s L%d Invalide src_buf, dst_buf or colocate_buffer\n",
721dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           __FUNCTION__, __LINE__);
722dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_INVALID_BUFFER;
7232befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
7242befccec034c13d34746a9e87149889d59ac767bFei Jiang
725c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Send out of loop deblock cmd\n");
726437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
727437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count++;
728437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(msg, 0, msg_size);
729bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    oold_msg = (FW_VA_OOLD_MSG *) msg;
730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
731bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE, FW_VA_OOLD_SIZE);
732bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID, VA_MSGID_OOLD);
733bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_DEBLOCK_CONTEXT, obj_context->msvdx_context);
734437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_OPERATING_MODE, obj_context->operating_mode);
736bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_FRAME_HEIGHT_MBS, frame_height_in_mb);
737bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_PIC_WIDTH_MBS, picture_width_in_mb);
738437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
739437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_LUMA_BUFFER_ADDRESS, src_buf->buffer_ofs, src_buf);
740437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_CHROMA_BUFFER_ADDRESS, src_buf->buffer_ofs + chroma_offset, src_buf);
741437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_LUMA_BUFFER_ADDRESS, dst_buf->buffer_ofs, dst_buf);
742437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->TARGET_CHROMA_BUFFER_ADDRESS, dst_buf->buffer_ofs + chroma_offset, dst_buf);
743437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
744437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    RELOC_MSG(oold_msg->SOURCE_MB_PARAM_ADDRESS, colocate_buffer->buffer_ofs, colocate_buffer);
745437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
746bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FW_VA_OOLD_SLICE_FIELD_TYPE, field_type);
747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
748dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return 0;
749dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
750dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
751f31d5416a60f83e184b0906a7ec77ba021840531hdingint psb_context_submit_host_be_opp(object_context_p obj_context,
752f31d5416a60f83e184b0906a7ec77ba021840531hding                                  psb_buffer_p buf_a,
753f31d5416a60f83e184b0906a7ec77ba021840531hding                                  psb_buffer_p buf_b,
7549769d6a0972207564efb82e397f19ec002841f65Li Zeng                                  psb_buffer_p buf_c,
755f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t picture_widht_mb,
756f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t frame_height_mb,
757f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t rotation_flags,
758f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t field_type,
759f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t ext_stride_a,
760f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t chroma_offset_a,
761f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t chroma_offset_b)
762f31d5416a60f83e184b0906a7ec77ba021840531hding{
763f31d5416a60f83e184b0906a7ec77ba021840531hding    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
764f31d5416a60f83e184b0906a7ec77ba021840531hding    psb_driver_data_p driver_data = obj_context->driver_data;
7659769d6a0972207564efb82e397f19ec002841f65Li Zeng    uint32_t msg_size = sizeof(FW_VA_DEBLOCK_MSG);
76606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
767f31d5416a60f83e184b0906a7ec77ba021840531hding    FW_VA_DEBLOCK_MSG *deblock_msg;
768f31d5416a60f83e184b0906a7ec77ba021840531hding
769f31d5416a60f83e184b0906a7ec77ba021840531hding
770f31d5416a60f83e184b0906a7ec77ba021840531hding    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count + cmdbuf->deblock_count * msg_size);
771f31d5416a60f83e184b0906a7ec77ba021840531hding
772f31d5416a60f83e184b0906a7ec77ba021840531hding    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
773f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
774f31d5416a60f83e184b0906a7ec77ba021840531hding
7759769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE;
776f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->header.bits.msg_type = VA_MSGID_HOST_BE_OPP_MFLD;
777f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY;
778f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->flags.bits.slice_type = field_type;
779f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->operating_mode = obj_context->operating_mode;
780f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context);
781f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
782f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
783f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->ext_stride_a = ext_stride_a;
784f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->rotation_flags = rotation_flags;
785f31d5416a60f83e184b0906a7ec77ba021840531hding
786f31d5416a60f83e184b0906a7ec77ba021840531hding    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
787f31d5416a60f83e184b0906a7ec77ba021840531hding    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
7889769d6a0972207564efb82e397f19ec002841f65Li Zeng    RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
7899769d6a0972207564efb82e397f19ec002841f65Li Zeng    RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
790f31d5416a60f83e184b0906a7ec77ba021840531hding
7919769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->mb_param_address = wsbmKBufHandle(wsbmKBuf(buf_a->drm_buf));
7929769d6a0972207564efb82e397f19ec002841f65Li Zeng    cmdbuf->deblock_count++;
793f31d5416a60f83e184b0906a7ec77ba021840531hding    return 0;
794f31d5416a60f83e184b0906a7ec77ba021840531hding}
795dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
7967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
7977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf
7987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
8007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
801dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context)
8027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
8044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
80506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
806c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    int ret;
8074b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
809e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes
8107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->last_next_segment_cmd) {
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuffer_size = cmdbuf->first_segment_size;
813dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_close_segment(cmdbuf);
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8164b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = item_size;
817e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE);
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
819c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & CMDMSG_TRACE)) {
820c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base;
821c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
822c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_count = cmdbuf->cmd_count + 1;
823c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
8244b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
825fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
8264b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static int c = 0;
8274b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static char pFileName[30];
8284b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8294b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
830dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sprintf(pFileName , "cmdbuf%i.txt", c++);
831dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    FILE* pF = fopen(pFileName, "w");
8324b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8334b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF);
8344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fclose(pF);
835fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang*/
836fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = psb_cmdbuf_dump((unsigned int *)cmdbuf->cmd_start, cmdbuffer_size);
837fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if(ret)
838c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_cmdbuf: dump cmdbuf fail\n");
8394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count++;
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
8427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case.
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
845e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
8467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE,                  msg_size);
848bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID,                    VA_MSGID_RENDER);
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
850439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */
8514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
85206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    /* Point to CMDBUFFER */
85306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))),
85406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng              (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf));
85506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE,          cmdbuffer_size / 4); // In dwords
85606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE,       obj_context->operating_mode);
85706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS,                obj_context->flags);
858c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
859c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & LLDMA_TRACE)) {
860c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList);
861c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base;
862c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        /* Indicate last LLDMA record (for debugging) */
863c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        ((uint32_t *)cmdbuf->lldma_idx)[1] = 0;
864c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
8657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
866e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx;
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
868c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return psb_context_flush_cmdbuf(obj_context);
870c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    } else {
871c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) ||
872c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) ||
873c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) ||
874c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) ||
875c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) {
876c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            return psb_context_flush_cmdbuf(obj_context);
877c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
8787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
8807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
8837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs
8847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
885dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context)
8867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
8887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
8897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int fence_flags;
890437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* unsigned int fence_handle = 0; */
8917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_ttm_fence_rep fence_rep;
8927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_offset;
8937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int num_relocs;
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
89506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((NULL == cmdbuf) ||
898bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) {
8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0; // Nothing to do
9007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = 0;
903e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
9047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int i;
9057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LOCK */
9077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
908dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
9097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
9107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
9117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
9127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
913dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
914dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->frame_info_count; i++) {
915bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_FRAME_INFO_SIZE;
916bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t);
917dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
918dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
919dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->cmd_count; i++) {
9204b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t flags;
921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
92206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS);
9234b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update flags */
925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count
926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               + cmdbuf->host_be_opp_count));
927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        flags |=
9289769d6a0972207564efb82e397f19ec002841f65Li Zeng            (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG);
9297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
930f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_EC
931680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        if (driver_data->ec_enabled)
932680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#else
933dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (driver_data->ec_enabled && IS_MRST(driver_data))
934680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
935dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            flags |= FW_ERROR_DETECTION_AND_RECOVERY;
9367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
93706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags);
9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
93906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
94006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
94106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
94306c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
94406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
94506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
9467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0  /* todo */
9484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Update SAREA */
9494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context;
9504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
9514b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg += item_size / sizeof(uint32_t);
9524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg_size += item_size;
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Assume deblock message is following render messages and no more render message behand deblock message */
956dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->deblock_count; i++) {
9579769d6a0972207564efb82e397f19ec002841f65Li Zeng        if (IS_MRST(driver_data))
958bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            msg_size += FW_VA_DEBLOCK_SIZE;
9594b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        else
9609769d6a0972207564efb82e397f19ec002841f65Li Zeng            msg_size += sizeof(FW_VA_DEBLOCK_MSG);
9617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
962dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
963dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->oold_count; i++) {
9649769d6a0972207564efb82e397f19ec002841f65Li Zeng        msg_size += sizeof(FW_VA_DEBLOCK_MSG);
965437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
967dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->host_be_opp_count; i++) {
968bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_HOST_BE_OPP_SIZE;
969dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
970dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
9717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Now calculate the total number of relocations */
9727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg;
973e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
9747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
975c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE);
976c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf CMD size = %08x - %d[%08x]\n", (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_base, cmdbuf->cmd_count, CMD_SIZE);
977c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE);
978c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE);
979dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
980dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_unmap(cmdbuf);
9817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(NULL); /* Flush trace */
983dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
984dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->MTX_msg);
985dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->reloc_base);
9867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
987c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp)
988c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = 0;
989c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    else
990c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = DRM_PSB_FENCE_NO_USER;
9917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cmdbuf will be validated as part of the buffer list */
9937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Submit */
9947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteLockKernelBO();
995dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs,
996dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       cmdbuf->buffer_refs_count,
997dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
998dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       0, msg_size,
999dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
1000dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       reloc_offset, num_relocs,
1001cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang                       0, PSB_ENGINE_DECODE, fence_flags, &fence_rep);
10027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteUnlockKernelBO();
10037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    UNLOCK_HARDWARE(driver_data);
1004c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
1005dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
10067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = NULL;
10077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->slice_count++;
10087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
10107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
10117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
10127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1013c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
10147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
1015c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        static int error_count = 0;
1016c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        int status = 0;
1017c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        struct _WsbmFenceObject *fence = NULL;
1018c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence = psb_fence_wait(driver_data, &fence_rep, &status);
1019c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
1020dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
1021437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1022c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
1023c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
1024c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
1025c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & LLDMA_TRACE) {
1026c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("lldma_count = %d, vitual=0x%08x\n",
1027c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                               debug_lldma_count,  wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE);
1028c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            for (i = 0; i < debug_lldma_count; i++) {
1029c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start);
1030c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                pasDmaList += i;
1031c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
1032c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                psb__trace_message("\nLLDMA record at offset %08x\n", ((unsigned char*)pasDmaList) - cmdbuf->cmd_base);
1033c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, BSWAP,    31, 31)
1034c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, DIR,    30, 30)
1035c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, PW,    29, 28)
1036c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, List_FIN, 31, 31)
1037c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, List_INT, 30, 30)
1038c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, PI,    18, 17)
1039c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, INCR,    16, 16)
1040c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, LEN,    15, 0)
1041c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(2, ADDR,    22, 0)
1042c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(3, ACC_DEL,    31, 29)
1043c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(3, BURST,    28, 26)
1044c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(3, EXT_SA,    3, 0)
1045c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(4, 2D_MODE,    16, 16)
1046c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(4, REP_COUNT, 10, 0)
1047c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(5, LINE_ADD_OFF, 25, 16)
1048c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(5, ROW_LENGTH, 9, 0)
1049c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(6, SA, 31, 0)
1050c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(7, LISTPTR, 27, 0)
1051c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            }
1052437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1053dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1054c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & AUXBUF_TRACE) {
1055c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("debug_dump_count = %d\n", debug_dump_count);
1056c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            for (i = 0; i < debug_dump_count; i++) {
1057c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                unsigned char *buf_addr;
1058c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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]);
1059c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                if (debug_dump_buf[i]->rar_handle
1060c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    || (psb_buffer_map(debug_dump_buf[i], &buf_addr) != 0)) {
1061c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    psb__trace_message("Unmappable buffer,e.g. RAR buffer\n");
1062c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    continue;
1063c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                }
10647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1065c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                g_hexdump_offset = 0;
1066c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                psb__hexdump(buf_addr + debug_dump_offset[i], debug_dump_size[i]);
1067c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                psb_buffer_unmap(debug_dump_buf[i]);
1068c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            }
1069c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            debug_dump_count = 0;
1070437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1071dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1072c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & CMDMSG_TRACE) {
1073c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("cmd_count = %d, virtual=0x%08x\n",
1074c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                               debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf));
1075c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            for (i = 0; i < debug_cmd_count; i++) {
1076c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                uint32_t *msg = cmdbuf->MTX_msg + i * item_size;
1077c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                int j;
1078c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "start = %08x size = %08x\n", debug_cmd_start[i], debug_cmd_size[i]);
1079c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[i]), debug_cmd_size[i]);
1080c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
1081c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                for (j = 0; j < item_size / 4; j++) {
1082c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j));
1083c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    switch (j) {
1084c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 0:
1085c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[BufferSize|ID|MSG_SIZE]\n");
1086c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1087c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 1:
1088c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[MMUPTD]\n");
1089c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1090c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 2:
1091c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[LLDMA_address]\n");
1092c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1093c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 3:
1094c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Context]\n");
1095c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1096c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 4:
1097c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Fence_Value]\n");
1098c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1099c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 5:
1100c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Operating_Mode]\n");
1101c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1102c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 6:
1103c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[LastMB|FirstMB]\n");
1104c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1105c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 7:
1106c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Flags]\n");
1107c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1108c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    default:
1109c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[overflow]\n");
1110c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1111c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    }
1112c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                }
1113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1114c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            debug_cmd_count = 0;
1115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1116c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_unmap(&cmdbuf->buf);
1117c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_unmap(&cmdbuf->reloc_buf);
1118437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1119c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        cmdbuf->cmd_base = NULL;
1120c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0
1121c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (status) {
1122c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "RENDERING ERROR FRAME=%03d SLICE=%02d status=%d\n", obj_context->frame_count, obj_context->slice_count, status);
1123c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            error_count++;
1124c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            ASSERT(status != 2);
1125c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            ASSERT(error_count < 40); /* Exit on 40 errors */
1126c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
1127c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (fence)
1128c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb_fence_destroy(fence);
1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
1130c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
1131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf = NULL;
11337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->slice_count++;
1134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
11357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
11367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
11377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum {
11407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP0 = 0,
11417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP1 = 1,
11427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP;
11437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum    {
11457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HOST_TO_MSVDX = 0,
11467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MSXDX_TO_HOST = 1,
11477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION;
11487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct {
1150bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32 ui32DevDestAddr ;        /* destination address */
1151bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePW     ePeripheralWidth;
1152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncrSize ePeriphIncrSize;
1153bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncr     ePeriphIncr;
1154bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL            bSynchronous;
1155bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MMU_GROUP           eMMUGroup;
1156bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_DIRECTION       eDMADir;
1157bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_eBurst          eDMA_eBurst;
11587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP;
11597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = {
1162bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* LLDMA_TYPE_VLC_TABLE */ {
1163bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REG_MSVDX_VEC_VLC_OFFSET  ,
1164bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PWIDTH_16_BIT,      /* 16 bit wide data*/
1165bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PERIPH_INCR_4,      /* Incrament the dest by 32 bits */
1166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_2
1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* LLDMA_TYPE_BITSTREAM */ {
1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET),
1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_8_BIT,
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /*LLDMA_TYPE_RESIDUAL*/             {
1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET),
1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_MC*/{
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1199dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1201bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_VLD*/{
1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1209dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1211bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1212dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{
1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1221bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2              /* From VLR */
1222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{
1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1231bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2             /* Into VLR */
1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{
1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1238bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1240dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1241bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* From MTX */
1242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{
1244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1246dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1248bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1250dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1251bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1253dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{
1254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1255dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1257dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1258bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             //2     /* From MTX */
1262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{
1264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1268bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1271bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MEM_SET */{
1274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0),
1275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,       /* na */
1279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4                     /* From VLR */
1282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
12847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
12857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN     ( 0xffff )
12877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1288680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size)
1289680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1290680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    void *pos = (void *)cmdbuf->cmd_idx;
1291680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(!(byte_size % 4));
1292680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1293680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx += (byte_size / 4);
1294680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1295680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    return pos;
1296680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1297680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1298680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf,
1299680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   psb_buffer_p bitstream_buf,
1300680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t buffer_offset,
1301680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t size,
1302680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t dest_offset,
1303680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   DMA_TYPE type)
1304680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1305680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(size < 0xFFFF);
1306680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(buffer_offset < 0xFFFF);
1307680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1308680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    DMA_CMD_WITH_OFFSET* dma_cmd;
1309680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1310680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(dest_offset==0)
1311680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1312680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD));
1313680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = 0;
1314680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1315680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1316680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1317680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET));
1318680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined
1319680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32ByteOffset = dest_offset;
1320680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1321680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1322680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= CMD_DMA;
1323680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= (IMG_UINT32)type;
1324680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= size;
1325680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /* dma_cmd->ui32DevVirtAdd  = ui32DevVirtAddress; */
1326680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf);
1327680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1328680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
13297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1330680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
1331680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1332680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf,
1333680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      psb_buffer_p bitstream_buf,
1334680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t buffer_offset,
1335680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t size_in_bytes,
1336680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t offset_in_bits,
1337680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t flags)
1338680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1339680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /*
1340680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * We use byte alignment instead of 32bit alignment.
1341680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * The third frame of sa10164.vc1 results in the following bitstream
1342680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * patttern:
1343680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * [0000] 00 00 03 01 76 dc 04 8d
1344680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * with offset_in_bits = 0x1e
1345680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * This causes an ENTDEC failure because 00 00 03 is a start code
1346680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * By byte aligning the datastream the start code will be eliminated.
1347680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     */
1348680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
1349680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0
1350680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT        sizeof(uint8_t)
1351680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    uint32_t bs_offset_in_dwords    = ((offset_in_bits / 8) / ALIGNMENT);
1352680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
1353680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
1354680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
1355680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
1356680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1357680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
1358680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = offset_in_bits;
1359680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
1360680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = size_in_bytes;
1361680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1362680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf);
1363680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1364680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1365680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/*
1366680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one
1367680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1368680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf,
1369680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        psb_buffer_p bitstream_buf,
1370680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        uint32_t size_in_bytes)
1371680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1372680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1373680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf);
1374680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1375680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
1376680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1377680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1378680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags)
1379680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1380680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */
1381680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1382680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_wt_p = cmdbuf->cmd_idx;
1383680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = 0;
1384680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */
1385680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
1386680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1387680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1388680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val)
1389680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1390680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1391680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1392680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1393680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1394680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1395680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1396680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1397680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1398680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1399680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1400680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->reg_wt_p++ = val;
1401680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1402680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1403680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1404680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf,
1405680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t reg,
1406680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         psb_buffer_p buffer,
1407680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t buffer_offset)
1408680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1409680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1410680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1411680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1412680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1413680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1414680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1415680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1416680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1417680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1418680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1419680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1420680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer);
1421680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1422680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1423680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1424680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf)
1425680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1426680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx = cmdbuf->reg_wt_p;
1427680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
1428680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_CTRL_HEADER = 0,
14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_HDR,
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_NULL,
14347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_CK_HDR,
14357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS;
14367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format
14394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
1440dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address)
14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
1442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(((dest_address >> 2)& ~0xfff) == 0);
14434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
1444c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang    *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | dest_address;
1445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
14464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf,
1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   unsigned char *block,
1449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t size)
14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((size & 0x3) == 0);
1452e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < size; i += 4) {
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24);
1455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, val);
14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf,
1460dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_buffer_p buffer,
1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     uint32_t buffer_offset)
14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block
14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf)
14704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
14714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
14724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start;
14734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT((dword_count - 1) <= 0xff);
14754b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16);
14774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = NULL;
14784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
14794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
14817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block
14827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition)
14847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */
14867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */
14877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/
1488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_condition = skip_condition;
14907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = cmdbuf->cmd_idx++;
14917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block
14957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1496dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf)
14977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */
14997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */
15007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */
15017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
15027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1);
15037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size;
15057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
15067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1507