VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/VBoxPci/VBoxPciInternal.h@ 67954

Last change on this file since 67954 was 62490, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1/* $Id: VBoxPciInternal.h 62490 2016-07-22 18:41:49Z vboxsync $ */
2/** @file
3 * VBoxPci - PCI driver (Host), Internal Header.
4 */
5
6/*
7 * Copyright (C) 2011-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef ___VBoPciInternal_h___
19#define ___VBoxPciInternal_h___
20
21#include <VBox/sup.h>
22#include <VBox/rawpci.h>
23#include <iprt/semaphore.h>
24#include <iprt/assert.h>
25
26#ifdef RT_OS_LINUX
27
28#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) && defined(CONFIG_IOMMU_API)
29# define VBOX_WITH_IOMMU
30#endif
31
32#ifdef VBOX_WITH_IOMMU
33#include <linux/errno.h>
34#include <linux/iommu.h>
35#endif
36
37#endif
38
39RT_C_DECLS_BEGIN
40
41/* Forward declaration. */
42typedef struct VBOXRAWPCIGLOBALS *PVBOXRAWPCIGLOBALS;
43typedef struct VBOXRAWPCIDRVVM *PVBOXRAWPCIDRVVM;
44typedef struct VBOXRAWPCIINS *PVBOXRAWPCIINS;
45
46typedef struct VBOXRAWPCIISRDESC
47{
48 /** Handler function. */
49 PFNRAWPCIISR pfnIrqHandler;
50 /** Handler context. */
51 void *pIrqContext;
52 /** Host IRQ. */
53 int32_t iHostIrq;
54} VBOXRAWPCIISRDESC;
55typedef struct VBOXRAWPCIISRDESC *PVBOXRAWPCIISRDESC;
56
57/**
58 * The per-instance data of the VBox raw PCI interface.
59 *
60 * This is data associated with a host PCI card attached to the VM.
61 *
62 */
63typedef struct VBOXRAWPCIINS
64{
65 /** Pointer to the globals. */
66 PVBOXRAWPCIGLOBALS pGlobals;
67
68 /** Mutex protecting device access. */
69 RTSEMFASTMUTEX hFastMtx;
70 /** The spinlock protecting the state variables and device access. */
71 RTSPINLOCK hSpinlock;
72 /** Pointer to the next device in the list. */
73 PVBOXRAWPCIINS pNext;
74 /** Reference count. */
75 uint32_t volatile cRefs;
76
77 /* Host PCI address of this device. */
78 uint32_t HostPciAddress;
79
80#ifdef RT_OS_LINUX
81 struct pci_dev * pPciDev;
82 char szPrevDriver[64];
83#endif
84 bool fMsiUsed;
85 bool fMsixUsed;
86 bool fIommuUsed;
87 bool fPad0;
88
89 /** Port, given to the outside world. */
90 RAWPCIDEVPORT DevPort;
91
92 /** IRQ handler. */
93 VBOXRAWPCIISRDESC IrqHandler;
94
95 /** Pointer to per-VM context in hypervisor data. */
96 PRAWPCIPERVM pVmCtx;
97
98 RTR0PTR aRegionR0Mapping[/* XXX: magic */ 7];
99} VBOXRAWPCIINS;
100
101/**
102 * Per-VM data of the VBox PCI driver. Pointed to by pGVM->rawpci.s.pDriverData.
103 *
104 */
105typedef struct VBOXRAWPCIDRVVM
106{
107 /** Mutex protecting state changes. */
108 RTSEMFASTMUTEX hFastMtx;
109
110#ifdef RT_OS_LINUX
111# ifdef VBOX_WITH_IOMMU
112 /* IOMMU domain. */
113 struct iommu_domain* pIommuDomain;
114# endif
115#endif
116 /* Back pointer to pGVM->rawpci.s. */
117 PRAWPCIPERVM pPerVmData;
118} VBOXRAWPCIDRVVM;
119
120/**
121 * The global data of the VBox PCI driver.
122 *
123 * This contains the bit required for communicating with support driver, VBoxDrv
124 * (start out as SupDrv).
125 */
126typedef struct VBOXRAWPCIGLOBALS
127{
128 /** Mutex protecting the list of instances and state changes. */
129 RTSEMFASTMUTEX hFastMtx;
130
131 /** Pointer to a list of instance data. */
132 PVBOXRAWPCIINS pInstanceHead;
133
134 /** The raw PCI interface factory. */
135 RAWPCIFACTORY RawPciFactory;
136 /** The SUPDRV component factory registration. */
137 SUPDRVFACTORY SupDrvFactory;
138 /** The number of current factory references. */
139 int32_t volatile cFactoryRefs;
140 /** Whether the IDC connection is open or not.
141 * This is only for cleaning up correctly after the separate IDC init on Windows. */
142 bool fIDCOpen;
143 /** The SUPDRV IDC handle (opaque struct). */
144 SUPDRVIDCHANDLE SupDrvIDC;
145#ifdef RT_OS_LINUX
146 bool fPciStubModuleAvail;
147 struct module * pciStubModule;
148#endif
149} VBOXRAWPCIGLOBALS;
150
151DECLHIDDEN(int) vboxPciInit(PVBOXRAWPCIGLOBALS pGlobals);
152DECLHIDDEN(void) vboxPciShutdown(PVBOXRAWPCIGLOBALS pGlobals);
153
154DECLHIDDEN(int) vboxPciOsInitVm(PVBOXRAWPCIDRVVM pThis, PVM pVM, PRAWPCIPERVM pVmData);
155DECLHIDDEN(void) vboxPciOsDeinitVm(PVBOXRAWPCIDRVVM pThis, PVM pVM);
156
157DECLHIDDEN(int) vboxPciOsDevInit (PVBOXRAWPCIINS pIns, uint32_t fFlags);
158DECLHIDDEN(int) vboxPciOsDevDeinit(PVBOXRAWPCIINS pIns, uint32_t fFlags);
159DECLHIDDEN(int) vboxPciOsDevDestroy(PVBOXRAWPCIINS pIns);
160
161DECLHIDDEN(int) vboxPciOsDevGetRegionInfo(PVBOXRAWPCIINS pIns,
162 int32_t iRegion,
163 RTHCPHYS *pRegionStart,
164 uint64_t *pu64RegionSize,
165 bool *pfPresent,
166 uint32_t *pfFlags);
167DECLHIDDEN(int) vboxPciOsDevMapRegion(PVBOXRAWPCIINS pIns,
168 int32_t iRegion,
169 RTHCPHYS pRegionStart,
170 uint64_t u64RegionSize,
171 uint32_t fFlags,
172 RTR0PTR *pRegionBase);
173DECLHIDDEN(int) vboxPciOsDevUnmapRegion(PVBOXRAWPCIINS pIns,
174 int32_t iRegion,
175 RTHCPHYS RegionStart,
176 uint64_t u64RegionSize,
177 RTR0PTR RegionBase);
178
179DECLHIDDEN(int) vboxPciOsDevPciCfgWrite(PVBOXRAWPCIINS pIns, uint32_t Register, PCIRAWMEMLOC *pValue);
180DECLHIDDEN(int) vboxPciOsDevPciCfgRead (PVBOXRAWPCIINS pIns, uint32_t Register, PCIRAWMEMLOC *pValue);
181
182DECLHIDDEN(int) vboxPciOsDevRegisterIrqHandler (PVBOXRAWPCIINS pIns, PFNRAWPCIISR pfnHandler, void* pIrqContext, int32_t *piHostIrq);
183DECLHIDDEN(int) vboxPciOsDevUnregisterIrqHandler(PVBOXRAWPCIINS pIns, int32_t iHostIrq);
184
185DECLHIDDEN(int) vboxPciOsDevPowerStateChange(PVBOXRAWPCIINS pIns, PCIRAWPOWERSTATE aState);
186
187#define VBOX_DRV_VMDATA(pIns) ((PVBOXRAWPCIDRVVM)(pIns->pVmCtx ? pIns->pVmCtx->pDriverData : NULL))
188
189RT_C_DECLS_END
190
191#endif
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use