psb_buffer.c revision f0f865c2db20a7b794606f7532b2de7c04a893c7
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 3806c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#ifdef ANDROID 39d03b75a0bb7d76d8d05509f5b581ab3b5d36a20dXiaolin Zhang#include <linux/psb_drm.h> 4006c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#else 4106c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include <psb_drm.h> 4206c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif 4338d89d625f11c0c3f0ff313cef450252e6467bafhding 447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 45c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 472befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h> 482befccec034c13d34746a9e87149889d59ac767bFei Jiang 492befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h" 504b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h" 512f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang#include "lnc_H264ES.h" 52430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h" 532f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer 567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 57dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data, 58dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int size, 59dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_type_t type, 60dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf 61dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int allignment; 657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t placement; 667e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset rar_handle to NULL */ 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->rar_handle = 0; 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->buffer_ofs = 0; 71dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->type = type; 732befccec034c13d34746a9e87149889d59ac767bFei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 74fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->size = size; 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO: Mask values are a guess */ 76dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (type) { 77dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu: 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 79dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 80dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 81dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu_shared: 82dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_surface: 86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 0; 874a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 884a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu break; 894a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu case psb_bt_surface_tt: 904a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu allignment = 0; 914a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED; 92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 93f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 94f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_surface_tiling: 95f31d5416a60f83e184b0906a7ec77ba021840531hding psb__information_message("Allocate tiled surface from TT heap\n"); 96f31d5416a60f83e184b0906a7ec77ba021840531hding placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED; 97f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 98f31d5416a60f83e184b0906a7ec77ba021840531hding break; 99f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_mmu_tiling: 100f31d5416a60f83e184b0906a7ec77ba021840531hding placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED; 101f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 102f31d5416a60f83e184b0906a7ec77ba021840531hding break; 103f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 1048ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing case psb_bt_cpu_vpu_cached: 1058ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing allignment = 1; 1068ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED; 1078ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing break; 108dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_vpu_only: 109dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 110dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 111dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 112dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_only: 113dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 114dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED; 115dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 116f848388b2f173b141fe2e375a07b4f17435ca814wfeng#if PSB_MFLD_DUMMY_CODE 117dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_camera: 118dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 119f848388b2f173b141fe2e375a07b4f17435ca814wfeng placement = WSBM_PL_FLAG_SHARED; 120dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 121f848388b2f173b141fe2e375a07b4f17435ca814wfeng#endif 12256ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ANDROID 123cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang case psb_bt_imr: 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 125cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang placement = TTM_PL_FLAG_IMR | WSBM_PL_FLAG_SHARED; 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 12756ada57fd5c4a41fbf281589526d47850bed05fdhding#endif 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 131dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return vaStatus; 1327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 134dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 1357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 1367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 1387e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR 1427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 145f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID 146f31d5416a60f83e184b0906a7ec77ba021840531hding if(!(placement & WSBM_PL_FLAG_SYSTEM)) { 147f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement); 148f31d5416a60f83e184b0906a7ec77ba021840531hding placement &= ~WSBM_PL_MASK_MEM; 14956ada57fd5c4a41fbf281589526d47850bed05fdhding placement &= ~WSBM_PL_FLAG_NO_EVICT; 150f31d5416a60f83e184b0906a7ec77ba021840531hding placement |= TTM_PL_FLAG_VRAM; 151f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement); 152f31d5416a60f83e184b0906a7ec77ba021840531hding } 153f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 154f31d5416a60f83e184b0906a7ec77ba021840531hding 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 159f31d5416a60f83e184b0906a7ec77ba021840531hding if(allignment < 4096) 160f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 4096; /* temporily more safe */ 161dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 162f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 1637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 1647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang allignment, placement); 1657e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 166c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 167dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1687e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* here use the placement when gen buffer setted */ 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0); 173dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 175c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 1767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1792befccec034c13d34746a9e87149889d59ac767bFei Jiang if (placement & WSBM_PL_FLAG_TT) 180c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n", 181dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size, wsbmBOOffsetHint(buf->drm_buf)); 1822befccec034c13d34746a9e87149889d59ac767bFei Jiang 1837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = placement; 1847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_ready; 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 186dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 190fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 191fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer 192fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 193fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, 194fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang unsigned int size, 195fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_type_t type, 196fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_p buf, 1975ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding void * vaddr, 1985ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding unsigned int flags 199fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ) 200fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 201fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 202fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int allignment; 203fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang uint32_t placement; 204fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int ret; 205fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 206fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* reset rar_handle to NULL */ 207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->rar_handle = 0; 208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->buffer_ofs = 0; 209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->type = type; 211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->user_ptr = vaddr; 213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 214fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* Xvideo will share surface buffer, set SHARED flag 215fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 2165ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED ; 2175ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding 2185ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding if (flags & PSB_USER_BUFFER_WC) 2195ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_WC; 2205ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding else if (flags & PSB_USER_BUFFER_UNCACHED) 2215ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_UNCACHED; 2225ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding else 2235ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement |= WSBM_PL_FLAG_CACHED; 224fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 225fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = LOCK_HARDWARE(driver_data); 226fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 227fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 228fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 229fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang DEBUG_FAILURE_RET; 230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return vaStatus; 231fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 232fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 233fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment = 4096; /* temporily more safe */ 234f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 235f31d5416a60f83e184b0906a7ec77ba021840531hding if (type == psb_bt_mmu_tiling) { 236f31d5416a60f83e184b0906a7ec77ba021840531hding placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_CACHED | WSBM_PL_FLAG_SHARED ; 237f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 238f31d5416a60f83e184b0906a7ec77ba021840531hding } 239f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 240f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 241fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment, placement); 243fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (!buf->drm_buf) { 244c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 245fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 246fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 247fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 248fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 249fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* here use the placement when gen buffer setted */ 250c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size); 251fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 252fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr); 253fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 254c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers\n"); 255fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return 1; 256fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 257fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 258c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n", 259fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaddr, size, wsbmBOOffsetHint(buf->drm_buf)); 260fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 261fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->pl_flags = placement; 262fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->status = psb_bs_ready; 263fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->wsbm_synccpu_flag = 0; 264fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 265fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_SUCCESS; 266fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 2677e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 26817f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#if 0 2697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus 2717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 274dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement) 2757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 277dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2787e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 2797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 2807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement); 2827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == 0) 2837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = set_placement; 284dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 2867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 28717f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 289dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data, 290dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf, 291dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p reference_buf 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 2957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 296dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(buf, reference_buf, sizeof(*buf)); 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->drm_buf = NULL; 299dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 301dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 3027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 3057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmGenBuffers(driver_data->main_pool, 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1, 310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &buf->drm_buf, 311dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4096, /* page alignment */ 312dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0); 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 314c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 315dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 318dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf))); 320dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 322c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 3277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 32909998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data, 3303f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang psb_buffer_p buf, 3313f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang int kbuf_handle 3323f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ) 33309998e330bbcbf835798128768e590772f5a5737Shuduo Sang{ 33409998e330bbcbf835798128768e590772f5a5737Shuduo Sang int ret = 0; 33509998e330bbcbf835798128768e590772f5a5737Shuduo Sang VAStatus vaStatus = VA_STATUS_SUCCESS; 33609998e330bbcbf835798128768e590772f5a5737Shuduo Sang 33709998e330bbcbf835798128768e590772f5a5737Shuduo Sang buf->drm_buf = NULL; 33809998e330bbcbf835798128768e590772f5a5737Shuduo Sang 33909998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = LOCK_HARDWARE(driver_data); 34009998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 34109998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 34209998e330bbcbf835798128768e590772f5a5737Shuduo Sang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 34309998e330bbcbf835798128768e590772f5a5737Shuduo Sang DEBUG_FAILURE_RET; 34409998e330bbcbf835798128768e590772f5a5737Shuduo Sang return vaStatus; 34509998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 34709998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = wsbmGenBuffers(driver_data->main_pool, 34809998e330bbcbf835798128768e590772f5a5737Shuduo Sang 1, 34909998e330bbcbf835798128768e590772f5a5737Shuduo Sang &buf->drm_buf, 35009998e330bbcbf835798128768e590772f5a5737Shuduo Sang 4096, /* page alignment */ 35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang 0); 35209998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (!buf->drm_buf) { 353c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 35409998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 35609998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 35709998e330bbcbf835798128768e590772f5a5737Shuduo Sang 3583f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle); 35909998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 36009998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 361c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 36209998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 36309998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 364c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf); 365f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang buf->type = psb_bt_surface; 366f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang buf->status = psb_bs_ready; 3673f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 36809998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_SUCCESS; 36909998e330bbcbf835798128768e590772f5a5737Shuduo Sang} 3707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 372dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 373dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf) 3747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->drm_buf == NULL) 377dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 378dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_bs_unfinished != buf->status) { 3797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 380dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmBOUnreference(&buf->drm_buf); 3817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->rar_handle) 3822d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang buf->rar_handle = 0; 3837e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->driver_data = NULL; 3847e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_unfinished; 3857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer 3907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 3917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 393e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */) 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 3967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 400dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* multiple mapping not allowed */ 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) { 402c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n"); 403c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n"); 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 405dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(buf); 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 407dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* don't think TG deal with READ/WRITE differently */ 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE; 410c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 411c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang wsbmBOWaitIdle(buf->drm_buf, 0); 412c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } else { 413c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 414c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (ret) { 415c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n"); 416c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang return ret; 417c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 4187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4192befccec034c13d34746a9e87149889d59ac767bFei Jiang 4201dec8be53962e939debd8d4a1d49d659898520c4hding if (buf->user_ptr) /* user mode buffer */ 4212befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = buf->user_ptr; 4222befccec034c13d34746a9e87149889d59ac767bFei Jiang else 4232befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag); 424dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4257e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*address == NULL) { 426c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n"); 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; 4287e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 429dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4307e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4327e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4337e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 4357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 4377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 438dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf) 4397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4407e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 4417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 4427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) 4447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 445dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 4472befccec034c13d34746a9e87149889d59ac767bFei Jiang 448fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type != psb_bt_user_buffer) && !buf->handle) 4492befccec034c13d34746a9e87149889d59ac767bFei Jiang wsbmBOUnmap(buf->drm_buf); 450dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 454430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 455f31d5416a60f83e184b0906a7ec77ba021840531hdingvoid psb__trace_coded(unsigned int *pBuf) 456f31d5416a60f83e184b0906a7ec77ba021840531hding{ 457f31d5416a60f83e184b0906a7ec77ba021840531hding int i, j; 458430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("%s code buffer is\n", __FUNCTION__); 459f31d5416a60f83e184b0906a7ec77ba021840531hding for (i = 0; i < 6; i++) { 460430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("\t"); 461f31d5416a60f83e184b0906a7ec77ba021840531hding for (j = 0; j < 4; j++) { 462430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("0x%08x, ", pBuf[(i*4) + j]); 463f31d5416a60f83e184b0906a7ec77ba021840531hding } 464430ce5c32361119ed81a62c918be6afbdd053eddhding drv_debug_msg("\n"); 465f31d5416a60f83e184b0906a7ec77ba021840531hding } 466f31d5416a60f83e184b0906a7ec77ba021840531hding} 467430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 468437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 469dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer 470437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 471437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 472437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 473437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 474437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 475437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle( 476dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 477dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_buffer_p obj_buffer, 478dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun void **pbuf /* out */ 479437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 480437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 481437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context = obj_buffer->context; 482437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 483437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0]; 484e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *raw_codedbuf; 485437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 486dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int next_buf_off; 4872befccec034c13d34746a9e87149889d59ac767bFei Jiang int i; 488dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4896d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(pbuf == NULL); 4902befccec034c13d34746a9e87149889d59ac767bFei Jiang 491dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_context) { 492437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 493437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 494437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 495437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 496437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 497437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 498437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 499437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 500437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 5012befccec034c13d34746a9e87149889d59ac767bFei Jiang raw_codedbuf = *pbuf; 502437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* reset the mapinfo */ 503437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo)); 504437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 505437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *pbuf = p = &obj_buffer->codedbuf_mapinfo[0]; 506f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL 507f31d5416a60f83e184b0906a7ec77ba021840531hding if (IS_MRFL(driver_data)) { 508f31d5416a60f83e184b0906a7ec77ba021840531hding object_config_p obj_config = CONFIG(obj_context->config_id); 509f31d5416a60f83e184b0906a7ec77ba021840531hding if (NULL == obj_config) { 510f31d5416a60f83e184b0906a7ec77ba021840531hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 511f31d5416a60f83e184b0906a7ec77ba021840531hding DEBUG_FAILURE; 512f31d5416a60f83e184b0906a7ec77ba021840531hding 513f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_unmap(obj_buffer->psb_buffer); 514f31d5416a60f83e184b0906a7ec77ba021840531hding obj_buffer->buffer_data = NULL; 515f31d5416a60f83e184b0906a7ec77ba021840531hding 516f31d5416a60f83e184b0906a7ec77ba021840531hding return vaStatus; 517f31d5416a60f83e184b0906a7ec77ba021840531hding } 518f31d5416a60f83e184b0906a7ec77ba021840531hding 519e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin if (VAProfileJPEGBaseline != obj_config->profile 520e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 521e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /*Set frame skip flag*/ 522e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin tng_set_frame_skip_flag(obj_context); 523e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } 524f31d5416a60f83e184b0906a7ec77ba021840531hding switch (obj_config->profile) { 525e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4Simple: 526e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4AdvancedSimple: 527e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4Main: 528e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 529e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264Baseline: 530e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264Main: 531e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264High: 532e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264StereoHigh: 533e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264ConstrainedBaseline: 534e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH263Baseline: 535e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /* 1st segment */ 536e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->size = *((unsigned long *) raw_codedbuf); 537e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */ 538e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = NULL; 539430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 540e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin psb__trace_coded((unsigned int*)raw_codedbuf); 541430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 542e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 543e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 544e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileJPEGBaseline: 545e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /* 3~6 segment */ 546e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin tng_jpeg_AppendMarkers(obj_context, raw_codedbuf); 547e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin next_buf_off = 0; 548e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /*Max resolution 4096x4096 use 6 segments*/ 549e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) { 550e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); /* ui32BytesUsed in HEADER_BUFFER*/ 551e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs (HEADER_BUFFER) */ 552e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); /* ui32Reserved3 in HEADER_BUFFER*/ 553e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 554e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 555e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 556e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 557e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin if (next_buf_off == 0) { 558e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = NULL; 559e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 560e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } else 561e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = &p[1]; 562e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p++; 563e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } 564e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 565e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 566e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin default: 567e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 568e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 569e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin psb_buffer_unmap(obj_buffer->psb_buffer); 570e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin obj_buffer->buffer_data = NULL; 571e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 572f31d5416a60f83e184b0906a7ec77ba021840531hding } 573f31d5416a60f83e184b0906a7ec77ba021840531hding } 574f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 57567612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD 57667612a448651896b2557796ff98d46c5e0dbbdc6hding if (IS_MFLD(driver_data)){ /* MFLD */ 577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_config_p obj_config = CONFIG(obj_context->config_id); 578437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 579437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (NULL == obj_config) { 580437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 581437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 585dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 586437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 587437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 588dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAProfileJPEGBaseline != obj_config->profile 590bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Set frame skip flag*/ 592dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_frame_skip_flag(obj_context); 593dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 594437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (obj_config->profile) { 595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Simple: 596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4AdvancedSimple: 597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Main: 598dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* one segment */ 599dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 600e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 601c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 602dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6032befccec034c13d34746a9e87149889d59ac767bFei Jiang 604437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Baseline: 605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Main: 606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264High: 607dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264ConstrainedBaseline: 608fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i = 0; 609fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context)); 610f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (pnw_get_parallel_core_number(obj_context) == 2) { 611f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang /*The second part of coded buffer which generated by core 2 is the 612f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang * first part of encoded clip, while the first part of coded buffer 613f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang * is the second part of encoded clip.*/ 614f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].next = &p[i + 1]; 615f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 616f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */ 617f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang 618f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 619f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 620f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 621f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 622f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i); 623f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 624f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x, size: %d\n", 625f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang next_buf_off, p[i].size); 626f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang 627f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i++; 628fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 629fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 630437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 1st segment */ 631fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *((unsigned long *) raw_codedbuf); 632fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 633f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size); 634fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 635f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 636f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 637f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 638f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i); 639f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 640f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang for (i = 0; i < pnw_get_parallel_core_number(obj_context); i++) { 641f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (p[i].size > (next_buf_off - sizeof(unsigned long) * 4)) { 642f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_ERROR, "Coded segment %d is too large(%d)" 643f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang " and exceed segment boundary(offset %d)", i, p[i].size, next_buf_off); 644f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].size = next_buf_off - sizeof(unsigned long) * 4; 645f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 646fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 647437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 648437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 6492befccec034c13d34746a9e87149889d59ac767bFei Jiang 650437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH263Baseline: 651fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* one segment */ 652dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 653e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 654c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 655dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 6562befccec034c13d34746a9e87149889d59ac767bFei Jiang 657437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileJPEGBaseline: 658dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 3~6 segment 659dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 660dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf); 661dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = 0; 662dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Max resolution 4096x4096 use 6 segments*/ 663dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) { 664dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 665e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs */ 666dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); 667dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 668c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 669c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 670dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 671dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (next_buf_off == 0) { 672dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = NULL; 673dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 674dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 675dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = &p[1]; 676dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p++; 677dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 678dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 679dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 680437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 681c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 682dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 683437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 684437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 685437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 686437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 687437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 68867612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 689dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 690437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 691437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 6922f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 693