vfio_pci_private.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * Copyright (C) 2012 Red Hat, Inc. All rights reserved.
  3. * Author: Alex Williamson <alex.williamson@redhat.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Derived from original vfio:
  10. * Copyright 2010 Cisco Systems, Inc. All rights reserved.
  11. * Author: Tom Lyon, pugs@cisco.com
  12. */
  13. #include <linux/mutex.h>
  14. #include <linux/pci.h>
  15. #include <linux/irqbypass.h>
  16. #include <linux/types.h>
  17. #ifndef VFIO_PCI_PRIVATE_H
  18. #define VFIO_PCI_PRIVATE_H
  19. #define VFIO_PCI_OFFSET_SHIFT 40
  20. #define VFIO_PCI_OFFSET_TO_INDEX(off) (off >> VFIO_PCI_OFFSET_SHIFT)
  21. #define VFIO_PCI_INDEX_TO_OFFSET(index) ((u64)(index) << VFIO_PCI_OFFSET_SHIFT)
  22. #define VFIO_PCI_OFFSET_MASK (((u64)(1) << VFIO_PCI_OFFSET_SHIFT) - 1)
  23. /* Special capability IDs predefined access */
  24. #define PCI_CAP_ID_INVALID 0xFF /* default raw access */
  25. #define PCI_CAP_ID_INVALID_VIRT 0xFE /* default virt access */
  26. /* Cap maximum number of ioeventfds per device (arbitrary) */
  27. #define VFIO_PCI_IOEVENTFD_MAX 1000
  28. struct vfio_pci_ioeventfd {
  29. struct list_head next;
  30. struct virqfd *virqfd;
  31. void __iomem *addr;
  32. uint64_t data;
  33. loff_t pos;
  34. int bar;
  35. int count;
  36. };
  37. struct vfio_pci_irq_ctx {
  38. struct eventfd_ctx *trigger;
  39. struct virqfd *unmask;
  40. struct virqfd *mask;
  41. char *name;
  42. bool masked;
  43. struct irq_bypass_producer producer;
  44. };
  45. struct vfio_pci_device;
  46. struct vfio_pci_region;
  47. struct vfio_pci_regops {
  48. size_t (*rw)(struct vfio_pci_device *vdev, char __user *buf,
  49. size_t count, loff_t *ppos, bool iswrite);
  50. void (*release)(struct vfio_pci_device *vdev,
  51. struct vfio_pci_region *region);
  52. };
  53. struct vfio_pci_region {
  54. u32 type;
  55. u32 subtype;
  56. const struct vfio_pci_regops *ops;
  57. void *data;
  58. size_t size;
  59. u32 flags;
  60. };
  61. struct vfio_pci_dummy_resource {
  62. struct resource resource;
  63. int index;
  64. struct list_head res_next;
  65. };
  66. struct vfio_pci_device {
  67. struct pci_dev *pdev;
  68. void __iomem *barmap[PCI_STD_RESOURCE_END + 1];
  69. bool bar_mmap_supported[PCI_STD_RESOURCE_END + 1];
  70. u8 *pci_config_map;
  71. u8 *vconfig;
  72. struct perm_bits *msi_perm;
  73. spinlock_t irqlock;
  74. struct mutex igate;
  75. struct vfio_pci_irq_ctx *ctx;
  76. int num_ctx;
  77. int irq_type;
  78. int num_regions;
  79. struct vfio_pci_region *region;
  80. u8 msi_qmax;
  81. u8 msix_bar;
  82. u16 msix_size;
  83. u32 msix_offset;
  84. u32 rbar[7];
  85. bool pci_2_3;
  86. bool virq_disabled;
  87. bool reset_works;
  88. bool extended_caps;
  89. bool bardirty;
  90. bool has_vga;
  91. bool needs_reset;
  92. bool nointx;
  93. struct pci_saved_state *pci_saved_state;
  94. int refcnt;
  95. int ioeventfds_nr;
  96. struct eventfd_ctx *err_trigger;
  97. struct eventfd_ctx *req_trigger;
  98. struct list_head dummy_resources_list;
  99. struct mutex ioeventfds_lock;
  100. struct list_head ioeventfds_list;
  101. };
  102. #define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX)
  103. #define is_msi(vdev) (vdev->irq_type == VFIO_PCI_MSI_IRQ_INDEX)
  104. #define is_msix(vdev) (vdev->irq_type == VFIO_PCI_MSIX_IRQ_INDEX)
  105. #define is_irq_none(vdev) (!(is_intx(vdev) || is_msi(vdev) || is_msix(vdev)))
  106. #define irq_is(vdev, type) (vdev->irq_type == type)
  107. extern void vfio_pci_intx_mask(struct vfio_pci_device *vdev);
  108. extern void vfio_pci_intx_unmask(struct vfio_pci_device *vdev);
  109. extern int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev,
  110. uint32_t flags, unsigned index,
  111. unsigned start, unsigned count, void *data);
  112. extern ssize_t vfio_pci_config_rw(struct vfio_pci_device *vdev,
  113. char __user *buf, size_t count,
  114. loff_t *ppos, bool iswrite);
  115. extern ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,
  116. size_t count, loff_t *ppos, bool iswrite);
  117. extern ssize_t vfio_pci_vga_rw(struct vfio_pci_device *vdev, char __user *buf,
  118. size_t count, loff_t *ppos, bool iswrite);
  119. extern long vfio_pci_ioeventfd(struct vfio_pci_device *vdev, loff_t offset,
  120. uint64_t data, int count, int fd);
  121. extern int vfio_pci_init_perm_bits(void);
  122. extern void vfio_pci_uninit_perm_bits(void);
  123. extern int vfio_config_init(struct vfio_pci_device *vdev);
  124. extern void vfio_config_free(struct vfio_pci_device *vdev);
  125. extern int vfio_pci_register_dev_region(struct vfio_pci_device *vdev,
  126. unsigned int type, unsigned int subtype,
  127. const struct vfio_pci_regops *ops,
  128. size_t size, u32 flags, void *data);
  129. #ifdef CONFIG_VFIO_PCI_IGD
  130. extern int vfio_pci_igd_init(struct vfio_pci_device *vdev);
  131. #else
  132. static inline int vfio_pci_igd_init(struct vfio_pci_device *vdev)
  133. {
  134. return -ENODEV;
  135. }
  136. #endif
  137. #endif /* VFIO_PCI_PRIVATE_H */