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