VirtualBox

source: vbox/trunk/src/VBox/Devices/Bus/DevPciInternal.h@ 67707

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

DevPciIch9.cpp: big config space access refactoring, eliminating the set of access functions specific for the BiosInit code (which was very very inefficient) which looked easier to use, but with proper pointers to the necessary data structures the entire Fake PCI BIOS code is more straightforward and efficient now. This is prepared for use by DevPCI, too. Minor variable naming consistency cleanups elsewhere.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 KB
Line 
1/* $Id: DevPciInternal.h 67707 2017-06-29 16:54:40Z vboxsync $ */
2/** @file
3 * DevPCI - Common Internal Header.
4 */
5
6/*
7 * Copyright (C) 2010-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 ___Bus_DevPciInternal_h___
19#define ___Bus_DevPciInternal_h___
20
21#ifndef PDMPCIDEV_INCLUDE_PRIVATE
22# define PDMPCIDEV_INCLUDE_PRIVATE /* Hack to get pdmpcidevint.h included at the right point. */
23#endif
24#include <VBox/vmm/pdmdev.h>
25
26
27/**
28 * PCI bus instance (common to both).
29 */
30typedef struct DEVPCIBUS
31{
32 /** Bus number. */
33 uint32_t iBus;
34 /** Number of bridges attached to the bus. */
35 uint32_t cBridges;
36 /** Start device number - always zero (only for DevPCI source compat). */
37 uint32_t iDevSearch;
38 /** Set if PIIX3 type. */
39 uint32_t fTypePiix3 : 1;
40 /** Set if ICH9 type. */
41 uint32_t fTypeIch9: 1;
42 /** Set if this is a pure bridge, i.e. not part of DEVPCIGLOBALS struct. */
43 uint32_t fPureBridge : 1;
44 /** Reserved for future config flags. */
45 uint32_t uReservedConfigFlags : 29;
46
47 /** R3 pointer to the device instance. */
48 PPDMDEVINSR3 pDevInsR3;
49 /** Pointer to the PCI R3 helpers. */
50 PCPDMPCIHLPR3 pPciHlpR3;
51
52 /** R0 pointer to the device instance. */
53 PPDMDEVINSR0 pDevInsR0;
54 /** Pointer to the PCI R0 helpers. */
55 PCPDMPCIHLPR0 pPciHlpR0;
56
57 /** RC pointer to the device instance. */
58 PPDMDEVINSRC pDevInsRC;
59 /** Pointer to the PCI RC helpers. */
60 PCPDMPCIHLPRC pPciHlpRC;
61
62 /** Array of bridges attached to the bus. */
63 R3PTRTYPE(PPDMPCIDEV *) papBridgesR3;
64#if HC_ARCH_BITS == 32
65 uint32_t au32Alignment1[5]; /**< Cache line align apDevices. */
66#endif
67 /** Array of PCI devices. We assume 32 slots, each with 8 functions. */
68 R3PTRTYPE(PPDMPCIDEV) apDevices[256];
69
70 /** The PCI device for the PCI bridge. */
71 PDMPCIDEV PciDev;
72} DEVPCIBUS;
73/** Pointer to a PCI bus instance. */
74typedef DEVPCIBUS *PDEVPCIBUS;
75
76
77/** @def DEVPCI_APIC_IRQ_PINS
78 * Number of pins for interrupts if the APIC is used.
79 */
80#define DEVPCI_APIC_IRQ_PINS 8
81/** @def DEVPCI_LEGACY_IRQ_PINS
82 * Number of pins for interrupts (PIRQ#0...PIRQ#3).
83 * @remarks Labling this "legacy" might be a bit off...
84 */
85#define DEVPCI_LEGACY_IRQ_PINS 4
86
87/**
88 * PIIX3 ISA bridge state.
89 */
90typedef struct PIIX3ISABRIDGE
91{
92 /** The PCI device of the bridge. */
93 PDMPCIDEV dev;
94} PIIX3ISABRIDGE;
95
96
97/**
98 * PCI Globals - This is the host-to-pci bridge and the root bus.
99 *
100 * @note Only used by the root bus, not the bridges.
101 */
102typedef struct DEVPCIROOT
103{
104 /** PCI bus which is attached to the host-to-PCI bridge.
105 * @note This must come first so we can share more code with the bridges! */
106 DEVPCIBUS PciBus;
107
108 /** R3 pointer to the device instance. */
109 PPDMDEVINSR3 pDevInsR3;
110 /** R0 pointer to the device instance. */
111 PPDMDEVINSR0 pDevInsR0;
112 /** RC pointer to the device instance. */
113 PPDMDEVINSRC pDevInsRC;
114
115 /** I/O APIC usage flag (always true of ICH9, see constructor). */
116 bool fUseIoApic;
117 /** Reserved for future config flags. */
118 bool afFutureFlags[3];
119 /** Physical address of PCI config space MMIO region. */
120 uint64_t u64PciConfigMMioAddress;
121 /** Length of PCI config space MMIO region. */
122 uint64_t u64PciConfigMMioLength;
123
124 /** I/O APIC irq levels */
125 volatile uint32_t auPciApicIrqLevels[DEVPCI_APIC_IRQ_PINS];
126 /** Value latched in Configuration Address Port (0CF8h) */
127 uint32_t uConfigReg;
128 /** Alignment padding. */
129 uint32_t u32Alignment1;
130 /** Members only used by the PIIX3 code variant. */
131 struct
132 {
133 /** ACPI IRQ level */
134 uint32_t iAcpiIrqLevel;
135 /** ACPI PIC IRQ */
136 int32_t iAcpiIrq;
137 /** Irq levels for the four PCI Irqs.
138 * These count how many devices asserted the IRQ line. If greater 0 an IRQ
139 * is sent to the guest. If it drops to 0 the IRQ is deasserted.
140 * @remarks Labling this "legacy" might be a bit off...
141 */
142 volatile uint32_t auPciLegacyIrqLevels[DEVPCI_LEGACY_IRQ_PINS];
143 /** ISA bridge state. */
144 PIIX3ISABRIDGE PIIX3State;
145 } Piix3;
146
147#if 1 /* Will be moved into the BIOS "soon". */
148 /** Current bus number - obsolete (still used by DevPCI, but merge will fix that). */
149 uint8_t uPciBiosBus;
150 uint8_t abAlignment2[7];
151 /** The next I/O port address which the PCI BIOS will use. */
152 uint32_t uPciBiosIo;
153 /** The next MMIO address which the PCI BIOS will use. */
154 uint32_t uPciBiosMmio;
155 /** The next 64-bit MMIO address which the PCI BIOS will use. */
156 uint64_t uPciBiosMmio64;
157#endif
158
159} DEVPCIROOT;
160/** Pointer to PCI device globals. */
161typedef DEVPCIROOT *PDEVPCIROOT;
162
163
164/** Converts a PCI bus device instance pointer to a DEVPCIBUS pointer. */
165#define DEVINS_2_DEVPCIBUS(pDevIns) (&PDMINS_2_DATA(pDevIns, PDEVPCIROOT)->PciBus)
166/** Converts a pointer to a PCI bus instance to a DEVPCIROOT pointer. */
167#define DEVPCIBUS_2_DEVPCIROOT(pPciBus) RT_FROM_MEMBER(pPciBus, DEVPCIROOT, PciBus)
168
169/** @def PCI_LOCK
170 * Acquires the PDM lock. This is a NOP if locking is disabled. */
171/** @def PCI_UNLOCK
172 * Releases the PDM lock. This is a NOP if locking is disabled. */
173#define PCI_LOCK(pDevIns, rc) \
174 do { \
175 int rc2 = DEVINS_2_DEVPCIBUS(pDevIns)->CTX_SUFF(pPciHlp)->pfnLock((pDevIns), rc); \
176 if (rc2 != VINF_SUCCESS) \
177 return rc2; \
178 } while (0)
179#define PCI_UNLOCK(pDevIns) \
180 DEVINS_2_DEVPCIBUS(pDevIns)->CTX_SUFF(pPciHlp)->pfnUnlock(pDevIns)
181
182
183#ifdef IN_RING3
184
185DECLCALLBACK(void) devpciR3RootRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta);
186DECLCALLBACK(void) devpciR3BusRelocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta);
187DECLCALLBACK(void) devpciR3InfoPci(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
188DECLCALLBACK(void) devpciR3InfoPciIrq(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs);
189DECLCALLBACK(int) devpciR3CommonIORegionRegister(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, int iRegion, RTGCPHYS cbRegion,
190 PCIADDRESSSPACE enmType, PFNPCIIOREGIONMAP pfnCallback);
191DECLCALLBACK(void) devpciR3CommonSetConfigCallbacks(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev,
192 PFNPCICONFIGREAD pfnRead, PPFNPCICONFIGREAD ppfnReadOld,
193 PFNPCICONFIGWRITE pfnWrite, PPFNPCICONFIGWRITE ppfnWriteOld);
194DECLCALLBACK(uint32_t) devpciR3CommonDefaultConfigRead(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t uAddress, unsigned cb);
195DECLCALLBACK(void) devpciR3CommonDefaultConfigWrite(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev,
196 uint32_t uAddress, uint32_t u32Value, unsigned cb);
197void devpciR3CommonRestoreConfig(PPDMPCIDEV pDev, uint8_t const *pbSrcConfig);
198int devpciR3CommonRestoreRegions(PSSMHANDLE pSSM, PPDMPCIDEV pPciDev, PPCIIOREGION paIoRegions, bool fNewState);
199void devpciR3ResetDevice(PPDMPCIDEV pDev);
200void devpciR3BiosInitSetRegionAddress(PDEVPCIBUS pBus, PPDMPCIDEV pPciDev, int iRegion, uint64_t addr);
201uint32_t devpciR3GetCfg(PPDMPCIDEV pPciDev, int32_t iRegister, int cb);
202void devpciR3SetCfg(PPDMPCIDEV pPciDev, int32_t iRegister, uint32_t u32, int cb);
203
204DECLINLINE(uint8_t) devpciR3GetByte(PPDMPCIDEV pPciDev, int32_t iRegister)
205{
206 return (uint8_t)devpciR3GetCfg(pPciDev, iRegister, 1);
207}
208
209DECLINLINE(uint16_t) devpciR3GetWord(PPDMPCIDEV pPciDev, int32_t iRegister)
210{
211 return (uint16_t)devpciR3GetCfg(pPciDev, iRegister, 2);
212}
213
214DECLINLINE(uint32_t) devpciR3GetDWord(PPDMPCIDEV pPciDev, int32_t iRegister)
215{
216 return (uint32_t)devpciR3GetCfg(pPciDev, iRegister, 4);
217}
218
219DECLINLINE(void) devpciR3SetByte(PPDMPCIDEV pPciDev, int32_t iRegister, uint8_t u8)
220{
221 devpciR3SetCfg(pPciDev, iRegister, u8, 1);
222}
223
224DECLINLINE(void) devpciR3SetWord(PPDMPCIDEV pPciDev, int32_t iRegister, uint16_t u16)
225{
226 devpciR3SetCfg(pPciDev, iRegister, u16, 2);
227}
228
229DECLINLINE(void) devpciR3SetDWord(PPDMPCIDEV pPciDev, int32_t iRegister, uint32_t u32)
230{
231 devpciR3SetCfg(pPciDev, iRegister, u32, 4);
232}
233
234#endif /* IN_RING3 */
235
236#endif
237
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