vfio_pci_core.h (8170B)
1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * Copyright (C) 2012 Red Hat, Inc. All rights reserved. 4 * Author: Alex Williamson <alex.williamson@redhat.com> 5 * 6 * Derived from original vfio: 7 * Copyright 2010 Cisco Systems, Inc. All rights reserved. 8 * Author: Tom Lyon, pugs@cisco.com 9 */ 10 11#include <linux/mutex.h> 12#include <linux/pci.h> 13#include <linux/vfio.h> 14#include <linux/irqbypass.h> 15#include <linux/types.h> 16#include <linux/uuid.h> 17#include <linux/notifier.h> 18 19#ifndef VFIO_PCI_CORE_H 20#define VFIO_PCI_CORE_H 21 22#define VFIO_PCI_OFFSET_SHIFT 40 23 24#define VFIO_PCI_OFFSET_TO_INDEX(off) (off >> VFIO_PCI_OFFSET_SHIFT) 25#define VFIO_PCI_INDEX_TO_OFFSET(index) ((u64)(index) << VFIO_PCI_OFFSET_SHIFT) 26#define VFIO_PCI_OFFSET_MASK (((u64)(1) << VFIO_PCI_OFFSET_SHIFT) - 1) 27 28/* Special capability IDs predefined access */ 29#define PCI_CAP_ID_INVALID 0xFF /* default raw access */ 30#define PCI_CAP_ID_INVALID_VIRT 0xFE /* default virt access */ 31 32/* Cap maximum number of ioeventfds per device (arbitrary) */ 33#define VFIO_PCI_IOEVENTFD_MAX 1000 34 35struct vfio_pci_ioeventfd { 36 struct list_head next; 37 struct vfio_pci_core_device *vdev; 38 struct virqfd *virqfd; 39 void __iomem *addr; 40 uint64_t data; 41 loff_t pos; 42 int bar; 43 int count; 44 bool test_mem; 45}; 46 47struct vfio_pci_irq_ctx { 48 struct eventfd_ctx *trigger; 49 struct virqfd *unmask; 50 struct virqfd *mask; 51 char *name; 52 bool masked; 53 struct irq_bypass_producer producer; 54}; 55 56struct vfio_pci_core_device; 57struct vfio_pci_region; 58 59struct vfio_pci_regops { 60 ssize_t (*rw)(struct vfio_pci_core_device *vdev, char __user *buf, 61 size_t count, loff_t *ppos, bool iswrite); 62 void (*release)(struct vfio_pci_core_device *vdev, 63 struct vfio_pci_region *region); 64 int (*mmap)(struct vfio_pci_core_device *vdev, 65 struct vfio_pci_region *region, 66 struct vm_area_struct *vma); 67 int (*add_capability)(struct vfio_pci_core_device *vdev, 68 struct vfio_pci_region *region, 69 struct vfio_info_cap *caps); 70}; 71 72struct vfio_pci_region { 73 u32 type; 74 u32 subtype; 75 const struct vfio_pci_regops *ops; 76 void *data; 77 size_t size; 78 u32 flags; 79}; 80 81struct vfio_pci_dummy_resource { 82 struct resource resource; 83 int index; 84 struct list_head res_next; 85}; 86 87struct vfio_pci_vf_token { 88 struct mutex lock; 89 uuid_t uuid; 90 int users; 91}; 92 93struct vfio_pci_mmap_vma { 94 struct vm_area_struct *vma; 95 struct list_head vma_next; 96}; 97 98struct vfio_pci_core_device { 99 struct vfio_device vdev; 100 struct pci_dev *pdev; 101 void __iomem *barmap[PCI_STD_NUM_BARS]; 102 bool bar_mmap_supported[PCI_STD_NUM_BARS]; 103 u8 *pci_config_map; 104 u8 *vconfig; 105 struct perm_bits *msi_perm; 106 spinlock_t irqlock; 107 struct mutex igate; 108 struct vfio_pci_irq_ctx *ctx; 109 int num_ctx; 110 int irq_type; 111 int num_regions; 112 struct vfio_pci_region *region; 113 u8 msi_qmax; 114 u8 msix_bar; 115 u16 msix_size; 116 u32 msix_offset; 117 u32 rbar[7]; 118 bool pci_2_3; 119 bool virq_disabled; 120 bool reset_works; 121 bool extended_caps; 122 bool bardirty; 123 bool has_vga; 124 bool needs_reset; 125 bool nointx; 126 bool needs_pm_restore; 127 struct pci_saved_state *pci_saved_state; 128 struct pci_saved_state *pm_save; 129 int ioeventfds_nr; 130 struct eventfd_ctx *err_trigger; 131 struct eventfd_ctx *req_trigger; 132 struct list_head dummy_resources_list; 133 struct mutex ioeventfds_lock; 134 struct list_head ioeventfds_list; 135 struct vfio_pci_vf_token *vf_token; 136 struct list_head sriov_pfs_item; 137 struct vfio_pci_core_device *sriov_pf_core_dev; 138 struct notifier_block nb; 139 struct mutex vma_lock; 140 struct list_head vma_list; 141 struct rw_semaphore memory_lock; 142}; 143 144#define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX) 145#define is_msi(vdev) (vdev->irq_type == VFIO_PCI_MSI_IRQ_INDEX) 146#define is_msix(vdev) (vdev->irq_type == VFIO_PCI_MSIX_IRQ_INDEX) 147#define is_irq_none(vdev) (!(is_intx(vdev) || is_msi(vdev) || is_msix(vdev))) 148#define irq_is(vdev, type) (vdev->irq_type == type) 149 150extern void vfio_pci_intx_mask(struct vfio_pci_core_device *vdev); 151extern void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev); 152 153extern int vfio_pci_set_irqs_ioctl(struct vfio_pci_core_device *vdev, 154 uint32_t flags, unsigned index, 155 unsigned start, unsigned count, void *data); 156 157extern ssize_t vfio_pci_config_rw(struct vfio_pci_core_device *vdev, 158 char __user *buf, size_t count, 159 loff_t *ppos, bool iswrite); 160 161extern ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf, 162 size_t count, loff_t *ppos, bool iswrite); 163 164#ifdef CONFIG_VFIO_PCI_VGA 165extern ssize_t vfio_pci_vga_rw(struct vfio_pci_core_device *vdev, char __user *buf, 166 size_t count, loff_t *ppos, bool iswrite); 167#else 168static inline ssize_t vfio_pci_vga_rw(struct vfio_pci_core_device *vdev, 169 char __user *buf, size_t count, 170 loff_t *ppos, bool iswrite) 171{ 172 return -EINVAL; 173} 174#endif 175 176extern long vfio_pci_ioeventfd(struct vfio_pci_core_device *vdev, loff_t offset, 177 uint64_t data, int count, int fd); 178 179extern int vfio_pci_init_perm_bits(void); 180extern void vfio_pci_uninit_perm_bits(void); 181 182extern int vfio_config_init(struct vfio_pci_core_device *vdev); 183extern void vfio_config_free(struct vfio_pci_core_device *vdev); 184 185extern int vfio_pci_register_dev_region(struct vfio_pci_core_device *vdev, 186 unsigned int type, unsigned int subtype, 187 const struct vfio_pci_regops *ops, 188 size_t size, u32 flags, void *data); 189 190extern int vfio_pci_set_power_state(struct vfio_pci_core_device *vdev, 191 pci_power_t state); 192 193extern bool __vfio_pci_memory_enabled(struct vfio_pci_core_device *vdev); 194extern void vfio_pci_zap_and_down_write_memory_lock(struct vfio_pci_core_device 195 *vdev); 196extern u16 vfio_pci_memory_lock_and_enable(struct vfio_pci_core_device *vdev); 197extern void vfio_pci_memory_unlock_and_restore(struct vfio_pci_core_device *vdev, 198 u16 cmd); 199 200#ifdef CONFIG_VFIO_PCI_IGD 201extern int vfio_pci_igd_init(struct vfio_pci_core_device *vdev); 202#else 203static inline int vfio_pci_igd_init(struct vfio_pci_core_device *vdev) 204{ 205 return -ENODEV; 206} 207#endif 208 209#ifdef CONFIG_S390 210extern int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev, 211 struct vfio_info_cap *caps); 212#else 213static inline int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev, 214 struct vfio_info_cap *caps) 215{ 216 return -ENODEV; 217} 218#endif 219 220/* Will be exported for vfio pci drivers usage */ 221void vfio_pci_core_set_params(bool nointxmask, bool is_disable_vga, 222 bool is_disable_idle_d3); 223void vfio_pci_core_close_device(struct vfio_device *core_vdev); 224void vfio_pci_core_init_device(struct vfio_pci_core_device *vdev, 225 struct pci_dev *pdev, 226 const struct vfio_device_ops *vfio_pci_ops); 227int vfio_pci_core_register_device(struct vfio_pci_core_device *vdev); 228void vfio_pci_core_uninit_device(struct vfio_pci_core_device *vdev); 229void vfio_pci_core_unregister_device(struct vfio_pci_core_device *vdev); 230extern const struct pci_error_handlers vfio_pci_core_err_handlers; 231int vfio_pci_core_sriov_configure(struct vfio_pci_core_device *vdev, 232 int nr_virtfn); 233long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd, 234 unsigned long arg); 235int vfio_pci_core_ioctl_feature(struct vfio_device *device, u32 flags, 236 void __user *arg, size_t argsz); 237ssize_t vfio_pci_core_read(struct vfio_device *core_vdev, char __user *buf, 238 size_t count, loff_t *ppos); 239ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *buf, 240 size_t count, loff_t *ppos); 241int vfio_pci_core_mmap(struct vfio_device *core_vdev, struct vm_area_struct *vma); 242void vfio_pci_core_request(struct vfio_device *core_vdev, unsigned int count); 243int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf); 244int vfio_pci_core_enable(struct vfio_pci_core_device *vdev); 245void vfio_pci_core_disable(struct vfio_pci_core_device *vdev); 246void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev); 247pci_ers_result_t vfio_pci_core_aer_err_detected(struct pci_dev *pdev, 248 pci_channel_state_t state); 249 250static inline bool vfio_pci_is_vga(struct pci_dev *pdev) 251{ 252 return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA; 253} 254 255#endif /* VFIO_PCI_CORE_H */