pci_min.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. Only tested in x86.
  3. PCI driver for our minimal pci_min.c QEMU fork device.
  4. probe already does a mmio write, which generates an IRQ and tests everything.
  5. */
  6. #include <linux/cdev.h>
  7. #include <linux/fs.h>
  8. #include <linux/init.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/pci.h>
  13. #include <linux/uaccess.h> /* copy_from_user, copy_to_user */
  14. #define BAR 0
  15. #define CDEV_NAME "lkmc_hw_pci_min"
  16. #define EDU_DEVICE_ID 0x11e9
  17. #define QEMU_VENDOR_ID 0x1234
  18. static struct pci_device_id id_table[] = {
  19. { PCI_DEVICE(QEMU_VENDOR_ID, EDU_DEVICE_ID), },
  20. { 0, }
  21. };
  22. MODULE_DEVICE_TABLE(pci, id_table);
  23. static int major;
  24. static struct pci_dev *pdev;
  25. static void __iomem *mmio;
  26. static struct file_operations fops = {
  27. .owner = THIS_MODULE,
  28. };
  29. static irqreturn_t irq_handler(int irq, void *dev)
  30. {
  31. pr_info("irq_handler irq = %d dev = %d\n", irq, *(int *)dev);
  32. iowrite32(0, mmio + 4);
  33. return IRQ_HANDLED;
  34. }
  35. static int probe(struct pci_dev *dev, const struct pci_device_id *id)
  36. {
  37. pr_info("probe\n");
  38. major = register_chrdev(0, CDEV_NAME, &fops);
  39. pdev = dev;
  40. if (pci_enable_device(dev) < 0) {
  41. dev_err(&(pdev->dev), "pci_enable_device\n");
  42. goto error;
  43. }
  44. if (pci_request_region(dev, BAR, "myregion0")) {
  45. dev_err(&(pdev->dev), "pci_request_region\n");
  46. goto error;
  47. }
  48. mmio = pci_iomap(pdev, BAR, pci_resource_len(pdev, BAR));
  49. pr_info("dev->irq = %u\n", dev->irq);
  50. if (request_irq(dev->irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major) < 0) {
  51. dev_err(&(dev->dev), "request_irq\n");
  52. goto error;
  53. }
  54. iowrite32(0x12345678, mmio);
  55. return 0;
  56. error:
  57. return 1;
  58. }
  59. static void remove(struct pci_dev *dev)
  60. {
  61. pr_info("remove\n");
  62. free_irq(dev->irq, &major);
  63. pci_release_region(dev, BAR);
  64. unregister_chrdev(major, CDEV_NAME);
  65. }
  66. static struct pci_driver pci_driver = {
  67. .name = CDEV_NAME,
  68. .id_table = id_table,
  69. .probe = probe,
  70. .remove = remove,
  71. };
  72. static int myinit(void)
  73. {
  74. if (pci_register_driver(&pci_driver) < 0) {
  75. return 1;
  76. }
  77. return 0;
  78. }
  79. static void myexit(void)
  80. {
  81. pci_unregister_driver(&pci_driver);
  82. }
  83. module_init(myinit);
  84. module_exit(myexit);
  85. MODULE_LICENSE("GPL");