qxl_drv.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /* vim: set ts=8 sw=8 tw=78 ai noexpandtab */
  2. /* qxl_drv.c -- QXL driver -*- linux-c -*-
  3. *
  4. * Copyright 2011 Red Hat, Inc.
  5. * All Rights Reserved.
  6. *
  7. * Permission is hereby granted, free of charge, to any person obtaining a
  8. * copy of this software and associated documentation files (the "Software"),
  9. * to deal in the Software without restriction, including without limitation
  10. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11. * and/or sell copies of the Software, and to permit persons to whom the
  12. * Software is furnished to do so, subject to the following conditions:
  13. *
  14. * The above copyright notice and this permission notice (including the next
  15. * paragraph) shall be included in all copies or substantial portions of the
  16. * Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  21. * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  22. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  23. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. * OTHER DEALINGS IN THE SOFTWARE.
  25. *
  26. * Authors:
  27. * Dave Airlie <airlie@redhat.com>
  28. * Alon Levy <alevy@redhat.com>
  29. */
  30. #include <linux/module.h>
  31. #include <linux/console.h>
  32. #include "drmP.h"
  33. #include "drm/drm.h"
  34. #include "qxl_drv.h"
  35. extern int qxl_max_ioctls;
  36. static DEFINE_PCI_DEVICE_TABLE(pciidlist) = {
  37. { 0x1b36, 0x100, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8,
  38. 0xffff00, 0 },
  39. { 0x1b36, 0x100, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_OTHER << 8,
  40. 0xffff00, 0 },
  41. { 0, 0, 0 },
  42. };
  43. MODULE_DEVICE_TABLE(pci, pciidlist);
  44. static int qxl_modeset = -1;
  45. MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
  46. module_param_named(modeset, qxl_modeset, int, 0400);
  47. static struct drm_driver qxl_driver;
  48. static struct pci_driver qxl_pci_driver;
  49. static int
  50. qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
  51. {
  52. if (pdev->revision < 4) {
  53. DRM_ERROR("qxl too old, doesn't support client_monitors_config,"
  54. " use xf86-video-qxl in user mode");
  55. return -EINVAL; /* TODO: ENODEV ? */
  56. }
  57. return drm_get_pci_dev(pdev, ent, &qxl_driver);
  58. }
  59. static void
  60. qxl_pci_remove(struct pci_dev *pdev)
  61. {
  62. struct drm_device *dev = pci_get_drvdata(pdev);
  63. drm_put_dev(dev);
  64. }
  65. static struct pci_driver qxl_pci_driver = {
  66. .name = DRIVER_NAME,
  67. .id_table = pciidlist,
  68. .probe = qxl_pci_probe,
  69. .remove = qxl_pci_remove,
  70. };
  71. static const struct file_operations qxl_fops = {
  72. .owner = THIS_MODULE,
  73. .open = drm_open,
  74. .release = drm_release,
  75. .unlocked_ioctl = drm_ioctl,
  76. .poll = drm_poll,
  77. .fasync = drm_fasync,
  78. .mmap = qxl_mmap,
  79. };
  80. static struct drm_driver qxl_driver = {
  81. .driver_features = DRIVER_GEM | DRIVER_MODESET |
  82. DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
  83. .dev_priv_size = 0,
  84. .load = qxl_driver_load,
  85. .unload = qxl_driver_unload,
  86. .dumb_create = qxl_mode_dumb_create,
  87. .dumb_map_offset = qxl_mode_dumb_mmap,
  88. .dumb_destroy = qxl_mode_dumb_destroy,
  89. #if defined(CONFIG_DEBUG_FS)
  90. .debugfs_init = qxl_debugfs_init,
  91. .debugfs_cleanup = qxl_debugfs_takedown,
  92. #endif
  93. .gem_init_object = qxl_gem_object_init,
  94. .gem_free_object = qxl_gem_object_free,
  95. .gem_open_object = qxl_gem_object_open,
  96. .gem_close_object = qxl_gem_object_close,
  97. .fops = &qxl_fops,
  98. .ioctls = qxl_ioctls,
  99. .irq_handler = qxl_irq_handler,
  100. .name = DRIVER_NAME,
  101. .desc = DRIVER_DESC,
  102. .date = DRIVER_DATE,
  103. .major = 0,
  104. .minor = 1,
  105. .patchlevel = 0,
  106. };
  107. static int __init qxl_init(void)
  108. {
  109. #ifdef CONFIG_VGA_CONSOLE
  110. if (vgacon_text_force() && qxl_modeset == -1)
  111. return -EINVAL;
  112. #endif
  113. if (qxl_modeset == 0)
  114. return -EINVAL;
  115. qxl_driver.num_ioctls = qxl_max_ioctls;
  116. return drm_pci_init(&qxl_driver, &qxl_pci_driver);
  117. }
  118. static void __exit qxl_exit(void)
  119. {
  120. drm_pci_exit(&qxl_driver, &qxl_pci_driver);
  121. }
  122. module_init(qxl_init);
  123. module_exit(qxl_exit);
  124. MODULE_AUTHOR(DRIVER_AUTHOR);
  125. MODULE_DESCRIPTION(DRIVER_DESC);
  126. MODULE_LICENSE("GPL and additional rights");