提交 13626cb9 编写于 作者: L Linus Torvalds

Merge branch 'drm-patches' of ssh://master.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6

* 'drm-patches' of ssh://master.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
  via invalid device ids removal
  radeon: Commit the ring after each partial texture upload blit.
  i915: fix vbl swap allocation size.
  drm: Replace DRM_IOCTL_ARGS with (dev, data, file_priv) and remove DRM_DEVICE.
  drm: remove XFREE86_VERSION macros.
  drm: Replace filp in ioctl arguments with drm_file *file_priv.
  drm: Remove DRM_ERR OS macro.
...@@ -63,27 +63,9 @@ ...@@ -63,27 +63,9 @@
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size) #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
#endif #endif
#define XFREE86_VERSION(major,minor,patch,snap) \
((major << 16) | (minor << 8) | patch)
#ifndef CONFIG_XFREE86_VERSION
#define CONFIG_XFREE86_VERSION XFREE86_VERSION(4,1,0,0)
#endif
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
#define DRM_PROC_DEVICES "/proc/devices"
#define DRM_PROC_MISC "/proc/misc"
#define DRM_PROC_DRM "/proc/drm"
#define DRM_DEV_DRM "/dev/drm"
#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
#define DRM_DEV_UID 0
#define DRM_DEV_GID 0
#endif
#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0)
#define DRM_MAJOR 226 #define DRM_MAJOR 226
#define DRM_MAX_MINOR 15 #define DRM_MAX_MINOR 15
#endif
#define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */ #define DRM_NAME "drm" /**< Name in kernel, /dev, and /proc */
#define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */ #define DRM_MIN_ORDER 5 /**< At least 2^5 bytes = 32 bytes */
#define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */ #define DRM_MAX_ORDER 22 /**< Up to 2^22 bytes = 4MB */
......
...@@ -80,6 +80,9 @@ ...@@ -80,6 +80,9 @@
#define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE))) #define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
#define __OS_HAS_MTRR (defined(CONFIG_MTRR)) #define __OS_HAS_MTRR (defined(CONFIG_MTRR))
struct drm_file;
struct drm_device;
#include "drm_os_linux.h" #include "drm_os_linux.h"
#include "drm_hashtab.h" #include "drm_hashtab.h"
...@@ -231,12 +234,13 @@ ...@@ -231,12 +234,13 @@
* \param dev DRM device. * \param dev DRM device.
* \param filp file pointer of the caller. * \param filp file pointer of the caller.
*/ */
#define LOCK_TEST_WITH_RETURN( dev, filp ) \ #define LOCK_TEST_WITH_RETURN( dev, file_priv ) \
do { \ do { \
if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \ if ( !_DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ) || \
dev->lock.filp != filp ) { \ dev->lock.file_priv != file_priv ) { \
DRM_ERROR( "%s called without lock held\n", \ DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\
__FUNCTION__ ); \ __FUNCTION__, _DRM_LOCK_IS_HELD( dev->lock.hw_lock->lock ),\
dev->lock.file_priv, file_priv ); \
return -EINVAL; \ return -EINVAL; \
} \ } \
} while (0) } while (0)
...@@ -257,12 +261,12 @@ do { \ ...@@ -257,12 +261,12 @@ do { \
* Ioctl function type. * Ioctl function type.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private pointer.
* \param cmd command. * \param cmd command.
* \param arg argument. * \param arg argument.
*/ */
typedef int drm_ioctl_t(struct inode *inode, struct file *filp, typedef int drm_ioctl_t(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
unsigned long arg); unsigned long arg);
...@@ -271,10 +275,18 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, ...@@ -271,10 +275,18 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
#define DRM_MASTER 0x2 #define DRM_MASTER 0x2
#define DRM_ROOT_ONLY 0x4 #define DRM_ROOT_ONLY 0x4
typedef struct drm_ioctl_desc { struct drm_ioctl_desc {
unsigned int cmd;
drm_ioctl_t *func; drm_ioctl_t *func;
int flags; int flags;
} drm_ioctl_desc_t; };
/**
* Creates a driver or general drm_ioctl_desc array entry for the given
* ioctl, for use by drm_ioctl().
*/
#define DRM_IOCTL_DEF(ioctl, func, flags) \
[DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags}
struct drm_magic_entry { struct drm_magic_entry {
struct list_head head; struct list_head head;
...@@ -304,7 +316,7 @@ struct drm_buf { ...@@ -304,7 +316,7 @@ struct drm_buf {
__volatile__ int waiting; /**< On kernel DMA queue */ __volatile__ int waiting; /**< On kernel DMA queue */
__volatile__ int pending; /**< On hardware DMA queue */ __volatile__ int pending; /**< On hardware DMA queue */
wait_queue_head_t dma_wait; /**< Processes waiting */ wait_queue_head_t dma_wait; /**< Processes waiting */
struct file *filp; /**< Pointer to holding file descr */ struct drm_file *file_priv; /**< Private of holding file descr */
int context; /**< Kernel queue for this buffer */ int context; /**< Kernel queue for this buffer */
int while_locked; /**< Dispatch this buffer while locked */ int while_locked; /**< Dispatch this buffer while locked */
enum { enum {
...@@ -377,6 +389,7 @@ struct drm_file { ...@@ -377,6 +389,7 @@ struct drm_file {
int remove_auth_on_close; int remove_auth_on_close;
unsigned long lock_count; unsigned long lock_count;
void *driver_priv; void *driver_priv;
struct file *filp;
}; };
/** Wait queue */ /** Wait queue */
...@@ -403,7 +416,7 @@ struct drm_queue { ...@@ -403,7 +416,7 @@ struct drm_queue {
*/ */
struct drm_lock_data { struct drm_lock_data {
struct drm_hw_lock *hw_lock; /**< Hardware lock */ struct drm_hw_lock *hw_lock; /**< Hardware lock */
struct file *filp; /**< File descr of lock holder (0=kernel) */ struct drm_file *file_priv; /**< File descr of lock holder (0=kernel) */
wait_queue_head_t lock_queue; /**< Queue of blocked processes */ wait_queue_head_t lock_queue; /**< Queue of blocked processes */
unsigned long lock_time; /**< Time of last lock in jiffies */ unsigned long lock_time; /**< Time of last lock in jiffies */
spinlock_t spinlock; spinlock_t spinlock;
...@@ -552,11 +565,11 @@ struct drm_driver { ...@@ -552,11 +565,11 @@ struct drm_driver {
int (*load) (struct drm_device *, unsigned long flags); int (*load) (struct drm_device *, unsigned long flags);
int (*firstopen) (struct drm_device *); int (*firstopen) (struct drm_device *);
int (*open) (struct drm_device *, struct drm_file *); int (*open) (struct drm_device *, struct drm_file *);
void (*preclose) (struct drm_device *, struct file * filp); void (*preclose) (struct drm_device *, struct drm_file *file_priv);
void (*postclose) (struct drm_device *, struct drm_file *); void (*postclose) (struct drm_device *, struct drm_file *);
void (*lastclose) (struct drm_device *); void (*lastclose) (struct drm_device *);
int (*unload) (struct drm_device *); int (*unload) (struct drm_device *);
int (*dma_ioctl) (DRM_IOCTL_ARGS); int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
void (*dma_ready) (struct drm_device *); void (*dma_ready) (struct drm_device *);
int (*dma_quiescent) (struct drm_device *); int (*dma_quiescent) (struct drm_device *);
int (*context_ctor) (struct drm_device *dev, int context); int (*context_ctor) (struct drm_device *dev, int context);
...@@ -587,11 +600,12 @@ struct drm_driver { ...@@ -587,11 +600,12 @@ struct drm_driver {
void (*irq_preinstall) (struct drm_device *dev); void (*irq_preinstall) (struct drm_device *dev);
void (*irq_postinstall) (struct drm_device *dev); void (*irq_postinstall) (struct drm_device *dev);
void (*irq_uninstall) (struct drm_device *dev); void (*irq_uninstall) (struct drm_device *dev);
void (*reclaim_buffers) (struct drm_device *dev, struct file * filp); void (*reclaim_buffers) (struct drm_device *dev,
struct drm_file * file_priv);
void (*reclaim_buffers_locked) (struct drm_device *dev, void (*reclaim_buffers_locked) (struct drm_device *dev,
struct file *filp); struct drm_file *file_priv);
void (*reclaim_buffers_idlelocked) (struct drm_device *dev, void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
struct file * filp); struct drm_file *file_priv);
unsigned long (*get_map_ofs) (struct drm_map * map); unsigned long (*get_map_ofs) (struct drm_map * map);
unsigned long (*get_reg_ofs) (struct drm_device *dev); unsigned long (*get_reg_ofs) (struct drm_device *dev);
void (*set_version) (struct drm_device *dev, void (*set_version) (struct drm_device *dev,
...@@ -606,7 +620,7 @@ struct drm_driver { ...@@ -606,7 +620,7 @@ struct drm_driver {
u32 driver_features; u32 driver_features;
int dev_priv_size; int dev_priv_size;
drm_ioctl_desc_t *ioctls; struct drm_ioctl_desc *ioctls;
int num_ioctls; int num_ioctls;
struct file_operations fops; struct file_operations fops;
struct pci_driver pci_driver; struct pci_driver pci_driver;
...@@ -850,70 +864,70 @@ extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start); ...@@ -850,70 +864,70 @@ extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
extern int drm_unbind_agp(DRM_AGP_MEM * handle); extern int drm_unbind_agp(DRM_AGP_MEM * handle);
/* Misc. IOCTL support (drm_ioctl.h) */ /* Misc. IOCTL support (drm_ioctl.h) */
extern int drm_irq_by_busid(struct inode *inode, struct file *filp, extern int drm_irq_by_busid(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getunique(struct inode *inode, struct file *filp, extern int drm_getunique(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_setunique(struct inode *inode, struct file *filp, extern int drm_setunique(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getmap(struct inode *inode, struct file *filp, extern int drm_getmap(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getclient(struct inode *inode, struct file *filp, extern int drm_getclient(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getstats(struct inode *inode, struct file *filp, extern int drm_getstats(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_setversion(struct inode *inode, struct file *filp, extern int drm_setversion(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_noop(struct inode *inode, struct file *filp, extern int drm_noop(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
/* Context IOCTL support (drm_context.h) */ /* Context IOCTL support (drm_context.h) */
extern int drm_resctx(struct inode *inode, struct file *filp, extern int drm_resctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_addctx(struct inode *inode, struct file *filp, extern int drm_addctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_modctx(struct inode *inode, struct file *filp, extern int drm_modctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getctx(struct inode *inode, struct file *filp, extern int drm_getctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_switchctx(struct inode *inode, struct file *filp, extern int drm_switchctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_newctx(struct inode *inode, struct file *filp, extern int drm_newctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_rmctx(struct inode *inode, struct file *filp, extern int drm_rmctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_ctxbitmap_init(struct drm_device *dev); extern int drm_ctxbitmap_init(struct drm_device *dev);
extern void drm_ctxbitmap_cleanup(struct drm_device *dev); extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle); extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
extern int drm_setsareactx(struct inode *inode, struct file *filp, extern int drm_setsareactx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_getsareactx(struct inode *inode, struct file *filp, extern int drm_getsareactx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
/* Drawable IOCTL support (drm_drawable.h) */ /* Drawable IOCTL support (drm_drawable.h) */
extern int drm_adddraw(struct inode *inode, struct file *filp, extern int drm_adddraw(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_rmdraw(struct inode *inode, struct file *filp, extern int drm_rmdraw(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_update_drawable_info(struct inode *inode, struct file *filp, extern int drm_update_drawable_info(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev, extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev,
drm_drawable_t id); drm_drawable_t id);
extern void drm_drawable_free_all(struct drm_device *dev); extern void drm_drawable_free_all(struct drm_device *dev);
/* Authentication IOCTL support (drm_auth.h) */ /* Authentication IOCTL support (drm_auth.h) */
extern int drm_getmagic(struct inode *inode, struct file *filp, extern int drm_getmagic(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_authmagic(struct inode *inode, struct file *filp, extern int drm_authmagic(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
/* Locking IOCTL support (drm_lock.h) */ /* Locking IOCTL support (drm_lock.h) */
extern int drm_lock(struct inode *inode, struct file *filp, extern int drm_lock(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_unlock(struct inode *inode, struct file *filp, extern int drm_unlock(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context); extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context); extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
extern void drm_idlelock_take(struct drm_lock_data *lock_data); extern void drm_idlelock_take(struct drm_lock_data *lock_data);
...@@ -924,8 +938,7 @@ extern void drm_idlelock_release(struct drm_lock_data *lock_data); ...@@ -924,8 +938,7 @@ extern void drm_idlelock_release(struct drm_lock_data *lock_data);
* DMA quiscent + idle. DMA quiescent usually requires the hardware lock. * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
*/ */
extern int drm_i_have_hw_lock(struct file *filp); extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
extern int drm_kernel_take_hw_lock(struct file *filp);
/* Buffer management support (drm_bufs.h) */ /* Buffer management support (drm_bufs.h) */
extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request); extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
...@@ -933,24 +946,23 @@ extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request ...@@ -933,24 +946,23 @@ extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request
extern int drm_addmap(struct drm_device *dev, unsigned int offset, extern int drm_addmap(struct drm_device *dev, unsigned int offset,
unsigned int size, enum drm_map_type type, unsigned int size, enum drm_map_type type,
enum drm_map_flags flags, drm_local_map_t ** map_ptr); enum drm_map_flags flags, drm_local_map_t ** map_ptr);
extern int drm_addmap_ioctl(struct inode *inode, struct file *filp, extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_rmmap(struct drm_device *dev, drm_local_map_t * map); extern int drm_rmmap(struct drm_device *dev, drm_local_map_t *map);
extern int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t * map); extern int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map);
extern int drm_rmmap_ioctl(struct inode *inode, struct file *filp, extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_addbufs(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_infobufs(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_markbufs(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_freebufs(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_mapbufs(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int drm_order(unsigned long size); extern int drm_order(unsigned long size);
extern int drm_addbufs(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern int drm_infobufs(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern int drm_markbufs(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern int drm_freebufs(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern int drm_mapbufs(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg);
extern unsigned long drm_get_resource_start(struct drm_device *dev, extern unsigned long drm_get_resource_start(struct drm_device *dev,
unsigned int resource); unsigned int resource);
extern unsigned long drm_get_resource_len(struct drm_device *dev, extern unsigned long drm_get_resource_len(struct drm_device *dev,
...@@ -960,19 +972,20 @@ extern unsigned long drm_get_resource_len(struct drm_device *dev, ...@@ -960,19 +972,20 @@ extern unsigned long drm_get_resource_len(struct drm_device *dev,
extern int drm_dma_setup(struct drm_device *dev); extern int drm_dma_setup(struct drm_device *dev);
extern void drm_dma_takedown(struct drm_device *dev); extern void drm_dma_takedown(struct drm_device *dev);
extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf); extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
extern void drm_core_reclaim_buffers(struct drm_device *dev, struct file *filp); extern void drm_core_reclaim_buffers(struct drm_device *dev,
struct drm_file *filp);
/* IRQ support (drm_irq.h) */ /* IRQ support (drm_irq.h) */
extern int drm_control(struct inode *inode, struct file *filp, extern int drm_control(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS); extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
extern int drm_irq_uninstall(struct drm_device *dev); extern int drm_irq_uninstall(struct drm_device *dev);
extern void drm_driver_irq_preinstall(struct drm_device *dev); extern void drm_driver_irq_preinstall(struct drm_device *dev);
extern void drm_driver_irq_postinstall(struct drm_device *dev); extern void drm_driver_irq_postinstall(struct drm_device *dev);
extern void drm_driver_irq_uninstall(struct drm_device *dev); extern void drm_driver_irq_uninstall(struct drm_device *dev);
extern int drm_wait_vblank(struct inode *inode, struct file *filp, extern int drm_wait_vblank(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq); extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
extern void drm_vbl_send_signals(struct drm_device *dev); extern void drm_vbl_send_signals(struct drm_device *dev);
extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*)); extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_device*));
...@@ -980,31 +993,30 @@ extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_de ...@@ -980,31 +993,30 @@ extern void drm_locked_tasklet(struct drm_device *dev, void(*func)(struct drm_de
/* AGP/GART support (drm_agpsupport.h) */ /* AGP/GART support (drm_agpsupport.h) */
extern struct drm_agp_head *drm_agp_init(struct drm_device *dev); extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
extern int drm_agp_acquire(struct drm_device *dev); extern int drm_agp_acquire(struct drm_device *dev);
extern int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_release(struct drm_device *dev); extern int drm_agp_release(struct drm_device *dev);
extern int drm_agp_release_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode); extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
extern int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info * info); extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
extern int drm_agp_info_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_info_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request); extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
extern int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request); extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
extern int drm_agp_free_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request); extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
extern int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request); extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
extern int drm_agp_bind_ioctl(struct inode *inode, struct file *filp, extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type);
size_t pages, u32 type);
extern int drm_agp_free_memory(DRM_AGP_MEM * handle); extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start); extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle); extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
...@@ -1033,10 +1045,11 @@ extern int drm_proc_cleanup(int minor, ...@@ -1033,10 +1045,11 @@ extern int drm_proc_cleanup(int minor,
/* Scatter Gather Support (drm_scatter.h) */ /* Scatter Gather Support (drm_scatter.h) */
extern void drm_sg_cleanup(struct drm_sg_mem * entry); extern void drm_sg_cleanup(struct drm_sg_mem * entry);
extern int drm_sg_alloc(struct inode *inode, struct file *filp, extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int drm_sg_free(struct inode *inode, struct file *filp, extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);
unsigned int cmd, unsigned long arg); extern int drm_sg_free(struct drm_device *dev, void *data,
struct drm_file *file_priv);
/* ATI PCIGART support (ati_pcigart.h) */ /* ATI PCIGART support (ati_pcigart.h) */
extern int drm_ati_pcigart_init(struct drm_device *dev, extern int drm_ati_pcigart_init(struct drm_device *dev,
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
* Get AGP information. * Get AGP information.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a (output) drm_agp_info structure. * \param arg pointer to a (output) drm_agp_info structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -71,20 +71,16 @@ int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info) ...@@ -71,20 +71,16 @@ int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info)
EXPORT_SYMBOL(drm_agp_info); EXPORT_SYMBOL(drm_agp_info);
int drm_agp_info_ioctl(struct inode *inode, struct file *filp, int drm_agp_info_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_agp_info *info = data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_info info;
int err; int err;
err = drm_agp_info(dev, &info); err = drm_agp_info(dev, info);
if (err) if (err)
return err; return err;
if (copy_to_user((struct drm_agp_info __user *) arg, &info, sizeof(info)))
return -EFAULT;
return 0; return 0;
} }
...@@ -115,7 +111,7 @@ EXPORT_SYMBOL(drm_agp_acquire); ...@@ -115,7 +111,7 @@ EXPORT_SYMBOL(drm_agp_acquire);
* Acquire the AGP device (ioctl). * Acquire the AGP device (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument. * \param arg user argument.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -123,12 +119,10 @@ EXPORT_SYMBOL(drm_agp_acquire); ...@@ -123,12 +119,10 @@ EXPORT_SYMBOL(drm_agp_acquire);
* Verifies the AGP device hasn't been acquired before and calls * Verifies the AGP device hasn't been acquired before and calls
* \c agp_backend_acquire. * \c agp_backend_acquire.
*/ */
int drm_agp_acquire_ioctl(struct inode *inode, struct file *filp, int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; return drm_agp_acquire((struct drm_device *) file_priv->head->dev);
return drm_agp_acquire((struct drm_device *) priv->head->dev);
} }
/** /**
...@@ -149,12 +143,9 @@ int drm_agp_release(struct drm_device * dev) ...@@ -149,12 +143,9 @@ int drm_agp_release(struct drm_device * dev)
} }
EXPORT_SYMBOL(drm_agp_release); EXPORT_SYMBOL(drm_agp_release);
int drm_agp_release_ioctl(struct inode *inode, struct file *filp, int drm_agp_release_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
return drm_agp_release(dev); return drm_agp_release(dev);
} }
...@@ -182,24 +173,19 @@ int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode) ...@@ -182,24 +173,19 @@ int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode)
EXPORT_SYMBOL(drm_agp_enable); EXPORT_SYMBOL(drm_agp_enable);
int drm_agp_enable_ioctl(struct inode *inode, struct file *filp, int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_agp_mode *mode = data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_mode mode;
if (copy_from_user(&mode, (struct drm_agp_mode __user *) arg, sizeof(mode)))
return -EFAULT;
return drm_agp_enable(dev, mode); return drm_agp_enable(dev, *mode);
} }
/** /**
* Allocate AGP memory. * Allocate AGP memory.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv file private pointer.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_agp_buffer structure. * \param arg pointer to a drm_agp_buffer structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -241,35 +227,13 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request) ...@@ -241,35 +227,13 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
} }
EXPORT_SYMBOL(drm_agp_alloc); EXPORT_SYMBOL(drm_agp_alloc);
int drm_agp_alloc_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_buffer request;
struct drm_agp_buffer __user *argp = (void __user *)arg;
int err;
if (copy_from_user(&request, argp, sizeof(request)))
return -EFAULT;
err = drm_agp_alloc(dev, &request); int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
if (err) struct drm_file *file_priv)
return err; {
struct drm_agp_buffer *request = data;
if (copy_to_user(argp, &request, sizeof(request))) {
struct drm_agp_mem *entry;
list_for_each_entry(entry, &dev->agp->memory, head) {
if (entry->handle == request.handle)
break;
}
list_del(&entry->head);
drm_free_agp(entry->memory, entry->pages);
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
return -EFAULT;
}
return 0; return drm_agp_alloc(dev, request);
} }
/** /**
...@@ -297,7 +261,7 @@ static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device * dev, ...@@ -297,7 +261,7 @@ static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device * dev,
* Unbind AGP memory from the GATT (ioctl). * Unbind AGP memory from the GATT (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_agp_binding structure. * \param arg pointer to a drm_agp_binding structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -323,25 +287,20 @@ int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request) ...@@ -323,25 +287,20 @@ int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request)
} }
EXPORT_SYMBOL(drm_agp_unbind); EXPORT_SYMBOL(drm_agp_unbind);
int drm_agp_unbind_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_binding request;
if (copy_from_user int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
(&request, (struct drm_agp_binding __user *) arg, sizeof(request))) struct drm_file *file_priv)
return -EFAULT; {
struct drm_agp_binding *request = data;
return drm_agp_unbind(dev, &request); return drm_agp_unbind(dev, request);
} }
/** /**
* Bind AGP memory into the GATT (ioctl) * Bind AGP memory into the GATT (ioctl)
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_agp_binding structure. * \param arg pointer to a drm_agp_binding structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -372,25 +331,20 @@ int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request) ...@@ -372,25 +331,20 @@ int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request)
} }
EXPORT_SYMBOL(drm_agp_bind); EXPORT_SYMBOL(drm_agp_bind);
int drm_agp_bind_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_binding request;
if (copy_from_user int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
(&request, (struct drm_agp_binding __user *) arg, sizeof(request))) struct drm_file *file_priv)
return -EFAULT; {
struct drm_agp_binding *request = data;
return drm_agp_bind(dev, &request); return drm_agp_bind(dev, request);
} }
/** /**
* Free AGP memory (ioctl). * Free AGP memory (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_agp_buffer structure. * \param arg pointer to a drm_agp_buffer structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -419,18 +373,14 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request) ...@@ -419,18 +373,14 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
} }
EXPORT_SYMBOL(drm_agp_free); EXPORT_SYMBOL(drm_agp_free);
int drm_agp_free_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_agp_buffer request;
if (copy_from_user
(&request, (struct drm_agp_buffer __user *) arg, sizeof(request)))
return -EFAULT;
return drm_agp_free(dev, &request); int drm_agp_free_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
struct drm_agp_buffer *request = data;
return drm_agp_free(dev, request);
} }
/** /**
......
...@@ -128,42 +128,38 @@ static int drm_remove_magic(struct drm_device * dev, drm_magic_t magic) ...@@ -128,42 +128,38 @@ static int drm_remove_magic(struct drm_device * dev, drm_magic_t magic)
* Get a unique magic number (ioctl). * Get a unique magic number (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a resulting drm_auth structure. * \param arg pointer to a resulting drm_auth structure.
* \return zero on success, or a negative number on failure. * \return zero on success, or a negative number on failure.
* *
* If there is a magic number in drm_file::magic then use it, otherwise * If there is a magic number in drm_file::magic then use it, otherwise
* searches an unique non-zero magic number and add it associating it with \p * searches an unique non-zero magic number and add it associating it with \p
* filp. * file_priv.
*/ */
int drm_getmagic(struct inode *inode, struct file *filp, int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv)
unsigned int cmd, unsigned long arg)
{ {
static drm_magic_t sequence = 0; static drm_magic_t sequence = 0;
static DEFINE_SPINLOCK(lock); static DEFINE_SPINLOCK(lock);
struct drm_file *priv = filp->private_data; struct drm_auth *auth = data;
struct drm_device *dev = priv->head->dev;
struct drm_auth auth;
/* Find unique magic */ /* Find unique magic */
if (priv->magic) { if (file_priv->magic) {
auth.magic = priv->magic; auth->magic = file_priv->magic;
} else { } else {
do { do {
spin_lock(&lock); spin_lock(&lock);
if (!sequence) if (!sequence)
++sequence; /* reserve 0 */ ++sequence; /* reserve 0 */
auth.magic = sequence++; auth->magic = sequence++;
spin_unlock(&lock); spin_unlock(&lock);
} while (drm_find_file(dev, auth.magic)); } while (drm_find_file(dev, auth->magic));
priv->magic = auth.magic; file_priv->magic = auth->magic;
drm_add_magic(dev, priv, auth.magic); drm_add_magic(dev, file_priv, auth->magic);
} }
DRM_DEBUG("%u\n", auth.magic); DRM_DEBUG("%u\n", auth->magic);
if (copy_to_user((struct drm_auth __user *) arg, &auth, sizeof(auth)))
return -EFAULT;
return 0; return 0;
} }
...@@ -171,27 +167,23 @@ int drm_getmagic(struct inode *inode, struct file *filp, ...@@ -171,27 +167,23 @@ int drm_getmagic(struct inode *inode, struct file *filp,
* Authenticate with a magic. * Authenticate with a magic.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_auth structure. * \param arg pointer to a drm_auth structure.
* \return zero if authentication successed, or a negative number otherwise. * \return zero if authentication successed, or a negative number otherwise.
* *
* Checks if \p filp is associated with the magic number passed in \arg. * Checks if \p file_priv is associated with the magic number passed in \arg.
*/ */
int drm_authmagic(struct inode *inode, struct file *filp, int drm_authmagic(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_auth *auth = data;
struct drm_device *dev = priv->head->dev;
struct drm_auth auth;
struct drm_file *file; struct drm_file *file;
if (copy_from_user(&auth, (struct drm_auth __user *) arg, sizeof(auth))) DRM_DEBUG("%u\n", auth->magic);
return -EFAULT; if ((file = drm_find_file(dev, auth->magic))) {
DRM_DEBUG("%u\n", auth.magic);
if ((file = drm_find_file(dev, auth.magic))) {
file->authenticated = 1; file->authenticated = 1;
drm_remove_magic(dev, auth.magic); drm_remove_magic(dev, auth->magic);
return 0; return 0;
} }
return -EINVAL; return -EINVAL;
......
...@@ -92,7 +92,7 @@ static int drm_map_handle(struct drm_device *dev, struct drm_hash_item *hash, ...@@ -92,7 +92,7 @@ static int drm_map_handle(struct drm_device *dev, struct drm_hash_item *hash,
* Ioctl to specify a range of memory that is available for mapping by a non-root process. * Ioctl to specify a range of memory that is available for mapping by a non-root process.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_map structure. * \param arg pointer to a drm_map structure.
* \return zero on success or a negative value on error. * \return zero on success or a negative value on error.
...@@ -332,38 +332,24 @@ int drm_addmap(struct drm_device * dev, unsigned int offset, ...@@ -332,38 +332,24 @@ int drm_addmap(struct drm_device * dev, unsigned int offset,
EXPORT_SYMBOL(drm_addmap); EXPORT_SYMBOL(drm_addmap);
int drm_addmap_ioctl(struct inode *inode, struct file *filp, int drm_addmap_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_map *map = data;
struct drm_device *dev = priv->head->dev;
struct drm_map map;
struct drm_map_list *maplist; struct drm_map_list *maplist;
struct drm_map __user *argp = (void __user *)arg;
int err; int err;
if (!(filp->f_mode & 3)) if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP))
return -EACCES; /* Require read/write */
if (copy_from_user(&map, argp, sizeof(map))) {
return -EFAULT;
}
if (!(capable(CAP_SYS_ADMIN) || map.type == _DRM_AGP))
return -EPERM; return -EPERM;
err = drm_addmap_core(dev, map.offset, map.size, map.type, map.flags, err = drm_addmap_core(dev, map->offset, map->size, map->type,
&maplist); map->flags, &maplist);
if (err) if (err)
return err; return err;
if (copy_to_user(argp, maplist->map, sizeof(struct drm_map)))
return -EFAULT;
/* avoid a warning on 64-bit, this casting isn't very nice, but the API is set so too late */ /* avoid a warning on 64-bit, this casting isn't very nice, but the API is set so too late */
if (put_user((void *)(unsigned long)maplist->user_token, &argp->handle)) map->handle = (void *)(unsigned long)maplist->user_token;
return -EFAULT;
return 0; return 0;
} }
...@@ -372,7 +358,7 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp, ...@@ -372,7 +358,7 @@ int drm_addmap_ioctl(struct inode *inode, struct file *filp,
* isn't in use. * isn't in use.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a struct drm_map structure. * \param arg pointer to a struct drm_map structure.
* \return zero on success or a negative value on error. * \return zero on success or a negative value on error.
...@@ -453,24 +439,18 @@ int drm_rmmap(struct drm_device *dev, drm_local_map_t *map) ...@@ -453,24 +439,18 @@ int drm_rmmap(struct drm_device *dev, drm_local_map_t *map)
* gets used by drivers that the server doesn't need to care about. This seems * gets used by drivers that the server doesn't need to care about. This seems
* unlikely. * unlikely.
*/ */
int drm_rmmap_ioctl(struct inode *inode, struct file *filp, int drm_rmmap_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_map *request = data;
struct drm_device *dev = priv->head->dev;
struct drm_map request;
drm_local_map_t *map = NULL; drm_local_map_t *map = NULL;
struct drm_map_list *r_list; struct drm_map_list *r_list;
int ret; int ret;
if (copy_from_user(&request, (struct drm_map __user *) arg, sizeof(request))) {
return -EFAULT;
}
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
list_for_each_entry(r_list, &dev->maplist, head) { list_for_each_entry(r_list, &dev->maplist, head) {
if (r_list->map && if (r_list->map &&
r_list->user_token == (unsigned long)request.handle && r_list->user_token == (unsigned long)request->handle &&
r_list->map->flags & _DRM_REMOVABLE) { r_list->map->flags & _DRM_REMOVABLE) {
map = r_list->map; map = r_list->map;
break; break;
...@@ -661,7 +641,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request) ...@@ -661,7 +641,7 @@ int drm_addbufs_agp(struct drm_device * dev, struct drm_buf_desc * request)
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
init_waitqueue_head(&buf->dma_wait); init_waitqueue_head(&buf->dma_wait);
buf->filp = NULL; buf->file_priv = NULL;
buf->dev_priv_size = dev->driver->dev_priv_size; buf->dev_priv_size = dev->driver->dev_priv_size;
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
...@@ -872,7 +852,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request) ...@@ -872,7 +852,7 @@ int drm_addbufs_pci(struct drm_device * dev, struct drm_buf_desc * request)
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
init_waitqueue_head(&buf->dma_wait); init_waitqueue_head(&buf->dma_wait);
buf->filp = NULL; buf->file_priv = NULL;
buf->dev_priv_size = dev->driver->dev_priv_size; buf->dev_priv_size = dev->driver->dev_priv_size;
buf->dev_private = drm_alloc(buf->dev_priv_size, buf->dev_private = drm_alloc(buf->dev_priv_size,
...@@ -1050,7 +1030,7 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request ...@@ -1050,7 +1030,7 @@ static int drm_addbufs_sg(struct drm_device * dev, struct drm_buf_desc * request
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
init_waitqueue_head(&buf->dma_wait); init_waitqueue_head(&buf->dma_wait);
buf->filp = NULL; buf->file_priv = NULL;
buf->dev_priv_size = dev->driver->dev_priv_size; buf->dev_priv_size = dev->driver->dev_priv_size;
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
...@@ -1211,7 +1191,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request ...@@ -1211,7 +1191,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
init_waitqueue_head(&buf->dma_wait); init_waitqueue_head(&buf->dma_wait);
buf->filp = NULL; buf->file_priv = NULL;
buf->dev_priv_size = dev->driver->dev_priv_size; buf->dev_priv_size = dev->driver->dev_priv_size;
buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS); buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
...@@ -1275,7 +1255,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request ...@@ -1275,7 +1255,7 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
* Add buffers for DMA transfers (ioctl). * Add buffers for DMA transfers (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a struct drm_buf_desc request. * \param arg pointer to a struct drm_buf_desc request.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -1285,38 +1265,27 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request ...@@ -1285,38 +1265,27 @@ static int drm_addbufs_fb(struct drm_device * dev, struct drm_buf_desc * request
* addbufs_sg() or addbufs_pci() for AGP, scatter-gather or consistent * addbufs_sg() or addbufs_pci() for AGP, scatter-gather or consistent
* PCI memory respectively. * PCI memory respectively.
*/ */
int drm_addbufs(struct inode *inode, struct file *filp, int drm_addbufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_buf_desc request; struct drm_buf_desc *request = data;
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
int ret; int ret;
if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA))
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, (struct drm_buf_desc __user *) arg,
sizeof(request)))
return -EFAULT;
#if __OS_HAS_AGP #if __OS_HAS_AGP
if (request.flags & _DRM_AGP_BUFFER) if (request->flags & _DRM_AGP_BUFFER)
ret = drm_addbufs_agp(dev, &request); ret = drm_addbufs_agp(dev, request);
else else
#endif #endif
if (request.flags & _DRM_SG_BUFFER) if (request->flags & _DRM_SG_BUFFER)
ret = drm_addbufs_sg(dev, &request); ret = drm_addbufs_sg(dev, request);
else if (request.flags & _DRM_FB_BUFFER) else if (request->flags & _DRM_FB_BUFFER)
ret = drm_addbufs_fb(dev, &request); ret = drm_addbufs_fb(dev, request);
else else
ret = drm_addbufs_pci(dev, &request); ret = drm_addbufs_pci(dev, request);
if (ret == 0) {
if (copy_to_user((void __user *)arg, &request, sizeof(request))) {
ret = -EFAULT;
}
}
return ret; return ret;
} }
...@@ -1328,7 +1297,7 @@ int drm_addbufs(struct inode *inode, struct file *filp, ...@@ -1328,7 +1297,7 @@ int drm_addbufs(struct inode *inode, struct file *filp,
* large buffers can be used for image transfer). * large buffers can be used for image transfer).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_buf_info structure. * \param arg pointer to a drm_buf_info structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -1337,14 +1306,11 @@ int drm_addbufs(struct inode *inode, struct file *filp, ...@@ -1337,14 +1306,11 @@ int drm_addbufs(struct inode *inode, struct file *filp,
* lock, preventing of allocating more buffers after this call. Information * lock, preventing of allocating more buffers after this call. Information
* about each requested buffer is then copied into user space. * about each requested buffer is then copied into user space.
*/ */
int drm_infobufs(struct inode *inode, struct file *filp, int drm_infobufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
struct drm_buf_info request; struct drm_buf_info *request = data;
struct drm_buf_info __user *argp = (void __user *)arg;
int i; int i;
int count; int count;
...@@ -1362,9 +1328,6 @@ int drm_infobufs(struct inode *inode, struct file *filp, ...@@ -1362,9 +1328,6 @@ int drm_infobufs(struct inode *inode, struct file *filp,
++dev->buf_use; /* Can't allocate more after this call */ ++dev->buf_use; /* Can't allocate more after this call */
spin_unlock(&dev->count_lock); spin_unlock(&dev->count_lock);
if (copy_from_user(&request, argp, sizeof(request)))
return -EFAULT;
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) { for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
if (dma->bufs[i].buf_count) if (dma->bufs[i].buf_count)
++count; ++count;
...@@ -1372,11 +1335,11 @@ int drm_infobufs(struct inode *inode, struct file *filp, ...@@ -1372,11 +1335,11 @@ int drm_infobufs(struct inode *inode, struct file *filp,
DRM_DEBUG("count = %d\n", count); DRM_DEBUG("count = %d\n", count);
if (request.count >= count) { if (request->count >= count) {
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) { for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
if (dma->bufs[i].buf_count) { if (dma->bufs[i].buf_count) {
struct drm_buf_desc __user *to = struct drm_buf_desc __user *to =
&request.list[count]; &request->list[count];
struct drm_buf_entry *from = &dma->bufs[i]; struct drm_buf_entry *from = &dma->bufs[i];
struct drm_freelist *list = &dma->bufs[i].freelist; struct drm_freelist *list = &dma->bufs[i].freelist;
if (copy_to_user(&to->count, if (copy_to_user(&to->count,
...@@ -1403,10 +1366,7 @@ int drm_infobufs(struct inode *inode, struct file *filp, ...@@ -1403,10 +1366,7 @@ int drm_infobufs(struct inode *inode, struct file *filp,
} }
} }
} }
request.count = count; request->count = count;
if (copy_to_user(argp, &request, sizeof(request)))
return -EFAULT;
return 0; return 0;
} }
...@@ -1415,7 +1375,7 @@ int drm_infobufs(struct inode *inode, struct file *filp, ...@@ -1415,7 +1375,7 @@ int drm_infobufs(struct inode *inode, struct file *filp,
* Specifies a low and high water mark for buffer allocation * Specifies a low and high water mark for buffer allocation
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg a pointer to a drm_buf_desc structure. * \param arg a pointer to a drm_buf_desc structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -1425,13 +1385,11 @@ int drm_infobufs(struct inode *inode, struct file *filp, ...@@ -1425,13 +1385,11 @@ int drm_infobufs(struct inode *inode, struct file *filp,
* *
* \note This ioctl is deprecated and mostly never used. * \note This ioctl is deprecated and mostly never used.
*/ */
int drm_markbufs(struct inode *inode, struct file *filp, int drm_markbufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
struct drm_buf_desc request; struct drm_buf_desc *request = data;
int order; int order;
struct drm_buf_entry *entry; struct drm_buf_entry *entry;
...@@ -1441,24 +1399,20 @@ int drm_markbufs(struct inode *inode, struct file *filp, ...@@ -1441,24 +1399,20 @@ int drm_markbufs(struct inode *inode, struct file *filp,
if (!dma) if (!dma)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request,
(struct drm_buf_desc __user *) arg, sizeof(request)))
return -EFAULT;
DRM_DEBUG("%d, %d, %d\n", DRM_DEBUG("%d, %d, %d\n",
request.size, request.low_mark, request.high_mark); request->size, request->low_mark, request->high_mark);
order = drm_order(request.size); order = drm_order(request->size);
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER) if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
return -EINVAL; return -EINVAL;
entry = &dma->bufs[order]; entry = &dma->bufs[order];
if (request.low_mark < 0 || request.low_mark > entry->buf_count) if (request->low_mark < 0 || request->low_mark > entry->buf_count)
return -EINVAL; return -EINVAL;
if (request.high_mark < 0 || request.high_mark > entry->buf_count) if (request->high_mark < 0 || request->high_mark > entry->buf_count)
return -EINVAL; return -EINVAL;
entry->freelist.low_mark = request.low_mark; entry->freelist.low_mark = request->low_mark;
entry->freelist.high_mark = request.high_mark; entry->freelist.high_mark = request->high_mark;
return 0; return 0;
} }
...@@ -1467,7 +1421,7 @@ int drm_markbufs(struct inode *inode, struct file *filp, ...@@ -1467,7 +1421,7 @@ int drm_markbufs(struct inode *inode, struct file *filp,
* Unreserve the buffers in list, previously reserved using drmDMA. * Unreserve the buffers in list, previously reserved using drmDMA.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_buf_free structure. * \param arg pointer to a drm_buf_free structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -1475,13 +1429,11 @@ int drm_markbufs(struct inode *inode, struct file *filp, ...@@ -1475,13 +1429,11 @@ int drm_markbufs(struct inode *inode, struct file *filp,
* Calls free_buffer() for each used buffer. * Calls free_buffer() for each used buffer.
* This function is primarily used for debugging. * This function is primarily used for debugging.
*/ */
int drm_freebufs(struct inode *inode, struct file *filp, int drm_freebufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
struct drm_buf_free request; struct drm_buf_free *request = data;
int i; int i;
int idx; int idx;
struct drm_buf *buf; struct drm_buf *buf;
...@@ -1492,13 +1444,9 @@ int drm_freebufs(struct inode *inode, struct file *filp, ...@@ -1492,13 +1444,9 @@ int drm_freebufs(struct inode *inode, struct file *filp,
if (!dma) if (!dma)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, DRM_DEBUG("%d\n", request->count);
(struct drm_buf_free __user *) arg, sizeof(request))) for (i = 0; i < request->count; i++) {
return -EFAULT; if (copy_from_user(&idx, &request->list[i], sizeof(idx)))
DRM_DEBUG("%d\n", request.count);
for (i = 0; i < request.count; i++) {
if (copy_from_user(&idx, &request.list[i], sizeof(idx)))
return -EFAULT; return -EFAULT;
if (idx < 0 || idx >= dma->buf_count) { if (idx < 0 || idx >= dma->buf_count) {
DRM_ERROR("Index %d (of %d max)\n", DRM_ERROR("Index %d (of %d max)\n",
...@@ -1506,7 +1454,7 @@ int drm_freebufs(struct inode *inode, struct file *filp, ...@@ -1506,7 +1454,7 @@ int drm_freebufs(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
} }
buf = dma->buflist[idx]; buf = dma->buflist[idx];
if (buf->filp != filp) { if (buf->file_priv != file_priv) {
DRM_ERROR("Process %d freeing buffer not owned\n", DRM_ERROR("Process %d freeing buffer not owned\n",
current->pid); current->pid);
return -EINVAL; return -EINVAL;
...@@ -1521,7 +1469,7 @@ int drm_freebufs(struct inode *inode, struct file *filp, ...@@ -1521,7 +1469,7 @@ int drm_freebufs(struct inode *inode, struct file *filp,
* Maps all of the DMA buffers into client-virtual space (ioctl). * Maps all of the DMA buffers into client-virtual space (ioctl).
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg pointer to a drm_buf_map structure. * \param arg pointer to a drm_buf_map structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -1531,18 +1479,15 @@ int drm_freebufs(struct inode *inode, struct file *filp, ...@@ -1531,18 +1479,15 @@ int drm_freebufs(struct inode *inode, struct file *filp,
* offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls * offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls
* drm_mmap_dma(). * drm_mmap_dma().
*/ */
int drm_mapbufs(struct inode *inode, struct file *filp, int drm_mapbufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
struct drm_buf_map __user *argp = (void __user *)arg;
int retcode = 0; int retcode = 0;
const int zero = 0; const int zero = 0;
unsigned long virtual; unsigned long virtual;
unsigned long address; unsigned long address;
struct drm_buf_map request; struct drm_buf_map *request = data;
int i; int i;
if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA)) if (!drm_core_check_feature(dev, DRIVER_HAVE_DMA))
...@@ -1559,10 +1504,7 @@ int drm_mapbufs(struct inode *inode, struct file *filp, ...@@ -1559,10 +1504,7 @@ int drm_mapbufs(struct inode *inode, struct file *filp,
dev->buf_use++; /* Can't allocate more after this call */ dev->buf_use++; /* Can't allocate more after this call */
spin_unlock(&dev->count_lock); spin_unlock(&dev->count_lock);
if (copy_from_user(&request, argp, sizeof(request))) if (request->count >= dma->buf_count) {
return -EFAULT;
if (request.count >= dma->buf_count) {
if ((drm_core_has_AGP(dev) && (dma->flags & _DRM_DMA_USE_AGP)) if ((drm_core_has_AGP(dev) && (dma->flags & _DRM_DMA_USE_AGP))
|| (drm_core_check_feature(dev, DRIVER_SG) || (drm_core_check_feature(dev, DRIVER_SG)
&& (dma->flags & _DRM_DMA_USE_SG)) && (dma->flags & _DRM_DMA_USE_SG))
...@@ -1575,15 +1517,15 @@ int drm_mapbufs(struct inode *inode, struct file *filp, ...@@ -1575,15 +1517,15 @@ int drm_mapbufs(struct inode *inode, struct file *filp,
retcode = -EINVAL; retcode = -EINVAL;
goto done; goto done;
} }
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
virtual = do_mmap(filp, 0, map->size, virtual = do_mmap(file_priv->filp, 0, map->size,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, token); MAP_SHARED,
token);
up_write(&current->mm->mmap_sem); up_write(&current->mm->mmap_sem);
} else { } else {
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
virtual = do_mmap(filp, 0, dma->byte_count, virtual = do_mmap(file_priv->filp, 0, dma->byte_count,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, 0); MAP_SHARED, 0);
up_write(&current->mm->mmap_sem); up_write(&current->mm->mmap_sem);
...@@ -1593,28 +1535,28 @@ int drm_mapbufs(struct inode *inode, struct file *filp, ...@@ -1593,28 +1535,28 @@ int drm_mapbufs(struct inode *inode, struct file *filp,
retcode = (signed long)virtual; retcode = (signed long)virtual;
goto done; goto done;
} }
request.virtual = (void __user *)virtual; request->virtual = (void __user *)virtual;
for (i = 0; i < dma->buf_count; i++) { for (i = 0; i < dma->buf_count; i++) {
if (copy_to_user(&request.list[i].idx, if (copy_to_user(&request->list[i].idx,
&dma->buflist[i]->idx, &dma->buflist[i]->idx,
sizeof(request.list[0].idx))) { sizeof(request->list[0].idx))) {
retcode = -EFAULT; retcode = -EFAULT;
goto done; goto done;
} }
if (copy_to_user(&request.list[i].total, if (copy_to_user(&request->list[i].total,
&dma->buflist[i]->total, &dma->buflist[i]->total,
sizeof(request.list[0].total))) { sizeof(request->list[0].total))) {
retcode = -EFAULT; retcode = -EFAULT;
goto done; goto done;
} }
if (copy_to_user(&request.list[i].used, if (copy_to_user(&request->list[i].used,
&zero, sizeof(zero))) { &zero, sizeof(zero))) {
retcode = -EFAULT; retcode = -EFAULT;
goto done; goto done;
} }
address = virtual + dma->buflist[i]->offset; /* *** */ address = virtual + dma->buflist[i]->offset; /* *** */
if (copy_to_user(&request.list[i].address, if (copy_to_user(&request->list[i].address,
&address, sizeof(address))) { &address, sizeof(address))) {
retcode = -EFAULT; retcode = -EFAULT;
goto done; goto done;
...@@ -1622,11 +1564,8 @@ int drm_mapbufs(struct inode *inode, struct file *filp, ...@@ -1622,11 +1564,8 @@ int drm_mapbufs(struct inode *inode, struct file *filp,
} }
} }
done: done:
request.count = dma->buf_count; request->count = dma->buf_count;
DRM_DEBUG("%d buffers, retcode = %d\n", request.count, retcode); DRM_DEBUG("%d buffers, retcode = %d\n", request->count, retcode);
if (copy_to_user(argp, &request, sizeof(request)))
return -EFAULT;
return retcode; return retcode;
} }
......
...@@ -131,7 +131,7 @@ void drm_ctxbitmap_cleanup(struct drm_device * dev) ...@@ -131,7 +131,7 @@ void drm_ctxbitmap_cleanup(struct drm_device * dev)
* Get per-context SAREA. * Get per-context SAREA.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx_priv_map structure. * \param arg user argument pointing to a drm_ctx_priv_map structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -139,22 +139,16 @@ void drm_ctxbitmap_cleanup(struct drm_device * dev) ...@@ -139,22 +139,16 @@ void drm_ctxbitmap_cleanup(struct drm_device * dev)
* Gets the map from drm_device::ctx_idr with the handle specified and * Gets the map from drm_device::ctx_idr with the handle specified and
* returns its handle. * returns its handle.
*/ */
int drm_getsareactx(struct inode *inode, struct file *filp, int drm_getsareactx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_ctx_priv_map *request = data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx_priv_map __user *argp = (void __user *)arg;
struct drm_ctx_priv_map request;
struct drm_map *map; struct drm_map *map;
struct drm_map_list *_entry; struct drm_map_list *_entry;
if (copy_from_user(&request, argp, sizeof(request)))
return -EFAULT;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
map = idr_find(&dev->ctx_idr, request.ctx_id); map = idr_find(&dev->ctx_idr, request->ctx_id);
if (!map) { if (!map) {
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return -EINVAL; return -EINVAL;
...@@ -162,19 +156,17 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -162,19 +156,17 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
request.handle = NULL; request->handle = NULL;
list_for_each_entry(_entry, &dev->maplist, head) { list_for_each_entry(_entry, &dev->maplist, head) {
if (_entry->map == map) { if (_entry->map == map) {
request.handle = request->handle =
(void *)(unsigned long)_entry->user_token; (void *)(unsigned long)_entry->user_token;
break; break;
} }
} }
if (request.handle == NULL) if (request->handle == NULL)
return -EINVAL; return -EINVAL;
if (copy_to_user(argp, &request, sizeof(request)))
return -EFAULT;
return 0; return 0;
} }
...@@ -182,7 +174,7 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -182,7 +174,7 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
* Set per-context SAREA. * Set per-context SAREA.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx_priv_map structure. * \param arg user argument pointing to a drm_ctx_priv_map structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -190,24 +182,17 @@ int drm_getsareactx(struct inode *inode, struct file *filp, ...@@ -190,24 +182,17 @@ int drm_getsareactx(struct inode *inode, struct file *filp,
* Searches the mapping specified in \p arg and update the entry in * Searches the mapping specified in \p arg and update the entry in
* drm_device::ctx_idr with it. * drm_device::ctx_idr with it.
*/ */
int drm_setsareactx(struct inode *inode, struct file *filp, int drm_setsareactx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_ctx_priv_map *request = data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx_priv_map request;
struct drm_map *map = NULL; struct drm_map *map = NULL;
struct drm_map_list *r_list = NULL; struct drm_map_list *r_list = NULL;
if (copy_from_user(&request,
(struct drm_ctx_priv_map __user *) arg,
sizeof(request)))
return -EFAULT;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
list_for_each_entry(r_list, &dev->maplist, head) { list_for_each_entry(r_list, &dev->maplist, head) {
if (r_list->map if (r_list->map
&& r_list->user_token == (unsigned long)request.handle) && r_list->user_token == (unsigned long) request->handle)
goto found; goto found;
} }
bad: bad:
...@@ -219,10 +204,11 @@ int drm_setsareactx(struct inode *inode, struct file *filp, ...@@ -219,10 +204,11 @@ int drm_setsareactx(struct inode *inode, struct file *filp,
if (!map) if (!map)
goto bad; goto bad;
if (IS_ERR(idr_replace(&dev->ctx_idr, map, request.ctx_id))) if (IS_ERR(idr_replace(&dev->ctx_idr, map, request->ctx_id)))
goto bad; goto bad;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
return 0; return 0;
} }
...@@ -292,34 +278,28 @@ static int drm_context_switch_complete(struct drm_device * dev, int new) ...@@ -292,34 +278,28 @@ static int drm_context_switch_complete(struct drm_device * dev, int new)
* Reserve contexts. * Reserve contexts.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx_res structure. * \param arg user argument pointing to a drm_ctx_res structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_resctx(struct inode *inode, struct file *filp, int drm_resctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_ctx_res res; struct drm_ctx_res *res = data;
struct drm_ctx_res __user *argp = (void __user *)arg;
struct drm_ctx ctx; struct drm_ctx ctx;
int i; int i;
if (copy_from_user(&res, argp, sizeof(res))) if (res->count >= DRM_RESERVED_CONTEXTS) {
return -EFAULT;
if (res.count >= DRM_RESERVED_CONTEXTS) {
memset(&ctx, 0, sizeof(ctx)); memset(&ctx, 0, sizeof(ctx));
for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) {
ctx.handle = i; ctx.handle = i;
if (copy_to_user(&res.contexts[i], &ctx, sizeof(ctx))) if (copy_to_user(&res->contexts[i], &ctx, sizeof(ctx)))
return -EFAULT; return -EFAULT;
} }
} }
res.count = DRM_RESERVED_CONTEXTS; res->count = DRM_RESERVED_CONTEXTS;
if (copy_to_user(argp, &res, sizeof(res)))
return -EFAULT;
return 0; return 0;
} }
...@@ -327,40 +307,34 @@ int drm_resctx(struct inode *inode, struct file *filp, ...@@ -327,40 +307,34 @@ int drm_resctx(struct inode *inode, struct file *filp,
* Add context. * Add context.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Get a new handle for the context and copy to userspace. * Get a new handle for the context and copy to userspace.
*/ */
int drm_addctx(struct inode *inode, struct file *filp, int drm_addctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx_list *ctx_entry; struct drm_ctx_list *ctx_entry;
struct drm_ctx __user *argp = (void __user *)arg; struct drm_ctx *ctx = data;
struct drm_ctx ctx;
if (copy_from_user(&ctx, argp, sizeof(ctx)))
return -EFAULT;
ctx.handle = drm_ctxbitmap_next(dev); ctx->handle = drm_ctxbitmap_next(dev);
if (ctx.handle == DRM_KERNEL_CONTEXT) { if (ctx->handle == DRM_KERNEL_CONTEXT) {
/* Skip kernel's context and get a new one. */ /* Skip kernel's context and get a new one. */
ctx.handle = drm_ctxbitmap_next(dev); ctx->handle = drm_ctxbitmap_next(dev);
} }
DRM_DEBUG("%d\n", ctx.handle); DRM_DEBUG("%d\n", ctx->handle);
if (ctx.handle == -1) { if (ctx->handle == -1) {
DRM_DEBUG("Not enough free contexts.\n"); DRM_DEBUG("Not enough free contexts.\n");
/* Should this return -EBUSY instead? */ /* Should this return -EBUSY instead? */
return -ENOMEM; return -ENOMEM;
} }
if (ctx.handle != DRM_KERNEL_CONTEXT) { if (ctx->handle != DRM_KERNEL_CONTEXT) {
if (dev->driver->context_ctor) if (dev->driver->context_ctor)
if (!dev->driver->context_ctor(dev, ctx.handle)) { if (!dev->driver->context_ctor(dev, ctx->handle)) {
DRM_DEBUG("Running out of ctxs or memory.\n"); DRM_DEBUG("Running out of ctxs or memory.\n");
return -ENOMEM; return -ENOMEM;
} }
...@@ -373,21 +347,18 @@ int drm_addctx(struct inode *inode, struct file *filp, ...@@ -373,21 +347,18 @@ int drm_addctx(struct inode *inode, struct file *filp,
} }
INIT_LIST_HEAD(&ctx_entry->head); INIT_LIST_HEAD(&ctx_entry->head);
ctx_entry->handle = ctx.handle; ctx_entry->handle = ctx->handle;
ctx_entry->tag = priv; ctx_entry->tag = file_priv;
mutex_lock(&dev->ctxlist_mutex); mutex_lock(&dev->ctxlist_mutex);
list_add(&ctx_entry->head, &dev->ctxlist); list_add(&ctx_entry->head, &dev->ctxlist);
++dev->ctx_count; ++dev->ctx_count;
mutex_unlock(&dev->ctxlist_mutex); mutex_unlock(&dev->ctxlist_mutex);
if (copy_to_user(argp, &ctx, sizeof(ctx)))
return -EFAULT;
return 0; return 0;
} }
int drm_modctx(struct inode *inode, struct file *filp, int drm_modctx(struct drm_device *dev, void *data, struct drm_file *file_priv)
unsigned int cmd, unsigned long arg)
{ {
/* This does nothing */ /* This does nothing */
return 0; return 0;
...@@ -397,25 +368,18 @@ int drm_modctx(struct inode *inode, struct file *filp, ...@@ -397,25 +368,18 @@ int drm_modctx(struct inode *inode, struct file *filp,
* Get context. * Get context.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_getctx(struct inode *inode, struct file *filp, int drm_getctx(struct drm_device *dev, void *data, struct drm_file *file_priv)
unsigned int cmd, unsigned long arg)
{ {
struct drm_ctx __user *argp = (void __user *)arg; struct drm_ctx *ctx = data;
struct drm_ctx ctx;
if (copy_from_user(&ctx, argp, sizeof(ctx)))
return -EFAULT;
/* This is 0, because we don't handle any context flags */ /* This is 0, because we don't handle any context flags */
ctx.flags = 0; ctx->flags = 0;
if (copy_to_user(argp, &ctx, sizeof(ctx)))
return -EFAULT;
return 0; return 0;
} }
...@@ -423,50 +387,40 @@ int drm_getctx(struct inode *inode, struct file *filp, ...@@ -423,50 +387,40 @@ int drm_getctx(struct inode *inode, struct file *filp,
* Switch context. * Switch context.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Calls context_switch(). * Calls context_switch().
*/ */
int drm_switchctx(struct inode *inode, struct file *filp, int drm_switchctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_ctx *ctx = data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx ctx;
if (copy_from_user(&ctx, (struct drm_ctx __user *) arg, sizeof(ctx))) DRM_DEBUG("%d\n", ctx->handle);
return -EFAULT; return drm_context_switch(dev, dev->last_context, ctx->handle);
DRM_DEBUG("%d\n", ctx.handle);
return drm_context_switch(dev, dev->last_context, ctx.handle);
} }
/** /**
* New context. * New context.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Calls context_switch_complete(). * Calls context_switch_complete().
*/ */
int drm_newctx(struct inode *inode, struct file *filp, int drm_newctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_ctx *ctx = data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx ctx;
if (copy_from_user(&ctx, (struct drm_ctx __user *) arg, sizeof(ctx))) DRM_DEBUG("%d\n", ctx->handle);
return -EFAULT; drm_context_switch_complete(dev, ctx->handle);
DRM_DEBUG("%d\n", ctx.handle);
drm_context_switch_complete(dev, ctx.handle);
return 0; return 0;
} }
...@@ -475,31 +429,26 @@ int drm_newctx(struct inode *inode, struct file *filp, ...@@ -475,31 +429,26 @@ int drm_newctx(struct inode *inode, struct file *filp,
* Remove context. * Remove context.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument pointing to a drm_ctx structure. * \param arg user argument pointing to a drm_ctx structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* If not the special kernel context, calls ctxbitmap_free() to free the specified context. * If not the special kernel context, calls ctxbitmap_free() to free the specified context.
*/ */
int drm_rmctx(struct inode *inode, struct file *filp, int drm_rmctx(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_ctx *ctx = data;
struct drm_device *dev = priv->head->dev;
struct drm_ctx ctx;
if (copy_from_user(&ctx, (struct drm_ctx __user *) arg, sizeof(ctx)))
return -EFAULT;
DRM_DEBUG("%d\n", ctx.handle); DRM_DEBUG("%d\n", ctx->handle);
if (ctx.handle == DRM_KERNEL_CONTEXT + 1) { if (ctx->handle == DRM_KERNEL_CONTEXT + 1) {
priv->remove_auth_on_close = 1; file_priv->remove_auth_on_close = 1;
} }
if (ctx.handle != DRM_KERNEL_CONTEXT) { if (ctx->handle != DRM_KERNEL_CONTEXT) {
if (dev->driver->context_dtor) if (dev->driver->context_dtor)
dev->driver->context_dtor(dev, ctx.handle); dev->driver->context_dtor(dev, ctx->handle);
drm_ctxbitmap_free(dev, ctx.handle); drm_ctxbitmap_free(dev, ctx->handle);
} }
mutex_lock(&dev->ctxlist_mutex); mutex_lock(&dev->ctxlist_mutex);
...@@ -507,7 +456,7 @@ int drm_rmctx(struct inode *inode, struct file *filp, ...@@ -507,7 +456,7 @@ int drm_rmctx(struct inode *inode, struct file *filp,
struct drm_ctx_list *pos, *n; struct drm_ctx_list *pos, *n;
list_for_each_entry_safe(pos, n, &dev->ctxlist, head) { list_for_each_entry_safe(pos, n, &dev->ctxlist, head) {
if (pos->handle == ctx.handle) { if (pos->handle == ctx->handle) {
list_del(&pos->head); list_del(&pos->head);
drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST); drm_free(pos, sizeof(*pos), DRM_MEM_CTXLIST);
--dev->ctx_count; --dev->ctx_count;
......
...@@ -136,7 +136,7 @@ void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf) ...@@ -136,7 +136,7 @@ void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf)
buf->waiting = 0; buf->waiting = 0;
buf->pending = 0; buf->pending = 0;
buf->filp = NULL; buf->file_priv = NULL;
buf->used = 0; buf->used = 0;
if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE) if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE)
...@@ -148,11 +148,12 @@ void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf) ...@@ -148,11 +148,12 @@ void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf)
/** /**
* Reclaim the buffers. * Reclaim the buffers.
* *
* \param filp file pointer. * \param file_priv DRM file private.
* *
* Frees each buffer associated with \p filp not already on the hardware. * Frees each buffer associated with \p file_priv not already on the hardware.
*/ */
void drm_core_reclaim_buffers(struct drm_device *dev, struct file *filp) void drm_core_reclaim_buffers(struct drm_device *dev,
struct drm_file *file_priv)
{ {
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
int i; int i;
...@@ -160,7 +161,7 @@ void drm_core_reclaim_buffers(struct drm_device *dev, struct file *filp) ...@@ -160,7 +161,7 @@ void drm_core_reclaim_buffers(struct drm_device *dev, struct file *filp)
if (!dma) if (!dma)
return; return;
for (i = 0; i < dma->buf_count; i++) { for (i = 0; i < dma->buf_count; i++) {
if (dma->buflist[i]->filp == filp) { if (dma->buflist[i]->file_priv == file_priv) {
switch (dma->buflist[i]->list) { switch (dma->buflist[i]->list) {
case DRM_LIST_NONE: case DRM_LIST_NONE:
drm_free_buffer(dev, dma->buflist[i]); drm_free_buffer(dev, dma->buflist[i]);
......
...@@ -40,11 +40,10 @@ ...@@ -40,11 +40,10 @@
/** /**
* Allocate drawable ID and memory to store information about it. * Allocate drawable ID and memory to store information about it.
*/ */
int drm_adddraw(DRM_IOCTL_ARGS) int drm_adddraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
DRM_DEVICE;
unsigned long irqflags; unsigned long irqflags;
struct drm_draw draw; struct drm_draw *draw = data;
int new_id = 0; int new_id = 0;
int ret; int ret;
...@@ -63,11 +62,9 @@ int drm_adddraw(DRM_IOCTL_ARGS) ...@@ -63,11 +62,9 @@ int drm_adddraw(DRM_IOCTL_ARGS)
spin_unlock_irqrestore(&dev->drw_lock, irqflags); spin_unlock_irqrestore(&dev->drw_lock, irqflags);
draw.handle = new_id; draw->handle = new_id;
DRM_DEBUG("%d\n", draw.handle); DRM_DEBUG("%d\n", draw->handle);
DRM_COPY_TO_USER_IOCTL((struct drm_draw __user *)data, draw, sizeof(draw));
return 0; return 0;
} }
...@@ -75,72 +72,64 @@ int drm_adddraw(DRM_IOCTL_ARGS) ...@@ -75,72 +72,64 @@ int drm_adddraw(DRM_IOCTL_ARGS)
/** /**
* Free drawable ID and memory to store information about it. * Free drawable ID and memory to store information about it.
*/ */
int drm_rmdraw(DRM_IOCTL_ARGS) int drm_rmdraw(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
DRM_DEVICE; struct drm_draw *draw = data;
struct drm_draw draw;
unsigned long irqflags; unsigned long irqflags;
DRM_COPY_FROM_USER_IOCTL(draw, (struct drm_draw __user *) data,
sizeof(draw));
spin_lock_irqsave(&dev->drw_lock, irqflags); spin_lock_irqsave(&dev->drw_lock, irqflags);
drm_free(drm_get_drawable_info(dev, draw.handle), drm_free(drm_get_drawable_info(dev, draw->handle),
sizeof(struct drm_drawable_info), DRM_MEM_BUFS); sizeof(struct drm_drawable_info), DRM_MEM_BUFS);
idr_remove(&dev->drw_idr, draw.handle); idr_remove(&dev->drw_idr, draw->handle);
spin_unlock_irqrestore(&dev->drw_lock, irqflags); spin_unlock_irqrestore(&dev->drw_lock, irqflags);
DRM_DEBUG("%d\n", draw.handle); DRM_DEBUG("%d\n", draw->handle);
return 0; return 0;
} }
int drm_update_drawable_info(DRM_IOCTL_ARGS) int drm_update_drawable_info(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
DRM_DEVICE; struct drm_update_draw *update = data;
struct drm_update_draw update;
unsigned long irqflags; unsigned long irqflags;
struct drm_clip_rect *rects; struct drm_clip_rect *rects;
struct drm_drawable_info *info; struct drm_drawable_info *info;
int err; int err;
DRM_COPY_FROM_USER_IOCTL(update, (struct drm_update_draw __user *) data, info = idr_find(&dev->drw_idr, update->handle);
sizeof(update));
info = idr_find(&dev->drw_idr, update.handle);
if (!info) { if (!info) {
info = drm_calloc(1, sizeof(*info), DRM_MEM_BUFS); info = drm_calloc(1, sizeof(*info), DRM_MEM_BUFS);
if (!info) if (!info)
return -ENOMEM; return -ENOMEM;
if (IS_ERR(idr_replace(&dev->drw_idr, info, update.handle))) { if (IS_ERR(idr_replace(&dev->drw_idr, info, update->handle))) {
DRM_ERROR("No such drawable %d\n", update.handle); DRM_ERROR("No such drawable %d\n", update->handle);
drm_free(info, sizeof(*info), DRM_MEM_BUFS); drm_free(info, sizeof(*info), DRM_MEM_BUFS);
return -EINVAL; return -EINVAL;
} }
} }
switch (update.type) { switch (update->type) {
case DRM_DRAWABLE_CLIPRECTS: case DRM_DRAWABLE_CLIPRECTS:
if (update.num != info->num_rects) { if (update->num != info->num_rects) {
rects = drm_alloc(update.num * sizeof(struct drm_clip_rect), rects = drm_alloc(update->num * sizeof(struct drm_clip_rect),
DRM_MEM_BUFS); DRM_MEM_BUFS);
} else } else
rects = info->rects; rects = info->rects;
if (update.num && !rects) { if (update->num && !rects) {
DRM_ERROR("Failed to allocate cliprect memory\n"); DRM_ERROR("Failed to allocate cliprect memory\n");
err = DRM_ERR(ENOMEM); err = -ENOMEM;
goto error; goto error;
} }
if (update.num && DRM_COPY_FROM_USER(rects, if (update->num && DRM_COPY_FROM_USER(rects,
(struct drm_clip_rect __user *) (struct drm_clip_rect __user *)
(unsigned long)update.data, (unsigned long)update->data,
update.num * update->num *
sizeof(*rects))) { sizeof(*rects))) {
DRM_ERROR("Failed to copy cliprects from userspace\n"); DRM_ERROR("Failed to copy cliprects from userspace\n");
err = DRM_ERR(EFAULT); err = -EFAULT;
goto error; goto error;
} }
...@@ -152,23 +141,23 @@ int drm_update_drawable_info(DRM_IOCTL_ARGS) ...@@ -152,23 +141,23 @@ int drm_update_drawable_info(DRM_IOCTL_ARGS)
} }
info->rects = rects; info->rects = rects;
info->num_rects = update.num; info->num_rects = update->num;
spin_unlock_irqrestore(&dev->drw_lock, irqflags); spin_unlock_irqrestore(&dev->drw_lock, irqflags);
DRM_DEBUG("Updated %d cliprects for drawable %d\n", DRM_DEBUG("Updated %d cliprects for drawable %d\n",
info->num_rects, update.handle); info->num_rects, update->handle);
break; break;
default: default:
DRM_ERROR("Invalid update type %d\n", update.type); DRM_ERROR("Invalid update type %d\n", update->type);
return DRM_ERR(EINVAL); return -EINVAL;
} }
return 0; return 0;
error: error:
if (rects != info->rects) if (rects != info->rects)
drm_free(rects, update.num * sizeof(struct drm_clip_rect), drm_free(rects, update->num * sizeof(struct drm_clip_rect),
DRM_MEM_BUFS); DRM_MEM_BUFS);
return err; return err;
......
...@@ -49,73 +49,74 @@ ...@@ -49,73 +49,74 @@
#include "drmP.h" #include "drmP.h"
#include "drm_core.h" #include "drm_core.h"
static int drm_version(struct inode *inode, struct file *filp, static int drm_version(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
/** Ioctl table */ /** Ioctl table */
static drm_ioctl_desc_t drm_ioctls[] = { static struct drm_ioctl_desc drm_ioctls[] = {
[DRM_IOCTL_NR(DRM_IOCTL_VERSION)] = {drm_version, 0}, DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version, 0),
[DRM_IOCTL_NR(DRM_IOCTL_GET_UNIQUE)] = {drm_getunique, 0}, DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, 0),
[DRM_IOCTL_NR(DRM_IOCTL_GET_MAGIC)] = {drm_getmagic, 0}, DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, 0),
[DRM_IOCTL_NR(DRM_IOCTL_IRQ_BUSID)] = {drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_GET_MAP)] = {drm_getmap, 0}, DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, 0),
[DRM_IOCTL_NR(DRM_IOCTL_GET_CLIENT)] = {drm_getclient, 0}, DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0),
[DRM_IOCTL_NR(DRM_IOCTL_GET_STATS)] = {drm_getstats, 0}, DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0),
[DRM_IOCTL_NR(DRM_IOCTL_SET_VERSION)] = {drm_setversion, DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_SET_UNIQUE)] = {drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_BLOCK)] = {drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_UNBLOCK)] = {drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AUTH_MAGIC)] = {drm_authmagic, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_ADD_MAP)] = {drm_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_RM_MAP)] = {drm_rmmap_ioctl, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_rmmap_ioctl, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_SET_SAREA_CTX)] = {drm_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_GET_SAREA_CTX)] = {drm_getsareactx, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_getsareactx, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)] = {drm_addctx, DRM_AUTH|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)] = {drm_rmctx, DRM_AUTH|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_addctx, DRM_AUTH|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)] = {drm_modctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)] = {drm_getctx, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_modctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)] = {drm_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_getctx, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)] = {drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)] = {drm_resctx, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_resctx, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_ADD_DRAW)] = {drm_adddraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_RM_DRAW)] = {drm_rmdraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_adddraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_rmdraw, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_LOCK)] = {drm_lock, DRM_AUTH},
[DRM_IOCTL_NR(DRM_IOCTL_UNLOCK)] = {drm_unlock, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_lock, DRM_AUTH),
DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_unlock, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_FINISH)] = {drm_noop, DRM_AUTH},
DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_ADD_BUFS)] = {drm_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
[DRM_IOCTL_NR(DRM_IOCTL_MARK_BUFS)] = {drm_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_INFO_BUFS)] = {drm_infobufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_MAP_BUFS)] = {drm_mapbufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_infobufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_FREE_BUFS)] = {drm_freebufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_mapbufs, DRM_AUTH),
DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_freebufs, DRM_AUTH),
/* The DRM_IOCTL_DMA ioctl should be defined by the driver. */ /* The DRM_IOCTL_DMA ioctl should be defined by the driver. */
[DRM_IOCTL_NR(DRM_IOCTL_DMA)] = {NULL, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_DMA, NULL, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_CONTROL)] = {drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
#if __OS_HAS_AGP #if __OS_HAS_AGP
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ACQUIRE)] = {drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_RELEASE)] = {drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ENABLE)] = {drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_INFO)] = {drm_agp_info_ioctl, DRM_AUTH}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_ALLOC)] = {drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_FREE)] = {drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_BIND)] = {drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_AGP_UNBIND)] = {drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
#endif #endif
[DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC)] = {drm_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_sg_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_SG_FREE)] = {drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK)] = {drm_wait_vblank, 0}, DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank, 0),
[DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW)] = {drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_update_drawable_info, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
}; };
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls ) #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
...@@ -224,7 +225,7 @@ int drm_lastclose(struct drm_device * dev) ...@@ -224,7 +225,7 @@ int drm_lastclose(struct drm_device * dev)
if (dev->lock.hw_lock) { if (dev->lock.hw_lock) {
dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */ dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
dev->lock.filp = NULL; dev->lock.file_priv = NULL;
wake_up_interruptible(&dev->lock.lock_queue); wake_up_interruptible(&dev->lock.lock_queue);
} }
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
...@@ -418,27 +419,19 @@ module_exit(drm_core_exit); ...@@ -418,27 +419,19 @@ module_exit(drm_core_exit);
* *
* Fills in the version information in \p arg. * Fills in the version information in \p arg.
*/ */
static int drm_version(struct inode *inode, struct file *filp, static int drm_version(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_version *version = data;
struct drm_device *dev = priv->head->dev;
struct drm_version __user *argp = (void __user *)arg;
struct drm_version version;
int len; int len;
if (copy_from_user(&version, argp, sizeof(version))) version->version_major = dev->driver->major;
return -EFAULT; version->version_minor = dev->driver->minor;
version->version_patchlevel = dev->driver->patchlevel;
DRM_COPY(version->name, dev->driver->name);
DRM_COPY(version->date, dev->driver->date);
DRM_COPY(version->desc, dev->driver->desc);
version.version_major = dev->driver->major;
version.version_minor = dev->driver->minor;
version.version_patchlevel = dev->driver->patchlevel;
DRM_COPY(version.name, dev->driver->name);
DRM_COPY(version.date, dev->driver->date);
DRM_COPY(version.desc, dev->driver->desc);
if (copy_to_user(argp, &version, sizeof(version)))
return -EFAULT;
return 0; return 0;
} }
...@@ -446,7 +439,7 @@ static int drm_version(struct inode *inode, struct file *filp, ...@@ -446,7 +439,7 @@ static int drm_version(struct inode *inode, struct file *filp,
* Called whenever a process performs an ioctl on /dev/drm. * Called whenever a process performs an ioctl on /dev/drm.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument. * \param arg user argument.
* \return zero on success or negative number on failure. * \return zero on success or negative number on failure.
...@@ -457,21 +450,22 @@ static int drm_version(struct inode *inode, struct file *filp, ...@@ -457,21 +450,22 @@ static int drm_version(struct inode *inode, struct file *filp,
int drm_ioctl(struct inode *inode, struct file *filp, int drm_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct drm_file *priv = filp->private_data; struct drm_file *file_priv = filp->private_data;
struct drm_device *dev = priv->head->dev; struct drm_device *dev = file_priv->head->dev;
drm_ioctl_desc_t *ioctl; struct drm_ioctl_desc *ioctl;
drm_ioctl_t *func; drm_ioctl_t *func;
unsigned int nr = DRM_IOCTL_NR(cmd); unsigned int nr = DRM_IOCTL_NR(cmd);
int retcode = -EINVAL; int retcode = -EINVAL;
char *kdata = NULL;
atomic_inc(&dev->ioctl_count); atomic_inc(&dev->ioctl_count);
atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]); atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]);
++priv->ioctl_count; ++file_priv->ioctl_count;
DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n", DRM_DEBUG("pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n",
current->pid, cmd, nr, current->pid, cmd, nr,
(long)old_encode_dev(priv->head->device), (long)old_encode_dev(file_priv->head->device),
priv->authenticated); file_priv->authenticated);
if ((nr >= DRM_CORE_IOCTL_COUNT) && if ((nr >= DRM_CORE_IOCTL_COUNT) &&
((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END))) ((nr < DRM_COMMAND_BASE) || (nr >= DRM_COMMAND_END)))
...@@ -489,18 +483,40 @@ int drm_ioctl(struct inode *inode, struct file *filp, ...@@ -489,18 +483,40 @@ int drm_ioctl(struct inode *inode, struct file *filp,
if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl) if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)
func = dev->driver->dma_ioctl; func = dev->driver->dma_ioctl;
if (!func) { if (!func) {
DRM_DEBUG("no function\n"); DRM_DEBUG("no function\n");
retcode = -EINVAL; retcode = -EINVAL;
} else if (((ioctl->flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)) || } else if (((ioctl->flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)) ||
((ioctl->flags & DRM_AUTH) && !priv->authenticated) || ((ioctl->flags & DRM_AUTH) && !file_priv->authenticated) ||
((ioctl->flags & DRM_MASTER) && !priv->master)) { ((ioctl->flags & DRM_MASTER) && !file_priv->master)) {
retcode = -EACCES; retcode = -EACCES;
} else { } else {
retcode = func(inode, filp, cmd, arg); if (cmd & (IOC_IN | IOC_OUT)) {
kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
if (!kdata)
return -ENOMEM;
}
if (cmd & IOC_IN) {
if (copy_from_user(kdata, (void __user *)arg,
_IOC_SIZE(cmd)) != 0) {
retcode = -EACCES;
goto err_i1;
}
}
retcode = func(dev, kdata, file_priv);
if (cmd & IOC_OUT) {
if (copy_to_user((void __user *)arg, kdata,
_IOC_SIZE(cmd)) != 0)
retcode = -EACCES;
}
} }
err_i1: err_i1:
if (kdata)
kfree(kdata);
atomic_dec(&dev->ioctl_count); atomic_dec(&dev->ioctl_count);
if (retcode) if (retcode)
DRM_DEBUG("ret = %x\n", retcode); DRM_DEBUG("ret = %x\n", retcode);
......
...@@ -242,6 +242,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp, ...@@ -242,6 +242,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
memset(priv, 0, sizeof(*priv)); memset(priv, 0, sizeof(*priv));
filp->private_data = priv; filp->private_data = priv;
priv->filp = filp;
priv->uid = current->euid; priv->uid = current->euid;
priv->pid = current->pid; priv->pid = current->pid;
priv->minor = minor; priv->minor = minor;
...@@ -312,7 +313,7 @@ EXPORT_SYMBOL(drm_fasync); ...@@ -312,7 +313,7 @@ EXPORT_SYMBOL(drm_fasync);
* Release file. * Release file.
* *
* \param inode device inode * \param inode device inode
* \param filp file pointer. * \param file_priv DRM file private.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* If the hardware lock is held then free it, and take it again for the kernel * If the hardware lock is held then free it, and take it again for the kernel
...@@ -322,29 +323,28 @@ EXPORT_SYMBOL(drm_fasync); ...@@ -322,29 +323,28 @@ EXPORT_SYMBOL(drm_fasync);
*/ */
int drm_release(struct inode *inode, struct file *filp) int drm_release(struct inode *inode, struct file *filp)
{ {
struct drm_file *priv = filp->private_data; struct drm_file *file_priv = filp->private_data;
struct drm_device *dev; struct drm_device *dev = file_priv->head->dev;
int retcode = 0; int retcode = 0;
lock_kernel(); lock_kernel();
dev = priv->head->dev;
DRM_DEBUG("open_count = %d\n", dev->open_count); DRM_DEBUG("open_count = %d\n", dev->open_count);
if (dev->driver->preclose) if (dev->driver->preclose)
dev->driver->preclose(dev, filp); dev->driver->preclose(dev, file_priv);
/* ======================================================== /* ========================================================
* Begin inline drm_release * Begin inline drm_release
*/ */
DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n", DRM_DEBUG("pid = %d, device = 0x%lx, open_count = %d\n",
current->pid, (long)old_encode_dev(priv->head->device), current->pid, (long)old_encode_dev(file_priv->head->device),
dev->open_count); dev->open_count);
if (dev->driver->reclaim_buffers_locked && dev->lock.hw_lock) { if (dev->driver->reclaim_buffers_locked && dev->lock.hw_lock) {
if (drm_i_have_hw_lock(filp)) { if (drm_i_have_hw_lock(dev, file_priv)) {
dev->driver->reclaim_buffers_locked(dev, filp); dev->driver->reclaim_buffers_locked(dev, file_priv);
} else { } else {
unsigned long _end=jiffies + 3*DRM_HZ; unsigned long _end=jiffies + 3*DRM_HZ;
int locked = 0; int locked = 0;
...@@ -370,7 +370,7 @@ int drm_release(struct inode *inode, struct file *filp) ...@@ -370,7 +370,7 @@ int drm_release(struct inode *inode, struct file *filp)
"\tI will go on reclaiming the buffers anyway.\n"); "\tI will go on reclaiming the buffers anyway.\n");
} }
dev->driver->reclaim_buffers_locked(dev, filp); dev->driver->reclaim_buffers_locked(dev, file_priv);
drm_idlelock_release(&dev->lock); drm_idlelock_release(&dev->lock);
} }
} }
...@@ -378,12 +378,12 @@ int drm_release(struct inode *inode, struct file *filp) ...@@ -378,12 +378,12 @@ int drm_release(struct inode *inode, struct file *filp)
if (dev->driver->reclaim_buffers_idlelocked && dev->lock.hw_lock) { if (dev->driver->reclaim_buffers_idlelocked && dev->lock.hw_lock) {
drm_idlelock_take(&dev->lock); drm_idlelock_take(&dev->lock);
dev->driver->reclaim_buffers_idlelocked(dev, filp); dev->driver->reclaim_buffers_idlelocked(dev, file_priv);
drm_idlelock_release(&dev->lock); drm_idlelock_release(&dev->lock);
} }
if (drm_i_have_hw_lock(filp)) { if (drm_i_have_hw_lock(dev, file_priv)) {
DRM_DEBUG("File %p released, freeing lock for context %d\n", DRM_DEBUG("File %p released, freeing lock for context %d\n",
filp, _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock)); filp, _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock));
...@@ -394,7 +394,7 @@ int drm_release(struct inode *inode, struct file *filp) ...@@ -394,7 +394,7 @@ int drm_release(struct inode *inode, struct file *filp)
if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) && if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) &&
!dev->driver->reclaim_buffers_locked) { !dev->driver->reclaim_buffers_locked) {
dev->driver->reclaim_buffers(dev, filp); dev->driver->reclaim_buffers(dev, file_priv);
} }
drm_fasync(-1, filp, 0); drm_fasync(-1, filp, 0);
...@@ -404,7 +404,7 @@ int drm_release(struct inode *inode, struct file *filp) ...@@ -404,7 +404,7 @@ int drm_release(struct inode *inode, struct file *filp)
struct drm_ctx_list *pos, *n; struct drm_ctx_list *pos, *n;
list_for_each_entry_safe(pos, n, &dev->ctxlist, head) { list_for_each_entry_safe(pos, n, &dev->ctxlist, head) {
if (pos->tag == priv && if (pos->tag == file_priv &&
pos->handle != DRM_KERNEL_CONTEXT) { pos->handle != DRM_KERNEL_CONTEXT) {
if (dev->driver->context_dtor) if (dev->driver->context_dtor)
dev->driver->context_dtor(dev, dev->driver->context_dtor(dev,
...@@ -421,18 +421,18 @@ int drm_release(struct inode *inode, struct file *filp) ...@@ -421,18 +421,18 @@ int drm_release(struct inode *inode, struct file *filp)
mutex_unlock(&dev->ctxlist_mutex); mutex_unlock(&dev->ctxlist_mutex);
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (priv->remove_auth_on_close == 1) { if (file_priv->remove_auth_on_close == 1) {
struct drm_file *temp; struct drm_file *temp;
list_for_each_entry(temp, &dev->filelist, lhead) list_for_each_entry(temp, &dev->filelist, lhead)
temp->authenticated = 0; temp->authenticated = 0;
} }
list_del(&priv->lhead); list_del(&file_priv->lhead);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
if (dev->driver->postclose) if (dev->driver->postclose)
dev->driver->postclose(dev, priv); dev->driver->postclose(dev, file_priv);
drm_free(priv, sizeof(*priv), DRM_MEM_FILES); drm_free(file_priv, sizeof(*file_priv), DRM_MEM_FILES);
/* ======================================================== /* ========================================================
* End inline drm_release * End inline drm_release
......
...@@ -1040,7 +1040,7 @@ drm_ioctl_compat_t *drm_compat_ioctls[] = { ...@@ -1040,7 +1040,7 @@ drm_ioctl_compat_t *drm_compat_ioctls[] = {
* Called whenever a 32-bit process running under a 64-bit kernel * Called whenever a 32-bit process running under a 64-bit kernel
* performs an ioctl on /dev/drm. * performs an ioctl on /dev/drm.
* *
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument. * \param arg user argument.
* \return zero on success or negative number on failure. * \return zero on success or negative number on failure.
......
...@@ -42,30 +42,24 @@ ...@@ -42,30 +42,24 @@
* Get the bus id. * Get the bus id.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_unique structure. * \param arg user argument, pointing to a drm_unique structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Copies the bus id from drm_device::unique into user space. * Copies the bus id from drm_device::unique into user space.
*/ */
int drm_getunique(struct inode *inode, struct file *filp, int drm_getunique(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_unique *u = data;
struct drm_device *dev = priv->head->dev;
struct drm_unique __user *argp = (void __user *)arg;
struct drm_unique u;
if (copy_from_user(&u, argp, sizeof(u))) if (u->unique_len >= dev->unique_len) {
return -EFAULT; if (copy_to_user(u->unique, dev->unique, dev->unique_len))
if (u.unique_len >= dev->unique_len) {
if (copy_to_user(u.unique, dev->unique, dev->unique_len))
return -EFAULT; return -EFAULT;
} }
u.unique_len = dev->unique_len; u->unique_len = dev->unique_len;
if (copy_to_user(argp, &u, sizeof(u)))
return -EFAULT;
return 0; return 0;
} }
...@@ -73,7 +67,7 @@ int drm_getunique(struct inode *inode, struct file *filp, ...@@ -73,7 +67,7 @@ int drm_getunique(struct inode *inode, struct file *filp,
* Set the bus id. * Set the bus id.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_unique structure. * \param arg user argument, pointing to a drm_unique structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -83,28 +77,23 @@ int drm_getunique(struct inode *inode, struct file *filp, ...@@ -83,28 +77,23 @@ int drm_getunique(struct inode *inode, struct file *filp,
* in interface version 1.1 and will return EBUSY when setversion has requested * in interface version 1.1 and will return EBUSY when setversion has requested
* version 1.1 or greater. * version 1.1 or greater.
*/ */
int drm_setunique(struct inode *inode, struct file *filp, int drm_setunique(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_unique *u = data;
struct drm_device *dev = priv->head->dev;
struct drm_unique u;
int domain, bus, slot, func, ret; int domain, bus, slot, func, ret;
if (dev->unique_len || dev->unique) if (dev->unique_len || dev->unique)
return -EBUSY; return -EBUSY;
if (copy_from_user(&u, (struct drm_unique __user *) arg, sizeof(u))) if (!u->unique_len || u->unique_len > 1024)
return -EFAULT;
if (!u.unique_len || u.unique_len > 1024)
return -EINVAL; return -EINVAL;
dev->unique_len = u.unique_len; dev->unique_len = u->unique_len;
dev->unique = drm_alloc(u.unique_len + 1, DRM_MEM_DRIVER); dev->unique = drm_alloc(u->unique_len + 1, DRM_MEM_DRIVER);
if (!dev->unique) if (!dev->unique)
return -ENOMEM; return -ENOMEM;
if (copy_from_user(dev->unique, u.unique, dev->unique_len)) if (copy_from_user(dev->unique, u->unique, dev->unique_len))
return -EFAULT; return -EFAULT;
dev->unique[dev->unique_len] = '\0'; dev->unique[dev->unique_len] = '\0';
...@@ -123,7 +112,7 @@ int drm_setunique(struct inode *inode, struct file *filp, ...@@ -123,7 +112,7 @@ int drm_setunique(struct inode *inode, struct file *filp,
*/ */
ret = sscanf(dev->unique, "PCI:%d:%d:%d", &bus, &slot, &func); ret = sscanf(dev->unique, "PCI:%d:%d:%d", &bus, &slot, &func);
if (ret != 3) if (ret != 3)
return DRM_ERR(EINVAL); return -EINVAL;
domain = bus >> 8; domain = bus >> 8;
bus &= 0xff; bus &= 0xff;
...@@ -172,7 +161,7 @@ static int drm_set_busid(struct drm_device * dev) ...@@ -172,7 +161,7 @@ static int drm_set_busid(struct drm_device * dev)
* Get a mapping information. * Get a mapping information.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_map structure. * \param arg user argument, pointing to a drm_map structure.
* *
...@@ -181,21 +170,16 @@ static int drm_set_busid(struct drm_device * dev) ...@@ -181,21 +170,16 @@ static int drm_set_busid(struct drm_device * dev)
* Searches for the mapping with the specified offset and copies its information * Searches for the mapping with the specified offset and copies its information
* into userspace * into userspace
*/ */
int drm_getmap(struct inode *inode, struct file *filp, int drm_getmap(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_map *map = data;
struct drm_device *dev = priv->head->dev;
struct drm_map __user *argp = (void __user *)arg;
struct drm_map map;
struct drm_map_list *r_list = NULL; struct drm_map_list *r_list = NULL;
struct list_head *list; struct list_head *list;
int idx; int idx;
int i; int i;
if (copy_from_user(&map, argp, sizeof(map))) idx = map->offset;
return -EFAULT;
idx = map.offset;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (idx < 0) { if (idx < 0) {
...@@ -216,16 +200,14 @@ int drm_getmap(struct inode *inode, struct file *filp, ...@@ -216,16 +200,14 @@ int drm_getmap(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
} }
map.offset = r_list->map->offset; map->offset = r_list->map->offset;
map.size = r_list->map->size; map->size = r_list->map->size;
map.type = r_list->map->type; map->type = r_list->map->type;
map.flags = r_list->map->flags; map->flags = r_list->map->flags;
map.handle = (void *)(unsigned long)r_list->user_token; map->handle = (void *)(unsigned long) r_list->user_token;
map.mtrr = r_list->map->mtrr; map->mtrr = r_list->map->mtrr;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
if (copy_to_user(argp, &map, sizeof(map)))
return -EFAULT;
return 0; return 0;
} }
...@@ -233,7 +215,7 @@ int drm_getmap(struct inode *inode, struct file *filp, ...@@ -233,7 +215,7 @@ int drm_getmap(struct inode *inode, struct file *filp,
* Get client information. * Get client information.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_client structure. * \param arg user argument, pointing to a drm_client structure.
* *
...@@ -242,20 +224,15 @@ int drm_getmap(struct inode *inode, struct file *filp, ...@@ -242,20 +224,15 @@ int drm_getmap(struct inode *inode, struct file *filp,
* Searches for the client with the specified index and copies its information * Searches for the client with the specified index and copies its information
* into userspace * into userspace
*/ */
int drm_getclient(struct inode *inode, struct file *filp, int drm_getclient(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_client *client = data;
struct drm_device *dev = priv->head->dev;
struct drm_client __user *argp = (struct drm_client __user *)arg;
struct drm_client client;
struct drm_file *pt; struct drm_file *pt;
int idx; int idx;
int i; int i;
if (copy_from_user(&client, argp, sizeof(client))) idx = client->idx;
return -EFAULT;
idx = client.idx;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (list_empty(&dev->filelist)) { if (list_empty(&dev->filelist)) {
...@@ -269,15 +246,13 @@ int drm_getclient(struct inode *inode, struct file *filp, ...@@ -269,15 +246,13 @@ int drm_getclient(struct inode *inode, struct file *filp,
break; break;
} }
client.auth = pt->authenticated; client->auth = pt->authenticated;
client.pid = pt->pid; client->pid = pt->pid;
client.uid = pt->uid; client->uid = pt->uid;
client.magic = pt->magic; client->magic = pt->magic;
client.iocs = pt->ioctl_count; client->iocs = pt->ioctl_count;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
if (copy_to_user(argp, &client, sizeof(client)))
return -EFAULT;
return 0; return 0;
} }
...@@ -285,39 +260,35 @@ int drm_getclient(struct inode *inode, struct file *filp, ...@@ -285,39 +260,35 @@ int drm_getclient(struct inode *inode, struct file *filp,
* Get statistics information. * Get statistics information.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_stats structure. * \param arg user argument, pointing to a drm_stats structure.
* *
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
*/ */
int drm_getstats(struct inode *inode, struct file *filp, int drm_getstats(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_stats *stats = data;
struct drm_device *dev = priv->head->dev;
struct drm_stats stats;
int i; int i;
memset(&stats, 0, sizeof(stats)); memset(stats, 0, sizeof(stats));
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
for (i = 0; i < dev->counters; i++) { for (i = 0; i < dev->counters; i++) {
if (dev->types[i] == _DRM_STAT_LOCK) if (dev->types[i] == _DRM_STAT_LOCK)
stats.data[i].value stats->data[i].value =
= (dev->lock.hw_lock ? dev->lock.hw_lock->lock : 0); (dev->lock.hw_lock ? dev->lock.hw_lock->lock : 0);
else else
stats.data[i].value = atomic_read(&dev->counts[i]); stats->data[i].value = atomic_read(&dev->counts[i]);
stats.data[i].type = dev->types[i]; stats->data[i].type = dev->types[i];
} }
stats.count = dev->counters; stats->count = dev->counters;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
if (copy_to_user((struct drm_stats __user *) arg, &stats, sizeof(stats)))
return -EFAULT;
return 0; return 0;
} }
...@@ -325,64 +296,59 @@ int drm_getstats(struct inode *inode, struct file *filp, ...@@ -325,64 +296,59 @@ int drm_getstats(struct inode *inode, struct file *filp,
* Setversion ioctl. * Setversion ioctl.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_lock structure. * \param arg user argument, pointing to a drm_lock structure.
* \return zero on success or negative number on failure. * \return zero on success or negative number on failure.
* *
* Sets the requested interface version * Sets the requested interface version
*/ */
int drm_setversion(DRM_IOCTL_ARGS) int drm_setversion(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
DRM_DEVICE; struct drm_set_version *sv = data;
struct drm_set_version sv; int if_version, retcode = 0;
struct drm_set_version retv;
int if_version; if (sv->drm_di_major != -1) {
struct drm_set_version __user *argp = (void __user *)data; if (sv->drm_di_major != DRM_IF_MAJOR ||
int ret; sv->drm_di_minor < 0 || sv->drm_di_minor > DRM_IF_MINOR) {
retcode = -EINVAL;
if (copy_from_user(&sv, argp, sizeof(sv))) goto done;
return -EFAULT; }
if_version = DRM_IF_VERSION(sv->drm_di_major,
retv.drm_di_major = DRM_IF_MAJOR; sv->drm_di_minor);
retv.drm_di_minor = DRM_IF_MINOR;
retv.drm_dd_major = dev->driver->major;
retv.drm_dd_minor = dev->driver->minor;
if (copy_to_user(argp, &retv, sizeof(retv)))
return -EFAULT;
if (sv.drm_di_major != -1) {
if (sv.drm_di_major != DRM_IF_MAJOR ||
sv.drm_di_minor < 0 || sv.drm_di_minor > DRM_IF_MINOR)
return -EINVAL;
if_version = DRM_IF_VERSION(sv.drm_di_major, sv.drm_di_minor);
dev->if_version = max(if_version, dev->if_version); dev->if_version = max(if_version, dev->if_version);
if (sv.drm_di_minor >= 1) { if (sv->drm_di_minor >= 1) {
/* /*
* Version 1.1 includes tying of DRM to specific device * Version 1.1 includes tying of DRM to specific device
*/ */
ret = drm_set_busid(dev); drm_set_busid(dev);
if (ret)
return ret;
} }
} }
if (sv.drm_dd_major != -1) { if (sv->drm_dd_major != -1) {
if (sv.drm_dd_major != dev->driver->major || if (sv->drm_dd_major != dev->driver->major ||
sv.drm_dd_minor < 0 sv->drm_dd_minor < 0 || sv->drm_dd_minor >
|| sv.drm_dd_minor > dev->driver->minor) dev->driver->minor) {
return -EINVAL; retcode = -EINVAL;
goto done;
}
if (dev->driver->set_version) if (dev->driver->set_version)
dev->driver->set_version(dev, &sv); dev->driver->set_version(dev, sv);
} }
return 0;
done:
sv->drm_di_major = DRM_IF_MAJOR;
sv->drm_di_minor = DRM_IF_MINOR;
sv->drm_dd_major = dev->driver->major;
sv->drm_dd_minor = dev->driver->minor;
return retcode;
} }
/** No-op ioctl. */ /** No-op ioctl. */
int drm_noop(struct inode *inode, struct file *filp, unsigned int cmd, int drm_noop(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
DRM_DEBUG("\n"); DRM_DEBUG("\n");
return 0; return 0;
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
* Get interrupt from bus id. * Get interrupt from bus id.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_irq_busid structure. * \param arg user argument, pointing to a drm_irq_busid structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -50,30 +50,24 @@ ...@@ -50,30 +50,24 @@
* This IOCTL is deprecated, and will now return EINVAL for any busid not equal * This IOCTL is deprecated, and will now return EINVAL for any busid not equal
* to that of the device that this DRM instance attached to. * to that of the device that this DRM instance attached to.
*/ */
int drm_irq_by_busid(struct inode *inode, struct file *filp, int drm_irq_by_busid(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_irq_busid *p = data;
struct drm_device *dev = priv->head->dev;
struct drm_irq_busid __user *argp = (void __user *)arg;
struct drm_irq_busid p;
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
return -EINVAL; return -EINVAL;
if (copy_from_user(&p, argp, sizeof(p))) if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
return -EFAULT; (p->busnum & 0xff) != dev->pdev->bus->number ||
p->devnum != PCI_SLOT(dev->pdev->devfn) || p->funcnum != PCI_FUNC(dev->pdev->devfn))
if ((p.busnum >> 8) != drm_get_pci_domain(dev) ||
(p.busnum & 0xff) != dev->pdev->bus->number ||
p.devnum != PCI_SLOT(dev->pdev->devfn) || p.funcnum != PCI_FUNC(dev->pdev->devfn))
return -EINVAL; return -EINVAL;
p.irq = dev->irq; p->irq = dev->irq;
DRM_DEBUG("%d:%d:%d => IRQ %d\n", p->busnum, p->devnum, p->funcnum,
p->irq);
DRM_DEBUG("%d:%d:%d => IRQ %d\n", p.busnum, p.devnum, p.funcnum, p.irq);
if (copy_to_user(argp, &p, sizeof(p)))
return -EFAULT;
return 0; return 0;
} }
...@@ -187,31 +181,27 @@ EXPORT_SYMBOL(drm_irq_uninstall); ...@@ -187,31 +181,27 @@ EXPORT_SYMBOL(drm_irq_uninstall);
* IRQ control ioctl. * IRQ control ioctl.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_control structure. * \param arg user argument, pointing to a drm_control structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
* Calls irq_install() or irq_uninstall() according to \p arg. * Calls irq_install() or irq_uninstall() according to \p arg.
*/ */
int drm_control(struct inode *inode, struct file *filp, int drm_control(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_control *ctl = data;
struct drm_device *dev = priv->head->dev;
struct drm_control ctl;
/* if we haven't irq we fallback for compatibility reasons - this used to be a separate function in drm_dma.h */ /* if we haven't irq we fallback for compatibility reasons - this used to be a separate function in drm_dma.h */
if (copy_from_user(&ctl, (struct drm_control __user *) arg, sizeof(ctl)))
return -EFAULT;
switch (ctl.func) { switch (ctl->func) {
case DRM_INST_HANDLER: case DRM_INST_HANDLER:
if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ)) if (!drm_core_check_feature(dev, DRIVER_HAVE_IRQ))
return 0; return 0;
if (dev->if_version < DRM_IF_VERSION(1, 2) && if (dev->if_version < DRM_IF_VERSION(1, 2) &&
ctl.irq != dev->irq) ctl->irq != dev->irq)
return -EINVAL; return -EINVAL;
return drm_irq_install(dev); return drm_irq_install(dev);
case DRM_UNINST_HANDLER: case DRM_UNINST_HANDLER:
...@@ -227,7 +217,7 @@ int drm_control(struct inode *inode, struct file *filp, ...@@ -227,7 +217,7 @@ int drm_control(struct inode *inode, struct file *filp,
* Wait for VBLANK. * Wait for VBLANK.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param data user argument, pointing to a drm_wait_vblank structure. * \param data user argument, pointing to a drm_wait_vblank structure.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
...@@ -242,31 +232,25 @@ int drm_control(struct inode *inode, struct file *filp, ...@@ -242,31 +232,25 @@ int drm_control(struct inode *inode, struct file *filp,
* *
* If a signal is not requested, then calls vblank_wait(). * If a signal is not requested, then calls vblank_wait().
*/ */
int drm_wait_vblank(DRM_IOCTL_ARGS) int drm_wait_vblank(struct drm_device *dev, void *data, struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; union drm_wait_vblank *vblwait = data;
struct drm_device *dev = priv->head->dev;
union drm_wait_vblank __user *argp = (void __user *)data;
union drm_wait_vblank vblwait;
struct timeval now; struct timeval now;
int ret = 0; int ret = 0;
unsigned int flags, seq; unsigned int flags, seq;
if (!dev->irq) if ((!dev->irq) || (!dev->irq_enabled))
return -EINVAL; return -EINVAL;
if (copy_from_user(&vblwait, argp, sizeof(vblwait))) if (vblwait->request.type &
return -EFAULT;
if (vblwait.request.type &
~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) { ~(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)) {
DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n", DRM_ERROR("Unsupported type value 0x%x, supported mask 0x%x\n",
vblwait.request.type, vblwait->request.type,
(_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK)); (_DRM_VBLANK_TYPES_MASK | _DRM_VBLANK_FLAGS_MASK));
return -EINVAL; return -EINVAL;
} }
flags = vblwait.request.type & _DRM_VBLANK_FLAGS_MASK; flags = vblwait->request.type & _DRM_VBLANK_FLAGS_MASK;
if (!drm_core_check_feature(dev, (flags & _DRM_VBLANK_SECONDARY) ? if (!drm_core_check_feature(dev, (flags & _DRM_VBLANK_SECONDARY) ?
DRIVER_IRQ_VBL2 : DRIVER_IRQ_VBL)) DRIVER_IRQ_VBL2 : DRIVER_IRQ_VBL))
...@@ -275,10 +259,10 @@ int drm_wait_vblank(DRM_IOCTL_ARGS) ...@@ -275,10 +259,10 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? &dev->vbl_received2 seq = atomic_read((flags & _DRM_VBLANK_SECONDARY) ? &dev->vbl_received2
: &dev->vbl_received); : &dev->vbl_received);
switch (vblwait.request.type & _DRM_VBLANK_TYPES_MASK) { switch (vblwait->request.type & _DRM_VBLANK_TYPES_MASK) {
case _DRM_VBLANK_RELATIVE: case _DRM_VBLANK_RELATIVE:
vblwait.request.sequence += seq; vblwait->request.sequence += seq;
vblwait.request.type &= ~_DRM_VBLANK_RELATIVE; vblwait->request.type &= ~_DRM_VBLANK_RELATIVE;
case _DRM_VBLANK_ABSOLUTE: case _DRM_VBLANK_ABSOLUTE:
break; break;
default: default:
...@@ -286,8 +270,8 @@ int drm_wait_vblank(DRM_IOCTL_ARGS) ...@@ -286,8 +270,8 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
} }
if ((flags & _DRM_VBLANK_NEXTONMISS) && if ((flags & _DRM_VBLANK_NEXTONMISS) &&
(seq - vblwait.request.sequence) <= (1<<23)) { (seq - vblwait->request.sequence) <= (1<<23)) {
vblwait.request.sequence = seq + 1; vblwait->request.sequence = seq + 1;
} }
if (flags & _DRM_VBLANK_SIGNAL) { if (flags & _DRM_VBLANK_SIGNAL) {
...@@ -303,12 +287,13 @@ int drm_wait_vblank(DRM_IOCTL_ARGS) ...@@ -303,12 +287,13 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
* that case * that case
*/ */
list_for_each_entry(vbl_sig, vbl_sigs, head) { list_for_each_entry(vbl_sig, vbl_sigs, head) {
if (vbl_sig->sequence == vblwait.request.sequence if (vbl_sig->sequence == vblwait->request.sequence
&& vbl_sig->info.si_signo == vblwait.request.signal && vbl_sig->info.si_signo ==
vblwait->request.signal
&& vbl_sig->task == current) { && vbl_sig->task == current) {
spin_unlock_irqrestore(&dev->vbl_lock, spin_unlock_irqrestore(&dev->vbl_lock,
irqflags); irqflags);
vblwait.reply.sequence = seq; vblwait->reply.sequence = seq;
goto done; goto done;
} }
} }
...@@ -330,8 +315,8 @@ int drm_wait_vblank(DRM_IOCTL_ARGS) ...@@ -330,8 +315,8 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
memset((void *)vbl_sig, 0, sizeof(*vbl_sig)); memset((void *)vbl_sig, 0, sizeof(*vbl_sig));
vbl_sig->sequence = vblwait.request.sequence; vbl_sig->sequence = vblwait->request.sequence;
vbl_sig->info.si_signo = vblwait.request.signal; vbl_sig->info.si_signo = vblwait->request.signal;
vbl_sig->task = current; vbl_sig->task = current;
spin_lock_irqsave(&dev->vbl_lock, irqflags); spin_lock_irqsave(&dev->vbl_lock, irqflags);
...@@ -340,25 +325,22 @@ int drm_wait_vblank(DRM_IOCTL_ARGS) ...@@ -340,25 +325,22 @@ int drm_wait_vblank(DRM_IOCTL_ARGS)
spin_unlock_irqrestore(&dev->vbl_lock, irqflags); spin_unlock_irqrestore(&dev->vbl_lock, irqflags);
vblwait.reply.sequence = seq; vblwait->reply.sequence = seq;
} else { } else {
if (flags & _DRM_VBLANK_SECONDARY) { if (flags & _DRM_VBLANK_SECONDARY) {
if (dev->driver->vblank_wait2) if (dev->driver->vblank_wait2)
ret = dev->driver->vblank_wait2(dev, &vblwait.request.sequence); ret = dev->driver->vblank_wait2(dev, &vblwait->request.sequence);
} else if (dev->driver->vblank_wait) } else if (dev->driver->vblank_wait)
ret = ret =
dev->driver->vblank_wait(dev, dev->driver->vblank_wait(dev,
&vblwait.request.sequence); &vblwait->request.sequence);
do_gettimeofday(&now); do_gettimeofday(&now);
vblwait.reply.tval_sec = now.tv_sec; vblwait->reply.tval_sec = now.tv_sec;
vblwait.reply.tval_usec = now.tv_usec; vblwait->reply.tval_usec = now.tv_usec;
} }
done: done:
if (copy_to_user(argp, &vblwait, sizeof(vblwait)))
return -EFAULT;
return ret; return ret;
} }
......
...@@ -41,39 +41,33 @@ static int drm_notifier(void *priv); ...@@ -41,39 +41,33 @@ static int drm_notifier(void *priv);
* Lock ioctl. * Lock ioctl.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_lock structure. * \param arg user argument, pointing to a drm_lock structure.
* \return zero on success or negative number on failure. * \return zero on success or negative number on failure.
* *
* Add the current task to the lock wait queue, and attempt to take to lock. * Add the current task to the lock wait queue, and attempt to take to lock.
*/ */
int drm_lock(struct inode *inode, struct file *filp, int drm_lock(struct drm_device *dev, void *data, struct drm_file *file_priv)
unsigned int cmd, unsigned long arg)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
DECLARE_WAITQUEUE(entry, current); DECLARE_WAITQUEUE(entry, current);
struct drm_lock lock; struct drm_lock *lock = data;
int ret = 0; int ret = 0;
++priv->lock_count; ++file_priv->lock_count;
if (copy_from_user(&lock, (struct drm_lock __user *) arg, sizeof(lock))) if (lock->context == DRM_KERNEL_CONTEXT) {
return -EFAULT;
if (lock.context == DRM_KERNEL_CONTEXT) {
DRM_ERROR("Process %d using kernel context %d\n", DRM_ERROR("Process %d using kernel context %d\n",
current->pid, lock.context); current->pid, lock->context);
return -EINVAL; return -EINVAL;
} }
DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n", DRM_DEBUG("%d (pid %d) requests lock (0x%08x), flags = 0x%08x\n",
lock.context, current->pid, lock->context, current->pid,
dev->lock.hw_lock->lock, lock.flags); dev->lock.hw_lock->lock, lock->flags);
if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE)) if (drm_core_check_feature(dev, DRIVER_DMA_QUEUE))
if (lock.context < 0) if (lock->context < 0)
return -EINVAL; return -EINVAL;
add_wait_queue(&dev->lock.lock_queue, &entry); add_wait_queue(&dev->lock.lock_queue, &entry);
...@@ -87,8 +81,8 @@ int drm_lock(struct inode *inode, struct file *filp, ...@@ -87,8 +81,8 @@ int drm_lock(struct inode *inode, struct file *filp,
ret = -EINTR; ret = -EINTR;
break; break;
} }
if (drm_lock_take(&dev->lock, lock.context)) { if (drm_lock_take(&dev->lock, lock->context)) {
dev->lock.filp = filp; dev->lock.file_priv = file_priv;
dev->lock.lock_time = jiffies; dev->lock.lock_time = jiffies;
atomic_inc(&dev->counts[_DRM_STAT_LOCKS]); atomic_inc(&dev->counts[_DRM_STAT_LOCKS]);
break; /* Got lock */ break; /* Got lock */
...@@ -107,7 +101,8 @@ int drm_lock(struct inode *inode, struct file *filp, ...@@ -107,7 +101,8 @@ int drm_lock(struct inode *inode, struct file *filp,
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
remove_wait_queue(&dev->lock.lock_queue, &entry); remove_wait_queue(&dev->lock.lock_queue, &entry);
DRM_DEBUG( "%d %s\n", lock.context, ret ? "interrupted" : "has lock" ); DRM_DEBUG("%d %s\n", lock->context,
ret ? "interrupted" : "has lock");
if (ret) return ret; if (ret) return ret;
sigemptyset(&dev->sigmask); sigemptyset(&dev->sigmask);
...@@ -115,24 +110,26 @@ int drm_lock(struct inode *inode, struct file *filp, ...@@ -115,24 +110,26 @@ int drm_lock(struct inode *inode, struct file *filp,
sigaddset(&dev->sigmask, SIGTSTP); sigaddset(&dev->sigmask, SIGTSTP);
sigaddset(&dev->sigmask, SIGTTIN); sigaddset(&dev->sigmask, SIGTTIN);
sigaddset(&dev->sigmask, SIGTTOU); sigaddset(&dev->sigmask, SIGTTOU);
dev->sigdata.context = lock.context; dev->sigdata.context = lock->context;
dev->sigdata.lock = dev->lock.hw_lock; dev->sigdata.lock = dev->lock.hw_lock;
block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask); block_all_signals(drm_notifier, &dev->sigdata, &dev->sigmask);
if (dev->driver->dma_ready && (lock.flags & _DRM_LOCK_READY)) if (dev->driver->dma_ready && (lock->flags & _DRM_LOCK_READY))
dev->driver->dma_ready(dev); dev->driver->dma_ready(dev);
if (dev->driver->dma_quiescent && (lock.flags & _DRM_LOCK_QUIESCENT)) { if (dev->driver->dma_quiescent && (lock->flags & _DRM_LOCK_QUIESCENT))
{
if (dev->driver->dma_quiescent(dev)) { if (dev->driver->dma_quiescent(dev)) {
DRM_DEBUG("%d waiting for DMA quiescent\n", lock.context); DRM_DEBUG("%d waiting for DMA quiescent\n",
return DRM_ERR(EBUSY); lock->context);
return -EBUSY;
} }
} }
if (dev->driver->kernel_context_switch && if (dev->driver->kernel_context_switch &&
dev->last_context != lock.context) { dev->last_context != lock->context) {
dev->driver->kernel_context_switch(dev, dev->last_context, dev->driver->kernel_context_switch(dev, dev->last_context,
lock.context); lock->context);
} }
return 0; return 0;
...@@ -142,27 +139,21 @@ int drm_lock(struct inode *inode, struct file *filp, ...@@ -142,27 +139,21 @@ int drm_lock(struct inode *inode, struct file *filp,
* Unlock ioctl. * Unlock ioctl.
* *
* \param inode device inode. * \param inode device inode.
* \param filp file pointer. * \param file_priv DRM file private.
* \param cmd command. * \param cmd command.
* \param arg user argument, pointing to a drm_lock structure. * \param arg user argument, pointing to a drm_lock structure.
* \return zero on success or negative number on failure. * \return zero on success or negative number on failure.
* *
* Transfer and free the lock. * Transfer and free the lock.
*/ */
int drm_unlock(struct inode *inode, struct file *filp, int drm_unlock(struct drm_device *dev, void *data, struct drm_file *file_priv)
unsigned int cmd, unsigned long arg)
{ {
struct drm_file *priv = filp->private_data; struct drm_lock *lock = data;
struct drm_device *dev = priv->head->dev;
struct drm_lock lock;
unsigned long irqflags; unsigned long irqflags;
if (copy_from_user(&lock, (struct drm_lock __user *) arg, sizeof(lock))) if (lock->context == DRM_KERNEL_CONTEXT) {
return -EFAULT;
if (lock.context == DRM_KERNEL_CONTEXT) {
DRM_ERROR("Process %d using kernel context %d\n", DRM_ERROR("Process %d using kernel context %d\n",
current->pid, lock.context); current->pid, lock->context);
return -EINVAL; return -EINVAL;
} }
...@@ -184,7 +175,7 @@ int drm_unlock(struct inode *inode, struct file *filp, ...@@ -184,7 +175,7 @@ int drm_unlock(struct inode *inode, struct file *filp,
if (dev->driver->kernel_context_switch_unlock) if (dev->driver->kernel_context_switch_unlock)
dev->driver->kernel_context_switch_unlock(dev); dev->driver->kernel_context_switch_unlock(dev);
else { else {
if (drm_lock_free(&dev->lock,lock.context)) { if (drm_lock_free(&dev->lock,lock->context)) {
/* FIXME: Should really bail out here. */ /* FIXME: Should really bail out here. */
} }
} }
...@@ -257,7 +248,7 @@ static int drm_lock_transfer(struct drm_lock_data *lock_data, ...@@ -257,7 +248,7 @@ static int drm_lock_transfer(struct drm_lock_data *lock_data,
unsigned int old, new, prev; unsigned int old, new, prev;
volatile unsigned int *lock = &lock_data->hw_lock->lock; volatile unsigned int *lock = &lock_data->hw_lock->lock;
lock_data->filp = NULL; lock_data->file_priv = NULL;
do { do {
old = *lock; old = *lock;
new = context | _DRM_LOCK_HELD; new = context | _DRM_LOCK_HELD;
...@@ -390,13 +381,11 @@ void drm_idlelock_release(struct drm_lock_data *lock_data) ...@@ -390,13 +381,11 @@ void drm_idlelock_release(struct drm_lock_data *lock_data)
EXPORT_SYMBOL(drm_idlelock_release); EXPORT_SYMBOL(drm_idlelock_release);
int drm_i_have_hw_lock(struct file *filp) int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv)
{ {
DRM_DEVICE; return (file_priv->lock_count && dev->lock.hw_lock &&
return (priv->lock_count && dev->lock.hw_lock &&
_DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) && _DRM_LOCK_IS_HELD(dev->lock.hw_lock->lock) &&
dev->lock.filp == filp); dev->lock.file_priv == file_priv);
} }
EXPORT_SYMBOL(drm_i_have_hw_lock); EXPORT_SYMBOL(drm_i_have_hw_lock);
...@@ -6,11 +6,6 @@ ...@@ -6,11 +6,6 @@
#include <linux/interrupt.h> /* For task queue support */ #include <linux/interrupt.h> /* For task queue support */
#include <linux/delay.h> #include <linux/delay.h>
/** File pointer type */
#define DRMFILE struct file *
/** Ioctl arguments */
#define DRM_IOCTL_ARGS struct inode *inode, struct file *filp, unsigned int cmd, unsigned long data
#define DRM_ERR(d) -(d)
/** Current process ID */ /** Current process ID */
#define DRM_CURRENTPID current->pid #define DRM_CURRENTPID current->pid
#define DRM_SUSER(p) capable(CAP_SYS_ADMIN) #define DRM_SUSER(p) capable(CAP_SYS_ADMIN)
...@@ -33,9 +28,6 @@ ...@@ -33,9 +28,6 @@
#define DRM_WRITEMEMORYBARRIER() wmb() #define DRM_WRITEMEMORYBARRIER() wmb()
/** Read/write memory barrier */ /** Read/write memory barrier */
#define DRM_MEMORYBARRIER() mb() #define DRM_MEMORYBARRIER() mb()
/** DRM device local declaration */
#define DRM_DEVICE struct drm_file *priv = filp->private_data; \
struct drm_device *dev = priv->head->dev
/** IRQ handler arguments and return type and values */ /** IRQ handler arguments and return type and values */
#define DRM_IRQ_ARGS int irq, void *arg #define DRM_IRQ_ARGS int irq, void *arg
...@@ -94,8 +86,6 @@ static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size) ...@@ -94,8 +86,6 @@ static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size)
#define DRM_GET_USER_UNCHECKED(val, uaddr) \ #define DRM_GET_USER_UNCHECKED(val, uaddr) \
__get_user(val, uaddr) __get_user(val, uaddr)
#define DRM_GET_PRIV_WITH_RETURN(_priv, _filp) _priv = _filp->private_data
#define DRM_HZ HZ #define DRM_HZ HZ
#define DRM_WAIT_ON( ret, queue, timeout, condition ) \ #define DRM_WAIT_ON( ret, queue, timeout, condition ) \
......
...@@ -236,10 +236,8 @@ ...@@ -236,10 +236,8 @@
{0x1106, 0x3022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3118, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_PRO_GROUP_A}, \ {0x1106, 0x3118, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_PRO_GROUP_A}, \
{0x1106, 0x3122, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3122, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x7204, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x7205, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x7205, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3304, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3344, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3344, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3343, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \ {0x1106, 0x3343, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
{0x1106, 0x3230, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_DX9_0}, \ {0x1106, 0x3230, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_DX9_0}, \
......
...@@ -62,13 +62,8 @@ void drm_sg_cleanup(struct drm_sg_mem * entry) ...@@ -62,13 +62,8 @@ void drm_sg_cleanup(struct drm_sg_mem * entry)
# define ScatterHandle(x) (unsigned int)(x) # define ScatterHandle(x) (unsigned int)(x)
#endif #endif
int drm_sg_alloc(struct inode *inode, struct file *filp, int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request)
unsigned int cmd, unsigned long arg)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_scatter_gather __user *argp = (void __user *)arg;
struct drm_scatter_gather request;
struct drm_sg_mem *entry; struct drm_sg_mem *entry;
unsigned long pages, i, j; unsigned long pages, i, j;
...@@ -80,17 +75,13 @@ int drm_sg_alloc(struct inode *inode, struct file *filp, ...@@ -80,17 +75,13 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
if (dev->sg) if (dev->sg)
return -EINVAL; return -EINVAL;
if (copy_from_user(&request, argp, sizeof(request)))
return -EFAULT;
entry = drm_alloc(sizeof(*entry), DRM_MEM_SGLISTS); entry = drm_alloc(sizeof(*entry), DRM_MEM_SGLISTS);
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
memset(entry, 0, sizeof(*entry)); memset(entry, 0, sizeof(*entry));
pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE; DRM_DEBUG("sg size=%ld pages=%ld\n", request->size, pages);
DRM_DEBUG("sg size=%ld pages=%ld\n", request.size, pages);
entry->pages = pages; entry->pages = pages;
entry->pagelist = drm_alloc(pages * sizeof(*entry->pagelist), entry->pagelist = drm_alloc(pages * sizeof(*entry->pagelist),
...@@ -142,12 +133,7 @@ int drm_sg_alloc(struct inode *inode, struct file *filp, ...@@ -142,12 +133,7 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
SetPageReserved(entry->pagelist[j]); SetPageReserved(entry->pagelist[j]);
} }
request.handle = entry->handle; request->handle = entry->handle;
if (copy_to_user(argp, &request, sizeof(request))) {
drm_sg_cleanup(entry);
return -EFAULT;
}
dev->sg = entry; dev->sg = entry;
...@@ -197,27 +183,31 @@ int drm_sg_alloc(struct inode *inode, struct file *filp, ...@@ -197,27 +183,31 @@ int drm_sg_alloc(struct inode *inode, struct file *filp,
drm_sg_cleanup(entry); drm_sg_cleanup(entry);
return -ENOMEM; return -ENOMEM;
} }
EXPORT_SYMBOL(drm_sg_alloc);
int drm_sg_free(struct inode *inode, struct file *filp, int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_scatter_gather *request = data;
struct drm_device *dev = priv->head->dev;
struct drm_scatter_gather request; return drm_sg_alloc(dev, request);
}
int drm_sg_free(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{
struct drm_scatter_gather *request = data;
struct drm_sg_mem *entry; struct drm_sg_mem *entry;
if (!drm_core_check_feature(dev, DRIVER_SG)) if (!drm_core_check_feature(dev, DRIVER_SG))
return -EINVAL; return -EINVAL;
if (copy_from_user(&request,
(struct drm_scatter_gather __user *) arg,
sizeof(request)))
return -EFAULT;
entry = dev->sg; entry = dev->sg;
dev->sg = NULL; dev->sg = NULL;
if (!entry || entry->handle != request.handle) if (!entry || entry->handle != request->handle)
return -EINVAL; return -EINVAL;
DRM_DEBUG("sg free virtual = %p\n", entry->virtual); DRM_DEBUG("sg free virtual = %p\n", entry->virtual);
......
...@@ -463,7 +463,7 @@ static void drm_vm_close(struct vm_area_struct *vma) ...@@ -463,7 +463,7 @@ static void drm_vm_close(struct vm_area_struct *vma)
/** /**
* mmap DMA memory. * mmap DMA memory.
* *
* \param filp file pointer. * \param file_priv DRM file private.
* \param vma virtual memory area. * \param vma virtual memory area.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
...@@ -533,7 +533,7 @@ EXPORT_SYMBOL(drm_core_get_reg_ofs); ...@@ -533,7 +533,7 @@ EXPORT_SYMBOL(drm_core_get_reg_ofs);
/** /**
* mmap DMA memory. * mmap DMA memory.
* *
* \param filp file pointer. * \param file_priv DRM file private.
* \param vma virtual memory area. * \param vma virtual memory area.
* \return zero on success or a negative number on failure. * \return zero on success or a negative number on failure.
* *
......
...@@ -120,10 +120,9 @@ static const struct file_operations i810_buffer_fops = { ...@@ -120,10 +120,9 @@ static const struct file_operations i810_buffer_fops = {
.fasync = drm_fasync, .fasync = drm_fasync,
}; };
static int i810_map_buffer(struct drm_buf * buf, struct file *filp) static int i810_map_buffer(struct drm_buf * buf, struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_device *dev = file_priv->head->dev;
struct drm_device *dev = priv->head->dev;
drm_i810_buf_priv_t *buf_priv = buf->dev_private; drm_i810_buf_priv_t *buf_priv = buf->dev_private;
drm_i810_private_t *dev_priv = dev->dev_private; drm_i810_private_t *dev_priv = dev->dev_private;
const struct file_operations *old_fops; const struct file_operations *old_fops;
...@@ -133,14 +132,14 @@ static int i810_map_buffer(struct drm_buf * buf, struct file *filp) ...@@ -133,14 +132,14 @@ static int i810_map_buffer(struct drm_buf * buf, struct file *filp)
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
old_fops = filp->f_op; old_fops = file_priv->filp->f_op;
filp->f_op = &i810_buffer_fops; file_priv->filp->f_op = &i810_buffer_fops;
dev_priv->mmap_buffer = buf; dev_priv->mmap_buffer = buf;
buf_priv->virtual = (void *)do_mmap(filp, 0, buf->total, buf_priv->virtual = (void *)do_mmap(file_priv->filp, 0, buf->total,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, buf->bus_address); MAP_SHARED, buf->bus_address);
dev_priv->mmap_buffer = NULL; dev_priv->mmap_buffer = NULL;
filp->f_op = old_fops; file_priv->filp->f_op = old_fops;
if (IS_ERR(buf_priv->virtual)) { if (IS_ERR(buf_priv->virtual)) {
/* Real error */ /* Real error */
DRM_ERROR("mmap error\n"); DRM_ERROR("mmap error\n");
...@@ -173,7 +172,7 @@ static int i810_unmap_buffer(struct drm_buf * buf) ...@@ -173,7 +172,7 @@ static int i810_unmap_buffer(struct drm_buf * buf)
} }
static int i810_dma_get_buffer(struct drm_device * dev, drm_i810_dma_t * d, static int i810_dma_get_buffer(struct drm_device * dev, drm_i810_dma_t * d,
struct file *filp) struct drm_file *file_priv)
{ {
struct drm_buf *buf; struct drm_buf *buf;
drm_i810_buf_priv_t *buf_priv; drm_i810_buf_priv_t *buf_priv;
...@@ -186,13 +185,13 @@ static int i810_dma_get_buffer(struct drm_device * dev, drm_i810_dma_t * d, ...@@ -186,13 +185,13 @@ static int i810_dma_get_buffer(struct drm_device * dev, drm_i810_dma_t * d,
return retcode; return retcode;
} }
retcode = i810_map_buffer(buf, filp); retcode = i810_map_buffer(buf, file_priv);
if (retcode) { if (retcode) {
i810_freelist_put(dev, buf); i810_freelist_put(dev, buf);
DRM_ERROR("mapbuf failed, retcode %d\n", retcode); DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
return retcode; return retcode;
} }
buf->filp = filp; buf->file_priv = file_priv;
buf_priv = buf->dev_private; buf_priv = buf->dev_private;
d->granted = 1; d->granted = 1;
d->request_idx = buf->idx; d->request_idx = buf->idx;
...@@ -380,7 +379,7 @@ static int i810_dma_initialize(struct drm_device * dev, ...@@ -380,7 +379,7 @@ static int i810_dma_initialize(struct drm_device * dev,
i810_dma_cleanup(dev); i810_dma_cleanup(dev);
DRM_ERROR("can not ioremap virtual address for" DRM_ERROR("can not ioremap virtual address for"
" ring buffer\n"); " ring buffer\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
dev_priv->ring.virtual_start = dev_priv->ring.map.handle; dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
...@@ -430,99 +429,29 @@ static int i810_dma_initialize(struct drm_device * dev, ...@@ -430,99 +429,29 @@ static int i810_dma_initialize(struct drm_device * dev,
return 0; return 0;
} }
/* i810 DRM version 1.1 used a smaller init structure with different static int i810_dma_init(struct drm_device *dev, void *data,
* ordering of values than is currently used (drm >= 1.2). There is struct drm_file *file_priv)
* no defined way to detect the XFree version to correct this problem,
* however by checking using this procedure we can detect the correct
* thing to do.
*
* #1 Read the Smaller init structure from user-space
* #2 Verify the overlay_physical is a valid physical address, or NULL
* If it isn't then we have a v1.1 client. Fix up params.
* If it is, then we have a 1.2 client... get the rest of the data.
*/
static int i810_dma_init_compat(drm_i810_init_t * init, unsigned long arg)
{ {
/* Get v1.1 init data */
if (copy_from_user(init, (drm_i810_pre12_init_t __user *) arg,
sizeof(drm_i810_pre12_init_t))) {
return -EFAULT;
}
if ((!init->overlay_physical) || (init->overlay_physical > 4096)) {
/* This is a v1.2 client, just get the v1.2 init data */
DRM_INFO("Using POST v1.2 init.\n");
if (copy_from_user(init, (drm_i810_init_t __user *) arg,
sizeof(drm_i810_init_t))) {
return -EFAULT;
}
} else {
/* This is a v1.1 client, fix the params */
DRM_INFO("Using PRE v1.2 init.\n");
init->pitch_bits = init->h;
init->pitch = init->w;
init->h = init->overlay_physical;
init->w = init->overlay_offset;
init->overlay_physical = 0;
init->overlay_offset = 0;
}
return 0;
}
static int i810_dma_init(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv; drm_i810_private_t *dev_priv;
drm_i810_init_t init; drm_i810_init_t *init = data;
int retcode = 0; int retcode = 0;
/* Get only the init func */ switch (init->func) {
if (copy_from_user
(&init, (void __user *)arg, sizeof(drm_i810_init_func_t)))
return -EFAULT;
switch (init.func) {
case I810_INIT_DMA:
/* This case is for backward compatibility. It
* handles XFree 4.1.0 and 4.2.0, and has to
* do some parameter checking as described below.
* It will someday go away.
*/
retcode = i810_dma_init_compat(&init, arg);
if (retcode)
return retcode;
dev_priv = drm_alloc(sizeof(drm_i810_private_t),
DRM_MEM_DRIVER);
if (dev_priv == NULL)
return -ENOMEM;
retcode = i810_dma_initialize(dev, dev_priv, &init);
break;
default:
case I810_INIT_DMA_1_4: case I810_INIT_DMA_1_4:
DRM_INFO("Using v1.4 init.\n"); DRM_INFO("Using v1.4 init.\n");
if (copy_from_user(&init, (drm_i810_init_t __user *) arg,
sizeof(drm_i810_init_t))) {
return -EFAULT;
}
dev_priv = drm_alloc(sizeof(drm_i810_private_t), dev_priv = drm_alloc(sizeof(drm_i810_private_t),
DRM_MEM_DRIVER); DRM_MEM_DRIVER);
if (dev_priv == NULL) if (dev_priv == NULL)
return -ENOMEM; return -ENOMEM;
retcode = i810_dma_initialize(dev, dev_priv, &init); retcode = i810_dma_initialize(dev, dev_priv, init);
break; break;
case I810_CLEANUP_DMA: case I810_CLEANUP_DMA:
DRM_INFO("DMA Cleanup\n"); DRM_INFO("DMA Cleanup\n");
retcode = i810_dma_cleanup(dev); retcode = i810_dma_cleanup(dev);
break; break;
default:
return -EINVAL;
} }
return retcode; return retcode;
...@@ -968,7 +897,8 @@ static int i810_flush_queue(struct drm_device * dev) ...@@ -968,7 +897,8 @@ static int i810_flush_queue(struct drm_device * dev)
} }
/* Must be called with the lock held */ /* Must be called with the lock held */
static void i810_reclaim_buffers(struct drm_device * dev, struct file *filp) static void i810_reclaim_buffers(struct drm_device * dev,
struct drm_file *file_priv)
{ {
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
int i; int i;
...@@ -986,7 +916,7 @@ static void i810_reclaim_buffers(struct drm_device * dev, struct file *filp) ...@@ -986,7 +916,7 @@ static void i810_reclaim_buffers(struct drm_device * dev, struct file *filp)
struct drm_buf *buf = dma->buflist[i]; struct drm_buf *buf = dma->buflist[i];
drm_i810_buf_priv_t *buf_priv = buf->dev_private; drm_i810_buf_priv_t *buf_priv = buf->dev_private;
if (buf->filp == filp && buf_priv) { if (buf->file_priv == file_priv && buf_priv) {
int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
I810_BUF_FREE); I810_BUF_FREE);
...@@ -998,47 +928,38 @@ static void i810_reclaim_buffers(struct drm_device * dev, struct file *filp) ...@@ -998,47 +928,38 @@ static void i810_reclaim_buffers(struct drm_device * dev, struct file *filp)
} }
} }
static int i810_flush_ioctl(struct inode *inode, struct file *filp, static int i810_flush_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; LOCK_TEST_WITH_RETURN(dev, file_priv);
struct drm_device *dev = priv->head->dev;
LOCK_TEST_WITH_RETURN(dev, filp);
i810_flush_queue(dev); i810_flush_queue(dev);
return 0; return 0;
} }
static int i810_dma_vertex(struct inode *inode, struct file *filp, static int i810_dma_vertex(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
drm_i810_vertex_t vertex; drm_i810_vertex_t *vertex = data;
if (copy_from_user
(&vertex, (drm_i810_vertex_t __user *) arg, sizeof(vertex)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
DRM_DEBUG("i810 dma vertex, idx %d used %d discard %d\n", DRM_DEBUG("i810 dma vertex, idx %d used %d discard %d\n",
vertex.idx, vertex.used, vertex.discard); vertex->idx, vertex->used, vertex->discard);
if (vertex.idx < 0 || vertex.idx > dma->buf_count) if (vertex->idx < 0 || vertex->idx > dma->buf_count)
return -EINVAL; return -EINVAL;
i810_dma_dispatch_vertex(dev, i810_dma_dispatch_vertex(dev,
dma->buflist[vertex.idx], dma->buflist[vertex->idx],
vertex.discard, vertex.used); vertex->discard, vertex->used);
atomic_add(vertex.used, &dev->counts[_DRM_STAT_SECONDARY]); atomic_add(vertex->used, &dev->counts[_DRM_STAT_SECONDARY]);
atomic_inc(&dev->counts[_DRM_STAT_DMA]); atomic_inc(&dev->counts[_DRM_STAT_DMA]);
sarea_priv->last_enqueue = dev_priv->counter - 1; sarea_priv->last_enqueue = dev_priv->counter - 1;
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
...@@ -1046,48 +967,37 @@ static int i810_dma_vertex(struct inode *inode, struct file *filp, ...@@ -1046,48 +967,37 @@ static int i810_dma_vertex(struct inode *inode, struct file *filp,
return 0; return 0;
} }
static int i810_clear_bufs(struct inode *inode, struct file *filp, static int i810_clear_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; drm_i810_clear_t *clear = data;
struct drm_device *dev = priv->head->dev;
drm_i810_clear_t clear;
if (copy_from_user LOCK_TEST_WITH_RETURN(dev, file_priv);
(&clear, (drm_i810_clear_t __user *) arg, sizeof(clear)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp);
/* GH: Someone's doing nasty things... */ /* GH: Someone's doing nasty things... */
if (!dev->dev_private) { if (!dev->dev_private) {
return -EINVAL; return -EINVAL;
} }
i810_dma_dispatch_clear(dev, clear.flags, i810_dma_dispatch_clear(dev, clear->flags,
clear.clear_color, clear.clear_depth); clear->clear_color, clear->clear_depth);
return 0; return 0;
} }
static int i810_swap_bufs(struct inode *inode, struct file *filp, static int i810_swap_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
DRM_DEBUG("i810_swap_bufs\n"); DRM_DEBUG("i810_swap_bufs\n");
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
i810_dma_dispatch_swap(dev); i810_dma_dispatch_swap(dev);
return 0; return 0;
} }
static int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, static int i810_getage(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
...@@ -1097,46 +1007,39 @@ static int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd, ...@@ -1097,46 +1007,39 @@ static int i810_getage(struct inode *inode, struct file *filp, unsigned int cmd,
return 0; return 0;
} }
static int i810_getbuf(struct inode *inode, struct file *filp, unsigned int cmd, static int i810_getbuf(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
int retcode = 0; int retcode = 0;
drm_i810_dma_t d; drm_i810_dma_t *d = data;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
if (copy_from_user(&d, (drm_i810_dma_t __user *) arg, sizeof(d))) LOCK_TEST_WITH_RETURN(dev, file_priv);
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp);
d.granted = 0; d->granted = 0;
retcode = i810_dma_get_buffer(dev, &d, filp); retcode = i810_dma_get_buffer(dev, d, file_priv);
DRM_DEBUG("i810_dma: %d returning %d, granted = %d\n", DRM_DEBUG("i810_dma: %d returning %d, granted = %d\n",
current->pid, retcode, d.granted); current->pid, retcode, d->granted);
if (copy_to_user((void __user *) arg, &d, sizeof(d)))
return -EFAULT;
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
return retcode; return retcode;
} }
static int i810_copybuf(struct inode *inode, static int i810_copybuf(struct drm_device *dev, void *data,
struct file *filp, unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
/* Never copy - 2.4.x doesn't need it */ /* Never copy - 2.4.x doesn't need it */
return 0; return 0;
} }
static int i810_docopy(struct inode *inode, struct file *filp, unsigned int cmd, static int i810_docopy(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
/* Never copy - 2.4.x doesn't need it */ /* Never copy - 2.4.x doesn't need it */
return 0; return 0;
...@@ -1202,30 +1105,25 @@ static void i810_dma_dispatch_mc(struct drm_device * dev, struct drm_buf * buf, ...@@ -1202,30 +1105,25 @@ static void i810_dma_dispatch_mc(struct drm_device * dev, struct drm_buf * buf,
ADVANCE_LP_RING(); ADVANCE_LP_RING();
} }
static int i810_dma_mc(struct inode *inode, struct file *filp, static int i810_dma_mc(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *) drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
drm_i810_mc_t mc; drm_i810_mc_t *mc = data;
if (copy_from_user(&mc, (drm_i810_mc_t __user *) arg, sizeof(mc)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (mc.idx >= dma->buf_count || mc.idx < 0) if (mc->idx >= dma->buf_count || mc->idx < 0)
return -EINVAL; return -EINVAL;
i810_dma_dispatch_mc(dev, dma->buflist[mc.idx], mc.used, i810_dma_dispatch_mc(dev, dma->buflist[mc->idx], mc->used,
mc.last_render); mc->last_render);
atomic_add(mc.used, &dev->counts[_DRM_STAT_SECONDARY]); atomic_add(mc->used, &dev->counts[_DRM_STAT_SECONDARY]);
atomic_inc(&dev->counts[_DRM_STAT_DMA]); atomic_inc(&dev->counts[_DRM_STAT_DMA]);
sarea_priv->last_enqueue = dev_priv->counter - 1; sarea_priv->last_enqueue = dev_priv->counter - 1;
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
...@@ -1233,52 +1131,41 @@ static int i810_dma_mc(struct inode *inode, struct file *filp, ...@@ -1233,52 +1131,41 @@ static int i810_dma_mc(struct inode *inode, struct file *filp,
return 0; return 0;
} }
static int i810_rstatus(struct inode *inode, struct file *filp, static int i810_rstatus(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
return (int)(((u32 *) (dev_priv->hw_status_page))[4]); return (int)(((u32 *) (dev_priv->hw_status_page))[4]);
} }
static int i810_ov0_info(struct inode *inode, struct file *filp, static int i810_ov0_info(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
drm_i810_overlay_t data; drm_i810_overlay_t *ov = data;
ov->offset = dev_priv->overlay_offset;
ov->physical = dev_priv->overlay_physical;
data.offset = dev_priv->overlay_offset;
data.physical = dev_priv->overlay_physical;
if (copy_to_user
((drm_i810_overlay_t __user *) arg, &data, sizeof(data)))
return -EFAULT;
return 0; return 0;
} }
static int i810_fstatus(struct inode *inode, struct file *filp, static int i810_fstatus(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
return I810_READ(0x30008); return I810_READ(0x30008);
} }
static int i810_ov0_flip(struct inode *inode, struct file *filp, static int i810_ov0_flip(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private; drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
//Tell the overlay to update //Tell the overlay to update
I810_WRITE(0x30000, dev_priv->overlay_physical | 0x80000000); I810_WRITE(0x30000, dev_priv->overlay_physical | 0x80000000);
...@@ -1310,16 +1197,14 @@ static int i810_do_cleanup_pageflip(struct drm_device * dev) ...@@ -1310,16 +1197,14 @@ static int i810_do_cleanup_pageflip(struct drm_device * dev)
return 0; return 0;
} }
static int i810_flip_bufs(struct inode *inode, struct file *filp, static int i810_flip_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i810_private_t *dev_priv = dev->dev_private; drm_i810_private_t *dev_priv = dev->dev_private;
DRM_DEBUG("%s\n", __FUNCTION__); DRM_DEBUG("%s\n", __FUNCTION__);
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (!dev_priv->page_flipping) if (!dev_priv->page_flipping)
i810_do_init_pageflip(dev); i810_do_init_pageflip(dev);
...@@ -1345,7 +1230,7 @@ void i810_driver_lastclose(struct drm_device * dev) ...@@ -1345,7 +1230,7 @@ void i810_driver_lastclose(struct drm_device * dev)
i810_dma_cleanup(dev); i810_dma_cleanup(dev);
} }
void i810_driver_preclose(struct drm_device * dev, DRMFILE filp) void i810_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
{ {
if (dev->dev_private) { if (dev->dev_private) {
drm_i810_private_t *dev_priv = dev->dev_private; drm_i810_private_t *dev_priv = dev->dev_private;
...@@ -1355,9 +1240,10 @@ void i810_driver_preclose(struct drm_device * dev, DRMFILE filp) ...@@ -1355,9 +1240,10 @@ void i810_driver_preclose(struct drm_device * dev, DRMFILE filp)
} }
} }
void i810_driver_reclaim_buffers_locked(struct drm_device * dev, struct file *filp) void i810_driver_reclaim_buffers_locked(struct drm_device * dev,
struct drm_file *file_priv)
{ {
i810_reclaim_buffers(dev, filp); i810_reclaim_buffers(dev, file_priv);
} }
int i810_driver_dma_quiescent(struct drm_device * dev) int i810_driver_dma_quiescent(struct drm_device * dev)
...@@ -1366,22 +1252,22 @@ int i810_driver_dma_quiescent(struct drm_device * dev) ...@@ -1366,22 +1252,22 @@ int i810_driver_dma_quiescent(struct drm_device * dev)
return 0; return 0;
} }
drm_ioctl_desc_t i810_ioctls[] = { struct drm_ioctl_desc i810_ioctls[] = {
[DRM_IOCTL_NR(DRM_I810_INIT)] = {i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I810_VERTEX)] = {i810_dma_vertex, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_VERTEX, i810_dma_vertex, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_CLEAR)] = {i810_clear_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_CLEAR, i810_clear_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_FLUSH)] = {i810_flush_ioctl, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_FLUSH, i810_flush_ioctl, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_GETAGE)] = {i810_getage, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_GETAGE, i810_getage, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_GETBUF)] = {i810_getbuf, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_GETBUF, i810_getbuf, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_SWAP)] = {i810_swap_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_SWAP, i810_swap_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_COPY)] = {i810_copybuf, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_COPY, i810_copybuf, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_DOCOPY)] = {i810_docopy, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_DOCOPY, i810_docopy, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_OV0INFO)] = {i810_ov0_info, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_OV0INFO, i810_ov0_info, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_FSTATUS)] = {i810_fstatus, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_FSTATUS, i810_fstatus, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_OV0FLIP)] = {i810_ov0_flip, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_OV0FLIP, i810_ov0_flip, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_MC)] = {i810_dma_mc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I810_MC, i810_dma_mc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I810_RSTATUS)] = {i810_rstatus, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I810_RSTATUS, i810_rstatus, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I810_FLIP)] = {i810_flip_bufs, DRM_AUTH} DRM_IOCTL_DEF(DRM_I810_FLIP, i810_flip_bufs, DRM_AUTH)
}; };
int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls); int i810_max_ioctl = DRM_ARRAY_SIZE(i810_ioctls);
......
...@@ -102,13 +102,8 @@ typedef enum _drm_i810_init_func { ...@@ -102,13 +102,8 @@ typedef enum _drm_i810_init_func {
/* This is the init structure after v1.2 */ /* This is the init structure after v1.2 */
typedef struct _drm_i810_init { typedef struct _drm_i810_init {
drm_i810_init_func_t func; drm_i810_init_func_t func;
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
int ring_map_idx;
int buffer_map_idx;
#else
unsigned int mmio_offset; unsigned int mmio_offset;
unsigned int buffers_offset; unsigned int buffers_offset;
#endif
int sarea_priv_offset; int sarea_priv_offset;
unsigned int ring_start; unsigned int ring_start;
unsigned int ring_end; unsigned int ring_end;
......
...@@ -117,15 +117,16 @@ typedef struct drm_i810_private { ...@@ -117,15 +117,16 @@ typedef struct drm_i810_private {
/* i810_dma.c */ /* i810_dma.c */
extern int i810_driver_dma_quiescent(struct drm_device * dev); extern int i810_driver_dma_quiescent(struct drm_device * dev);
extern void i810_driver_reclaim_buffers_locked(struct drm_device * dev, extern void i810_driver_reclaim_buffers_locked(struct drm_device * dev,
struct file *filp); struct drm_file *file_priv);
extern int i810_driver_load(struct drm_device *, unsigned long flags); extern int i810_driver_load(struct drm_device *, unsigned long flags);
extern void i810_driver_lastclose(struct drm_device * dev); extern void i810_driver_lastclose(struct drm_device * dev);
extern void i810_driver_preclose(struct drm_device * dev, DRMFILE filp); extern void i810_driver_preclose(struct drm_device * dev,
struct drm_file *file_priv);
extern void i810_driver_reclaim_buffers_locked(struct drm_device * dev, extern void i810_driver_reclaim_buffers_locked(struct drm_device * dev,
struct file *filp); struct drm_file *file_priv);
extern int i810_driver_device_is_agp(struct drm_device * dev); extern int i810_driver_device_is_agp(struct drm_device * dev);
extern drm_ioctl_desc_t i810_ioctls[]; extern struct drm_ioctl_desc i810_ioctls[];
extern int i810_max_ioctl; extern int i810_max_ioctl;
#define I810_BASE(reg) ((unsigned long) \ #define I810_BASE(reg) ((unsigned long) \
......
...@@ -122,10 +122,9 @@ static const struct file_operations i830_buffer_fops = { ...@@ -122,10 +122,9 @@ static const struct file_operations i830_buffer_fops = {
.fasync = drm_fasync, .fasync = drm_fasync,
}; };
static int i830_map_buffer(struct drm_buf * buf, struct file *filp) static int i830_map_buffer(struct drm_buf * buf, struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; struct drm_device *dev = file_priv->head->dev;
struct drm_device *dev = priv->head->dev;
drm_i830_buf_priv_t *buf_priv = buf->dev_private; drm_i830_buf_priv_t *buf_priv = buf->dev_private;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
const struct file_operations *old_fops; const struct file_operations *old_fops;
...@@ -136,13 +135,13 @@ static int i830_map_buffer(struct drm_buf * buf, struct file *filp) ...@@ -136,13 +135,13 @@ static int i830_map_buffer(struct drm_buf * buf, struct file *filp)
return -EINVAL; return -EINVAL;
down_write(&current->mm->mmap_sem); down_write(&current->mm->mmap_sem);
old_fops = filp->f_op; old_fops = file_priv->filp->f_op;
filp->f_op = &i830_buffer_fops; file_priv->filp->f_op = &i830_buffer_fops;
dev_priv->mmap_buffer = buf; dev_priv->mmap_buffer = buf;
virtual = do_mmap(filp, 0, buf->total, PROT_READ | PROT_WRITE, virtual = do_mmap(file_priv->filp, 0, buf->total, PROT_READ | PROT_WRITE,
MAP_SHARED, buf->bus_address); MAP_SHARED, buf->bus_address);
dev_priv->mmap_buffer = NULL; dev_priv->mmap_buffer = NULL;
filp->f_op = old_fops; file_priv->filp->f_op = old_fops;
if (IS_ERR((void *)virtual)) { /* ugh */ if (IS_ERR((void *)virtual)) { /* ugh */
/* Real error */ /* Real error */
DRM_ERROR("mmap error\n"); DRM_ERROR("mmap error\n");
...@@ -177,7 +176,7 @@ static int i830_unmap_buffer(struct drm_buf * buf) ...@@ -177,7 +176,7 @@ static int i830_unmap_buffer(struct drm_buf * buf)
} }
static int i830_dma_get_buffer(struct drm_device * dev, drm_i830_dma_t * d, static int i830_dma_get_buffer(struct drm_device * dev, drm_i830_dma_t * d,
struct file *filp) struct drm_file *file_priv)
{ {
struct drm_buf *buf; struct drm_buf *buf;
drm_i830_buf_priv_t *buf_priv; drm_i830_buf_priv_t *buf_priv;
...@@ -190,13 +189,13 @@ static int i830_dma_get_buffer(struct drm_device * dev, drm_i830_dma_t * d, ...@@ -190,13 +189,13 @@ static int i830_dma_get_buffer(struct drm_device * dev, drm_i830_dma_t * d,
return retcode; return retcode;
} }
retcode = i830_map_buffer(buf, filp); retcode = i830_map_buffer(buf, file_priv);
if (retcode) { if (retcode) {
i830_freelist_put(dev, buf); i830_freelist_put(dev, buf);
DRM_ERROR("mapbuf failed, retcode %d\n", retcode); DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
return retcode; return retcode;
} }
buf->filp = filp; buf->file_priv = file_priv;
buf_priv = buf->dev_private; buf_priv = buf->dev_private;
d->granted = 1; d->granted = 1;
d->request_idx = buf->idx; d->request_idx = buf->idx;
...@@ -389,7 +388,7 @@ static int i830_dma_initialize(struct drm_device * dev, ...@@ -389,7 +388,7 @@ static int i830_dma_initialize(struct drm_device * dev,
i830_dma_cleanup(dev); i830_dma_cleanup(dev);
DRM_ERROR("can not ioremap virtual address for" DRM_ERROR("can not ioremap virtual address for"
" ring buffer\n"); " ring buffer\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
dev_priv->ring.virtual_start = dev_priv->ring.map.handle; dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
...@@ -451,25 +450,20 @@ static int i830_dma_initialize(struct drm_device * dev, ...@@ -451,25 +450,20 @@ static int i830_dma_initialize(struct drm_device * dev,
return 0; return 0;
} }
static int i830_dma_init(struct inode *inode, struct file *filp, static int i830_dma_init(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv; drm_i830_private_t *dev_priv;
drm_i830_init_t init; drm_i830_init_t *init = data;
int retcode = 0; int retcode = 0;
if (copy_from_user(&init, (void *__user)arg, sizeof(init))) switch (init->func) {
return -EFAULT;
switch (init.func) {
case I830_INIT_DMA: case I830_INIT_DMA:
dev_priv = drm_alloc(sizeof(drm_i830_private_t), dev_priv = drm_alloc(sizeof(drm_i830_private_t),
DRM_MEM_DRIVER); DRM_MEM_DRIVER);
if (dev_priv == NULL) if (dev_priv == NULL)
return -ENOMEM; return -ENOMEM;
retcode = i830_dma_initialize(dev, dev_priv, &init); retcode = i830_dma_initialize(dev, dev_priv, init);
break; break;
case I830_CLEANUP_DMA: case I830_CLEANUP_DMA:
retcode = i830_dma_cleanup(dev); retcode = i830_dma_cleanup(dev);
...@@ -1248,7 +1242,7 @@ static int i830_flush_queue(struct drm_device * dev) ...@@ -1248,7 +1242,7 @@ static int i830_flush_queue(struct drm_device * dev)
} }
/* Must be called with the lock held */ /* Must be called with the lock held */
static void i830_reclaim_buffers(struct drm_device * dev, struct file *filp) static void i830_reclaim_buffers(struct drm_device * dev, struct drm_file *file_priv)
{ {
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
int i; int i;
...@@ -1266,7 +1260,7 @@ static void i830_reclaim_buffers(struct drm_device * dev, struct file *filp) ...@@ -1266,7 +1260,7 @@ static void i830_reclaim_buffers(struct drm_device * dev, struct file *filp)
struct drm_buf *buf = dma->buflist[i]; struct drm_buf *buf = dma->buflist[i];
drm_i830_buf_priv_t *buf_priv = buf->dev_private; drm_i830_buf_priv_t *buf_priv = buf->dev_private;
if (buf->filp == filp && buf_priv) { if (buf->file_priv == file_priv && buf_priv) {
int used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT, int used = cmpxchg(buf_priv->in_use, I830_BUF_CLIENT,
I830_BUF_FREE); I830_BUF_FREE);
...@@ -1278,45 +1272,36 @@ static void i830_reclaim_buffers(struct drm_device * dev, struct file *filp) ...@@ -1278,45 +1272,36 @@ static void i830_reclaim_buffers(struct drm_device * dev, struct file *filp)
} }
} }
static int i830_flush_ioctl(struct inode *inode, struct file *filp, static int i830_flush_ioctl(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; LOCK_TEST_WITH_RETURN(dev, file_priv);
struct drm_device *dev = priv->head->dev;
LOCK_TEST_WITH_RETURN(dev, filp);
i830_flush_queue(dev); i830_flush_queue(dev);
return 0; return 0;
} }
static int i830_dma_vertex(struct inode *inode, struct file *filp, static int i830_dma_vertex(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
struct drm_device_dma *dma = dev->dma; struct drm_device_dma *dma = dev->dma;
drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private; drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *) drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
drm_i830_vertex_t vertex; drm_i830_vertex_t *vertex = data;
if (copy_from_user
(&vertex, (drm_i830_vertex_t __user *) arg, sizeof(vertex)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
DRM_DEBUG("i830 dma vertex, idx %d used %d discard %d\n", DRM_DEBUG("i830 dma vertex, idx %d used %d discard %d\n",
vertex.idx, vertex.used, vertex.discard); vertex->idx, vertex->used, vertex->discard);
if (vertex.idx < 0 || vertex.idx > dma->buf_count) if (vertex->idx < 0 || vertex->idx > dma->buf_count)
return -EINVAL; return -EINVAL;
i830_dma_dispatch_vertex(dev, i830_dma_dispatch_vertex(dev,
dma->buflist[vertex.idx], dma->buflist[vertex->idx],
vertex.discard, vertex.used); vertex->discard, vertex->used);
sarea_priv->last_enqueue = dev_priv->counter - 1; sarea_priv->last_enqueue = dev_priv->counter - 1;
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
...@@ -1324,39 +1309,30 @@ static int i830_dma_vertex(struct inode *inode, struct file *filp, ...@@ -1324,39 +1309,30 @@ static int i830_dma_vertex(struct inode *inode, struct file *filp,
return 0; return 0;
} }
static int i830_clear_bufs(struct inode *inode, struct file *filp, static int i830_clear_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data; drm_i830_clear_t *clear = data;
struct drm_device *dev = priv->head->dev;
drm_i830_clear_t clear;
if (copy_from_user
(&clear, (drm_i830_clear_t __user *) arg, sizeof(clear)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
/* GH: Someone's doing nasty things... */ /* GH: Someone's doing nasty things... */
if (!dev->dev_private) { if (!dev->dev_private) {
return -EINVAL; return -EINVAL;
} }
i830_dma_dispatch_clear(dev, clear.flags, i830_dma_dispatch_clear(dev, clear->flags,
clear.clear_color, clear->clear_color,
clear.clear_depth, clear.clear_depthmask); clear->clear_depth, clear->clear_depthmask);
return 0; return 0;
} }
static int i830_swap_bufs(struct inode *inode, struct file *filp, static int i830_swap_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
DRM_DEBUG("i830_swap_bufs\n"); DRM_DEBUG("i830_swap_bufs\n");
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
i830_dma_dispatch_swap(dev); i830_dma_dispatch_swap(dev);
return 0; return 0;
...@@ -1386,16 +1362,14 @@ static int i830_do_cleanup_pageflip(struct drm_device * dev) ...@@ -1386,16 +1362,14 @@ static int i830_do_cleanup_pageflip(struct drm_device * dev)
return 0; return 0;
} }
static int i830_flip_bufs(struct inode *inode, struct file *filp, static int i830_flip_bufs(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
DRM_DEBUG("%s\n", __FUNCTION__); DRM_DEBUG("%s\n", __FUNCTION__);
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (!dev_priv->page_flipping) if (!dev_priv->page_flipping)
i830_do_init_pageflip(dev); i830_do_init_pageflip(dev);
...@@ -1404,11 +1378,9 @@ static int i830_flip_bufs(struct inode *inode, struct file *filp, ...@@ -1404,11 +1378,9 @@ static int i830_flip_bufs(struct inode *inode, struct file *filp,
return 0; return 0;
} }
static int i830_getage(struct inode *inode, struct file *filp, unsigned int cmd, static int i830_getage(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private; drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *) drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
...@@ -1418,58 +1390,50 @@ static int i830_getage(struct inode *inode, struct file *filp, unsigned int cmd, ...@@ -1418,58 +1390,50 @@ static int i830_getage(struct inode *inode, struct file *filp, unsigned int cmd,
return 0; return 0;
} }
static int i830_getbuf(struct inode *inode, struct file *filp, unsigned int cmd, static int i830_getbuf(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
int retcode = 0; int retcode = 0;
drm_i830_dma_t d; drm_i830_dma_t *d = data;
drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private; drm_i830_private_t *dev_priv = (drm_i830_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *) drm_i830_sarea_t *sarea_priv = (drm_i830_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
DRM_DEBUG("getbuf\n"); DRM_DEBUG("getbuf\n");
if (copy_from_user(&d, (drm_i830_dma_t __user *) arg, sizeof(d)))
return -EFAULT;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
d.granted = 0; d->granted = 0;
retcode = i830_dma_get_buffer(dev, &d, filp); retcode = i830_dma_get_buffer(dev, d, file_priv);
DRM_DEBUG("i830_dma: %d returning %d, granted = %d\n", DRM_DEBUG("i830_dma: %d returning %d, granted = %d\n",
current->pid, retcode, d.granted); current->pid, retcode, d->granted);
if (copy_to_user((void __user *) arg, &d, sizeof(d)))
return -EFAULT;
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
return retcode; return retcode;
} }
static int i830_copybuf(struct inode *inode, static int i830_copybuf(struct drm_device *dev, void *data,
struct file *filp, unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
/* Never copy - 2.4.x doesn't need it */ /* Never copy - 2.4.x doesn't need it */
return 0; return 0;
} }
static int i830_docopy(struct inode *inode, struct file *filp, unsigned int cmd, static int i830_docopy(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
return 0; return 0;
} }
static int i830_getparam(struct inode *inode, struct file *filp, static int i830_getparam(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
drm_i830_getparam_t param; drm_i830_getparam_t *param = data;
int value; int value;
if (!dev_priv) { if (!dev_priv) {
...@@ -1477,11 +1441,7 @@ static int i830_getparam(struct inode *inode, struct file *filp, ...@@ -1477,11 +1441,7 @@ static int i830_getparam(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
} }
if (copy_from_user switch (param->param) {
(&param, (drm_i830_getparam_t __user *) arg, sizeof(param)))
return -EFAULT;
switch (param.param) {
case I830_PARAM_IRQ_ACTIVE: case I830_PARAM_IRQ_ACTIVE:
value = dev->irq_enabled; value = dev->irq_enabled;
break; break;
...@@ -1489,7 +1449,7 @@ static int i830_getparam(struct inode *inode, struct file *filp, ...@@ -1489,7 +1449,7 @@ static int i830_getparam(struct inode *inode, struct file *filp,
return -EINVAL; return -EINVAL;
} }
if (copy_to_user(param.value, &value, sizeof(int))) { if (copy_to_user(param->value, &value, sizeof(int))) {
DRM_ERROR("copy_to_user\n"); DRM_ERROR("copy_to_user\n");
return -EFAULT; return -EFAULT;
} }
...@@ -1497,26 +1457,20 @@ static int i830_getparam(struct inode *inode, struct file *filp, ...@@ -1497,26 +1457,20 @@ static int i830_getparam(struct inode *inode, struct file *filp,
return 0; return 0;
} }
static int i830_setparam(struct inode *inode, struct file *filp, static int i830_setparam(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
drm_i830_setparam_t param; drm_i830_setparam_t *param = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return -EINVAL; return -EINVAL;
} }
if (copy_from_user switch (param->param) {
(&param, (drm_i830_setparam_t __user *) arg, sizeof(param)))
return -EFAULT;
switch (param.param) {
case I830_SETPARAM_USE_MI_BATCHBUFFER_START: case I830_SETPARAM_USE_MI_BATCHBUFFER_START:
dev_priv->use_mi_batchbuffer_start = param.value; dev_priv->use_mi_batchbuffer_start = param->value;
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -1542,7 +1496,7 @@ void i830_driver_lastclose(struct drm_device * dev) ...@@ -1542,7 +1496,7 @@ void i830_driver_lastclose(struct drm_device * dev)
i830_dma_cleanup(dev); i830_dma_cleanup(dev);
} }
void i830_driver_preclose(struct drm_device * dev, DRMFILE filp) void i830_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
{ {
if (dev->dev_private) { if (dev->dev_private) {
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
...@@ -1552,9 +1506,9 @@ void i830_driver_preclose(struct drm_device * dev, DRMFILE filp) ...@@ -1552,9 +1506,9 @@ void i830_driver_preclose(struct drm_device * dev, DRMFILE filp)
} }
} }
void i830_driver_reclaim_buffers_locked(struct drm_device * dev, struct file *filp) void i830_driver_reclaim_buffers_locked(struct drm_device * dev, struct drm_file *file_priv)
{ {
i830_reclaim_buffers(dev, filp); i830_reclaim_buffers(dev, file_priv);
} }
int i830_driver_dma_quiescent(struct drm_device * dev) int i830_driver_dma_quiescent(struct drm_device * dev)
...@@ -1563,21 +1517,21 @@ int i830_driver_dma_quiescent(struct drm_device * dev) ...@@ -1563,21 +1517,21 @@ int i830_driver_dma_quiescent(struct drm_device * dev)
return 0; return 0;
} }
drm_ioctl_desc_t i830_ioctls[] = { struct drm_ioctl_desc i830_ioctls[] = {
[DRM_IOCTL_NR(DRM_I830_INIT)] = {i830_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I830_INIT, i830_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I830_VERTEX)] = {i830_dma_vertex, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_VERTEX, i830_dma_vertex, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_CLEAR)] = {i830_clear_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_CLEAR, i830_clear_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_FLUSH)] = {i830_flush_ioctl, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_FLUSH, i830_flush_ioctl, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_GETAGE)] = {i830_getage, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_GETAGE, i830_getage, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_GETBUF)] = {i830_getbuf, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_GETBUF, i830_getbuf, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_SWAP)] = {i830_swap_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_SWAP, i830_swap_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_COPY)] = {i830_copybuf, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_COPY, i830_copybuf, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_DOCOPY)] = {i830_docopy, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_DOCOPY, i830_docopy, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_FLIP)] = {i830_flip_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_FLIP, i830_flip_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_IRQ_EMIT)] = {i830_irq_emit, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_IRQ_EMIT, i830_irq_emit, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_IRQ_WAIT)] = {i830_irq_wait, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_IRQ_WAIT, i830_irq_wait, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_GETPARAM)] = {i830_getparam, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I830_GETPARAM, i830_getparam, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I830_SETPARAM)] = {i830_setparam, DRM_AUTH} DRM_IOCTL_DEF(DRM_I830_SETPARAM, i830_setparam, DRM_AUTH)
}; };
int i830_max_ioctl = DRM_ARRAY_SIZE(i830_ioctls); int i830_max_ioctl = DRM_ARRAY_SIZE(i830_ioctls);
......
...@@ -122,24 +122,25 @@ typedef struct drm_i830_private { ...@@ -122,24 +122,25 @@ typedef struct drm_i830_private {
} drm_i830_private_t; } drm_i830_private_t;
extern drm_ioctl_desc_t i830_ioctls[]; extern struct drm_ioctl_desc i830_ioctls[];
extern int i830_max_ioctl; extern int i830_max_ioctl;
/* i830_irq.c */ /* i830_irq.c */
extern int i830_irq_emit(struct inode *inode, struct file *filp, extern int i830_irq_emit(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern int i830_irq_wait(struct inode *inode, struct file *filp, extern int i830_irq_wait(struct drm_device *dev, void *data,
unsigned int cmd, unsigned long arg); struct drm_file *file_priv);
extern irqreturn_t i830_driver_irq_handler(DRM_IRQ_ARGS); extern irqreturn_t i830_driver_irq_handler(DRM_IRQ_ARGS);
extern void i830_driver_irq_preinstall(struct drm_device * dev); extern void i830_driver_irq_preinstall(struct drm_device * dev);
extern void i830_driver_irq_postinstall(struct drm_device * dev); extern void i830_driver_irq_postinstall(struct drm_device * dev);
extern void i830_driver_irq_uninstall(struct drm_device * dev); extern void i830_driver_irq_uninstall(struct drm_device * dev);
extern int i830_driver_load(struct drm_device *, unsigned long flags); extern int i830_driver_load(struct drm_device *, unsigned long flags);
extern void i830_driver_preclose(struct drm_device * dev, DRMFILE filp); extern void i830_driver_preclose(struct drm_device * dev,
struct drm_file *file_priv);
extern void i830_driver_lastclose(struct drm_device * dev); extern void i830_driver_lastclose(struct drm_device * dev);
extern void i830_driver_reclaim_buffers_locked(struct drm_device * dev, extern void i830_driver_reclaim_buffers_locked(struct drm_device * dev,
struct file *filp); struct drm_file *file_priv);
extern int i830_driver_dma_quiescent(struct drm_device * dev); extern int i830_driver_dma_quiescent(struct drm_device * dev);
extern int i830_driver_device_is_agp(struct drm_device * dev); extern int i830_driver_device_is_agp(struct drm_device * dev);
......
...@@ -114,29 +114,23 @@ static int i830_wait_irq(struct drm_device * dev, int irq_nr) ...@@ -114,29 +114,23 @@ static int i830_wait_irq(struct drm_device * dev, int irq_nr)
/* Needs the lock as it touches the ring. /* Needs the lock as it touches the ring.
*/ */
int i830_irq_emit(struct inode *inode, struct file *filp, unsigned int cmd, int i830_irq_emit(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
drm_i830_irq_emit_t emit; drm_i830_irq_emit_t *emit = data;
int result; int result;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return -EINVAL; return -EINVAL;
} }
if (copy_from_user
(&emit, (drm_i830_irq_emit_t __user *) arg, sizeof(emit)))
return -EFAULT;
result = i830_emit_irq(dev); result = i830_emit_irq(dev);
if (copy_to_user(emit.irq_seq, &result, sizeof(int))) { if (copy_to_user(emit->irq_seq, &result, sizeof(int))) {
DRM_ERROR("copy_to_user\n"); DRM_ERROR("copy_to_user\n");
return -EFAULT; return -EFAULT;
} }
...@@ -146,24 +140,18 @@ int i830_irq_emit(struct inode *inode, struct file *filp, unsigned int cmd, ...@@ -146,24 +140,18 @@ int i830_irq_emit(struct inode *inode, struct file *filp, unsigned int cmd,
/* Doesn't need the hardware lock. /* Doesn't need the hardware lock.
*/ */
int i830_irq_wait(struct inode *inode, struct file *filp, unsigned int cmd, int i830_irq_wait(struct drm_device *dev, void *data,
unsigned long arg) struct drm_file *file_priv)
{ {
struct drm_file *priv = filp->private_data;
struct drm_device *dev = priv->head->dev;
drm_i830_private_t *dev_priv = dev->dev_private; drm_i830_private_t *dev_priv = dev->dev_private;
drm_i830_irq_wait_t irqwait; drm_i830_irq_wait_t *irqwait = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return -EINVAL; return -EINVAL;
} }
if (copy_from_user(&irqwait, (drm_i830_irq_wait_t __user *) arg, return i830_wait_irq(dev, irqwait->irq_seq);
sizeof(irqwait)))
return -EFAULT;
return i830_wait_irq(dev, irqwait.irq_seq);
} }
/* drm_dma.h hooks /* drm_dma.h hooks
......
...@@ -70,7 +70,7 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller) ...@@ -70,7 +70,7 @@ int i915_wait_ring(struct drm_device * dev, int n, const char *caller)
last_head = ring->head; last_head = ring->head;
} }
return DRM_ERR(EBUSY); return -EBUSY;
} }
void i915_kernel_lost_context(struct drm_device * dev) void i915_kernel_lost_context(struct drm_device * dev)
...@@ -137,7 +137,7 @@ static int i915_initialize(struct drm_device * dev, ...@@ -137,7 +137,7 @@ static int i915_initialize(struct drm_device * dev,
DRM_ERROR("can not find sarea!\n"); DRM_ERROR("can not find sarea!\n");
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
return DRM_ERR(EINVAL); return -EINVAL;
} }
dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset); dev_priv->mmio_map = drm_core_findmap(dev, init->mmio_offset);
...@@ -145,7 +145,7 @@ static int i915_initialize(struct drm_device * dev, ...@@ -145,7 +145,7 @@ static int i915_initialize(struct drm_device * dev,
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
DRM_ERROR("can not find mmio map!\n"); DRM_ERROR("can not find mmio map!\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
dev_priv->sarea_priv = (drm_i915_sarea_t *) dev_priv->sarea_priv = (drm_i915_sarea_t *)
...@@ -169,7 +169,7 @@ static int i915_initialize(struct drm_device * dev, ...@@ -169,7 +169,7 @@ static int i915_initialize(struct drm_device * dev,
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
DRM_ERROR("can not ioremap virtual address for" DRM_ERROR("can not ioremap virtual address for"
" ring buffer\n"); " ring buffer\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
dev_priv->ring.virtual_start = dev_priv->ring.map.handle; dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
...@@ -200,7 +200,7 @@ static int i915_initialize(struct drm_device * dev, ...@@ -200,7 +200,7 @@ static int i915_initialize(struct drm_device * dev,
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
DRM_ERROR("Can not allocate hardware status page\n"); DRM_ERROR("Can not allocate hardware status page\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr; dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr;
dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr;
...@@ -221,24 +221,24 @@ static int i915_dma_resume(struct drm_device * dev) ...@@ -221,24 +221,24 @@ static int i915_dma_resume(struct drm_device * dev)
if (!dev_priv->sarea) { if (!dev_priv->sarea) {
DRM_ERROR("can not find sarea!\n"); DRM_ERROR("can not find sarea!\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
if (!dev_priv->mmio_map) { if (!dev_priv->mmio_map) {
DRM_ERROR("can not find mmio map!\n"); DRM_ERROR("can not find mmio map!\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
if (dev_priv->ring.map.handle == NULL) { if (dev_priv->ring.map.handle == NULL) {
DRM_ERROR("can not ioremap virtual address for" DRM_ERROR("can not ioremap virtual address for"
" ring buffer\n"); " ring buffer\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
/* Program Hardware Status Page */ /* Program Hardware Status Page */
if (!dev_priv->hw_status_page) { if (!dev_priv->hw_status_page) {
DRM_ERROR("Can not find hardware status page\n"); DRM_ERROR("Can not find hardware status page\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page); DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
...@@ -251,23 +251,20 @@ static int i915_dma_resume(struct drm_device * dev) ...@@ -251,23 +251,20 @@ static int i915_dma_resume(struct drm_device * dev)
return 0; return 0;
} }
static int i915_dma_init(DRM_IOCTL_ARGS) static int i915_dma_init(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv; drm_i915_private_t *dev_priv;
drm_i915_init_t init; drm_i915_init_t *init = data;
int retcode = 0; int retcode = 0;
DRM_COPY_FROM_USER_IOCTL(init, (drm_i915_init_t __user *) data, switch (init->func) {
sizeof(init));
switch (init.func) {
case I915_INIT_DMA: case I915_INIT_DMA:
dev_priv = drm_alloc(sizeof(drm_i915_private_t), dev_priv = drm_alloc(sizeof(drm_i915_private_t),
DRM_MEM_DRIVER); DRM_MEM_DRIVER);
if (dev_priv == NULL) if (dev_priv == NULL)
return DRM_ERR(ENOMEM); return -ENOMEM;
retcode = i915_initialize(dev, dev_priv, &init); retcode = i915_initialize(dev, dev_priv, init);
break; break;
case I915_CLEANUP_DMA: case I915_CLEANUP_DMA:
retcode = i915_dma_cleanup(dev); retcode = i915_dma_cleanup(dev);
...@@ -276,7 +273,7 @@ static int i915_dma_init(DRM_IOCTL_ARGS) ...@@ -276,7 +273,7 @@ static int i915_dma_init(DRM_IOCTL_ARGS)
retcode = i915_dma_resume(dev); retcode = i915_dma_resume(dev);
break; break;
default: default:
retcode = DRM_ERR(EINVAL); retcode = -EINVAL;
break; break;
} }
...@@ -366,7 +363,7 @@ static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwor ...@@ -366,7 +363,7 @@ static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwor
RING_LOCALS; RING_LOCALS;
if ((dwords+1) * sizeof(int) >= dev_priv->ring.Size - 8) if ((dwords+1) * sizeof(int) >= dev_priv->ring.Size - 8)
return DRM_ERR(EINVAL); return -EINVAL;
BEGIN_LP_RING((dwords+1)&~1); BEGIN_LP_RING((dwords+1)&~1);
...@@ -374,17 +371,17 @@ static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwor ...@@ -374,17 +371,17 @@ static int i915_emit_cmds(struct drm_device * dev, int __user * buffer, int dwor
int cmd, sz; int cmd, sz;
if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd))) if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], sizeof(cmd)))
return DRM_ERR(EINVAL); return -EINVAL;
if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords) if ((sz = validate_cmd(cmd)) == 0 || i + sz > dwords)
return DRM_ERR(EINVAL); return -EINVAL;
OUT_RING(cmd); OUT_RING(cmd);
while (++i, --sz) { while (++i, --sz) {
if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i], if (DRM_COPY_FROM_USER_UNCHECKED(&cmd, &buffer[i],
sizeof(cmd))) { sizeof(cmd))) {
return DRM_ERR(EINVAL); return -EINVAL;
} }
OUT_RING(cmd); OUT_RING(cmd);
} }
...@@ -407,13 +404,13 @@ static int i915_emit_box(struct drm_device * dev, ...@@ -407,13 +404,13 @@ static int i915_emit_box(struct drm_device * dev,
RING_LOCALS; RING_LOCALS;
if (DRM_COPY_FROM_USER_UNCHECKED(&box, &boxes[i], sizeof(box))) { if (DRM_COPY_FROM_USER_UNCHECKED(&box, &boxes[i], sizeof(box))) {
return DRM_ERR(EFAULT); return -EFAULT;
} }
if (box.y2 <= box.y1 || box.x2 <= box.x1 || box.y2 <= 0 || box.x2 <= 0) { if (box.y2 <= box.y1 || box.x2 <= box.x1 || box.y2 <= 0 || box.x2 <= 0) {
DRM_ERROR("Bad box %d,%d..%d,%d\n", DRM_ERROR("Bad box %d,%d..%d,%d\n",
box.x1, box.y1, box.x2, box.y2); box.x1, box.y1, box.x2, box.y2);
return DRM_ERR(EINVAL); return -EINVAL;
} }
if (IS_I965G(dev)) { if (IS_I965G(dev)) {
...@@ -467,7 +464,7 @@ static int i915_dispatch_cmdbuffer(struct drm_device * dev, ...@@ -467,7 +464,7 @@ static int i915_dispatch_cmdbuffer(struct drm_device * dev,
if (cmd->sz & 0x3) { if (cmd->sz & 0x3) {
DRM_ERROR("alignment"); DRM_ERROR("alignment");
return DRM_ERR(EINVAL); return -EINVAL;
} }
i915_kernel_lost_context(dev); i915_kernel_lost_context(dev);
...@@ -502,7 +499,7 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev, ...@@ -502,7 +499,7 @@ static int i915_dispatch_batchbuffer(struct drm_device * dev,
if ((batch->start | batch->used) & 0x7) { if ((batch->start | batch->used) & 0x7) {
DRM_ERROR("alignment"); DRM_ERROR("alignment");
return DRM_ERR(EINVAL); return -EINVAL;
} }
i915_kernel_lost_context(dev); i915_kernel_lost_context(dev);
...@@ -598,76 +595,69 @@ static int i915_quiescent(struct drm_device * dev) ...@@ -598,76 +595,69 @@ static int i915_quiescent(struct drm_device * dev)
return i915_wait_ring(dev, dev_priv->ring.Size - 8, __FUNCTION__); return i915_wait_ring(dev, dev_priv->ring.Size - 8, __FUNCTION__);
} }
static int i915_flush_ioctl(DRM_IOCTL_ARGS) static int i915_flush_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE; LOCK_TEST_WITH_RETURN(dev, file_priv);
LOCK_TEST_WITH_RETURN(dev, filp);
return i915_quiescent(dev); return i915_quiescent(dev);
} }
static int i915_batchbuffer(DRM_IOCTL_ARGS) static int i915_batchbuffer(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *) drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
drm_i915_batchbuffer_t batch; drm_i915_batchbuffer_t *batch = data;
int ret; int ret;
if (!dev_priv->allow_batchbuffer) { if (!dev_priv->allow_batchbuffer) {
DRM_ERROR("Batchbuffer ioctl disabled\n"); DRM_ERROR("Batchbuffer ioctl disabled\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(batch, (drm_i915_batchbuffer_t __user *) data,
sizeof(batch));
DRM_DEBUG("i915 batchbuffer, start %x used %d cliprects %d\n", DRM_DEBUG("i915 batchbuffer, start %x used %d cliprects %d\n",
batch.start, batch.used, batch.num_cliprects); batch->start, batch->used, batch->num_cliprects);
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (batch.num_cliprects && DRM_VERIFYAREA_READ(batch.cliprects, if (batch->num_cliprects && DRM_VERIFYAREA_READ(batch->cliprects,
batch.num_cliprects * batch->num_cliprects *
sizeof(struct drm_clip_rect))) sizeof(struct drm_clip_rect)))
return DRM_ERR(EFAULT); return -EFAULT;
ret = i915_dispatch_batchbuffer(dev, &batch); ret = i915_dispatch_batchbuffer(dev, batch);
sarea_priv->last_dispatch = (int)hw_status[5]; sarea_priv->last_dispatch = (int)hw_status[5];
return ret; return ret;
} }
static int i915_cmdbuffer(DRM_IOCTL_ARGS) static int i915_cmdbuffer(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
u32 *hw_status = dev_priv->hw_status_page; u32 *hw_status = dev_priv->hw_status_page;
drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *) drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *)
dev_priv->sarea_priv; dev_priv->sarea_priv;
drm_i915_cmdbuffer_t cmdbuf; drm_i915_cmdbuffer_t *cmdbuf = data;
int ret; int ret;
DRM_COPY_FROM_USER_IOCTL(cmdbuf, (drm_i915_cmdbuffer_t __user *) data,
sizeof(cmdbuf));
DRM_DEBUG("i915 cmdbuffer, buf %p sz %d cliprects %d\n", DRM_DEBUG("i915 cmdbuffer, buf %p sz %d cliprects %d\n",
cmdbuf.buf, cmdbuf.sz, cmdbuf.num_cliprects); cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects);
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (cmdbuf.num_cliprects && if (cmdbuf->num_cliprects &&
DRM_VERIFYAREA_READ(cmdbuf.cliprects, DRM_VERIFYAREA_READ(cmdbuf->cliprects,
cmdbuf.num_cliprects * cmdbuf->num_cliprects *
sizeof(struct drm_clip_rect))) { sizeof(struct drm_clip_rect))) {
DRM_ERROR("Fault accessing cliprects\n"); DRM_ERROR("Fault accessing cliprects\n");
return DRM_ERR(EFAULT); return -EFAULT;
} }
ret = i915_dispatch_cmdbuffer(dev, &cmdbuf); ret = i915_dispatch_cmdbuffer(dev, cmdbuf);
if (ret) { if (ret) {
DRM_ERROR("i915_dispatch_cmdbuffer failed\n"); DRM_ERROR("i915_dispatch_cmdbuffer failed\n");
return ret; return ret;
...@@ -677,33 +667,29 @@ static int i915_cmdbuffer(DRM_IOCTL_ARGS) ...@@ -677,33 +667,29 @@ static int i915_cmdbuffer(DRM_IOCTL_ARGS)
return 0; return 0;
} }
static int i915_flip_bufs(DRM_IOCTL_ARGS) static int i915_flip_bufs(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
DRM_DEBUG("%s\n", __FUNCTION__); DRM_DEBUG("%s\n", __FUNCTION__);
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
return i915_dispatch_flip(dev); return i915_dispatch_flip(dev);
} }
static int i915_getparam(DRM_IOCTL_ARGS) static int i915_getparam(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_getparam_t param; drm_i915_getparam_t *param = data;
int value; int value;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(param, (drm_i915_getparam_t __user *) data, switch (param->param) {
sizeof(param));
switch (param.param) {
case I915_PARAM_IRQ_ACTIVE: case I915_PARAM_IRQ_ACTIVE:
value = dev->irq ? 1 : 0; value = dev->irq ? 1 : 0;
break; break;
...@@ -714,68 +700,64 @@ static int i915_getparam(DRM_IOCTL_ARGS) ...@@ -714,68 +700,64 @@ static int i915_getparam(DRM_IOCTL_ARGS)
value = READ_BREADCRUMB(dev_priv); value = READ_BREADCRUMB(dev_priv);
break; break;
default: default:
DRM_ERROR("Unknown parameter %d\n", param.param); DRM_ERROR("Unknown parameter %d\n", param->param);
return DRM_ERR(EINVAL); return -EINVAL;
} }
if (DRM_COPY_TO_USER(param.value, &value, sizeof(int))) { if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
DRM_ERROR("DRM_COPY_TO_USER failed\n"); DRM_ERROR("DRM_COPY_TO_USER failed\n");
return DRM_ERR(EFAULT); return -EFAULT;
} }
return 0; return 0;
} }
static int i915_setparam(DRM_IOCTL_ARGS) static int i915_setparam(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_setparam_t param; drm_i915_setparam_t *param = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(param, (drm_i915_setparam_t __user *) data, switch (param->param) {
sizeof(param));
switch (param.param) {
case I915_SETPARAM_USE_MI_BATCHBUFFER_START: case I915_SETPARAM_USE_MI_BATCHBUFFER_START:
if (!IS_I965G(dev)) if (!IS_I965G(dev))
dev_priv->use_mi_batchbuffer_start = param.value; dev_priv->use_mi_batchbuffer_start = param->value;
break; break;
case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY: case I915_SETPARAM_TEX_LRU_LOG_GRANULARITY:
dev_priv->tex_lru_log_granularity = param.value; dev_priv->tex_lru_log_granularity = param->value;
break; break;
case I915_SETPARAM_ALLOW_BATCHBUFFER: case I915_SETPARAM_ALLOW_BATCHBUFFER:
dev_priv->allow_batchbuffer = param.value; dev_priv->allow_batchbuffer = param->value;
break; break;
default: default:
DRM_ERROR("unknown parameter %d\n", param.param); DRM_ERROR("unknown parameter %d\n", param->param);
return DRM_ERR(EINVAL); return -EINVAL;
} }
return 0; return 0;
} }
static int i915_set_status_page(DRM_IOCTL_ARGS) static int i915_set_status_page(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_hws_addr_t hws; drm_i915_hws_addr_t *hws = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(hws, (drm_i915_hws_addr_t __user *) data,
sizeof(hws));
printk(KERN_DEBUG "set status page addr 0x%08x\n", (u32)hws.addr);
dev_priv->status_gfx_addr = hws.addr & (0x1ffff<<12); printk(KERN_DEBUG "set status page addr 0x%08x\n", (u32)hws->addr);
dev_priv->status_gfx_addr = hws->addr & (0x1ffff<<12);
dev_priv->hws_map.offset = dev->agp->agp_info.aper_base + hws.addr; dev_priv->hws_map.offset = dev->agp->agp_info.aper_base + hws->addr;
dev_priv->hws_map.size = 4*1024; dev_priv->hws_map.size = 4*1024;
dev_priv->hws_map.type = 0; dev_priv->hws_map.type = 0;
dev_priv->hws_map.flags = 0; dev_priv->hws_map.flags = 0;
...@@ -788,7 +770,7 @@ static int i915_set_status_page(DRM_IOCTL_ARGS) ...@@ -788,7 +770,7 @@ static int i915_set_status_page(DRM_IOCTL_ARGS)
dev_priv->status_gfx_addr = 0; dev_priv->status_gfx_addr = 0;
DRM_ERROR("can not ioremap virtual address for" DRM_ERROR("can not ioremap virtual address for"
" G33 hw status page\n"); " G33 hw status page\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
dev_priv->hw_status_page = dev_priv->hws_map.handle; dev_priv->hw_status_page = dev_priv->hws_map.handle;
...@@ -821,32 +803,32 @@ void i915_driver_lastclose(struct drm_device * dev) ...@@ -821,32 +803,32 @@ void i915_driver_lastclose(struct drm_device * dev)
i915_dma_cleanup(dev); i915_dma_cleanup(dev);
} }
void i915_driver_preclose(struct drm_device * dev, DRMFILE filp) void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
{ {
if (dev->dev_private) { if (dev->dev_private) {
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
i915_mem_release(dev, filp, dev_priv->agp_heap); i915_mem_release(dev, file_priv, dev_priv->agp_heap);
} }
} }
drm_ioctl_desc_t i915_ioctls[] = { struct drm_ioctl_desc i915_ioctls[] = {
[DRM_IOCTL_NR(DRM_I915_INIT)] = {i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I915_INIT, i915_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I915_FLUSH)] = {i915_flush_ioctl, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_FLUSH, i915_flush_ioctl, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_FLIP)] = {i915_flip_bufs, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_FLIP, i915_flip_bufs, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_BATCHBUFFER)] = {i915_batchbuffer, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_BATCHBUFFER, i915_batchbuffer, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_IRQ_EMIT)] = {i915_irq_emit, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_IRQ_EMIT, i915_irq_emit, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_IRQ_WAIT)] = {i915_irq_wait, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_IRQ_WAIT, i915_irq_wait, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_GETPARAM)] = {i915_getparam, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_GETPARAM, i915_getparam, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_SETPARAM)] = {i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I915_SETPARAM, i915_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I915_ALLOC)] = {i915_mem_alloc, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_ALLOC, i915_mem_alloc, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_FREE)] = {i915_mem_free, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_FREE, i915_mem_free, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_INIT_HEAP)] = {i915_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY}, DRM_IOCTL_DEF(DRM_I915_INIT_HEAP, i915_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
[DRM_IOCTL_NR(DRM_I915_CMDBUFFER)] = {i915_cmdbuffer, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_CMDBUFFER, i915_cmdbuffer, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_DESTROY_HEAP)] = { i915_mem_destroy_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY }, DRM_IOCTL_DEF(DRM_I915_DESTROY_HEAP, i915_mem_destroy_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
[DRM_IOCTL_NR(DRM_I915_SET_VBLANK_PIPE)] = { i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY }, DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE, i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
[DRM_IOCTL_NR(DRM_I915_GET_VBLANK_PIPE)] = { i915_vblank_pipe_get, DRM_AUTH }, DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE, i915_vblank_pipe_get, DRM_AUTH ),
[DRM_IOCTL_NR(DRM_I915_VBLANK_SWAP)] = {i915_vblank_swap, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
[DRM_IOCTL_NR(DRM_I915_HWS_ADDR)] = {i915_set_status_page, DRM_AUTH}, DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH),
}; };
int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
......
...@@ -70,7 +70,7 @@ struct mem_block { ...@@ -70,7 +70,7 @@ struct mem_block {
struct mem_block *prev; struct mem_block *prev;
int start; int start;
int size; int size;
DRMFILE filp; /* 0: free, -1: heap, other: real files */ struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */
}; };
typedef struct _drm_i915_vbl_swap { typedef struct _drm_i915_vbl_swap {
...@@ -116,21 +116,24 @@ typedef struct drm_i915_private { ...@@ -116,21 +116,24 @@ typedef struct drm_i915_private {
unsigned int swaps_pending; unsigned int swaps_pending;
} drm_i915_private_t; } drm_i915_private_t;
extern drm_ioctl_desc_t i915_ioctls[]; extern struct drm_ioctl_desc i915_ioctls[];
extern int i915_max_ioctl; extern int i915_max_ioctl;
/* i915_dma.c */ /* i915_dma.c */
extern void i915_kernel_lost_context(struct drm_device * dev); extern void i915_kernel_lost_context(struct drm_device * dev);
extern int i915_driver_load(struct drm_device *, unsigned long flags); extern int i915_driver_load(struct drm_device *, unsigned long flags);
extern void i915_driver_lastclose(struct drm_device * dev); extern void i915_driver_lastclose(struct drm_device * dev);
extern void i915_driver_preclose(struct drm_device * dev, DRMFILE filp); extern void i915_driver_preclose(struct drm_device *dev,
struct drm_file *file_priv);
extern int i915_driver_device_is_agp(struct drm_device * dev); extern int i915_driver_device_is_agp(struct drm_device * dev);
extern long i915_compat_ioctl(struct file *filp, unsigned int cmd, extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg); unsigned long arg);
/* i915_irq.c */ /* i915_irq.c */
extern int i915_irq_emit(DRM_IOCTL_ARGS); extern int i915_irq_emit(struct drm_device *dev, void *data,
extern int i915_irq_wait(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int i915_irq_wait(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence); extern int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence);
extern int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence); extern int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence);
...@@ -138,18 +141,25 @@ extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS); ...@@ -138,18 +141,25 @@ extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
extern void i915_driver_irq_preinstall(struct drm_device * dev); extern void i915_driver_irq_preinstall(struct drm_device * dev);
extern void i915_driver_irq_postinstall(struct drm_device * dev); extern void i915_driver_irq_postinstall(struct drm_device * dev);
extern void i915_driver_irq_uninstall(struct drm_device * dev); extern void i915_driver_irq_uninstall(struct drm_device * dev);
extern int i915_vblank_pipe_set(DRM_IOCTL_ARGS); extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
extern int i915_vblank_pipe_get(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int i915_vblank_swap(DRM_IOCTL_ARGS); extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int i915_vblank_swap(struct drm_device *dev, void *data,
struct drm_file *file_priv);
/* i915_mem.c */ /* i915_mem.c */
extern int i915_mem_alloc(DRM_IOCTL_ARGS); extern int i915_mem_alloc(struct drm_device *dev, void *data,
extern int i915_mem_free(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int i915_mem_init_heap(DRM_IOCTL_ARGS); extern int i915_mem_free(struct drm_device *dev, void *data,
extern int i915_mem_destroy_heap(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int i915_mem_init_heap(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int i915_mem_destroy_heap(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern void i915_mem_takedown(struct mem_block **heap); extern void i915_mem_takedown(struct mem_block **heap);
extern void i915_mem_release(struct drm_device * dev, extern void i915_mem_release(struct drm_device * dev,
DRMFILE filp, struct mem_block *heap); struct drm_file *file_priv, struct mem_block *heap);
#define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg)) #define I915_READ(reg) DRM_READ32(dev_priv->mmio_map, (reg))
#define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val)) #define I915_WRITE(reg,val) DRM_WRITE32(dev_priv->mmio_map, (reg), (val))
......
...@@ -311,7 +311,7 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr) ...@@ -311,7 +311,7 @@ static int i915_wait_irq(struct drm_device * dev, int irq_nr)
DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ, DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ,
READ_BREADCRUMB(dev_priv) >= irq_nr); READ_BREADCRUMB(dev_priv) >= irq_nr);
if (ret == DRM_ERR(EBUSY)) { if (ret == -EBUSY) {
DRM_ERROR("%s: EBUSY -- rec: %d emitted: %d\n", DRM_ERROR("%s: EBUSY -- rec: %d emitted: %d\n",
__FUNCTION__, __FUNCTION__,
READ_BREADCRUMB(dev_priv), (int)dev_priv->counter); READ_BREADCRUMB(dev_priv), (int)dev_priv->counter);
...@@ -330,7 +330,7 @@ static int i915_driver_vblank_do_wait(struct drm_device *dev, unsigned int *sequ ...@@ -330,7 +330,7 @@ static int i915_driver_vblank_do_wait(struct drm_device *dev, unsigned int *sequ
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ, DRM_WAIT_ON(ret, dev->vbl_queue, 3 * DRM_HZ,
...@@ -355,28 +355,25 @@ int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence) ...@@ -355,28 +355,25 @@ int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence)
/* Needs the lock as it touches the ring. /* Needs the lock as it touches the ring.
*/ */
int i915_irq_emit(DRM_IOCTL_ARGS) int i915_irq_emit(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_irq_emit_t emit; drm_i915_irq_emit_t *emit = data;
int result; int result;
LOCK_TEST_WITH_RETURN(dev, filp); LOCK_TEST_WITH_RETURN(dev, file_priv);
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(emit, (drm_i915_irq_emit_t __user *) data,
sizeof(emit));
result = i915_emit_irq(dev); result = i915_emit_irq(dev);
if (DRM_COPY_TO_USER(emit.irq_seq, &result, sizeof(int))) { if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
DRM_ERROR("copy_to_user\n"); DRM_ERROR("copy_to_user\n");
return DRM_ERR(EFAULT); return -EFAULT;
} }
return 0; return 0;
...@@ -384,21 +381,18 @@ int i915_irq_emit(DRM_IOCTL_ARGS) ...@@ -384,21 +381,18 @@ int i915_irq_emit(DRM_IOCTL_ARGS)
/* Doesn't need the hardware lock. /* Doesn't need the hardware lock.
*/ */
int i915_irq_wait(DRM_IOCTL_ARGS) int i915_irq_wait(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_irq_wait_t irqwait; drm_i915_irq_wait_t *irqwait = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(irqwait, (drm_i915_irq_wait_t __user *) data, return i915_wait_irq(dev, irqwait->irq_seq);
sizeof(irqwait));
return i915_wait_irq(dev, irqwait.irq_seq);
} }
static void i915_enable_interrupt (struct drm_device *dev) static void i915_enable_interrupt (struct drm_device *dev)
...@@ -417,64 +411,60 @@ static void i915_enable_interrupt (struct drm_device *dev) ...@@ -417,64 +411,60 @@ static void i915_enable_interrupt (struct drm_device *dev)
/* Set the vblank monitor pipe /* Set the vblank monitor pipe
*/ */
int i915_vblank_pipe_set(DRM_IOCTL_ARGS) int i915_vblank_pipe_set(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_vblank_pipe_t pipe; drm_i915_vblank_pipe_t *pipe = data;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(pipe, (drm_i915_vblank_pipe_t __user *) data, if (pipe->pipe & ~(DRM_I915_VBLANK_PIPE_A|DRM_I915_VBLANK_PIPE_B)) {
sizeof(pipe));
if (pipe.pipe & ~(DRM_I915_VBLANK_PIPE_A|DRM_I915_VBLANK_PIPE_B)) {
DRM_ERROR("%s called with invalid pipe 0x%x\n", DRM_ERROR("%s called with invalid pipe 0x%x\n",
__FUNCTION__, pipe.pipe); __FUNCTION__, pipe->pipe);
return DRM_ERR(EINVAL); return -EINVAL;
} }
dev_priv->vblank_pipe = pipe.pipe; dev_priv->vblank_pipe = pipe->pipe;
i915_enable_interrupt (dev); i915_enable_interrupt (dev);
return 0; return 0;
} }
int i915_vblank_pipe_get(DRM_IOCTL_ARGS) int i915_vblank_pipe_get(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_vblank_pipe_t pipe; drm_i915_vblank_pipe_t *pipe = data;
u16 flag; u16 flag;
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __FUNCTION__); DRM_ERROR("%s called with no initialization\n", __FUNCTION__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
flag = I915_READ(I915REG_INT_ENABLE_R); flag = I915_READ(I915REG_INT_ENABLE_R);
pipe.pipe = 0; pipe->pipe = 0;
if (flag & VSYNC_PIPEA_FLAG) if (flag & VSYNC_PIPEA_FLAG)
pipe.pipe |= DRM_I915_VBLANK_PIPE_A; pipe->pipe |= DRM_I915_VBLANK_PIPE_A;
if (flag & VSYNC_PIPEB_FLAG) if (flag & VSYNC_PIPEB_FLAG)
pipe.pipe |= DRM_I915_VBLANK_PIPE_B; pipe->pipe |= DRM_I915_VBLANK_PIPE_B;
DRM_COPY_TO_USER_IOCTL((drm_i915_vblank_pipe_t __user *) data, pipe,
sizeof(pipe));
return 0; return 0;
} }
/** /**
* Schedule buffer swap at given vertical blank. * Schedule buffer swap at given vertical blank.
*/ */
int i915_vblank_swap(DRM_IOCTL_ARGS) int i915_vblank_swap(struct drm_device *dev, void *data,
struct drm_file *file_priv)
{ {
DRM_DEVICE;
drm_i915_private_t *dev_priv = dev->dev_private; drm_i915_private_t *dev_priv = dev->dev_private;
drm_i915_vblank_swap_t swap; drm_i915_vblank_swap_t *swap = data;
drm_i915_vbl_swap_t *vbl_swap; drm_i915_vbl_swap_t *vbl_swap;
unsigned int pipe, seqtype, curseq; unsigned int pipe, seqtype, curseq;
unsigned long irqflags; unsigned long irqflags;
...@@ -482,38 +472,35 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) ...@@ -482,38 +472,35 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
if (!dev_priv) { if (!dev_priv) {
DRM_ERROR("%s called with no initialization\n", __func__); DRM_ERROR("%s called with no initialization\n", __func__);
return DRM_ERR(EINVAL); return -EINVAL;
} }
if (dev_priv->sarea_priv->rotation) { if (dev_priv->sarea_priv->rotation) {
DRM_DEBUG("Rotation not supported\n"); DRM_DEBUG("Rotation not supported\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
DRM_COPY_FROM_USER_IOCTL(swap, (drm_i915_vblank_swap_t __user *) data, if (swap->seqtype & ~(_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE |
sizeof(swap));
if (swap.seqtype & ~(_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE |
_DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)) { _DRM_VBLANK_SECONDARY | _DRM_VBLANK_NEXTONMISS)) {
DRM_ERROR("Invalid sequence type 0x%x\n", swap.seqtype); DRM_ERROR("Invalid sequence type 0x%x\n", swap->seqtype);
return DRM_ERR(EINVAL); return -EINVAL;
} }
pipe = (swap.seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0; pipe = (swap->seqtype & _DRM_VBLANK_SECONDARY) ? 1 : 0;
seqtype = swap.seqtype & (_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE); seqtype = swap->seqtype & (_DRM_VBLANK_RELATIVE | _DRM_VBLANK_ABSOLUTE);
if (!(dev_priv->vblank_pipe & (1 << pipe))) { if (!(dev_priv->vblank_pipe & (1 << pipe))) {
DRM_ERROR("Invalid pipe %d\n", pipe); DRM_ERROR("Invalid pipe %d\n", pipe);
return DRM_ERR(EINVAL); return -EINVAL;
} }
spin_lock_irqsave(&dev->drw_lock, irqflags); spin_lock_irqsave(&dev->drw_lock, irqflags);
if (!drm_get_drawable_info(dev, swap.drawable)) { if (!drm_get_drawable_info(dev, swap->drawable)) {
spin_unlock_irqrestore(&dev->drw_lock, irqflags); spin_unlock_irqrestore(&dev->drw_lock, irqflags);
DRM_DEBUG("Invalid drawable ID %d\n", swap.drawable); DRM_DEBUG("Invalid drawable ID %d\n", swap->drawable);
return DRM_ERR(EINVAL); return -EINVAL;
} }
spin_unlock_irqrestore(&dev->drw_lock, irqflags); spin_unlock_irqrestore(&dev->drw_lock, irqflags);
...@@ -521,14 +508,14 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) ...@@ -521,14 +508,14 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
curseq = atomic_read(pipe ? &dev->vbl_received2 : &dev->vbl_received); curseq = atomic_read(pipe ? &dev->vbl_received2 : &dev->vbl_received);
if (seqtype == _DRM_VBLANK_RELATIVE) if (seqtype == _DRM_VBLANK_RELATIVE)
swap.sequence += curseq; swap->sequence += curseq;
if ((curseq - swap.sequence) <= (1<<23)) { if ((curseq - swap->sequence) <= (1<<23)) {
if (swap.seqtype & _DRM_VBLANK_NEXTONMISS) { if (swap->seqtype & _DRM_VBLANK_NEXTONMISS) {
swap.sequence = curseq + 1; swap->sequence = curseq + 1;
} else { } else {
DRM_DEBUG("Missed target sequence\n"); DRM_DEBUG("Missed target sequence\n");
return DRM_ERR(EINVAL); return -EINVAL;
} }
} }
...@@ -537,9 +524,9 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) ...@@ -537,9 +524,9 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
list_for_each(list, &dev_priv->vbl_swaps.head) { list_for_each(list, &dev_priv->vbl_swaps.head) {
vbl_swap = list_entry(list, drm_i915_vbl_swap_t, head); vbl_swap = list_entry(list, drm_i915_vbl_swap_t, head);
if (vbl_swap->drw_id == swap.drawable && if (vbl_swap->drw_id == swap->drawable &&
vbl_swap->pipe == pipe && vbl_swap->pipe == pipe &&
vbl_swap->sequence == swap.sequence) { vbl_swap->sequence == swap->sequence) {
spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags); spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
DRM_DEBUG("Already scheduled\n"); DRM_DEBUG("Already scheduled\n");
return 0; return 0;
...@@ -550,21 +537,21 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) ...@@ -550,21 +537,21 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
if (dev_priv->swaps_pending >= 100) { if (dev_priv->swaps_pending >= 100) {
DRM_DEBUG("Too many swaps queued\n"); DRM_DEBUG("Too many swaps queued\n");
return DRM_ERR(EBUSY); return -EBUSY;
} }
vbl_swap = drm_calloc(1, sizeof(vbl_swap), DRM_MEM_DRIVER); vbl_swap = drm_calloc(1, sizeof(*vbl_swap), DRM_MEM_DRIVER);
if (!vbl_swap) { if (!vbl_swap) {
DRM_ERROR("Failed to allocate memory to queue swap\n"); DRM_ERROR("Failed to allocate memory to queue swap\n");
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
DRM_DEBUG("\n"); DRM_DEBUG("\n");
vbl_swap->drw_id = swap.drawable; vbl_swap->drw_id = swap->drawable;
vbl_swap->pipe = pipe; vbl_swap->pipe = pipe;
vbl_swap->sequence = swap.sequence; vbl_swap->sequence = swap->sequence;
spin_lock_irqsave(&dev_priv->swaps_lock, irqflags); spin_lock_irqsave(&dev_priv->swaps_lock, irqflags);
...@@ -573,9 +560,6 @@ int i915_vblank_swap(DRM_IOCTL_ARGS) ...@@ -573,9 +560,6 @@ int i915_vblank_swap(DRM_IOCTL_ARGS)
spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags); spin_unlock_irqrestore(&dev_priv->swaps_lock, irqflags);
DRM_COPY_TO_USER_IOCTL((drm_i915_vblank_swap_t __user *) data, swap,
sizeof(swap));
return 0; return 0;
} }
......
此差异已折叠。
此差异已折叠。
...@@ -148,15 +148,20 @@ typedef struct drm_mga_private { ...@@ -148,15 +148,20 @@ typedef struct drm_mga_private {
unsigned int agp_size; unsigned int agp_size;
} drm_mga_private_t; } drm_mga_private_t;
extern drm_ioctl_desc_t mga_ioctls[]; extern struct drm_ioctl_desc mga_ioctls[];
extern int mga_max_ioctl; extern int mga_max_ioctl;
/* mga_dma.c */ /* mga_dma.c */
extern int mga_dma_bootstrap(DRM_IOCTL_ARGS); extern int mga_dma_bootstrap(struct drm_device *dev, void *data,
extern int mga_dma_init(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int mga_dma_flush(DRM_IOCTL_ARGS); extern int mga_dma_init(struct drm_device *dev, void *data,
extern int mga_dma_reset(DRM_IOCTL_ARGS); struct drm_file *file_priv);
extern int mga_dma_buffers(DRM_IOCTL_ARGS); extern int mga_dma_flush(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int mga_dma_reset(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int mga_dma_buffers(struct drm_device *dev, void *data,
struct drm_file *file_priv);
extern int mga_driver_load(struct drm_device *dev, unsigned long flags); extern int mga_driver_load(struct drm_device *dev, unsigned long flags);
extern int mga_driver_unload(struct drm_device * dev); extern int mga_driver_unload(struct drm_device * dev);
extern void mga_driver_lastclose(struct drm_device * dev); extern void mga_driver_lastclose(struct drm_device * dev);
...@@ -245,7 +250,7 @@ do { \ ...@@ -245,7 +250,7 @@ do { \
dev_priv->prim.high_mark ) { \ dev_priv->prim.high_mark ) { \
if ( MGA_DMA_DEBUG ) \ if ( MGA_DMA_DEBUG ) \
DRM_INFO( "%s: wrap...\n", __FUNCTION__ ); \ DRM_INFO( "%s: wrap...\n", __FUNCTION__ ); \
return DRM_ERR(EBUSY); \ return -EBUSY; \
} \ } \
} \ } \
} while (0) } while (0)
...@@ -256,7 +261,7 @@ do { \ ...@@ -256,7 +261,7 @@ do { \
if ( mga_do_wait_for_idle( dev_priv ) < 0 ) { \ if ( mga_do_wait_for_idle( dev_priv ) < 0 ) { \
if ( MGA_DMA_DEBUG ) \ if ( MGA_DMA_DEBUG ) \
DRM_INFO( "%s: wrap...\n", __FUNCTION__ ); \ DRM_INFO( "%s: wrap...\n", __FUNCTION__ ); \
return DRM_ERR(EBUSY); \ return -EBUSY; \
} \ } \
mga_do_dma_wrap_end( dev_priv ); \ mga_do_dma_wrap_end( dev_priv ); \
} \ } \
......
此差异已折叠。
...@@ -141,7 +141,7 @@ int mga_warp_install_microcode(drm_mga_private_t * dev_priv) ...@@ -141,7 +141,7 @@ int mga_warp_install_microcode(drm_mga_private_t * dev_priv)
if (size > dev_priv->warp->size) { if (size > dev_priv->warp->size) {
DRM_ERROR("microcode too large! (%u > %lu)\n", DRM_ERROR("microcode too large! (%u > %lu)\n",
size, dev_priv->warp->size); size, dev_priv->warp->size);
return DRM_ERR(ENOMEM); return -ENOMEM;
} }
switch (dev_priv->chipset) { switch (dev_priv->chipset) {
...@@ -151,7 +151,7 @@ int mga_warp_install_microcode(drm_mga_private_t * dev_priv) ...@@ -151,7 +151,7 @@ int mga_warp_install_microcode(drm_mga_private_t * dev_priv)
case MGA_CARD_TYPE_G200: case MGA_CARD_TYPE_G200:
return mga_warp_install_g200_microcode(dev_priv); return mga_warp_install_g200_microcode(dev_priv);
default: default:
return DRM_ERR(EINVAL); return -EINVAL;
} }
} }
...@@ -177,7 +177,7 @@ int mga_warp_init(drm_mga_private_t * dev_priv) ...@@ -177,7 +177,7 @@ int mga_warp_init(drm_mga_private_t * dev_priv)
MGA_WRITE(MGA_WVRTXSZ, 7); MGA_WRITE(MGA_WVRTXSZ, 7);
break; break;
default: default:
return DRM_ERR(EINVAL); return -EINVAL;
} }
MGA_WRITE(MGA_WMISC, (MGA_WUCODECACHE_ENABLE | MGA_WRITE(MGA_WMISC, (MGA_WUCODECACHE_ENABLE |
...@@ -186,7 +186,7 @@ int mga_warp_init(drm_mga_private_t * dev_priv) ...@@ -186,7 +186,7 @@ int mga_warp_init(drm_mga_private_t * dev_priv)
if (wmisc != WMISC_EXPECTED) { if (wmisc != WMISC_EXPECTED) {
DRM_ERROR("WARP engine config failed! 0x%x != 0x%x\n", DRM_ERROR("WARP engine config failed! 0x%x != 0x%x\n",
wmisc, WMISC_EXPECTED); wmisc, WMISC_EXPECTED);
return DRM_ERR(EINVAL); return -EINVAL;
} }
return 0; return 0;
......
此差异已折叠。
...@@ -222,11 +222,7 @@ typedef struct drm_r128_init { ...@@ -222,11 +222,7 @@ typedef struct drm_r128_init {
R128_INIT_CCE = 0x01, R128_INIT_CCE = 0x01,
R128_CLEANUP_CCE = 0x02 R128_CLEANUP_CCE = 0x02
} func; } func;
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
int sarea_priv_offset;
#else
unsigned long sarea_priv_offset; unsigned long sarea_priv_offset;
#endif
int is_pci; int is_pci;
int cce_mode; int cce_mode;
int cce_secure; int cce_secure;
...@@ -240,21 +236,12 @@ typedef struct drm_r128_init { ...@@ -240,21 +236,12 @@ typedef struct drm_r128_init {
unsigned int depth_offset, depth_pitch; unsigned int depth_offset, depth_pitch;
unsigned int span_offset; unsigned int span_offset;
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
unsigned int fb_offset;
unsigned int mmio_offset;
unsigned int ring_offset;
unsigned int ring_rptr_offset;
unsigned int buffers_offset;
unsigned int agp_textures_offset;
#else
unsigned long fb_offset; unsigned long fb_offset;
unsigned long mmio_offset; unsigned long mmio_offset;
unsigned long ring_offset; unsigned long ring_offset;
unsigned long ring_rptr_offset; unsigned long ring_rptr_offset;
unsigned long buffers_offset; unsigned long buffers_offset;
unsigned long agp_textures_offset; unsigned long agp_textures_offset;
#endif
} drm_r128_init_t; } drm_r128_init_t;
typedef struct drm_r128_cce_stop { typedef struct drm_r128_cce_stop {
...@@ -264,15 +251,10 @@ typedef struct drm_r128_cce_stop { ...@@ -264,15 +251,10 @@ typedef struct drm_r128_cce_stop {
typedef struct drm_r128_clear { typedef struct drm_r128_clear {
unsigned int flags; unsigned int flags;
#if CONFIG_XFREE86_VERSION < XFREE86_VERSION(4,1,0,0)
int x, y, w, h;
#endif
unsigned int clear_color; unsigned int clear_color;
unsigned int clear_depth; unsigned int clear_depth;
#if CONFIG_XFREE86_VERSION >= XFREE86_VERSION(4,1,0,0)
unsigned int color_mask; unsigned int color_mask;
unsigned int depth_mask; unsigned int depth_mask;
#endif
} drm_r128_clear_t; } drm_r128_clear_t;
typedef struct drm_r128_vertex { typedef struct drm_r128_vertex {
......
...@@ -129,18 +129,18 @@ typedef struct drm_r128_buf_priv { ...@@ -129,18 +129,18 @@ typedef struct drm_r128_buf_priv {
drm_r128_freelist_t *list_entry; drm_r128_freelist_t *list_entry;
} drm_r128_buf_priv_t; } drm_r128_buf_priv_t;
extern drm_ioctl_desc_t r128_ioctls[]; extern struct drm_ioctl_desc r128_ioctls[];
extern int r128_max_ioctl; extern int r128_max_ioctl;
/* r128_cce.c */ /* r128_cce.c */
extern int r128_cce_init(DRM_IOCTL_ARGS); extern int r128_cce_init(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_cce_start(DRM_IOCTL_ARGS); extern int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_cce_stop(DRM_IOCTL_ARGS); extern int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_cce_reset(DRM_IOCTL_ARGS); extern int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_cce_idle(DRM_IOCTL_ARGS); extern int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_engine_reset(DRM_IOCTL_ARGS); extern int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_fullscreen(DRM_IOCTL_ARGS); extern int r128_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern int r128_cce_buffers(DRM_IOCTL_ARGS); extern int r128_cce_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
extern void r128_freelist_reset(struct drm_device * dev); extern void r128_freelist_reset(struct drm_device * dev);
...@@ -156,7 +156,8 @@ extern void r128_driver_irq_preinstall(struct drm_device * dev); ...@@ -156,7 +156,8 @@ extern void r128_driver_irq_preinstall(struct drm_device * dev);
extern void r128_driver_irq_postinstall(struct drm_device * dev); extern void r128_driver_irq_postinstall(struct drm_device * dev);
extern void r128_driver_irq_uninstall(struct drm_device * dev); extern void r128_driver_irq_uninstall(struct drm_device * dev);
extern void r128_driver_lastclose(struct drm_device * dev); extern void r128_driver_lastclose(struct drm_device * dev);
extern void r128_driver_preclose(struct drm_device * dev, DRMFILE filp); extern void r128_driver_preclose(struct drm_device * dev,
struct drm_file *file_priv);
extern long r128_compat_ioctl(struct file *filp, unsigned int cmd, extern long r128_compat_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg); unsigned long arg);
...@@ -428,7 +429,7 @@ do { \ ...@@ -428,7 +429,7 @@ do { \
DRM_UDELAY(1); \ DRM_UDELAY(1); \
} \ } \
DRM_ERROR( "ring space check failed!\n" ); \ DRM_ERROR( "ring space check failed!\n" ); \
return DRM_ERR(EBUSY); \ return -EBUSY; \
} \ } \
__ring_space_done: \ __ring_space_done: \
; \ ; \
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -42,7 +42,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset) ...@@ -42,7 +42,7 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
dev_priv = drm_calloc(1, sizeof(drm_sis_private_t), DRM_MEM_DRIVER); dev_priv = drm_calloc(1, sizeof(drm_sis_private_t), DRM_MEM_DRIVER);
if (dev_priv == NULL) if (dev_priv == NULL)
return DRM_ERR(ENOMEM); return -ENOMEM;
dev->dev_private = (void *)dev_priv; dev->dev_private = (void *)dev_priv;
dev_priv->chipset = chipset; dev_priv->chipset = chipset;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册