1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*
2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2008 The Android Open Source Project
3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License");
6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License.
7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at
8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *      http://www.apache.org/licenses/LICENSE-2.0
10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson *
11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software
12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS,
13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and
15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License.
16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */
17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <limits.h>
19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <errno.h>
20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <pthread.h>
21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <unistd.h>
22ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <string.h>
23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <stdarg.h>
24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
25ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/mman.h>
26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/stat.h>
27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/types.h>
28ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <sys/ioctl.h>
29ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/log.h>
31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <cutils/atomic.h>
32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
33ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/hardware.h>
34ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <hardware/gralloc.h>
35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gralloc_priv.h"
37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "gr.h"
38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "alloc_controller.h"
39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "memalloc.h"
40ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <qdMetaData.h>
41ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
42ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace gralloc;
43ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
44ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Return the type of allocator -
46ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// these are used for mapping/unmapping
47ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic IMemAlloc* getAllocator(int flags)
48ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
49ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    IMemAlloc* memalloc;
50ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    IAllocController* alloc_ctrl = IAllocController::getInstance();
51ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    memalloc = alloc_ctrl->getAllocator(flags);
52ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return memalloc;
53ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
54ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
55ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int gralloc_map(gralloc_module_t const* module,
56a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                       buffer_handle_t handle)
57ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
5815c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if(!module)
5915c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R        return -EINVAL;
6015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R
61ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
62ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    void *mappedAddress;
63ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER) &&
64ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        !(hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_BUFFER)) {
6592e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        unsigned int size = hnd->size;
66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        IMemAlloc* memalloc = getAllocator(hnd->flags) ;
67ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int err = memalloc->map_buffer(&mappedAddress, size,
68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                       hnd->offset, hnd->fd);
69ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(err || mappedAddress == MAP_FAILED) {
70ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("Could not mmap handle %p, fd=%d (%s)",
71ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                  handle, hnd->fd, strerror(errno));
72ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd->base = 0;
73ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return -errno;
74ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
75ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
7692e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        hnd->base = uint64_t(mappedAddress) + hnd->offset;
77ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        mappedAddress = MAP_FAILED;
78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        err = memalloc->map_buffer(&mappedAddress, size,
80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                       hnd->offset_metadata, hnd->fd_metadata);
81ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(err || mappedAddress == MAP_FAILED) {
82ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("Could not mmap handle %p, fd=%d (%s)",
83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                  handle, hnd->fd_metadata, strerror(errno));
84ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd->base_metadata = 0;
85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            return -errno;
86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
8792e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        hnd->base_metadata = uint64_t(mappedAddress) + hnd->offset_metadata;
88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
89ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
90ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
91ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
92ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic int gralloc_unmap(gralloc_module_t const* module,
93ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                         buffer_handle_t handle)
94ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
9515c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if(!module)
9615c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R        return -EINVAL;
9715c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R
98ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
99ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (!(hnd->flags & private_handle_t::PRIV_FLAGS_FRAMEBUFFER)) {
100ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        int err = -EINVAL;
101ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        void* base = (void*)hnd->base;
10292e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah        unsigned int size = hnd->size;
103ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        IMemAlloc* memalloc = getAllocator(hnd->flags) ;
104ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if(memalloc != NULL) {
105ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            err = memalloc->unmap_buffer(base, size, hnd->offset);
106ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (err) {
107ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ALOGE("Could not unmap memory at address %p", base);
108ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
109ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            base = (void*)hnd->base_metadata;
110ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
111ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            err = memalloc->unmap_buffer(base, size, hnd->offset_metadata);
112ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (err) {
113ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                ALOGE("Could not unmap memory at address %p", base);
114ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
115ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
116ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
117ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* need to initialize the pointer to NULL otherwise unmapping for that
118ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * buffer happens twice which leads to crash */
119ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base = 0;
120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base_metadata = 0;
121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
125ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonstatic pthread_mutex_t sMapLock = PTHREAD_MUTEX_INITIALIZER;
127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
130ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_register_buffer(gralloc_module_t const* module,
131ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                            buffer_handle_t handle)
132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
13315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if (!module || private_handle_t::validate(handle) < 0)
134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -EINVAL;
135ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
136ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    // In this implementation, we don't need to do anything here
137ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
138ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /* NOTE: we need to initialize the buffer as not mapped/not locked
139ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * because it shouldn't when this function is called the first time
140ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * in a new process. Ideally these flags shouldn't be part of the
141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * handle, but instead maintained in the kernel or at least
142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * out-of-line
143ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     */
144ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
145ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base = 0;
147ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base_metadata = 0;
148a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    int err = gralloc_map(module, handle);
149ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (err) {
150ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        ALOGE("%s: gralloc_map failed", __FUNCTION__);
151ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return err;
152ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
153ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
154ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
156ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
157ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_unregister_buffer(gralloc_module_t const* module,
158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                              buffer_handle_t handle)
159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
16015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if (!module || private_handle_t::validate(handle) < 0)
161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -EINVAL;
162ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
163ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /*
164ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * If the buffer has been mapped during a lock operation, it's time
165ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * to un-map it. It's an error to be here with a locked buffer.
166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * NOTE: the framebuffer is handled differently and is never unmapped.
167ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     */
168ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
171ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (hnd->base != 0) {
172ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        gralloc_unmap(module, handle);
173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
174ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base = 0;
175ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    hnd->base_metadata = 0;
176ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
177ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
178ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
179ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint terminateBuffer(gralloc_module_t const* module,
180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    private_handle_t* hnd)
181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
18215c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if(!module)
18315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R        return -EINVAL;
18415c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R
185ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    /*
186ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * If the buffer has been mapped during a lock operation, it's time
187ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     * to un-map it. It's an error to be here with a locked buffer.
188ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson     */
189ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
190ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (hnd->base != 0) {
191ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        // this buffer was mapped, unmap it now
192ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (hnd->flags & (private_handle_t::PRIV_FLAGS_USES_PMEM |
193ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          private_handle_t::PRIV_FLAGS_USES_PMEM_ADSP |
194ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          private_handle_t::PRIV_FLAGS_USES_ASHMEM |
195ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                          private_handle_t::PRIV_FLAGS_USES_ION)) {
196ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                gralloc_unmap(module, hnd);
197ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        } else {
198ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            ALOGE("terminateBuffer: unmapping a non pmem/ashmem buffer flags = 0x%x",
199ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                  hnd->flags);
200ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            gralloc_unmap(module, hnd);
201ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
202ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
203ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
204ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return 0;
205ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
206ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
207a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedstatic int gralloc_map_and_invalidate (gralloc_module_t const* module,
208a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                                       buffer_handle_t handle, int usage)
209ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
21015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if (!module || private_handle_t::validate(handle) < 0)
211ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -EINVAL;
212ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
213ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int err = 0;
214ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
215ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (usage & (GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK)) {
216ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (hnd->base == 0) {
217ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            // we need to map for real
218ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            pthread_mutex_t* const lock = &sMapLock;
219ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            pthread_mutex_lock(lock);
220a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed            err = gralloc_map(module, handle);
221ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            pthread_mutex_unlock(lock);
222ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
223ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
224ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            //Invalidate if reading in software. No need to do this for the
225ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            //metadata buffer as it is only read/written in software.
226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            IMemAlloc* memalloc = getAllocator(hnd->flags) ;
227ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            err = memalloc->clean_buffer((void*)hnd->base,
228ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         hnd->size, hnd->offset, hnd->fd,
229ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         CACHE_INVALIDATE);
230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            if (usage & GRALLOC_USAGE_SW_WRITE_MASK) {
231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                // Mark the buffer to be flushed after cpu read/write
232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->flags |= private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    } else {
236ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        hnd->flags |= private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH;
237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return err;
239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
241a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedint gralloc_lock(gralloc_module_t const* module,
242a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 buffer_handle_t handle, int usage,
243a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
244a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 void** vaddr)
245a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed{
246a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    private_handle_t* hnd = (private_handle_t*)handle;
247a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    int err = gralloc_map_and_invalidate(module, handle, usage);
248a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    if(!err)
249a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed        *vaddr = (void*)hnd->base;
250a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    return err;
251a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed}
252a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed
253a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmedint gralloc_lock_ycbcr(gralloc_module_t const* module,
254a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 buffer_handle_t handle, int usage,
255a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 int /*l*/, int /*t*/, int /*w*/, int /*h*/,
256a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed                 struct android_ycbcr *ycbcr)
257a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed{
258a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    private_handle_t* hnd = (private_handle_t*)handle;
259a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    int err = gralloc_map_and_invalidate(module, handle, usage);
2600a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed    if(!err)
2610a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed        err = getYUVPlaneInfo(hnd, ycbcr);
262a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed    return err;
263a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed}
264a37e19093ec1c30dff5d0b5ae9a0938868e537e6Naseer Ahmed
265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_unlock(gralloc_module_t const* module,
266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                   buffer_handle_t handle)
267ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
26815c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if (!module || private_handle_t::validate(handle) < 0)
269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        return -EINVAL;
27015c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R
271ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int err = 0;
272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    private_handle_t* hnd = (private_handle_t*)handle;
273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    if (hnd->flags & private_handle_t::PRIV_FLAGS_USES_ION) {
275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        IMemAlloc* memalloc = getAllocator(hnd->flags);
276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        if (hnd->flags & private_handle_t::PRIV_FLAGS_NEEDS_FLUSH) {
277ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            err = memalloc->clean_buffer((void*)hnd->base,
278ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         hnd->size, hnd->offset, hnd->fd,
279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         CACHE_CLEAN_AND_INVALIDATE);
280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd->flags &= ~private_handle_t::PRIV_FLAGS_NEEDS_FLUSH;
281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        } else if(hnd->flags & private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH) {
282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            hnd->flags &= ~private_handle_t::PRIV_FLAGS_DO_NOT_FLUSH;
283ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        } else {
284ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            //Probably a round about way to do this, but this avoids adding new
285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            //flags
286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            err = memalloc->clean_buffer((void*)hnd->base,
287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         hnd->size, hnd->offset, hnd->fd,
288ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                                         CACHE_INVALIDATE);
289ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        }
290ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
291ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
292ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return err;
293ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
294ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
295ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/*****************************************************************************/
296ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonint gralloc_perform(struct gralloc_module_t const* module,
298ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    int operation, ... )
299ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{
300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    int res = -EINVAL;
301ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    va_list args;
30215c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R    if(!module)
30315c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R        return res;
30415c7eb9ba46119290695b650d23180884f1156faArun Kumar K.R
305ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    va_start(args, operation);
306ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    switch (operation) {
307ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case GRALLOC_MODULE_PERFORM_CREATE_HANDLE_FROM_BUFFER:
308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            {
309ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int fd = va_arg(args, int);
31092e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah                unsigned int size = va_arg(args, unsigned int);
31192e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah                unsigned int offset = va_arg(args, unsigned int);
312ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                void* base = va_arg(args, void*);
313ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int width = va_arg(args, int);
314ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int height = va_arg(args, int);
315ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int format = va_arg(args, int);
316ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
317ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                native_handle_t** handle = va_arg(args, native_handle_t**);
318ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                private_handle_t* hnd = (private_handle_t*)native_handle_create(
31992e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah                    private_handle_t::sNumFds, private_handle_t::sNumInts());
320ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->magic = private_handle_t::sMagic;
321ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->fd = fd;
322ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->flags =  private_handle_t::PRIV_FLAGS_USES_ION;
323ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->size = size;
324ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->offset = offset;
32592e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah                hnd->base = uint64_t(base) + offset;
326ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->gpuaddr = 0;
327ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->width = width;
328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->height = height;
329ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->format = format;
330ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                *handle = (native_handle_t *)hnd;
331ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                res = 0;
332ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                break;
333ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson
334ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
335ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#ifdef QCOM_BSP
336ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case GRALLOC_MODULE_PERFORM_UPDATE_BUFFER_GEOMETRY:
337ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            {
338ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int width = va_arg(args, int);
339ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int height = va_arg(args, int);
340ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int format = va_arg(args, int);
341ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                private_handle_t* hnd =  va_arg(args, private_handle_t*);
342ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                if (private_handle_t::validate(hnd)) {
343ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    return res;
344ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                }
345ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->width = width;
346ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->height = height;
347ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                hnd->format = format;
348ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                res = 0;
349ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            }
350ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
351ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#endif
352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case GRALLOC_MODULE_PERFORM_GET_STRIDE:
353ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            {
354ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int width   = va_arg(args, int);
355ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int format  = va_arg(args, int);
356ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int *stride = va_arg(args, int *);
357a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int alignedw = 0, alignedh = 0;
358a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
359a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                        0, format, false, alignedw, alignedh);
360a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                *stride = alignedw;
361ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                res = 0;
362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            } break;
363a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
364ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_FROM_HANDLE:
365ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            {
366ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                private_handle_t* hnd =  va_arg(args, private_handle_t*);
367ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                int *stride = va_arg(args, int *);
368ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                if (private_handle_t::validate(hnd)) {
369ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    return res;
370ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                }
371ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
372ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
373ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    *stride = metadata->bufferDim.sliceWidth;
374ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                } else {
375ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                    *stride = hnd->width;
376ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                }
377ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson                res = 0;
378ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            } break;
379a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
380ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal        case GRALLOC_MODULE_PERFORM_GET_CUSTOM_STRIDE_AND_HEIGHT_FROM_HANDLE:
381ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal            {
382ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                private_handle_t* hnd =  va_arg(args, private_handle_t*);
383ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                int *stride = va_arg(args, int *);
384ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                int *height = va_arg(args, int *);
385ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                if (private_handle_t::validate(hnd)) {
386ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                    return res;
387ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                }
388ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
389ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
390ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                    *stride = metadata->bufferDim.sliceWidth;
391ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                    *height = metadata->bufferDim.sliceHeight;
392ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                } else {
393ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                    *stride = hnd->width;
394ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                    *height = hnd->height;
395ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                }
396ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal                res = 0;
397ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal            } break;
398ca525f17344bf9964720531830921bf3a5dd5932Raj Kamal
399a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case GRALLOC_MODULE_PERFORM_GET_ATTRIBUTES:
400a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            {
401a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int width   = va_arg(args, int);
402a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int height  = va_arg(args, int);
403a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int format  = va_arg(args, int);
404a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int usage   = va_arg(args, int);
405a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int *alignedWidth = va_arg(args, int *);
406a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int *alignedHeight = va_arg(args, int *);
407a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int *tileEnabled = va_arg(args,int *);
408a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                *tileEnabled = isMacroTileEnabled(format, usage);
409a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                AdrenoMemInfo::getInstance().getAlignedWidthAndHeight(width,
410a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                        height, format, *tileEnabled, *alignedWidth,
411a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                        *alignedHeight);
412a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                res = 0;
413a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            } break;
414a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson
415a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson        case GRALLOC_MODULE_PERFORM_GET_COLOR_SPACE_FROM_HANDLE:
416a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            {
417a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                private_handle_t* hnd =  va_arg(args, private_handle_t*);
418a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                int *color_space = va_arg(args, int *);
419a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                if (private_handle_t::validate(hnd)) {
420a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                    return res;
421a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                }
422a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
423a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                if(metadata && metadata->operation & UPDATE_COLOR_SPACE) {
424a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                    *color_space = metadata->colorSpace;
425a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                    res = 0;
426a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson                }
427a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson            } break;
4280a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed        case GRALLOC_MODULE_PERFORM_GET_YUV_PLANE_INFO:
4290a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed            {
4300a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed                private_handle_t* hnd =  va_arg(args, private_handle_t*);
4310a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed                android_ycbcr* ycbcr = va_arg(args, struct android_ycbcr *);
4323099482d2523f4c2ca6f7939ac4a4a587253d838Naseer Ahmed                if (!private_handle_t::validate(hnd)) {
4330a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed                    res = getYUVPlaneInfo(hnd, ycbcr);
4340a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed                }
4350a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed            } break;
4360a4d3acfe5d2b131701ef5f8cd3c6781ccb25f8bNaseer Ahmed
437ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson        default:
438ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson            break;
439ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    }
440ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    va_end(args);
441ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson    return res;
442ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}
443