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 256a6081a46a83da606cf21548879b37695adc7e1fAndy QiuTngGrallocBufferMapper::TngGrallocBufferMapper(IMG_gralloc_module_public_t& module, 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu DataBuffer& buffer) 27e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li : GrallocBufferMapperBase(buffer), 286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mIMGGrallocModule(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) { 3793123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna ALOGE("%s: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 125e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu err = mIMGGrallocModule.getCpuAddress(&mIMGGrallocModule, 12693123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna (buffer_handle_t)mClonedHandle, 127e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu vaddr, 128e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu size); 129e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu if (err) { 1304157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map. err = %d", err); 131eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 132e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu } 1336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 134e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu for (i = 0; i < SUB_BUFFER_MAX; i++) { 135e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li // skip gtt mapping for empty sub buffers 136e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu if (!vaddr[i] || !size[i]) 137e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li continue; 138e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li 1396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // map to gtt 140e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu ret = gttMap(vaddr[i], size[i], 0, >tOffsetInPage); 141e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li if (!ret) { 1424157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev VLOGTRACE("failed to map %d into gtt", i); 143eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 144e6ecdadd57e79c2218b3e6ae407f12599f33bd22Jackie Li } 1456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 146e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu mCpuAddress[i] = vaddr[i]; 147e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu mSize[i] = size[i]; 1486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage[i] = gttOffsetInPage; 149eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // TODO: set kernel handle 150eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mKHandle[i] = 0; 1516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1526a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 153eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == SUB_BUFFER_MAX) { 15447fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return true; 155eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 156eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 157eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // error handling 1586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < SUB_BUFFER_MAX; i++) { 159eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCpuAddress[i]) { 1606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu gttUnmap(mCpuAddress[i]); 161eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 1626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 163eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 164e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu err = mIMGGrallocModule.putCpuAddress(&mIMGGrallocModule, 16593123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna (buffer_handle_t)mClonedHandle); 1666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 1676a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TngGrallocBufferMapper::unmap() 1706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 1716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu int i; 172e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu int err; 1736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 174e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 1756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu for (i = 0; i < SUB_BUFFER_MAX; i++) { 1776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (mCpuAddress[i]) 1786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu gttUnmap(mCpuAddress[i]); 1796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage[i] = 0; 1816a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mCpuAddress[i] = 0; 1826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSize[i] = 0; 1836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 1846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 185e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu err = mIMGGrallocModule.putCpuAddress(&mIMGGrallocModule, 18693123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna (buffer_handle_t)mClonedHandle); 187e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (err) { 1884157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to unmap. err = %d", err); 189e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } 190e8344084d2e34c2bbd8cf465704a752b7499e047Austin Hu return err; 1916a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 1926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 19347fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xieuint32_t TngGrallocBufferMapper::getKHandle(int subIndex) 19447fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie{ 19547fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie uint32_t ret = GrallocBufferMapperBase::getKHandle(subIndex); 19647fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie if (subIndex == 0 && ret == 0) { 19747fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie if (mapKhandle()) 19847fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return mKHandle[subIndex]; 19947fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie } 20047fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie 20147fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie return ret; 20247fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie} 20347fc445a4dbc3f7d6d71139ed82a114e59616b0bLin Xie 2043f1974031c88750a14adc8f2f49538837238abf9Lin Xiebool TngGrallocBufferMapper::mapKhandle() 2053f1974031c88750a14adc8f2f49538837238abf9Lin Xie{ 2063f1974031c88750a14adc8f2f49538837238abf9Lin Xie // TODO: this is a complete hack and temporary workaround 2073f1974031c88750a14adc8f2f49538837238abf9Lin Xie // need support from DDK to map khandle 2083f1974031c88750a14adc8f2f49538837238abf9Lin Xie void *wsbmBufferObject = 0; 2093f1974031c88750a14adc8f2f49538837238abf9Lin Xie int ret = psbWsbmWrapTTMBuffer2(mHandle, &wsbmBufferObject); 2103f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (ret != 0) { 2114157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Wrap ttm buffer failed!"); 2123f1974031c88750a14adc8f2f49538837238abf9Lin Xie return false; 2133f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2143f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2153f1974031c88750a14adc8f2f49538837238abf9Lin Xie ret = psbWsbmCreateFromUB(wsbmBufferObject, mWidth * mHeight, mCpuAddress[0]); 2163f1974031c88750a14adc8f2f49538837238abf9Lin Xie if (ret != 0) { 2174157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("Create from UB failed!"); 2183f1974031c88750a14adc8f2f49538837238abf9Lin Xie return false; 2193f1974031c88750a14adc8f2f49538837238abf9Lin Xie } 2203f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2213f1974031c88750a14adc8f2f49538837238abf9Lin Xie mKHandle[0] = psbWsbmGetKBufHandle(wsbmBufferObject); 2223f1974031c88750a14adc8f2f49538837238abf9Lin Xie psbWsbmUnReference(wsbmBufferObject); 2233f1974031c88750a14adc8f2f49538837238abf9Lin Xie return true; 2243f1974031c88750a14adc8f2f49538837238abf9Lin Xie} 2253f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2263555e1ff071400446170ddc209bbb9fa0e40c502fu jinuint32_t TngGrallocBufferMapper::getFbHandle(int subIndex) 2273555e1ff071400446170ddc209bbb9fa0e40c502fu jin{ 2283555e1ff071400446170ddc209bbb9fa0e40c502fu jin void *vaddr[SUB_BUFFER_MAX]; 2293555e1ff071400446170ddc209bbb9fa0e40c502fu jin uint32_t size[SUB_BUFFER_MAX]; 2303555e1ff071400446170ddc209bbb9fa0e40c502fu jin int err; 2313555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2323555e1ff071400446170ddc209bbb9fa0e40c502fu jin CTRACE(); 2333555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2343555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (subIndex < 0 || subIndex >= SUB_BUFFER_MAX) { 2353555e1ff071400446170ddc209bbb9fa0e40c502fu jin return 0; 2363555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2373555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2383555e1ff071400446170ddc209bbb9fa0e40c502fu jin // get virtual address 2393555e1ff071400446170ddc209bbb9fa0e40c502fu jin err = mIMGGrallocModule.getCpuAddress(&mIMGGrallocModule, 24093123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna (buffer_handle_t)mClonedHandle, 2413555e1ff071400446170ddc209bbb9fa0e40c502fu jin vaddr, 2423555e1ff071400446170ddc209bbb9fa0e40c502fu jin size); 2433555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (err) { 2444157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map. err = %d", err); 2453555e1ff071400446170ddc209bbb9fa0e40c502fu jin return 0; 2463555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2473555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2483555e1ff071400446170ddc209bbb9fa0e40c502fu jin return (uint32_t)vaddr[subIndex]; 2493555e1ff071400446170ddc209bbb9fa0e40c502fu jin} 2503555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2513555e1ff071400446170ddc209bbb9fa0e40c502fu jinvoid TngGrallocBufferMapper::putFbHandle() 2523555e1ff071400446170ddc209bbb9fa0e40c502fu jin{ 2533555e1ff071400446170ddc209bbb9fa0e40c502fu jin int err = mIMGGrallocModule.putCpuAddress(&mIMGGrallocModule, 25493123be3e7cb3933e81cf9c8f1cc1e67283bb73bPradeep Radhakrishna (buffer_handle_t)mClonedHandle); 2553555e1ff071400446170ddc209bbb9fa0e40c502fu jin if (err) { 2564157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to unmap. err = %d", err); 2573555e1ff071400446170ddc209bbb9fa0e40c502fu jin } 2583555e1ff071400446170ddc209bbb9fa0e40c502fu jin return; 2593555e1ff071400446170ddc209bbb9fa0e40c502fu jin 2603555e1ff071400446170ddc209bbb9fa0e40c502fu jin} 2613f1974031c88750a14adc8f2f49538837238abf9Lin Xie 2626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 2636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 264