psb_buffer.c revision 67612a448651896b2557796ff98d46c5e0dbbdc6
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 307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h" 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_drm.h" 387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 402befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h> 412befccec034c13d34746a9e87149889d59ac767bFei Jiang 422befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h" 434b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h" 442f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h" 452f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer 487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 49dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data, 50dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int size, 51dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_type_t type, 52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf 53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int allignment; 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t placement; 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset rar_handle to NULL */ 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->rar_handle = 0; 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->buffer_ofs = 0; 63dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->type = type; 652befccec034c13d34746a9e87149889d59ac767bFei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 66fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->size = size; 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO: Mask values are a guess */ 68dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (type) { 69dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu: 70dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu_shared: 74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_surface: 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 0; 79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Xvideo will share surface buffer, set SHARED flag 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (getenv("PSB_VIDEO_SURFACE_MMU")) { 82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Allocate surface from MMU heap\n"); 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Allocate surface from TT heap\n"); 86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED; 87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_vpu_only: 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 94dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_only: 95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED; 97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 98dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_camera: 99dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 1003982f61b009483a53bdbc0391dc71934021fc8abKun Wang placement = TTM_PL_FLAG_CI | WSBM_PL_FLAG_SHARED; 101dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 102dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_rar: 103dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 1043982f61b009483a53bdbc0391dc71934021fc8abKun Wang placement = TTM_PL_FLAG_RAR | WSBM_PL_FLAG_SHARED; 105dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 106dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 107dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return vaStatus; 1107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 1137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 1147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 1167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR 1207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR 1247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang allignment = 4096; /* temporily more safe */ 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang //psb__error_message("FIXME: should use geetpagesize() ?\n"); 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang allignment, placement); 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("failed to gen wsbm buffers\n"); 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* here use the placement when gen buffer setted */ 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0); 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("failed to alloc wsbm buffers\n"); 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1462befccec034c13d34746a9e87149889d59ac767bFei Jiang if (placement & WSBM_PL_FLAG_TT) 147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n", 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size, wsbmBOOffsetHint(buf->drm_buf)); 1492befccec034c13d34746a9e87149889d59ac767bFei Jiang 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = placement; 1517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_ready; 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 153dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 157fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 158fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer 159fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 160fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, 161fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang unsigned int size, 162fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_type_t type, 163fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_p buf, 164fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang void * vaddr 165fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ) 166fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 167fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 168fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int allignment; 169fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang uint32_t placement; 170fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int ret; 171fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 172fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* reset rar_handle to NULL */ 173fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->rar_handle = 0; 174fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->buffer_ofs = 0; 175fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 176fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->type = type; 177fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 178fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->user_ptr = vaddr; 179fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 180fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* Xvideo will share surface buffer, set SHARED flag 181fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 182fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED ; 183fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 184fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = LOCK_HARDWARE(driver_data); 185fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 186fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang DEBUG_FAILURE_RET; 189fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return vaStatus; 190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment = 4096; /* temporily more safe */ 193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 194fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang //psb__error_message("FIXME: should use geetpagesize() ?\n"); 195fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment, placement); 197fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (!buf->drm_buf) { 198fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__error_message("failed to gen wsbm buffers\n"); 199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* here use the placement when gen buffer setted */ 204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("Create BO from user buffer %p, size=%d\n", vaddr, size); 205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr); 207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__error_message("Failed to alloc wsbm buffers\n"); 209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return 1; 210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n", 213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaddr, size, wsbmBOOffsetHint(buf->drm_buf)); 214fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 215fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->pl_flags = placement; 216fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->status = psb_bs_ready; 217fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->wsbm_synccpu_flag = 0; 218fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 219fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_SUCCESS; 220fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 2217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus 2247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 227dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement) 2287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 230dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 2327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 2337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement); 2357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == 0) 2367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = set_placement; 237dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 242dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data, 243dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf, 244dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p reference_buf 245dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 2467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 2487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 249dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(buf, reference_buf, sizeof(*buf)); 2517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->drm_buf = NULL; 252dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 254dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 2557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 2567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 2577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 2587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 2597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 260dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 261dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmGenBuffers(driver_data->main_pool, 262dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1, 263dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &buf->drm_buf, 264dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4096, /* page alignment */ 265dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0); 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("failed to gen wsbm buffers\n"); 268dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 271dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf))); 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("failed to alloc wsbm buffers\n"); 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 28209998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data, 2833f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang psb_buffer_p buf, 2843f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang int kbuf_handle 2853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ) 28609998e330bbcbf835798128768e590772f5a5737Shuduo Sang{ 28709998e330bbcbf835798128768e590772f5a5737Shuduo Sang int ret = 0; 28809998e330bbcbf835798128768e590772f5a5737Shuduo Sang VAStatus vaStatus = VA_STATUS_SUCCESS; 28909998e330bbcbf835798128768e590772f5a5737Shuduo Sang 29009998e330bbcbf835798128768e590772f5a5737Shuduo Sang buf->drm_buf = NULL; 29109998e330bbcbf835798128768e590772f5a5737Shuduo Sang 29209998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = LOCK_HARDWARE(driver_data); 29309998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 29409998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 29509998e330bbcbf835798128768e590772f5a5737Shuduo Sang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 29609998e330bbcbf835798128768e590772f5a5737Shuduo Sang DEBUG_FAILURE_RET; 29709998e330bbcbf835798128768e590772f5a5737Shuduo Sang return vaStatus; 29809998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 30009998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = wsbmGenBuffers(driver_data->main_pool, 30109998e330bbcbf835798128768e590772f5a5737Shuduo Sang 1, 30209998e330bbcbf835798128768e590772f5a5737Shuduo Sang &buf->drm_buf, 30309998e330bbcbf835798128768e590772f5a5737Shuduo Sang 4096, /* page alignment */ 30409998e330bbcbf835798128768e590772f5a5737Shuduo Sang 0); 30509998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (!buf->drm_buf) { 30609998e330bbcbf835798128768e590772f5a5737Shuduo Sang psb__error_message("failed to gen wsbm buffers\n"); 30709998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 30809998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 30909998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 31009998e330bbcbf835798128768e590772f5a5737Shuduo Sang 3113f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle); 31209998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 31309998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 31409998e330bbcbf835798128768e590772f5a5737Shuduo Sang psb__error_message("failed to alloc wsbm buffers\n"); 31509998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 31609998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 317c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf); 3183f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 31909998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_SUCCESS; 32009998e330bbcbf835798128768e590772f5a5737Shuduo Sang} 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 323dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 324dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf) 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->drm_buf == NULL) 328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_bs_unfinished != buf->status) { 3307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 331dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmBOUnreference(&buf->drm_buf); 3327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->rar_handle) 3332d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang buf->rar_handle = 0; 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->driver_data = NULL; 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_unfinished; 3367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 344e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */) 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 3477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 3507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 351dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* multiple mapping not allowed */ 3527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) { 3537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("Multiple mapping request detected, unmap previous mapping\n"); 3547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__information_message("Need to fix application to unmap at first, then request second mapping request\n"); 3557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 356dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(buf); 3577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 358dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* don't think TG deal with READ/WRITE differently */ 3607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE; 3617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef DEBUG_TRACE 3627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang wsbmBOWaitIdle(buf->drm_buf, 0); 3637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#else 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 3667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("faild to sync bo for cpu\n"); 3677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 3702befccec034c13d34746a9e87149889d59ac767bFei Jiang 371fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type == psb_bt_user_buffer) || buf->handle) 3722befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = buf->user_ptr; 3732befccec034c13d34746a9e87149889d59ac767bFei Jiang else 3742befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag); 375dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*address == NULL) { 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang psb__error_message("failed to map buffer\n"); 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 389dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf) 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 3982befccec034c13d34746a9e87149889d59ac767bFei Jiang 399fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type != psb_bt_user_buffer) && !buf->handle) 4002befccec034c13d34746a9e87149889d59ac767bFei Jiang wsbmBOUnmap(buf->drm_buf); 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 406437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer 408437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 409437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 410437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 411437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 412437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 413437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle( 414dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 415dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_buffer_p obj_buffer, 416dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun void **pbuf /* out */ 417437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 418437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 419437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context = obj_buffer->context; 420437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 421437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0]; 422e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *raw_codedbuf; 423437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int next_buf_off; 4252befccec034c13d34746a9e87149889d59ac767bFei Jiang int i; 426dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 427dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == pbuf) { 428dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 4292befccec034c13d34746a9e87149889d59ac767bFei Jiang return vaStatus; 4302befccec034c13d34746a9e87149889d59ac767bFei Jiang } 4312befccec034c13d34746a9e87149889d59ac767bFei Jiang 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_context) { 433437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 434437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 435437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 436437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 437437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 438437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 439437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 440437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 441437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 4422befccec034c13d34746a9e87149889d59ac767bFei Jiang raw_codedbuf = *pbuf; 443437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* reset the mapinfo */ 444437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo)); 445437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 446437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *pbuf = p = &obj_buffer->codedbuf_mapinfo[0]; 44767612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MRST 448437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (IS_MRST(driver_data)) { 449437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* one segment */ 450437b3eda28a4bf098efa80598cab67f190275266Fei Jiang p->size = *((unsigned long *) raw_codedbuf); /* 1st DW is the size */ 451dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->status = *((unsigned long *) raw_codedbuf + 1); /* 2nd DW 452bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * is rc status */ 453dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->reserved = 0; 454e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 455dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264_append_aux_info(obj_context, 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_buffer, 457dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (unsigned char *)p->buf, 458dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(p->size)); 45967612a448651896b2557796ff98d46c5e0dbbdc6hding } 46067612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 46167612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD 46267612a448651896b2557796ff98d46c5e0dbbdc6hding if (IS_MFLD(driver_data)){ /* MFLD */ 463437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_config_p obj_config = CONFIG(obj_context->config_id); 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (NULL == obj_config) { 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 474dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 475dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAProfileJPEGBaseline != obj_config->profile 476bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Set frame skip flag*/ 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_frame_skip_flag(obj_context); 479dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (obj_config->profile) { 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Simple: 482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4AdvancedSimple: 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Main: 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* one segment */ 485dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 486e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 487dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("coded buffer size %d\n", p->size); 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 4892befccec034c13d34746a9e87149889d59ac767bFei Jiang 490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Baseline: 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Main: 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264High: 493dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264ConstrainedBaseline: 494fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i = 0; 495fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (pnw_get_parallel_core_number(obj_context) == 2) { 496fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /*The second part of coded buffer which generated by core 2 is the 497fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * first part of encoded clip, while the first part of coded buffer 498fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * is the second part of encoded clip.*/ 499fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context)); 500fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].next = &p[i + 1]; 501fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 502fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */ 503fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 504fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 505fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 506fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].status = VA_CODED_BUF_STATUS_AVC_SINGLE_NALU; 507fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("Only VCL NAL in this segment %i of coded buffer\n", 508fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i); 509fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 510fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("2nd segment coded buffer offset: 0x%08x, size: %d\n", 511fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off, p[i].size); 512fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i++; 513fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 514437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 1st segment */ 515fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *((unsigned long *) raw_codedbuf); 516fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 517fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 518fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 519fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].status = VA_CODED_BUF_STATUS_AVC_SINGLE_NALU; 520fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("Only VCL NAL in this segment %i of coded buffer\n", 521fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i); 522fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 523fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb__information_message("1st segment coded buffer size %d\n", p[i].size); 524437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 525437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 5262befccec034c13d34746a9e87149889d59ac767bFei Jiang 527437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH263Baseline: 528fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* one segment */ 529dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 530e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 531dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("coded buffer size %d\n", p->size); 532dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 5332befccec034c13d34746a9e87149889d59ac767bFei Jiang 534437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileJPEGBaseline: 535dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 3~6 segment 536dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 537dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf); 538dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = 0; 539dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Max resolution 4096x4096 use 6 segments*/ 540dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) { 541dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 542e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs */ 543dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); 544dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 545dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("JPEG coded buffer segment %d size: %d\n", i, p->size); 546dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__information_message("JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 547dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 548dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (next_buf_off == 0) { 549dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = NULL; 550dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 551dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 552dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = &p[1]; 553dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p++; 554dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 555dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 556dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 557437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 558437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb__error_message("unexpected case\n"); 559dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 560437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 561437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 562437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 563437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 564437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 56567612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 566dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 567437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 568437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 5692f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 570dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_sync(psb_buffer_p buf) 5712f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int ret; 5732f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 574dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(buf); 575dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(buf->driver_data); 5762f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 577dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 578dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb__error_message("faild to sync bo for cpu\n"); 580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 5822f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 583dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_SUCCESS; 5842f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 585