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
1412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
1422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_8888:
1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBX_8888:
1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BGRA_8888:
1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 4;
1462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_888:
1482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 3;
1492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_565:
1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_5551:
1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_4444:
1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 2;
1552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BLOB:
157d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            *stride = w;
158d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            vstride = h;
15939433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin            size = w * h;
1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
1622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            return -EINVAL;
1632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
164d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin
165d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    if (format != HAL_PIXEL_FORMAT_BLOB) {
166472449a8299bb7a2a512caaa60424cdbb8e84a97Bartosz Szatkowski        bpr = ALIGN(w*bpp, 64);
167d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        vstride = ALIGN(h, 16);
1684cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann        if (vstride < h + 2)
1694cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann            size = bpr * (h + 2);
170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        else
171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin            size = bpr * vstride;
172d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        *stride = bpr / bpp;
173d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin        size = ALIGN(size, PAGE_SIZE);
174d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin    }
1752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
176ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    if (usage & GRALLOC_USAGE_PROTECTED) {
177ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin        alignment = MB_1;
178ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim        ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK;
179ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    }
180ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
181ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags,
182da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       &fd);
183da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride,
184da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                vstride);
1852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
1872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
18955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
19055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       int usage, unsigned int ion_flags,
19155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       private_handle_t **hnd, int *stride)
19255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{
19355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size_t size;
19455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    int err, fd;
19588c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin    unsigned int heap_mask = _select_heap(usage);
19655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
19755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    switch (format) {
19855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
19955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = ALIGN(w, 16);
200d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin            size = (*stride * h) + (ALIGN(*stride / 2, 16) * h);
20155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
20255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = w;
204d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin            size = *stride * h * 3 / 2;
20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        default:
207bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
208bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    }
21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21188c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags, &fd);
21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    if (err)
21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        return err;
21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h);
21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    return err;
21755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin}
21855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
21955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format,
22055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             int usage, unsigned int ion_flags,
22155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             private_handle_t **hnd, int *stride)
2222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t luma_size, chroma_size;
2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err, planes, fd, fd1, fd2 = 0;
22570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size_t luma_vstride;
226788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    unsigned int heap_mask = _select_heap(usage);
227788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim
2282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = ALIGN(w, 16);
2292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2307d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
2317d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags);
2327d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) {
2337d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV
2347d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_TEXTURE) {
2357d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_EXYNOS_YV12;
2367d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
2377d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M
2387d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
2397d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    }
2402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
241c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YV12:
242bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
2436cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim                *stride = ALIGN(w, 32);
244bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 16);
245bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
246bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
247bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 3;
248bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
249bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
250c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
2512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
2522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
253bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            {
254bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                size_t chroma_vstride = ALIGN(h / 2, 32);
255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_vstride = ALIGN(h, 32);
256bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                luma_size = luma_vstride * *stride;
257bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                chroma_size = chroma_vstride * *stride;
258bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                planes = 2;
259bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin                break;
260bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            }
26155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
26255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
26355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage,
26455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                               ion_flags, hnd, stride);
2657d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        case HAL_PIXEL_FORMAT_YCbCr_422_I:
2667d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            {
2677d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_vstride = h;
2687d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                luma_size = luma_vstride * *stride * 2;
2697d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                chroma_size = 0;
2707d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                planes = 1;
2717d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                break;
2727d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            }
2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
274bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            ALOGE("invalid yuv format %d\n", format);
275bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin            return -EINVAL;
2762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
278ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim    if (usage & GRALLOC_USAGE_PROTECTED)
279ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim	ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK;
280ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim
281788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim    err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd);
2822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang    if (planes == 1) {
2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        *hnd = new private_handle_t(fd, luma_size, usage, w, h,
286ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin                                    format, *stride, luma_vstride);
287ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    } else {
2887d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1);
2897d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (err)
2907d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            goto err1;
2917d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        if (planes == 3) {
2927d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2);
2937d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            if (err)
2947d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                goto err2;
2957d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang
2967d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h,
2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        format, *stride, luma_vstride);
2987d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        } else {
2997d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang            *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format,
3007d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang                                        *stride, luma_vstride);
3017d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang        }
302ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    }
30306f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    // Set chroma & gamut fields
30406f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    if (!err && *hnd) {
30506f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        if (usage & GRALLOC_USAGE_PRIVATE_CHROMA) {
30606f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->chroma = HAL_PIXEL_CHROMA_BT601_8;
30706f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->gamut = HAL_PIXEL_GAMUT_NARROW_8;
30806f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        } else {
30906f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->chroma = HAL_PIXEL_CHROMA_BT709_8;
31006f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray            (*hnd)->gamut = HAL_PIXEL_GAMUT_WIDE_8;
31106f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray        }
31206f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray    }
3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2:
3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd1);
3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1:
3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd);
3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev,
3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         int w, int h, int format, int usage,
3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         buffer_handle_t* pHandle, int* pStride)
3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int stride;
3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err;
328da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    unsigned int ion_flags = 0;
329a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    private_handle_t *hnd = NULL;
3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!pHandle || !pStride)
3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN )
335f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin        ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC;
3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_module_t* m = reinterpret_cast<private_module_t*>
3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>
3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
342da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd,
343da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                            &stride);
3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
345da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags,
346da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                &hnd, &stride);
3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
3482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err != 0)
3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err;
3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pHandle = hnd;
3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pStride = stride;
3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr:
357a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin    if (!hnd)
358a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin        return err;
3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
360ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
362ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev,
3682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle)
3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (private_handle_t::validate(handle) < 0)
3712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
3752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                                                   dev->common.module);
3765258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin    if (hnd->base)
3775258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin        grallocUnmap(module, const_cast<private_handle_t*>(hnd));
3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
380ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
382ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    delete hnd;
3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
3902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev)
3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev);
3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (ctx) {
3952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* TODO: keep a list of all buffer_handle_t created, and free them
3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         * all here.
3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         */
3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        free(ctx);
3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name,
4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        hw_device_t** device)
4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int status = -EINVAL;
4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        gralloc_context_t *dev;
4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev = (gralloc_context_t*)malloc(sizeof(*dev));
4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize our state here */
4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        memset(dev, 0, sizeof(*dev));
4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize the procs */
4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.tag = HARDWARE_DEVICE_TAG;
4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.version = 0;
4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.module = const_cast<hw_module_t*>(module);
4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.close = gralloc_close;
4192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.alloc = gralloc_alloc;
4212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.free = gralloc_free;
4222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module);
4242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        p->ionfd = ion_open();
4252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
4262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        *device = &dev->device.common;
4272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = 0;
4282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    } else {
4292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = fb_device_open(module, name, device);
4302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
4312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return status;
4322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
433