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"
57b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_ws_driver.h"
59b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_pool.h>
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_util.h>
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_fencemgr.h>
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Buffer layout:
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         cmd_base <= cmd_idx < CMD_END() == lldma_base
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         lldma_base <= lldma_idx < LLDMA_END() == (cmd_base + size)
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reloc buffer layout:
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         MTX_msg < reloc_base == MTX_msg + MTXMSG_SIZE
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *         reloc_base <= reloc_idx < RELOC_END() == (MTX_msg + reloc_size)
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_END(cmdbuf)    (cmdbuf->reloc_base)
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_END(cmdbuf)     (cmdbuf->MTX_msg + cmdbuf->reloc_size)
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_END(cmdbuf)       (cmdbuf->lldma_base)
787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_END(cmdbuf)     (cmdbuf->cmd_base + cmdbuf->size)
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_SIZE           (0x1000)
817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_SIZE            (0x3000)
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_SIZE              (0x3000)
847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_SIZE            (0x2000)
857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MTXMSG_MARGIN         (0x0040)
877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define RELOC_MARGIN          (0x0800)
887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define CMD_MARGIN            (0x0400)
907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define LLDMA_MARGIN          (0x0400)
91913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#define PSB_SLICE_EXTRACT_UPDATE (0x2)
927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create command buffer
957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangVAStatus psb_cmdbuf_create(object_context_p obj_context, psb_driver_data_p driver_data,
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_cmdbuf_p cmdbuf
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
1017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int size = CMD_SIZE + LLDMA_SIZE;
1027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_size = MTXMSG_SIZE + RELOC_SIZE;
103bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    unsigned int regio_size = (obj_context->picture_width >> 4) * (obj_context->picture_height >> 4) * 172;
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->size = 0;
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_size = 0;
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_size = 0;
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_base = NULL;
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->regio_idx = NULL;
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reg_start = NULL;
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_block_start = NULL;
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->rendec_chunk_start = NULL;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_allocated = 10;
1252befccec034c13d34746a9e87149889d59ac767bFei Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == cmdbuf->buffer_refs) {
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_vpu, &cmdbuf->buf);
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = size;
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, reloc_size, psb_bt_cpu_only, &cmdbuf->reloc_buf);
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = reloc_size;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, regio_size, psb_bt_cpu_only, &cmdbuf->regio_buf);
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = regio_size;
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus) {
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_cmdbuf_destroy(cmdbuf);
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return vaStatus;
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_destroy(psb_cmdbuf_p cmdbuf)
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->size) {
155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->buf);
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->size = 0;
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->reloc_size) {
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->reloc_buf);
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->reloc_size = 0;
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
162dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->regio_size) {
163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->regio_buf);
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->regio_size = 0;
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->buffer_refs_allocated) {
167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(cmdbuf->buffer_refs);
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs = NULL;
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuf->buffer_refs_allocated = 0;
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reset buffer & map
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_reset(psb_cmdbuf_p cmdbuf)
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
1907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->last_next_segment_cmd = NULL;
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->buffer_refs_count = 0;
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->deblock_count = 0;
195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->oold_count = 0;
196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->host_be_opp_count = 0;
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    cmdbuf->frame_info_count = 0;
198e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
199e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    cmdbuf->parse_count = 0;
200e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(&cmdbuf->buf);
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = cmdbuf->cmd_base + CMD_SIZE;
2157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = cmdbuf->lldma_base;
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = cmdbuf->MTX_msg + MTXMSG_SIZE;
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
2197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Add ourselves to the buffer list */
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->reloc_buf); /* reloc buf == 0 */
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 1 */
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_unmap(psb_cmdbuf_p cmdbuf)
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->MTX_msg = NULL;
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_base = NULL;
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_start = NULL;
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_idx = NULL;
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_bitstream_size = NULL;
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_base = NULL;
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->lldma_idx = NULL;
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_base = NULL;
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx = NULL;
2427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count = 0;
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->buf);
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->reloc_buf);
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Reference an addtional buffer "buf" in the command stream
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns a reference index that can be used to refer to "buf" in
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * relocation records, -1 on error
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_cmdbuf_buffer_ref(psb_cmdbuf_p cmdbuf, psb_buffer_p buf)
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
256dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int item_loc = 0;
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
258dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    // buf->next = NULL; /* buf->next only used for buffer list validation */
259dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while ((item_loc < cmdbuf->buffer_refs_count)
260bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang           && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
261bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               != wsbmKBufHandle(wsbmKBuf(buf->drm_buf)))) {
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        item_loc++;
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (item_loc == cmdbuf->buffer_refs_count) {
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Add new entry */
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (item_loc >= cmdbuf->buffer_refs_allocated) {
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* Allocate more entries */
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            int new_size = cmdbuf->buffer_refs_allocated + 10;
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb_buffer_p *new_array;
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == new_array) {
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                return -1; /* Allocation failure */
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
275dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            free(cmdbuf->buffer_refs);
276dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs_allocated = new_size;
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            cmdbuf->buffer_refs = new_array;
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs[item_loc] = buf;
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        cmdbuf->buffer_refs_count++;
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->status = psb_bs_queued;
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
283dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        buf->next = NULL;
28479aba326cdfb39a46fc869927999f5002e879871Li Zeng        buf->unfence_flag = 0;
285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* only for RAR buffers */
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((cmdbuf->buffer_refs[item_loc] != buf)
289bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        && (buf->rar_handle != 0)) {
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_p tmp = cmdbuf->buffer_refs[item_loc];
291c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: found same drm buffer with different psb buffer, link them\n",
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 tmp, buf);
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        while ((tmp->next != NULL)) {
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp = tmp->next;
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (tmp == buf) /* found same buffer */
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                break;
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (tmp != buf) {
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            tmp->next = buf; /* link it */
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->status = psb_bs_queued;
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            buf->next = NULL;
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
304c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "RAR: buffer aleady in the list, skip\n",
305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     tmp, buf);
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return item_loc;
3107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "addr_in_cmdbuf"
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * The relocation is based on the device virtual address of "ref_buffer"
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * right shifted with "align_shift".
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * "mask" determines which bits of the target DWORD will be updated with the so
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * constructed address. The remaining bits will be filled with bits from "background".
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_add_relocation(psb_cmdbuf_p cmdbuf,
321dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t *addr_in_cmdbuf,
322dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_buffer_p ref_buffer,
323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t buf_offset,
324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t mask,
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t background,
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t align_shift,
327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t dst_buffer) /* 0 = reloc buf, 1 = cmdbuf, 2 = for host reloc */
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Check that address is within buffer range */
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (dst_buffer) {
334e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->cmd_base);
335e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < LLDMA_END(cmdbuf));
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->cmd_base; /* Location in DWORDs */
337dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
338e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) >= cmdbuf->MTX_msg);
339e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        ASSERT(((unsigned char *)(addr_in_cmdbuf)) < MTXMSG_END(cmdbuf));
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        reloc->where = addr_in_cmdbuf - (uint32_t *) cmdbuf->MTX_msg; /* Location in DWORDs */
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
343dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    reloc->buffer = psb_cmdbuf_buffer_ref(cmdbuf, ref_buffer);
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(reloc->buffer != -1);
345dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
348c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    psb__trace_message("[RE] Reloc at offset %08x (%08x), offset = %08x background = %08x buffer = %d (%08x)\n",
349c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        reloc->where, reloc->where << 2, buf_offset, background, reloc->buffer, presumed_offset);
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (presumed_offset) {
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t new_val =  presumed_offset + buf_offset;
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        new_val = (background & ~mask) | (new_val & mask);
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = new_val;
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        *addr_in_cmdbuf = PSB_RELOC_MAGIC;
3587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->mask = mask;
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->pre_add =  buf_offset;
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->background = background;
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc->dst_buffer = dst_buffer;
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->reloc_idx++;
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
367e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf));
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Advances "obj_context" to the next cmdbuf
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_get_next_cmdbuf(object_context_p obj_context)
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf;
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
379dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf) {
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0;
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf_current++;
385dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf_current >= PSB_MAX_CMDBUFS) {
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf_current = 0;
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf = obj_context->cmdbuf_list[obj_context->cmdbuf_current];
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_cmdbuf_reset(cmdbuf);
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ret) {
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Success */
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = cmdbuf;
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic unsigned
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,JiangpsbTimeDiff(struct timeval *now, struct timeval *then)
4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    long long val;
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val = now->tv_sec - then->tv_sec;
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val *= 1000000LL;
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val += now->tv_usec;
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    val -= then->tv_usec;
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (val < 1LL)
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        val = 1LL;
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return (unsigned) val;
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * It allows different buffers as command- and reloc buffer. A list of
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * cliprects to apply and whether to copy the clipRect content to all
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * scanout buffers (damage = 1).
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Don't add debug statements in this function, it gets called with the
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * DRM lock held and output to an X terminal can cause X to deadlock
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstatic int
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunpsbDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
427cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan             unsigned numRelocs, int __maybe_unused damage,
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_arg)
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    drm_psb_cmdbuf_arg_t ca;
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_validate_arg *arg_list;
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int i;
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct timeval then, now;
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    Bool have_then = FALSE;
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (arg_list == NULL) {
440c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Malloc failed \n");
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -ENOMEM;
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
443dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_req *req = &arg->d.req;
4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->next = (unsigned long) & (arg_list[i+1]);
449dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
45158c96451d7ea53930d4eb94b6573571a51170de4Fei Jiang        //req->group = 0;
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
4567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        req->presumed_flags = PSB_USE_PRESUMED;
4574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        req->pad64 = (uint32_t)buffer_list[i]->pl_flags;
458367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#ifndef BAYTRAIL
459367040d221af4e32e54530425f87fb576bc28ae0Li Zeng        req->unfence_flag = buffer_list[i]->unfence_flag;
460367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#endif
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    arg_list[buffer_count-1].d.req.next = 0;
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
465dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.fence_arg = (uint64_t)((unsigned long)fence_arg);
466dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_handle = cmdBufHandle;
4687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_offset = cmdBufOffset;
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.cmdbuf_size = cmdBufSize;
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_handle = relocBufHandle;
4727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.reloc_offset = relocBufOffset;
4737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.num_relocs = numRelocs;
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.fence_flags = fence_flags;
4767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ca.engine = engine;
4777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
478bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang#if 0
479c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: buffer_list   = %08x\n", ca.buffer_list);
480c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: clip_rects    = %08x\n", ca.clip_rects);
481c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_handle = %08x\n", ca.cmdbuf_handle);
482c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_offset = %08x\n", ca.cmdbuf_offset);
483c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: cmdbuf_size   = %08x\n", ca.cmdbuf_size);
484c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_handle  = %08x\n", ca.reloc_handle);
485c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: reloc_offset  = %08x\n", ca.reloc_offset);
486c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: num_relocs    = %08x\n", ca.num_relocs);
487c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: engine        = %08x\n", ca.engine);
488c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "PSB submit: fence_flags   = %08x\n", ca.fence_flags);
4897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
4907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /*
4927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * X server Signals will clobber the kernel time out mechanism.
4937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     * we need a user-space timeout as well.
4947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang     */
4957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    do {
4967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
4977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (ret == EAGAIN) {
4987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (!have_then) {
4997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                if (gettimeofday(&then, NULL)) {
500c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n");
5017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                    break;
5027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                }
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                have_then = TRUE;
5057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            if (gettimeofday(&now, NULL)) {
507c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_ERROR, "Gettimeofday error.\n");
5087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
510dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    } while ((ret == EAGAIN) && (psbTimeDiff(&now, &then) < PSB_TIMEOUT_USEC));
5137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
515c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "command write return is %d\n", ret);
5167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        goto out;
5177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
519dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
5217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        struct psb_validate_rep *rep = &arg->d.rep;
522dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
523367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#ifndef BAYTRAIL
524367040d221af4e32e54530425f87fb576bc28ae0Li Zeng        if (arg->d.req.unfence_flag)
525367040d221af4e32e54530425f87fb576bc28ae0Li Zeng            continue;
526367040d221af4e32e54530425f87fb576bc28ae0Li Zeng#endif
527367040d221af4e32e54530425f87fb576bc28ae0Li Zeng
5287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (!arg->handled) {
5297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = -EFAULT;
5307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (arg->ret != 0) {
5337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            ret = arg->ret;
5347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            goto out;
5357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        }
5367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
5377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
5387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
5397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout:
5417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    free(arg_list);
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
5437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * Buffer no longer queued in userspace
5457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
5467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb_buffer_p tmp = buffer_list[i];
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /*
5497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * RAR slice buffer/surface buffer are share one BO, and then only one in
5507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         * buffer_list, but they are linked in psb_cmdbuf_buffer_ref
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang         */
553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (buffer_list[i]->rar_handle == 0)
5547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp->next = NULL; /* don't loop for non RAR buffer, "next" may be not initialized  */
555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        do {
5577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_p p = tmp;
5587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            tmp = tmp->next;
5607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            switch (p->status) {
5617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_queued:
5627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                p->status = psb_bs_ready;
5637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            case psb_bs_abandoned:
5667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                psb_buffer_destroy(p);
5677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                free(p);
5687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                break;
5697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            default:
5717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                /* Not supposed to happen */
5727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                ASSERT(0);
5737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            }
5747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        } while (tmp);
5757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
5787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
58038f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0
5817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangint psb_fence_destroy(struct _WsbmFenceObject *pFence)
5827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmFenceUnreference(&pFence);
5847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
5867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
5877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangstruct _WsbmFenceObject *
589bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wangpsb_fence_wait(psb_driver_data_p driver_data,
590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               struct psb_ttm_fence_rep *fence_rep, int *status)
5917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
5927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
5937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct _WsbmFenceObject *fence = NULL;
5947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = -1;
595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* copy fence information */
5977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (fence_rep->error != 0) {
598c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence"
5997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                           " and has idled the HW\n");
6007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
6017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return NULL;
6027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
6037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
6057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            fence_rep->fence_type,
606e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                            (unsigned char *)fence_rep->handle,
6077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                            0);
608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (fence)
609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
610dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
6117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return fence;
6127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
61338f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif
6147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
6167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Closes the last segment
6177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
618cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanstatic void psb_cmdbuf_close_segment(psb_cmdbuf_p __maybe_unused cmdbuf)
6197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
62038f419a75e2994d6afe2ffb360d5f5b7670ce077hding#if 0
621e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t bytes_used = ((unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start) % MTX_SEG_SIZE;
622e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *segment_start = (unsigned char *) cmdbuf->cmd_idx - bytes_used;
623dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    uint32_t lldma_record_offset = psb_cmdbuf_lldma_create(cmdbuf,
624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   &(cmdbuf->buf), (segment_start - cmdbuf->cmd_base) /* offset */,
625dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   bytes_used,
626dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   0 /* destination offset */,
627dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   LLDMA_TYPE_RENDER_BUFF_MC);
6287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t cmd = CMD_NEXT_SEG;
629dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    RELOC_SHIFT4(*cmdbuf->last_next_segment_cmd, lldma_record_offset, cmd, &(cmdbuf->buf));
630dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *(cmdbuf->last_next_segment_cmd + 1) = bytes_used;
63138f419a75e2994d6afe2ffb360d5f5b7670ce077hding#endif
6327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
6337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
6344b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/* Issue deblock cmd, HW will do deblock instead of host */
6354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuoint psb_context_submit_hw_deblock(object_context_p obj_context,
6364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_a,
6374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p buf_b,
6384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  psb_buffer_p colocate_buffer,
6394b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t picture_widht_mb,
6404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t frame_height_mb,
6414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t rotation_flags,
642dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t field_type,
643dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                  uint32_t ext_stride_a,
6444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_a,
6454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t chroma_offset_b,
6464b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo                                  uint32_t is_oold)
6474b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
6484b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
6494b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
6504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = FW_DEVA_DEBLOCK_SIZE;
65106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
6524b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    FW_VA_DEBLOCK_MSG *deblock_msg;
6534b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
654e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count);
6554b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
6574b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
6584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6599769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE;
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (is_oold)
6614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_OOLD_MFLD;
6624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    else
6634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        deblock_msg->header.bits.msg_type = VA_MSGID_DEBLOCK_MFLD;
6645ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_VA_RENDER_IS_LAST_SLICE | FW_DEVA_DEBLOCK_ENABLE;
6654b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->flags.bits.slice_type = field_type;
6664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->operating_mode = obj_context->operating_mode;
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context);
6684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
6704b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->ext_stride_a = ext_stride_a;
6714b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    deblock_msg->rotation_flags = rotation_flags;
6724b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
6744b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (buf_b) {
6764b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
6774b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
6784b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    }
6794b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
6804b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    RELOC_MSG(deblock_msg->mb_param_address, colocate_buffer->buffer_ofs, colocate_buffer);
6814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->deblock_count++;
6824b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    return 0;
6834b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
6847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
68517f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#ifdef PSBVIDEO_MSVDX_EC
686f31d5416a60f83e184b0906a7ec77ba021840531hdingint psb_context_submit_host_be_opp(object_context_p obj_context,
687f31d5416a60f83e184b0906a7ec77ba021840531hding                                  psb_buffer_p buf_a,
688f31d5416a60f83e184b0906a7ec77ba021840531hding                                  psb_buffer_p buf_b,
689cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                                  psb_buffer_p __maybe_unused buf_c,
690f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t picture_widht_mb,
691f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t frame_height_mb,
692f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t rotation_flags,
693f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t field_type,
694f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t ext_stride_a,
695f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t chroma_offset_a,
696f31d5416a60f83e184b0906a7ec77ba021840531hding                                  uint32_t chroma_offset_b)
697f31d5416a60f83e184b0906a7ec77ba021840531hding{
698f31d5416a60f83e184b0906a7ec77ba021840531hding    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
699f31d5416a60f83e184b0906a7ec77ba021840531hding    psb_driver_data_p driver_data = obj_context->driver_data;
7009769d6a0972207564efb82e397f19ec002841f65Li Zeng    uint32_t msg_size = sizeof(FW_VA_DEBLOCK_MSG);
70106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
702f31d5416a60f83e184b0906a7ec77ba021840531hding    FW_VA_DEBLOCK_MSG *deblock_msg;
703f31d5416a60f83e184b0906a7ec77ba021840531hding
704f31d5416a60f83e184b0906a7ec77ba021840531hding    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + item_size * cmdbuf->cmd_count + cmdbuf->deblock_count * msg_size);
705f31d5416a60f83e184b0906a7ec77ba021840531hding
706f31d5416a60f83e184b0906a7ec77ba021840531hding    memset(msg, 0, sizeof(FW_VA_DEBLOCK_MSG));
707f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg = (FW_VA_DEBLOCK_MSG *)msg;
708f31d5416a60f83e184b0906a7ec77ba021840531hding
7099769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->header.bits.msg_size = FW_DEVA_DEBLOCK_SIZE;
710f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->header.bits.msg_type = VA_MSGID_HOST_BE_OPP_MFLD;
711f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->flags.bits.flags = FW_VA_RENDER_HOST_INT | FW_ERROR_DETECTION_AND_RECOVERY;
712f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->flags.bits.slice_type = field_type;
713f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->operating_mode = obj_context->operating_mode;
714f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->mmu_context.bits.context = (uint8_t)(obj_context->msvdx_context);
715f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->pic_size.bits.frame_height_mb = (uint16_t)frame_height_mb;
716f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->pic_size.bits.pic_width_mb = (uint16_t)picture_widht_mb;
717f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->ext_stride_a = ext_stride_a;
718f31d5416a60f83e184b0906a7ec77ba021840531hding    deblock_msg->rotation_flags = rotation_flags;
719f31d5416a60f83e184b0906a7ec77ba021840531hding
720f31d5416a60f83e184b0906a7ec77ba021840531hding    RELOC_MSG(deblock_msg->address_a0, buf_a->buffer_ofs, buf_a);
721f31d5416a60f83e184b0906a7ec77ba021840531hding    RELOC_MSG(deblock_msg->address_a1, buf_a->buffer_ofs + chroma_offset_a, buf_a);
7229769d6a0972207564efb82e397f19ec002841f65Li Zeng    RELOC_MSG(deblock_msg->address_b0, buf_b->buffer_ofs, buf_b);
7239769d6a0972207564efb82e397f19ec002841f65Li Zeng    RELOC_MSG(deblock_msg->address_b1, buf_b->buffer_ofs + chroma_offset_b, buf_b);
724f31d5416a60f83e184b0906a7ec77ba021840531hding
7259769d6a0972207564efb82e397f19ec002841f65Li Zeng    deblock_msg->mb_param_address = wsbmKBufHandle(wsbmKBuf(buf_a->drm_buf));
7269769d6a0972207564efb82e397f19ec002841f65Li Zeng    cmdbuf->deblock_count++;
727f31d5416a60f83e184b0906a7ec77ba021840531hding    return 0;
728f31d5416a60f83e184b0906a7ec77ba021840531hding}
72917f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif
7307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
7317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Submits the current cmdbuf
7327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
7337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
7347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
735dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_submit_cmdbuf(object_context_p obj_context)
7367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
7377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
7384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    psb_driver_data_p driver_data = obj_context->driver_data;
73906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
740c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    int ret;
7414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
743e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; // In bytes
7447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
745dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->last_next_segment_cmd) {
7467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        cmdbuffer_size = cmdbuf->first_segment_size;
747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_close_segment(cmdbuf);
7487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
7497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t msg_size = item_size;
751e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + cmdbuf->cmd_count * msg_size + cmdbuf->frame_info_count * FW_VA_FRAME_INFO_SIZE);
7527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
753c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & CMDMSG_TRACE)) {
754c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_start[cmdbuf->cmd_count] = cmdbuf->cmd_start - cmdbuf->cmd_base;
755c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_size[cmdbuf->cmd_count] = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start;
756c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_cmd_count = cmdbuf->cmd_count + 1;
757c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
7584b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
759fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
7604b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static int c = 0;
7614b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    static char pFileName[30];
7624b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
764dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    sprintf(pFileName , "cmdbuf%i.txt", c++);
765dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    FILE* pF = fopen(pFileName, "w");
7664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7674b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fwrite(cmdbuf->cmd_start, 1, cmdbuffer_size, pF);
7684b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    fclose(pF);
769fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang*/
770fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = psb_cmdbuf_dump((unsigned int *)cmdbuf->cmd_start, cmdbuffer_size);
771fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if(ret)
772c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_cmdbuf: dump cmdbuf fail\n");
7734b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
7747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->cmd_count++;
7757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memset(msg, 0, msg_size);
7767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    *cmdbuf->cmd_idx = 0; // Add a trailing 0 just in case.
7787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
779e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
7807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
7814b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_SIZE,                  msg_size);
782bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MEMIO_WRITE_FIELD(msg, FWRK_GENMSG_ID,                    VA_MSGID_RENDER);
7837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
784439ac7d8f5824cd50eeab72deda0dcbf9f2aedbfShuduo Sang        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_CONTEXT, (obj_context->msvdx_context)); /* context is 8 bits */
7854b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
78606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    /* Point to CMDBUFFER */
78706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    RELOC_MSG(*(msg + (FW_DEVA_DECODE_LLDMA_ADDRESS_OFFSET / sizeof(uint32_t))),
78806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng              (cmdbuf->cmd_start - cmdbuf->cmd_base), &(cmdbuf->buf));
78906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE,          cmdbuffer_size / 4); // In dwords
79006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE,       obj_context->operating_mode);
79106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS,                obj_context->flags);
792c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
793c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp && (psb_video_trace_level & LLDMA_TRACE)) {
794c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_lldma_count = (cmdbuf->lldma_idx - cmdbuf->lldma_base) / sizeof(DMA_sLinkedList);
795c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        debug_lldma_start = cmdbuf->lldma_base - cmdbuf->cmd_base;
796c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        /* Indicate last LLDMA record (for debugging) */
797c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        ((uint32_t *)cmdbuf->lldma_idx)[1] = 0;
798c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
7997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
800e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    cmdbuf->cmd_start = (unsigned char *)cmdbuf->cmd_idx;
8017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
802c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return psb_context_flush_cmdbuf(obj_context);
804c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    } else {
805c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if ((cmdbuf->cmd_count >= MAX_CMD_COUNT) ||
806c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (MTXMSG_END(cmdbuf) - (unsigned char *) msg < MTXMSG_MARGIN) ||
807c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (CMD_END(cmdbuf) - (unsigned char *) cmdbuf->cmd_idx < CMD_MARGIN) ||
808c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (LLDMA_END(cmdbuf) - cmdbuf->lldma_idx < LLDMA_MARGIN) ||
809c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            (RELOC_END(cmdbuf) - (unsigned char *) cmdbuf->reloc_idx < RELOC_MARGIN)) {
810c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            return psb_context_flush_cmdbuf(obj_context);
811c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
8127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
8147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
8157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
8177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Flushes all cmdbufs
8187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_context_flush_cmdbuf(object_context_p obj_context)
8207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
8217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_cmdbuf_p cmdbuf = obj_context->cmdbuf;
8227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
8237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int fence_flags;
824437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* unsigned int fence_handle = 0; */
8257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    struct psb_ttm_fence_rep fence_rep;
8267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int reloc_offset;
8277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    unsigned int num_relocs;
8287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
82906c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng    unsigned int item_size = FW_DEVA_DECODE_SIZE; /* Size of a render/deocde msg */
8307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
831e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
832e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    if ((NULL == cmdbuf) ||
833e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count +
834e853beb775a5de607bd080d7d43e638f95199e68Nana GUo            cmdbuf->frame_info_count + cmdbuf->parse_count))) {
835e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        return 0; // Nothing to do
836e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    }
837e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#else
838dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if ((NULL == cmdbuf) ||
839bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        (0 == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->host_be_opp_count + cmdbuf->frame_info_count))) {
8407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return 0; // Nothing to do
8417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
842e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
8437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t msg_size = 0;
845e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    uint32_t *msg = (uint32_t *)cmdbuf->MTX_msg;
846cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    int32_t i;
847cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan    uint32_t index;
8487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* LOCK */
8507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
851dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
8527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
8537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
8547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
8557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
856dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
857dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->frame_info_count; i++) {
858bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_FRAME_INFO_SIZE;
859bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg += FW_VA_FRAME_INFO_SIZE / sizeof(uint32_t);
860dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
861dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
862dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->cmd_count; i++) {
8634b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        uint32_t flags;
864dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
86506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        flags = MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS);
8664b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
8677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        /* Update flags */
868dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        int bBatchEnd = (i == (cmdbuf->cmd_count + cmdbuf->deblock_count + cmdbuf->oold_count
869dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               + cmdbuf->host_be_opp_count));
870dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        flags |=
8719769d6a0972207564efb82e397f19ec002841f65Li Zeng            (bBatchEnd ? FW_VA_RENDER_HOST_INT : FW_VA_RENDER_NO_RESPONCE_MSG);
8727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
873f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_EC
874680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        if (driver_data->ec_enabled)
875dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            flags |= FW_ERROR_DETECTION_AND_RECOVERY;
8769c84210c502eba75e1db7a5284eb584452963c67hding#endif
8777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
87806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        MEMIO_WRITE_FIELD(msg, FW_DEVA_DECODE_FLAGS, flags);
8797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
88006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
88106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
88206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        psb__trace_message("MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
883dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
88406c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG BUFFER_SIZE       = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_BUFFER_SIZE));
88506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG OPERATING_MODE    = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_OPERATING_MODE));
88606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng        drv_debug_msg(VIDEO_DEBUG_GENERAL, "MSG FLAGS             = %08x\n", MEMIO_READ_FIELD(msg, FW_DEVA_DECODE_FLAGS));
8877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8884b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#if 0  /* todo */
8894b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        /* Update SAREA */
8904b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        driver_data->psb_sarea->msvdx_context = obj_context->msvdx_context;
8914b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#endif
8924b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg += item_size / sizeof(uint32_t);
8934b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        msg_size += item_size;
8947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
8957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
8967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Assume deblock message is following render messages and no more render message behand deblock message */
897dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->deblock_count; i++) {
8989769d6a0972207564efb82e397f19ec002841f65Li Zeng            msg_size += sizeof(FW_VA_DEBLOCK_MSG);
8997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
900dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
901dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->oold_count; i++) {
9029769d6a0972207564efb82e397f19ec002841f65Li Zeng        msg_size += sizeof(FW_VA_DEBLOCK_MSG);
903437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
904dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
905dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 1; i <= cmdbuf->host_be_opp_count; i++) {
906bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        msg_size += FW_VA_HOST_BE_OPP_SIZE;
907dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
908e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
909e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    for (i = 1; i <= cmdbuf->parse_count; i++) {
910e853beb775a5de607bd080d7d43e638f95199e68Nana GUo        msg_size += sizeof(struct fw_slice_header_extract_msg);
911e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    }
912e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
9137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Now calculate the total number of relocations */
9147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->MTX_msg;
915e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
9167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
917c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf MTXMSG size = %08x [%08x]\n", msg_size, MTXMSG_SIZE);
918c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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);
919c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf LLDMA size = %08x [%08x]\n", cmdbuf->lldma_idx - cmdbuf->lldma_base, LLDMA_SIZE);
920c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Cmdbuf RELOC size = %08x [%08x]\n", num_relocs * sizeof(struct drm_psb_reloc), RELOC_SIZE);
921dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
922dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_cmdbuf_unmap(cmdbuf);
9237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    psb__trace_message(NULL); /* Flush trace */
925dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
926dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->MTX_msg);
927dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->reloc_base);
9287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
929c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp)
930c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = 0;
931c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    else
932c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = DRM_PSB_FENCE_NO_USER;
9337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
934913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#ifdef SLICE_HEADER_PARSING
935913999933b93af5ec1cc99a28b961fa12834c085Nana GUo    if (obj_context->msvdx_frame_end)
936913999933b93af5ec1cc99a28b961fa12834c085Nana GUo        fence_flags |= PSB_SLICE_EXTRACT_UPDATE;
937913999933b93af5ec1cc99a28b961fa12834c085Nana GUo#endif
9387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* cmdbuf will be validated as part of the buffer list */
9397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* Submit */
9407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteLockKernelBO();
941dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psbDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, cmdbuf->buffer_refs,
942dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       cmdbuf->buffer_refs_count,
943dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
944dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       0, msg_size,
945dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->reloc_buf.drm_buf)),
946dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       reloc_offset, num_relocs,
947cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang                       0, PSB_ENGINE_DECODE, fence_flags, &fence_rep);
9487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmWriteUnlockKernelBO();
9497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    UNLOCK_HARDWARE(driver_data);
950c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
951dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
9527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->cmdbuf = NULL;
9537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        obj_context->slice_count++;
9547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
9557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
9567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
9577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
9587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
959c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
9607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#if 0
961c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        static int error_count = 0;
962c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        int status = 0;
963c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        struct _WsbmFenceObject *fence = NULL;
964c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence = psb_fence_wait(driver_data, &fence_rep, &status);
965c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
966dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
967437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
968c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
9698bc6a6aa815a18f936036b5a47106b47aa904b1bhding        int ret;
9708bc6a6aa815a18f936036b5a47106b47aa904b1bhding        ret = psb_buffer_map(&cmdbuf->reloc_buf, &cmdbuf->MTX_msg);
9718bc6a6aa815a18f936036b5a47106b47aa904b1bhding        if(ret) {
9728bc6a6aa815a18f936036b5a47106b47aa904b1bhding            psb_buffer_unmap(&cmdbuf->buf);
9738bc6a6aa815a18f936036b5a47106b47aa904b1bhding            return ret;
9748bc6a6aa815a18f936036b5a47106b47aa904b1bhding        }
975c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
976c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & LLDMA_TRACE) {
977c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("lldma_count = %d, vitual=0x%08x\n",
978c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                               debug_lldma_count,  wsbmBOOffsetHint(cmdbuf->buf.drm_buf) + CMD_SIZE);
979cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            for (index = 0; index < debug_lldma_count; index++) {
980c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DMA_sLinkedList* pasDmaList = (DMA_sLinkedList*)(cmdbuf->cmd_base + debug_lldma_start);
981cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                pasDmaList += index;
982c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
983c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                psb__trace_message("\nLLDMA record at offset %08x\n", ((unsigned char*)pasDmaList) - cmdbuf->cmd_base);
984c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, BSWAP,    31, 31)
985c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, DIR,    30, 30)
986c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(0, PW,    29, 28)
987c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, List_FIN, 31, 31)
988c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, List_INT, 30, 30)
989c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, PI,    18, 17)
990c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, INCR,    16, 16)
991c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(1, LEN,    15, 0)
992c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(2, ADDR,    22, 0)
993c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(3, ACC_DEL,    31, 29)
994c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(3, BURST,    28, 26)
995c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(3, EXT_SA,    3, 0)
996c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(4, 2D_MODE,    16, 16)
997c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(4, REP_COUNT, 10, 0)
998c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(5, LINE_ADD_OFF, 25, 16)
999c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DW(5, ROW_LENGTH, 9, 0)
1000c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(6, SA, 31, 0)
1001c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                DWH(7, LISTPTR, 27, 0)
1002c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            }
1003437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1004dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1005c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & AUXBUF_TRACE) {
1006c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("debug_dump_count = %d\n", debug_dump_count);
1007cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            for (index = 0; index < debug_dump_count; index++) {
1008c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                unsigned char *buf_addr;
1009cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                psb__trace_message("Buffer %d = '%s' offset = %08x size = %08x\n", index, debug_dump_name[index], debug_dump_offset[index], debug_dump_size[index]);
1010cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                if (debug_dump_buf[index]->rar_handle
1011cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                    || (psb_buffer_map(debug_dump_buf[index], &buf_addr) != 0)) {
1012c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    psb__trace_message("Unmappable buffer,e.g. RAR buffer\n");
1013c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    continue;
1014c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                }
10157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1016c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                g_hexdump_offset = 0;
1017cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                psb__hexdump(buf_addr + debug_dump_offset[index], debug_dump_size[index]);
1018cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                psb_buffer_unmap(debug_dump_buf[index]);
1019c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            }
1020c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            debug_dump_count = 0;
1021437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
1022dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1023c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (psb_video_trace_level & CMDMSG_TRACE) {
1024c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb__trace_message("cmd_count = %d, virtual=0x%08x\n",
1025c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                               debug_cmd_count, wsbmBOOffsetHint(cmdbuf->buf.drm_buf));
1026cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan            for (index = 0; index < debug_cmd_count; index++) {
1027cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                uint32_t *msg = (uint32_t *)(cmdbuf->MTX_msg + index * item_size);
1028cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                uint32_t j;
1029cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                drv_debug_msg(VIDEO_DEBUG_GENERAL, "start = %08x size = %08x\n", debug_cmd_start[index], debug_cmd_size[index]);
1030cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan                debug_dump_cmdbuf((uint32_t *)(cmdbuf->cmd_base + debug_cmd_start[index]), debug_cmd_size[index]);
1031c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang
1032c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                for (j = 0; j < item_size / 4; j++) {
1033c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    psb__trace_message("MTX msg[%d] = 0x%08x", j, *(msg + j));
1034c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    switch (j) {
1035c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 0:
1036c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[BufferSize|ID|MSG_SIZE]\n");
1037c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1038c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 1:
1039c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[MMUPTD]\n");
1040c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1041c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 2:
1042c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[LLDMA_address]\n");
1043c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1044c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 3:
1045c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Context]\n");
1046c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1047c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 4:
1048c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Fence_Value]\n");
1049c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1050c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 5:
1051c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Operating_Mode]\n");
1052c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1053c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 6:
1054c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[LastMB|FirstMB]\n");
1055c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1056c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    case 7:
1057c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[Flags]\n");
1058c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1059c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    default:
1060c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        psb__trace_message("[overflow]\n");
1061c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                        break;
1062c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                    }
1063c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                }
1064dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
1065c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            debug_cmd_count = 0;
1066dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
1067c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_unmap(&cmdbuf->buf);
1068c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        psb_buffer_unmap(&cmdbuf->reloc_buf);
1069437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
1070c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        cmdbuf->cmd_base = NULL;
1071c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0
1072c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (status) {
1073c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei 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);
1074c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            error_count++;
1075c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            ASSERT(status != 2);
1076c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            ASSERT(error_count < 40); /* Exit on 40 errors */
1077c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
1078c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (fence)
1079c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            psb_fence_destroy(fence);
1080dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
1081c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    }
1082dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->cmdbuf = NULL;
10847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    obj_context->slice_count++;
1085dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
10867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
10877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
10887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum {
10917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP0 = 0,
10927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MMU_GROUP1 = 1,
10937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} MMU_GROUP;
10947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
10957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef enum    {
10967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    HOST_TO_MSVDX = 0,
10977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MSXDX_TO_HOST = 1,
10987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DIRECTION;
10997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiangtypedef struct {
1101bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_UINT32 ui32DevDestAddr ;        /* destination address */
1102bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePW     ePeripheralWidth;
1103bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncrSize ePeriphIncrSize;
1104bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_ePeriphIncr     ePeriphIncr;
1105bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    IMG_BOOL            bSynchronous;
1106bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    MMU_GROUP           eMMUGroup;
1107bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_DIRECTION       eDMADir;
1108bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    DMA_eBurst          eDMA_eBurst;
11097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} DMA_DETAIL_LOOKUP;
11107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
11117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunstatic const DMA_DETAIL_LOOKUP DmaDetailLookUp[] = {
1113bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /* LLDMA_TYPE_VLC_TABLE */ {
1114bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        REG_MSVDX_VEC_VLC_OFFSET  ,
1115bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PWIDTH_16_BIT,      /* 16 bit wide data*/
1116bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_PERIPH_INCR_4,      /* Incrament the dest by 32 bits */
1117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_2
1122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* LLDMA_TYPE_BITSTREAM */ {
1124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_OFFSET + MSVDX_VEC_CR_VEC_SHIFTREG_STREAMIN_OFFSET),
1125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_8_BIT,
1126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1133bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang    /*LLDMA_TYPE_RESIDUAL*/             {
1134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VDMC_OFFSET + MSVDX_VDMC_CR_VDMC_RESIDUAL_DIRECT_INSERT_DATA_OFFSET),
1135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1136dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1138dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_FALSE,
1139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4
1142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1143dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1144dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_MC*/{
1145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1150dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1152bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1154dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_RENDER_BUFF_VLD*/{
1155dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1157dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1162bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1163dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_SAVE*/{
1165dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1168dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1172bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2              /* From VLR */
1173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MPEG4_FESTATE_RESTORE*/{
1175dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xB90),
1176dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1177dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_ON,
1179dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,
1180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1182bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_2             /* Into VLR */
1183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_SAVE*/{
1185dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1187dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1188dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1189bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1192bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* From MTX */
1193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_H264_PRELOAD_RESTORE*/{
1195dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1196dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1199bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP1,
1201dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1202bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1204dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_SAVE*/{
1205dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1206dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1207dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1208dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1209bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1211dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1212bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             //2     /* From MTX */
1213dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_VC1_PRELOAD_RESTORE*/{
1215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_MTX_OFFSET + MTX_CORE_CR_MTX_SYSC_CDMAT_OFFSET),
1216dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1217dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_1,
1218dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1219bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        IMG_TRUE,       /* na */
1220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1221dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        HOST_TO_MSVDX,
1222bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang        DMA_BURST_1             /* Into MTX */
1223dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1224dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /*LLDMA_TYPE_MEM_SET */{
1225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        (REG_MSVDX_VEC_RAM_OFFSET + 0xCC0),
1226dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PWIDTH_32_BIT,
1227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_4,
1228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_PERIPH_INCR_OFF,
1229dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        IMG_TRUE,       /* na */
1230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MMU_GROUP0,
1231dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        MSXDX_TO_HOST,
1232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DMA_BURST_4                     /* From VLR */
1233dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    },
1234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
12357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang};
12367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
12377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#define MAX_DMA_LEN     ( 0xffff )
12387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1239680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid *psb_cmdbuf_alloc_space(psb_cmdbuf_p cmdbuf, uint32_t byte_size)
1240680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1241680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    void *pos = (void *)cmdbuf->cmd_idx;
1242680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(!(byte_size % 4));
1243680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1244680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx += (byte_size / 4);
1245680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1246680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    return pos;
1247680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1248680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1249680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_cmdbuf(psb_cmdbuf_p cmdbuf,
1250680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   psb_buffer_p bitstream_buf,
1251680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t buffer_offset,
1252680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t size,
1253680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   uint32_t dest_offset,
1254680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                   DMA_TYPE type)
1255680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1256680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(size < 0xFFFF);
1257680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(buffer_offset < 0xFFFF);
1258680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1259680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    DMA_CMD_WITH_OFFSET* dma_cmd;
1260680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1261680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(dest_offset==0)
1262680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1263680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD));
1264680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = 0;
1265680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1266680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1267680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1268680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd = (DMA_CMD_WITH_OFFSET*)psb_cmdbuf_alloc_space(cmdbuf, sizeof(DMA_CMD_WITH_OFFSET));
1269680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32Cmd = CMD_DMA_OFFSET_FLAG; // Set flag indicating that offset is deffined
1270680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang            dma_cmd->ui32ByteOffset = dest_offset;
1271680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1272680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1273680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= CMD_DMA;
1274680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= (IMG_UINT32)type;
1275680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    dma_cmd->ui32Cmd |= size;
1276680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /* dma_cmd->ui32DevVirtAdd  = ui32DevVirtAddress; */
1277680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(dma_cmd->ui32DevVirtAdd, buffer_offset, bitstream_buf);
1278680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1279680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
12807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1281680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
1282680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1283680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream(psb_cmdbuf_p cmdbuf,
1284680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      psb_buffer_p bitstream_buf,
1285680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t buffer_offset,
1286680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t size_in_bytes,
1287680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t offset_in_bits,
1288680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                      uint32_t flags)
1289680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1290680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    /*
1291680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * We use byte alignment instead of 32bit alignment.
1292680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * The third frame of sa10164.vc1 results in the following bitstream
1293680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * patttern:
1294680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * [0000] 00 00 03 01 76 dc 04 8d
1295680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * with offset_in_bits = 0x1e
1296680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * This causes an ENTDEC failure because 00 00 03 is a start code
1297680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     * By byte aligning the datastream the start code will be eliminated.
1298680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang     */
1299680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang//don't need to change the offset_in_bits, size_in_bytes and buffer_offset
1300680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#if 0
1301680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#define ALIGNMENT        sizeof(uint8_t)
1302680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    uint32_t bs_offset_in_dwords    = ((offset_in_bits / 8) / ALIGNMENT);
1303680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    size_in_bytes                   -= bs_offset_in_dwords * ALIGNMENT;
1304680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    offset_in_bits                  -= bs_offset_in_dwords * 8 * ALIGNMENT;
1305680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    buffer_offset                   += bs_offset_in_dwords * ALIGNMENT;
1306680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang#endif
1307680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1308680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
1309680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = offset_in_bits;
1310680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_bitstream_size = cmdbuf->cmd_idx;
1311680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = size_in_bytes;
1312680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1313680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, bitstream_buf);
1314680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1315680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1316e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#ifdef SLICE_HEADER_PARSING
1317e853beb775a5de607bd080d7d43e638f95199e68Nana GUo/*
1318e853beb775a5de607bd080d7d43e638f95199e68Nana GUo * Write a CMD_SR_SETUP referencing a bitstream buffer to the command buffer
1319e853beb775a5de607bd080d7d43e638f95199e68Nana GUo */
1320e853beb775a5de607bd080d7d43e638f95199e68Nana GUovoid psb_cmdbuf_dma_write_key(psb_cmdbuf_p cmdbuf,
1321e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                      uint32_t flags,
1322e853beb775a5de607bd080d7d43e638f95199e68Nana GUo                                      uint32_t key)
1323e853beb775a5de607bd080d7d43e638f95199e68Nana GUo{
1324e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    drv_debug_msg(VIDEO_DEBUG_GENERAL, "pass key, flags is 0x%x, key is 0x%x.\n", flags, key);
1325e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    *cmdbuf->cmd_idx++ = CMD_SR_SETUP | flags;
1326e853beb775a5de607bd080d7d43e638f95199e68Nana GUo    *cmdbuf->cmd_idx++ = key;
1327e853beb775a5de607bd080d7d43e638f95199e68Nana GUo}
1328e853beb775a5de607bd080d7d43e638f95199e68Nana GUo#endif
1329e853beb775a5de607bd080d7d43e638f95199e68Nana GUo
1330680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang/*
1331680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang * Chain a LLDMA bitstream command to the previous one
1332680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang */
1333680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_dma_write_bitstream_chained(psb_cmdbuf_p cmdbuf,
1334680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        psb_buffer_p bitstream_buf,
1335680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        uint32_t size_in_bytes)
1336680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1337680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->cmd_idx++ = (CMD_BITSTREAM_DMA | size_in_bytes);
1338680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->cmd_idx++, bitstream_buf->buffer_ofs, bitstream_buf);
1339680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1340680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *(cmdbuf->cmd_bitstream_size) += size_in_bytes;
1341680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1342680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1343680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_start_block(psb_cmdbuf_p cmdbuf, uint32_t flags)
1344680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1345680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    ASSERT(NULL == cmdbuf->reg_start); /* Can't have both */
1346680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1347680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_wt_p = cmdbuf->cmd_idx;
1348680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = 0;
1349680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_flags = (flags << 4); /* flags are diff between DE2 & DE3 */
1350680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
1351680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1352680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1353680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set(psb_cmdbuf_p cmdbuf, uint32_t reg, uint32_t val)
1354680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1355680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1356680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1357680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1358680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1359680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1360680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1361680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1362680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1363680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1364680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1365680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    *cmdbuf->reg_wt_p++ = val;
1366680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1367680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1368680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1369680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_set_address(psb_cmdbuf_p cmdbuf,
1370680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t reg,
1371680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         psb_buffer_p buffer,
1372680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang                                         uint32_t buffer_offset)
1373680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1374680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    if(cmdbuf->reg_start && (reg == cmdbuf->reg_next))
1375680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1376680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        /* Incrament header size */
1377680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start += (0x1 << 16);
1378680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1379680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    else
1380680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    {
1381680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        cmdbuf->reg_start = cmdbuf->reg_wt_p++;
1382680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang        *cmdbuf->reg_start = CMD_REGVALPAIR_WRITE | cmdbuf->reg_flags | 0x10000 | (reg & 0xfffff); /* We want host reg addr */
1383680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    }
1384680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1385680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    RELOC(*cmdbuf->reg_wt_p++, buffer_offset, buffer);
1386680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_next = reg + 4;
1387680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
1388680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang
1389680952832ef474a95bb0c4fee50c06e5126ad66dKun Wangvoid psb_cmdbuf_reg_end_block(psb_cmdbuf_p cmdbuf)
1390680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang{
1391680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->cmd_idx = cmdbuf->reg_wt_p;
1392680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang    cmdbuf->reg_start = NULL;
1393680952832ef474a95bb0c4fee50c06e5126ad66dKun Wang}
13947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkuntypedef enum {
13967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    MTX_CTRL_HEADER = 0,
13977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_HDR,
13987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_SL_NULL,
13997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RENDEC_CK_HDR,
14007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} RENDEC_CHUNK_OFFSETS;
14017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14034b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo * Start a new rendec block of another format
14044b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo */
1405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_start(psb_cmdbuf_p cmdbuf, uint32_t dest_address)
14064b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
1407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(((dest_address >> 2)& ~0xfff) == 0);
14084b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = cmdbuf->cmd_idx++;
1409c7a25581f7021de45d8a1cbba83826e9a5e4332eKun Wang    *cmdbuf->rendec_chunk_start = CMD_RENDEC_BLOCK | dest_address;
1410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun}
14114b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_block(psb_cmdbuf_p cmdbuf,
1413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   unsigned char *block,
1414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                   uint32_t size)
14157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT((size & 0x3) == 0);
1417e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int i;
1418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < size; i += 4) {
14197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        uint32_t val = block[i] | (block[i+1] << 8) | (block[i+2] << 16) | (block[i+3] << 24);
1420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_cmdbuf_rendec_write(cmdbuf, val);
14217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
14227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_write_address(psb_cmdbuf_p cmdbuf,
1425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     psb_buffer_p buffer,
1426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                     uint32_t buffer_offset)
14277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    RELOC(*cmdbuf->cmd_idx++, buffer_offset, buffer);
14297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Finish a RENDEC block
14337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1434dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_rendec_end(psb_cmdbuf_p cmdbuf)
14354b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo{
14364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    ASSERT(NULL != cmdbuf->rendec_chunk_start); /* Must have an open RENDEC chunk */
14374b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    uint32_t dword_count = cmdbuf->cmd_idx - cmdbuf->rendec_chunk_start;
14384b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
1439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT((dword_count - 1) <= 0xff);
14404b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14414b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    *cmdbuf->rendec_chunk_start += ((dword_count - 1) << 16);
14424b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo    cmdbuf->rendec_chunk_start = NULL;
14434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo}
14444b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo
14454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo/*
14467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create a conditional SKIP block
14477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_start_block(psb_cmdbuf_p cmdbuf, uint32_t skip_condition)
14497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Can't be inside a rendec block */
14517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Can't be inside a reg block */
14527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->skip_block_start); /* Can't be inside another skip block (limitation of current sw design)*/
1453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
14547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_condition = skip_condition;
14557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = cmdbuf->cmd_idx++;
14567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
14577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
14597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Terminate a conditional SKIP block
14607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
1461dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_cmdbuf_skip_end_block(psb_cmdbuf_p cmdbuf)
14627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
14637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->rendec_block_start); /* Rendec block must be closed */
14647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL == cmdbuf->reg_start); /* Reg block must be closed */
14657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(NULL != cmdbuf->skip_block_start); /* Skip block must still be open */
14667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
14677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t block_size = cmdbuf->cmd_idx - (cmdbuf->skip_block_start + 1);
14687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    *cmdbuf->skip_block_start = CMD_CONDITIONAL_SKIP | (cmdbuf->skip_condition << 20) | block_size;
14707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    cmdbuf->skip_block_start = NULL;
14717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1472