16a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 160594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h> 170594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/Drm.h> 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu#include <Hwcomposer.h> 190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/tangier/TngGrallocBufferMapper.h> 200594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <ips/common/WsbmWrapper.h> 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 253413b71d9be6302c07d792b40cb232be5d683420Alistair StrachanTngGrallocBufferMapper::TngGrallocBufferMapper(gralloc_module_t const& module, 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DataBuffer& buffer) 27e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li : GrallocBufferMapperBase(buffer), 283413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan mGrallocModule(module), 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBufferObject(0) 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 31e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 3293123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna 3393123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna const native_handle_t *h = (native_handle_t *)mHandle; 3493123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna 3593123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna mClonedHandle = native_handle_create(h->numFds, h->numInts); 3693123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna if (mClonedHandle == 0) { 37df929beee6fa2a3c5b6125b7fd3087426de4150eDan Albert ELOGTRACE("Failed to create handle, out of memory!"); 3893123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna return; 3993123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna } 4093123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna for (int i = 0; i < h->numFds; i++) 4193123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna { 4293123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna mClonedHandle->data[i] = (h->data[i] >= 0) ? dup(h->data[i]) : -1; 4393123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna } 4493123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna memcpy(mClonedHandle->data + h->numFds, h->data + h->numFds, h->numInts*sizeof(int)); 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 476a6081a46a83da606cf21548879b37695adc7e1fAndy QiuTngGrallocBufferMapper::~TngGrallocBufferMapper() 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 49e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 5093123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna 5193123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna if (mClonedHandle == 0) 5293123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna return; 5393123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna native_handle_close(mClonedHandle); 5493123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna native_handle_delete(mClonedHandle); 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TngGrallocBufferMapper::gttMap(void *vaddr, 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t size, 596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t gttAlign, 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int *offset) 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu struct psb_gtt_mapping_arg arg; 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 654157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("vaddr = %p, size = %d", vaddr, size); 666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 67eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!vaddr || !size || !offset) { 684157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("invalid parameters"); 696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.type = PSB_GTT_MAP_TYPE_VIRTUAL; 736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.page_align = gttAlign; 746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vaddr = (uint32_t)vaddr; 756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.size = size; 766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 78e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ret = drm->writeReadIoctl(DRM_PSB_GTT_MAP, &arg, sizeof(arg)); 796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 804157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("gtt mapping failed"); 816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 844157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("offset = %#x", arg.offset_pages); 856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu *offset = arg.offset_pages; 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TngGrallocBufferMapper::gttUnmap(void *vaddr) 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu struct psb_gtt_mapping_arg arg; 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 944157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ALOGTRACE("vaddr = %p", vaddr); 956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!vaddr) { 974157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("invalid parameter"); 986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.type = PSB_GTT_MAP_TYPE_VIRTUAL; 1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu arg.vaddr = (uint32_t)vaddr; 1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 104eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Drm *drm = Hwcomposer::getInstance().getDrm(); 105e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li ret = drm->writeIoctl(DRM_PSB_GTT_UNMAP, &arg, sizeof(arg)); 106eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (ret == false) { 1074157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("gtt unmapping failed"); 1086a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1096a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1106a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1116a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 1126a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1136a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1146a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TngGrallocBufferMapper::map() 1156a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 116e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu void *vaddr[SUB_BUFFER_MAX]; 117e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu uint32_t size[SUB_BUFFER_MAX]; 1186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int gttOffsetInPage = 0; 1196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret; 1206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int err; 1216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i; 1226a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 123e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 1246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // get virtual address 1253413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan err = mGrallocModule.perform(&mGrallocModule, 1263413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG, 127bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil (buffer_handle_t)mClonedHandle, 128bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil vaddr, 129bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil size); 130e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu if (err) { 1314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map. err = %d", err); 132eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 133e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu } 1346a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 135e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu for (i = 0; i < SUB_BUFFER_MAX; i++) { 136e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // skip gtt mapping for empty sub buffers 137e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu if (!vaddr[i] || !size[i]) 138e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li continue; 139e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 1406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // map to gtt 141e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu ret = gttMap(vaddr[i], size[i], 0, >tOffsetInPage); 142e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!ret) { 1434157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("failed to map %d into gtt", i); 144eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 145e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 1466a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 147e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu mCpuAddress[i] = vaddr[i]; 148e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu mSize[i] = size[i]; 1496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage[i] = gttOffsetInPage; 150eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // TODO: set kernel handle 151eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mKHandle[i] = 0; 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 154eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == SUB_BUFFER_MAX) { 15547fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return true; 156eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 157eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 158eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 1596a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < SUB_BUFFER_MAX; i++) { 160eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCpuAddress[i]) { 1616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu gttUnmap(mCpuAddress[i]); 162eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 1636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 164eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 1653413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan err = mGrallocModule.perform(&mGrallocModule, 1663413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG, 167bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil (buffer_handle_t)mClonedHandle); 1686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TngGrallocBufferMapper::unmap() 1726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i; 174e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu int err; 1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 176e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 1776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < SUB_BUFFER_MAX; i++) { 1796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mCpuAddress[i]) 1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu gttUnmap(mCpuAddress[i]); 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage[i] = 0; 1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mCpuAddress[i] = 0; 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSize[i] = 0; 1856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1873413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan err = mGrallocModule.perform(&mGrallocModule, 1883413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG, 189bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil (buffer_handle_t)mClonedHandle); 190e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (err) { 1914157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to unmap. err = %d", err); 192e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 193e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu return err; 1946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 19647fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xieuint32_t TngGrallocBufferMapper::getKHandle(int subIndex) 19747fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie{ 19847fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie uint32_t ret = GrallocBufferMapperBase::getKHandle(subIndex); 19947fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie if (subIndex == 0 && ret == 0) { 20047fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie if (mapKhandle()) 20147fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return mKHandle[subIndex]; 20247fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie } 20347fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie 20447fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return ret; 20547fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie} 20647fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie 2073f1974031c88750a14adc8f2f49538837238abf9Lin Xiebool TngGrallocBufferMapper::mapKhandle() 2083f1974031c88750a14adc8f2f49538837238abf9Lin Xie{ 2093f1974031c88750a14adc8f2f49538837238abf9Lin Xie // TODO: this is a complete hack and temporary workaround 2103f1974031c88750a14adc8f2f49538837238abf9Lin Xie // need support from DDK to map khandle 2113f1974031c88750a14adc8f2f49538837238abf9Lin Xie void *wsbmBufferObject = 0; 2123f1974031c88750a14adc8f2f49538837238abf9Lin Xie int ret = psbWsbmWrapTTMBuffer2(mHandle, &wsbmBufferObject); 2133f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (ret != 0) { 2144157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Wrap ttm buffer failed!"); 2153f1974031c88750a14adc8f2f49538837238abf9Lin Xie return false; 2163f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2173f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2183f1974031c88750a14adc8f2f49538837238abf9Lin Xie ret = psbWsbmCreateFromUB(wsbmBufferObject, mWidth * mHeight, mCpuAddress[0]); 2193f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (ret != 0) { 2204157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Create from UB failed!"); 2213f1974031c88750a14adc8f2f49538837238abf9Lin Xie return false; 2223f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2233f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2243f1974031c88750a14adc8f2f49538837238abf9Lin Xie mKHandle[0] = psbWsbmGetKBufHandle(wsbmBufferObject); 2253f1974031c88750a14adc8f2f49538837238abf9Lin Xie psbWsbmUnReference(wsbmBufferObject); 2263f1974031c88750a14adc8f2f49538837238abf9Lin Xie return true; 2273f1974031c88750a14adc8f2f49538837238abf9Lin Xie} 2283f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2293555e1ff071400446170ddc209bbb9fa0e40c502fu jinuint32_t TngGrallocBufferMapper::getFbHandle(int subIndex) 2303555e1ff071400446170ddc209bbb9fa0e40c502fu jin{ 2313555e1ff071400446170ddc209bbb9fa0e40c502fu jin void *vaddr[SUB_BUFFER_MAX]; 2323555e1ff071400446170ddc209bbb9fa0e40c502fu jin uint32_t size[SUB_BUFFER_MAX]; 2333555e1ff071400446170ddc209bbb9fa0e40c502fu jin int err; 2343555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2353555e1ff071400446170ddc209bbb9fa0e40c502fu jin CTRACE(); 2363555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2373555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (subIndex < 0 || subIndex >= SUB_BUFFER_MAX) { 2383555e1ff071400446170ddc209bbb9fa0e40c502fu jin return 0; 2393555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2403555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2413555e1ff071400446170ddc209bbb9fa0e40c502fu jin // get virtual address 2423413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan err = mGrallocModule.perform(&mGrallocModule, 2433413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan GRALLOC_MODULE_GET_BUFFER_CPU_ADDRESSES_IMG, 244bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil (buffer_handle_t)mClonedHandle, 245bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil vaddr, 246bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil size); 2473555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (err) { 2484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map. err = %d", err); 2493555e1ff071400446170ddc209bbb9fa0e40c502fu jin return 0; 2503555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2513555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2523555e1ff071400446170ddc209bbb9fa0e40c502fu jin return (uint32_t)vaddr[subIndex]; 2533555e1ff071400446170ddc209bbb9fa0e40c502fu jin} 2543555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2553555e1ff071400446170ddc209bbb9fa0e40c502fu jinvoid TngGrallocBufferMapper::putFbHandle() 2563555e1ff071400446170ddc209bbb9fa0e40c502fu jin{ 2573413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan int err = mGrallocModule.perform(&mGrallocModule, 2583413b71d9be6302c07d792b40cb232be5d683420Alistair Strachan GRALLOC_MODULE_PUT_BUFFER_CPU_ADDRESSES_IMG, 259bacdfbde97131d12c92bf832ce9d7db6de4598d8Vinil Cheeramvelil (buffer_handle_t)mClonedHandle); 2603555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (err) { 2614157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to unmap. err = %d", err); 2623555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2633555e1ff071400446170ddc209bbb9fa0e40c502fu jin return; 2643555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2653555e1ff071400446170ddc209bbb9fa0e40c502fu jin} 2663f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 2686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 269