xref: /qemu/include/hw/pci/pci_device.h (revision 139610ae67f6ecf92127bb7bf53ac6265b459ec8)
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;
596a31b219SAkihiko 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 
208*139610aeSAkihiko Odaki static inline void pci_set_power(PCIDevice *pci_dev, bool state)
209*139610aeSAkihiko Odaki {
210*139610aeSAkihiko Odaki     /*
211*139610aeSAkihiko Odaki      * Don't change the enabled state of VFs when powering on/off the device.
212*139610aeSAkihiko Odaki      *
213*139610aeSAkihiko Odaki      * When powering on, VFs must not be enabled immediately but they must
214*139610aeSAkihiko Odaki      * wait until the guest configures SR-IOV.
215*139610aeSAkihiko Odaki      * When powering off, their corresponding PFs will be reset and disable
216*139610aeSAkihiko Odaki      * VFs.
217*139610aeSAkihiko Odaki      */
218*139610aeSAkihiko Odaki     if (!pci_is_vf(pci_dev)) {
219*139610aeSAkihiko Odaki         pci_set_enabled(pci_dev, state);
220*139610aeSAkihiko Odaki     }
221*139610aeSAkihiko Odaki }
222*139610aeSAkihiko Odaki 
223edf5ca5dSMarkus Armbruster uint16_t pci_requester_id(PCIDevice *dev);
224edf5ca5dSMarkus Armbruster 
225edf5ca5dSMarkus Armbruster /* DMA access functions */
226edf5ca5dSMarkus Armbruster static inline AddressSpace *pci_get_address_space(PCIDevice *dev)
227edf5ca5dSMarkus Armbruster {
228edf5ca5dSMarkus Armbruster     return &dev->bus_master_as;
229edf5ca5dSMarkus Armbruster }
230edf5ca5dSMarkus Armbruster 
231edf5ca5dSMarkus Armbruster /**
232edf5ca5dSMarkus Armbruster  * pci_dma_rw: Read from or write to an address space from PCI device.
233edf5ca5dSMarkus Armbruster  *
234edf5ca5dSMarkus Armbruster  * Return a MemTxResult indicating whether the operation succeeded
235edf5ca5dSMarkus Armbruster  * or failed (eg unassigned memory, device rejected the transaction,
236edf5ca5dSMarkus Armbruster  * IOMMU fault).
237edf5ca5dSMarkus Armbruster  *
238edf5ca5dSMarkus Armbruster  * @dev: #PCIDevice doing the memory access
239edf5ca5dSMarkus Armbruster  * @addr: address within the #PCIDevice address space
240edf5ca5dSMarkus Armbruster  * @buf: buffer with the data transferred
241edf5ca5dSMarkus Armbruster  * @len: the number of bytes to read or write
242edf5ca5dSMarkus Armbruster  * @dir: indicates the transfer direction
243edf5ca5dSMarkus Armbruster  */
244edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_rw(PCIDevice *dev, dma_addr_t addr,
245edf5ca5dSMarkus Armbruster                                      void *buf, dma_addr_t len,
246edf5ca5dSMarkus Armbruster                                      DMADirection dir, MemTxAttrs attrs)
247edf5ca5dSMarkus Armbruster {
248edf5ca5dSMarkus Armbruster     return dma_memory_rw(pci_get_address_space(dev), addr, buf, len,
249edf5ca5dSMarkus Armbruster                          dir, attrs);
250edf5ca5dSMarkus Armbruster }
251edf5ca5dSMarkus Armbruster 
252edf5ca5dSMarkus Armbruster /**
253edf5ca5dSMarkus Armbruster  * pci_dma_read: Read from an address space from PCI device.
254edf5ca5dSMarkus Armbruster  *
255edf5ca5dSMarkus Armbruster  * Return a MemTxResult indicating whether the operation succeeded
256edf5ca5dSMarkus Armbruster  * or failed (eg unassigned memory, device rejected the transaction,
257edf5ca5dSMarkus Armbruster  * IOMMU fault).  Called within RCU critical section.
258edf5ca5dSMarkus Armbruster  *
259edf5ca5dSMarkus Armbruster  * @dev: #PCIDevice doing the memory access
260edf5ca5dSMarkus Armbruster  * @addr: address within the #PCIDevice address space
261edf5ca5dSMarkus Armbruster  * @buf: buffer with the data transferred
262edf5ca5dSMarkus Armbruster  * @len: length of the data transferred
263edf5ca5dSMarkus Armbruster  */
264edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_read(PCIDevice *dev, dma_addr_t addr,
265edf5ca5dSMarkus Armbruster                                        void *buf, dma_addr_t len)
266edf5ca5dSMarkus Armbruster {
267edf5ca5dSMarkus Armbruster     return pci_dma_rw(dev, addr, buf, len,
268edf5ca5dSMarkus Armbruster                       DMA_DIRECTION_TO_DEVICE, MEMTXATTRS_UNSPECIFIED);
269edf5ca5dSMarkus Armbruster }
270edf5ca5dSMarkus Armbruster 
271edf5ca5dSMarkus Armbruster /**
272edf5ca5dSMarkus Armbruster  * pci_dma_write: Write to address space from PCI device.
273edf5ca5dSMarkus Armbruster  *
274edf5ca5dSMarkus Armbruster  * Return a MemTxResult indicating whether the operation succeeded
275edf5ca5dSMarkus Armbruster  * or failed (eg unassigned memory, device rejected the transaction,
276edf5ca5dSMarkus Armbruster  * IOMMU fault).
277edf5ca5dSMarkus Armbruster  *
278edf5ca5dSMarkus Armbruster  * @dev: #PCIDevice doing the memory access
279edf5ca5dSMarkus Armbruster  * @addr: address within the #PCIDevice address space
280edf5ca5dSMarkus Armbruster  * @buf: buffer with the data transferred
281edf5ca5dSMarkus Armbruster  * @len: the number of bytes to write
282edf5ca5dSMarkus Armbruster  */
283edf5ca5dSMarkus Armbruster static inline MemTxResult pci_dma_write(PCIDevice *dev, dma_addr_t addr,
284edf5ca5dSMarkus Armbruster                                         const void *buf, dma_addr_t len)
285edf5ca5dSMarkus Armbruster {
286edf5ca5dSMarkus Armbruster     return pci_dma_rw(dev, addr, (void *) buf, len,
287edf5ca5dSMarkus Armbruster                       DMA_DIRECTION_FROM_DEVICE, MEMTXATTRS_UNSPECIFIED);
288edf5ca5dSMarkus Armbruster }
289edf5ca5dSMarkus Armbruster 
290edf5ca5dSMarkus Armbruster #define PCI_DMA_DEFINE_LDST(_l, _s, _bits) \
291edf5ca5dSMarkus Armbruster     static inline MemTxResult ld##_l##_pci_dma(PCIDevice *dev, \
292edf5ca5dSMarkus Armbruster                                                dma_addr_t addr, \
293edf5ca5dSMarkus Armbruster                                                uint##_bits##_t *val, \
294edf5ca5dSMarkus Armbruster                                                MemTxAttrs attrs) \
295edf5ca5dSMarkus Armbruster     { \
296edf5ca5dSMarkus Armbruster         return ld##_l##_dma(pci_get_address_space(dev), addr, val, attrs); \
297edf5ca5dSMarkus Armbruster     } \
298edf5ca5dSMarkus Armbruster     static inline MemTxResult st##_s##_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 st##_s##_dma(pci_get_address_space(dev), addr, val, attrs); \
304edf5ca5dSMarkus Armbruster     }
305edf5ca5dSMarkus Armbruster 
306edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(ub, b, 8);
307edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(uw_le, w_le, 16)
308edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(l_le, l_le, 32);
309edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(q_le, q_le, 64);
310edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(uw_be, w_be, 16)
311edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(l_be, l_be, 32);
312edf5ca5dSMarkus Armbruster PCI_DMA_DEFINE_LDST(q_be, q_be, 64);
313edf5ca5dSMarkus Armbruster 
314edf5ca5dSMarkus Armbruster #undef PCI_DMA_DEFINE_LDST
315edf5ca5dSMarkus Armbruster 
316edf5ca5dSMarkus Armbruster /**
317edf5ca5dSMarkus Armbruster  * pci_dma_map: Map device PCI address space range into host virtual address
318edf5ca5dSMarkus Armbruster  * @dev: #PCIDevice to be accessed
319edf5ca5dSMarkus Armbruster  * @addr: address within that device's address space
320edf5ca5dSMarkus Armbruster  * @plen: pointer to length of buffer; updated on return to indicate
321edf5ca5dSMarkus Armbruster  *        if only a subset of the requested range has been mapped
322edf5ca5dSMarkus Armbruster  * @dir: indicates the transfer direction
323edf5ca5dSMarkus Armbruster  *
324edf5ca5dSMarkus Armbruster  * Return: A host pointer, or %NULL if the resources needed to
325edf5ca5dSMarkus Armbruster  *         perform the mapping are exhausted (in that case *@plen
326edf5ca5dSMarkus Armbruster  *         is set to zero).
327edf5ca5dSMarkus Armbruster  */
328edf5ca5dSMarkus Armbruster static inline void *pci_dma_map(PCIDevice *dev, dma_addr_t addr,
329edf5ca5dSMarkus Armbruster                                 dma_addr_t *plen, DMADirection dir)
330edf5ca5dSMarkus Armbruster {
331edf5ca5dSMarkus Armbruster     return dma_memory_map(pci_get_address_space(dev), addr, plen, dir,
332edf5ca5dSMarkus Armbruster                           MEMTXATTRS_UNSPECIFIED);
333edf5ca5dSMarkus Armbruster }
334edf5ca5dSMarkus Armbruster 
335edf5ca5dSMarkus Armbruster static inline void pci_dma_unmap(PCIDevice *dev, void *buffer, dma_addr_t len,
336edf5ca5dSMarkus Armbruster                                  DMADirection dir, dma_addr_t access_len)
337edf5ca5dSMarkus Armbruster {
338edf5ca5dSMarkus Armbruster     dma_memory_unmap(pci_get_address_space(dev), buffer, len, dir, access_len);
339edf5ca5dSMarkus Armbruster }
340edf5ca5dSMarkus Armbruster 
341edf5ca5dSMarkus Armbruster static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev,
342edf5ca5dSMarkus Armbruster                                        int alloc_hint)
343edf5ca5dSMarkus Armbruster {
344edf5ca5dSMarkus Armbruster     qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
345edf5ca5dSMarkus Armbruster }
346edf5ca5dSMarkus Armbruster 
347edf5ca5dSMarkus Armbruster extern const VMStateDescription vmstate_pci_device;
348edf5ca5dSMarkus Armbruster 
349edf5ca5dSMarkus Armbruster #define VMSTATE_PCI_DEVICE(_field, _state) {                         \
350edf5ca5dSMarkus Armbruster     .name       = (stringify(_field)),                               \
351edf5ca5dSMarkus Armbruster     .size       = sizeof(PCIDevice),                                 \
352edf5ca5dSMarkus Armbruster     .vmsd       = &vmstate_pci_device,                               \
353edf5ca5dSMarkus Armbruster     .flags      = VMS_STRUCT,                                        \
354edf5ca5dSMarkus Armbruster     .offset     = vmstate_offset_value(_state, _field, PCIDevice),   \
355edf5ca5dSMarkus Armbruster }
356edf5ca5dSMarkus Armbruster 
357edf5ca5dSMarkus Armbruster #define VMSTATE_PCI_DEVICE_POINTER(_field, _state) {                 \
358edf5ca5dSMarkus Armbruster     .name       = (stringify(_field)),                               \
359edf5ca5dSMarkus Armbruster     .size       = sizeof(PCIDevice),                                 \
360edf5ca5dSMarkus Armbruster     .vmsd       = &vmstate_pci_device,                               \
361edf5ca5dSMarkus Armbruster     .flags      = VMS_STRUCT | VMS_POINTER,                          \
362edf5ca5dSMarkus Armbruster     .offset     = vmstate_offset_pointer(_state, _field, PCIDevice), \
363edf5ca5dSMarkus Armbruster }
364edf5ca5dSMarkus Armbruster 
365edf5ca5dSMarkus Armbruster #endif
366