VirtualBox

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

Last change on this file since 50779 was 50779, checked in by vboxsync, 11 years ago

vboxpci: current code never calls unmap method, so we end up leaking
mappings and keeping resources busy. To hack around this, map
resources only once and return existing mapping on repeated requests,
free them at once in vboxPciOsDevDeinit().

This makes it possible for the host driver to take back control of the
device after VM terminates.

  • 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 50779 2014-03-13 22:54:47Z vboxsync $ */
2/** @file
3 * VBoxPci - PCI driver (Host), Internal Header.
4 */
5
6/*
7 * Copyright (C) 2011-2012 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.

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