12480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*
22480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Copyright (C) 2008 The Android Open Source Project
32480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
42480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Licensed under the Apache License, Version 2.0 (the "License");
52480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * you may not use this file except in compliance with the License.
62480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * You may obtain a copy of the License at
72480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
82480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *      http://www.apache.org/licenses/LICENSE-2.0
92480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Unless required by applicable law or agreed to in writing, software
112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * distributed under the License is distributed on an "AS IS" BASIS,
122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * See the License for the specific language governing permissions and
142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * limitations under the License.
152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */
162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#ifdef HAVE_ANDROID_OS      // just want PAGE_SIZE define
182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <asm/page.h>
192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#else
202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <sys/user.h>
212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#endif
222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <limits.h>
232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <unistd.h>
242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <fcntl.h>
252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <errno.h>
262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <pthread.h>
272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <stdlib.h>
282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <string.h>
292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/mman.h>
312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/stat.h>
322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/types.h>
332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/ioctl.h>
342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <ion/ion.h>
362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <linux/ion.h>
372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/log.h>
382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/atomic.h>
392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/hardware.h>
412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/gralloc.h>
422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gralloc_priv.h"
442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "exynos_format.h"
452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gr.h"
462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4788c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_EXYNOS_CONTIG_MASK (1 << 4)
48ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_FIMD_VIDEO_MASK  (1 << 28)
49ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_MFC_OUTPUT_MASK  (1 << 26)
50ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_MFC_INPUT_MASK   (1 << 25)
5188c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_SYSTEM_ID          0
5288c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_EXYNOS_CONTIG_ID   4
5388c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_CHUNK_ID           6
54ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin#define MB_1 (1024*1024)
55ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
56788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t {
602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    alloc_device_t  device;
612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    /* our private data here */
622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev,
652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                size_t size, int usage, buffer_handle_t* pHandle);
662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name,
702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                   hw_device_t** device);
712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name,
732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                               hw_device_t** device);
742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module,
762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle, int usage,
772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        int l, int t, int w, int h,
782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        void** vaddr);
792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module,
812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                          buffer_handle_t handle);
822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module,
842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                   buffer_handle_t handle);
852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module,
872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                     buffer_handle_t handle);
882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = {
922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open
932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = {
962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: {
97a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    common: {
98a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        tag: HARDWARE_MODULE_TAG,
99a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        version_major: 1,
100a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        version_minor: 0,
101a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        id: GRALLOC_HARDWARE_MODULE_ID,
102a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        name: "Graphics Memory Allocator Module",
103a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        author: "The Android Open Source Project",
104a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        methods: &gralloc_module_methods
105a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    },
106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    registerBuffer: gralloc_register_buffer,
107ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unregisterBuffer: gralloc_unregister_buffer,
108ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    lock: gralloc_lock,
109ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unlock: gralloc_unlock,
110a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin},
111a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinframebuffer: 0,
112a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinflags: 0,
113a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinnumBuffers: 0,
114a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinbufferMask: 0,
115a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinlock: PTHREAD_MUTEX_INITIALIZER,
116a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavincurrentBuffer: 0,
117a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinionfd: -1,
1182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
1192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
1212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
122788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kimstatic unsigned int _select_heap(int usage)
123788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim{
124788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask;
125788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
126788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    if (usage & GRALLOC_USAGE_PROTECTED)
12788c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin        heap_mask = (1 << ION_HEAP_EXYNOS_CONTIG_ID);
128788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    else
12988c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin        heap_mask = (1 << ION_HEAP_SYSTEM_ID) | (1 << ION_HEAP_CHUNK_ID);
130788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
131788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    return heap_mask;
132788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim}
133788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
134da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage,
135da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                             unsigned int ion_flags, private_handle_t **hnd, int *stride)
1362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
137ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    size_t size, bpr, alignment = 0;
13870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    int bpp = 0, vstride, fd, err;
139788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask = _select_heap(usage);
140788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
1412207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann    if (format == HAL_PIXEL_FORMAT_RGBA_8888) {
1422207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann        bool sw_usage = !!(usage & (GRALLOC_USAGE_SW_READ_MASK |
1432207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann                GRALLOC_USAGE_SW_WRITE_MASK));
1442207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann
1452207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann        if (usage & GRALLOC_USAGE_HW_FB) {
1462207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann            ALOGW_IF(sw_usage,
1472207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann                    "framebuffer target should not have SW usage bits; ignoring");
1482207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann            format = HAL_PIXEL_FORMAT_BGRA_8888;
1492207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann        } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
1502207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann            if (sw_usage)
1512207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann                return -EINVAL;
1522207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann            format = HAL_PIXEL_FORMAT_BGRA_8888;
1532207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann        }
154efe80f0e5961d233e54c788d51d08fbd689297a5Greg Hackmann    }
155efe80f0e5961d233e54c788d51d08fbd689297a5Greg Hackmann
1562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
1572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_8888:
1582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBX_8888:
1592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BGRA_8888:
1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 4;
1612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_888:
1632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 3;
1642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_565:
1662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 2;
1682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BLOB:
170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            *stride = w;
171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            vstride = h;
17239433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin            size = w * h;
1732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
1752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            return -EINVAL;
1762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
177d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin
178d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    if (format != HAL_PIXEL_FORMAT_BLOB) {
179472449a8299bb7a2a512caaa60424cdbb8e84a97Bartosz Szatkowski        bpr = ALIGN(w*bpp, 64);
180d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        vstride = ALIGN(h, 16);
1814cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann        if (vstride < h + 2)
1824cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann            size = bpr * (h + 2);
183d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        else
184d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            size = bpr * vstride;
185d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        *stride = bpr / bpp;
186d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        size = ALIGN(size, PAGE_SIZE);
187d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    }
1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
189ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    if (usage & GRALLOC_USAGE_PROTECTED) {
190ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin        alignment = MB_1;
191ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim        ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK;
192ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    }
193ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
194ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags,
195da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       &fd);
196da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride,
197da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                vstride);
1982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
20255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       int usage, unsigned int ion_flags,
20455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       private_handle_t **hnd, int *stride)
20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{
20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size_t size;
20755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    int err, fd;
20888c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin    unsigned int heap_mask = _select_heap(usage);
20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    switch (format) {
21155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = ALIGN(w, 16);
213d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin            size = (*stride * h) + (ALIGN(*stride / 2, 16) * h);
21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = w;
217d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin            size = *stride * h * 3 / 2;
21855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
21955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        default:
220bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
221bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
22255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    }
22355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
22488c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags, &fd);
22555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    if (err)
22655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        return err;
22755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
22855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h);
22955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    return err;
23055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin}
23155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
23255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format,
23355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             int usage, unsigned int ion_flags,
23455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             private_handle_t **hnd, int *stride)
2352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t luma_size, chroma_size;
2372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err, planes, fd, fd1, fd2 = 0;
23870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size_t luma_vstride;
239788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask = _select_heap(usage);
240788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
2412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = ALIGN(w, 16);
2422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2437d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
2447d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags);
2457d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) {
2467d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
2477d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_TEXTURE) {
2487d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
2497d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
2507d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M
2517d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
2527d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    }
2532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
254c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YV12:
255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
2566cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim                *stride = ALIGN(w, 32);
257bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 16);
258bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
259bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
260bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 3;
261bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
262bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
263c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
2642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
2652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
266bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
267bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                size_t chroma_vstride = ALIGN(h / 2, 32);
268bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 32);
269bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
270bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = chroma_vstride * *stride;
271bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 2;
272bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
273bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
27455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
27555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
27655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage,
27755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                               ion_flags, hnd, stride);
2787d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        case HAL_PIXEL_FORMAT_YCbCr_422_I:
2797d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            {
2807d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_vstride = h;
2817d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_size = luma_vstride * *stride * 2;
2827d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                chroma_size = 0;
2837d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                planes = 1;
2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                break;
2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            }
2862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
287bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
288bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
2892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
291ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim    if (usage & GRALLOC_USAGE_PROTECTED)
292ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim	ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK;
293ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
294788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd);
2952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (planes == 1) {
2987d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        *hnd = new private_handle_t(fd, luma_size, usage, w, h,
299ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin                                    format, *stride, luma_vstride);
300ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    } else {
3017d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1);
3027d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (err)
3037d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            goto err1;
3047d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (planes == 3) {
3057d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2);
3067d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            if (err)
3077d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                goto err2;
3087d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang
3097d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h,
3107d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        format, *stride, luma_vstride);
3117d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else {
3127d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format,
3137d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        *stride, luma_vstride);
3147d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
315ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    }
31606f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    // Set chroma & gamut fields
31706f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    if (!err && *hnd) {
31806f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        if (usage & GRALLOC_USAGE_PRIVATE_CHROMA) {
31906f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->chroma = HAL_PIXEL_CHROMA_BT601_8;
32006f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->gamut = HAL_PIXEL_GAMUT_NARROW_8;
32106f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        } else {
32206f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->chroma = HAL_PIXEL_CHROMA_BT709_8;
32306f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->gamut = HAL_PIXEL_GAMUT_WIDE_8;
32406f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        }
32506f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    }
3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2:
3292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd1);
3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1:
3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd);
3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev,
3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         int w, int h, int format, int usage,
3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         buffer_handle_t* pHandle, int* pStride)
3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int stride;
3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err;
341da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    unsigned int ion_flags = 0;
342a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    private_handle_t *hnd = NULL;
3432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!pHandle || !pStride)
3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN )
348f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin        ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC;
3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_module_t* m = reinterpret_cast<private_module_t*>
3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>
3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
355da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd,
356da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                            &stride);
3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
358da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags,
359da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                &hnd, &stride);
3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
3622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err != 0)
3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err;
3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pHandle = hnd;
3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pStride = stride;
3682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr:
370a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    if (!hnd)
371a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        return err;
3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
373ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
375ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev,
3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle)
3822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (private_handle_t::validate(handle) < 0)
3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                                                   dev->common.module);
3895258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin    if (hnd->base)
3905258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin        grallocUnmap(module, const_cast<private_handle_t*>(hnd));
3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
393ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
395ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    delete hnd;
3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev)
4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev);
4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (ctx) {
4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* TODO: keep a list of all buffer_handle_t created, and free them
4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         * all here.
4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         */
4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        free(ctx);
4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name,
4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        hw_device_t** device)
4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
4192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int status = -EINVAL;
4202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
4212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        gralloc_context_t *dev;
4222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev = (gralloc_context_t*)malloc(sizeof(*dev));
4232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize our state here */
4252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        memset(dev, 0, sizeof(*dev));
4262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize the procs */
4282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.tag = HARDWARE_DEVICE_TAG;
4292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.version = 0;
4302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.module = const_cast<hw_module_t*>(module);
4312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.close = gralloc_close;
4322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.alloc = gralloc_alloc;
4342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.free = gralloc_free;
4352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module);
4372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        p->ionfd = ion_open();
4382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        *device = &dev->device.common;
4402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = 0;
4412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    } else {
4422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = fb_device_open(module, name, device);
4432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
4442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return status;
4452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
446