FILE
vfio_pci_device.h
File preview with syntax highlighting.
linux-6.19.14/tools/testing/selftests/vfio/lib/include/libvfio/vfio_pci_device.h
1/* SPDX-License-Identifier: GPL-2.0-only */ 2#ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_VFIO_PCI_DEVICE_H 3#define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_VFIO_PCI_DEVICE_H 4 5#include <fcntl.h> 6#include <linux/vfio.h> 7#include <linux/pci_regs.h> 8 9#include <libvfio/assert.h> 10#include <libvfio/iommu.h> 11#include <libvfio/vfio_pci_driver.h> 12 13struct vfio_pci_bar { 14 struct vfio_region_info info; 15 void *vaddr; 16}; 17 18struct vfio_pci_device { 19 const char *bdf; 20 int fd; 21 int group_fd; 22 23 struct iommu *iommu; 24 25 struct vfio_device_info info; 26 struct vfio_region_info config_space; 27 struct vfio_pci_bar bars[PCI_STD_NUM_BARS]; 28 29 struct vfio_irq_info msi_info; 30 struct vfio_irq_info msix_info; 31 32 /* eventfds for MSI and MSI-x interrupts */ 33 int msi_eventfds[PCI_MSIX_FLAGS_QSIZE + 1]; 34 35 struct vfio_pci_driver driver; 36}; 37 38#define dev_info(_dev, _fmt, ...) printf("%s: " _fmt, (_dev)->bdf, ##__VA_ARGS__) 39#define dev_err(_dev, _fmt, ...) fprintf(stderr, "%s: " _fmt, (_dev)->bdf, ##__VA_ARGS__) 40 41struct vfio_pci_device *vfio_pci_device_init(const char *bdf, struct iommu *iommu); 42void vfio_pci_device_cleanup(struct vfio_pci_device *device); 43 44void vfio_pci_device_reset(struct vfio_pci_device *device); 45 46void vfio_pci_config_access(struct vfio_pci_device *device, bool write, 47 size_t config, size_t size, void *data); 48 49#define vfio_pci_config_read(_device, _offset, _type) ({ \ 50 _type __data; \ 51 vfio_pci_config_access((_device), false, _offset, sizeof(__data), &__data); \ 52 __data; \ 53}) 54 55#define vfio_pci_config_readb(_d, _o) vfio_pci_config_read(_d, _o, u8) 56#define vfio_pci_config_readw(_d, _o) vfio_pci_config_read(_d, _o, u16) 57#define vfio_pci_config_readl(_d, _o) vfio_pci_config_read(_d, _o, u32) 58 59#define vfio_pci_config_write(_device, _offset, _value, _type) do { \ 60 _type __data = (_value); \ 61 vfio_pci_config_access((_device), true, _offset, sizeof(_type), &__data); \ 62} while (0) 63 64#define vfio_pci_config_writeb(_d, _o, _v) vfio_pci_config_write(_d, _o, _v, u8) 65#define vfio_pci_config_writew(_d, _o, _v) vfio_pci_config_write(_d, _o, _v, u16) 66#define vfio_pci_config_writel(_d, _o, _v) vfio_pci_config_write(_d, _o, _v, u32) 67 68void vfio_pci_irq_enable(struct vfio_pci_device *device, u32 index, 69 u32 vector, int count); 70void vfio_pci_irq_disable(struct vfio_pci_device *device, u32 index); 71void vfio_pci_irq_trigger(struct vfio_pci_device *device, u32 index, u32 vector); 72 73static inline void fcntl_set_nonblock(int fd) 74{ 75 int r; 76 77 r = fcntl(fd, F_GETFL, 0); 78 VFIO_ASSERT_NE(r, -1, "F_GETFL failed for fd %d\n", fd); 79 80 r = fcntl(fd, F_SETFL, r | O_NONBLOCK); 81 VFIO_ASSERT_NE(r, -1, "F_SETFL O_NONBLOCK failed for fd %d\n", fd); 82} 83 84static inline void vfio_pci_msi_enable(struct vfio_pci_device *device, 85 u32 vector, int count) 86{ 87 vfio_pci_irq_enable(device, VFIO_PCI_MSI_IRQ_INDEX, vector, count); 88} 89 90static inline void vfio_pci_msi_disable(struct vfio_pci_device *device) 91{ 92 vfio_pci_irq_disable(device, VFIO_PCI_MSI_IRQ_INDEX); 93} 94 95static inline void vfio_pci_msix_enable(struct vfio_pci_device *device, 96 u32 vector, int count) 97{ 98 vfio_pci_irq_enable(device, VFIO_PCI_MSIX_IRQ_INDEX, vector, count); 99} 100 101static inline void vfio_pci_msix_disable(struct vfio_pci_device *device) 102{ 103 vfio_pci_irq_disable(device, VFIO_PCI_MSIX_IRQ_INDEX); 104} 105 106static inline int __to_iova(struct vfio_pci_device *device, void *vaddr, iova_t *iova) 107{ 108 return __iommu_hva2iova(device->iommu, vaddr, iova); 109} 110 111static inline iova_t to_iova(struct vfio_pci_device *device, void *vaddr) 112{ 113 return iommu_hva2iova(device->iommu, vaddr); 114} 115 116static inline bool vfio_pci_device_match(struct vfio_pci_device *device, 117 u16 vendor_id, u16 device_id) 118{ 119 return (vendor_id == vfio_pci_config_readw(device, PCI_VENDOR_ID)) && 120 (device_id == vfio_pci_config_readw(device, PCI_DEVICE_ID)); 121} 122 123const char *vfio_pci_get_cdev_path(const char *bdf); 124 125#endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_VFIO_PCI_DEVICE_H */
~/
Read-only file preview.