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 <ips/common/TTMBufferMapper.h> 186a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 196a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace android { 206a6081a46a83da606cf21548879b37695adc7e1fAndy Qiunamespace intel { 216a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 226a6081a46a83da606cf21548879b37695adc7e1fAndy QiuTTMBufferMapper::TTMBufferMapper(Wsbm& wsbm, DataBuffer& buffer) 236a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu : BufferMapper(buffer), 246a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mRefCount(0), 256a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mWsbm(wsbm), 266a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBufferObject(0), 276a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage(0), 286a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mCpuAddress(0), 296a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSize(0) 306a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 31e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 326a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 336a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 346a6081a46a83da606cf21548879b37695adc7e1fAndy QiuTTMBufferMapper::~TTMBufferMapper() 356a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 36e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 376a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 386a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 396a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TTMBufferMapper::map() 406a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 416a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu void *wsbmBufferObject = 0; 426a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t handle; 436a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu void *virtAddr; 446a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu uint32_t gttOffsetInPage; 456a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 46e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 476a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 486a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu handle = getHandle(); 496a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 506a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu bool ret = mWsbm.wrapTTMBuffer(handle, &wsbmBufferObject); 516a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 524157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to map TTM buffer"); 536a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 546a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 556a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 566a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // TODO: review this later 576a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu ret = mWsbm.waitIdleTTMBuffer(wsbmBufferObject); 586a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (ret == false) { 594157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE("failed to wait ttm buffer idle"); 606a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 616a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 626a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 636a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu virtAddr = mWsbm.getCPUAddress(wsbmBufferObject); 646a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu gttOffsetInPage = mWsbm.getGttOffset(wsbmBufferObject); 656a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 666a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!gttOffsetInPage || !virtAddr) { 674157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev WLOGTRACE("offset = %#x, addr = %p.", gttOffsetInPage, virtAddr); 686a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 696a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu } 706a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 716a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu // update parameters 726a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mBufferObject = wsbmBufferObject; 736a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage = gttOffsetInPage; 746a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mCpuAddress = virtAddr; 756a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSize = 0; 766a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 776a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 786a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 796a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TTMBufferMapper::unmap() 806a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 81e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); 826a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 836a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu if (!mBufferObject) 846a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return false; 856a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 866a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mWsbm.unreferenceTTMBuffer(mBufferObject); 876a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 886a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mGttOffsetInPage = 0; 896a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mCpuAddress = 0; 906a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu mSize = 0; 913f1974031c88750a14adc8f2f49538837238abf9Lin Xie mBufferObject = 0; 926a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return true; 936a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 946a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 956a6081a46a83da606cf21548879b37695adc7e1fAndy Qiubool TTMBufferMapper::waitIdle() 966a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu{ 976a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu return mWsbm.waitIdleTTMBuffer(mBufferObject); 986a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} 996a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1006a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace intel 1016a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu} // namespace android 1026a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 1036a6081a46a83da606cf21548879b37695adc7e1fAndy Qiu 104