1e6188e58Smrg/* 2e6188e58Smrg * Copyright © 2014 NVIDIA Corporation 3e6188e58Smrg * 4e6188e58Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5e6188e58Smrg * copy of this software and associated documentation files (the "Software"), 6e6188e58Smrg * to deal in the Software without restriction, including without limitation 7e6188e58Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8e6188e58Smrg * and/or sell copies of the Software, and to permit persons to whom the 9e6188e58Smrg * Software is furnished to do so, subject to the following conditions: 10e6188e58Smrg * 11e6188e58Smrg * The above copyright notice and this permission notice shall be included in 12e6188e58Smrg * all copies or substantial portions of the Software. 13e6188e58Smrg * 14e6188e58Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15e6188e58Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16e6188e58Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17e6188e58Smrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18e6188e58Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19e6188e58Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20e6188e58Smrg * OTHER DEALINGS IN THE SOFTWARE. 21e6188e58Smrg */ 22e6188e58Smrg 23e6188e58Smrg#ifndef LIBDRM_LIBDRM_H 24e6188e58Smrg#define LIBDRM_LIBDRM_H 25e6188e58Smrg 267cdc0497Smrg#if HAVE_VISIBILITY 27e6188e58Smrg# define drm_private __attribute__((visibility("hidden"))) 287cdc0497Smrg# define drm_public __attribute__((visibility("default"))) 29e6188e58Smrg#else 30e6188e58Smrg# define drm_private 317cdc0497Smrg# define drm_public 32e6188e58Smrg#endif 33e6188e58Smrg 34e6188e58Smrg 35e6188e58Smrg/** 36e6188e58Smrg * Static (compile-time) assertion. 37e6188e58Smrg * Basically, use COND to dimension an array. If COND is false/zero the 38e6188e58Smrg * array size will be -1 and we'll get a compilation error. 39e6188e58Smrg */ 40e6188e58Smrg#define STATIC_ASSERT(COND) \ 41e6188e58Smrg do { \ 42e6188e58Smrg (void) sizeof(char [1 - 2*!(COND)]); \ 43e6188e58Smrg } while (0) 44e6188e58Smrg 45e6188e58Smrg 46e6188e58Smrg#include <sys/mman.h> 47e6188e58Smrg 48e6188e58Smrg#if defined(ANDROID) && !defined(__LP64__) 49e6188e58Smrg#include <errno.h> /* for EINVAL */ 50e6188e58Smrg 51e6188e58Smrgstatic inline void *drm_mmap(void *addr, size_t length, int prot, int flags, 52e6188e58Smrg int fd, loff_t offset) 53e6188e58Smrg{ 54e6188e58Smrg /* offset must be aligned to 4096 (not necessarily the page size) */ 55e6188e58Smrg if (offset & 4095) { 56e6188e58Smrg errno = EINVAL; 57e6188e58Smrg return MAP_FAILED; 58e6188e58Smrg } 59e6188e58Smrg 605324fb0dSmrg return mmap64(addr, length, prot, flags, fd, offset); 61e6188e58Smrg} 62e6188e58Smrg 63e6188e58Smrg# define drm_munmap(addr, length) \ 64e6188e58Smrg munmap(addr, length) 65e6188e58Smrg 66e6188e58Smrg 67e6188e58Smrg#else 68e6188e58Smrg 69e6188e58Smrg/* assume large file support exists */ 70e6188e58Smrg# define drm_mmap(addr, length, prot, flags, fd, offset) \ 71e6188e58Smrg mmap(addr, length, prot, flags, fd, offset) 72e6188e58Smrg 73e6188e58Smrg 74e6188e58Smrgstatic inline int drm_munmap(void *addr, size_t length) 75e6188e58Smrg{ 76e6188e58Smrg /* Copied from configure code generated by AC_SYS_LARGEFILE */ 77e6188e58Smrg#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + \ 78e6188e58Smrg (((off_t) 1 << 31) << 31)) 79e6188e58Smrg STATIC_ASSERT(LARGE_OFF_T % 2147483629 == 721 && 80e6188e58Smrg LARGE_OFF_T % 2147483647 == 1); 81e6188e58Smrg#undef LARGE_OFF_T 82e6188e58Smrg 83e6188e58Smrg return munmap(addr, length); 84e6188e58Smrg} 85e6188e58Smrg#endif 86e6188e58Smrg 87e6188e58Smrg#endif 88