gralloc.cpp revision ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8
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
47788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim#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)
51ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin#define MB_1 (1024*1024)
52ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
53788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t {
572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    alloc_device_t  device;
582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    /* our private data here */
592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev,
622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                size_t size, int usage, buffer_handle_t* pHandle);
632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name,
672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                   hw_device_t** device);
682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name,
702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                               hw_device_t** device);
712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module,
732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle, int usage,
742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        int l, int t, int w, int h,
752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        void** vaddr);
762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module,
782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                          buffer_handle_t handle);
792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module,
812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                   buffer_handle_t handle);
822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module,
842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                     buffer_handle_t handle);
852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = {
892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open
902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = {
932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: {
94a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    common: {
95a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        tag: HARDWARE_MODULE_TAG,
96a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        version_major: 1,
97a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        version_minor: 0,
98a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        id: GRALLOC_HARDWARE_MODULE_ID,
99a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        name: "Graphics Memory Allocator Module",
100a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        author: "The Android Open Source Project",
101a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        methods: &gralloc_module_methods
102a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    },
103ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    registerBuffer: gralloc_register_buffer,
104ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unregisterBuffer: gralloc_unregister_buffer,
105ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    lock: gralloc_lock,
106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unlock: gralloc_unlock,
107a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin},
108a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinframebuffer: 0,
109a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinflags: 0,
110a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinnumBuffers: 0,
111a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinbufferMask: 0,
112a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinlock: PTHREAD_MUTEX_INITIALIZER,
113a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavincurrentBuffer: 0,
114a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinionfd: -1,
1152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
1162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
1182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
119788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kimstatic unsigned int _select_heap(int usage)
120788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim{
121788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask;
122788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
123788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    if (usage & GRALLOC_USAGE_PROTECTED)
124788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim        heap_mask = ION_HEAP_EXYNOS_CONTIG_MASK;
125788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    else
126788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim        heap_mask = ION_HEAP_SYSTEM_MASK;
127788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
128788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    return heap_mask;
129788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim}
130788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
131da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage,
132da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                             unsigned int ion_flags, private_handle_t **hnd, int *stride)
1332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
134ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    size_t size, bpr, alignment = 0;
13570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    int bpp = 0, vstride, fd, err;
136788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask = _select_heap(usage);
137788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
1382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
1392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_8888:
1402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBX_8888:
1412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BGRA_8888:
1422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 4;
1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_888:
1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 3;
1462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_565:
1482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_5551:
1492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_4444:
1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 2;
1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BLOB:
154d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            *stride = w;
155d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            vstride = h;
15639433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin            size = w * h;
1572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
1592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            return -EINVAL;
1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
161d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin
162d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    if (format != HAL_PIXEL_FORMAT_BLOB) {
163d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        bpr = ALIGN(w*bpp, 16);
164d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        vstride = ALIGN(h, 16);
1654cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann        if (vstride < h + 2)
1664cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann            size = bpr * (h + 2);
167d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        else
168d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            size = bpr * vstride;
169d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        *stride = bpr / bpp;
170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        size = ALIGN(size, PAGE_SIZE);
171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    }
1722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
173ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    if (usage & GRALLOC_USAGE_PROTECTED) {
174ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin        alignment = MB_1;
175ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim        ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK;
176ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    }
177ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
178ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags,
179da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       &fd);
180da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride,
181da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                vstride);
1822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
1842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
1852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
18655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
18755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       int usage, unsigned int ion_flags,
18855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       private_handle_t **hnd, int *stride)
18955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{
19055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size_t size;
19155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    int err, fd;
19255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
19355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    switch (format) {
19455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
19555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = ALIGN(w, 16);
19655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
19755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
19855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = w;
19955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
20055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        default:
201bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
202bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    }
20455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size = *stride * h * 3 / 2;
20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
20755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                       ion_flags, &fd);
20855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    if (err)
20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        return err;
21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h);
21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    return err;
21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin}
21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format,
21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             int usage, unsigned int ion_flags,
21755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             private_handle_t **hnd, int *stride)
2182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t luma_size, chroma_size;
2202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err, planes, fd, fd1, fd2 = 0;
22170212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size_t luma_vstride;
222788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask = _select_heap(usage);
223788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = ALIGN(w, 16);
2252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2267d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
2277d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags);
2287d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) {
2297d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
2307d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_TEXTURE) {
2317d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
2327d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
2337d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M
2347d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
2357d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    }
2362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
237c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YV12:
238bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
2396cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim                *stride = ALIGN(w, 32);
240bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 16);
241bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
242bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
243bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 3;
244bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
245bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
246c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
2472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
2482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
249bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
250bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                size_t chroma_vstride = ALIGN(h / 2, 32);
251bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 32);
252bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
253bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = chroma_vstride * *stride;
254bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 2;
255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
256bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
25755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
25855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
25955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage,
26055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                               ion_flags, hnd, stride);
2617d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        case HAL_PIXEL_FORMAT_YCbCr_422_I:
2627d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            {
2637d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_vstride = h;
2647d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_size = luma_vstride * *stride * 2;
2657d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                chroma_size = 0;
2667d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                planes = 1;
2677d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                break;
2687d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            }
2692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
270bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
271bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
2722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
274ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim    if (usage & GRALLOC_USAGE_PROTECTED)
275ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim	ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK;
276ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
277788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd);
2782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
2807d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (planes == 1) {
2817d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        *hnd = new private_handle_t(fd, luma_size, usage, w, h,
282ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin                                    format, *stride, luma_vstride);
283ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    } else {
2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1);
2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (err)
2867d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            goto err1;
2877d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (planes == 3) {
2887d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2);
2897d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            if (err)
2907d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                goto err2;
2917d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang
2927d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h,
2937d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        format, *stride, luma_vstride);
2947d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else {
2957d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format,
2967d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        *stride, luma_vstride);
2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
298ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    }
2992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2:
3022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd1);
3032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1:
3042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd);
3052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev,
3092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         int w, int h, int format, int usage,
3102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         buffer_handle_t* pHandle, int* pStride)
3112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int stride;
3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err;
314da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    unsigned int ion_flags = 0;
315a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    private_handle_t *hnd = NULL;
3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!pHandle || !pStride)
3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN )
321f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin        ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC;
3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_module_t* m = reinterpret_cast<private_module_t*>
3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>
3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
328da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd,
329da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                            &stride);
3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
331da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags,
332da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                &hnd, &stride);
3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err != 0)
3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err;
3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pHandle = hnd;
3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pStride = stride;
3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr:
343a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    if (!hnd)
344a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        return err;
3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
346ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
348ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev,
3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle)
3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (private_handle_t::validate(handle) < 0)
3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                                                   dev->common.module);
3625258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin    if (hnd->base)
3635258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin        grallocUnmap(module, const_cast<private_handle_t*>(hnd));
3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
366ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
368ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    delete hnd;
3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
3762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev)
3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev);
3802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (ctx) {
3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* TODO: keep a list of all buffer_handle_t created, and free them
3822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         * all here.
3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         */
3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        free(ctx);
3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name,
3902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        hw_device_t** device)
3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int status = -EINVAL;
3932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        gralloc_context_t *dev;
3952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev = (gralloc_context_t*)malloc(sizeof(*dev));
3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize our state here */
3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        memset(dev, 0, sizeof(*dev));
3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize the procs */
4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.tag = HARDWARE_DEVICE_TAG;
4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.version = 0;
4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.module = const_cast<hw_module_t*>(module);
4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.close = gralloc_close;
4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.alloc = gralloc_alloc;
4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.free = gralloc_free;
4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module);
4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        p->ionfd = ion_open();
4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        *device = &dev->device.common;
4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = 0;
4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    } else {
4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = fb_device_open(module, name, device);
4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return status;
4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
419