linux/drivers/vfio/pci/vfio_pci_private.h
<<
>>
Prefs
   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
  14#include <linux/mutex.h>
  15#include <linux/pci.h>
  16
  17#ifndef VFIO_PCI_PRIVATE_H
  18#define VFIO_PCI_PRIVATE_H
  19
  20#define VFIO_PCI_OFFSET_SHIFT   40
  21
  22#define VFIO_PCI_OFFSET_TO_INDEX(off)   (off >> VFIO_PCI_OFFSET_SHIFT)
  23#define VFIO_PCI_INDEX_TO_OFFSET(index) ((u64)(index) << VFIO_PCI_OFFSET_SHIFT)
  24#define VFIO_PCI_OFFSET_MASK    (((u64)(1) << VFIO_PCI_OFFSET_SHIFT) - 1)
  25
  26struct vfio_pci_irq_ctx {
  27        struct eventfd_ctx      *trigger;
  28        struct virqfd           *unmask;
  29        struct virqfd           *mask;
  30        char                    *name;
  31        bool                    masked;
  32};
  33
  34struct vfio_pci_device {
  35        struct pci_dev          *pdev;
  36        void __iomem            *barmap[PCI_STD_RESOURCE_END + 1];
  37        u8                      *pci_config_map;
  38        u8                      *vconfig;
  39        struct perm_bits        *msi_perm;
  40        spinlock_t              irqlock;
  41        struct mutex            igate;
  42        struct msix_entry       *msix;
  43        struct vfio_pci_irq_ctx *ctx;
  44        int                     num_ctx;
  45        int                     irq_type;
  46        u8                      msi_qmax;
  47        u8                      msix_bar;
  48        u16                     msix_size;
  49        u32                     msix_offset;
  50        u32                     rbar[7];
  51        bool                    pci_2_3;
  52        bool                    virq_disabled;
  53        bool                    reset_works;
  54        bool                    extended_caps;
  55        bool                    bardirty;
  56        bool                    has_vga;
  57        bool                    needs_reset;
  58        struct pci_saved_state  *pci_saved_state;
  59        int                     refcnt;
  60        struct eventfd_ctx      *err_trigger;
  61};
  62
  63#define is_intx(vdev) (vdev->irq_type == VFIO_PCI_INTX_IRQ_INDEX)
  64#define is_msi(vdev) (vdev->irq_type == VFIO_PCI_MSI_IRQ_INDEX)
  65#define is_msix(vdev) (vdev->irq_type == VFIO_PCI_MSIX_IRQ_INDEX)
  66#define is_irq_none(vdev) (!(is_intx(vdev) || is_msi(vdev) || is_msix(vdev)))
  67#define irq_is(vdev, type) (vdev->irq_type == type)
  68
  69extern void vfio_pci_intx_mask(struct vfio_pci_device *vdev);
  70extern void vfio_pci_intx_unmask(struct vfio_pci_device *vdev);
  71
  72extern int vfio_pci_set_irqs_ioctl(struct vfio_pci_device *vdev,
  73                                   uint32_t flags, unsigned index,
  74                                   unsigned start, unsigned count, void *data);
  75
  76extern ssize_t vfio_pci_config_rw(struct vfio_pci_device *vdev,
  77                                  char __user *buf, size_t count,
  78                                  loff_t *ppos, bool iswrite);
  79
  80extern ssize_t vfio_pci_bar_rw(struct vfio_pci_device *vdev, char __user *buf,
  81                               size_t count, loff_t *ppos, bool iswrite);
  82
  83extern ssize_t vfio_pci_vga_rw(struct vfio_pci_device *vdev, char __user *buf,
  84                               size_t count, loff_t *ppos, bool iswrite);
  85
  86extern int vfio_pci_init_perm_bits(void);
  87extern void vfio_pci_uninit_perm_bits(void);
  88
  89extern int vfio_pci_virqfd_init(void);
  90extern void vfio_pci_virqfd_exit(void);
  91
  92extern int vfio_config_init(struct vfio_pci_device *vdev);
  93extern void vfio_config_free(struct vfio_pci_device *vdev);
  94#endif /* VFIO_PCI_PRIVATE_H */
  95