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, &gttOffsetInPage);
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