psb_buffer.c revision fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4
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
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h"
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drm.h"
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
402befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h>
412befccec034c13d34746a9e87149889d59ac767bFei Jiang
422befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h"
434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h"
442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h"
452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
49dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data,
50dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           unsigned int size,
51dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_type_t type,
52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_p buf
53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int allignment;
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t placement;
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* reset rar_handle to NULL */
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->rar_handle = 0;
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->buffer_ofs = 0;
63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->type = type;
652befccec034c13d34746a9e87149889d59ac767bFei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
66fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->size = size;
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Mask values are a guess */
68dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (type) {
69dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu:
70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu_shared:
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_surface:
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 0;
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Xvideo will share surface buffer, set SHARED flag
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun         */
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (getenv("PSB_VIDEO_SURFACE_MMU")) {
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Allocate surface from MMU heap\n");
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Allocate surface from TT heap\n");
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_vpu_only:
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_only:
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED;
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_camera:
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
1003982f61b009483a53bdbc0391dc71934021fc8abKun Wang        placement = TTM_PL_FLAG_CI | WSBM_PL_FLAG_SHARED;
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_rar:
103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
1043982f61b009483a53bdbc0391dc71934021fc8abKun Wang        placement = TTM_PL_FLAG_RAR | WSBM_PL_FLAG_SHARED;
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    allignment = 4096; /* temporily more safe */
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //psb__error_message("FIXME: should use geetpagesize() ?\n");
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         allignment, placement);
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to gen wsbm buffers\n");
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* here use the placement when gen buffer setted */
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0);
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to alloc wsbm buffers\n");
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1462befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (placement & WSBM_PL_FLAG_TT)
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n",
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 size, wsbmBOOffsetHint(buf->drm_buf));
1492befccec034c13d34746a9e87149889d59ac767bFei Jiang
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->pl_flags = placement;
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->status = psb_bs_ready;
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
157fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
158fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer
159fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */
160fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data,
161fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           unsigned int size,
162fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_type_t type,
163fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_p buf,
164fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           void * vaddr
165fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                          )
166fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
167fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
168fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int allignment;
169fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    uint32_t placement;
170fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int ret;
171fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
172fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* reset rar_handle to NULL */
173fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->rar_handle = 0;
174fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->buffer_ofs = 0;
175fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
176fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->type = type;
177fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
178fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->user_ptr = vaddr;
179fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
180fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* Xvideo will share surface buffer, set SHARED flag
181fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    */
182fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    placement =  DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED ;
183fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
184fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = LOCK_HARDWARE(driver_data);
185fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
186fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        DEBUG_FAILURE_RET;
189fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return vaStatus;
190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment = 4096; /* temporily more safe */
193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
194fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    //psb__error_message("FIXME: should use geetpagesize() ?\n");
195fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment, placement);
197fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (!buf->drm_buf) {
198fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        psb__error_message("failed to gen wsbm buffers\n");
199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* here use the placement when gen buffer setted */
204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    psb__information_message("Create BO from user buffer %p, size=%d\n", vaddr, size);
205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr);
207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        psb__error_message("Failed to alloc wsbm buffers\n");
209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 1;
210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    psb__information_message("Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n",
213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    vaddr, size, wsbmBOOffsetHint(buf->drm_buf));
214fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
215fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->pl_flags = placement;
216fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->status = psb_bs_ready;
217fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->wsbm_synccpu_flag = 0;
218fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
219fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return VA_STATUS_SUCCESS;
220fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement)
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement);
2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret == 0)
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->pl_flags = set_placement;
237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data,
243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p buf,
244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p reference_buf
245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             )
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memcpy(buf, reference_buf, sizeof(*buf));
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->drm_buf = NULL;
252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmGenBuffers(driver_data->main_pool,
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         1,
263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &buf->drm_buf,
264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         4096,  /* page alignment */
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         0);
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to gen wsbm buffers\n");
268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf)));
273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to alloc wsbm buffers\n");
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
28209998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data,
2833f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               psb_buffer_p buf,
2843f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               int kbuf_handle
2853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                              )
28609998e330bbcbf835798128768e590772f5a5737Shuduo Sang{
28709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    int ret = 0;
28809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    VAStatus vaStatus = VA_STATUS_SUCCESS;
28909998e330bbcbf835798128768e590772f5a5737Shuduo Sang
29009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    buf->drm_buf = NULL;
29109998e330bbcbf835798128768e590772f5a5737Shuduo Sang
29209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = LOCK_HARDWARE(driver_data);
29309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
29409998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
29509998e330bbcbf835798128768e590772f5a5737Shuduo Sang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
29609998e330bbcbf835798128768e590772f5a5737Shuduo Sang        DEBUG_FAILURE_RET;
29709998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return vaStatus;
29809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
30009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = wsbmGenBuffers(driver_data->main_pool,
30109998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         1,
30209998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         &buf->drm_buf,
30309998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         4096,  /* page alignment */
30409998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         0);
30509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (!buf->drm_buf) {
30609998e330bbcbf835798128768e590772f5a5737Shuduo Sang        psb__error_message("failed to gen wsbm buffers\n");
30709998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
30809998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
30909998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
31009998e330bbcbf835798128768e590772f5a5737Shuduo Sang
3113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle);
31209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    UNLOCK_HARDWARE(driver_data);
31309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
31409998e330bbcbf835798128768e590772f5a5737Shuduo Sang        psb__error_message("failed to alloc wsbm buffers\n");
31509998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
31609998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
317c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf);
3183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
31909998e330bbcbf835798128768e590772f5a5737Shuduo Sang    return VA_STATUS_SUCCESS;
32009998e330bbcbf835798128768e590772f5a5737Shuduo Sang}
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf)
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->drm_buf == NULL)
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_bs_unfinished != buf->status) {
3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(buf->driver_data);
331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmBOUnreference(&buf->drm_buf);
3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buf->rar_handle)
3332d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang            buf->rar_handle = 0;
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->driver_data = NULL;
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->status = psb_bs_unfinished;
3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
344e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */)
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* multiple mapping not allowed */
3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag) {
3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("Multiple mapping request detected, unmap previous mapping\n");
3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("Need to fix application to unmap at first, then request second mapping request\n");
3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(buf);
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* don't think TG deal with READ/WRITE differently */
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE;
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmBOWaitIdle(buf->drm_buf, 0);
3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("faild to sync bo for cpu\n");
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
3702befccec034c13d34746a9e87149889d59ac767bFei Jiang
371fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type == psb_bt_user_buffer) || buf->handle)
3722befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = buf->user_ptr;
3732befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
3742befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag);
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (*address == NULL) {
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to map buffer\n");
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf)
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag)
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
3982befccec034c13d34746a9e87149889d59ac767bFei Jiang
399fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type != psb_bt_user_buffer) && !buf->handle)
4002befccec034c13d34746a9e87149889d59ac767bFei Jiang        wsbmBOUnmap(buf->drm_buf);
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer
408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
413437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle(
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VADriverContextP ctx,
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p obj_buffer,
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    void **pbuf /* out */
417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context = obj_buffer->context;
420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
422e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *raw_codedbuf;
423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int next_buf_off;
4252befccec034c13d34746a9e87149889d59ac767bFei Jiang    int i;
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == pbuf) {
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
4292befccec034c13d34746a9e87149889d59ac767bFei Jiang        return vaStatus;
4302befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
4312befccec034c13d34746a9e87149889d59ac767bFei Jiang
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(obj_buffer->psb_buffer);
437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_buffer->buffer_data = NULL;
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
4422befccec034c13d34746a9e87149889d59ac767bFei Jiang    raw_codedbuf = *pbuf;
443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* reset the mapinfo */
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo));
445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *pbuf = p = &obj_buffer->codedbuf_mapinfo[0];
447437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (IS_MRST(driver_data)) {
448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* one segment */
449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        p->size = *((unsigned long *) raw_codedbuf); /* 1st DW is the size */
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->status = *((unsigned long *) raw_codedbuf + 1); /* 2nd DW
451bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                                        * is rc status */
452dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->reserved = 0;
453e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_H264_append_aux_info(obj_context,
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 obj_buffer,
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 (unsigned char *)p->buf,
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 &(p->size));
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } else { /* MFLD */
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_config_p obj_config = CONFIG(obj_context->config_id);
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_config) {
462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
467dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAProfileJPEGBaseline != obj_config->profile
472bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
473dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Set frame skip flag*/
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_frame_skip_flag(obj_context);
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_config->profile) {
477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Simple:
478437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4AdvancedSimple:
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Main:
480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
481dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
482e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("coded buffer size %d\n", p->size);
484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
4852befccec034c13d34746a9e87149889d59ac767bFei Jiang
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Baseline:
487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Main:
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264High:
489dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProfileH264ConstrainedBaseline:
490fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i = 0;
491fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (pnw_get_parallel_core_number(obj_context) == 2) {
492fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            /*The second part of coded buffer which generated by core 2 is the
493fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang             * first part of encoded clip, while the first part of coded buffer
494fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang             * is the second part of encoded clip.*/
495fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context));
496fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].next = &p[i + 1];
497fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
498fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */
499fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
500fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
501fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
502fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                p[i].status =  VA_CODED_BUF_STATUS_AVC_SINGLE_NALU;
503fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                psb__information_message("Only VCL NAL in this segment %i of coded buffer\n",
504fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                    i);
505fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
506fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            psb__information_message("2nd segment coded buffer offset: 0x%08x,  size: %d\n",
507fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                next_buf_off, p[i].size);
508fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i++;
509fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
510437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* 1st segment */
511fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *((unsigned long *) raw_codedbuf);
512fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
513fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
514fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
515fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].status =  VA_CODED_BUF_STATUS_AVC_SINGLE_NALU;
516fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            psb__information_message("Only VCL NAL in this segment %i of coded buffer\n",
517fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                i);
518fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
519fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            psb__information_message("1st segment coded buffer size %d\n", p[i].size);
520437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
521437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
5222befccec034c13d34746a9e87149889d59ac767bFei Jiang
523437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH263Baseline:
524fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                /* one segment */
525dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
526e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
527dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("coded buffer size %d\n", p->size);
528dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
5292befccec034c13d34746a9e87149889d59ac767bFei Jiang
530437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileJPEGBaseline:
531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* 3~6 segment
532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 */
533dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf);
534dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            next_buf_off = 0;
535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Max resolution 4096x4096 use 6 segments*/
536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) {
537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
538e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs */
539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);
540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__information_message("JPEG coded buffer segment %d size: %d\n", i, p->size);
542dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__information_message("JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (next_buf_off == 0) {
545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = NULL;
546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    break;
547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else
548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = &p[1];
549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p++;
550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
553437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
554437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__error_message("unexpected case\n");
555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
556437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
559437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
560437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
561dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
563437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
5642f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
565dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_sync(psb_buffer_p buf)
5662f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
567dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int ret;
5682f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
569dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf);
570dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf->driver_data);
5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
573dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__error_message("faild to sync bo for cpu\n");
575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
576dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
5772f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return VA_STATUS_SUCCESS;
5792f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
580