psb_buffer.c revision dc1209519284865899ca8d990b3a2c7dbca8ae08
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
22befccec034c13d34746a9e87149889d59ac767bFei Jiang * INTEL CONFIDENTIAL
32befccec034c13d34746a9e87149889d59ac767bFei Jiang * Copyright 2007 Intel Corporation. All Rights Reserved.
47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
52befccec034c13d34746a9e87149889d59ac767bFei Jiang * The source code contained or described herein and all documents related to
62befccec034c13d34746a9e87149889d59ac767bFei Jiang * the source code ("Material") are owned by Intel Corporation or its suppliers
72befccec034c13d34746a9e87149889d59ac767bFei Jiang * or licensors. Title to the Material remains with Intel Corporation or its
82befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors. The Material may contain trade secrets and
92befccec034c13d34746a9e87149889d59ac767bFei Jiang * proprietary and confidential information of Intel Corporation and its
102befccec034c13d34746a9e87149889d59ac767bFei Jiang * suppliers and licensors, and is protected by worldwide copyright and trade
112befccec034c13d34746a9e87149889d59ac767bFei Jiang * secret laws and treaty provisions. No part of the Material may be used,
122befccec034c13d34746a9e87149889d59ac767bFei Jiang * copied, reproduced, modified, published, uploaded, posted, transmitted,
132befccec034c13d34746a9e87149889d59ac767bFei Jiang * distributed, or disclosed in any way without Intel's prior express written
14dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * permission.
15dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun *
162befccec034c13d34746a9e87149889d59ac767bFei Jiang * No license under any patent, copyright, trade secret or other intellectual
172befccec034c13d34746a9e87149889d59ac767bFei Jiang * property right is granted to or conferred upon you by disclosure or delivery
182befccec034c13d34746a9e87149889d59ac767bFei Jiang * of the Materials, either expressly, by implication, inducement, estoppel or
192befccec034c13d34746a9e87149889d59ac767bFei Jiang * otherwise. Any license under such intellectual property rights must be
202befccec034c13d34746a9e87149889d59ac767bFei Jiang * express and approved by Intel in writing.
217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h"
247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h>
267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h>
277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h>
287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h>
297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drm.h"
317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h"
327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
332befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h>
342befccec034c13d34746a9e87149889d59ac767bFei Jiang
352befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h"
364b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h"
372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h"
382f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer
417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
42dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data,
43dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           unsigned int size,
44dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_type_t type,
45dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                           psb_buffer_p buf
46dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                          )
477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int allignment;
507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    uint32_t placement;
517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* reset rar_handle to NULL */
547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->rar_handle = 0;
557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->buffer_ofs = 0;
56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->type = type;
582befccec034c13d34746a9e87149889d59ac767bFei Jiang    buf->driver_data = driver_data; /* only for RAR buffers */
597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* TODO: Mask values are a guess */
61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    switch (type) {
62dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu:
63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_vpu_shared:
67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
68dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
69dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_surface:
71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 0;
72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        /* Xvideo will share surface buffer, set SHARED flag
73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun         */
74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (getenv("PSB_VIDEO_SURFACE_MMU")) {
75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Allocate surface from MMU heap\n");
76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED;
77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        } else {
78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("Allocate surface from TT heap\n");
79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED;
80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_vpu_only:
83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_MMU;
85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_cpu_only:
88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED;
90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_camera:
92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_CI | WSBM_PL_FLAG_SHARED;
94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    case psb_bt_rar:
96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        allignment = 1;
97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        placement = DRM_PSB_FLAG_MEM_RAR | WSBM_PL_FLAG_SHARED;
98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        break;
99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    default:
100dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_UNKNOWN;
101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        DEBUG_FAILURE;
102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return vaStatus;
1037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR
1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR
1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    placement |= WSBM_PL_FLAG_SHARED;
1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    allignment = 4096; /* temporily more safe */
121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    //psb__error_message("FIXME: should use geetpagesize() ?\n");
1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf,
1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang                         allignment, placement);
1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to gen wsbm buffers\n");
127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* here use the placement when gen buffer setted */
1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0);
133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to alloc wsbm buffers\n");
1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1392befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (placement & WSBM_PL_FLAG_TT)
140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__information_message("Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n",
141dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 size, wsbmBOOffsetHint(buf->drm_buf));
1422befccec034c13d34746a9e87149889d59ac767bFei Jiang
1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->pl_flags = placement;
1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->status = psb_bs_ready;
1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
1487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus
1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
156dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement)
1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
159dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement);
1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret == 0)
1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->pl_flags = set_placement;
166dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return ret;
1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
171dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data,
172dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p buf,
173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                              psb_buffer_p reference_buf
174dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                             )
1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret = 0;
1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    memcpy(buf, reference_buf, sizeof(*buf));
1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->drm_buf = NULL;
181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = LOCK_HARDWARE(driver_data);
183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        UNLOCK_HARDWARE(driver_data);
1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        DEBUG_FAILURE_RET;
1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return vaStatus;
1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
189dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmGenBuffers(driver_data->main_pool,
191dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         1,
192dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         &buf->drm_buf,
193dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         4096,  /* page alignment */
194dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                         0);
1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (!buf->drm_buf) {
1967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to gen wsbm buffers\n");
197dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        UNLOCK_HARDWARE(driver_data);
1987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
1997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
200dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf)));
202dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    UNLOCK_HARDWARE(driver_data);
2037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to alloc wsbm buffers\n");
2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return VA_STATUS_ERROR_ALLOCATION_FAILED;
2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return VA_STATUS_SUCCESS;
2097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer
214dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */
215dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf)
2167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->drm_buf == NULL)
219dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return;
220dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (psb_bs_unfinished != buf->status) {
2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        ASSERT(buf->driver_data);
222dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        wsbmBOUnreference(&buf->drm_buf);
2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        if (buf->rar_handle)
2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang            psb_buffer_destroy_rar(buf->driver_data, buf);
2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->driver_data = NULL;
2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        buf->status = psb_bs_unfinished;
2277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer
2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
235dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_map(psb_buffer_p buf, void **address /* out */)
2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    int ret;
2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    /* multiple mapping not allowed */
2437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag) {
2447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("Multiple mapping request detected, unmap previous mapping\n");
2457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__information_message("Need to fix application to unmap at first, then request second mapping request\n");
2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
247dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb_buffer_unmap(buf);
2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    /* don't think TG deal with READ/WRITE differently */
2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE;
2527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE
2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    wsbmBOWaitIdle(buf->drm_buf, 0);
2547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else
2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (ret) {
2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("faild to sync bo for cpu\n");
2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return ret;
2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
2607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif
2612befccec034c13d34746a9e87149889d59ac767bFei Jiang
2622befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (buf->type == psb_bt_user_buffer)
2632befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = buf->user_ptr;
2642befccec034c13d34746a9e87149889d59ac767bFei Jiang    else
2652befccec034c13d34746a9e87149889d59ac767bFei Jiang        *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag);
266dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (*address == NULL) {
2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        psb__error_message("failed to map buffer\n");
2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        return -1;
2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    }
271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/*
2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer
2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang *
2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success
2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */
281dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf)
2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{
2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf);
2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    ASSERT(buf->driver_data);
2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    if (buf->wsbm_synccpu_flag)
2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang        (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    buf->wsbm_synccpu_flag = 0;
2902befccec034c13d34746a9e87149889d59ac767bFei Jiang
2912befccec034c13d34746a9e87149889d59ac767bFei Jiang    if (buf->type != psb_bt_user_buffer)
2922befccec034c13d34746a9e87149889d59ac767bFei Jiang        wsbmBOUnmap(buf->drm_buf);
293dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang    return 0;
2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang}
2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang
298437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/*
299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer
300437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *
301437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success
302437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */
303437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id)  ((object_config_p) object_heap_lookup( &driver_data->config_heap, id ))
304437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA    psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData;
305437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle(
306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    VADriverContextP ctx,
307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    object_buffer_p obj_buffer,
308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    void **pbuf /* out */
309437b3eda28a4bf098efa80598cab67f190275266Fei Jiang)
310437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{
311437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    object_context_p obj_context = obj_buffer->context;
312437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    INIT_DRIVER_DATA;
313437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0];
3142befccec034c13d34746a9e87149889d59ac767bFei Jiang    void *raw_codedbuf;
315437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    VAStatus vaStatus = VA_STATUS_SUCCESS;
316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    unsigned int next_buf_off;
3172befccec034c13d34746a9e87149889d59ac767bFei Jiang    int i;
318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == pbuf) {
320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER;
3212befccec034c13d34746a9e87149889d59ac767bFei Jiang        return vaStatus;
3222befccec034c13d34746a9e87149889d59ac767bFei Jiang    }
3232befccec034c13d34746a9e87149889d59ac767bFei Jiang
324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (NULL == obj_context) {
325437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
326437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        DEBUG_FAILURE;
327437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
328437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        psb_buffer_unmap(obj_buffer->psb_buffer);
329437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        obj_buffer->buffer_data = NULL;
330437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
331437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        return vaStatus;
332437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
333437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
3342befccec034c13d34746a9e87149889d59ac767bFei Jiang    raw_codedbuf = *pbuf;
335437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    /* reset the mapinfo */
336437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo));
337437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
338437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    *pbuf = p = &obj_buffer->codedbuf_mapinfo[0];
339437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    if (IS_MRST(driver_data)) {
340437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        /* one segment */
341437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        p->size = *((unsigned long *) raw_codedbuf); /* 1st DW is the size */
342dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->status = *((unsigned long *) raw_codedbuf + 1); /* 2nd DW
3432f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang							* is rc status */
344dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        p->reserved = 0;
345437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        p->buf = (void *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
346dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        lnc_H264_append_aux_info(obj_context,
347dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 obj_buffer,
348dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 (unsigned char *)p->buf,
349dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                 &(p->size));
350437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    } else { /* MFLD */
351437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        object_config_p obj_config = CONFIG(obj_context->config_id);
352437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
353437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        if (NULL == obj_config) {
354437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED;
355437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            DEBUG_FAILURE;
356437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
357437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
358437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
359dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
360437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            return vaStatus;
361437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
362dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
363dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        if (VAProfileJPEGBaseline != obj_config->profile
364dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) {
365dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Set frame skip flag*/
366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_set_frame_skip_flag(obj_context);
367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        }
368437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        switch (obj_config->profile) {
369437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Simple:
370437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4AdvancedSimple:
371437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileMPEG4Main:
372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->buf = (void *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("coded buffer size %d\n", p->size);
376dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
3772befccec034c13d34746a9e87149889d59ac767bFei Jiang
378437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Baseline:
379437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264Main:
380437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH264High:
381dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        case VAProfileH264ConstrainedBaseline:
382437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            /* 1st segment */
383437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            p->size = *((unsigned long *) raw_codedbuf);
384437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            p->buf = (void *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
385437b3eda28a4bf098efa80598cab67f190275266Fei Jiang
386dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("1st segment coded buffer size %d\n", p->size);
387dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            if (pnw_get_parallel_core_number(obj_context) == 2) {
388dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                /*The second part of coded buffer which generated by core 2 is the
389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 * first part of encoded clip, while the first part of coded buffer
390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 * is the second part of encoded clip.*/
391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context));
392dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->next = &p[1];
393dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p[1].size = p->size;
394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p[1].buf = p->buf;
395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p[1].next = NULL;
396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
397dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->buf = (void *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */
398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__information_message("2nd segment coded buffer offset: 0x%08x,  size: %d\n",
399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                                         next_buf_off, p->size);
400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            } else
401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->next = NULL;
402437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
4032befccec034c13d34746a9e87149889d59ac767bFei Jiang
404437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileH263Baseline:
405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* one segment */
406dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->size = *((unsigned long *) raw_codedbuf);
407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            p->buf = (void *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */
408dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            psb__information_message("coded buffer size %d\n", p->size);
409dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
4102befccec034c13d34746a9e87149889d59ac767bFei Jiang
411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        case VAProfileJPEGBaseline:
412dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /* 3~6 segment
413dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                 */
414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf);
415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            next_buf_off = 0;
416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            /*Max resolution 4096x4096 use 6 segments*/
417dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) {
418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off);
419dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p->buf = (void *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4);  /* skip 4DWs */
420dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3);
421dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
422dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__information_message("JPEG coded buffer segment %d size: %d\n", i, p->size);
423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                psb__information_message("JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off);
424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                if (next_buf_off == 0) {
426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = NULL;
427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    break;
428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                } else
429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                    p->next = &p[1];
430dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun                p++;
431dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            }
432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun            break;
433dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        default:
435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb__error_message("unexpected case\n");
436dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            psb_buffer_unmap(obj_buffer->psb_buffer);
438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            obj_buffer->buffer_data = NULL;
439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang            break;
440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang        }
441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    }
442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun
443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang    return 0;
444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang}
4452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
446dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_sync(psb_buffer_p buf)
4472f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{
448dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    int ret;
4492f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf);
451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ASSERT(buf->driver_data);
4522f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag);
454dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    if (ret) {
455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        psb__error_message("faild to sync bo for cpu\n");
456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun        return VA_STATUS_ERROR_UNKNOWN;
457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    }
4582f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang
459dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun    return VA_STATUS_SUCCESS;
4602f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang}
461