uboot/drivers/virtio/virtio_pci.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause */
   2/*
   3 * Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
   4 *
   5 * From Linux kernel include/uapi/linux/virtio_pci.h
   6 */
   7
   8#ifndef _LINUX_VIRTIO_PCI_H
   9#define _LINUX_VIRTIO_PCI_H
  10
  11#ifndef VIRTIO_PCI_NO_LEGACY
  12
  13/* A 32-bit r/o bitmask of the features supported by the host */
  14#define VIRTIO_PCI_HOST_FEATURES        0
  15
  16/* A 32-bit r/w bitmask of features activated by the guest */
  17#define VIRTIO_PCI_GUEST_FEATURES       4
  18
  19/* A 32-bit r/w PFN for the currently selected queue */
  20#define VIRTIO_PCI_QUEUE_PFN            8
  21
  22/* A 16-bit r/o queue size for the currently selected queue */
  23#define VIRTIO_PCI_QUEUE_NUM            12
  24
  25/* A 16-bit r/w queue selector */
  26#define VIRTIO_PCI_QUEUE_SEL            14
  27
  28/* A 16-bit r/w queue notifier */
  29#define VIRTIO_PCI_QUEUE_NOTIFY         16
  30
  31/* An 8-bit device status register */
  32#define VIRTIO_PCI_STATUS               18
  33
  34/*
  35 * An 8-bit r/o interrupt status register. Reading the value will return the
  36 * current contents of the ISR and will also clear it. This is effectively
  37 * a read-and-acknowledge.
  38 */
  39#define VIRTIO_PCI_ISR                  19
  40
  41/* MSI-X registers: only enabled if MSI-X is enabled */
  42
  43/* A 16-bit vector for configuration changes */
  44#define VIRTIO_MSI_CONFIG_VECTOR        20
  45/* A 16-bit vector for selected queue notifications */
  46#define VIRTIO_MSI_QUEUE_VECTOR         22
  47
  48/*
  49 * The remaining space is defined by each driver as the per-driver
  50 * configuration space
  51 */
  52#define VIRTIO_PCI_CONFIG_OFF(msix)     ((msix) ? 24 : 20)
  53
  54/* Virtio ABI version, this must match exactly */
  55#define VIRTIO_PCI_ABI_VERSION          0
  56
  57/*
  58 * How many bits to shift physical queue address written to QUEUE_PFN.
  59 * 12 is historical, and due to x86 page size.
  60 */
  61#define VIRTIO_PCI_QUEUE_ADDR_SHIFT     12
  62
  63/*
  64 * The alignment to use between consumer and producer parts of vring.
  65 * x86 pagesize again.
  66 */
  67#define VIRTIO_PCI_VRING_ALIGN          4096
  68
  69#endif /* VIRTIO_PCI_NO_LEGACY */
  70
  71/* The bit of the ISR which indicates a device configuration change */
  72#define VIRTIO_PCI_ISR_CONFIG           0x2
  73/* Vector value used to disable MSI for queue */
  74#define VIRTIO_MSI_NO_VECTOR            0xffff
  75
  76#ifndef VIRTIO_PCI_NO_MODERN
  77
  78/* IDs for different capabilities.  Must all exist. */
  79
  80/* Common configuration */
  81#define VIRTIO_PCI_CAP_COMMON_CFG       1
  82/* Notifications */
  83#define VIRTIO_PCI_CAP_NOTIFY_CFG       2
  84/* ISR access */
  85#define VIRTIO_PCI_CAP_ISR_CFG          3
  86/* Device specific configuration */
  87#define VIRTIO_PCI_CAP_DEVICE_CFG       4
  88/* PCI configuration access */
  89#define VIRTIO_PCI_CAP_PCI_CFG          5
  90
  91/* This is the PCI capability header: */
  92struct virtio_pci_cap {
  93        __u8 cap_vndr;          /* Generic PCI field: PCI_CAP_ID_VNDR */
  94        __u8 cap_next;          /* Generic PCI field: next ptr */
  95        __u8 cap_len;           /* Generic PCI field: capability length */
  96        __u8 cfg_type;          /* Identifies the structure */
  97        __u8 bar;               /* Where to find it */
  98        __u8 padding[3];        /* Pad to full dword */
  99        __le32 offset;          /* Offset within bar */
 100        __le32 length;          /* Length of the structure, in bytes */
 101};
 102
 103struct virtio_pci_notify_cap {
 104        struct virtio_pci_cap cap;
 105        __le32 notify_off_multiplier;   /* Multiplier for queue_notify_off */
 106};
 107
 108/* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
 109struct virtio_pci_common_cfg {
 110        /* About the whole device */
 111        __le32 device_feature_select;   /* read-write */
 112        __le32 device_feature;          /* read-only */
 113        __le32 guest_feature_select;    /* read-write */
 114        __le32 guest_feature;           /* read-write */
 115        __le16 msix_config;             /* read-write */
 116        __le16 num_queues;              /* read-only */
 117        __u8 device_status;             /* read-write */
 118        __u8 config_generation;         /* read-only */
 119
 120        /* About a specific virtqueue */
 121        __le16 queue_select;            /* read-write */
 122        __le16 queue_size;              /* read-write, power of 2 */
 123        __le16 queue_msix_vector;       /* read-write */
 124        __le16 queue_enable;            /* read-write */
 125        __le16 queue_notify_off;        /* read-only */
 126        __le32 queue_desc_lo;           /* read-write */
 127        __le32 queue_desc_hi;           /* read-write */
 128        __le32 queue_avail_lo;          /* read-write */
 129        __le32 queue_avail_hi;          /* read-write */
 130        __le32 queue_used_lo;           /* read-write */
 131        __le32 queue_used_hi;           /* read-write */
 132};
 133
 134/* Fields in VIRTIO_PCI_CAP_PCI_CFG: */
 135struct virtio_pci_cfg_cap {
 136        struct virtio_pci_cap cap;
 137        __u8 pci_cfg_data[4];           /* Data for BAR access */
 138};
 139
 140/* Macro versions of offsets for the Old Timers! */
 141#define VIRTIO_PCI_CAP_VNDR             0
 142#define VIRTIO_PCI_CAP_NEXT             1
 143#define VIRTIO_PCI_CAP_LEN              2
 144#define VIRTIO_PCI_CAP_CFG_TYPE         3
 145#define VIRTIO_PCI_CAP_BAR              4
 146#define VIRTIO_PCI_CAP_OFFSET           8
 147#define VIRTIO_PCI_CAP_LENGTH           12
 148
 149#define VIRTIO_PCI_NOTIFY_CAP_MULT      16
 150
 151#define VIRTIO_PCI_COMMON_DFSELECT      0
 152#define VIRTIO_PCI_COMMON_DF            4
 153#define VIRTIO_PCI_COMMON_GFSELECT      8
 154#define VIRTIO_PCI_COMMON_GF            12
 155#define VIRTIO_PCI_COMMON_MSIX          16
 156#define VIRTIO_PCI_COMMON_NUMQ          18
 157#define VIRTIO_PCI_COMMON_STATUS        20
 158#define VIRTIO_PCI_COMMON_CFGGENERATION 21
 159#define VIRTIO_PCI_COMMON_Q_SELECT      22
 160#define VIRTIO_PCI_COMMON_Q_SIZE        24
 161#define VIRTIO_PCI_COMMON_Q_MSIX        26
 162#define VIRTIO_PCI_COMMON_Q_ENABLE      28
 163#define VIRTIO_PCI_COMMON_Q_NOFF        30
 164#define VIRTIO_PCI_COMMON_Q_DESCLO      32
 165#define VIRTIO_PCI_COMMON_Q_DESCHI      36
 166#define VIRTIO_PCI_COMMON_Q_AVAILLO     40
 167#define VIRTIO_PCI_COMMON_Q_AVAILHI     44
 168#define VIRTIO_PCI_COMMON_Q_USEDLO      48
 169#define VIRTIO_PCI_COMMON_Q_USEDHI      52
 170
 171#endif /* VIRTIO_PCI_NO_MODERN */
 172
 173#endif /* _LINUX_VIRTIO_PCI_H */
 174