psb_buffer.c revision 684f0e29e29ca32fad49439cfe0392417361d34d
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
30f31d5416a60f83e184b0906a7ec77ba021840531hding#include <sys/types.h>
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h"
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#ifdef ANDROID
39d03b75a0bb7d76d8d05509f5b581ab3b5d36a20dXiaolin Zhang#include <linux/psb_drm.h>
4006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#else
4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include <psb_drm.h>
4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif
4338d89d625f11c0c3f0ff313cef450252e6467bafhding
447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
45c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
472befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h>
482befccec034c13d34746a9e87149889d59ac767bFei Jiang
492befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h"
504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h"
512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h"
52430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h"
532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer
567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
57dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data,
58dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           unsigned int size,
59dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_type_t type,
60dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_p buf
61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int allignment;
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t placement;
667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* reset rar_handle to NULL */
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->rar_handle = 0;
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->buffer_ofs = 0;
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->type = type;
732befccec034c13d34746a9e87149889d59ac767bFei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
74fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->size = size;
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Mask values are a guess */
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (type) {
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu:
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu_shared:
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_surface:
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 0;
874a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
884a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        break;
894a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu    case psb_bt_surface_tt:
904a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        allignment = 0;
914a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED;
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
93f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
94f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_surface_tiling:
95684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate tiled surface from TT heap\n");
96f31d5416a60f83e184b0906a7ec77ba021840531hding            placement =  WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
97f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
98f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
99f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_mmu_tiling:
100684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng            placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED;
101f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
102f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
103f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
1048ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing    case psb_bt_cpu_vpu_cached:
1058ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        allignment = 1;
1068ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED;
1078ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        break;
108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_vpu_only:
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_only:
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED;
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
116f848388b2f173b141fe2e375a07b4f17435ca814wfeng#if PSB_MFLD_DUMMY_CODE
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_camera:
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
119f848388b2f173b141fe2e375a07b4f17435ca814wfeng        placement = WSBM_PL_FLAG_SHARED;
120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
121f848388b2f173b141fe2e375a07b4f17435ca814wfeng#endif
12256ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ANDROID
123cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang    case psb_bt_imr:
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
125cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang        placement = TTM_PL_FLAG_IMR | WSBM_PL_FLAG_SHARED;
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
12756ada57fd5c4a41fbf281589526d47850bed05fdhding#endif
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
145f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID
146f31d5416a60f83e184b0906a7ec77ba021840531hding    if(!(placement & WSBM_PL_FLAG_SYSTEM)) {
147f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement);
148f31d5416a60f83e184b0906a7ec77ba021840531hding        placement &= ~WSBM_PL_MASK_MEM;
14956ada57fd5c4a41fbf281589526d47850bed05fdhding        placement &= ~WSBM_PL_FLAG_NO_EVICT;
150f31d5416a60f83e184b0906a7ec77ba021840531hding        placement |= TTM_PL_FLAG_VRAM;
151f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement);
152f31d5416a60f83e184b0906a7ec77ba021840531hding    }
153f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
154f31d5416a60f83e184b0906a7ec77ba021840531hding
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
159f31d5416a60f83e184b0906a7ec77ba021840531hding    if(allignment < 4096)
160f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 4096; /* temporily more safe */
161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
162f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         allignment, placement);
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
166c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* here use the placement when gen buffer setted */
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0);
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
175c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1792befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (placement & WSBM_PL_FLAG_TT)
180c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n",
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 size, wsbmBOOffsetHint(buf->drm_buf));
1822befccec034c13d34746a9e87149889d59ac767bFei Jiang
1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->pl_flags = placement;
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->status = psb_bs_ready;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer
192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */
193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data,
194fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           unsigned int size,
195fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_type_t type,
196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_p buf,
1975ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding                           void * vaddr,
1985ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding                           unsigned int flags
199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                          )
200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int allignment;
203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    uint32_t placement;
204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int ret;
205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* reset rar_handle to NULL */
207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->rar_handle = 0;
208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->buffer_ofs = 0;
209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->type = type;
211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->user_ptr = vaddr;
213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
214fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* Xvideo will share surface buffer, set SHARED flag
215fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    */
2165ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    placement =  DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED ;
2175ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding
2185ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    if (flags & PSB_USER_BUFFER_WC)
2195ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding	placement |= WSBM_PL_FLAG_WC;
2205ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    else if (flags & PSB_USER_BUFFER_UNCACHED)
2215ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding	placement |= WSBM_PL_FLAG_UNCACHED;
2225ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    else
2235ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding	placement |= WSBM_PL_FLAG_CACHED;
224fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
225fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = LOCK_HARDWARE(driver_data);
226fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
227fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
228fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
229fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        DEBUG_FAILURE_RET;
230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return vaStatus;
231fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
232fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
233fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment = 4096; /* temporily more safe */
234f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
235f31d5416a60f83e184b0906a7ec77ba021840531hding    if (type == psb_bt_mmu_tiling) {
236684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng        placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED ;
237f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 2048 * 16; /* Tiled row aligned */
238f31d5416a60f83e184b0906a7ec77ba021840531hding    }
239f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
240f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
241fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment, placement);
243fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (!buf->drm_buf) {
244c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
245fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
246fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
247fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
248fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
249fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* here use the placement when gen buffer setted */
250c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size);
251fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
252fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr);
253fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
254c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers\n");
255fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 1;
256fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
257fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
258c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n",
259fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    vaddr, size, wsbmBOOffsetHint(buf->drm_buf));
260fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
261fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->pl_flags = placement;
262fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->status = psb_bs_ready;
263fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->wsbm_synccpu_flag = 0;
264fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
265fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return VA_STATUS_SUCCESS;
266fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
26817f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#if 0
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement)
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement);
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret == 0)
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->pl_flags = set_placement;
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
28717f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data,
290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p buf,
291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p reference_buf
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             )
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memcpy(buf, reference_buf, sizeof(*buf));
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->drm_buf = NULL;
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmGenBuffers(driver_data->main_pool,
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         1,
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &buf->drm_buf,
311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         4096,  /* page alignment */
312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         0);
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
314c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf)));
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
322c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
32909998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data,
3303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               psb_buffer_p buf,
3313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               int kbuf_handle
3323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                              )
33309998e330bbcbf835798128768e590772f5a5737Shuduo Sang{
33409998e330bbcbf835798128768e590772f5a5737Shuduo Sang    int ret = 0;
33509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    VAStatus vaStatus = VA_STATUS_SUCCESS;
33609998e330bbcbf835798128768e590772f5a5737Shuduo Sang
33709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    buf->drm_buf = NULL;
33809998e330bbcbf835798128768e590772f5a5737Shuduo Sang
33909998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = LOCK_HARDWARE(driver_data);
34009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
34109998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
34209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
34309998e330bbcbf835798128768e590772f5a5737Shuduo Sang        DEBUG_FAILURE_RET;
34409998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return vaStatus;
34509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
34709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = wsbmGenBuffers(driver_data->main_pool,
34809998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         1,
34909998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         &buf->drm_buf,
35009998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         4096,  /* page alignment */
35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         0);
35209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (!buf->drm_buf) {
353c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
35409998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
35609998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
35709998e330bbcbf835798128768e590772f5a5737Shuduo Sang
3583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle);
35909998e330bbcbf835798128768e590772f5a5737Shuduo Sang    UNLOCK_HARDWARE(driver_data);
36009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
361c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
36209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
36309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
364c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf);
365f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang    buf->type = psb_bt_surface;
366f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang    buf->status = psb_bs_ready;
3673f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
36809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    return VA_STATUS_SUCCESS;
36909998e330bbcbf835798128768e590772f5a5737Shuduo Sang}
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf)
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->drm_buf == NULL)
377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_bs_unfinished != buf->status) {
3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(buf->driver_data);
380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmBOUnreference(&buf->drm_buf);
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buf->rar_handle)
3822d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang            buf->rar_handle = 0;
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->driver_data = NULL;
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->status = psb_bs_unfinished;
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
393e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */)
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* multiple mapping not allowed */
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag) {
402c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n");
403c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n");
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(buf);
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* don't think TG deal with READ/WRITE differently */
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE;
410c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
411c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        wsbmBOWaitIdle(buf->drm_buf, 0);
412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    } else {
413c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
414c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (ret) {
415c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n");
416c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            return ret;
417c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4192befccec034c13d34746a9e87149889d59ac767bFei Jiang
4201dec8be53962e939debd8d4a1d49d659898520c4hding    if (buf->user_ptr) /* user mode buffer */
4212befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = buf->user_ptr;
4222befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
4232befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag);
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (*address == NULL) {
426c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n");
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf)
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag)
4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
4472befccec034c13d34746a9e87149889d59ac767bFei Jiang
448fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type != psb_bt_user_buffer) && !buf->handle)
4492befccec034c13d34746a9e87149889d59ac767bFei Jiang        wsbmBOUnmap(buf->drm_buf);
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
454430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
455f31d5416a60f83e184b0906a7ec77ba021840531hdingvoid psb__trace_coded(unsigned int *pBuf)
456f31d5416a60f83e184b0906a7ec77ba021840531hding{
457f31d5416a60f83e184b0906a7ec77ba021840531hding    int i, j;
458430ce5c32361119ed81a62c918be6afbdd053eddhding    drv_debug_msg("%s code buffer is\n", __FUNCTION__);
459f31d5416a60f83e184b0906a7ec77ba021840531hding    for (i = 0; i < 6; i++) {
460430ce5c32361119ed81a62c918be6afbdd053eddhding        drv_debug_msg("\t");
461f31d5416a60f83e184b0906a7ec77ba021840531hding        for (j = 0; j < 4; j++) {
462430ce5c32361119ed81a62c918be6afbdd053eddhding             drv_debug_msg("0x%08x, ", pBuf[(i*4) + j]);
463f31d5416a60f83e184b0906a7ec77ba021840531hding        }
464430ce5c32361119ed81a62c918be6afbdd053eddhding        drv_debug_msg("\n");
465f31d5416a60f83e184b0906a7ec77ba021840531hding    }
466f31d5416a60f83e184b0906a7ec77ba021840531hding}
467430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer
470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
475437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle(
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VADriverContextP ctx,
477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p obj_buffer,
478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    void **pbuf /* out */
479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context = obj_buffer->context;
482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
484e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *raw_codedbuf;
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int next_buf_off;
4872befccec034c13d34746a9e87149889d59ac767bFei Jiang    int i;
488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4896d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_INVALID_PARAM(pbuf == NULL);
4902befccec034c13d34746a9e87149889d59ac767bFei Jiang
491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(obj_buffer->psb_buffer);
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_buffer->buffer_data = NULL;
497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
5012befccec034c13d34746a9e87149889d59ac767bFei Jiang    raw_codedbuf = *pbuf;
502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* reset the mapinfo */
503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo));
504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *pbuf = p = &obj_buffer->codedbuf_mapinfo[0];
506f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL
507f31d5416a60f83e184b0906a7ec77ba021840531hding    if (IS_MRFL(driver_data)) {
508f31d5416a60f83e184b0906a7ec77ba021840531hding        object_config_p obj_config = CONFIG(obj_context->config_id);
509f31d5416a60f83e184b0906a7ec77ba021840531hding        if (NULL == obj_config) {
510f31d5416a60f83e184b0906a7ec77ba021840531hding            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
511f31d5416a60f83e184b0906a7ec77ba021840531hding            DEBUG_FAILURE;
512f31d5416a60f83e184b0906a7ec77ba021840531hding
513f31d5416a60f83e184b0906a7ec77ba021840531hding            psb_buffer_unmap(obj_buffer->psb_buffer);
514f31d5416a60f83e184b0906a7ec77ba021840531hding            obj_buffer->buffer_data = NULL;
515f31d5416a60f83e184b0906a7ec77ba021840531hding
516f31d5416a60f83e184b0906a7ec77ba021840531hding            return vaStatus;
517f31d5416a60f83e184b0906a7ec77ba021840531hding        }
518f31d5416a60f83e184b0906a7ec77ba021840531hding
519e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        if (VAProfileJPEGBaseline != obj_config->profile
520e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
521e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            /*Set frame skip flag*/
522e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            tng_set_frame_skip_flag(obj_context);
523e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        }
524f31d5416a60f83e184b0906a7ec77ba021840531hding        switch (obj_config->profile) {
525e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4Simple:
526e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4AdvancedSimple:
527e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4Main:
528e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
529e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264Baseline:
530e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264Main:
531e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264High:
532e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264StereoHigh:
533e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264ConstrainedBaseline:
534e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH263Baseline:
535e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /* 1st segment */
536e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->size = *((unsigned long *) raw_codedbuf);
537e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */
538e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->next = NULL;
539430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
540e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                psb__trace_coded((unsigned int*)raw_codedbuf);
541430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
542e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
543e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
544e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileJPEGBaseline:
545e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /* 3~6 segment */
546e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                tng_jpeg_AppendMarkers(obj_context, raw_codedbuf);
547e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                next_buf_off = 0;
548e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /*Max resolution 4096x4096 use 6 segments*/
549e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) {
550e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);  /* ui32BytesUsed in HEADER_BUFFER*/
551e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs (HEADER_BUFFER) */
552e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);  /* ui32Reserved3 in HEADER_BUFFER*/
553e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
554e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
555e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
556e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
557e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    if (next_buf_off == 0) {
558e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        p->next = NULL;
559e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        break;
560e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    } else
561e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        p->next = &p[1];
562e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p++;
563e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                }
564e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
565e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
566e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            default:
567e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
568e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
569e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                psb_buffer_unmap(obj_buffer->psb_buffer);
570e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                obj_buffer->buffer_data = NULL;
571e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
572f31d5416a60f83e184b0906a7ec77ba021840531hding        }
573f31d5416a60f83e184b0906a7ec77ba021840531hding    }
574f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
57567612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD
57667612a448651896b2557796ff98d46c5e0dbbdc6hding    if (IS_MFLD(driver_data)){ /* MFLD */
577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_config_p obj_config = CONFIG(obj_context->config_id);
578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_config) {
580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
586437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
587437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAProfileJPEGBaseline != obj_config->profile
590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Set frame skip flag*/
592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_frame_skip_flag(obj_context);
593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
594437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_config->profile) {
595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Simple:
596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4AdvancedSimple:
597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Main:
598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
600e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
601c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
6032befccec034c13d34746a9e87149889d59ac767bFei Jiang
604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Baseline:
605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Main:
606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264High:
607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProfileH264ConstrainedBaseline:
608fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i = 0;
609fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context));
610f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            if (pnw_get_parallel_core_number(obj_context) == 2) {
611f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                /*The second part of coded buffer which generated by core 2 is the
612f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                 * first part of encoded clip, while the first part of coded buffer
613f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                 * is the second part of encoded clip.*/
614f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].next = &p[i + 1];
615f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
616f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */
617f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang
618f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
619f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
620f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
621f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
622f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                            i);
623f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                }
624f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x,  size: %d\n",
625f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        next_buf_off, p[i].size);
626f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang
627f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang              i++;
628fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
629fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
630437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* 1st segment */
631fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *((unsigned long *) raw_codedbuf);
632fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
633f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size);
634fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
635f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
636f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
637f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
638f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        i);
639f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            }
640f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            for (i = 0; i < pnw_get_parallel_core_number(obj_context); i++) {
641f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                if (p[i].size > (next_buf_off - sizeof(unsigned long) * 4)) {
642f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "Coded segment %d is too large(%d)"
643f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                            " and exceed segment boundary(offset %d)", i, p[i].size, next_buf_off);
644f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    p[i].size = next_buf_off - sizeof(unsigned long) * 4;
645f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                }
646fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
6492befccec034c13d34746a9e87149889d59ac767bFei Jiang
650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH263Baseline:
651fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                /* one segment */
652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
653e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
654c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
6562befccec034c13d34746a9e87149889d59ac767bFei Jiang
657437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileJPEGBaseline:
658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* 3~6 segment
659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 */
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf);
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            next_buf_off = 0;
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Max resolution 4096x4096 use 6 segments*/
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) {
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
665e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs */
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
668c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
669c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (next_buf_off == 0) {
672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = NULL;
673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    break;
674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else
675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = &p[1];
676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p++;
677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
680437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
681c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
683437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
684437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
685437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
686437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
687437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
68867612a448651896b2557796ff98d46c5e0dbbdc6hding#endif
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
6922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
693