psb_buffer.c revision f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3
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
39b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifdef BAYTRAIL
40b7c527a64448cfeedb2fe114b673af667f92faf2hding#include <linux/vxd_drm.h>
41b7c527a64448cfeedb2fe114b673af667f92faf2hding#else
42aeee5382f933ef7b1aa54a0f12207fa3c9f6c89aAndy Qiu#include <ttm/ttm_placement.h>
43d03b75a0bb7d76d8d05509f5b581ab3b5d36a20dXiaolin Zhang#include <linux/psb_drm.h>
44b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#else
4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include <psb_drm.h>
4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif
4838d89d625f11c0c3f0ff313cef450252e6467bafhding
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
50c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
5101f32633eef9438c9f3ceed244c25487b5274611edward lin#include "tng_cmdbuf.h"
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
53b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
542befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h>
552befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h"
564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h"
57430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h"
58b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
60ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "linux/vsp_fw.h"
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data,
65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           unsigned int size,
66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_type_t type,
67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_p buf
68dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int allignment;
727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t placement;
737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* reset rar_handle to NULL */
767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->rar_handle = 0;
777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->buffer_ofs = 0;
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->type = type;
802befccec034c13d34746a9e87149889d59ac767bFei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
81fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->size = size;
827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Mask values are a guess */
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (type) {
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu:
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu_shared:
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_surface:
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 0;
944a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
95781d5d90f726d4d50151b5686348ce22f48937c7Li Zeng        if (IS_CTP(driver_data))  /* CTP support cache snoop */
96781d5d90f726d4d50151b5686348ce22f48937c7Li Zeng            placement |= WSBM_PL_FLAG_CACHED;
974a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        break;
984a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu    case psb_bt_surface_tt:
994a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu        allignment = 0;
100c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng        if (IS_MOFD(driver_data))
101c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng            placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED;
102c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng        else
103c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng            placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED;
104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
105f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
106f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_surface_tiling:
107684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate tiled surface from TT heap\n");
10874576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng            if (IS_MOFD(driver_data))
10974576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng                placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED;
11074576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng            else
11174576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng                placement =  WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
112f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
113f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
114f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_mmu_tiling:
115684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng            placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED;
116f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
117f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
118f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
1198ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing    case psb_bt_cpu_vpu_cached:
1208ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        allignment = 1;
1218ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED;
1228ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing        break;
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_vpu_only:
124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_only:
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED;
130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
131f848388b2f173b141fe2e375a07b4f17435ca814wfeng#if PSB_MFLD_DUMMY_CODE
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_camera:
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
134f848388b2f173b141fe2e375a07b4f17435ca814wfeng        placement = WSBM_PL_FLAG_SHARED;
135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
136f848388b2f173b141fe2e375a07b4f17435ca814wfeng#endif
13756ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ANDROID
138b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL
139cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang    case psb_bt_imr:
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
141cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang        placement = TTM_PL_FLAG_IMR | WSBM_PL_FLAG_SHARED;
142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
14356ada57fd5c4a41fbf281589526d47850bed05fdhding#endif
144b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif
145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR
1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
162f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID
163f31d5416a60f83e184b0906a7ec77ba021840531hding    if(!(placement & WSBM_PL_FLAG_SYSTEM)) {
164f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement);
165f31d5416a60f83e184b0906a7ec77ba021840531hding        placement &= ~WSBM_PL_MASK_MEM;
16656ada57fd5c4a41fbf281589526d47850bed05fdhding        placement &= ~WSBM_PL_FLAG_NO_EVICT;
167f31d5416a60f83e184b0906a7ec77ba021840531hding        placement |= TTM_PL_FLAG_VRAM;
168f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement);
169f31d5416a60f83e184b0906a7ec77ba021840531hding    }
170f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
171f31d5416a60f83e184b0906a7ec77ba021840531hding
1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
176f31d5416a60f83e184b0906a7ec77ba021840531hding    if(allignment < 4096)
177f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 4096; /* temporily more safe */
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
179f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         allignment, placement);
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
183c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* here use the placement when gen buffer setted */
1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0);
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
192c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1962befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (placement & WSBM_PL_FLAG_TT)
197c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n",
198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 size, wsbmBOOffsetHint(buf->drm_buf));
1992befccec034c13d34746a9e87149889d59ac767bFei Jiang
2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->pl_flags = placement;
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->status = psb_bs_ready;
2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer
209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */
210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data,
211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           unsigned int size,
212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_type_t type,
213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_p buf,
2145ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding                           void * vaddr,
2155ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding                           unsigned int flags
216fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                          )
217fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
218fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
219fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int allignment;
220fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    uint32_t placement;
221fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int ret;
222fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
223fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* reset rar_handle to NULL */
224fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->rar_handle = 0;
225fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->buffer_ofs = 0;
226fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
227fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->type = type;
228fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
229fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->user_ptr = vaddr;
230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
231fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* Xvideo will share surface buffer, set SHARED flag
232fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    */
2335ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding    placement =  DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED ;
2345ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding
235fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = LOCK_HARDWARE(driver_data);
236fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
237fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
238fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
239fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        DEBUG_FAILURE_RET;
240fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return vaStatus;
241fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
243fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment = 4096; /* temporily more safe */
244f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
245f31d5416a60f83e184b0906a7ec77ba021840531hding    if (type == psb_bt_mmu_tiling) {
246684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng        placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED ;
247f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 2048 * 16; /* Tiled row aligned */
248f31d5416a60f83e184b0906a7ec77ba021840531hding    }
249f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
250c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng
251c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng    if (flags & PSB_USER_BUFFER_WC)
252c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng	placement |= WSBM_PL_FLAG_WC;
253c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng    else if (flags & PSB_USER_BUFFER_UNCACHED)
254c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng	placement |= WSBM_PL_FLAG_UNCACHED;
255c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng    else
256c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng	placement |= WSBM_PL_FLAG_CACHED;
257c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng
258f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
259fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
260fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment, placement);
261fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (!buf->drm_buf) {
262c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
263fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
264fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
265fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
266fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
267fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* here use the placement when gen buffer setted */
268c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size);
269fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
270fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr);
271fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
272b7c527a64448cfeedb2fe114b673af667f92faf2hding        drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers, buf->drm_buf is 0x%x, size is %d, vaddr is 0x%x\n", buf->drm_buf, size, vaddr);
273fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 1;
274fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
275fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
276c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n",
277fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    vaddr, size, wsbmBOOffsetHint(buf->drm_buf));
278fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
279fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->pl_flags = placement;
280fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->status = psb_bs_ready;
281fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->wsbm_synccpu_flag = 0;
282fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
283fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return VA_STATUS_SUCCESS;
284fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
28617f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#if 0
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement)
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement);
3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret == 0)
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->pl_flags = set_placement;
302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
30517f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif
3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data,
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p buf,
309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p reference_buf
310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             )
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memcpy(buf, reference_buf, sizeof(*buf));
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->drm_buf = NULL;
317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmGenBuffers(driver_data->main_pool,
327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         1,
328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &buf->drm_buf,
329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         4096,  /* page alignment */
330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         0);
3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
332c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf)));
338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
340c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
34709998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data,
3483f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               psb_buffer_p buf,
3493f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               int kbuf_handle
3503f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                              )
35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang{
35209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    int ret = 0;
35309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    VAStatus vaStatus = VA_STATUS_SUCCESS;
35409998e330bbcbf835798128768e590772f5a5737Shuduo Sang
35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    buf->drm_buf = NULL;
35609998e330bbcbf835798128768e590772f5a5737Shuduo Sang
35709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = LOCK_HARDWARE(driver_data);
35809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
35909998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
36009998e330bbcbf835798128768e590772f5a5737Shuduo Sang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
36109998e330bbcbf835798128768e590772f5a5737Shuduo Sang        DEBUG_FAILURE_RET;
36209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return vaStatus;
36309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
36509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = wsbmGenBuffers(driver_data->main_pool,
36609998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         1,
36709998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         &buf->drm_buf,
36809998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         4096,  /* page alignment */
36909998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         0);
37009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (!buf->drm_buf) {
371c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
37209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
37309998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
37409998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
37509998e330bbcbf835798128768e590772f5a5737Shuduo Sang
3763f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle);
37709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    UNLOCK_HARDWARE(driver_data);
37809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
379c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
38009998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
38109998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
382c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf);
383f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang    buf->type = psb_bt_surface;
384f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang    buf->status = psb_bs_ready;
3853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
38609998e330bbcbf835798128768e590772f5a5737Shuduo Sang    return VA_STATUS_SUCCESS;
38709998e330bbcbf835798128768e590772f5a5737Shuduo Sang}
3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf)
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->drm_buf == NULL)
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_bs_unfinished != buf->status) {
3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(buf->driver_data);
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmBOUnreference(&buf->drm_buf);
3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buf->rar_handle)
4002d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang            buf->rar_handle = 0;
4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->driver_data = NULL;
4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->status = psb_bs_unfinished;
4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer
4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
411e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */)
4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* multiple mapping not allowed */
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag) {
420c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n");
421c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n");
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(buf);
4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* don't think TG deal with READ/WRITE differently */
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE;
428c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
429c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        wsbmBOWaitIdle(buf->drm_buf, 0);
430c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    } else {
431c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
432c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (ret) {
433c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n");
434c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            return ret;
435c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4372befccec034c13d34746a9e87149889d59ac767bFei Jiang
4381dec8be53962e939debd8d4a1d49d659898520c4hding    if (buf->user_ptr) /* user mode buffer */
4392befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = buf->user_ptr;
4402befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
4412befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag);
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (*address == NULL) {
444c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n");
4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf)
4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag)
4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
4652befccec034c13d34746a9e87149889d59ac767bFei Jiang
466fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type != psb_bt_user_buffer) && !buf->handle)
4672befccec034c13d34746a9e87149889d59ac767bFei Jiang        wsbmBOUnmap(buf->drm_buf);
468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4727bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#define _MRFL_DEBUG_CODED_
4737bb84b457d5658da0c850ed13dff3d212af70771Edward Lin
474430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
475ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingstatic void psb__trace_coded(VACodedBufferSegment *vaCodedBufSeg)
476f31d5416a60f83e184b0906a7ec77ba021840531hding{
477f31d5416a60f83e184b0906a7ec77ba021840531hding    int i, j;
478ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    int uiPipeIndex = -1;
479ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    unsigned int *pBuf = NULL;
480ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    do {
481ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        ++uiPipeIndex;
482ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: pipe num %d, size = %d\n", __FUNCTION__, uiPipeIndex, vaCodedBufSeg[uiPipeIndex].size);
483ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        pBuf = (unsigned int *)(vaCodedBufSeg[uiPipeIndex].buf);
484ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        pBuf -= 16;
485ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        for (i = 0; i < 6; i++) {
486ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding            for (j = 0; j < 4; j++) {
487ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding                drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: 0x%08x\n", __FUNCTION__, pBuf[(i*4) + j]);
488ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding            }
489ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding         }
490ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: \n", __FUNCTION__);
491ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    } while (vaCodedBufSeg[uiPipeIndex].next);
492ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
493ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding	return ;
494f31d5416a60f83e184b0906a7ec77ba021840531hding}
495430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
496ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
4974d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan#define PROFILE_H264(profile) ((profile>=VAProfileH264Baseline && profile <=VAProfileH264High) || \
4984d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan                               (profile == VAProfileH264ConstrainedBaseline))
499ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingstatic void tng_get_coded_data(
500ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    object_buffer_p obj_buffer,
501ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    unsigned char *raw_codedbuf
502ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding)
503ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding{
504ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    object_context_p obj_context = obj_buffer->context;
505ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    VACodedBufferSegment *vaCodedBufSeg = &obj_buffer->codedbuf_mapinfo[0];
506ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    int iPipeIndex = 0;
507ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    unsigned int uiPipeNum = tng_get_pipe_number(obj_context);
508ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    unsigned int uiBufOffset = tng_align_KB(obj_buffer->size >> 1);
5095dded681fc06f6f765840c45a5e6d57cdf79e561edward lin    unsigned long *ptmp = NULL;
5104d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan    int tmp;
511ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
512ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s pipenum = 0x%x\n", __FUNCTION__, uiPipeNum);
513ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s offset  = 0x%x\n", __FUNCTION__, uiBufOffset);
514ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
515bb1e9267a518cf047f09350dd3ec19932f923e74gji    tmp = vaCodedBufSeg[iPipeIndex].size = *(unsigned int *)((unsigned long)raw_codedbuf);
5164d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan
5174d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan    /*
5184d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan     * This is used for DRM over WiDi which only uses H264 BP
5194d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan     * Tangier IED encryption operates on the chunks with 16bytes, and we must include
5204d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan     * the extra bytes beyond slice data as a whole chunk for decrption
5214d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan     * We simply include the padding bytes regardless of IED enable or disable
5224d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan     */
5234d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan    if (PROFILE_H264(obj_context->profile) && (tmp % 16 != 0)) {
5244d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan	tmp = (tmp + 15) & (~15);
5254d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan	drv_debug_msg(VIDEO_DEBUG_GENERAL, "Force slice size from %d to %d\n",
5264d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan                      vaCodedBufSeg[iPipeIndex].size, tmp);
5274d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan	vaCodedBufSeg[iPipeIndex].size  = tmp;
5284d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan    }
5294d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan
530bb1e9267a518cf047f09350dd3ec19932f923e74gji    vaCodedBufSeg[iPipeIndex].buf = (unsigned char *)(((unsigned int *)((unsigned long)raw_codedbuf)) + 16); /* skip 4DWs */
5315dded681fc06f6f765840c45a5e6d57cdf79e561edward lin
5325dded681fc06f6f765840c45a5e6d57cdf79e561edward lin    ptmp = (unsigned long *)((unsigned long)raw_codedbuf);
5335dded681fc06f6f765840c45a5e6d57cdf79e561edward lin    vaCodedBufSeg[iPipeIndex].reserved = (ptmp[1] >> 6) & 0xf;
534eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix    vaCodedBufSeg[iPipeIndex].next = NULL;
535eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix
536eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix
537ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    if (uiPipeNum == 2) {
538ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding        /*The second part of coded buffer which generated by core 2 is the
539ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding         * first part of encoded clip, while the first part of coded buffer
540ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding         * is the second part of encoded clip.*/
541eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix        ++iPipeIndex;
542eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix        vaCodedBufSeg[iPipeIndex - 1].next = &vaCodedBufSeg[iPipeIndex];
543bb1e9267a518cf047f09350dd3ec19932f923e74gji        tmp = vaCodedBufSeg[iPipeIndex].size = *(unsigned int *)((unsigned long)raw_codedbuf + uiBufOffset);
5444d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan
5454d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan        /*
5464d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan         * This is used for DRM over WiDi which only uses H264 BP
5474d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan         * Tangier IED encryption operates on the chunks with 16bytes, and we must include
5484d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan         * the extra bytes beyond slice data as a whole chunk for decryption
5494d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan         * We simply include the padding bytes regardless of IED enable or disable
5504d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan         */
5514d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan        if (PROFILE_H264(obj_context->profile) && (tmp % 16 != 0)) {
5524d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan            tmp = (tmp + 15) & (~15);
5534d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan            drv_debug_msg(VIDEO_DEBUG_GENERAL,"Force slice size from %d to %d\n",
5544d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan                          vaCodedBufSeg[iPipeIndex].size, tmp);
5554d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan
5564d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan            vaCodedBufSeg[iPipeIndex].size  = tmp;
5574d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan        }
5584d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan
559bb1e9267a518cf047f09350dd3ec19932f923e74gji        vaCodedBufSeg[iPipeIndex].buf = (unsigned char *)(((unsigned int *)((unsigned long)raw_codedbuf + uiBufOffset)) + 16); /* skip 4DWs */
5605dded681fc06f6f765840c45a5e6d57cdf79e561edward lin        vaCodedBufSeg[iPipeIndex].reserved = vaCodedBufSeg[iPipeIndex - 1].reserved;
561eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix        vaCodedBufSeg[iPipeIndex].next = NULL;
562ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    }
563ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
564ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#ifdef _MRFL_DEBUG_CODED_
565ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    psb__trace_coded(vaCodedBufSeg);
566ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#endif
567ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
568ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding    return ;
569ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding}
570ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding
571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer
573437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
576437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
578437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle(
579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VADriverContextP ctx,
580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p obj_buffer,
581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    void **pbuf /* out */
582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context = obj_buffer->context;
585437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
586437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
587e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *raw_codedbuf;
588437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int next_buf_off;
5902befccec034c13d34746a9e87149889d59ac767bFei Jiang    int i;
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
5926d37ae34fcae80f2e898b61e2506ed8e887bd16anguo    CHECK_INVALID_PARAM(pbuf == NULL);
5932befccec034c13d34746a9e87149889d59ac767bFei Jiang
594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(obj_buffer->psb_buffer);
599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_buffer->buffer_data = NULL;
600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
6042befccec034c13d34746a9e87149889d59ac767bFei Jiang    raw_codedbuf = *pbuf;
605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* reset the mapinfo */
606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo));
607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *pbuf = p = &obj_buffer->codedbuf_mapinfo[0];
609f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL
610f31d5416a60f83e184b0906a7ec77ba021840531hding    if (IS_MRFL(driver_data)) {
611f31d5416a60f83e184b0906a7ec77ba021840531hding        object_config_p obj_config = CONFIG(obj_context->config_id);
612f31d5416a60f83e184b0906a7ec77ba021840531hding        if (NULL == obj_config) {
613f31d5416a60f83e184b0906a7ec77ba021840531hding            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
614f31d5416a60f83e184b0906a7ec77ba021840531hding            DEBUG_FAILURE;
615f31d5416a60f83e184b0906a7ec77ba021840531hding
616f31d5416a60f83e184b0906a7ec77ba021840531hding            psb_buffer_unmap(obj_buffer->psb_buffer);
617f31d5416a60f83e184b0906a7ec77ba021840531hding            obj_buffer->buffer_data = NULL;
618f31d5416a60f83e184b0906a7ec77ba021840531hding
619f31d5416a60f83e184b0906a7ec77ba021840531hding            return vaStatus;
620f31d5416a60f83e184b0906a7ec77ba021840531hding        }
621f31d5416a60f83e184b0906a7ec77ba021840531hding
622e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        if (VAProfileJPEGBaseline != obj_config->profile
623e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
624e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            /*Set frame skip flag*/
625e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            tng_set_frame_skip_flag(obj_context);
626e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin        }
627f31d5416a60f83e184b0906a7ec77ba021840531hding        switch (obj_config->profile) {
628e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4Simple:
629e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4AdvancedSimple:
630e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileMPEG4Main:
631e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
632e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264Baseline:
633e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264Main:
634e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264High:
635e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264StereoHigh:
636e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH264ConstrainedBaseline:
637e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileH263Baseline:
638e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /* 1st segment */
639ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding                tng_get_coded_data(obj_buffer, raw_codedbuf);
640ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#if 0
641e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->size = *((unsigned long *) raw_codedbuf);
642e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */
643e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                p->next = NULL;
644430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
645e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                psb__trace_coded((unsigned int*)raw_codedbuf);
646ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding                psb__trace_coded(p);
647ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#endif
648430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
649e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
650ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            case VAProfileVP8Version0_3:
651ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            {
652ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo                /* multi segments*/
653ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo		struct VssVp8encEncodedFrame *t = (struct VssVp8encEncodedFrame *) (raw_codedbuf);
65420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		int concatenate = 1;
655025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo#if 0
65620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		for (i = 0; i < t->partitions - 1; i++) {
65720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    if (t->partition_start[i+1] != t->partition_start[i] + t->partition_size[i])
65820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                        concatenate = 0;
65920b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		}
660025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo#endif
66120b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		/* reference frame surface_id */
6621e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                /* default is recon_buffer_mode ==0 */
6631e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo                p->reserved = t->surfaceId_of_ref_frame[3];
66420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo
66520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		if (concatenate) {
66620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    /* partitions are concatenate */
66720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    p->buf = t->coded_data;
66820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    p->size = t->frame_size;
669f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun                    if(t->frame_size == 0){
670f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun                        drv_debug_msg(VIDEO_DEBUG_ERROR,"Frame size is zero, Force it to 3, encoder status is 0x%x\n", t->status);
671f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun                        p->size = 3;
672f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun                        t->coded_data[0]=0;
673f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun                    }
67420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    p->next = NULL;
67520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		} else {
67620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                    for (i = 0; i < t->partitions; i++) {
67720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                        /* partition not consecutive */
67820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                        p->buf = t->coded_data + t->partition_start[i] - t->partition_start[0];
679025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo                        p->size += t->partition_size[i];
68020b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                        p->next = &p[1];
68120b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo                        p++;
68220b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		    }
68320b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		    p--;
68420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		    p->next = NULL;
68520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo		}
686ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo
687ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo		break;
688ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo            }
689e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            case VAProfileJPEGBaseline:
690e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /* 3~6 segment */
691e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                tng_jpeg_AppendMarkers(obj_context, raw_codedbuf);
692e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                next_buf_off = 0;
693e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                /*Max resolution 4096x4096 use 6 segments*/
694e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) {
695e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);  /* ui32BytesUsed in HEADER_BUFFER*/
696e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs (HEADER_BUFFER) */
697e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);  /* ui32Reserved3 in HEADER_BUFFER*/
698e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
699e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
700e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
701e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
702e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    if (next_buf_off == 0) {
703e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        p->next = NULL;
704e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        break;
705e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    } else
706e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                        p->next = &p[1];
707e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                    p++;
708e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                }
709e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
710e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
711e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin            default:
712e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
713e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin
714e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                psb_buffer_unmap(obj_buffer->psb_buffer);
715e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                obj_buffer->buffer_data = NULL;
716e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin                break;
717f31d5416a60f83e184b0906a7ec77ba021840531hding        }
718f31d5416a60f83e184b0906a7ec77ba021840531hding    }
719f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
72067612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD
72167612a448651896b2557796ff98d46c5e0dbbdc6hding    if (IS_MFLD(driver_data)){ /* MFLD */
722437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_config_p obj_config = CONFIG(obj_context->config_id);
723437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
724437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_config) {
725437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
726437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
727437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
728437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
729437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
731437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
732437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAProfileJPEGBaseline != obj_config->profile
735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Set frame skip flag*/
737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_frame_skip_flag(obj_context);
738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
739437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_config->profile) {
740437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Simple:
741437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4AdvancedSimple:
742437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Main:
743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
745e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
746c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
7482befccec034c13d34746a9e87149889d59ac767bFei Jiang
749437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Baseline:
750437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Main:
751437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264High:
752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProfileH264ConstrainedBaseline:
753fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i = 0;
754fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context));
755f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            if (pnw_get_parallel_core_number(obj_context) == 2) {
756f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                /*The second part of coded buffer which generated by core 2 is the
757f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                 * first part of encoded clip, while the first part of coded buffer
758f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                 * is the second part of encoded clip.*/
759f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].next = &p[i + 1];
760f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
761f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */
762f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang
763f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
764f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
765f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
766f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
767f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                            i);
768f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                }
769f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x,  size: %d\n",
770f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        next_buf_off, p[i].size);
771f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang
772f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang              i++;
773fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
774fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
775437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* 1st segment */
776fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *((unsigned long *) raw_codedbuf);
777fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
778f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size);
779fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
780f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
781f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
782f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
783f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                        i);
784f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            }
785f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang            for (i = 0; i < pnw_get_parallel_core_number(obj_context); i++) {
786f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                if (p[i].size > (next_buf_off - sizeof(unsigned long) * 4)) {
787f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    drv_debug_msg(VIDEO_DEBUG_ERROR, "Coded segment %d is too large(%d)"
788f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                            " and exceed segment boundary(offset %d)", i, p[i].size, next_buf_off);
789f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                    p[i].size = next_buf_off - sizeof(unsigned long) * 4;
790f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang                }
791fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
792437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
793437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
7942befccec034c13d34746a9e87149889d59ac767bFei Jiang
795437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH263Baseline:
796fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                /* one segment */
797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
798e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
799c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
8012befccec034c13d34746a9e87149889d59ac767bFei Jiang
802437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileJPEGBaseline:
803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* 3~6 segment
804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 */
805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf);
806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            next_buf_off = 0;
807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Max resolution 4096x4096 use 6 segments*/
808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) {
809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
810e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs */
811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);
812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
813c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
814c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (next_buf_off == 0) {
817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = NULL;
818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    break;
819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else
820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = &p[1];
821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p++;
822dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
823dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
824dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
825437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
826c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
828437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
829437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
830437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
831437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
832437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
83367612a448651896b2557796ff98d46c5e0dbbdc6hding#endif
834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
835437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
836437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
8372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
838