VirtualBox

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

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

pdmpcidev.h: Modified FNPCICONFIGWRITE to return a status code to facilitate PDMDevHlpDBGFStop use in implementations.

  • 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 70181 2017-12-17 13:16:28Z vboxsync $ */
2/** @file
3 * DevPCI - Common Internal Header.
4 */
5
6/*
7 * Copyright (C) 2010-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
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(VBOXSTRICTRC) 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