1437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK
4437b3eda28a4bf098efa80598cab67f190275266Fei 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 *    Zeng Li <zeng.li@intel.com>
28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang *
29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */
30bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
31bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang
32437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_cmdbuf.h"
33437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
34437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <unistd.h>
35437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdio.h>
36437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <stdlib.h>
37437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <errno.h>
38437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <string.h>
39437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include <wsbm/wsbm_manager.h>
40437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
41437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_def.h"
42c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
43437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "pnw_hostcode.h"
44437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#include "psb_ws_driver.h"
45437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
46437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
47437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Buffer layout:
48437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *         cmd_base <= cmd_idx < CMD_END() == reloc_base
49437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *         reloc_base <= reloc_idx < RELOC_END() == (reloc_size)
50437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
51437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
52437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_END(cmdbuf)     (cmdbuf->cmd_base + cmdbuf->size)
53437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
54437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_END(cmdbuf)       (cmdbuf->reloc_base)
55437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
56437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_SIZE            (0x3000)
57437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
58437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_SIZE              (0x3000)
59437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
60437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define RELOC_MARGIN          (0x0800)
61437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
62437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CMD_MARGIN            (0x0400)
63437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
64437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
65437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define MAX_CMD_COUNT         12
66437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
67437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define MTX_SEG_SIZE          (0x0800)
68437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
69437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
70437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
71437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Create command buffer
72437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
73437b3eda28a4bf098efa80598cab67f190275266Fei JiangVAStatus pnw_cmdbuf_create(
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_context_p obj_context,
75437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_driver_data_p driver_data,
76437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf)
77437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
78437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx = (context_ENC_p) obj_context->format_data;
79437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
80437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int size = CMD_SIZE + RELOC_SIZE;
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
82437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->size = 0;
83437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
84437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_idx = NULL;
85437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_base = NULL;
86437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_idx = NULL;
87437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->buffer_refs_count = 0;
88437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->buffer_refs_allocated = 10;
892befccec034c13d34746a9e87149889d59ac767bFei Jiang    cmdbuf->buffer_refs = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == cmdbuf->buffer_refs) {
91437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs_allocated = 0;
92437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
93437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS == vaStatus) {
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = psb_buffer_create(driver_data, size, psb_bt_cpu_only, &cmdbuf->buf);
96437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->size = size;
97437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
98437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
99437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (VA_STATUS_SUCCESS != vaStatus) {
100437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        free(cmdbuf->buffer_refs);
101437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs = NULL;
102437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs_allocated = 0;
103437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
104437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
106437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* create topaz parameter buffer */
107437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb_buffer_create(driver_data, ctx->pic_params_size * MAX_TOPAZ_CORES, psb_bt_cpu_vpu, &cmdbuf->pic_params);
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
1094b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo        goto error_out5;
110437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
111437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* create header buffer */
112437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb_buffer_create(driver_data, ctx->header_buffer_size, psb_bt_cpu_vpu, &cmdbuf->header_mem);
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
114437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        goto error_out2;
115437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
116437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* create slice parameter buffer */
117437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    vaStatus = psb_buffer_create(driver_data, ctx->sliceparam_buffer_size, psb_bt_cpu_vpu, &cmdbuf->slice_params);
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (VA_STATUS_SUCCESS != vaStatus)
119437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        goto error_out1;
120437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
121437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* all cmdbuf share one MTX_CURRENT_IN_PARAMS since every MB has a MTX_CURRENT_IN_PARAMS structure
122437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     * and filling this structure for all MB is very time-consuming
123437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     */
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
125437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->topaz_in_params_I = &ctx->topaz_in_params_I;
126437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->topaz_in_params_P = &ctx->topaz_in_params_P;
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
128437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->topaz_below_params = &ctx->topaz_below_params;
129643778eb83b8dfe3bbf433855b311d4fefa95e21Fei Jiang    cmdbuf->topaz_above_params = &ctx->topaz_above_params;
130437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
131437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out1:
134437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_destroy(&cmdbuf->header_mem);
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out2:
136437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_buffer_destroy(&cmdbuf->pic_params);
137dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunerror_out5:
138437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_destroy(cmdbuf);
139dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
140437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return vaStatus;
141437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
142437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
143437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
144437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Destroy buffer
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_destroy(pnw_cmdbuf_p cmdbuf)
147437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->size) {
149dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_destroy(&cmdbuf->buf);
150437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->size = 0;
151437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
152dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (cmdbuf->buffer_refs_allocated) {
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        free(cmdbuf->buffer_refs);
154437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs = NULL;
155437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs_allocated = 0;
156437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
157437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&cmdbuf->pic_params);
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&cmdbuf->header_mem);
160dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_destroy(&cmdbuf->slice_params);
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
162437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
163437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
164437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
165437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Reset buffer & map
166437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
167437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
168437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
169dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_reset(pnw_cmdbuf_p cmdbuf)
170437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
171437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
172437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
173437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
174437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_idx = NULL;
175437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_base = NULL;
176437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_idx = NULL;
177437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
178437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->buffer_refs_count = 0;
179437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_count = 0;
180dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = psb_buffer_map(&cmdbuf->buf, &cmdbuf->cmd_base);
182dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
183437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return ret;
184437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
185437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
186437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_start = cmdbuf->cmd_base;
187437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_idx = (uint32_t *) cmdbuf->cmd_base;
188437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
189437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_base = cmdbuf->cmd_base + CMD_SIZE;
190437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_idx = (struct drm_psb_reloc *) cmdbuf->reloc_base;
191437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
192437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Add ourselves to the buffer list */
193437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->buf); /* cmd buf == 0 */
194437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return ret;
195437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
196437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
197437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
198437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Unmap buffer
199437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
200437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
201437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_unmap(pnw_cmdbuf_p cmdbuf)
203437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
204437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_base = NULL;
205437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_start = NULL;
206437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_idx = NULL;
207437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_base = NULL;
208437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_idx = NULL;
209437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->cmd_count = 0;
210dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    psb_buffer_unmap(&cmdbuf->buf);
211437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
212437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
213437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
214437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
215437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
216437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Reference an addtional buffer "buf" in the command stream
217437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns a reference index that can be used to refer to "buf" in
218437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * relocation records, -1 on error
219437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_cmdbuf_buffer_ref(pnw_cmdbuf_p cmdbuf, psb_buffer_p buf)
221437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
222437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int item_loc = 0;
223437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
224437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /*Reserve the same TTM BO twice will cause kernel lock up*/
225dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    while ((item_loc < cmdbuf->buffer_refs_count)
226bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang           && (wsbmKBufHandle(wsbmKBuf(cmdbuf->buffer_refs[item_loc]->drm_buf))
227bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               != wsbmKBufHandle(wsbmKBuf(buf->drm_buf))))
228dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        //while( (item_loc < cmdbuf->buffer_refs_count) && (cmdbuf->buffer_refs[item_loc] != buf) )
229437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    {
230437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        item_loc++;
231437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
232dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (item_loc == cmdbuf->buffer_refs_count) {
233437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* Add new entry */
234dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (item_loc >= cmdbuf->buffer_refs_allocated) {
235437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* Allocate more entries */
236dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            int new_size = cmdbuf->buffer_refs_allocated + 10;
237437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_p *new_array;
2382befccec034c13d34746a9e87149889d59ac767bFei Jiang            new_array = (psb_buffer_p *) calloc(1, sizeof(psb_buffer_p) * new_size);
239dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (NULL == new_array) {
240437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                return -1; /* Allocation failure */
241437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            }
242437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            memcpy(new_array, cmdbuf->buffer_refs, sizeof(psb_buffer_p) * cmdbuf->buffer_refs_allocated);
243437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            free(cmdbuf->buffer_refs);
244437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            cmdbuf->buffer_refs_allocated = new_size;
245437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            cmdbuf->buffer_refs = new_array;
246437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
247437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs[item_loc] = buf;
248437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->buffer_refs_count++;
249437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        buf->status = psb_bs_queued;
250437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
251437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return item_loc;
252437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
253437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
254437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Creates a relocation record for a DWORD in the mapped "cmdbuf" at address
255437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "addr_in_cmdbuf"
256437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * The relocation is based on the device virtual address of "ref_buffer"
257437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "buf_offset" is be added to the device virtual address, and the sum is then
258437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * right shifted with "align_shift".
259437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * "mask" determines which bits of the target DWORD will be updated with the so
260437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * constructed address. The remaining bits will be filled with bits from "background".
261437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_add_relocation(pnw_cmdbuf_p cmdbuf,
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t *addr_in_dst_buffer,/*addr of dst_buffer for the DWORD*/
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               psb_buffer_p ref_buffer,
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t buf_offset,
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t mask,
267dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t background,
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t align_shift,
269dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t dst_buffer,
270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                               uint32_t *start_of_dst_buffer) /*Index of the list refered by cmdbuf->buffer_refs */
271437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
272437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct drm_psb_reloc *reloc = cmdbuf->reloc_idx;
273437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint64_t presumed_offset = wsbmBOOffsetHint(ref_buffer->drm_buf);
274437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
275437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->where = addr_in_dst_buffer - start_of_dst_buffer; /* Offset in DWORDs */
276437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    reloc->buffer = pnw_cmdbuf_buffer_ref(cmdbuf, ref_buffer);
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(reloc->buffer != -1);
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
280437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->reloc_op = PSB_RELOC_OP_OFFSET;
281437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#ifndef VA_EMULATOR
282dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (presumed_offset) {
283437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        uint32_t new_val =  presumed_offset + buf_offset;
284437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
285437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        new_val = ((new_val >> align_shift) << (align_shift << PSB_RELOC_ALSHIFT_SHIFT));
286437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        new_val = (background & ~mask) | (new_val & mask);
287437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *addr_in_dst_buffer = new_val;
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
289437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *addr_in_dst_buffer = PSB_RELOC_MAGIC;
290437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
291437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else
292437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* indicate subscript of relocation buffer */
293437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *addr_in_dst_buffer = reloc - (struct drm_psb_reloc *)cmdbuf->reloc_base;
294dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun#endif
295437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->mask = mask;
296437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->shift = align_shift << PSB_RELOC_ALSHIFT_SHIFT;
297437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->pre_add = buf_offset;
298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->background = background;
299437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc->dst_buffer = dst_buffer;
300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf->reloc_idx++;
301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
302e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT(((unsigned char *)(cmdbuf->reloc_idx)) < RELOC_END(cmdbuf));
303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
305437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* Prepare one command package */
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid pnw_cmdbuf_insert_command_package(object_context_p obj_context,
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       int32_t core,
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       uint32_t cmd_id,
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       psb_buffer_p command_data,
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                       uint32_t offset)
311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint32_t cmd_word;
313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    context_ENC_p ctx = (context_ENC_p) obj_context->format_data;
314437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = obj_context->pnw_cmdbuf;
315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int interrupt_flags;
316437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
317437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* only MTX_CMDID_END_PIC by master core generate interrupt */
318437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    interrupt_flags = (cmd_id == MTX_CMDID_END_PIC) | (core == 0);
319437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    interrupt_flags = 0; /*CMD composed by user space does not generate Interrupt*/
320437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
321437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Calculate command word */
322437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmd_id &= MTX_CMDWORD_ID_MASK;
323437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    core &= MTX_CMDWORD_CORE_MASK;
324437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    core %= MAX_TOPAZ_CORES;
326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmd_word = ((ctx->CmdCount & MTX_CMDWORD_COUNT_MASK) << MTX_CMDWORD_COUNT_SHIFT)
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               | ((0 & MTX_CMDWORD_INT_MASK) << MTX_CMDWORD_INT_SHIFT) /* Do not generate interrupt */
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               | (core << MTX_CMDWORD_CORE_SHIFT)
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun               | (cmd_id << MTX_CMDWORD_ID_SHIFT);
331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* write command word into cmdbuf */
333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *cmdbuf->cmd_idx++ = cmd_word;
334437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Command data address */
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (command_data) {
337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        RELOC_CMDBUF_PNW(cmdbuf->cmd_idx, offset, command_data);
338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        cmdbuf->cmd_idx++;
339dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else {
340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *cmdbuf->cmd_idx++ = 0;
341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
342437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
343437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
344437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *cmdbuf->cmd_idx++ = 0;             /* Write back buffer address */
345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
346437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *cmdbuf->cmd_idx++ = 0; /*ctx->CmdCount; */ /* Write back value */
347437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
348437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->LastSync[(ctx->FrmIdx) & 0x1][core] = ctx->CmdCount;
349437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* increment the command counter */
351437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ctx->CmdCount = (ctx->CmdCount + 1) % MAX_TOPAZ_CMD_COUNT;
352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
354437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Advances "obj_context" to the next cmdbuf
356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_context_get_next_cmdbuf(object_context_p obj_context)
360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf;
362437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->pnw_cmdbuf) {
365437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return 0;
366437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
367437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_context->cmdbuf_current++;
369dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (obj_context->cmdbuf_current >= PNW_MAX_CMDBUFS_ENCODE) {
370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_context->cmdbuf_current = 0;
371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
373437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    cmdbuf = obj_context->pnw_cmdbuf_list[obj_context->cmdbuf_current];
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = pnw_cmdbuf_reset(cmdbuf);
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (!ret) {
376437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* Success */
377437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_context->pnw_cmdbuf = cmdbuf;
378437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* added pic_params/slice_params into ref, so the index is 1/2 */
381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->pic_params);
382dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_cmdbuf_buffer_ref(cmdbuf, &cmdbuf->slice_params);
383dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return ret;
385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
386437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
387437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
388437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * This is the user-space do-it-all interface to the drm cmdbuf ioctl.
389437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * It allows different buffers as command- and reloc buffer. A list of
390437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * cliprects to apply and whether to copy the clipRect content to all
391437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * scanout buffers (damage = 1).
392437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
393437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
394437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Don't add debug statements in this function, it gets called with the
395437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * DRM lock held and output to an X terminal can cause X to deadlock
396437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
397437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic int
398437b3eda28a4bf098efa80598cab67f190275266Fei JiangpnwDRMCmdBuf(int fd, int ioctl_offset, psb_buffer_p *buffer_list, int buffer_count, unsigned cmdBufHandle,
399437b3eda28a4bf098efa80598cab67f190275266Fei Jiang             unsigned cmdBufOffset, unsigned cmdBufSize,
400437b3eda28a4bf098efa80598cab67f190275266Fei Jiang             unsigned relocBufHandle, unsigned relocBufOffset,
401cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywan             unsigned numRelocs, int __maybe_unused damage,
402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang             unsigned engine, unsigned fence_flags, struct psb_ttm_fence_rep *fence_rep)
403437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    drm_psb_cmdbuf_arg_t ca;
405437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct psb_validate_arg *arg_list;
406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int i;
407437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    uint64_t mask = PSB_GPU_ACCESS_MASK;
409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    arg_list = (struct psb_validate_arg *) calloc(1, sizeof(struct psb_validate_arg) * buffer_count);
411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (arg_list == NULL) {
412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Allocate memory failed\n");
413437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return -ENOMEM;
414437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
415437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        struct psb_validate_req *req = &arg->d.req;
419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->next = (unsigned long) & (arg_list[i+1]);
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
422437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        req->buffer_handle = wsbmKBufHandle(wsbmKBuf(buffer_list[i]->drm_buf));
42358c96451d7ea53930d4eb94b6573571a51170de4Fei Jiang        //req->group = 0;
424437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        req->set_flags = (PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE) & mask;
425437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        req->clear_flags = (~(PSB_GPU_ACCESS_READ | PSB_GPU_ACCESS_WRITE)) & mask;
426437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 1
427437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        req->presumed_gpu_offset = (uint64_t)wsbmBOOffsetHint(buffer_list[i]->drm_buf);
428437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        req->presumed_flags = PSB_USE_PRESUMED;
429437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#else
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->presumed_flags = 0;
431437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        req->pad64 = (uint32_t)buffer_list[i]->pl_flags;
433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    arg_list[buffer_count-1].d.req.next = 0;
435dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.buffer_list = (uint64_t)((unsigned long)arg_list);
437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.cmdbuf_handle = cmdBufHandle;
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.cmdbuf_offset = cmdBufOffset;
439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.cmdbuf_size = cmdBufSize;
440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.reloc_handle = relocBufHandle;
441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.reloc_offset = relocBufOffset;
442437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.num_relocs = numRelocs;
443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.engine = engine;
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ca.fence_flags = fence_flags;
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ca.fence_arg = (uint64_t)((unsigned long)fence_rep);
446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    do {
448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        ret = drmCommandWrite(fd, ioctl_offset, &ca, sizeof(ca));
449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } while (ret == EAGAIN);
450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
451437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (ret)
452437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        goto out;
453437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
455437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        struct psb_validate_arg *arg = &(arg_list[i]);
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        struct psb_validate_rep *rep = &arg->d.rep;
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (!arg->handled) {
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ret = -EFAULT;
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            goto out;
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (arg->ret != 0) {
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ret = arg->ret;
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            goto out;
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        wsbmUpdateKBuf(wsbmKBuf(buffer_list[i]->drm_buf),
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                       rep->gpu_offset, rep->placement, rep->fence_type_mask);
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunout:
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    free(arg_list);
471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    for (i = 0; i < buffer_count; i++) {
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /*
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         * Buffer no longer queued in userspace
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang         */
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        switch (buffer_list[i]->status) {
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case psb_bs_queued:
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            buffer_list[i]->status = psb_bs_ready;
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case psb_bs_abandoned:
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_destroy(buffer_list[i]);
482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            free(buffer_list[i]);
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* Not supposed to happen */
487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            ASSERT(0);
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
490dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return ret;
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#if 0
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiangstatic struct _WsbmFenceObject *
496bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wanglnc_fence_wait(psb_driver_data_p driver_data,
497bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang               struct psb_ttm_fence_rep *fence_rep, int *status)
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct _WsbmFenceObject *fence = NULL;
501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret = -1;
502dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* copy fence information */
504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (fence_rep->error != 0) {
505f31d5416a60f83e184b0906a7ec77ba021840531hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "drm failed to create a fence"
506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                           " and has idled the HW\n");
507437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE_RET;
508437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return NULL;
509437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
511437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    fence = wsbmFenceCreate(driver_data->fence_mgr, fence_rep->fence_class,
512437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                            fence_rep->fence_type,
513e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                            (unsigned char *)fence_rep->handle,
514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                            0);
515dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (fence)
516dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *status = wsbmFenceFinish(fence, fence_rep->fence_type, 0);
517dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
518437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return fence;
519437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
522437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
523437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Submits the current cmdbuf
524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
525437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
526437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
527cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint pnw_context_submit_cmdbuf(object_context_p __maybe_unused obj_context)
528437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
529437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
531437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
5322befccec034c13d34746a9e87149889d59ac767bFei Jiang
5332befccec034c13d34746a9e87149889d59ac767bFei Jiang
534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
535437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * FrameSkip is only meaningful for RC enabled mode
536437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Topaz raises this flag after surface N encoding is finished (vaSyncSurface gets back)
537437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * then for the next encode surface N+1 (ctx->src_surface) frameskip flag is cleared in vaBeginPicuture
538437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * and is always set in vaEndPicture:lnc_PatchRCMode
539437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * vaQuerySurfaceStatus is supposed only to be called after vaEndPicture/vaSyncSurface,
540437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * The caller should ensure the surface pertains to an encode context
541437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
542cecb10be5449aa74cd1d9a2eb41c2a6a76d9ee79ywanint pnw_surface_get_frameskip(psb_driver_data_p __maybe_unused driver_data,
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_surface_p surface,
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              int *frame_skip)
545437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
546437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* bit31 indicate if frameskip is already settled, it is used to record the frame skip flag for old surfaces
547437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     * bit31 is cleared when the surface is used as encode render target or reference/reconstrucure target
548437b3eda28a4bf098efa80598cab67f190275266Fei Jiang     */
549437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (GET_SURFACE_INFO_skipped_flag(surface) & SURFACE_INFO_SKIP_FLAG_SETTLED) {
550437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        *frame_skip = GET_SURFACE_INFO_skipped_flag(surface) & 1;
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    } else
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        *frame_skip = 0;
553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
5542befccec034c13d34746a9e87149889d59ac767bFei Jiang    return 0;
555437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Flushes all cmdbufs
560437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint pnw_context_flush_cmdbuf(object_context_p obj_context)
562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
563437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    pnw_cmdbuf_p cmdbuf = obj_context->pnw_cmdbuf;
564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    psb_driver_data_p driver_data = obj_context->driver_data;
565437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int fence_flags;
566437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    struct psb_ttm_fence_rep fence_rep;
567437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int reloc_offset;
568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    unsigned int num_relocs;
569437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int ret;
570e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned int cmdbuffer_size = (unsigned char *) cmdbuf->cmd_idx - cmdbuf->cmd_start; /* In bytes */
571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
572437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ASSERT(cmdbuffer_size < CMD_SIZE);
573e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    ASSERT((unsigned char *) cmdbuf->cmd_idx < CMD_END(cmdbuf));
574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* LOCK */
575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ret = LOCK_HARDWARE(driver_data);
576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        UNLOCK_HARDWARE(driver_data);
578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE_RET;
579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return ret;
580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* Now calculate the total number of relocations */
583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    reloc_offset = cmdbuf->reloc_base - cmdbuf->cmd_base;
584e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    num_relocs = (((unsigned char *) cmdbuf->reloc_idx) - cmdbuf->reloc_base) / sizeof(struct drm_psb_reloc);
585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    pnw_cmdbuf_unmap(cmdbuf);
587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(NULL == cmdbuf->reloc_base);
589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
590c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp)
591c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = 0;
592c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    else
593c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        fence_flags = DRM_PSB_FENCE_NO_USER;
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#ifndef LNC_ENGINE_ENCODE
596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define LNC_ENGINE_ENCODE  5
597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    wsbmWriteLockKernelBO();
600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    ret = pnwDRMCmdBuf(driver_data->drm_fd, driver_data->execIoctlOffset, /* FIXME Still use ioctl cmd? */
601dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       cmdbuf->buffer_refs, cmdbuf->buffer_refs_count, wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)),
602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang                       0, cmdbuffer_size,/*unsigned cmdBufSize*/
603dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                       wsbmKBufHandle(wsbmKBuf(cmdbuf->buf.drm_buf)), reloc_offset, num_relocs,
604cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang                       0, LNC_ENGINE_ENCODE, fence_flags, &fence_rep); /* FIXME use LNC_ENGINE_ENCODE */
605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
606dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    wsbmWriteUnlockKernelBO();
607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    UNLOCK_HARDWARE(driver_data);
608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
609dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_context->pnw_cmdbuf = NULL;
611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE_RET;
613437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return ret;
614437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
615437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
616c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#if 0
617437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    int status = -1;
618dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    struct _WsbmFenceObject *fence = NULL;
619437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
620437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    fence = lnc_fence_wait(driver_data, &fence_rep, &status);
621c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "psb_fence_wait returns: %d (fence=0x%08x)\n", status, fence);
622dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
623437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (fence)
624dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmFenceUnreference(fence);
625437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#endif
626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
627437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    obj_context->pnw_cmdbuf = NULL;
628dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
629437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
630437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
631437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6322befccec034c13d34746a9e87149889d59ac767bFei Jiang
6332befccec034c13d34746a9e87149889d59ac767bFei Jiangint pnw_get_parallel_core_number(object_context_p obj_context)
6342befccec034c13d34746a9e87149889d59ac767bFei Jiang{
6352befccec034c13d34746a9e87149889d59ac767bFei Jiang
636dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    context_ENC_p ctx = (context_ENC_p)(obj_context->format_data);
637dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return ctx->ParallelCores;
6382befccec034c13d34746a9e87149889d59ac767bFei Jiang
6392befccec034c13d34746a9e87149889d59ac767bFei Jiang}
640