pci.h revision 58dbb1ccf94a9a7661acd2e9d7705f42011d98b3
/** @file
* PCI - The PCI Controller And Devices.
*/
/*
* Copyright (C) 2006-2007 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#ifndef ___VBox_pci_h
#define ___VBox_pci_h
/** @defgroup grp_pci PCI - The PCI Controller.
* @{
*/
/** Pointer to a PCI device. */
typedef struct PCIDevice *PPCIDEVICE;
/**
* PCI configuration word 4 (command) and word 6 (status).
*/
typedef enum PCICONFIGCOMMAND
{
PCI_COMMAND_IOACCESS = 0x0001,
PCI_COMMAND_MEMACCESS = 0x0002,
PCI_COMMAND_BUSMASTER = 0x0004
/**
* PCI Address space specification.
* This is used when registering a I/O region.
*/
/** Note: There are all sorts of dirty dependencies on the values in the
* pci device. Be careful when changing this.
* @todo we should introduce 32 & 64 bits physical address types
*/
typedef enum PCIADDRESSSPACE
{
/** Memory. */
PCI_ADDRESS_SPACE_MEM = 0x00,
/** I/O space. */
PCI_ADDRESS_SPACE_IO = 0x01,
/** Prefetch memory. */
/**
* Callback function for mapping an PCI I/O region.
*
* @return VBox status code.
* @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
* @param iRegion The region number.
* @param GCPhysAddress Physical address of the region. If enmType is PCI_ADDRESS_SPACE_IO, this
* is an I/O port, otherwise it's a physical address.
*
* NIL_RTGCPHYS indicates that a MMIO2 mapping is about to be unmapped and
* that the device deregister access handlers for it and update its internal
* state to reflect this.
*
* @param enmType One of the PCI_ADDRESS_SPACE_* values.
*
* @remarks The address is *NOT* relative to pci_mem_base.
*/
typedef DECLCALLBACK(int) FNPCIIOREGIONMAP(PPCIDEVICE pPciDev, /*unsigned*/ int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType);
/** Pointer to a FNPCIIOREGIONMAP() function. */
typedef FNPCIIOREGIONMAP *PFNPCIIOREGIONMAP;
/** @name PCI Configuration Space Registers
* @{ */
#define VBOX_PCI_CLASS_PROG 0x09 /**< 8-bit RO - - register-level programming class code (device specific). */
#define VBOX_PCI_SUBORDINATE_BUS 0x1a /**< 8-bit ?? - bridge - highest subordinate bus number. (behind the bridge) */
#define VBOX_PCI_PREF_MEMORY_LIMIT 0x26 /**< 16-bit ?? - bridge - Prefetchable memory range limit. */
#define VBOX_PCI_PREF_BASE_UPPER32 0x28 /**< 32-bit ?? - bridge - Prefetchable memory range high base.*/
#define VBOX_PCI_PREF_LIMIT_UPPER32 0x2c /**< 32-bit ?? - bridge - Prefetchable memory range high limit. */
/** @} */
/**
* Callback function for reading from the PCI configuration space.
*
* @returns The register value.
* @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
* @param Address The configuration space register address. [0..255]
* @param cb The register size. [1,2,4]
*/
/** Pointer to a FNPCICONFIGREAD() function. */
typedef FNPCICONFIGREAD *PFNPCICONFIGREAD;
/** Pointer to a PFNPCICONFIGREAD. */
typedef PFNPCICONFIGREAD *PPFNPCICONFIGREAD;
/**
* Callback function for writing to the PCI configuration space.
*
* @param pPciDev Pointer to PCI device. Use pPciDev->pDevIns to get the device instance.
* @param Address The configuration space register address. [0..255]
* @param u32Value The value that's being written. The number of bits actually used from
* this value is determined by the cb parameter.
* @param cb The register size. [1,2,4]
*/
typedef DECLCALLBACK(void) FNPCICONFIGWRITE(PPCIDEVICE pPciDev, uint32_t Address, uint32_t u32Value, unsigned cb);
/** Pointer to a FNPCICONFIGWRITE() function. */
typedef FNPCICONFIGWRITE *PFNPCICONFIGWRITE;
/** Pointer to a PFNPCICONFIGWRITE. */
typedef PFNPCICONFIGWRITE *PPFNPCICONFIGWRITE;
/** Fixed I/O region number for ROM. */
#define PCI_ROM_SLOT 6
/** Max number of I/O regions. */
#define PCI_NUM_REGIONS 7
/*
* Hack to include the PCIDEVICEINT structure at the right place
* to avoid duplications of FNPCIIOREGIONMAP and PCI_NUM_REGIONS.
*/
#ifdef PCI_INCLUDE_PRIVATE
# include "PCIInternal.h"
#endif
/**
* PCI Device structure.
*/
typedef struct PCIDevice
{
/** PCI config space. */
/** Internal data. */
union
{
#ifdef __PCIDEVICEINT_DECLARED__
PCIDEVICEINT s;
#endif
char padding[256];
} Int;
/** Read only data.
* @{
*/
/** PCI device number on the pci bus. */
/** Device name. */
/** Pointer to the device instance which registered the device. */
/** @} */
} PCIDEVICE;
/**
* Sets the vendor id config register.
* @param pPciDev The PCI device.
* @param u16VendorId The vendor id.
*/
{
}
/**
* Gets the vendor id config register.
* @returns the vendor id.
* @param pPciDev The PCI device.
*/
{
return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_VENDOR_ID], pPciDev->config[VBOX_PCI_VENDOR_ID + 1]));
}
/**
* Sets the device id config register.
* @param pPciDev The PCI device.
* @param u16DeviceId The device id.
*/
{
}
/**
* Gets the device id config register.
* @returns the device id.
* @param pPciDev The PCI device.
*/
{
return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_DEVICE_ID], pPciDev->config[VBOX_PCI_DEVICE_ID + 1]));
}
/**
* Sets the command config register.
*
* @param pPciDev The PCI device.
* @param u16Command The command register value.
*/
{
}
/**
* Sets the status config register.
*
* @param pPciDev The PCI device.
* @param u16Status The status register value.
*/
{
}
/**
* Sets the revision id config register.
*
* @param pPciDev The PCI device.
* @param u8RevisionId The revision id.
*/
{
}
/**
* Sets the register level programming class config register.
*
* @param pPciDev The PCI device.
* @param u8ClassProg The new value.
*/
{
}
/**
* Sets the sub-class (aka device class) config register.
*
* @param pPciDev The PCI device.
* @param u8SubClass The sub-class.
*/
{
}
/**
* Sets the base class config register.
*
* @param pPciDev The PCI device.
* @param u8BaseClass The base class.
*/
{
}
/**
* Sets the header type config register.
*
* @param pPciDev The PCI device.
* @param u8HdrType The header type.
*/
{
}
/**
* Sets a base address config register.
*
* @param pPciDev The PCI device.
* @param fIOSpace Whether it's I/O (true) or memory (false) space.
* @param fPrefetchable Whether the memory is prefetachable. Must be false if fIOSpace == true.
* @param f64Bit Whether the memory can be mapped anywhere in the 64-bit address space. Otherwise restrict to 32-bit.
* @param u32Addr The address value.
*/
DECLINLINE(void) PCIDevSetBaseAddress(PPCIDEVICE pPciDev, uint8_t iReg, bool fIOSpace, bool fPrefetchable, bool f64Bit, uint32_t u32Addr)
{
if (fIOSpace)
{
}
else
{
if (fPrefetchable)
if (f64Bit)
}
switch (iReg)
{
case 0: iReg = VBOX_PCI_BASE_ADDRESS_0; break;
default: AssertFailedReturnVoid();
}
}
/**
* Sets the sub-system vendor id config register.
*
* @param pPciDev The PCI device.
* @param u16SubSysVendorId The sub-system vendor id.
*/
{
}
/**
* Gets the sub-system vendor id config register.
* @returns the sub-system vendor id.
* @param pPciDev The PCI device.
*/
{
return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_SUBSYSTEM_VENDOR_ID], pPciDev->config[VBOX_PCI_SUBSYSTEM_VENDOR_ID + 1]));
}
/**
* Sets the sub-system id config register.
*
* @param pPciDev The PCI device.
* @param u16SubSystemId The sub-system id.
*/
{
}
/**
* Gets the sub-system id config register.
* @returns the sub-system id.
* @param pPciDev The PCI device.
*/
{
return RT_LE2H_U16(RT_MAKE_U16(pPciDev->config[VBOX_PCI_SUBSYSTEM_ID], pPciDev->config[VBOX_PCI_SUBSYSTEM_ID + 1]));
}
/**
* Sets the interrupt line config register.
*
* @param pPciDev The PCI device.
* @param u8Line The interrupt line.
*/
{
}
/**
* Sets the interrupt pin config register.
*
* @param pPciDev The PCI device.
* @param u8Pin The interrupt pin.
*/
{
}
/** @} */
#endif