File Index
Files and directories
Sign in
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 C
  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.