1edf5ca5dSMarkus Armbruster #ifndef QEMU_PCI_DEVICE_H 2edf5ca5dSMarkus Armbruster #define QEMU_PCI_DEVICE_H 3edf5ca5dSMarkus Armbruster 4edf5ca5dSMarkus Armbruster #include "hw/pci/pci.h" 5edf5ca5dSMarkus Armbruster #include "hw/pci/pcie.h" 64f947b10SWilfred Mallawa #include "hw/pci/pcie_doe.h" 7edf5ca5dSMarkus Armbruster 8edf5ca5dSMarkus Armbruster #define TYPE_PCI_DEVICE "pci-device" 9edf5ca5dSMarkus Armbruster typedef struct PCIDeviceClass PCIDeviceClass; 10edf5ca5dSMarkus Armbruster DECLARE_OBJ_CHECKERS(PCIDevice, PCIDeviceClass, 11edf5ca5dSMarkus Armbruster PCI_DEVICE, TYPE_PCI_DEVICE) 12edf5ca5dSMarkus Armbruster 13edf5ca5dSMarkus Armbruster /* 14edf5ca5dSMarkus Armbruster * Implemented by devices that can be plugged on CXL buses. In the spec, this is 15edf5ca5dSMarkus Armbruster * actually a "CXL Component, but we name it device to match the PCI naming. 16edf5ca5dSMarkus Armbruster */ 17edf5ca5dSMarkus Armbruster #define INTERFACE_CXL_DEVICE "cxl-device" 18edf5ca5dSMarkus Armbruster 19edf5ca5dSMarkus Armbruster /* Implemented by devices that can be plugged on PCI Express buses */ 20edf5ca5dSMarkus Armbruster #define INTERFACE_PCIE_DEVICE "pci-express-device" 21edf5ca5dSMarkus Armbruster 22edf5ca5dSMarkus Armbruster /* Implemented by devices that can be plugged on Conventional PCI buses */ 23edf5ca5dSMarkus Armbruster #define INTERFACE_CONVENTIONAL_PCI_DEVICE "conventional-pci-device" 24edf5ca5dSMarkus Armbruster 25edf5ca5dSMarkus Armbruster struct PCIDeviceClass { 26edf5ca5dSMarkus Armbruster DeviceClass parent_class; 27edf5ca5dSMarkus Armbruster 28edf5ca5dSMarkus Armbruster void (*realize)(PCIDevice *dev, Error **errp); 29edf5ca5dSMarkus Armbruster PCIUnregisterFunc *exit; 30edf5ca5dSMarkus Armbruster PCIConfigReadFunc *config_read; 31edf5ca5dSMarkus Armbruster PCIConfigWriteFunc *config_write; 32edf5ca5dSMarkus Armbruster 33edf5ca5dSMarkus Armbruster uint16_t vendor_id; 34edf5ca5dSMarkus Armbruster uint16_t device_id; 35edf5ca5dSMarkus Armbruster uint8_t revision; 36edf5ca5dSMarkus Armbruster uint16_t class_id; 37edf5ca5dSMarkus Armbruster uint16_t subsystem_vendor_id; /* only for header type = 0 */ 38edf5ca5dSMarkus Armbruster uint16_t subsystem_id; /* only for header type = 0 */ 39edf5ca5dSMarkus Armbruster 40edf5ca5dSMarkus Armbruster const char *romfile; /* rom bar */ 41edf5ca5dSMarkus Armbruster }; 42edf5ca5dSMarkus Armbruster 43edf5ca5dSMarkus Armbruster enum PCIReqIDType { 44edf5ca5dSMarkus Armbruster PCI_REQ_ID_INVALID = 0, 45edf5ca5dSMarkus Armbruster PCI_REQ_ID_BDF, 46edf5ca5dSMarkus Armbruster PCI_REQ_ID_SECONDARY_BUS, 47edf5ca5dSMarkus Armbruster PCI_REQ_ID_MAX, 48edf5ca5dSMarkus Armbruster }; 49edf5ca5dSMarkus Armbruster typedef enum PCIReqIDType PCIReqIDType; 50edf5ca5dSMarkus Armbruster 51edf5ca5dSMarkus Armbruster struct PCIReqIDCache { 52edf5ca5dSMarkus Armbruster PCIDevice *dev; 53edf5ca5dSMarkus Armbruster PCIReqIDType type; 54edf5ca5dSMarkus Armbruster }; 55edf5ca5dSMarkus Armbruster typedef struct PCIReqIDCache PCIReqIDCache; 56edf5ca5dSMarkus Armbruster 57edf5ca5dSMarkus Armbruster struct PCIDevice { 58edf5ca5dSMarkus Armbruster DeviceState qdev; 59edf5ca5dSMarkus Armbruster bool partially_hotplugged; 606a31b219SAkihiko Odaki bool enabled; 61edf5ca5dSMarkus Armbruster 62edf5ca5dSMarkus Armbruster /* PCI config space */ 63edf5ca5dSMarkus Armbruster uint8_t *config; 64edf5ca5dSMarkus Armbruster 65edf5ca5dSMarkus Armbruster /* 66edf5ca5dSMarkus Armbruster * Used to enable config checks on load. Note that writable bits are 67edf5ca5dSMarkus Armbruster * never checked even if set in cmask. 68edf5ca5dSMarkus Armbruster */ 69edf5ca5dSMarkus Armbruster uint8_t *cmask; 70edf5ca5dSMarkus Armbruster 71edf5ca5dSMarkus Armbruster /* Used to implement R/W bytes */ 72edf5ca5dSMarkus Armbruster uint8_t *wmask; 73edf5ca5dSMarkus Armbruster 74edf5ca5dSMarkus Armbruster /* Used to implement RW1C(Write 1 to Clear) bytes */ 75edf5ca5dSMarkus Armbruster uint8_t *w1cmask; 76edf5ca5dSMarkus Armbruster 77edf5ca5dSMarkus Armbruster /* Used to allocate config space for capabilities. */ 78edf5ca5dSMarkus Armbruster uint8_t *used; 79edf5ca5dSMarkus Armbruster 80edf5ca5dSMarkus Armbruster /* the following fields are read only */ 81edf5ca5dSMarkus Armbruster int32_t devfn; 82edf5ca5dSMarkus Armbruster /* 83edf5ca5dSMarkus Armbruster * Cached device to fetch requester ID from, to avoid the PCI tree 84edf5ca5dSMarkus Armbruster * walking every time we invoke PCI request (e.g., MSI). For 85edf5ca5dSMarkus Armbruster * conventional PCI root complex, this field is meaningless. 86edf5ca5dSMarkus Armbruster */ 87edf5ca5dSMarkus Armbruster PCIReqIDCache requester_id_cache; 88edf5ca5dSMarkus Armbruster char name[64]; 89edf5ca5dSMarkus Armbruster PCIIORegion io_regions[PCI_NUM_REGIONS]; 90edf5ca5dSMarkus Armbruster AddressSpace bus_master_as; 91edf5ca5dSMarkus Armbruster MemoryRegion bus_master_container_region; 92edf5ca5dSMarkus Armbruster MemoryRegion bus_master_enable_region; 93edf5ca5dSMarkus Armbruster 94edf5ca5dSMarkus Armbruster /* do not access the following fields */ 95edf5ca5dSMarkus Armbruster PCIConfigReadFunc *config_read; 96edf5ca5dSMarkus Armbruster PCIConfigWriteFunc *config_write; 97edf5ca5dSMarkus Armbruster 98edf5ca5dSMarkus Armbruster /* Legacy PCI VGA regions */ 99edf5ca5dSMarkus Armbruster MemoryRegion *vga_regions[QEMU_PCI_VGA_NUM_REGIONS]; 100edf5ca5dSMarkus Armbruster bool has_vga; 101edf5ca5dSMarkus Armbruster 102edf5ca5dSMarkus Armbruster /* Current IRQ levels. Used internally by the generic PCI code. */ 103edf5ca5dSMarkus Armbruster uint8_t irq_state; 104edf5ca5dSMarkus Armbruster 105edf5ca5dSMarkus Armbruster /* Capability bits */ 106edf5ca5dSMarkus Armbruster uint32_t cap_present; 107edf5ca5dSMarkus Armbruster 108edf5ca5dSMarkus Armbruster /* Offset of MSI-X capability in config space */ 109edf5ca5dSMarkus Armbruster uint8_t msix_cap; 110edf5ca5dSMarkus Armbruster 111edf5ca5dSMarkus Armbruster /* MSI-X entries */ 112edf5ca5dSMarkus Armbruster int msix_entries_nr; 113edf5ca5dSMarkus Armbruster 114edf5ca5dSMarkus Armbruster /* Space to store MSIX table & pending bit array */ 115edf5ca5dSMarkus Armbruster uint8_t *msix_table; 116edf5ca5dSMarkus Armbruster uint8_t *msix_pba; 117edf5ca5dSMarkus Armbruster 118edf5ca5dSMarkus Armbruster /* May be used by INTx or MSI during interrupt notification */ 119edf5ca5dSMarkus Armbruster void *irq_opaque; 120edf5ca5dSMarkus Armbruster 121edf5ca5dSMarkus Armbruster MSITriggerFunc *msi_trigger; 122edf5ca5dSMarkus Armbruster MSIPrepareMessageFunc *msi_prepare_message; 123edf5ca5dSMarkus Armbruster MSIxPrepareMessageFunc *msix_prepare_message; 124edf5ca5dSMarkus Armbruster 125edf5ca5dSMarkus Armbruster /* MemoryRegion container for msix exclusive BAR setup */ 126edf5ca5dSMarkus Armbruster MemoryRegion msix_exclusive_bar; 127edf5ca5dSMarkus Armbruster /* Memory Regions for MSIX table and pending bit entries. */ 128edf5ca5dSMarkus Armbruster MemoryRegion msix_table_mmio; 129edf5ca5dSMarkus Armbruster MemoryRegion msix_pba_mmio; 130edf5ca5dSMarkus Armbruster /* Reference-count for entries actually in use by driver. */ 131edf5ca5dSMarkus Armbruster unsigned *msix_entry_used; 132edf5ca5dSMarkus Armbruster /* MSIX function mask set or MSIX disabled */ 133edf5ca5dSMarkus Armbruster bool msix_function_masked; 134edf5ca5dSMarkus Armbruster /* Version id needed for VMState */ 135edf5ca5dSMarkus Armbruster int32_t version_id; 136edf5ca5dSMarkus Armbruster 137edf5ca5dSMarkus Armbruster /* Offset of MSI capability in config space */ 138edf5ca5dSMarkus Armbruster uint8_t msi_cap; 139edf5ca5dSMarkus Armbruster 140edf5ca5dSMarkus Armbruster /* PCI Express */ 141edf5ca5dSMarkus Armbruster PCIExpressDevice exp; 142edf5ca5dSMarkus Armbruster 143edf5ca5dSMarkus Armbruster /* SHPC */ 144edf5ca5dSMarkus Armbruster SHPCDevice *shpc; 145edf5ca5dSMarkus Armbruster 146edf5ca5dSMarkus Armbruster /* Location of option rom */ 147edf5ca5dSMarkus Armbruster char *romfile; 148edf5ca5dSMarkus Armbruster uint32_t romsize; 149edf5ca5dSMarkus Armbruster bool has_rom; 150edf5ca5dSMarkus Armbruster MemoryRegion rom; 151edf5ca5dSMarkus Armbruster uint32_t rom_bar; 152edf5ca5dSMarkus Armbruster 153edf5ca5dSMarkus Armbruster /* INTx routing notifier */ 154edf5ca5dSMarkus Armbruster PCIINTxRoutingNotifier intx_routing_notifier; 155edf5ca5dSMarkus Armbruster 156edf5ca5dSMarkus Armbruster /* MSI-X notifiers */ 157edf5ca5dSMarkus Armbruster MSIVectorUseNotifier msix_vector_use_notifier; 158edf5ca5dSMarkus Armbruster MSIVectorReleaseNotifier msix_vector_release_notifier; 159edf5ca5dSMarkus Armbruster MSIVectorPollNotifier msix_vector_poll_notifier; 160edf5ca5dSMarkus Armbruster 1614f947b10SWilfred Mallawa /* SPDM */ 1624f947b10SWilfred Mallawa uint16_t spdm_port; 1634f947b10SWilfred Mallawa 1644f947b10SWilfred Mallawa /* DOE */ 1654f947b10SWilfred Mallawa DOECap doe_spdm; 1664f947b10SWilfred Mallawa 167edf5ca5dSMarkus Armbruster /* ID of standby device in net_failover pair */ 168edf5ca5dSMarkus Armbruster char *failover_pair_id; 169edf5ca5dSMarkus Armbruster uint32_t acpi_index; 170edf5ca5dSMarkus Armbruster }; 171edf5ca5dSMarkus Armbruster 172edf5ca5dSMarkus Armbruster static inline int pci_intx(PCIDevice *pci_dev) 173edf5ca5dSMarkus Armbruster { 174edf5ca5dSMarkus Armbruster return pci_get_byte(pci_dev->config + PCI_INTERRUPT_PIN) - 1; 175edf5ca5dSMarkus Armbruster } 176edf5ca5dSMarkus Armbruster 177edf5ca5dSMarkus Armbruster static inline int pci_is_cxl(const PCIDevice *d) 178edf5ca5dSMarkus Armbruster { 179edf5ca5dSMarkus Armbruster return d->cap_present & QEMU_PCIE_CAP_CXL; 180edf5ca5dSMarkus Armbruster } 181edf5ca5dSMarkus Armbruster 182edf5ca5dSMarkus Armbruster static inline int pci_is_express(const PCIDevice *d) 183edf5ca5dSMarkus Armbruster { 184edf5ca5dSMarkus Armbruster return d->cap_present & QEMU_PCI_CAP_EXPRESS; 185edf5ca5dSMarkus Armbruster } 186edf5ca5dSMarkus Armbruster 187edf5ca5dSMarkus Armbruster static inline int pci_is_express_downstream_port(const PCIDevice *d) 188edf5ca5dSMarkus Armbruster { 189edf5ca5dSMarkus Armbruster uint8_t type; 190edf5ca5dSMarkus Armbruster 191edf5ca5dSMarkus Armbruster if (!pci_is_express(d) || !d->exp.exp_cap) { 192edf5ca5dSMarkus Armbruster return 0; 193edf5ca5dSMarkus Armbruster } 194edf5ca5dSMarkus Armbruster 195edf5ca5dSMarkus Armbruster type = pcie_cap_get_type(d); 196edf5ca5dSMarkus Armbruster 197edf5ca5dSMarkus Armbruster return type == PCI_EXP_TYPE_DOWNSTREAM || type == PCI_EXP_TYPE_ROOT_PORT; 198edf5ca5dSMarkus Armbruster } 199edf5ca5dSMarkus Armbruster 200edf5ca5dSMarkus Armbruster static inline int pci_is_vf(const PCIDevice *d) 201edf5ca5dSMarkus Armbruster { 202*aa01c491SMichael S. Tsirkin return d->exp.sriov_vf.pf != NULL; 203edf5ca5dSMarkus Armbruster } 204edf5ca5dSMarkus Armbruster 205edf5ca5dSMarkus Armbruster static inline uint32_t pci_config_size(const PCIDevice *d) 206edf5ca5dSMarkus Armbruster { 207edf5ca5dSMarkus Armbruster return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE; 208edf5ca5dSMarkus Armbruster } 209edf5ca5dSMarkus Armbruster 210edf5ca5dSMarkus Armbruster static inline uint16_t pci_get_bdf(PCIDevice *dev) 211edf5ca5dSMarkus Armbruster { 212edf5ca5dSMarkus Armbruster return PCI_BUILD_BDF(pci_bus_num(pci_get_bus(dev)), dev->devfn); 213edf5ca5dSMarkus Armbruster } 214edf5ca5dSMarkus Armbruster 215139610aeSAkihiko Odaki static inline void pci_set_power(PCIDevice *pci_dev, bool state) 216139610aeSAkihiko Odaki { 217139610aeSAkihiko Odaki /* 218139610aeSAkihiko Odaki * Don't change the enabled state of VFs when powering on/off the device. 219139610aeSAkihiko Odaki * 220139610aeSAkihiko Odaki * When powering on, VFs must not be enabled immediately but they must 221139610aeSAkihiko Odaki * wait until the guest configures SR-IOV. 222139610aeSAkihiko Odaki * When powering off, their corresponding PFs will be reset and disable 223139610aeSAkihiko Odaki * VFs. 224139610aeSAkihiko Odaki */ 225139610aeSAkihiko Odaki if (!pci_is_vf(pci_dev)) { 226139610aeSAkihiko Odaki pci_set_enabled(pci_dev, state); 227139610aeSAkihiko Odaki } 228139610aeSAkihiko Odaki } 229139610aeSAkihiko Odaki 230edf5ca5dSMarkus Armbruster uint16_t pci_requester_id(PCIDevice *dev); 231edf5ca5dSMarkus Armbruster 232edf5ca5dSMarkus Armbruster /* DMA access functions */ 233edf5ca5dSMarkus Armbruster static inline AddressSpace *pci_get_address_space(PCIDevice *dev) 234edf5ca5dSMarkus Armbruster { 235edf5ca5dSMarkus Armbruster return &dev->bus_master_as; 236edf5ca5dSMarkus Armbruster } 237edf5ca5dSMarkus Armbruster 238edf5ca5dSMarkus Armbruster /** 239edf5ca5dSMarkus Armbruster * pci_dma_rw: Read from or write to an address space from PCI device. 240edf5ca5dSMarkus Armbruster * 241edf5ca5dSMarkus Armbruster * Return a MemTxResult indicating whether the operation succeeded 242edf5ca5dSMarkus Armbruster * or failed (eg unassigned memory, device rejected the transaction, 243edf5ca5dSMarkus Armbruster * IOMMU fault). 244edf5ca5dSMarkus Armbruster * 245edf5ca5dSMarkus Armbruster * @dev: #PCIDevice doing the memory access 246edf5ca5dSMarkus Armbruster * @addr: address within the #PCIDevice address space 247edf5ca5dSMarkus Armbruster * @buf: buffer with the data transferred 248edf5ca5dSMarkus Armbruster * @len: the number of bytes to read or write 249edf5ca5dSMarkus Armbruster * @dir: indicates the transfer direction 250edf5ca5dSMarkus Armbruster */ 251edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr, 252edf5ca5dSMarkus Armbruster void *buf, dma_addr_t len, 253edf5ca5dSMarkus Armbruster DMADirection dir, MemTxAttrs attrs) 254edf5ca5dSMarkus Armbruster { 255edf5ca5dSMarkus Armbruster return dma_memory_rw(pci_get_address_space(dev), addr, buf, len, 256edf5ca5dSMarkus Armbruster dir, attrs); 257edf5ca5dSMarkus Armbruster } 258edf5ca5dSMarkus Armbruster 259edf5ca5dSMarkus Armbruster /** 260edf5ca5dSMarkus Armbruster * pci_dma_read: Read from an address space from PCI device. 261edf5ca5dSMarkus Armbruster * 262edf5ca5dSMarkus Armbruster * Return a MemTxResult indicating whether the operation succeeded 263edf5ca5dSMarkus Armbruster * or failed (eg unassigned memory, device rejected the transaction, 264edf5ca5dSMarkus Armbruster * IOMMU fault). Called within RCU critical section. 265edf5ca5dSMarkus Armbruster * 266edf5ca5dSMarkus Armbruster * @dev: #PCIDevice doing the memory access 267edf5ca5dSMarkus Armbruster * @addr: address within the #PCIDevice address space 268edf5ca5dSMarkus Armbruster * @buf: buffer with the data transferred 269edf5ca5dSMarkus Armbruster * @len: length of the data transferred 270edf5ca5dSMarkus Armbruster */ 271edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr, 272edf5ca5dSMarkus Armbruster void *buf, dma_addr_t len) 273edf5ca5dSMarkus Armbruster { 274edf5ca5dSMarkus Armbruster return pci_dma_rw(dev, addr, buf, len, 275edf5ca5dSMarkus Armbruster DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED); 276edf5ca5dSMarkus Armbruster } 277edf5ca5dSMarkus Armbruster 278edf5ca5dSMarkus Armbruster /** 279edf5ca5dSMarkus Armbruster * pci_dma_write: Write to address space from PCI device. 280edf5ca5dSMarkus Armbruster * 281edf5ca5dSMarkus Armbruster * Return a MemTxResult indicating whether the operation succeeded 282edf5ca5dSMarkus Armbruster * or failed (eg unassigned memory, device rejected the transaction, 283edf5ca5dSMarkus Armbruster * IOMMU fault). 284edf5ca5dSMarkus Armbruster * 285edf5ca5dSMarkus Armbruster * @dev: #PCIDevice doing the memory access 286edf5ca5dSMarkus Armbruster * @addr: address within the #PCIDevice address space 287edf5ca5dSMarkus Armbruster * @buf: buffer with the data transferred 288edf5ca5dSMarkus Armbruster * @len: the number of bytes to write 289edf5ca5dSMarkus Armbruster */ 290edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr, 291edf5ca5dSMarkus Armbruster const void *buf, dma_addr_t len) 292edf5ca5dSMarkus Armbruster { 293edf5ca5dSMarkus Armbruster return pci_dma_rw(dev, addr, (void *) buf, len, 294edf5ca5dSMarkus Armbruster DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED); 295edf5ca5dSMarkus Armbruster } 296edf5ca5dSMarkus Armbruster 297edf5ca5dSMarkus Armbruster #define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \ 298edf5ca5dSMarkus Armbruster static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \ 299edf5ca5dSMarkus Armbruster dma_addr_t addr, \ 300edf5ca5dSMarkus Armbruster uint##_bits##_t *val, \ 301edf5ca5dSMarkus Armbruster MemTxAttrs attrs) \ 302edf5ca5dSMarkus Armbruster { \ 303edf5ca5dSMarkus Armbruster return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \ 304edf5ca5dSMarkus Armbruster } \ 305edf5ca5dSMarkus Armbruster static inline MemTxResult st##_s##_pci_dma(PCIDevice *dev, \ 306edf5ca5dSMarkus Armbruster dma_addr_t addr, \ 307edf5ca5dSMarkus Armbruster uint##_bits##_t val, \ 308edf5ca5dSMarkus Armbruster MemTxAttrs attrs) \ 309edf5ca5dSMarkus Armbruster { \ 310edf5ca5dSMarkus Armbruster return st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \ 311edf5ca5dSMarkus Armbruster } 312edf5ca5dSMarkus Armbruster 313edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(ub, b, 8); 314edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(uw_le, w_le, 16) 315edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(l_le, l_le, 32); 316edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(q_le, q_le, 64); 317edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(uw_be, w_be, 16) 318edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(l_be, l_be, 32); 319edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(q_be, q_be, 64); 320edf5ca5dSMarkus Armbruster 321edf5ca5dSMarkus Armbruster #undef PCI_DMA_DEFINE_LDST 322edf5ca5dSMarkus Armbruster 323edf5ca5dSMarkus Armbruster /** 324edf5ca5dSMarkus Armbruster * pci_dma_map: Map device PCI address space range into host virtual address 325edf5ca5dSMarkus Armbruster * @dev: #PCIDevice to be accessed 326edf5ca5dSMarkus Armbruster * @addr: address within that device's address space 327edf5ca5dSMarkus Armbruster * @plen: pointer to length of buffer; updated on return to indicate 328edf5ca5dSMarkus Armbruster * if only a subset of the requested range has been mapped 329edf5ca5dSMarkus Armbruster * @dir: indicates the transfer direction 330edf5ca5dSMarkus Armbruster * 331edf5ca5dSMarkus Armbruster * Return: A host pointer, or %NULL if the resources needed to 332edf5ca5dSMarkus Armbruster * perform the mapping are exhausted (in that case *@plen 333edf5ca5dSMarkus Armbruster * is set to zero). 334edf5ca5dSMarkus Armbruster */ 335edf5ca5dSMarkus Armbruster static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr, 336edf5ca5dSMarkus Armbruster dma_addr_t *plen, DMADirection dir) 337edf5ca5dSMarkus Armbruster { 338edf5ca5dSMarkus Armbruster return dma_memory_map(pci_get_address_space(dev), addr, plen, dir, 339edf5ca5dSMarkus Armbruster MEMTXATTRS_UNSPECIFIED); 340edf5ca5dSMarkus Armbruster } 341edf5ca5dSMarkus Armbruster 342edf5ca5dSMarkus Armbruster static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len, 343edf5ca5dSMarkus Armbruster DMADirection dir, dma_addr_t access_len) 344edf5ca5dSMarkus Armbruster { 345edf5ca5dSMarkus Armbruster dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len); 346edf5ca5dSMarkus Armbruster } 347edf5ca5dSMarkus Armbruster 348edf5ca5dSMarkus Armbruster static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev, 349edf5ca5dSMarkus Armbruster int alloc_hint) 350edf5ca5dSMarkus Armbruster { 351edf5ca5dSMarkus Armbruster qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev)); 352edf5ca5dSMarkus Armbruster } 353edf5ca5dSMarkus Armbruster 354edf5ca5dSMarkus Armbruster extern const VMStateDescription vmstate_pci_device; 355edf5ca5dSMarkus Armbruster 356edf5ca5dSMarkus Armbruster #define VMSTATE_PCI_DEVICE(_field, _state) { \ 357edf5ca5dSMarkus Armbruster .name = (stringify(_field)), \ 358edf5ca5dSMarkus Armbruster .size = sizeof(PCIDevice), \ 359edf5ca5dSMarkus Armbruster .vmsd = &vmstate_pci_device, \ 360edf5ca5dSMarkus Armbruster .flags = VMS_STRUCT, \ 361edf5ca5dSMarkus Armbruster .offset = vmstate_offset_value(_state, _field, PCIDevice), \ 362edf5ca5dSMarkus Armbruster } 363edf5ca5dSMarkus Armbruster 364edf5ca5dSMarkus Armbruster #define VMSTATE_PCI_DEVICE_POINTER(_field, _state) { \ 365edf5ca5dSMarkus Armbruster .name = (stringify(_field)), \ 366edf5ca5dSMarkus Armbruster .size = sizeof(PCIDevice), \ 367edf5ca5dSMarkus Armbruster .vmsd = &vmstate_pci_device, \ 368edf5ca5dSMarkus Armbruster .flags = VMS_STRUCT | VMS_POINTER, \ 369edf5ca5dSMarkus Armbruster .offset = vmstate_offset_pointer(_state, _field, PCIDevice), \ 370edf5ca5dSMarkus Armbruster } 371edf5ca5dSMarkus Armbruster 372edf5ca5dSMarkus Armbruster #endif 373