blob: c200b6d20c29dc1ebbcfe25ce9adfd977941c7e0 [file] [log] [blame]
/* Copyright (c) 2013-2014, 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 <linux/compat.h>
#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_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 length;
compat_size_t offset;
};
#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);
int adreno_getproperty_compat(struct kgsl_device *device,
enum kgsl_property_type type,
void __user *value,
size_t sizebytes);
long adreno_compat_ioctl(struct kgsl_device_private *dev_priv,
unsigned int cmd, void *data);
#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();
}
static inline int adreno_getproperty_compat(struct kgsl_device *device,
enum kgsl_property_type type,
void __user *value, size_t sizebytes)
{
BUG();
}
static inline long adreno_compat_ioctl(struct kgsl_device_private *dev_priv,
unsigned int cmd, void *data)
{
BUG();
}
#endif /* CONFIG_COMPAT */
#endif /* __KGSL_COMPAT_H */