VirtualBox

source: vbox/trunk/include/VBox/vmm/pdmpci.h@ 63648

Last change on this file since 63648 was 62984, checked in by vboxsync, 8 years ago

DrvPciRaw.cpp/PDMIPCIRAWUP: warnings and adjustments.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 15.7 KB
Line 
1/** @file
2 * PDM - Pluggable Device Manager, raw PCI Devices. (VMM)
3 */
4
5/*
6 * Copyright (C) 2010-2016 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_vmm_pdmpci_h
27#define ___VBox_vmm_pdmpci_h
28
29#include <VBox/types.h>
30#include <VBox/rawpci.h>
31
32RT_C_DECLS_BEGIN
33
34/** @defgroup grp_pdm_pcidev The raw PCI Devices API
35 * @ingroup grp_pdm
36 * @{
37 */
38
39typedef struct PDMIPCIRAW *PPDMIPCIRAW;
40typedef struct PDMIPCIRAW
41{
42 /**
43 * Notify virtual device that interrupt has arrived.
44 * For this callback to be called, interface have to be
45 * registered with PDMIPCIRAWUP::pfnRegisterInterruptListener.
46 *
47 * @note no level parameter, as we can only support flip-flop.
48 *
49 * @param pInterface Pointer to this interface structure.
50 * @param iGuestIrq Guest interrupt number, passed earlier when registering listener.
51 *
52 * @thread Any thread.
53 */
54 DECLR3CALLBACKMEMBER(int, pfnInterruptRequest,(PPDMIPCIRAW pInterface, int32_t iGuestIrq));
55} PDMIPCIRAW;
56
57typedef struct PDMIPCIRAWUP *PPDMIPCIRAWUP;
58typedef struct PDMIPCIRAWUP
59{
60 /**
61 * Host PCI MMIO access function.
62 */
63
64 /**
65 * Request driver info about PCI region on host PCI device.
66 *
67 * @returns true, if region is present, and out parameters are correct
68 * @param pInterface Pointer to this interface structure.
69 * @param iRegion Region number.
70 * @param pGCPhysRegion Where to store region base address (guest).
71 * @param pcbRegion Where to store region size.
72 *
73 * @param fMmio If region is MMIO or IO.
74 * @thread Any thread.
75 */
76 DECLR3CALLBACKMEMBER(bool, pfnGetRegionInfo, (PPDMIPCIRAWUP pInterface,
77 uint32_t iRegion,
78 RTGCPHYS *pGCPhysRegion,
79 uint64_t *pcbRegion,
80 uint32_t *pfFlags));
81
82 /**
83 * Request driver to map part of host device's MMIO region to the VM process and maybe kernel.
84 * Shall only be issued within earlier obtained with pfnGetRegionInfo()
85 * host physical address ranges for the device BARs. Even if failed, device still may function
86 * using pfnMmio* and pfnPio* operations, just much slower.
87 *
88 * @returns status code
89 * @param pInterface Pointer to this interface structure.
90 * @param iRegion Number of the region.
91 * @param StartAddress Host physical address of start.
92 * @param cbRegion Size of the region.
93 * @param fFlags Flags, currently lowest significant bit set if R0 mapping requested too
94 * @param ppvAddressR3 Where to store mapped region address for R3 (can be 0, if cannot map into userland)
95 * @param ppvAddressR0 Where to store mapped region address for R0 (can be 0, if cannot map into kernel)
96 *
97 * @thread Any thread.
98 */
99 DECLR3CALLBACKMEMBER(int, pfnMapRegion, (PPDMIPCIRAWUP pInterface,
100 uint32_t iRegion,
101 RTHCPHYS StartAddress,
102 uint64_t cbRegion,
103 uint32_t fFlags,
104 PRTR3PTR ppvAddressR3,
105 PRTR0PTR ppvAddressR0));
106
107 /**
108 * Request driver to unmap part of host device's MMIO region to the VM process.
109 * Shall only be issued with pointer earlier obtained with pfnMapRegion().
110 *
111 * @returns status code
112 * @param pInterface Pointer to this interface structure
113 * @param iRegion Number of the region.
114 * @param StartAddress Host physical address of start.
115 * @param cbRegion Size of the region.
116 * @param pvAddressR3 R3 address of mapped region.
117 * @param pvAddressR0 R0 address of mapped region.
118 *
119 * @thread Any thread.
120 */
121 DECLR3CALLBACKMEMBER(int, pfnUnmapRegion, (PPDMIPCIRAWUP pInterface,
122 uint32_t iRegion,
123 RTHCPHYS StartAddress,
124 uint64_t cbRegion,
125 RTR3PTR pvAddressR3,
126 RTR0PTR pvAddressR0));
127
128 /**
129 * Request port IO write.
130 *
131 * @returns status code
132 * @param pInterface Pointer to this interface structure.
133 * @param uPort I/O port address.
134 * @param uValue Value to write.
135 * @param cb Access width.
136 *
137 * @thread EMT thread.
138 */
139 DECLR3CALLBACKMEMBER(int, pfnPioWrite, (PPDMIPCIRAWUP pInterface,
140 RTIOPORT uPort,
141 uint32_t uValue,
142 unsigned cb));
143
144 /**
145 * Request port IO read.
146 *
147 * @returns status code
148 * @param pInterface Pointer to this interface structure.
149 * @param uPort I/O port address.
150 * @param puValue Place to store read value.
151 * @param cb Access width.
152 *
153 * @thread EMT thread.
154 */
155
156 DECLR3CALLBACKMEMBER(int, pfnPioRead, (PPDMIPCIRAWUP pInterface,
157 RTIOPORT uPort,
158 uint32_t *puValue,
159 unsigned cb));
160
161
162 /**
163 * Request MMIO write. This callback is only called if driver wants to receive MMIO via
164 * pu32Flags argument of pfnPciDeviceConstructStart().
165 *
166 * @returns status code
167 * @param pInterface Pointer to this interface structure.
168 * @param Address Guest physical address.
169 * @param pvValue Address of value to write.
170 * @param cb Access width.
171 *
172 * @thread EMT thread.
173 */
174 DECLR3CALLBACKMEMBER(int, pfnMmioWrite, (PPDMIPCIRAWUP pInterface,
175 RTR0PTR Address, /**< Why is this documented as guest physical address and given a host ring-0 address type??? */
176 void const *pvValue,
177 unsigned cb));
178
179 /**
180 * Request MMIO read.
181 *
182 * @returns status code
183 * @param pInterface Pointer to this interface structure.
184 * @param Address Guest physical address.
185 * @param pvValue Place to store read value.
186 * @param cb Access width.
187 *
188 * @thread EMT thread.
189 */
190
191 DECLR3CALLBACKMEMBER(int, pfnMmioRead, (PPDMIPCIRAWUP pInterface,
192 RTR0PTR Address, /**< Why is this documented as guest physical address and given a host ring-0 address type??? */
193 void *pvValue,
194 unsigned cb));
195
196 /**
197 * Host PCI config space accessors.
198 */
199 /**
200 * Request driver to write value to host device's PCI config space.
201 * Host specific way (PIO or MCFG) is used to perform actual operation.
202 *
203 * @returns status code
204 * @param pInterface Pointer to this interface structure.
205 * @param offCfgSpace Offset in PCI config space.
206 * @param pvValue Value to write.
207 * @param cb Access width.
208 *
209 * @thread EMT thread.
210 */
211 DECLR3CALLBACKMEMBER(int, pfnPciCfgWrite, (PPDMIPCIRAWUP pInterface,
212 uint32_t offCfgSpace,
213 void *pvValue,
214 unsigned cb));
215 /**
216 * Request driver to read value from host device's PCI config space.
217 * Host specific way (PIO or MCFG) is used to perform actual operation.
218 *
219 * @returns status code
220 * @param pInterface Pointer to this interface structure.
221 * @param offCfgSpace Offset in PCI config space.
222 * @param pvValue Where to store read value.
223 * @param cb Access width.
224 *
225 * @thread EMT thread.
226 */
227 DECLR3CALLBACKMEMBER(int, pfnPciCfgRead, (PPDMIPCIRAWUP pInterface,
228 uint32_t offCfgSpace,
229 void *pvValue,
230 unsigned cb));
231
232 /**
233 * Request to enable interrupt notifications. Please note that this is purely
234 * R3 interface, so it's up to implementor to perform necessary machinery
235 * for communications with host OS kernel driver. Typical implementation will start
236 * userland thread waiting on shared semaphore (such as using SUPSEMEVENT),
237 * notified by the kernel interrupt handler, and then will call
238 * upper port pfnInterruptRequest() based on data provided by the driver.
239 * This apporach is taken, as calling VBox code from an asyncronous R0
240 * interrupt handler when VMM may not be even running doesn't look
241 * like a good idea.
242 *
243 * @returns status code
244 * @param pInterface Pointer to this interface structure.
245 * @param pListener Pointer to the listener object.
246 * @param uGuestIrq Guest IRQ to be passed to pfnInterruptRequest().
247 *
248 * @thread Any thread, pfnInterruptRequest() will be usually invoked on a dedicated thread.
249 */
250 DECLR3CALLBACKMEMBER(int, pfnEnableInterruptNotifications, (PPDMIPCIRAWUP pInterface, uint8_t uGuestIrq));
251
252 /**
253 * Request to disable interrupt notifications.
254 *
255 * @returns status code
256 * @param pInterface Pointer to this interface structure.
257 *
258 * @thread Any thread.
259 */
260 DECLR3CALLBACKMEMBER(int, pfnDisableInterruptNotifications, (PPDMIPCIRAWUP pInterface));
261
262 /** @name Notification APIs.
263 * @{
264 */
265
266 /**
267 * Notify driver when raw PCI device construction starts.
268 *
269 * Have to be the first operation as initializes internal state and opens host
270 * device driver.
271 *
272 * @returns status code
273 * @param pInterface Pointer to this interface structure.
274 * @param uHostPciAddress Host PCI address of device attached.
275 * @param uGuestPciAddress Guest PCI address of device attached.
276 * @param pszDeviceName Human readable device name.
277 * @param fDeviceFlags Flags for the host device.
278 * @param pfFlags Flags for virtual device, from the upper driver.
279 *
280 * @thread Any thread.
281 */
282 DECLR3CALLBACKMEMBER(int, pfnPciDeviceConstructStart, (PPDMIPCIRAWUP pInterface,
283 uint32_t uHostPciAddress,
284 uint32_t uGuestPciAddress,
285 const char *pszDeviceName,
286 uint32_t fDeviceFlags,
287 uint32_t *pfFlags));
288
289 /**
290 * Notify driver when raw PCI device construction completes, so that it may
291 * perform further actions depending on success or failure of this operation.
292 * Standard action is to raise global IHostPciDevicePlugEvent.
293 *
294 * @param pInterface Pointer to this interface structure.
295 * @param rc Result code of the operation.
296 *
297 * @thread Any thread.
298 */
299 DECLR3CALLBACKMEMBER(void, pfnPciDeviceConstructComplete, (PPDMIPCIRAWUP pInterface, int rc));
300
301 /**
302 * Notify driver on finalization of raw PCI device.
303 *
304 * @param pInterface Pointer to this interface structure.
305 *
306 * @thread Any thread.
307 */
308 DECLR3CALLBACKMEMBER(int, pfnPciDeviceDestruct, (PPDMIPCIRAWUP pInterface, uint32_t fFlags));
309
310 /**
311 * Notify driver on guest power state change.
312 *
313 * @param pInterface Pointer to this interface structure.
314 * @param enmState New power state.
315 * @param pu64Param State-specific in/out parameter. For now only used during power-on to provide VM caps.
316 *
317 * @thread Any thread.
318 */
319 DECLR3CALLBACKMEMBER(int, pfnPciDevicePowerStateChange, (PPDMIPCIRAWUP pInterface,
320 PCIRAWPOWERSTATE enmState,
321 uint64_t *pu64Param));
322
323 /**
324 * Notify driver about runtime error.
325 *
326 * @param pInterface Pointer to this interface structure.
327 * @param fFatal If error is fatal.
328 * @param szErrorId Error ID.
329 * @param szMessage Error message.
330 *
331 * @thread Any thread.
332 */
333 DECLR3CALLBACKMEMBER(int, pfnReportRuntimeError, (PPDMIPCIRAWUP pInterface,
334 bool fFatal,
335 const char *pszErrorId,
336 const char *pszMessage));
337 /** @} */
338} PDMIPCIRAWUP;
339
340/**
341 * Init R0 PCI module.
342 */
343PCIRAWR0DECL(int) PciRawR0Init(void);
344/**
345 * Process request (in R0).
346 */
347PCIRAWR0DECL(int) PciRawR0ProcessReq(PSUPDRVSESSION pSession, PVM pVM, PPCIRAWSENDREQ pReq);
348/**
349 * Terminate R0 PCI module.
350 */
351PCIRAWR0DECL(void) PciRawR0Term(void);
352
353/**
354 * Per-VM R0 module init.
355 */
356PCIRAWR0DECL(int) PciRawR0InitVM(PVM pVM);
357
358/**
359 * Per-VM R0 module termination routine.
360 */
361PCIRAWR0DECL(void) PciRawR0TermVM(PVM pVM);
362
363/**
364 * Flags returned by pfnPciDeviceConstructStart(), to notify device
365 * how it shall handle device IO traffic.
366 */
367typedef enum PCIRAWDEVICEFLAGS
368{
369 /** Intercept port IO (R3 PIO always go to the driver). */
370 PCIRAWRFLAG_CAPTURE_PIO = (1 << 0),
371 /** Intercept MMIO. */
372 PCIRAWRFLAG_CAPTURE_MMIO = (1 << 1),
373 /** Allow bus mastering by physical device (requires IOMMU). */
374 PCIRAWRFLAG_ALLOW_BM = (1 << 2),
375 /** Allow R3 MMIO mapping. */
376 PCIRAWRFLAG_ALLOW_R3MAP = (1 << 3),
377
378 /** The usual 32-bit type blow up. */
379 PCIRAWRFLAG_32BIT_HACK = 0x7fffffff
380} PCIRAWDEVICEFLAGS;
381
382#define PDMIPCIRAWUP_IID "06daa17f-097b-4ebe-a626-15f467b1de12"
383#define PDMIPCIRAW_IID "68c6e4c4-4223-47e0-9134-e3c297992543"
384
385/** @} */
386
387RT_C_DECLS_END
388
389#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette