psb_buffer.c revision f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3
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 39b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifdef BAYTRAIL 40b7c527a64448cfeedb2fe114b673af667f92faf2hding#include <linux/vxd_drm.h> 41b7c527a64448cfeedb2fe114b673af667f92faf2hding#else 42aeee5382f933ef7b1aa54a0f12207fa3c9f6c89aAndy Qiu#include <ttm/ttm_placement.h> 43d03b75a0bb7d76d8d05509f5b581ab3b5d36a20dXiaolin Zhang#include <linux/psb_drm.h> 44b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 4506c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#else 4606c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#include <psb_drm.h> 4706c7c30796be2e6b18a6263956a0ca308616ecdeLi Zeng#endif 4838d89d625f11c0c3f0ff313cef450252e6467bafhding 497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#include "psb_def.h" 50c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang#include "psb_drv_debug.h" 5101f32633eef9438c9f3ceed244c25487b5274611edward lin#include "tng_cmdbuf.h" 527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 53b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 542befccec034c13d34746a9e87149889d59ac767bFei Jiang#include <pnw_cmdbuf.h> 552befccec034c13d34746a9e87149889d59ac767bFei Jiang#include "pnw_jpeg.h" 564b5b72d7dd3fe944d75029ff0ca6db1e74600e59Liu, Shuo#include "pnw_H264ES.h" 57430ce5c32361119ed81a62c918be6afbdd053eddhding#include "tng_jpegES.h" 58b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 592f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 60ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo#include "linux/vsp_fw.h" 617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Create buffer 637e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 64dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_create(psb_driver_data_p driver_data, 65dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int size, 66dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_type_t type, 67dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf 68dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int allignment; 727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang uint32_t placement; 737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* reset rar_handle to NULL */ 767e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->rar_handle = 0; 777e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->buffer_ofs = 0; 78dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 797e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->type = type; 802befccec034c13d34746a9e87149889d59ac767bFei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 81fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->size = size; 827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* TODO: Mask values are a guess */ 83dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun switch (type) { 84dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu: 85dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 86dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 87dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 88dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_vpu_shared: 89dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 90dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 91dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 92dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_surface: 93dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 0; 944a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED; 95781d5d90f726d4d50151b5686348ce22f48937c7Li Zeng if (IS_CTP(driver_data)) /* CTP support cache snoop */ 96781d5d90f726d4d50151b5686348ce22f48937c7Li Zeng placement |= WSBM_PL_FLAG_CACHED; 974a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu break; 984a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu case psb_bt_surface_tt: 994a98dcd2483042879b67cee3cd51f5b4b2ea630aJason Hu allignment = 0; 100c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng if (IS_MOFD(driver_data)) 101c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED; 102c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng else 103c1b2b79d09021bd55c39f38b8d08b4f17e65a18cLi Zeng placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_NO_EVICT | WSBM_PL_FLAG_SHARED; 104dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 105f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 106f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_surface_tiling: 107684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng drv_debug_msg(VIDEO_DEBUG_GENERAL, "Allocate tiled surface from TT heap\n"); 10874576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng if (IS_MOFD(driver_data)) 10974576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED; 11074576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng else 11174576871e9f7fd057cc270baccf5e0e11dd3265eLi Zeng placement = WSBM_PL_FLAG_TT | WSBM_PL_FLAG_SHARED; 112f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 113f31d5416a60f83e184b0906a7ec77ba021840531hding break; 114f31d5416a60f83e184b0906a7ec77ba021840531hding case psb_bt_mmu_tiling: 115684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED; 116f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 117f31d5416a60f83e184b0906a7ec77ba021840531hding break; 118f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 1198ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing case psb_bt_cpu_vpu_cached: 1208ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing allignment = 1; 1218ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_CACHED; 1228ad9853613fb16f48b9eaf95b4688f55bef4b5f4SUN,Jing break; 123dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_vpu_only: 124dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 125dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = DRM_PSB_FLAG_MEM_MMU; 126dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 127dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_cpu_only: 128dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 129dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun placement = WSBM_PL_FLAG_SYSTEM | WSBM_PL_FLAG_CACHED; 130dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 131f848388b2f173b141fe2e375a07b4f17435ca814wfeng#if PSB_MFLD_DUMMY_CODE 132dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case psb_bt_camera: 133dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 134f848388b2f173b141fe2e375a07b4f17435ca814wfeng placement = WSBM_PL_FLAG_SHARED; 135dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 136f848388b2f173b141fe2e375a07b4f17435ca814wfeng#endif 13756ada57fd5c4a41fbf281589526d47850bed05fdhding#ifdef ANDROID 138b7c527a64448cfeedb2fe114b673af667f92faf2hding#ifndef BAYTRAIL 139cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang case psb_bt_imr: 140dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun allignment = 1; 141cc2673c315517dd5a4bd294fb8707cf40c0d2088Fei Jiang placement = TTM_PL_FLAG_IMR | WSBM_PL_FLAG_SHARED; 142dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 14356ada57fd5c4a41fbf281589526d47850bed05fdhding#endif 144b7c527a64448cfeedb2fe114b673af667f92faf2hding#endif 145dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun default: 146dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun vaStatus = VA_STATUS_ERROR_UNKNOWN; 147dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun DEBUG_FAILURE; 148dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return vaStatus; 1497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 151dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 1527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 1537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 1547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 1557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 1567e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef VA_EMULATOR 1597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 162f31d5416a60f83e184b0906a7ec77ba021840531hding#ifndef ANDROID 163f31d5416a60f83e184b0906a7ec77ba021840531hding if(!(placement & WSBM_PL_FLAG_SYSTEM)) { 164f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: buffer->pl_flags 0x%08x\n", __func__, placement); 165f31d5416a60f83e184b0906a7ec77ba021840531hding placement &= ~WSBM_PL_MASK_MEM; 16656ada57fd5c4a41fbf281589526d47850bed05fdhding placement &= ~WSBM_PL_FLAG_NO_EVICT; 167f31d5416a60f83e184b0906a7ec77ba021840531hding placement |= TTM_PL_FLAG_VRAM; 168f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: repleace buffer->pl_flags 0x%08x\n", __func__, placement); 169f31d5416a60f83e184b0906a7ec77ba021840531hding } 170f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 171f31d5416a60f83e184b0906a7ec77ba021840531hding 1727e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#ifdef MSVDX_VA_EMULATOR 1737e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang placement |= WSBM_PL_FLAG_SHARED; 1747e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang#endif 1757e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 176f31d5416a60f83e184b0906a7ec77ba021840531hding if(allignment < 4096) 177f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 4096; /* temporily more safe */ 178dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 179f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 1807e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 1817e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang allignment, placement); 1827e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 183c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 184dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1867e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* here use the placement when gen buffer setted */ 1897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOData(buf->drm_buf, size, NULL, NULL, 0); 190dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 1917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 192c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 1937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 1947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 1957e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 1962befccec034c13d34746a9e87149889d59ac767bFei Jiang if (placement & WSBM_PL_FLAG_TT) 197c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO with TT placement (%d byte),BO GPU offset hint=0x%08x\n", 198dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun size, wsbmBOOffsetHint(buf->drm_buf)); 1992befccec034c13d34746a9e87149889d59ac767bFei Jiang 2007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = placement; 2017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_ready; 2027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 203dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 2057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 2067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 207fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang/* 208fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang * Create buffer 209fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 210fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei JiangVAStatus psb_buffer_create_from_ub(psb_driver_data_p driver_data, 211fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang unsigned int size, 212fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_type_t type, 213fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang psb_buffer_p buf, 2145ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding void * vaddr, 2155ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding unsigned int flags 216fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ) 217fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang{ 218fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 219fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int allignment; 220fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang uint32_t placement; 221fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang int ret; 222fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 223fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* reset rar_handle to NULL */ 224fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->rar_handle = 0; 225fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->buffer_ofs = 0; 226fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 227fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->type = type; 228fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->driver_data = driver_data; /* only for RAR buffers */ 229fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->user_ptr = vaddr; 230fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 231fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* Xvideo will share surface buffer, set SHARED flag 232fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang */ 2335ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding placement = DRM_PSB_FLAG_MEM_MMU | WSBM_PL_FLAG_SHARED ; 2345ed159b49cff6b05d923bcf00d09c67ee2ce1f80hding 235fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = LOCK_HARDWARE(driver_data); 236fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 237fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 238fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 239fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang DEBUG_FAILURE_RET; 240fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return vaStatus; 241fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 242fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 243fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment = 4096; /* temporily more safe */ 244f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MSVDX_DEC_TILING 245f31d5416a60f83e184b0906a7ec77ba021840531hding if (type == psb_bt_mmu_tiling) { 246684f0e29e29ca32fad49439cfe0392417361d34dLi Zeng placement = DRM_PSB_FLAG_MEM_MMU_TILING | WSBM_PL_FLAG_SHARED ; 247f31d5416a60f83e184b0906a7ec77ba021840531hding allignment = 2048 * 16; /* Tiled row aligned */ 248f31d5416a60f83e184b0906a7ec77ba021840531hding } 249f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 250c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng 251c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng if (flags & PSB_USER_BUFFER_WC) 252c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng placement |= WSBM_PL_FLAG_WC; 253c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng else if (flags & PSB_USER_BUFFER_UNCACHED) 254c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng placement |= WSBM_PL_FLAG_UNCACHED; 255c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng else 256c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng placement |= WSBM_PL_FLAG_CACHED; 257c7902b7f72b041c4f2317a9806505257a737d49bLi Zeng 258f31d5416a60f83e184b0906a7ec77ba021840531hding //drv_debug_msg(VIDEO_DEBUG_ERROR, "FIXME: should use geetpagesize() ?\n"); 259fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmGenBuffers(driver_data->main_pool, 1, &buf->drm_buf, 260fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang allignment, placement); 261fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (!buf->drm_buf) { 262c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 263fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang UNLOCK_HARDWARE(driver_data); 264fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 265fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 266fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 267fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* here use the placement when gen buffer setted */ 268c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer %p, size=%d\n", vaddr, size); 269fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 270fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang ret = wsbmBODataUB(buf->drm_buf, size, NULL, NULL, 0, vaddr); 271fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (ret) { 272b7c527a64448cfeedb2fe114b673af667f92faf2hding drv_debug_msg(VIDEO_DEBUG_ERROR, "Failed to alloc wsbm buffers, buf->drm_buf is 0x%x, size is %d, vaddr is 0x%x\n", buf->drm_buf, size, vaddr); 273fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return 1; 274fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 275fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 276c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Create BO from user buffer 0x%08x (%d byte),BO GPU offset hint=0x%08x\n", 277fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang vaddr, size, wsbmBOOffsetHint(buf->drm_buf)); 278fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 279fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->pl_flags = placement; 280fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->status = psb_bs_ready; 281fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang buf->wsbm_synccpu_flag = 0; 282fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 283fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang return VA_STATUS_SUCCESS; 284fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang} 2857e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 28617f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#if 0 2877e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 2887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * buffer setstatus 2897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 2907e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 2917e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 292dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_setstatus(psb_buffer_p buf, uint32_t set_placement, uint32_t clr_placement) 2937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 2947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 295dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 2967e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 2977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 2987e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 2997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetStatus(buf->drm_buf, set_placement, clr_placement); 3007e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret == 0) 3017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->pl_flags = set_placement; 302dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return ret; 3047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 30517f42294e6f90d3f19c91a6c3c32c353adf3eb6fhding#endif 3067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 307dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunVAStatus psb_buffer_reference(psb_driver_data_p driver_data, 308dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p buf, 309dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_p reference_buf 310dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ) 3117e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret = 0; 3137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 314dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang memcpy(buf, reference_buf, sizeof(*buf)); 3167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->drm_buf = NULL; 317dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3187e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = LOCK_HARDWARE(driver_data); 319dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (ret) { 3207e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang UNLOCK_HARDWARE(driver_data); 3217e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 3227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang DEBUG_FAILURE_RET; 3237e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return vaStatus; 3247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 325dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 326dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun ret = wsbmGenBuffers(driver_data->main_pool, 327dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 1, 328dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun &buf->drm_buf, 329dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4096, /* page alignment */ 330dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 0); 3317e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (!buf->drm_buf) { 332c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 333dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3347e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3357e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 336dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 3377e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ret = wsbmBOSetReferenced(buf->drm_buf, wsbmKBufHandle(wsbmKBuf(reference_buf->drm_buf))); 338dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun UNLOCK_HARDWARE(driver_data); 3397e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (ret) { 340c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 3417e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_ERROR_ALLOCATION_FAILED; 3427e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 3437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 3447e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return VA_STATUS_SUCCESS; 3457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 3467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 34709998e330bbcbf835798128768e590772f5a5737Shuduo SangVAStatus psb_kbuffer_reference(psb_driver_data_p driver_data, 3483f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang psb_buffer_p buf, 3493f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang int kbuf_handle 3503f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ) 35109998e330bbcbf835798128768e590772f5a5737Shuduo Sang{ 35209998e330bbcbf835798128768e590772f5a5737Shuduo Sang int ret = 0; 35309998e330bbcbf835798128768e590772f5a5737Shuduo Sang VAStatus vaStatus = VA_STATUS_SUCCESS; 35409998e330bbcbf835798128768e590772f5a5737Shuduo Sang 35509998e330bbcbf835798128768e590772f5a5737Shuduo Sang buf->drm_buf = NULL; 35609998e330bbcbf835798128768e590772f5a5737Shuduo Sang 35709998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = LOCK_HARDWARE(driver_data); 35809998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 35909998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 36009998e330bbcbf835798128768e590772f5a5737Shuduo Sang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 36109998e330bbcbf835798128768e590772f5a5737Shuduo Sang DEBUG_FAILURE_RET; 36209998e330bbcbf835798128768e590772f5a5737Shuduo Sang return vaStatus; 36309998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 3647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 36509998e330bbcbf835798128768e590772f5a5737Shuduo Sang ret = wsbmGenBuffers(driver_data->main_pool, 36609998e330bbcbf835798128768e590772f5a5737Shuduo Sang 1, 36709998e330bbcbf835798128768e590772f5a5737Shuduo Sang &buf->drm_buf, 36809998e330bbcbf835798128768e590772f5a5737Shuduo Sang 4096, /* page alignment */ 36909998e330bbcbf835798128768e590772f5a5737Shuduo Sang 0); 37009998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (!buf->drm_buf) { 371c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to gen wsbm buffers\n"); 37209998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 37309998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 37409998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 37509998e330bbcbf835798128768e590772f5a5737Shuduo Sang 3763f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang ret = wsbmBOSetReferenced(buf->drm_buf, kbuf_handle); 37709998e330bbcbf835798128768e590772f5a5737Shuduo Sang UNLOCK_HARDWARE(driver_data); 37809998e330bbcbf835798128768e590772f5a5737Shuduo Sang if (ret) { 379c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to alloc wsbm buffers\n"); 38009998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_ERROR_ALLOCATION_FAILED; 38109998e330bbcbf835798128768e590772f5a5737Shuduo Sang } 382c3077df94073dd4c035f86e5f1428e4611a0cf73Shuduo Sang buf->pl_flags = wsbmBOPlacementHint(buf->drm_buf); 383f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang buf->type = psb_bt_surface; 384f69cb8fcb72989fcef10484c3f5cbd16db9789d1Elaine Wang buf->status = psb_bs_ready; 3853f3d1e8746d2b793c982ac19a73061e006b1b178Kun Wang 38609998e330bbcbf835798128768e590772f5a5737Shuduo Sang return VA_STATUS_SUCCESS; 38709998e330bbcbf835798128768e590772f5a5737Shuduo Sang} 3887e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 3897e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Destroy buffer 390dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 391dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunvoid psb_buffer_destroy(psb_buffer_p buf) 3927e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 3937e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 3947e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->drm_buf == NULL) 395dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun return; 396dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (psb_bs_unfinished != buf->status) { 3977e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 398dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun wsbmBOUnreference(&buf->drm_buf); 3997e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->rar_handle) 4002d4ed17a7b4c8d106f4d894f84576a7ab7501d91Shuduo Sang buf->rar_handle = 0; 4017e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->driver_data = NULL; 4027e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->status = psb_bs_unfinished; 4037e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4047e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4057e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4067e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4077e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Map buffer 4087e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4097e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 4107e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 411e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wangint psb_buffer_map(psb_buffer_p buf, unsigned char **address /* out */) 4127e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4137e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang int ret; 4147e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4157e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 4167e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 4177e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 418dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* multiple mapping not allowed */ 4197e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) { 420c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Multiple mapping request detected, unmap previous mapping\n"); 421c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Need to fix application to unmap at first, then request second mapping request\n"); 4227e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 423dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun psb_buffer_unmap(buf); 4247e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 425dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4267e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang /* don't think TG deal with READ/WRITE differently */ 4277e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = WSBM_SYNCCPU_READ | WSBM_SYNCCPU_WRITE; 428c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (psb_video_trace_fp) { 429c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang wsbmBOWaitIdle(buf->drm_buf, 0); 430c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } else { 431c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang ret = wsbmBOSyncForCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 432c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang if (ret) { 433c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "faild to sync bo for cpu\n"); 434c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang return ret; 435c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang } 4367e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 4372befccec034c13d34746a9e87149889d59ac767bFei Jiang 4381dec8be53962e939debd8d4a1d49d659898520c4hding if (buf->user_ptr) /* user mode buffer */ 4392befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = buf->user_ptr; 4402befccec034c13d34746a9e87149889d59ac767bFei Jiang else 4412befccec034c13d34746a9e87149889d59ac767bFei Jiang *address = wsbmBOMap(buf->drm_buf, buf->wsbm_synccpu_flag); 442dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4437e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (*address == NULL) { 444c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "failed to map buffer\n"); 4457e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return -1; 4467e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang } 447dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4487e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4497e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4507e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4517e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang/* 4527e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Unmap buffer 4537e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * 4547e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang * Returns 0 on success 4557e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang */ 456dc1209519284865899ca8d990b3a2c7dbca8ae08wangkunint psb_buffer_unmap(psb_buffer_p buf) 4577e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang{ 4587e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf); 4597e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang ASSERT(buf->driver_data); 4607e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4617e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang if (buf->wsbm_synccpu_flag) 4627e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang (void) wsbmBOReleaseFromCpu(buf->drm_buf, buf->wsbm_synccpu_flag); 463dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4647e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang buf->wsbm_synccpu_flag = 0; 4652befccec034c13d34746a9e87149889d59ac767bFei Jiang 466fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if ((buf->type != psb_bt_user_buffer) && !buf->handle) 4672befccec034c13d34746a9e87149889d59ac767bFei Jiang wsbmBOUnmap(buf->drm_buf); 468dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 4697e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang return 0; 4707e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang} 4717e8d39a9d261ff6b5256d7cf9c7a127947b2b2a5Fei,Jiang 4727bb84b457d5658da0c850ed13dff3d212af70771Edward Lin#define _MRFL_DEBUG_CODED_ 4737bb84b457d5658da0c850ed13dff3d212af70771Edward Lin 474430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 475ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingstatic void psb__trace_coded(VACodedBufferSegment *vaCodedBufSeg) 476f31d5416a60f83e184b0906a7ec77ba021840531hding{ 477f31d5416a60f83e184b0906a7ec77ba021840531hding int i, j; 478ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding int uiPipeIndex = -1; 479ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding unsigned int *pBuf = NULL; 480ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding do { 481ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding ++uiPipeIndex; 482ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: pipe num %d, size = %d\n", __FUNCTION__, uiPipeIndex, vaCodedBufSeg[uiPipeIndex].size); 483ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding pBuf = (unsigned int *)(vaCodedBufSeg[uiPipeIndex].buf); 484ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding pBuf -= 16; 485ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding for (i = 0; i < 6; i++) { 486ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding for (j = 0; j < 4; j++) { 487ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: 0x%08x\n", __FUNCTION__, pBuf[(i*4) + j]); 488ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding } 489ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding } 490ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s: \n", __FUNCTION__); 491ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding } while (vaCodedBufSeg[uiPipeIndex].next); 492ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 493ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding return ; 494f31d5416a60f83e184b0906a7ec77ba021840531hding} 495430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 496ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 4974d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan#define PROFILE_H264(profile) ((profile>=VAProfileH264Baseline && profile <=VAProfileH264High) || \ 4984d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan (profile == VAProfileH264ConstrainedBaseline)) 499ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hdingstatic void tng_get_coded_data( 500ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding object_buffer_p obj_buffer, 501ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding unsigned char *raw_codedbuf 502ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding) 503ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding{ 504ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding object_context_p obj_context = obj_buffer->context; 505ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding VACodedBufferSegment *vaCodedBufSeg = &obj_buffer->codedbuf_mapinfo[0]; 506ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding int iPipeIndex = 0; 507ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding unsigned int uiPipeNum = tng_get_pipe_number(obj_context); 508ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding unsigned int uiBufOffset = tng_align_KB(obj_buffer->size >> 1); 5095dded681fc06f6f765840c45a5e6d57cdf79e561edward lin unsigned long *ptmp = NULL; 5104d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan int tmp; 511ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 512ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s pipenum = 0x%x\n", __FUNCTION__, uiPipeNum); 513ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding drv_debug_msg(VIDEO_DEBUG_GENERAL, "%s offset = 0x%x\n", __FUNCTION__, uiBufOffset); 514ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 515bb1e9267a518cf047f09350dd3ec19932f923e74gji tmp = vaCodedBufSeg[iPipeIndex].size = *(unsigned int *)((unsigned long)raw_codedbuf); 5164d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan 5174d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan /* 5184d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * This is used for DRM over WiDi which only uses H264 BP 5194d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * Tangier IED encryption operates on the chunks with 16bytes, and we must include 5204d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * the extra bytes beyond slice data as a whole chunk for decrption 5214d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * We simply include the padding bytes regardless of IED enable or disable 5224d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan */ 5234d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan if (PROFILE_H264(obj_context->profile) && (tmp % 16 != 0)) { 5244d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan tmp = (tmp + 15) & (~15); 5254d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan drv_debug_msg(VIDEO_DEBUG_GENERAL, "Force slice size from %d to %d\n", 5264d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan vaCodedBufSeg[iPipeIndex].size, tmp); 5274d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan vaCodedBufSeg[iPipeIndex].size = tmp; 5284d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan } 5294d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan 530bb1e9267a518cf047f09350dd3ec19932f923e74gji vaCodedBufSeg[iPipeIndex].buf = (unsigned char *)(((unsigned int *)((unsigned long)raw_codedbuf)) + 16); /* skip 4DWs */ 5315dded681fc06f6f765840c45a5e6d57cdf79e561edward lin 5325dded681fc06f6f765840c45a5e6d57cdf79e561edward lin ptmp = (unsigned long *)((unsigned long)raw_codedbuf); 5335dded681fc06f6f765840c45a5e6d57cdf79e561edward lin vaCodedBufSeg[iPipeIndex].reserved = (ptmp[1] >> 6) & 0xf; 534eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix vaCodedBufSeg[iPipeIndex].next = NULL; 535eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix 536eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix 537ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding if (uiPipeNum == 2) { 538ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding /*The second part of coded buffer which generated by core 2 is the 539ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding * first part of encoded clip, while the first part of coded buffer 540ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding * is the second part of encoded clip.*/ 541eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix ++iPipeIndex; 542eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix vaCodedBufSeg[iPipeIndex - 1].next = &vaCodedBufSeg[iPipeIndex]; 543bb1e9267a518cf047f09350dd3ec19932f923e74gji tmp = vaCodedBufSeg[iPipeIndex].size = *(unsigned int *)((unsigned long)raw_codedbuf + uiBufOffset); 5444d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan 5454d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan /* 5464d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * This is used for DRM over WiDi which only uses H264 BP 5474d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * Tangier IED encryption operates on the chunks with 16bytes, and we must include 5484d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * the extra bytes beyond slice data as a whole chunk for decryption 5494d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan * We simply include the padding bytes regardless of IED enable or disable 5504d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan */ 5514d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan if (PROFILE_H264(obj_context->profile) && (tmp % 16 != 0)) { 5524d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan tmp = (tmp + 15) & (~15); 5534d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan drv_debug_msg(VIDEO_DEBUG_GENERAL,"Force slice size from %d to %d\n", 5544d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan vaCodedBufSeg[iPipeIndex].size, tmp); 5554d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan 5564d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan vaCodedBufSeg[iPipeIndex].size = tmp; 5574d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan } 5584d0eeaef88c523ad9fdc0a82f815ef3d989e4e35Austin Yuan 559bb1e9267a518cf047f09350dd3ec19932f923e74gji vaCodedBufSeg[iPipeIndex].buf = (unsigned char *)(((unsigned int *)((unsigned long)raw_codedbuf + uiBufOffset)) + 16); /* skip 4DWs */ 5605dded681fc06f6f765840c45a5e6d57cdf79e561edward lin vaCodedBufSeg[iPipeIndex].reserved = vaCodedBufSeg[iPipeIndex - 1].reserved; 561eb4e7a2a0d7357995e994c50d2185f966d6f1985pingshix vaCodedBufSeg[iPipeIndex].next = NULL; 562ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding } 563ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 564ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#ifdef _MRFL_DEBUG_CODED_ 565ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding psb__trace_coded(vaCodedBufSeg); 566ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#endif 567ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 568ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding return ; 569ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding} 570ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding 571437b3eda28a4bf098efa80598cab67f190275266Fei Jiang/* 572dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun * Return special data structure for codedbuffer 573437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * 574437b3eda28a4bf098efa80598cab67f190275266Fei Jiang * Returns 0 on success 575437b3eda28a4bf098efa80598cab67f190275266Fei Jiang */ 576437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define CONFIG(id) ((object_config_p) object_heap_lookup( &driver_data->config_heap, id )) 577437b3eda28a4bf098efa80598cab67f190275266Fei Jiang#define INIT_DRIVER_DATA psb_driver_data_p driver_data = (psb_driver_data_p) ctx->pDriverData; 578437b3eda28a4bf098efa80598cab67f190275266Fei Jiangint psb_codedbuf_map_mangle( 579dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun VADriverContextP ctx, 580dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun object_buffer_p obj_buffer, 581dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun void **pbuf /* out */ 582437b3eda28a4bf098efa80598cab67f190275266Fei Jiang) 583437b3eda28a4bf098efa80598cab67f190275266Fei Jiang{ 584437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_context_p obj_context = obj_buffer->context; 585437b3eda28a4bf098efa80598cab67f190275266Fei Jiang INIT_DRIVER_DATA; 586437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VACodedBufferSegment *p = &obj_buffer->codedbuf_mapinfo[0]; 587e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang unsigned char *raw_codedbuf; 588437b3eda28a4bf098efa80598cab67f190275266Fei Jiang VAStatus vaStatus = VA_STATUS_SUCCESS; 589dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun unsigned int next_buf_off; 5902befccec034c13d34746a9e87149889d59ac767bFei Jiang int i; 591dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 5926d37ae34fcae80f2e898b61e2506ed8e887bd16anguo CHECK_INVALID_PARAM(pbuf == NULL); 5932befccec034c13d34746a9e87149889d59ac767bFei Jiang 594dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (NULL == obj_context) { 595437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 596437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 597437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 598437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 599437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 600437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 601437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 602437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 603437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 6042befccec034c13d34746a9e87149889d59ac767bFei Jiang raw_codedbuf = *pbuf; 605437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* reset the mapinfo */ 606437b3eda28a4bf098efa80598cab67f190275266Fei Jiang memset(obj_buffer->codedbuf_mapinfo, 0, sizeof(obj_buffer->codedbuf_mapinfo)); 607437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 608437b3eda28a4bf098efa80598cab67f190275266Fei Jiang *pbuf = p = &obj_buffer->codedbuf_mapinfo[0]; 609f31d5416a60f83e184b0906a7ec77ba021840531hding#ifdef PSBVIDEO_MRFL 610f31d5416a60f83e184b0906a7ec77ba021840531hding if (IS_MRFL(driver_data)) { 611f31d5416a60f83e184b0906a7ec77ba021840531hding object_config_p obj_config = CONFIG(obj_context->config_id); 612f31d5416a60f83e184b0906a7ec77ba021840531hding if (NULL == obj_config) { 613f31d5416a60f83e184b0906a7ec77ba021840531hding vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 614f31d5416a60f83e184b0906a7ec77ba021840531hding DEBUG_FAILURE; 615f31d5416a60f83e184b0906a7ec77ba021840531hding 616f31d5416a60f83e184b0906a7ec77ba021840531hding psb_buffer_unmap(obj_buffer->psb_buffer); 617f31d5416a60f83e184b0906a7ec77ba021840531hding obj_buffer->buffer_data = NULL; 618f31d5416a60f83e184b0906a7ec77ba021840531hding 619f31d5416a60f83e184b0906a7ec77ba021840531hding return vaStatus; 620f31d5416a60f83e184b0906a7ec77ba021840531hding } 621f31d5416a60f83e184b0906a7ec77ba021840531hding 622e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin if (VAProfileJPEGBaseline != obj_config->profile 623e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 624e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /*Set frame skip flag*/ 625e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin tng_set_frame_skip_flag(obj_context); 626e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } 627f31d5416a60f83e184b0906a7ec77ba021840531hding switch (obj_config->profile) { 628e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4Simple: 629e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4AdvancedSimple: 630e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileMPEG4Main: 631e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 632e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264Baseline: 633e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264Main: 634e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264High: 635e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264StereoHigh: 636e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH264ConstrainedBaseline: 637e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileH263Baseline: 638e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /* 1st segment */ 639ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding tng_get_coded_data(obj_buffer, raw_codedbuf); 640ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#if 0 641e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->size = *((unsigned long *) raw_codedbuf); 642e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 16); /* skip 16DWs */ 643e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = NULL; 644430ce5c32361119ed81a62c918be6afbdd053eddhding#ifdef _MRFL_DEBUG_CODED_ 645e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin psb__trace_coded((unsigned int*)raw_codedbuf); 646ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding psb__trace_coded(p); 647ba4bbde36b64f076cfb1dd1783fe08e71a5fd671hding#endif 648430ce5c32361119ed81a62c918be6afbdd053eddhding#endif 649e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 650ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo case VAProfileVP8Version0_3: 651ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo { 652ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo /* multi segments*/ 653ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo struct VssVp8encEncodedFrame *t = (struct VssVp8encEncodedFrame *) (raw_codedbuf); 65420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo int concatenate = 1; 655025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo#if 0 65620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo for (i = 0; i < t->partitions - 1; i++) { 65720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo if (t->partition_start[i+1] != t->partition_start[i] + t->partition_size[i]) 65820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo concatenate = 0; 65920b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo } 660025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo#endif 66120b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo /* reference frame surface_id */ 6621e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo /* default is recon_buffer_mode ==0 */ 6631e6056363fa9a36f2014e9d0eb62f0bc4c7811d4Sun, Mingruo p->reserved = t->surfaceId_of_ref_frame[3]; 66420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo 66520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo if (concatenate) { 66620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo /* partitions are concatenate */ 66720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->buf = t->coded_data; 66820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->size = t->frame_size; 669f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun if(t->frame_size == 0){ 670f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun drv_debug_msg(VIDEO_DEBUG_ERROR,"Frame size is zero, Force it to 3, encoder status is 0x%x\n", t->status); 671f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun p->size = 3; 672f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun t->coded_data[0]=0; 673f9b37afdf8d0bdc0c570ded077bf9f834cc74fc3Bolun } 67420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->next = NULL; 67520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo } else { 67620b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo for (i = 0; i < t->partitions; i++) { 67720b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo /* partition not consecutive */ 67820b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->buf = t->coded_data + t->partition_start[i] - t->partition_start[0]; 679025f7c7e9643d6bffae04ee17b0e7cc29103bf8dSun, Mingruo p->size += t->partition_size[i]; 68020b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->next = &p[1]; 68120b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p++; 68220b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo } 68320b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p--; 68420b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo p->next = NULL; 68520b931cf997abb618b4e74770cf71378e14494f4Sun, Mingruo } 686ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo 687ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo break; 688ea2c7216b1b3a8b7a00ffd63ef4ae46c5e8f9fe5Sun, Mingruo } 689e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin case VAProfileJPEGBaseline: 690e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /* 3~6 segment */ 691e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin tng_jpeg_AppendMarkers(obj_context, raw_codedbuf); 692e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin next_buf_off = 0; 693e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin /*Max resolution 4096x4096 use 6 segments*/ 694e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin for (i = 0; i < PTG_JPEG_MAX_SCAN_NUM + 1; i++) { 695e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); /* ui32BytesUsed in HEADER_BUFFER*/ 696e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs (HEADER_BUFFER) */ 697e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); /* ui32Reserved3 in HEADER_BUFFER*/ 698e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 699e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 700e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 701e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 702e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin if (next_buf_off == 0) { 703e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = NULL; 704e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 705e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } else 706e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p->next = &p[1]; 707e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin p++; 708e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin } 709e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 710e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 711e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin default: 712e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 713e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin 714e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin psb_buffer_unmap(obj_buffer->psb_buffer); 715e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin obj_buffer->buffer_data = NULL; 716e79deb274ba55edd65e6c5d55f8e50954ff5b967edward lin break; 717f31d5416a60f83e184b0906a7ec77ba021840531hding } 718f31d5416a60f83e184b0906a7ec77ba021840531hding } 719f31d5416a60f83e184b0906a7ec77ba021840531hding#endif 72067612a448651896b2557796ff98d46c5e0dbbdc6hding#ifdef PSBVIDEO_MFLD 72167612a448651896b2557796ff98d46c5e0dbbdc6hding if (IS_MFLD(driver_data)){ /* MFLD */ 722437b3eda28a4bf098efa80598cab67f190275266Fei Jiang object_config_p obj_config = CONFIG(obj_context->config_id); 723437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 724437b3eda28a4bf098efa80598cab67f190275266Fei Jiang if (NULL == obj_config) { 725437b3eda28a4bf098efa80598cab67f190275266Fei Jiang vaStatus = VA_STATUS_ERROR_ALLOCATION_FAILED; 726437b3eda28a4bf098efa80598cab67f190275266Fei Jiang DEBUG_FAILURE; 727437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 728437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 729437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 730dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 731437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return vaStatus; 732437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 733dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 734dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (VAProfileJPEGBaseline != obj_config->profile 735bde3ed7517cc876cb2a6e174ea2a96a75938e787Kun Wang && (*((unsigned long *) raw_codedbuf + 1) & SKIP_NEXT_FRAME) != 0) { 736dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Set frame skip flag*/ 737dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_set_frame_skip_flag(obj_context); 738dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 739437b3eda28a4bf098efa80598cab67f190275266Fei Jiang switch (obj_config->profile) { 740437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Simple: 741437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4AdvancedSimple: 742437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileMPEG4Main: 743dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* one segment */ 744dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 745e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 746c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 747dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 7482befccec034c13d34746a9e87149889d59ac767bFei Jiang 749437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Baseline: 750437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264Main: 751437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH264High: 752dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun case VAProfileH264ConstrainedBaseline: 753fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang i = 0; 754fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang next_buf_off = ~0xf & (obj_buffer->size / pnw_get_parallel_core_number(obj_context)); 755f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (pnw_get_parallel_core_number(obj_context) == 2) { 756f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang /*The second part of coded buffer which generated by core 2 is the 757f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang * first part of encoded clip, while the first part of coded buffer 758f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang * is the second part of encoded clip.*/ 759f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].next = &p[i + 1]; 760f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 761f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].buf = (unsigned char *)(((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off)) + 4); /* skip 4DWs */ 762f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang 763f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 764f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 765f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 766f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 767f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i); 768f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 769f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "2nd segment coded buffer offset: 0x%08x, size: %d\n", 770f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang next_buf_off, p[i].size); 771f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang 772f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i++; 773fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang 774fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 775437b3eda28a4bf098efa80598cab67f190275266Fei Jiang /* 1st segment */ 776fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].size = *((unsigned long *) raw_codedbuf); 777fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang p[i].buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 778f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "1st segment coded buffer size %d\n", p[i].size); 779fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang if (GET_CODEDBUF_INFO(SLICE_NUM, obj_buffer->codedbuf_aux_info) <= 2 && 780f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang GET_CODEDBUF_INFO(NONE_VCL_NUM, obj_buffer->codedbuf_aux_info) == 0) { 781f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].status = VA_CODED_BUF_STATUS_SINGLE_NALU; 782f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_GENERAL, "Only VCL NAL in this segment %i of coded buffer\n", 783f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang i); 784f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 785f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang for (i = 0; i < pnw_get_parallel_core_number(obj_context); i++) { 786f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang if (p[i].size > (next_buf_off - sizeof(unsigned long) * 4)) { 787f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang drv_debug_msg(VIDEO_DEBUG_ERROR, "Coded segment %d is too large(%d)" 788f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang " and exceed segment boundary(offset %d)", i, p[i].size, next_buf_off); 789f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang p[i].size = next_buf_off - sizeof(unsigned long) * 4; 790f0f865c2db20a7b794606f7532b2de7c04a893c7Elaine Wang } 791fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang } 792437b3eda28a4bf098efa80598cab67f190275266Fei Jiang 793437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 7942befccec034c13d34746a9e87149889d59ac767bFei Jiang 795437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileH263Baseline: 796fa6f2e9012a890942a47eae9f6f1a0ddcd97e9a4Fei Jiang /* one segment */ 797dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *((unsigned long *) raw_codedbuf); 798e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *) raw_codedbuf + 4); /* skip 4DWs */ 799c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "coded buffer size %d\n", p->size); 800dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 8012befccec034c13d34746a9e87149889d59ac767bFei Jiang 802437b3eda28a4bf098efa80598cab67f190275266Fei Jiang case VAProfileJPEGBaseline: 803dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /* 3~6 segment 804dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun */ 805dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun pnw_jpeg_AppendMarkers(obj_context, raw_codedbuf); 806dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = 0; 807dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun /*Max resolution 4096x4096 use 6 segments*/ 808dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun for (i = 0; i < PNW_JPEG_MAX_SCAN_NUM + 1; i++) { 809dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->size = *(unsigned long *)((unsigned long)raw_codedbuf + next_buf_off); 810e9f11f100c212e9aeb194337ae43bbfea6a130dbKun Wang p->buf = (unsigned char *)((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 4); /* skip 4DWs */ 811dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun next_buf_off = *((unsigned long *)((unsigned long)raw_codedbuf + next_buf_off) + 3); 812dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 813c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer segment %d size: %d\n", i, p->size); 814c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_GENERAL, "JPEG coded buffer next segment %d offset: %d\n", i + 1, next_buf_off); 815dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 816dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun if (next_buf_off == 0) { 817dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = NULL; 818dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 819dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } else 820dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p->next = &p[1]; 821dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun p++; 822dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun } 823dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun break; 824dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 825437b3eda28a4bf098efa80598cab67f190275266Fei Jiang default: 826c60d5b7bdb5616ca37e0b912c10725bec4320f33Fei Jiang drv_debug_msg(VIDEO_DEBUG_ERROR, "unexpected case\n"); 827dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 828437b3eda28a4bf098efa80598cab67f190275266Fei Jiang psb_buffer_unmap(obj_buffer->psb_buffer); 829437b3eda28a4bf098efa80598cab67f190275266Fei Jiang obj_buffer->buffer_data = NULL; 830437b3eda28a4bf098efa80598cab67f190275266Fei Jiang break; 831437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 832437b3eda28a4bf098efa80598cab67f190275266Fei Jiang } 83367612a448651896b2557796ff98d46c5e0dbbdc6hding#endif 834dc1209519284865899ca8d990b3a2c7dbca8ae08wangkun 835437b3eda28a4bf098efa80598cab67f190275266Fei Jiang return 0; 836437b3eda28a4bf098efa80598cab67f190275266Fei Jiang} 8372f768e2db3e4074a6e9a3d5f0f6e321233d96e4cFei Jiang 838