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