This source file includes following definitions.
- compat_mga_init
- compat_mga_getparam
- compat_mga_dma_bootstrap
- mga_compat_ioctl
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 
  25 
  26 
  27 
  28 
  29 
  30 
  31 
  32 
  33 
  34 #include <linux/compat.h>
  35 
  36 #include "mga_drv.h"
  37 
  38 typedef struct drm32_mga_init {
  39         int func;
  40         u32 sarea_priv_offset;
  41         int chipset;
  42         int sgram;
  43         unsigned int maccess;
  44         unsigned int fb_cpp;
  45         unsigned int front_offset, front_pitch;
  46         unsigned int back_offset, back_pitch;
  47         unsigned int depth_cpp;
  48         unsigned int depth_offset, depth_pitch;
  49         unsigned int texture_offset[MGA_NR_TEX_HEAPS];
  50         unsigned int texture_size[MGA_NR_TEX_HEAPS];
  51         u32 fb_offset;
  52         u32 mmio_offset;
  53         u32 status_offset;
  54         u32 warp_offset;
  55         u32 primary_offset;
  56         u32 buffers_offset;
  57 } drm_mga_init32_t;
  58 
  59 static int compat_mga_init(struct file *file, unsigned int cmd,
  60                            unsigned long arg)
  61 {
  62         drm_mga_init32_t init32;
  63         drm_mga_init_t init;
  64 
  65         if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
  66                 return -EFAULT;
  67 
  68         init.func = init32.func;
  69         init.sarea_priv_offset = init32.sarea_priv_offset;
  70         memcpy(&init.chipset, &init32.chipset,
  71                 offsetof(drm_mga_init_t, fb_offset) -
  72                 offsetof(drm_mga_init_t, chipset));
  73         init.fb_offset = init32.fb_offset;
  74         init.mmio_offset = init32.mmio_offset;
  75         init.status_offset = init32.status_offset;
  76         init.warp_offset = init32.warp_offset;
  77         init.primary_offset = init32.primary_offset;
  78         init.buffers_offset = init32.buffers_offset;
  79 
  80         return drm_ioctl_kernel(file, mga_dma_init, &init,
  81                                 DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
  82 }
  83 
  84 typedef struct drm_mga_getparam32 {
  85         int param;
  86         u32 value;
  87 } drm_mga_getparam32_t;
  88 
  89 static int compat_mga_getparam(struct file *file, unsigned int cmd,
  90                                unsigned long arg)
  91 {
  92         drm_mga_getparam32_t getparam32;
  93         drm_mga_getparam_t getparam;
  94 
  95         if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32)))
  96                 return -EFAULT;
  97 
  98         getparam.param = getparam32.param;
  99         getparam.value = compat_ptr(getparam32.value);
 100         return drm_ioctl_kernel(file, mga_getparam, &getparam, DRM_AUTH);
 101 }
 102 
 103 typedef struct drm_mga_drm_bootstrap32 {
 104         u32 texture_handle;
 105         u32 texture_size;
 106         u32 primary_size;
 107         u32 secondary_bin_count;
 108         u32 secondary_bin_size;
 109         u32 agp_mode;
 110         u8 agp_size;
 111 } drm_mga_dma_bootstrap32_t;
 112 
 113 static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
 114                                     unsigned long arg)
 115 {
 116         drm_mga_dma_bootstrap32_t dma_bootstrap32;
 117         drm_mga_dma_bootstrap_t dma_bootstrap;
 118         int err;
 119 
 120         if (copy_from_user(&dma_bootstrap32, (void __user *)arg,
 121                            sizeof(dma_bootstrap32)))
 122                 return -EFAULT;
 123 
 124         dma_bootstrap.texture_handle = dma_bootstrap32.texture_handle;
 125         dma_bootstrap.texture_size = dma_bootstrap32.texture_size;
 126         dma_bootstrap.primary_size = dma_bootstrap32.primary_size;
 127         dma_bootstrap.secondary_bin_count = dma_bootstrap32.secondary_bin_count;
 128         dma_bootstrap.secondary_bin_size = dma_bootstrap32.secondary_bin_size;
 129         dma_bootstrap.agp_mode = dma_bootstrap32.agp_mode;
 130         dma_bootstrap.agp_size = dma_bootstrap32.agp_size;
 131 
 132         err = drm_ioctl_kernel(file, mga_dma_bootstrap, &dma_bootstrap,
 133                                 DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
 134         if (err)
 135                 return err;
 136 
 137         dma_bootstrap32.texture_handle = dma_bootstrap.texture_handle;
 138         dma_bootstrap32.texture_size = dma_bootstrap.texture_size;
 139         dma_bootstrap32.primary_size = dma_bootstrap.primary_size;
 140         dma_bootstrap32.secondary_bin_count = dma_bootstrap.secondary_bin_count;
 141         dma_bootstrap32.secondary_bin_size = dma_bootstrap.secondary_bin_size;
 142         dma_bootstrap32.agp_mode = dma_bootstrap.agp_mode;
 143         dma_bootstrap32.agp_size = dma_bootstrap.agp_size;
 144         if (copy_to_user((void __user *)arg, &dma_bootstrap32,
 145                          sizeof(dma_bootstrap32)))
 146                 return -EFAULT;
 147 
 148         return 0;
 149 }
 150 
 151 static struct {
 152         drm_ioctl_compat_t *fn;
 153         char *name;
 154 } mga_compat_ioctls[] = {
 155 #define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n}
 156         DRM_IOCTL32_DEF(MGA_INIT, compat_mga_init),
 157         DRM_IOCTL32_DEF(MGA_GETPARAM, compat_mga_getparam),
 158         DRM_IOCTL32_DEF(MGA_DMA_BOOTSTRAP, compat_mga_dma_bootstrap),
 159 };
 160 
 161 
 162 
 163 
 164 
 165 
 166 
 167 
 168 
 169 
 170 long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 171 {
 172         unsigned int nr = DRM_IOCTL_NR(cmd);
 173         struct drm_file *file_priv = filp->private_data;
 174         drm_ioctl_compat_t *fn = NULL;
 175         int ret;
 176 
 177         if (nr < DRM_COMMAND_BASE)
 178                 return drm_compat_ioctl(filp, cmd, arg);
 179 
 180         if (nr >= DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
 181                 return drm_ioctl(filp, cmd, arg);
 182 
 183         fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE].fn;
 184         if (!fn)
 185                 return drm_ioctl(filp, cmd, arg);
 186 
 187         DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
 188                   task_pid_nr(current),
 189                   (long)old_encode_dev(file_priv->minor->kdev->devt),
 190                   file_priv->authenticated,
 191                   mga_compat_ioctls[nr - DRM_COMMAND_BASE].name);
 192         ret = (*fn) (filp, cmd, arg);
 193         if (ret)
 194                 DRM_DEBUG("ret = %d\n", ret);
 195         return ret;
 196 }