VirtualBox

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

Last change on this file since 70643 was 69500, checked in by vboxsync, 7 years ago

*: scm --update-copyright-year

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