Home | History | Annotate | Download | only in libion_exynos
      1 /*
      2  * Copyright (C) 2012 Samsung Electronics Co., Ltd.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <ion.h>
     18 #include <fcntl.h>
     19 #include <sys/mman.h>
     20 #include <sys/ioctl.h>
     21 #include <cutils/log.h>
     22 
     23 typedef unsigned long ion_handle;
     24 
     25 struct ion_allocation_data {
     26     size_t len;
     27     size_t align;
     28     unsigned int heap_mask;
     29     unsigned int flags;
     30     ion_handle handle;
     31 };
     32 
     33 struct ion_fd_data {
     34     ion_handle handle;
     35     int fd;
     36 };
     37 
     38 struct ion_handle_data {
     39     ion_handle handle;
     40 };
     41 
     42 struct ion_custom_data {
     43     unsigned int cmd;
     44     unsigned long arg;
     45 };
     46 
     47 #define ION_IOC_MAGIC   'I'
     48 #define ION_IOC_ALLOC   _IOWR(ION_IOC_MAGIC, 0, struct ion_allocation_data)
     49 #define ION_IOC_FREE    _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data)
     50 #define ION_IOC_MAP     _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data)
     51 #define ION_IOC_SHARE   _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data)
     52 #define ION_IOC_IMPORT  _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data)
     53 #define ION_IOC_CUSTOM  _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data)
     54 #define ION_IOC_SYNC	_IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data)
     55 
     56 struct ion_msync_data {
     57     long flags;
     58     ion_buffer buf;
     59     size_t size;
     60     off_t offset;
     61 };
     62 
     63 enum ION_EXYNOS_CUSTOM_CMD {
     64     ION_EXYNOS_CUSTOM_MSYNC
     65 };
     66 
     67 ion_client ion_client_create(void)
     68 {
     69     return open("/dev/ion", O_RDWR);
     70 }
     71 
     72 void ion_client_destroy(ion_client client)
     73 {
     74     close(client);
     75 }
     76 
     77 ion_buffer ion_alloc(ion_client client, size_t len, size_t align,
     78                      unsigned int heap_mask, unsigned int flags)
     79 {
     80     int ret;
     81     struct ion_handle_data arg_free;
     82     struct ion_fd_data arg_share;
     83     struct ion_allocation_data arg_alloc;
     84 
     85     arg_alloc.len = len;
     86     arg_alloc.align = align;
     87     arg_alloc.heap_mask = heap_mask;
     88     arg_alloc.flags = flags;
     89 
     90     ret = ioctl(client, ION_IOC_ALLOC, &arg_alloc);
     91     if (ret < 0)
     92         return ret;
     93 
     94     arg_share.handle = arg_alloc.handle;
     95     ret = ioctl(client, ION_IOC_SHARE, &arg_share);
     96 
     97     arg_free.handle = arg_alloc.handle;
     98     ioctl(client, ION_IOC_FREE, &arg_free);
     99 
    100     if (ret < 0)
    101         return ret;
    102 
    103     return arg_share.fd;
    104 }
    105 
    106 void ion_free(ion_buffer buffer)
    107 {
    108     close(buffer);
    109 }
    110 
    111 void *ion_map(ion_buffer buffer, size_t len, off_t offset)
    112 {
    113     return mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED,
    114                 buffer, offset);
    115 }
    116 
    117 int ion_unmap(void *addr, size_t len)
    118 {
    119     return munmap(addr, len);
    120 }
    121 
    122 int ion_sync(ion_client client, ion_buffer buffer)
    123 {
    124     struct ion_fd_data data;
    125 
    126     data.fd = buffer;
    127 
    128     return ioctl(client, ION_IOC_SYNC, &data);
    129 }
    130 
    131 int ion_incRef(int fd, int share_fd, unsigned long **handle)
    132 {
    133     struct ion_fd_data data;
    134 
    135     data.fd = share_fd;
    136 
    137     int ret = ioctl(fd, ION_IOC_IMPORT, &data);
    138     if (ret < 0)
    139             return ret;
    140     *handle = (unsigned long*)(data.handle);
    141     return ret;
    142 }
    143 
    144 int ion_decRef(int fd, unsigned long *handle)
    145 {
    146     struct ion_handle_data data;
    147     data.handle = (ion_handle)handle;
    148 
    149     return ioctl(fd, ION_IOC_FREE, &data);
    150 }
    151