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