/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * */ #ifndef __KGSL_COMPAT_H #define __KGSL_COMPAT_H #ifdef CONFIG_COMPAT #include #include "kgsl.h" #include "kgsl_device.h" struct kgsl_ibdesc_compat { compat_ulong_t gpuaddr; unsigned int __pad; compat_size_t sizedwords; unsigned int ctrl; }; struct kgsl_cmd_syncpoint_compat { int type; compat_uptr_t priv; compat_size_t size; }; struct kgsl_devinfo_compat { unsigned int device_id; unsigned int chip_id; unsigned int mmu_enabled; compat_ulong_t gmem_gpubaseaddr; unsigned int gpu_id; compat_size_t gmem_sizebytes; }; struct kgsl_shadowprop_compat { compat_ulong_t gpuaddr; compat_size_t size; unsigned int flags; }; struct kgsl_device_constraint_compat { unsigned int type; unsigned int context_id; compat_uptr_t data; compat_size_t size; }; struct kgsl_device_getproperty_compat { unsigned int type; compat_uptr_t value; compat_size_t sizebytes; }; #define IOCTL_KGSL_DEVICE_GETPROPERTY_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x2, struct kgsl_device_getproperty_compat) #define IOCTL_KGSL_SETPROPERTY_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x32, struct kgsl_device_getproperty_compat) struct kgsl_submit_commands_compat { unsigned int context_id; unsigned int flags; compat_uptr_t cmdlist; unsigned int numcmds; compat_uptr_t synclist; unsigned int numsyncs; unsigned int timestamp; /* private: reserved for future use */ unsigned int __pad[4]; }; #define IOCTL_KGSL_SUBMIT_COMMANDS_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x3D, struct kgsl_submit_commands_compat) struct kgsl_ringbuffer_issueibcmds_compat { unsigned int drawctxt_id; compat_ulong_t ibdesc_addr; unsigned int numibs; unsigned int timestamp; /* output param */ unsigned int flags; }; #define IOCTL_KGSL_RINGBUFFER_ISSUEIBCMDS_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x10, struct kgsl_ringbuffer_issueibcmds_compat) struct kgsl_cmdstream_freememontimestamp_compat { compat_ulong_t gpuaddr; unsigned int type; unsigned int timestamp; }; #define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x12, \ struct kgsl_cmdstream_freememontimestamp_compat) struct kgsl_cmdstream_freememontimestamp_ctxtid_compat { unsigned int context_id; compat_ulong_t gpuaddr; unsigned int type; unsigned int timestamp; }; #define IOCTL_KGSL_CMDSTREAM_FREEMEMONTIMESTAMP_CTXTID_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x17, \ struct kgsl_cmdstream_freememontimestamp_ctxtid_compat) struct kgsl_map_user_mem_compat { int fd; compat_ulong_t gpuaddr; compat_size_t len; compat_size_t offset; compat_ulong_t hostptr; enum kgsl_user_mem_type memtype; unsigned int flags; }; #define IOCTL_KGSL_MAP_USER_MEM_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x15, struct kgsl_map_user_mem_compat) struct kgsl_sharedmem_free_compat { compat_ulong_t gpuaddr; }; #define IOCTL_KGSL_SHAREDMEM_FLUSH_CACHE_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x24, struct kgsl_sharedmem_free_compat) #define IOCTL_KGSL_SHAREDMEM_FREE_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x21, struct kgsl_sharedmem_free_compat) struct kgsl_gpumem_alloc_compat { compat_ulong_t gpuaddr; /* output param */ compat_size_t size; unsigned int flags; }; #define IOCTL_KGSL_GPUMEM_ALLOC_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x2f, struct kgsl_gpumem_alloc_compat) struct kgsl_cff_syncmem_compat { compat_ulong_t gpuaddr; compat_size_t len; unsigned int __pad[2]; /* For future binary compatibility */ }; #define IOCTL_KGSL_CFF_SYNCMEM_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x30, struct kgsl_cff_syncmem_compat) struct kgsl_timestamp_event_compat { int type; /* Type of event (see list below) */ unsigned int timestamp; /* Timestamp to trigger event on */ unsigned int context_id; /* Context for the timestamp */ compat_uptr_t priv; /* Pointer to the event specific blob */ compat_size_t len; /* Size of the event specific blob */ }; #define IOCTL_KGSL_TIMESTAMP_EVENT_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x33, struct kgsl_timestamp_event_compat) struct kgsl_gpumem_alloc_id_compat { unsigned int id; unsigned int flags; compat_size_t size; compat_size_t mmapsize; compat_ulong_t gpuaddr; /* private: reserved for future use*/ unsigned int __pad[2]; }; #define IOCTL_KGSL_GPUMEM_ALLOC_ID_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x34, struct kgsl_gpumem_alloc_id_compat) struct kgsl_gpumem_get_info_compat { compat_ulong_t gpuaddr; unsigned int id; unsigned int flags; compat_size_t size; compat_size_t mmapsize; compat_ulong_t useraddr; /* private: reserved for future use*/ unsigned int __pad[4]; }; #define IOCTL_KGSL_GPUMEM_GET_INFO_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x36, struct kgsl_gpumem_get_info_compat) struct kgsl_gpumem_sync_cache_compat { compat_ulong_t gpuaddr; unsigned int id; unsigned int op; compat_size_t offset; compat_size_t length; }; #define IOCTL_KGSL_GPUMEM_SYNC_CACHE_COMPAT \ _IOW(KGSL_IOC_TYPE, 0x37, struct kgsl_gpumem_sync_cache_compat) struct kgsl_gpumem_sync_cache_bulk_compat { compat_uptr_t id_list; unsigned int count; unsigned int op; /* private: reserved for future use */ unsigned int __pad[2]; /* For future binary compatibility */ }; #define IOCTL_KGSL_GPUMEM_SYNC_CACHE_BULK_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x3C, struct kgsl_gpumem_sync_cache_bulk_compat) struct kgsl_perfcounter_query_compat { unsigned int groupid; compat_uptr_t countables; unsigned int count; unsigned int max_counters; unsigned int __pad[2]; }; #define IOCTL_KGSL_PERFCOUNTER_QUERY_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x3A, struct kgsl_perfcounter_query_compat) struct kgsl_perfcounter_read_compat { compat_uptr_t reads; unsigned int count; unsigned int __pad[2]; }; #define IOCTL_KGSL_PERFCOUNTER_READ_COMPAT \ _IOWR(KGSL_IOC_TYPE, 0x3B, struct kgsl_perfcounter_read_compat) static inline compat_ulong_t gpuaddr_to_compat(unsigned long gpuaddr) { WARN(gpuaddr >> 32, "Top 32 bits of gpuaddr have been set\n"); return (compat_ulong_t)gpuaddr; } static inline compat_size_t sizet_to_compat(size_t size) { WARN(size >> 32, "Size greater than 4G\n"); return (compat_size_t)size; } int kgsl_cmdbatch_create_compat(struct kgsl_device *device, unsigned int flags, struct kgsl_cmdbatch *cmdbatch, void __user *cmdlist, unsigned int numcmds, void __user *synclist, unsigned int numsyncs); long kgsl_compat_ioctl(struct file *filep, unsigned int cmd, unsigned long arg); #else static inline int kgsl_cmdbatch_create_compat(struct kgsl_device *device, unsigned int flags, struct kgsl_cmdbatch *cmdbatch, void __user *cmdlist, unsigned int numcmds, void __user *synclist, unsigned int numsyncs) { BUG(); } static inline long kgsl_compat_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { BUG(); } #endif /* CONFIG_COMPAT */ #endif /* __KGSL_COMPAT_H */