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