50 #include <linux/slab.h>
51 #include <linux/export.h>
57 struct drm_file *file_priv);
59 #define DRM_IOCTL_DEF(ioctl, _func, _flags) \
60 [DRM_IOCTL_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags, .cmd_drv = 0}
63 static struct drm_ioctl_desc drm_ioctls[] = {
171 #define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
184 struct drm_vma_entry *vma, *vma_temp;
188 if (dev->driver->lastclose)
189 dev->driver->lastclose(dev);
190 DRM_DEBUG(
"driver lastclose completed\n");
192 if (dev->irq_enabled && !drm_core_check_feature(dev, DRIVER_MODESET))
198 if (drm_core_has_AGP(dev) && dev->agp &&
199 !drm_core_check_feature(dev, DRIVER_MODESET)) {
200 struct drm_agp_mem *
entry, *tempe;
206 drm_unbind_agp(entry->memory);
207 drm_free_agp(entry->memory, entry->pages);
210 INIT_LIST_HEAD(&dev->agp->memory);
212 if (dev->agp->acquired)
213 drm_agp_release(dev);
215 dev->agp->acquired = 0;
216 dev->agp->enabled = 0;
218 if (drm_core_check_feature(dev, DRIVER_SG) && dev->sg &&
219 !drm_core_check_feature(dev, DRIVER_MODESET)) {
230 if (drm_core_check_feature(dev, DRIVER_HAVE_DMA) &&
231 !drm_core_check_feature(dev, DRIVER_MODESET))
234 dev->dev_mapping =
NULL;
237 DRM_DEBUG(
"lastclose completed\n");
248 static int __init drm_core_init(
void)
255 if (register_chrdev(DRM_MAJOR,
"drm", &drm_stub_fops))
267 DRM_ERROR(
"Cannot create /proc/dri\n");
274 DRM_ERROR(
"Cannot create /sys/kernel/debug/dri\n");
279 DRM_INFO(
"Initialized %s %d.%d.%d %s\n",
285 unregister_chrdev(DRM_MAJOR,
"drm");
292 static void __exit drm_core_exit(
void)
298 unregister_chrdev(DRM_MAJOR,
"drm");
310 static int drm_copy_field(
char *
buf,
size_t *buf_len,
const char *
value)
342 struct drm_file *file_priv)
375 unsigned int cmd,
unsigned long arg)
379 struct drm_ioctl_desc *ioctl;
381 unsigned int nr = DRM_IOCTL_NR(cmd);
383 char stack_kdata[128];
385 unsigned int usize, asize;
387 dev = file_priv->minor->dev;
389 if (drm_device_is_unplugged(dev))
394 ++file_priv->ioctl_count;
396 DRM_DEBUG(
"pid=%d, cmd=0x%02x, nr=0x%02x, dev 0x%lx, auth=%d\n",
398 (
long)old_encode_dev(file_priv->minor->device),
399 file_priv->authenticated);
405 (nr < DRM_COMMAND_BASE + dev->
driver->num_ioctls)) {
410 if (drv_size > asize)
414 ioctl = &drm_ioctls[
nr];
423 if ((nr == DRM_IOCTL_NR(
DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)
424 func = dev->driver->dma_ioctl;
427 DRM_DEBUG(
"no function\n");
430 ((ioctl->flags & DRM_AUTH) && !file_priv->authenticated) ||
431 ((ioctl->flags & DRM_MASTER) && !file_priv->is_master) ||
432 (!(ioctl->flags & DRM_CONTROL_ALLOW) && (file_priv->minor->type == DRM_MINOR_CONTROL))) {
436 if (asize <=
sizeof(stack_kdata)) {
446 memset(kdata + usize, 0, asize - usize);
458 if (ioctl->flags & DRM_UNLOCKED)
459 retcode =
func(dev, kdata, file_priv);
462 retcode =
func(dev, kdata, file_priv);
474 if (kdata != stack_kdata)
478 DRM_DEBUG(
"ret = %d\n", retcode);
486 struct drm_map_list *
entry;
489 if (entry->map && entry->map->type ==
_DRM_SHM &&