xref: /openbmc/qemu/include/hw/pci/pci_device.h (revision edf5ca5d)
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 
pci_intx(PCIDevice * pci_dev)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 
pci_is_cxl(const PCIDevice * d)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 
pci_is_express(const PCIDevice * d)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 
pci_is_express_downstream_port(const PCIDevice * d)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 
pci_is_vf(const PCIDevice * d)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 
pci_config_size(const PCIDevice * d)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 
pci_get_bdf(PCIDevice * dev)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 */
pci_get_address_space(PCIDevice * dev)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  */
pci_dma_rw(PCIDevice * dev,dma_addr_t addr,void * buf,dma_addr_t len,DMADirection dir,MemTxAttrs attrs)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  */
pci_dma_read(PCIDevice * dev,dma_addr_t addr,void * buf,dma_addr_t len)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  */
pci_dma_write(PCIDevice * dev,dma_addr_t addr,const void * buf,dma_addr_t len)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  */
pci_dma_map(PCIDevice * dev,dma_addr_t addr,dma_addr_t * plen,DMADirection dir)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 
pci_dma_unmap(PCIDevice * dev,void * buffer,dma_addr_t len,DMADirection dir,dma_addr_t access_len)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 
pci_dma_sglist_init(QEMUSGList * qsg,PCIDevice * dev,int alloc_hint)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