VirtualBox

source: vbox/trunk/include/VBox/pci.h@ 7944

Last change on this file since 7944 was 7635, checked in by vboxsync, 17 years ago

The new MMIO2 code.
WARNING! This changes the pci mapping protocol for MMIO2 so it's working the same way as I/O ports and normal MMIO memory. External users of the interface will have to update their mapping routines.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.8 KB
Line 
1/** @file
2 * PCI - The PCI Controller And Devices.
3 */
4
5/*
6 * Copyright (C) 2006-2007 innotek GmbH
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___VBox_pci_h
27#define ___VBox_pci_h
28
29#include <VBox/cdefs.h>
30#include <VBox/types.h>
31
32/** @defgroup grp_pci PCI - The PCI Controller.
33 * @{
34 */
35
36/** Pointer to a PCI device. */
37typedef struct PCIDevice *PPCIDEVICE;
38
39
40/**
41 * PCI configuration word 4 (command) and word 6 (status).
42 */
43typedef enum PCICONFIGCOMMAND
44{
45 /** Supports/uses memory accesses. */
46 PCI_COMMAND_IOACCESS = 0x0001,
47 PCI_COMMAND_MEMACCESS = 0x0002,
48 PCI_COMMAND_BUSMASTER = 0x0004
49} PCICONFIGCOMMAND;
50
51
52/**
53 * PCI Address space specification.
54 * This is used when registering a I/O region.
55 */
56/** Note: There are all sorts of dirty dependencies on the values in the
57 * pci device. Be careful when changing this.
58 * @todo we should introduce 32 & 64 bits physical address types
59 */
60typedef enum PCIADDRESSSPACE
61{
62 /** Memory. */
63 PCI_ADDRESS_SPACE_MEM = 0x00,
64 /** I/O space. */
65 PCI_ADDRESS_SPACE_IO = 0x01,
66 /** Prefetch memory. */
67 PCI_ADDRESS_SPACE_MEM_PREFETCH = 0x08
68} PCIADDRESSSPACE;
69
70
71/**
72 * Callback function for mapping an PCI I/O region.
73 *
74 * @return VBox status code.
75 * @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
76 * @param iRegion The region number.
77 * @param GCPhysAddress Physical address of the region. If enmType is PCI_ADDRESS_SPACE_IO, this
78 * is an I/O port, otherwise it's a physical address.
79 *
80 * NIL_RTGCPHYS indicates that a MMIO2 mapping is about to be unmapped and
81 * that the device deregister access handlers for it and update its internal
82 * state to reflect this.
83 *
84 * @param enmType One of the PCI_ADDRESS_SPACE_* values.
85 *
86 * @remarks The address is *NOT* relative to pci_mem_base.
87 */
88typedef DECLCALLBACK(int) FNPCIIOREGIONMAP(PPCIDEVICE pPciDev, /*unsigned*/ int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType);
89/** Pointer to a FNPCIIOREGIONMAP() function. */
90typedef FNPCIIOREGIONMAP *PFNPCIIOREGIONMAP;
91
92
93/** @name PCI Configuration Space Registers
94 * @{ */
95#define VBOX_PCI_VENDOR_ID 0x00 /**< 16-bit RO */
96#define VBOX_PCI_DEVICE_ID 0x02 /**< 16-bit RO */
97#define VBOX_PCI_COMMAND 0x04 /**< 16-bit RW */
98#define VBOX_PCI_STATUS 0x06 /**< 16-bit RW */
99#define VBOX_PCI_REVISION_ID 0x08 /**< 8-bit RO */
100#define VBOX_PCI_CLASS_PROG 0x09 /**< 8-bit RO */
101#define VBOX_PCI_CLASS_DEVICE 0x0a /**< 8-bit ?? */
102#define VBOX_PCI_CACHE_LINE_SIZE 0x0c /**< 8-bit ?? */
103#define VBOX_PCI_LATENCY_TIMER 0x0d /**< 8-bit ?? */
104#define VBOX_PCI_HEADER_TYPE 0x0e /**< 8-bit ?? */
105#define VBOX_PCI_BIST 0x0f /**< 8-bit ?? */
106#define VBOX_PCI_BASE_ADDRESS_0 0x10 /**< 32-bit RW */
107#define VBOX_PCI_BASE_ADDRESS_1 0x14 /**< 32-bit RW */
108#define VBOX_PCI_BASE_ADDRESS_2 0x18 /**< 32-bit RW */
109#define VBOX_PCI_PRIMARY_BUS 0x18 /**< 8-bit ?? - bridge - primary bus number. */
110#define VBOX_PCI_SECONDARY_BUS 0x19 /**< 8-bit ?? - bridge - secondary bus number. */
111#define VBOX_PCI_SUBORDINATE_BUS 0x1a /**< 8-bit ?? - bridge - highest subordinate bus number. (behind the bridge) */
112#define VBOX_PCI_SEC_LATENCY_TIMER 0x1b /**< 8-bit ?? - bridge - secondary latency timer. */
113#define VBOX_PCI_BASE_ADDRESS_3 0x1c /**< 32-bit RW */
114#define VBOX_PCI_IO_BASE 0x1c /**< 8-bit ?? - bridge - I/O range base. */
115#define VBOX_PCI_IO_LIMIT 0x1d /**< 8-bit ?? - bridge - I/O range limit. */
116#define VBOX_PCI_SEC_STATUS 0x1e /**< 16-bit ?? - bridge - secondary status register. */
117#define VBOX_PCI_BASE_ADDRESS_4 0x20 /**< 32-bit RW */
118#define VBOX_PCI_MEMORY_BASE 0x20 /**< 16-bit ?? - bridge - memory range base. */
119#define VBOX_PCI_MEMORY_LIMIT 0x22 /**< 16-bit ?? - bridge - memory range limit. */
120#define VBOX_PCI_BASE_ADDRESS_5 0x24 /**< 32-bit RW */
121#define VBOX_PCI_PREF_MEMORY_BASE 0x24 /**< 16-bit ?? - bridge - Prefetchable memory range base. */
122#define VBOX_PCI_PREF_MEMORY_LIMIT 0x26 /**< 16-bit ?? - bridge - Prefetchable memory range limit. */
123#define VBOX_PCI_CARDBUS_CIS 0x28 /**< 32-bit ?? */
124#define VBOX_PCI_PREF_BASE_UPPER32 0x28 /**< 32-bit ?? - bridge - Prefetchable memory range high base.*/
125#define VBOX_PCI_PREF_LIMIT_UPPER32 0x2c /**< 32-bit ?? - bridge - Prefetchable memory range high limit. */
126#define VBOX_PCI_SUBSYSTEM_VENDOR_ID 0x2c /**< 16-bit ?? */
127#define VBOX_PCI_SUBSYSTEM_ID 0x2e /**< 16-bit ?? */
128#define VBOX_PCI_ROM_ADDRESS 0x30 /**< 32-bit ?? */
129#define VBOX_PCI_IO_BASE_UPPER16 0x30 /**< 16-bit ?? - bridge - memory range high base. */
130#define VBOX_PCI_IO_LIMIT_UPPER16 0x32 /**< 16-bit ?? - bridge - memory range high limit. */
131#define VBOX_PCI_CAPABILITY_LIST 0x34 /**< 8-bit? ?? */
132#define VBOX_PCI_ROM_ADDRESS_BR 0x38 /**< 32-bit ?? - bridge */
133#define VBOX_PCI_INTERRUPT_LINE 0x3c /**< 8-bit RW - Interrupt line. */
134#define VBOX_PCI_INTERRUPT_PIN 0x3d /**< 8-bit RO - Interrupt pin. */
135#define VBOX_PCI_MIN_GNT 0x3e /**< 8-bit ?? */
136#define VBOX_PCI_BRIDGE_CONTROL 0x3e /**< 8-bit? ?? - bridge */
137#define VBOX_PCI_MAX_LAT 0x3f /**< 8-bit ?? */
138/** @} */
139
140
141/**
142 * Callback function for reading from the PCI configuration space.
143 *
144 * @returns The register value.
145 * @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
146 * @param Address The configuration space register address. [0..255]
147 * @param cb The register size. [1,2,4]
148 */
149typedef DECLCALLBACK(uint32_t) FNPCICONFIGREAD(PPCIDEVICE pPciDev, uint32_t Address, unsigned cb);
150/** Pointer to a FNPCICONFIGREAD() function. */
151typedef FNPCICONFIGREAD *PFNPCICONFIGREAD;
152/** Pointer to a PFNPCICONFIGREAD. */
153typedef PFNPCICONFIGREAD *PPFNPCICONFIGREAD;
154
155/**
156 * Callback function for writing to the PCI configuration space.
157 *
158 * @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
159 * @param Address The configuration space register address. [0..255]
160 * @param u32Value The value that's being written. The number of bits actually used from
161 * this value is determined by the cb parameter.
162 * @param cb The register size. [1,2,4]
163 */
164typedef DECLCALLBACK(void) FNPCICONFIGWRITE(PPCIDEVICE pPciDev, uint32_t Address, uint32_t u32Value, unsigned cb);
165/** Pointer to a FNPCICONFIGWRITE() function. */
166typedef FNPCICONFIGWRITE *PFNPCICONFIGWRITE;
167/** Pointer to a PFNPCICONFIGWRITE. */
168typedef PFNPCICONFIGWRITE *PPFNPCICONFIGWRITE;
169
170/** Fixed I/O region number for ROM. */
171#define PCI_ROM_SLOT 6
172/** Max number of I/O regions. */
173#define PCI_NUM_REGIONS 7
174
175/*
176 * Hack to include the PCIDEVICEINT structure at the right place
177 * to avoid duplications of FNPCIIOREGIONMAP and PCI_NUM_REGIONS.
178 */
179#ifdef PCI_INCLUDE_PRIVATE
180# include "PCIInternal.h"
181#endif
182
183/**
184 * PCI Device structure.
185 */
186typedef struct PCIDevice
187{
188 /** PCI config space. */
189 uint8_t config[256];
190
191 /** Internal data. */
192 union
193 {
194#ifdef __PCIDEVICEINT_DECLARED__
195 PCIDEVICEINT s;
196#endif
197 char padding[224];
198 } Int;
199
200 /** Read only data.
201 * @{
202 */
203 /** PCI device number on the pci bus. */
204 int32_t devfn;
205 uint32_t Alignment0; /**< Alignment. */
206 /** Device name. */
207 R3PTRTYPE(const char *) name;
208 /** Pointer to the device instance which registered the device. */
209 PPDMDEVINSR3 pDevIns;
210 /** @} */
211} PCIDEVICE;
212
213
214/**
215 * Sets the vendor id config register.
216 * @param pPciDev The PCI device.
217 * @param u16VendorId The vendor id.
218 */
219DECLINLINE(void) PCIDevSetVendorId(PPCIDEVICE pPciDev, uint16_t u16VendorId)
220{
221 u16VendorId = RT_H2LE_U16(u16VendorId);
222 pPciDev->config[VBOX_PCI_VENDOR_ID] = u16VendorId & 0xff;
223 pPciDev->config[VBOX_PCI_VENDOR_ID + 1] = u16VendorId >> 8;
224}
225
226/**
227 * Gets the vendor id config register.
228 * @returns the vendor id.
229 * @param pPciDev The PCI device.
230 */
231DECLINLINE(uint16_t) PCIDevGetVendorId(PPCIDEVICE pPciDev)
232{
233 return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_VENDOR_ID], pPciDev->config[VBOX_PCI_VENDOR_ID + 1]));
234}
235
236/**
237 * Sets the device id config register.
238 * @param pPciDev The PCI device.
239 * @param u16DeviceId The device id.
240 */
241DECLINLINE(void) PCIDevSetDeviceId(PPCIDEVICE pPciDev, uint16_t u16DeviceId)
242{
243 u16DeviceId = RT_H2LE_U16(u16DeviceId);
244 pPciDev->config[VBOX_PCI_DEVICE_ID] = u16DeviceId & 0xff;
245 pPciDev->config[VBOX_PCI_DEVICE_ID + 1] = u16DeviceId >> 8;
246}
247
248/**
249 * Gets the device id config register.
250 * @returns the device id.
251 * @param pPciDev The PCI device.
252 */
253DECLINLINE(uint16_t) PCIDevGetDeviceId(PPCIDEVICE pPciDev)
254{
255 return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_DEVICE_ID], pPciDev->config[VBOX_PCI_DEVICE_ID + 1]));
256}
257
258/**
259 * Gets the sub-system vendor id config register.
260 * @returns the sub-system vendor id.
261 * @param pPciDev The PCI device.
262 */
263DECLINLINE(uint16_t) PCIDevGetSubSystemVendorId(PPCIDEVICE pPciDev)
264{
265 return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_SUBSYSTEM_VENDOR_ID], pPciDev->config[VBOX_PCI_SUBSYSTEM_VENDOR_ID + 1]));
266}
267
268/**
269 * Gets the sub-system id config register.
270 * @returns the sub-system id.
271 * @param pPciDev The PCI device.
272 */
273DECLINLINE(uint16_t) PCIDevGetSubSystemId(PPCIDEVICE pPciDev)
274{
275 return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_SUBSYSTEM_ID], pPciDev->config[VBOX_PCI_SUBSYSTEM_ID + 1]));
276}
277
278
279/** @} */
280
281#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