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