linux/include/linux/vfio_pci_core.h
<<
>>
Prefs
   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 notifier_block   nb;
 137        struct mutex            vma_lock;
 138        struct list_head        vma_list;
 139        struct rw_semaphore     memory_lock;
 140};
 141
 142#define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX)
 143#define is_msi(vdev) (vdev->irq_type == VFIO_PCI_MSI_IRQ_INDEX)
 144#define is_msix(vdev) (vdev->irq_type == VFIO_PCI_MSIX_IRQ_INDEX)
 145#define is_irq_none(vdev) (!(is_intx(vdev) || is_msi(vdev) || is_msix(vdev)))
 146#define irq_is(vdev, type) (vdev->irq_type == type)
 147
 148extern void vfio_pci_intx_mask(struct vfio_pci_core_device *vdev);
 149extern void vfio_pci_intx_unmask(struct vfio_pci_core_device *vdev);
 150
 151extern int vfio_pci_set_irqs_ioctl(struct vfio_pci_core_device *vdev,
 152                                   uint32_t flags, unsigned index,
 153                                   unsigned start, unsigned count, void *data);
 154
 155extern ssize_t vfio_pci_config_rw(struct vfio_pci_core_device *vdev,
 156                                  char __user *buf, size_t count,
 157                                  loff_t *ppos, bool iswrite);
 158
 159extern ssize_t vfio_pci_bar_rw(struct vfio_pci_core_device *vdev, char __user *buf,
 160                               size_t count, loff_t *ppos, bool iswrite);
 161
 162extern ssize_t vfio_pci_vga_rw(struct vfio_pci_core_device *vdev, char __user *buf,
 163                               size_t count, loff_t *ppos, bool iswrite);
 164
 165extern long vfio_pci_ioeventfd(struct vfio_pci_core_device *vdev, loff_t offset,
 166                               uint64_t data, int count, int fd);
 167
 168extern int vfio_pci_init_perm_bits(void);
 169extern void vfio_pci_uninit_perm_bits(void);
 170
 171extern int vfio_config_init(struct vfio_pci_core_device *vdev);
 172extern void vfio_config_free(struct vfio_pci_core_device *vdev);
 173
 174extern int vfio_pci_register_dev_region(struct vfio_pci_core_device *vdev,
 175                                        unsigned int type, unsigned int subtype,
 176                                        const struct vfio_pci_regops *ops,
 177                                        size_t size, u32 flags, void *data);
 178
 179extern int vfio_pci_set_power_state(struct vfio_pci_core_device *vdev,
 180                                    pci_power_t state);
 181
 182extern bool __vfio_pci_memory_enabled(struct vfio_pci_core_device *vdev);
 183extern void vfio_pci_zap_and_down_write_memory_lock(struct vfio_pci_core_device
 184                                                    *vdev);
 185extern u16 vfio_pci_memory_lock_and_enable(struct vfio_pci_core_device *vdev);
 186extern void vfio_pci_memory_unlock_and_restore(struct vfio_pci_core_device *vdev,
 187                                               u16 cmd);
 188
 189#ifdef CONFIG_VFIO_PCI_IGD
 190extern int vfio_pci_igd_init(struct vfio_pci_core_device *vdev);
 191#else
 192static inline int vfio_pci_igd_init(struct vfio_pci_core_device *vdev)
 193{
 194        return -ENODEV;
 195}
 196#endif
 197
 198#ifdef CONFIG_S390
 199extern int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
 200                                       struct vfio_info_cap *caps);
 201#else
 202static inline int vfio_pci_info_zdev_add_caps(struct vfio_pci_core_device *vdev,
 203                                              struct vfio_info_cap *caps)
 204{
 205        return -ENODEV;
 206}
 207#endif
 208
 209/* Will be exported for vfio pci drivers usage */
 210void vfio_pci_core_set_params(bool nointxmask, bool is_disable_vga,
 211                              bool is_disable_idle_d3);
 212void vfio_pci_core_close_device(struct vfio_device *core_vdev);
 213void vfio_pci_core_init_device(struct vfio_pci_core_device *vdev,
 214                               struct pci_dev *pdev,
 215                               const struct vfio_device_ops *vfio_pci_ops);
 216int vfio_pci_core_register_device(struct vfio_pci_core_device *vdev);
 217void vfio_pci_core_uninit_device(struct vfio_pci_core_device *vdev);
 218void vfio_pci_core_unregister_device(struct vfio_pci_core_device *vdev);
 219int vfio_pci_core_sriov_configure(struct pci_dev *pdev, int nr_virtfn);
 220extern const struct pci_error_handlers vfio_pci_core_err_handlers;
 221long vfio_pci_core_ioctl(struct vfio_device *core_vdev, unsigned int cmd,
 222                unsigned long arg);
 223ssize_t vfio_pci_core_read(struct vfio_device *core_vdev, char __user *buf,
 224                size_t count, loff_t *ppos);
 225ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *buf,
 226                size_t count, loff_t *ppos);
 227int vfio_pci_core_mmap(struct vfio_device *core_vdev, struct vm_area_struct *vma);
 228void vfio_pci_core_request(struct vfio_device *core_vdev, unsigned int count);
 229int vfio_pci_core_match(struct vfio_device *core_vdev, char *buf);
 230int vfio_pci_core_enable(struct vfio_pci_core_device *vdev);
 231void vfio_pci_core_disable(struct vfio_pci_core_device *vdev);
 232void vfio_pci_core_finish_enable(struct vfio_pci_core_device *vdev);
 233
 234static inline bool vfio_pci_is_vga(struct pci_dev *pdev)
 235{
 236        return (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA;
 237}
 238
 239#endif /* VFIO_PCI_CORE_H */
 240