psb_buffer.c revision 430ce5c32361119ed81a62c918be6afbdd053edd
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
387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drm.h"
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
40c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h"
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
422befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h>
432befccec034c13d34746a9e87149889d59ac767bFei Jiang
442befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h"
454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h"
462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h"
47430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h"
482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data,
53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           unsigned int size,
54dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_type_t type,
55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_p buf
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int allignment;
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t placement;
617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* reset rar_handle to NULL */
647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->rar_handle = 0;
657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->buffer_ofs = 0;
66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->type = type;
682befccec034c13d34746a9e87149889d59ac767bFei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
69fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->size = size;
707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Mask values are a guess */
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (type) {
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu:
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu_shared:
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_surface:
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 0;
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Xvideo will share surface buffer, set SHARED flag
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun         */
845e4b33b23680bc064b25d38086a13380d37bb8a4hding        int is_thumbnail = 0;
855e4b33b23680bc064b25d38086a13380d37bb8a4hding        char *str;
86f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef ANDROID
875e4b33b23680bc064b25d38086a13380d37bb8a4hding        if((str = getenv("PSB_VIDEO_THUMBNAIL")))
885e4b33b23680bc064b25d38086a13380d37bb8a4hding            is_thumbnail = (gettid() == atoi(str));
89f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
905e4b33b23680bc064b25d38086a13380d37bb8a4hding        if (getenv("PSB_VIDEO_SURFACE_MMU") || is_thumbnail) {
91c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate surface from MMU heap\n");
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
94c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate surface from TT heap\n");
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
98f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
99f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_surface_tiling:
100f31d5416a60f83e184b0906a7ec77ba021840531hding            psb__information_message("Allocate tiled surface from TT heap\n");
101f31d5416a60f83e184b0906a7ec77ba021840531hding            placement =  WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
102f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
103f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
104f31d5416a60f83e184b0906a7ec77ba021840531hding    case psb_bt_mmu_tiling:
105f31d5416a60f83e184b0906a7ec77ba021840531hding            placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED;
106f31d5416a60f83e184b0906a7ec77ba021840531hding            allignment = 2048 * 16; /* Tiled row aligned */
107f31d5416a60f83e184b0906a7ec77ba021840531hding        break;
108f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_vpu_only:
110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_only:
115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED;
117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_camera:
119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
1203982f61b009483a53bdbc0391dc71934021fc8abKun Wang        placement = TTM_PL_FLAG_CI | WSBM_PL_FLAG_SHARED;
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_rar:
123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
1243982f61b009483a53bdbc0391dc71934021fc8abKun Wang        placement = TTM_PL_FLAG_RAR | WSBM_PL_FLAG_SHARED;
125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR
1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
143f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID
144f31d5416a60f83e184b0906a7ec77ba021840531hding    if(!(placement & WSBM_PL_FLAG_SYSTEM)) {
145f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement);
146f31d5416a60f83e184b0906a7ec77ba021840531hding        placement &= ~WSBM_PL_MASK_MEM;
147f31d5416a60f83e184b0906a7ec77ba021840531hding        placement |= TTM_PL_FLAG_VRAM;
148f31d5416a60f83e184b0906a7ec77ba021840531hding        //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement);
149f31d5416a60f83e184b0906a7ec77ba021840531hding    }
150f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
151f31d5416a60f83e184b0906a7ec77ba021840531hding
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
156f31d5416a60f83e184b0906a7ec77ba021840531hding    if(allignment < 4096)
157f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 4096; /* temporily more safe */
158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
159f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         allignment, placement);
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
163c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* here use the placement when gen buffer setted */
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0);
170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
172c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1762befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (placement & WSBM_PL_FLAG_TT)
177c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n",
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 size, wsbmBOOffsetHint(buf->drm_buf));
1792befccec034c13d34746a9e87149889d59ac767bFei Jiang
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->pl_flags = placement;
1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->status = psb_bs_ready;
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/*
188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer
189fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */
190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data,
191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           unsigned int size,
192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_type_t type,
193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           psb_buffer_p buf,
194fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                           void * vaddr
195fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                          )
196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{
197fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
198fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int allignment;
199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    uint32_t placement;
200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    int ret;
201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* reset rar_handle to NULL */
203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->rar_handle = 0;
204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->buffer_ofs = 0;
205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->type = type;
207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->user_ptr = vaddr;
209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* Xvideo will share surface buffer, set SHARED flag
211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    */
212fe2118793f5ae0b13844ba7bb5b4dc9ddcd4f450Elaine Wang    placement =  DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_UNCACHED | WSBM_PL_FLAG_SHARED ;
213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
214fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = LOCK_HARDWARE(driver_data);
215fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
216fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
217fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
218fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        DEBUG_FAILURE_RET;
219fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return vaStatus;
220fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
221fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
222fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment = 4096; /* temporily more safe */
223f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING
224f31d5416a60f83e184b0906a7ec77ba021840531hding    if (type == psb_bt_mmu_tiling) {
225f31d5416a60f83e184b0906a7ec77ba021840531hding        placement =  DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED ;
226f31d5416a60f83e184b0906a7ec77ba021840531hding        allignment = 2048 * 16; /* Tiled row aligned */
227f31d5416a60f83e184b0906a7ec77ba021840531hding    }
228f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
229f31d5416a60f83e184b0906a7ec77ba021840531hding    //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n");
230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
231fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    allignment, placement);
232fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (!buf->drm_buf) {
233c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
234fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        UNLOCK_HARDWARE(driver_data);
235fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
236fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
237fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
238fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    /* here use the placement when gen buffer setted */
239c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size);
240fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
241fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr);
242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if (ret) {
243c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers\n");
244fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang        return 1;
245fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    }
246fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
247c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n",
248fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    vaddr, size, wsbmBOOffsetHint(buf->drm_buf));
249fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
250fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->pl_flags = placement;
251fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->status = psb_bs_ready;
252fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    buf->wsbm_synccpu_flag = 0;
253fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
254fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    return VA_STATUS_SUCCESS;
255fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang}
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement)
2637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement);
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret == 0)
2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->pl_flags = set_placement;
272dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data,
278dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p buf,
279dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p reference_buf
280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             )
2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memcpy(buf, reference_buf, sizeof(*buf));
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->drm_buf = NULL;
287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
2927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmGenBuffers(driver_data->main_pool,
297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         1,
298dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &buf->drm_buf,
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         4096,  /* page alignment */
300dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         0);
3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
302c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf)));
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
310c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
31709998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data,
3183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               psb_buffer_p buf,
3193f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                               int kbuf_handle
3203f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang                              )
32109998e330bbcbf835798128768e590772f5a5737Shuduo Sang{
32209998e330bbcbf835798128768e590772f5a5737Shuduo Sang    int ret = 0;
32309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    VAStatus vaStatus = VA_STATUS_SUCCESS;
32409998e330bbcbf835798128768e590772f5a5737Shuduo Sang
32509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    buf->drm_buf = NULL;
32609998e330bbcbf835798128768e590772f5a5737Shuduo Sang
32709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = LOCK_HARDWARE(driver_data);
32809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
32909998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
33009998e330bbcbf835798128768e590772f5a5737Shuduo Sang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
33109998e330bbcbf835798128768e590772f5a5737Shuduo Sang        DEBUG_FAILURE_RET;
33209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return vaStatus;
33309998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
33509998e330bbcbf835798128768e590772f5a5737Shuduo Sang    ret = wsbmGenBuffers(driver_data->main_pool,
33609998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         1,
33709998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         &buf->drm_buf,
33809998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         4096,  /* page alignment */
33909998e330bbcbf835798128768e590772f5a5737Shuduo Sang                         0);
34009998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (!buf->drm_buf) {
341c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n");
34209998e330bbcbf835798128768e590772f5a5737Shuduo Sang        UNLOCK_HARDWARE(driver_data);
34309998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
34409998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
34509998e330bbcbf835798128768e590772f5a5737Shuduo Sang
3463f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang    ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle);
34709998e330bbcbf835798128768e590772f5a5737Shuduo Sang    UNLOCK_HARDWARE(driver_data);
34809998e330bbcbf835798128768e590772f5a5737Shuduo Sang    if (ret) {
349c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n");
35009998e330bbcbf835798128768e590772f5a5737Shuduo Sang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang    }
352c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang    buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf);
3533f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang
35409998e330bbcbf835798128768e590772f5a5737Shuduo Sang    return VA_STATUS_SUCCESS;
35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang}
3567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf)
3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->drm_buf == NULL)
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_bs_unfinished != buf->status) {
3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(buf->driver_data);
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmBOUnreference(&buf->drm_buf);
3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buf->rar_handle)
3682d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang            buf->rar_handle = 0;
3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->driver_data = NULL;
3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->status = psb_bs_unfinished;
3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
3727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer
3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
379e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */)
3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* multiple mapping not allowed */
3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag) {
388c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n");
389c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n");
3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(buf);
3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* don't think TG deal with READ/WRITE differently */
3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE;
396c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    if (psb_video_trace_fp) {
397c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        wsbmBOWaitIdle(buf->drm_buf, 0);
398c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang    } else {
399c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
400c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        if (ret) {
401c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n");
402c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            return ret;
403c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        }
4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
4052befccec034c13d34746a9e87149889d59ac767bFei Jiang
406fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type == psb_bt_user_buffer) || buf->handle)
4072befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = buf->user_ptr;
4082befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
4092befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag);
410dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (*address == NULL) {
412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n");
4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
4207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
4237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf)
4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag)
4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
4332befccec034c13d34746a9e87149889d59ac767bFei Jiang
434fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang    if ((buf->type != psb_bt_user_buffer) && !buf->handle)
4352befccec034c13d34746a9e87149889d59ac767bFei Jiang        wsbmBOUnmap(buf->drm_buf);
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
440430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
441f31d5416a60f83e184b0906a7ec77ba021840531hdingvoid psb__trace_coded(unsigned int *pBuf)
442f31d5416a60f83e184b0906a7ec77ba021840531hding{
443f31d5416a60f83e184b0906a7ec77ba021840531hding    int i, j;
444430ce5c32361119ed81a62c918be6afbdd053eddhding    drv_debug_msg("%s code buffer is\n", __FUNCTION__);
445f31d5416a60f83e184b0906a7ec77ba021840531hding    for (i = 0; i < 6; i++) {
446430ce5c32361119ed81a62c918be6afbdd053eddhding        drv_debug_msg("\t");
447f31d5416a60f83e184b0906a7ec77ba021840531hding        for (j = 0; j < 4; j++) {
448430ce5c32361119ed81a62c918be6afbdd053eddhding             drv_debug_msg("0x%08x, ", pBuf[(i*4) + j]);
449f31d5416a60f83e184b0906a7ec77ba021840531hding        }
450430ce5c32361119ed81a62c918be6afbdd053eddhding        drv_debug_msg("\n");
451f31d5416a60f83e184b0906a7ec77ba021840531hding    }
452f31d5416a60f83e184b0906a7ec77ba021840531hding}
453430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
454437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer
456437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
457437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
458437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
459437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
460437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
461437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle(
462dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VADriverContextP ctx,
463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p obj_buffer,
464dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    void **pbuf /* out */
465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context = obj_buffer->context;
468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
470e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang    unsigned char *raw_codedbuf;
471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int next_buf_off;
4732befccec034c13d34746a9e87149889d59ac767bFei Jiang    int i;
474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == pbuf) {
476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
4772befccec034c13d34746a9e87149889d59ac767bFei Jiang        return vaStatus;
4782befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
4792befccec034c13d34746a9e87149889d59ac767bFei Jiang
480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
484437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(obj_buffer->psb_buffer);
485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_buffer->buffer_data = NULL;
486437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
487437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
488437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
4902befccec034c13d34746a9e87149889d59ac767bFei Jiang    raw_codedbuf = *pbuf;
491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* reset the mapinfo */
492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo));
493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *pbuf = p = &obj_buffer->codedbuf_mapinfo[0];
49567612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MRST
496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (IS_MRST(driver_data)) {
497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* one segment */
498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        p->size = *((unsigned long *) raw_codedbuf); /* 1st DW is the size */
499dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->status = *((unsigned long *) raw_codedbuf + 1); /* 2nd DW
500bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang                                                        * is rc status */
501dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->reserved = 0;
502e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang        p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
503dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_H264_append_aux_info(obj_context,
504dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 obj_buffer,
505dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 (unsigned char *)p->buf,
506dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 &(p->size));
50767612a448651896b2557796ff98d46c5e0dbbdc6hding    }
50867612a448651896b2557796ff98d46c5e0dbbdc6hding#endif
509f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL
510f31d5416a60f83e184b0906a7ec77ba021840531hding    if (IS_MRFL(driver_data)) {
511f31d5416a60f83e184b0906a7ec77ba021840531hding        object_config_p obj_config = CONFIG(obj_context->config_id);
512f31d5416a60f83e184b0906a7ec77ba021840531hding        if (NULL == obj_config) {
513f31d5416a60f83e184b0906a7ec77ba021840531hding            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
514f31d5416a60f83e184b0906a7ec77ba021840531hding            DEBUG_FAILURE;
515f31d5416a60f83e184b0906a7ec77ba021840531hding
516f31d5416a60f83e184b0906a7ec77ba021840531hding            psb_buffer_unmap(obj_buffer->psb_buffer);
517f31d5416a60f83e184b0906a7ec77ba021840531hding            obj_buffer->buffer_data = NULL;
518f31d5416a60f83e184b0906a7ec77ba021840531hding
519f31d5416a60f83e184b0906a7ec77ba021840531hding            return vaStatus;
520f31d5416a60f83e184b0906a7ec77ba021840531hding        }
521f31d5416a60f83e184b0906a7ec77ba021840531hding
522f31d5416a60f83e184b0906a7ec77ba021840531hding        switch (obj_config->profile) {
523f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileMPEG4Simple:
524f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileMPEG4AdvancedSimple:
525f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileMPEG4Main:
526f31d5416a60f83e184b0906a7ec77ba021840531hding
527f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH264Baseline:
528f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH264Main:
529f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH264High:
530f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH264StereoHigh:
531f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH264ConstrainedBaseline:
532f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileH263Baseline:
533f31d5416a60f83e184b0906a7ec77ba021840531hding            /* 1st segment */
534f31d5416a60f83e184b0906a7ec77ba021840531hding            p->size = *((unsigned long *) raw_codedbuf);
535f31d5416a60f83e184b0906a7ec77ba021840531hding            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */
536f31d5416a60f83e184b0906a7ec77ba021840531hding            p->next = NULL;
537430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_
538430ce5c32361119ed81a62c918be6afbdd053eddhding            psb__trace_coded((unsigned int*)raw_codedbuf);
539430ce5c32361119ed81a62c918be6afbdd053eddhding#endif
540f31d5416a60f83e184b0906a7ec77ba021840531hding            break;
541f31d5416a60f83e184b0906a7ec77ba021840531hding
542f31d5416a60f83e184b0906a7ec77ba021840531hding        case VAProfileJPEGBaseline:
543f31d5416a60f83e184b0906a7ec77ba021840531hding            /* 3~6 segment */
544430ce5c32361119ed81a62c918be6afbdd053eddhding            tng_jpeg_AppendMarkers(obj_context, raw_codedbuf);
545f31d5416a60f83e184b0906a7ec77ba021840531hding            next_buf_off = 0;
546f31d5416a60f83e184b0906a7ec77ba021840531hding            /*Max resolution 4096x4096 use 6 segments*/
547f31d5416a60f83e184b0906a7ec77ba021840531hding            for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) {
548f31d5416a60f83e184b0906a7ec77ba021840531hding                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);  /* ui32BytesUsed in HEADER_BUFFER*/
549f31d5416a60f83e184b0906a7ec77ba021840531hding                p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs (HEADER_BUFFER) */
550f31d5416a60f83e184b0906a7ec77ba021840531hding                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);  /* ui32Reserved3 in HEADER_BUFFER*/
551f31d5416a60f83e184b0906a7ec77ba021840531hding
552f31d5416a60f83e184b0906a7ec77ba021840531hding                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
553f31d5416a60f83e184b0906a7ec77ba021840531hding                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
554f31d5416a60f83e184b0906a7ec77ba021840531hding
555f31d5416a60f83e184b0906a7ec77ba021840531hding                if (next_buf_off == 0) {
556f31d5416a60f83e184b0906a7ec77ba021840531hding                    p->next = NULL;
557f31d5416a60f83e184b0906a7ec77ba021840531hding                    break;
558f31d5416a60f83e184b0906a7ec77ba021840531hding                } else
559f31d5416a60f83e184b0906a7ec77ba021840531hding                    p->next = &p[1];
560f31d5416a60f83e184b0906a7ec77ba021840531hding                p++;
561f31d5416a60f83e184b0906a7ec77ba021840531hding            }
562f31d5416a60f83e184b0906a7ec77ba021840531hding            break;
563f31d5416a60f83e184b0906a7ec77ba021840531hding
564f31d5416a60f83e184b0906a7ec77ba021840531hding        default:
565f31d5416a60f83e184b0906a7ec77ba021840531hding            drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
566f31d5416a60f83e184b0906a7ec77ba021840531hding
567f31d5416a60f83e184b0906a7ec77ba021840531hding            psb_buffer_unmap(obj_buffer->psb_buffer);
568f31d5416a60f83e184b0906a7ec77ba021840531hding            obj_buffer->buffer_data = NULL;
569f31d5416a60f83e184b0906a7ec77ba021840531hding            break;
570f31d5416a60f83e184b0906a7ec77ba021840531hding        }
571f31d5416a60f83e184b0906a7ec77ba021840531hding    }
572f31d5416a60f83e184b0906a7ec77ba021840531hding#endif
57367612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD
57467612a448651896b2557796ff98d46c5e0dbbdc6hding    if (IS_MFLD(driver_data)){ /* MFLD */
575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_config_p obj_config = CONFIG(obj_context->config_id);
576437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_config) {
578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
585437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
586dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
587dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAProfileJPEGBaseline != obj_config->profile
588bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang            && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Set frame skip flag*/
590dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_frame_skip_flag(obj_context);
591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
592437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_config->profile) {
593437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Simple:
594437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4AdvancedSimple:
595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Main:
596dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
598e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
599c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
600dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
6012befccec034c13d34746a9e87149889d59ac767bFei Jiang
602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Baseline:
603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Main:
604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264High:
605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProfileH264ConstrainedBaseline:
606fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i = 0;
607fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (pnw_get_parallel_core_number(obj_context) == 2) {
608fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            /*The second part of coded buffer which generated by core 2 is the
609fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang             * first part of encoded clip, while the first part of coded buffer
610fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang             * is the second part of encoded clip.*/
611fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context));
612fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].next = &p[i + 1];
613fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
614fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */
615fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang
616fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
617fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
618f31d5416a60f83e184b0906a7ec77ba021840531hding                p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
619c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
620fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                    i);
621fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
622c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x,  size: %d\n",
623fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                next_buf_off, p[i].size);
624fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            i++;
625fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
626437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* 1st segment */
627fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].size = *((unsigned long *) raw_codedbuf);
628fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
629fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 &&
630fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) {
631f31d5416a60f83e184b0906a7ec77ba021840531hding            p[i].status =  VA_CODED_BUF_STATUS_SINGLE_NALU;
632c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n",
633fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                i);
634fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang            }
635c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size);
636437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
637437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
6382befccec034c13d34746a9e87149889d59ac767bFei Jiang
639437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH263Baseline:
640fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang                /* one segment */
641dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
642e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang            p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
643c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size);
644dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
6452befccec034c13d34746a9e87149889d59ac767bFei Jiang
646437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileJPEGBaseline:
647dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* 3~6 segment
648dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 */
649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf);
650dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            next_buf_off = 0;
651dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Max resolution 4096x4096 use 6 segments*/
652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) {
653dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
654e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang                p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs */
655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);
656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
657c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size);
658c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang                drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (next_buf_off == 0) {
661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = NULL;
662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    break;
663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else
664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = &p[1];
665dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p++;
666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
669437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
670c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang            drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n");
671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
672437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
673437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
674437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
675437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
676437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
67767612a448651896b2557796ff98d46c5e0dbbdc6hding#endif
678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
679437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
680437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
6812f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_sync(psb_buffer_p buf)
6832f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
684dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int ret;
6852f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf);
687dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf->driver_data);
6882f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
691c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang        drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n");
692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
693dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
6942f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return VA_STATUS_SUCCESS;
6962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
697