1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2008, The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (c) 2011-2013, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License.
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License.
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <unistd.h>
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <fcntl.h>
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/mman.h>
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/stat.h>
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/types.h>
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <sys/ioctl.h>
25b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <cutils/properties.h>
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
27b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <linux/android_pmem.h>
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
29b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "gr.h"
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "gpu.h"
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "memalloc.h"
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "alloc_controller.h"
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
34b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyusing namespace gralloc;
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint fb_device_open(const hw_module_t* module, const char* name,
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                   hw_device_t** device);
38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
39b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystatic int gralloc_device_open(const hw_module_t* module, const char* name,
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                               hw_device_t** device);
41b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
42b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_lock(gralloc_module_t const* module,
43b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        buffer_handle_t handle, int usage,
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        int l, int t, int w, int h,
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        void** vaddr);
46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
47b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_lock_ycbcr(gralloc_module_t const* module,
48b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        buffer_handle_t handle, int usage,
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        int l, int t, int w, int h,
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        struct android_ycbcr *ycbcr);
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
52b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_unlock(gralloc_module_t const* module,
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          buffer_handle_t handle);
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
55b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_register_buffer(gralloc_module_t const* module,
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                   buffer_handle_t handle);
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
58b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_unregister_buffer(gralloc_module_t const* module,
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                     buffer_handle_t handle);
60b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
61b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyextern int gralloc_perform(struct gralloc_module_t const* module,
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           int operation, ... );
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// HAL module methods
65b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystatic struct hw_module_methods_t gralloc_module_methods = {
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    open: gralloc_device_open
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// HAL module initialize
70b166940edca6e312463461438e2aa66e9852c26aBenoit Gobystruct private_module_t HAL_MODULE_INFO_SYM = {
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    base: {
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        common: {
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            tag: HARDWARE_MODULE_TAG,
74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            module_api_version: GRALLOC_MODULE_API_VERSION_0_2,
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            hal_api_version: 0,
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            id: GRALLOC_HARDWARE_MODULE_ID,
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            name: "Graphics Memory Allocator Module",
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            author: "The Android Open Source Project",
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            methods: &gralloc_module_methods,
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            dso: 0,
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        },
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        registerBuffer: gralloc_register_buffer,
83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        unregisterBuffer: gralloc_unregister_buffer,
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        lock: gralloc_lock,
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        unlock: gralloc_unlock,
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        perform: gralloc_perform,
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        lock_ycbcr: gralloc_lock_ycbcr,
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    },
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    framebuffer: 0,
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    fbFormat: 0,
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    flags: 0,
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    numBuffers: 0,
93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bufferMask: 0,
94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    lock: PTHREAD_MUTEX_INITIALIZER,
95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    currentBuffer: 0,
96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby};
97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Open Gralloc device
99b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyint gralloc_device_open(const hw_module_t* module, const char* name,
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                        hw_device_t** device)
101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    int status = -EINVAL;
103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        const private_module_t* m = reinterpret_cast<const private_module_t*>(
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            module);
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        gpu_context_t *dev;
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        IAllocController* alloc_ctrl = IAllocController::getInstance();
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        dev = new gpu_context_t(m, alloc_ctrl);
109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        *device = &dev->common;
110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        status = 0;
111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    } else {
112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        status = fb_device_open(module, name, device);
113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return status;
115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
116