psb_buffer.c revision 5ed159b49cff6b05d923bcf00d09c67ee2ce1f80
17e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Copyright (c) 2011 Intel Corporation. All Rights Reserved. 33f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * Copyright (c) Imagination Technologies Limited, UK 47e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 5f91c8768670386683a281cc39141e21bdda9c97fKun Wang * Permission is hereby granted, free of charge, to any person obtaining a 6f91c8768670386683a281cc39141e21bdda9c97fKun Wang * copy of this software and associated documentation files (the 7f91c8768670386683a281cc39141e21bdda9c97fKun Wang * "Software"), to deal in the Software without restriction, including 8f91c8768670386683a281cc39141e21bdda9c97fKun Wang * without limitation the rights to use, copy, modify, merge, publish, 9f91c8768670386683a281cc39141e21bdda9c97fKun Wang * distribute, sub license, and/or sell copies of the Software, and to 10f91c8768670386683a281cc39141e21bdda9c97fKun Wang * permit persons to whom the Software is furnished to do so, subject to 11f91c8768670386683a281cc39141e21bdda9c97fKun Wang * the following conditions: 123f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 13f91c8768670386683a281cc39141e21bdda9c97fKun Wang * The above copyright notice and this permission notice (including the 14f91c8768670386683a281cc39141e21bdda9c97fKun Wang * next paragraph) shall be included in all copies or substantial portions 15f91c8768670386683a281cc39141e21bdda9c97fKun Wang * of the Software. 163f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang * 17f91c8768670386683a281cc39141e21bdda9c97fKun Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f91c8768670386683a281cc39141e21bdda9c97fKun Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19f91c8768670386683a281cc39141e21bdda9c97fKun Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20f91c8768670386683a281cc39141e21bdda9c97fKun Wang * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 21f91c8768670386683a281cc39141e21bdda9c97fKun Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22f91c8768670386683a281cc39141e21bdda9c97fKun Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23f91c8768670386683a281cc39141e21bdda9c97fKun Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * 25bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Authors: 26bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * Waldo Bastian <waldo.bastian@intel.com> 27bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * 28bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang */ 29bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang 30f31d5416a60f83e184b0906a7ec77ba021840531hding#include <sys/types.h> 317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_buffer.h" 327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <errno.h> 347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <stdlib.h> 357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <unistd.h> 367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include <wsbm/wsbm_manager.h> 377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 38d03b75a0bb7d76d8d05509f5b581ab3b5d36a20dXiaolin Zhang#include <linux/psb_drm.h> 397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 40c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 422befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h> 432befccec034c13d34746a9e87149889d59ac767bFei Jiang 442befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h" 454b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h" 462f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h" 47430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h" 482f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer 517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 52dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data, 53dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int size, 54dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_type_t type, 55dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf 56dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int allignment; 607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t placement; 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset rar_handle to NULL */ 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->rar_handle = 0; 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->buffer_ofs = 0; 66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->type = type; 682befccec034c13d34746a9e87149889d59ac767bFei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 69fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->size = size; 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO: Mask values are a guess */ 71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (type) { 72dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu: 73dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 74dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 75dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu_shared: 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_surface: 81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 0; 82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* Xvideo will share surface buffer, set SHARED flag 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 845e4b33b23680bc064b25d38086a13380d37bb8a4hding int is_thumbnail = 0; 855e4b33b23680bc064b25d38086a13380d37bb8a4hding char *str; 86f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef ANDROID 875e4b33b23680bc064b25d38086a13380d37bb8a4hding if((str = getenv("PSB_VIDEO_THUMBNAIL"))) 885e4b33b23680bc064b25d38086a13380d37bb8a4hding is_thumbnail = (gettid() == atoi(str)); 89f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 905e4b33b23680bc064b25d38086a13380d37bb8a4hding if (getenv("PSB_VIDEO_SURFACE_MMU") || is_thumbnail) { 91c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate surface from MMU heap\n"); 92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else { 94c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate surface from TT heap\n"); 95dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED; 96dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 97dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 98f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 99f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_surface_tiling: 100f31d5416a60f83e184b0906a7ec77ba021840531hding psb__information_message("Allocate tiled surface from TT heap\n"); 101f31d5416a60f83e184b0906a7ec77ba021840531hding placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED; 102f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 103f31d5416a60f83e184b0906a7ec77ba021840531hding break; 104f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_mmu_tiling: 105f31d5416a60f83e184b0906a7ec77ba021840531hding placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED; 106f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 107f31d5416a60f83e184b0906a7ec77ba021840531hding break; 108f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_vpu_only: 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_only: 115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 116dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED; 117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_camera: 119dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 1203982f61b009483a53bdbc0391dc71934021fc8abKun Wang placement = TTM_PL_FLAG_CI | WSBM_PL_FLAG_SHARED; 121dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 122dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_rar: 123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 1243982f61b009483a53bdbc0391dc71934021fc8abKun Wang placement = TTM_PL_FLAG_RAR | WSBM_PL_FLAG_SHARED; 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return vaStatus; 1307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 1347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 143f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID 144f31d5416a60f83e184b0906a7ec77ba021840531hding if(!(placement & WSBM_PL_FLAG_SYSTEM)) { 145f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement); 146f31d5416a60f83e184b0906a7ec77ba021840531hding placement &= ~WSBM_PL_MASK_MEM; 147f31d5416a60f83e184b0906a7ec77ba021840531hding placement |= TTM_PL_FLAG_VRAM; 148f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement); 149f31d5416a60f83e184b0906a7ec77ba021840531hding } 150f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 151f31d5416a60f83e184b0906a7ec77ba021840531hding 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 156f31d5416a60f83e184b0906a7ec77ba021840531hding if(allignment < 4096) 157f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 4096; /* temporily more safe */ 158dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 159f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang allignment, placement); 1627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 163c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 164dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* here use the placement when gen buffer setted */ 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0); 170dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 172c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1762befccec034c13d34746a9e87149889d59ac767bFei Jiang if (placement & WSBM_PL_FLAG_TT) 177c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n", 178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size, wsbmBOOffsetHint(buf->drm_buf)); 1792befccec034c13d34746a9e87149889d59ac767bFei Jiang 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = placement; 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_ready; 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 183dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 187fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 188fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer 189fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, 191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang unsigned int size, 192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_type_t type, 193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_p buf, 1945ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding void * vaddr, 1955ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding unsigned int flags 196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ) 197fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 198fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int allignment; 200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang uint32_t placement; 201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int ret; 202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* reset rar_handle to NULL */ 204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->rar_handle = 0; 205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->buffer_ofs = 0; 206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->type = type; 208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->user_ptr = vaddr; 210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* Xvideo will share surface buffer, set SHARED flag 212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 2135ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED ; 2145ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding 2155ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding if (flags & PSB_USER_BUFFER_WC) 2165ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_WC; 2175ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding else if (flags & PSB_USER_BUFFER_UNCACHED) 2185ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_UNCACHED; 2195ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding else 2205ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_CACHED; 221fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 222fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = LOCK_HARDWARE(driver_data); 223fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 224fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 225fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 226fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang DEBUG_FAILURE_RET; 227fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return vaStatus; 228fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 229fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment = 4096; /* temporily more safe */ 231f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 232f31d5416a60f83e184b0906a7ec77ba021840531hding if (type == psb_bt_mmu_tiling) { 233f31d5416a60f83e184b0906a7ec77ba021840531hding placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED ; 234f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 235f31d5416a60f83e184b0906a7ec77ba021840531hding } 236f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 237f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 238fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 239fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment, placement); 240fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (!buf->drm_buf) { 241c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 243fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 244fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 245fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 246fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* here use the placement when gen buffer setted */ 247c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size); 248fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 249fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr); 250fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 251c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers\n"); 252fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return 1; 253fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 254fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 255c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n", 256fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaddr, size, wsbmBOOffsetHint(buf->drm_buf)); 257fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 258fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->pl_flags = placement; 259fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->status = psb_bs_ready; 260fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->wsbm_synccpu_flag = 0; 261fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 262fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_SUCCESS; 263fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 2647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 270dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement) 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 273dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement); 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == 0) 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = set_placement; 280dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 285dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data, 286dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf, 287dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p reference_buf 288dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(buf, reference_buf, sizeof(*buf)); 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->drm_buf = NULL; 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 297dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 303dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 304dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmGenBuffers(driver_data->main_pool, 305dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1, 306dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &buf->drm_buf, 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4096, /* page alignment */ 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0); 3097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 310c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf))); 316dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 318c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 32509998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data, 3263f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang psb_buffer_p buf, 3273f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang int kbuf_handle 3283f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ) 32909998e330bbcbf835798128768e590772f5a5737Shuduo Sang{ 33009998e330bbcbf835798128768e590772f5a5737Shuduo Sang int ret = 0; 33109998e330bbcbf835798128768e590772f5a5737Shuduo Sang VAStatus vaStatus = VA_STATUS_SUCCESS; 33209998e330bbcbf835798128768e590772f5a5737Shuduo Sang 33309998e330bbcbf835798128768e590772f5a5737Shuduo Sang buf->drm_buf = NULL; 33409998e330bbcbf835798128768e590772f5a5737Shuduo Sang 33509998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = LOCK_HARDWARE(driver_data); 33609998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 33709998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 33809998e330bbcbf835798128768e590772f5a5737Shuduo Sang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 33909998e330bbcbf835798128768e590772f5a5737Shuduo Sang DEBUG_FAILURE_RET; 34009998e330bbcbf835798128768e590772f5a5737Shuduo Sang return vaStatus; 34109998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 34309998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = wsbmGenBuffers(driver_data->main_pool, 34409998e330bbcbf835798128768e590772f5a5737Shuduo Sang 1, 34509998e330bbcbf835798128768e590772f5a5737Shuduo Sang &buf->drm_buf, 34609998e330bbcbf835798128768e590772f5a5737Shuduo Sang 4096, /* page alignment */ 34709998e330bbcbf835798128768e590772f5a5737Shuduo Sang 0); 34809998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (!buf->drm_buf) { 349c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 35009998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 35209998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 35309998e330bbcbf835798128768e590772f5a5737Shuduo Sang 3543f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle); 35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 35609998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 357c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 35809998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 35909998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 360c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf); 3613f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 36209998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_SUCCESS; 36309998e330bbcbf835798128768e590772f5a5737Shuduo Sang} 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 366dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 367dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf) 3687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->drm_buf == NULL) 371dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_bs_unfinished != buf->status) { 3737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 374dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmBOUnreference(&buf->drm_buf); 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->rar_handle) 3762d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang buf->rar_handle = 0; 3777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->driver_data = NULL; 3787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_unfinished; 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 387e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */) 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 394dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* multiple mapping not allowed */ 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) { 396c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n"); 397c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n"); 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 399dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(buf); 4007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 401dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* don't think TG deal with READ/WRITE differently */ 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE; 404c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 405c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang wsbmBOWaitIdle(buf->drm_buf, 0); 406c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } else { 407c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 408c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (ret) { 409c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n"); 410c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang return ret; 411c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4132befccec034c13d34746a9e87149889d59ac767bFei Jiang 414fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type == psb_bt_user_buffer) || buf->handle) 4152befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = buf->user_ptr; 4162befccec034c13d34746a9e87149889d59ac767bFei Jiang else 4172befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag); 418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*address == NULL) { 420c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n"); 4217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 4297e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 432dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf) 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) 4387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 439dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 4412befccec034c13d34746a9e87149889d59ac767bFei Jiang 442fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type != psb_bt_user_buffer) && !buf->handle) 4432befccec034c13d34746a9e87149889d59ac767bFei Jiang wsbmBOUnmap(buf->drm_buf); 444dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4477e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 448430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 449f31d5416a60f83e184b0906a7ec77ba021840531hdingvoid psb__trace_coded(unsigned int *pBuf) 450f31d5416a60f83e184b0906a7ec77ba021840531hding{ 451f31d5416a60f83e184b0906a7ec77ba021840531hding int i, j; 452430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("%s code buffer is\n", __FUNCTION__); 453f31d5416a60f83e184b0906a7ec77ba021840531hding for (i = 0; i < 6; i++) { 454430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("\t"); 455f31d5416a60f83e184b0906a7ec77ba021840531hding for (j = 0; j < 4; j++) { 456430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("0x%08x, ", pBuf[(i*4) + j]); 457f31d5416a60f83e184b0906a7ec77ba021840531hding } 458430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("\n"); 459f31d5416a60f83e184b0906a7ec77ba021840531hding } 460f31d5416a60f83e184b0906a7ec77ba021840531hding} 461430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 462437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer 464437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 465437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 466437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 467437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 469437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle( 470dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 471dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_buffer_p obj_buffer, 472dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun void **pbuf /* out */ 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context = obj_buffer->context; 476437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 477437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0]; 478e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *raw_codedbuf; 479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 480dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int next_buf_off; 4812befccec034c13d34746a9e87149889d59ac767bFei Jiang int i; 482dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 483dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == pbuf) { 484dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_INVALID_PARAMETER; 4852befccec034c13d34746a9e87149889d59ac767bFei Jiang return vaStatus; 4862befccec034c13d34746a9e87149889d59ac767bFei Jiang } 4872befccec034c13d34746a9e87149889d59ac767bFei Jiang 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_context) { 489437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 490437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 491437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 4982befccec034c13d34746a9e87149889d59ac767bFei Jiang raw_codedbuf = *pbuf; 499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* reset the mapinfo */ 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo)); 501437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *pbuf = p = &obj_buffer->codedbuf_mapinfo[0]; 50367612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MRST 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (IS_MRST(driver_data)) { 505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* one segment */ 506437b3eda28a4bf098efa80598cab67f190275266Fei Jiang p->size = *((unsigned long *) raw_codedbuf); /* 1st DW is the size */ 507dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->status = *((unsigned long *) raw_codedbuf + 1); /* 2nd DW 508bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang * is rc status */ 509dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->reserved = 0; 510e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 511dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun lnc_H264_append_aux_info(obj_context, 512dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun obj_buffer, 513dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun (unsigned char *)p->buf, 514dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &(p->size)); 51567612a448651896b2557796ff98d46c5e0dbbdc6hding } 51667612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 517f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL 518f31d5416a60f83e184b0906a7ec77ba021840531hding if (IS_MRFL(driver_data)) { 519f31d5416a60f83e184b0906a7ec77ba021840531hding object_config_p obj_config = CONFIG(obj_context->config_id); 520f31d5416a60f83e184b0906a7ec77ba021840531hding if (NULL == obj_config) { 521f31d5416a60f83e184b0906a7ec77ba021840531hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 522f31d5416a60f83e184b0906a7ec77ba021840531hding DEBUG_FAILURE; 523f31d5416a60f83e184b0906a7ec77ba021840531hding 524f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_unmap(obj_buffer->psb_buffer); 525f31d5416a60f83e184b0906a7ec77ba021840531hding obj_buffer->buffer_data = NULL; 526f31d5416a60f83e184b0906a7ec77ba021840531hding 527f31d5416a60f83e184b0906a7ec77ba021840531hding return vaStatus; 528f31d5416a60f83e184b0906a7ec77ba021840531hding } 529f31d5416a60f83e184b0906a7ec77ba021840531hding 530f31d5416a60f83e184b0906a7ec77ba021840531hding switch (obj_config->profile) { 531f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileMPEG4Simple: 532f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileMPEG4AdvancedSimple: 533f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileMPEG4Main: 534f31d5416a60f83e184b0906a7ec77ba021840531hding 535f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH264Baseline: 536f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH264Main: 537f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH264High: 538f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH264StereoHigh: 539f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH264ConstrainedBaseline: 540f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileH263Baseline: 541f31d5416a60f83e184b0906a7ec77ba021840531hding /* 1st segment */ 542f31d5416a60f83e184b0906a7ec77ba021840531hding p->size = *((unsigned long *) raw_codedbuf); 543f31d5416a60f83e184b0906a7ec77ba021840531hding p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */ 544f31d5416a60f83e184b0906a7ec77ba021840531hding p->next = NULL; 545430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 546430ce5c32361119ed81a62c918be6afbdd053eddhding psb__trace_coded((unsigned int*)raw_codedbuf); 547430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 548f31d5416a60f83e184b0906a7ec77ba021840531hding break; 549f31d5416a60f83e184b0906a7ec77ba021840531hding 550f31d5416a60f83e184b0906a7ec77ba021840531hding case VAProfileJPEGBaseline: 551f31d5416a60f83e184b0906a7ec77ba021840531hding /* 3~6 segment */ 552430ce5c32361119ed81a62c918be6afbdd053eddhding tng_jpeg_AppendMarkers(obj_context, raw_codedbuf); 553f31d5416a60f83e184b0906a7ec77ba021840531hding next_buf_off = 0; 554f31d5416a60f83e184b0906a7ec77ba021840531hding /*Max resolution 4096x4096 use 6 segments*/ 555f31d5416a60f83e184b0906a7ec77ba021840531hding for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) { 556f31d5416a60f83e184b0906a7ec77ba021840531hding p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); /* ui32BytesUsed in HEADER_BUFFER*/ 557f31d5416a60f83e184b0906a7ec77ba021840531hding p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs (HEADER_BUFFER) */ 558f31d5416a60f83e184b0906a7ec77ba021840531hding next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); /* ui32Reserved3 in HEADER_BUFFER*/ 559f31d5416a60f83e184b0906a7ec77ba021840531hding 560f31d5416a60f83e184b0906a7ec77ba021840531hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 561f31d5416a60f83e184b0906a7ec77ba021840531hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 562f31d5416a60f83e184b0906a7ec77ba021840531hding 563f31d5416a60f83e184b0906a7ec77ba021840531hding if (next_buf_off == 0) { 564f31d5416a60f83e184b0906a7ec77ba021840531hding p->next = NULL; 565f31d5416a60f83e184b0906a7ec77ba021840531hding break; 566f31d5416a60f83e184b0906a7ec77ba021840531hding } else 567f31d5416a60f83e184b0906a7ec77ba021840531hding p->next = &p[1]; 568f31d5416a60f83e184b0906a7ec77ba021840531hding p++; 569f31d5416a60f83e184b0906a7ec77ba021840531hding } 570f31d5416a60f83e184b0906a7ec77ba021840531hding break; 571f31d5416a60f83e184b0906a7ec77ba021840531hding 572f31d5416a60f83e184b0906a7ec77ba021840531hding default: 573f31d5416a60f83e184b0906a7ec77ba021840531hding drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 574f31d5416a60f83e184b0906a7ec77ba021840531hding 575f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_unmap(obj_buffer->psb_buffer); 576f31d5416a60f83e184b0906a7ec77ba021840531hding obj_buffer->buffer_data = NULL; 577f31d5416a60f83e184b0906a7ec77ba021840531hding break; 578f31d5416a60f83e184b0906a7ec77ba021840531hding } 579f31d5416a60f83e184b0906a7ec77ba021840531hding } 580f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 58167612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD 58267612a448651896b2557796ff98d46c5e0dbbdc6hding if (IS_MFLD(driver_data)){ /* MFLD */ 583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_config_p obj_config = CONFIG(obj_context->config_id); 584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 585437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (NULL == obj_config) { 586437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 587437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 588437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 589437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 590437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 592437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 593437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 595dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAProfileJPEGBaseline != obj_config->profile 596bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 597dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Set frame skip flag*/ 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_frame_skip_flag(obj_context); 599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (obj_config->profile) { 601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Simple: 602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4AdvancedSimple: 603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Main: 604dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* one segment */ 605dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 606e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 607c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 608dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6092befccec034c13d34746a9e87149889d59ac767bFei Jiang 610437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Baseline: 611437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Main: 612437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264High: 613dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264ConstrainedBaseline: 614fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i = 0; 615fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (pnw_get_parallel_core_number(obj_context) == 2) { 616fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /*The second part of coded buffer which generated by core 2 is the 617fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * first part of encoded clip, while the first part of coded buffer 618fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * is the second part of encoded clip.*/ 619fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context)); 620fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].next = &p[i + 1]; 621fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 622fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */ 623fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 624fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 625fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 626f31d5416a60f83e184b0906a7ec77ba021840531hding p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 627c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 628fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i); 629fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 630c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x, size: %d\n", 631fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off, p[i].size); 632fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i++; 633fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 634437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 1st segment */ 635fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *((unsigned long *) raw_codedbuf); 636fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 637fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 638fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 639f31d5416a60f83e184b0906a7ec77ba021840531hding p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 640c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 641fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i); 642fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 643c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size); 644437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 645437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 6462befccec034c13d34746a9e87149889d59ac767bFei Jiang 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH263Baseline: 648fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* one segment */ 649dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 650e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 651c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6532befccec034c13d34746a9e87149889d59ac767bFei Jiang 654437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileJPEGBaseline: 655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 3~6 segment 656dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 657dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf); 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = 0; 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Max resolution 4096x4096 use 6 segments*/ 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) { 661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 662e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs */ 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); 664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 665c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 666c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 668dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (next_buf_off == 0) { 669dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = NULL; 670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = &p[1]; 673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p++; 674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 677437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 678c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 680437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 681437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 682437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 683437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 684437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 68567612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 686dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 687437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 688437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 6892f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 690dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_sync(psb_buffer_p buf) 6912f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang{ 692dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun int ret; 6932f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 694dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(buf); 695dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ASSERT(buf->driver_data); 6962f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 697dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 698dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 699c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n"); 700dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_ERROR_UNKNOWN; 701dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 7022f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 703dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return VA_STATUS_SUCCESS; 7042f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang} 705