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