1670 lines
51 KiB
C
Raw Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1995 Digital Equipment Corporation
Module Name:
iod.h
Abstract:
This file defines the structures and definitions registers on a
Rawhide I/O Daughter card. These register reside on the CAP chip,
MDP chips, and flash ROM.
Author:
Eric Rehm 16-Feb-1995
Environment:
Kernel mode
Revision History:
--*/
#ifndef _IODH_
#define _IODH_
//
// IOD Revision definitions.
//
#define IOD_REVISION_1 (0)
#define IOD_REVISION_2 (1)
//
// Define QVA constants.
//
#if !defined(QVA_ENABLE)
#define QVA_ENABLE (0xA0000000) // Identify VA as a QVA
#endif //QVA_ENABLE
#define QVA_SELECTORS (0xE0000000) // QVA identification mask
#define IO_BIT_SHIFT 0x05 // Bits to shift QVA
#define IO_BYTE_OFFSET 0x20 // Offset to next byte
#define IO_SHORT_OFFSET 0x40 // Offset to next short
#define IO_LONG_OFFSET 0x80 // Offset to next long
#define IO_BYTE_LEN 0x00 // Byte length
#define IO_WORD_LEN 0x08 // Word length
#define IO_TRIBYTE_LEN 0x10 // TriByte length
#define IO_LONG_LEN 0x18 // Longword length
#define IOD_SPARSE_SELECTORS (0x18000000) // BusNumber is encoded in QVA<28:27>
#define IOD_SPARSE_ENABLE (0xB8000000) // QVA_SELECTORS|IOD_SPARSE_SELECTORS
#define IOD_SPARSE_BUS_SHIFT 0x06 // Bits to shift BusNumber into MID
#define IOD_DENSE_SELECTORS (0xC0000000) // BusNumber is encoded in QVA<31:30>
#define IOD_DENSE_ENABLE (0xC0000000) // Same as IOD_DENSE_SELECTORS
#define IOD_DENSE_BUS_SHIFT 0x03 // Bits to shift BusNumber into MID
//
// Define size of I/O and memory space for the CIA.
// Assume that the HAE==0.
//
#define PCI_MAX_IO_ADDRESS (__32MB - 1) // I/O: 0 - 32MB
#define PCI_MAX_SPARSE_MEMORY_ADDRESS (__128MB - 1) // Mem: 0 - 128MB
#define PCI_MIN_DENSE_MEMORY_ADDRESS PCI_MAX_SPARSE_MEMORY_ADDRESS + 1
#define PCI_MAX_DENSE_MEMORY_ADDRESS (__1GB - 1) // Dense: 128 Mb - 1.0 Gb
#if !defined(_LANGUAGE_ASSEMBLY)
#define GID_TO_PHYS_ADDR( GID ) ((ULONGLONG)(((GID & 0x7) << 36))
#define MCDEVID_FROM_PHYS_ADDR( PA ) ( (ULONG)(((PA) >> 33) & 0x3f) )
#if 0
#define MCDEVID_TO_PHYS_ADDR( MCDEVID ) \
((ULONGLONG)((ULONGLONG)(MCDEVID & 0x3F ) << 33 ))
#else
#define MCDEVID_TO_PHYS_ADDR( MCDEVID ) \
((ULONGLONG)((ULONGLONG)(MCDEVID & 0x07 ) << 33 ))
#endif
#define MCDEVID_TO_PHYS_CPU( MCDEVID ) \
( (((MCDEVID) & 0x07) < 4) ? \
(((MCDEVID) & 0x07) - 2) : \
(((MCDEVID) & 0x07) - 4) )
#define PHYS_ADDR_TO_OFFSET( PA ) ( (PA) & ( (ULONGLONG) 0x1FFFFFFFF) )
#define IOD_QVA_PHYSICAL_BASE ((ULONGLONG)0xf800000000)
//
// QVA
// HAL_MAKE_QVA(
// ULONGLONG PhysicalAddress
// )
//
// Routine Description:
//
// This macro returns the Qva for a physical address in system space.
//
// Arguments:
//
// PhysicalAddress - Supplies a 64-bit physical address.
//
// Return Value:
//
// The Qva associated with the physical address.
//
#define HAL_MAKE_QVA(PA) \
( (PVOID)( QVA_ENABLE | \
(ULONG)( (PA - IOD_QVA_PHYSICAL_BASE) >> IO_BIT_SHIFT) ) )
//
// QVA
// HAL_MAKE_IOD_SPARSE_QVA(
// ULONG BusNumber,
// ULONG BusAddress
// )
//
// Routine Description:
//
// This macro returns the Qva for a physical address in sparse I/O
// or sparse memory space.
//
// Arguments:
//
// BusNumber - Supplies a bus number between 0-3.
// BusAddress - Supplies a 32-bit PCI bus address.
//
// Return Value:
//
// The Qva associated with bus number and bus address.
// HAL I/O access routines can use this to constrct the
// correct physical address for the accesss.
//
#define HAL_MAKE_IOD_SPARSE_QVA(BUS_NUMBER, BA) \
( (PVOID)( QVA_ENABLE | (BUS_NUMBER << 27) | ((ULONG) BA) ) )
//
// QVA
// HAL_MAKE_IOD_DENSE_QVA(
// ULONG BusNumber,
// ULONG BusAddress
// )
//
// Routine Description:
//
// This macro returns the Qva for a physical address in dense
// memory space space.
//
// Arguments:
//
// BusNumber - Supplies a bus number between 0-3.
// BusAddress - Supplies a 32-bit PCI bus address.
//
// Return Value:
//
// The Qva associated with bus number and bus address.
// HAL I/O access routines can use this to constrct the
// correct physical address for the accesss.
//
#define HAL_MAKE_IOD_DENSE_QVA(BUS_NUMBER, BA) \
( (PVOID)( (BUS_NUMBER << 30) | ((ULONG) BA) ) )
//
// Define GID/MIDs for IIP and PIO flavors of MC Bus
//
#define IOD_DODGE_GID 0x7
#define IOD_DURANGO_GID IOD_DODGE_GID
#define IOD_GCD_MID 0x0
#define IOD_MEM_MID 0x1
#define IOD_CPU0_MID 0x2
#define IOD_CPU1_MID 0x3
#define IOD_PCI0_MID 0x4
#define IOD_PCI1_MID 0x5
#define IOD_CPU2_MID 0x6
#define IOD_PCI2_MID IOD_CPU2_MID
#define IOD_CPU3_MID 0x7
#define IOD PCI3_MID IOD_CPU3_MID
//
// QVA
// HAL_MAKE_NEW_QVA(
// ULONGLONG PhysicalAddress
// )
//
// Routine Description:
//
// This macro returns the Qva for a physical address in system space.
//
// Arguments:
//
// PhysicalAddress - Supplies a 64-bit physical address.
//
// Return Value:
//
// The Qva associated with the physical address.
//
#define HAL_MAKE_NEW_QVA(PA) \
( (PVOID)( QVA_ENABLE | (ULONG)( (PA) >> IO_BIT_SHIFT) ) )
//
// Define IO space offsets for generic rawhide
//
#define IOD_IO_SPACE_START ((ULONGLONG)0x8000000000)
//
// These offsets are from IOD_IO_SPACE_START
//
#define IOD_GCD_CSRS_OFFSET ((ULONGLONG)0x0000000000)
#define IOD_MEMORY_CSRS_OFFSET ((ULONGLONG)0x0200000000)
#define IOD_CPU_IP_INTR_OFFSET ((ULONGLONG)0x0010000000)
#define IOD_CPU_NODE_HALT_OFFSET ((ULONGLONG)0x0070000000)
#define IOD_CPU_INTTIM_ACK_OFFSET ((ULONGLONG)0x0100000000)
#define IOD_CPU_IO_INTR_OFFSET ((ULONGLONG)0x00f0000000)
#define IOD_CPU_IP_ACK_OFFSET ((ULONGLONG)0x0110000000)
#define IOD_CPU_MCHK_ACK_OFFSET ((ULONGLONG)0x0130000000)
#define IOD_CPU_DTAG_EN_0_OFFSET ((ULONGLONG)0x0140000000)
#define IOD_CPU_DTAG_EN_1_OFFSET ((ULONGLONG)0x0150000000)
#define IOD_CPU_HALT_ACK_OFFSET ((ULONGLONG)0x0170000000)
#define IOD_SPARSE_MEM_OFFSET ((ULONGLONG)0x0000000000)
#define IOD_DENSE_MEM_OFFSET ((ULONGLONG)0x0100000000)
#define IOD_SPARSE_IO_OFFSET ((ULONGLONG)0x0180000000)
#define IOD_SPARSE_CONFIG_OFFSET ((ULONGLONG)0x01c0000000)
#define IOD_SPARSE_CSR_OFFSET ((ULONGLONG)0x01e0000000)
//
// Generic Rawhide I/O Address Computation macros
//
#define IOD_GCD_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_GCD_CSRS_OFFSET))
#define IOD_MEMORY_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_MEMORY_CSRS_OFFSET))
#define IOD_CPU_IP_INTR_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_IP_INTR_OFFSET))
#define IOD_CPU_NODE_HALT_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_NODE_HALT_OFFSET))
#define IOD_CPU_IO_INTR_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_IO_INTR_OFFSET))
#define IOD_CPU_INTTIM_ACK_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_INTTIM_ACK_OFFSET))
#define IOD_CPU_IP_ACK_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_IP_ACK_OFFSET))
#define IOD_CPU_MCHK_ACK_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_MCHK_ACK_OFFSET))
#define IOD_CPU_DTAG_EN_0_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_DTAG_EN_0_OFFSET))
#define IOD_CPU_DTAG_EN_1_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_DTAG_EN_1_OFFSET))
#define IOD_CPU_HALT_ACK_QVA \
(HAL_MAKE_NEW_QVA(IOD_CPU_HALT_ACK_OFFSET))
#define IOD_SPARSE_MEM_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_MEM_OFFSET ))
#define IOD_DENSE_MEM_QVA \
(HAL_MAKE_NEW_QVA(IOD_DENSE_MEM_OFFSET ))
#define IOD_SPARSE_IO_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_IO_OFFSET ))
#define IOD_SPARSE_CONFIG_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CONFIG_OFFSET ))
#define IOD_SPARSE_CSR_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET ))
#define IOD_GENERAL_CSRS_QVA IOD_SPARSE_CSR_QVA
#define IOD_PCI_IACK_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET + 0x480))
#define IOD_INT_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET + 0x500))
#define IOD_DIAG_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET + 0x700))
#define IOD_ERROR_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET + 0x800))
#define IOD_SG_CSRS_QVA \
(HAL_MAKE_NEW_QVA(IOD_SPARSE_CSR_OFFSET + 0x1300))
//
// Define physical address space for 1 CPU at GID=7, MID=1,
// and XSone IOD. // ecrfix
//
#define IOD_GCD_CSRS_PHYSICAL ((ULONGLONG)0xf000000000)
#define IOD_MEMORY_CSRS_PHYSICAL ((ULONGLONG)0xf200000000)
#define IOD_CPU0_IO_INTR_PHYSICAL ((ULONGLONG)0xf400000000)
#define IOD_CPU0_IP_INTR_PHYSICAL ((ULONGLONG)0xf510000000)
#define IOD_CPU0_NODE_HALT_PHYSICAL ((ULONGLONG)0xf520000000)
//
// PCI Bus 0
//
// old ecrfix #define IOD_PCI0_DENSE_MEMORY_PHYSICAL ((ULONGLONG)0xf800000000)
// old ecrfix #define IOD_PCI0_SPARSE_MEMORY_PHYSICAL ((ULONGLONG)0xf900000000)
#define IOD_PCI0_SPARSE_MEMORY_PHYSICAL ((ULONGLONG)0xf800000000)
#define IOD_PCI0_DENSE_MEMORY_PHYSICAL ((ULONGLONG)0xf900000000)
#define IOD_PCI0_SPARSE_IO_PHYSICAL ((ULONGLONG)0xf980000000)
#define IOD_PCI0_CONFIGURATION_PHYSICAL ((ULONGLONG)0xf9C0000000)
#define IOD_MAIN0_CSRS_PHYSICAL ((ULONGLONG)0xf9E0000000)
#define IOD_PCI0_CONFIG_BASE_QVA (HAL_MAKE_QVA(IOD_PCI0_CONFIGURATION_PHYSICAL))
#define IOD_PCI0_SPARSE_IO_QVA (HAL_MAKE_QVA(IOD_PCI0_SPARSE_IO_PHYSICAL))
#define IOD_PCI0_SPARSE_MEMORY_QVA (HAL_MAKE_QVA(IOD_PCI0_SPARSE_MEMORY_PHYSICAL))
#define IOD_GENERAL0_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL)
#define IOD_GENERAL0_CSRS_QVA HAL_MAKE_QVA(IOD_GENERAL0_CSRS_PHYSICAL)
#define IOD_PCI0_IACK_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL+0x480)
#define IOD_PCI0_IACK_QVA HAL_MAKE_QVA(IOD_PCI0_IACK_PHYSICAL)
#define IOD_INT0_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL+0x500)
#define IOD_INT0_CSRS_QVA HAL_MAKE_QVA(IOD_INT0_CSRS_PHYSICAL)
#define IOD_DIAG0_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL+0x700)
#define IOD_DIAG0_CSRS_QVA HAL_MAKE_QVA(IOD_DIAG0_CSRS_PHYSICAL)
#define IOD_ERROR0_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL+0x800)
#define IOD_ERROR0_CSRS_QVA HAL_MAKE_QVA(IOD_ERROR0_CSRS_PHYSICAL)
#define IOD_SCATTER_GATHER0_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN0_CSRS_PHYSICAL+0x1300)
#define IOD_SG0_CSRS_QVA (HAL_MAKE_QVA(IOD_SCATTER_GATHER0_CSRS_PHYSICAL))
//
// PCI Bus 1
//
#define IOD_PCI1_SPARSE_MEMORY_PHYSICAL ((ULONGLONG)0xfa00000000)
#define IOD_PCI1_DENSE_MEMORY_PHYSICAL ((ULONGLONG)0xfb00000000)
#define IOD_PCI1_SPARSE_IO_PHYSICAL ((ULONGLONG)0xfb80000000)
#define IOD_PCI1_CONFIGURATION_PHYSICAL ((ULONGLONG)0xfbC0000000)
#define IOD_MAIN1_CSRS_PHYSICAL ((ULONGLONG)0xfbE0000000)
#define IOD_PCI1_CONFIG_BASE_QVA (HAL_MAKE_QVA(IOD_PCI1_CONFIGURATION_PHYSICAL))
#define IOD_PCI1_SPARSE_IO_QVA (HAL_MAKE_QVA(IOD_PCI1_SPARSE_IO_PHYSICAL))
#define IOD_PCI1_SPARSE_MEMORY_QVA (HAL_MAKE_QVA(IOD_PCI1_SPARSE_MEMORY_PHYSICAL))
#define IOD_GENERAL1_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN1_CSRS_PHYSICAL)
#define IOD_GENERAL1_CSRS_QVA HAL_MAKE_QVA(IOD_GENERAL1_CSRS_PHYSICAL)
#define IOD_INT1_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN1_CSRS_PHYSICAL+0x500)
#define IOD_INT1_CSRS_QVA HAL_MAKE_QVA(IOD_INT1_CSRS_PHYSICAL)
#define IOD_DIAG1_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN1_CSRS_PHYSICAL+0x700)
#define IOD_DIAG1_CSRS_QVA HAL_MAKE_QVA(IOD_DIAG1_CSRS_PHYSICAL)
#define IOD_ERROR1_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN1_CSRS_PHYSICAL+0x800)
#define IOD_ERROR1_CSRS_QVA HAL_MAKE_QVA(IOD_ERROR1_CSRS_PHYSICAL)
#define IOD_SCATTER_GATHER1_CSRS_PHYSICAL ((ULONGLONG)IOD_MAIN1_CSRS_PHYSICAL+0x1300)
#define IOD_SG_CSRS1_QVA (HAL_MAKE_QVA(IOD_SCATTER_GATHER1_CSRS_PHYSICAL))
//
// Define the classes of IOD registers.
//
typedef enum _IOD_REGISTER_CLASS{
IodGeneralRegisters = 0x1,
IodInterruptRegisters = 0x2,
IodDiagnosticRegisters = 0x3,
IodErrorRegisters = 0x4,
IodScatterGatherRegisters = 0x5,
IodFlashRomRegisters = 0x6,
IodResetRegister = 0x7,
AllRegisters = 0xffffffff
} IOD_REGISTER_CLASS, *PIOD_REGISTER_CLASS;
//
// Define the MC bus global id's
//
typedef enum _MC_GLOBAL_ID{
GidPrimary = 0x7
} MC_GLOBAL_ID, *PMC_GLOBAL_ID;
//
// Define the MC bus module id's
//
typedef enum _MC_MODULE_ID{
MidGcd = 0x0,
MidMem = 0x1,
MidCpu0 = 0x2,
MidCpu1 = 0x3,
MidPci0 = 0x4,
MidPci1 = 0x5,
MidCpu2 = 0x6, // Dodge, IIP Motherboard
MidCpu3 = 0x7, // Dodge, IIP Motherboard
MidPci2 = 0x6, // Durango, PIO Motherboard
MidPci3 = 0x7 // Durango, PIO Motherboard
} MC_MODULE_ID, *PMC_MODULE_ID;
//
// Define the MC device id type
//
typedef union _MC_DEVICE_ID{
struct{
ULONG Mid: 3; // <2:0> Module Id
ULONG Gid: 3; // <5:3> Global Id
ULONG Reserved0: 26; //
};
ULONG all; // <5:0> MC Bus Device Id
} MC_DEVICE_ID, *PMC_DEVICE_ID;
extern MC_DEVICE_ID HalpIodLogicalToPhysical[];
//
// Define the MC bus enumeration types
//
typedef ULONGLONG MC_DEVICE_MASK;
extern MC_DEVICE_MASK HalpIodMask;
extern MC_DEVICE_MASK HalpCpuMask;
extern MC_DEVICE_MASK HalpGcdMask;
//
// Define the number of IOD's and CPU's in the system
//
extern ULONG HalpNumberOfIods;
extern ULONG HalpNumberOfCpus;
typedef struct _MC_ENUM_CONTEXT {
RTL_BITMAP McDeviceBitmap; // Device mask being enumerated
MC_DEVICE_MASK tempMask; // Bitmap storage
ULONG nextBit; // Hint to speed up enumeration
// N.B. this is the only public member of this structure:
MC_DEVICE_ID McDeviceId; // Currently enumerated McDeviceID
} MC_ENUM_CONTEXT, *PMC_ENUM_CONTEXT;
//
// The Bus enumeration routine is called from HalpMcBusEnumAndCall()
// to perform operations on an enumerated device mask.
//
typedef
VOID (*PMC_ENUM_ROUTINE) (
MC_DEVICE_ID McDeviceId,
ULONG PciBusNumber,
va_list McEnumBusArgs
);
//
// Define expected machine check data type
//
typedef struct _IOD_EXPECTED_ERROR {
ULONG Number; // Processor Number
ULONGLONG Addr; // SuperPage mode address causing Fill_Error
} IOD_EXPECTED_ERROR, *PIOD_EXPECTED_ERROR;
#define MASTER_ABORT_NOT_EXPECTED 0xffffffff
//
// Define the format of the posted interrupt written that the
// bridge writes to system memory.
//
typedef union _IOD_POSTED_INTERRUPT {
struct{
ULONG Pci: 16; // <15:0> PCI interrupt State
ULONG Eisa: 1; // <17> Eisa/NCR810 interrupt state
ULONG I2cCtrl: 1; // <17> 8254 I2C Controller (PCI 0 Only)
ULONG I2cBus: 1; // <18> 8254 I2C Bus: (PCI 0 Only)
ULONG Reserved0: 2; // <20:19>
ULONG Nmi: 1; // <21> 8259 Eisa NMI
ULONG SoftErr: 1; // <22> Soft (correctable) error interrupt
ULONG HardErr: 1; // <23> Hard error interrupt
ULONG Target: 1; // <24> Target device number (0,1)
ULONG McDevId: 6; // PCI source of interrupt
ULONG Valid: 1; // Device interrupt pending/serviced
} ;
struct{
ULONG IntReq: 24; // <23:0> InterruptState
} ;
ULONG all;
} IOD_POSTED_INTERRUPT, *PIOD_POSTED_INTERRUPT;
extern PIOD_POSTED_INTERRUPT HalpIodPostedInterrupts;
//
// Address of vector table in memory
//
typedef union _IOD_POSTED_INTERRUPT_ADDR {
struct{
ULONG BusVectorOffset: 2; // QuadWord per vector entry
ULONG PciBusOffset: 4; // PCI bus offset into CPU area
ULONG CpuOffset: 6; // 64K area per CPU
ULONG Base4KPage: 20; // 4K page address of table
};
ULONG all;
} IOD_POSTED_INTERRUPT_ADDR, PIOD_POSTED_INTERRUPT_ADDR;
#define Ncr810 Eisa
//
// Define the structures to access the IOD general CSRs.
//
typedef struct _IOD_GENERAL_CSRS{
UCHAR PciRevision; // (000) PCI Revision
UCHAR Filler1; // (020)
UCHAR WhoAmI; // (040) WhoAmI
UCHAR Filler2; // (060)
UCHAR PciLat; // (080) PCI Latency
UCHAR Filler3[3]; // (0a0 - 0e0)
UCHAR CapCtrl; // (100) CAP control (MC-PCI Bridge Command)
UCHAR Filler4[15]; // (120 - 2e0)
UCHAR PerfMon; // (300) Performance Monitor Counter
UCHAR Filler5; // (320)
UCHAR PerfCon; // (340) Peformance Monitor Ctrl Register
UCHAR Filler6[5]; // (360 - 3e0)
UCHAR HaeMem; // (400) Host address extension, sparse memory
UCHAR Filler7; // (420)
UCHAR HaeIo; // (440) Host address extension, space i/o
UCHAR Filler8; // (460)
UCHAR IackSc; // (480) Interrup Acknowledge / Special Cycle
UCHAR Filler9; // (4A0)
UCHAR HaeDense; // (4C0) Host address extension, dense memory
} IOD_GENERAL_CSRS, *PIOD_GENERAL_CSRS;
typedef union _IOD_PCI_REVISION{
struct{
ULONG CapRev: 4; // <3:0> CAP Revision Id
ULONG HorseRev: 4; // <7:4> Horse Revision Id
ULONG SaddleRev: 4; // <11:8> Saddle Revision Id
ULONG SaddleType: 3; // <14:12> Type Id
ULONG EisaPresent: 1; // <15> Set if EISA bus present
ULONG SubClass: 8; // <23:16> PCI Host bus bridge sub class
ULONG BaseClass: 8; // <3:124> PCI Host bus bridge base class
};
ULONG all;
} IOD_PCI_REVISION, *PIOD_PCI_REVISION;
extern ULONG HalpIodPciRevision; // global containing IOD PCI revision id
typedef union _IOD_WHOAMI{
struct{
ULONG Devid: 6; // <5:0> MC Bus Device Id
ULONG CpuInfo: 8; // <13:6> Data Bits
ULONG Reserved0: 18; // <31:14> MBZ
};
MC_DEVICE_ID McDevId; // <5:0> MC Bus Device Id
ULONG all;
} IOD_WHOAMI, *PIOD_WHOAMI;
#define CACHED_CPU_FILL_ERROR 0x80 // CpuInfo Data Bits
#define CACHED_CPU_DTAG_PARITY_ERROR 0x40 // CpuInfo Data Bits
typedef union _IOD_PCI_LAT{
struct{
ULONG Reserved0: 8; // <7:0>
ULONG Latency: 8; // <15:8> PCI Master Latency timer (in PCI clocks)
ULONG Reserved1: 16; // <31:16>
};
ULONG all;
} IOD_PCI_LAT, *PIOD_PCI_LAT;
typedef union _IOD_CAP_CONTROL{
struct{
ULONG Led: 1; // <0> Selftest passed LED
ULONG Reserved0: 3; // <3:1>
ULONG DlyRdEn: 1; // <4> Enables PCI delayed read protocol ( > 16 clks)
ULONG PciMemEn: 1; // <5> Enables Bridge response to PCI transactions
ULONG PciReq64: 1; // <6> Enables request for 64-bit PCI transactions
ULONG PciAck64: 1; // <7> Enables accepting 64-bit PCI transactions
ULONG PciAddrPe: 1; // <8> Enables PCI address parity checking & SERR#
ULONG McCmdAddrPe: 1; // <9> Enables Check MC bus CMD / Address Parity
ULONG McNxmEn: 1; // <10> Enables Check MC bus NXM on IO space reads
ULONG McBusMonEn: 1; // <11> Enables Check MC bus errors when a bystander
ULONG Reserved1: 4; // <15:12>
ULONG PendNum: 4; // <19:16> Write Pend Number Threshold
ULONG RdType: 2; // <21:20> Memory Read Prefetch Type
ULONG RlType: 2; // <23:22> Memory Read Line Prefetch Type
ULONG RmType: 2; // <25:24> Memory Read Multiple Prefetch Type
ULONG PartialWrEn: 1; // <26> Partial Write Enable
ULONG Reserved3: 3; // <29:27>
ULONG ArbMode: 2; // <31:30> PCI Arbitration Mode
};
ULONG all;
} IOD_CAP_CONTROL, *PIOD_CAP_CONTROL;
typedef enum _IOD_READ_PREFETCH_TYPE{
IodPrefetchShort = 0x00,
IodPrefetchMedium = 0x01,
IodPrefetchLong = 0x02,
IodPrefetchReserved = 0x03
} IOD_READ_PREFETCH_TYPE, *PIOD_READ_PREFETCH_TYPE;
typedef enum _IOD_PCI_ARB_MODE{
IodArbBridgePriority = 0x00,
IodArbRoundRobin = 0x01,
IodArbModRoundRobin = 0x02,
IodArbReserved = 0x03
} IOD_PCI_ARB_MODE, *PIOD_PCI_ARB_MODE;
typedef union _IOD_PERF_MON{
struct{
ULONG Counter: 24; // <23:0>
ULONG Reserved0: 8; // <31:24> sets HAE for sparse memory space
};
ULONG all;
} IOD_PERF_MON, *PIOD_PERF_MON;
typedef union _IOD_PERF_CON{
struct{
ULONG CntFrame: 1; // <0> 0 = count PCI Frame#, 1 = cnt TLB miss
ULONG Reserved0: 31; // <31:1>
};
ULONG all;
} IOD_PERF_CON, *PIOD_PERF_CON;
typedef enum _IOD_PERF_COUNTER_MODE{
IodPerfMonPciFrame = 0x0,
IodPerfMonTlbMiss = 0x1
} IOD_PERF_COUNTER_MODE, *PIOD_PERF_COUNTER_MODE;
typedef union _IOD_HAE_MEM{
struct{
ULONG Reserved0: 26; // <25:0>
ULONG HaeMem: 6; // <31:26> sets HAE for sparse memory space
};
ULONG all;
} IOD_HAE_MEM, *PIOD_HAE_MEM;
typedef union _IOD_HAE_IO{
struct{
ULONG Reserved0: 25; // <24:0>
ULONG HaeIo: 7; // <31:25> sets HAE for sparse i/o space
};
ULONG all;
} IOD_HAE_IO, *PIOD_HAE_IO;
typedef union _IOD_IACK_SC{
struct{
ULONG Message: 16; // <15:0> Encoded Message
ULONG MessageEx: 16; // <31:16> Message Dependent
};
ULONG all;
} IOD_IACK_SC, *PIOD_IACK_SC;
//
// Define the structures and definitions for the IOD interrupt registers.
//
typedef struct _IOD_INT_CSRS{
UCHAR IntCtrl; // (500) Interrupt Control
UCHAR Filler1; // (520)
UCHAR IntReq; // (540) Interrupt Request
UCHAR Filler2; // (560)
UCHAR IntTarg; // (580) Interrupt Target Devices
UCHAR Filler3; // (5a0)
UCHAR IntAddr; // (5c0) Interrupt Target Address
UCHAR Filler4; // (5e0)
UCHAR IntAddrExt; // (600) Interrupt Target Address Extension
UCHAR Filler5; // (620)
UCHAR IntMask0; // (640) Interrupt Mask 0
UCHAR Filler6; // (660)
UCHAR IntMask1; // (680) Interrupt Mask 1
UCHAR Filler7[0x8001c3]; // (6a0 - 10003ea0)
UCHAR IntAck0; // (10003f00) Interrupt Target 0 Acknowledge
UCHAR Filler8; // (10003f20)
UCHAR IntAck1; // (10003f40) Interrupt Target 1 Acknowledge
} IOD_INT_CSRS, *PIOD_INT_CSRS;
//
// 16 PCI vectors per IOD
//
#define IOD_PCI_VECTORS 0x10
typedef union _IOD_INT_CONTROL{
struct{
ULONG EnInt: 1; // <0> Enable MC Bus IO interrupt transactions
ULONG EnIntNum: 1; // <1> Enable MC Bus interrupt number write
ULONG Reserved: 4; // <31:2>
};
ULONG all;
} IOD_INT_CONTROL, *PIOD_INT_CONTROL;
#define IOD_INT_CTL_ENABLE_IO_INT 0x1
#define IOD_INT_CTL_DISABLE_IO_INT 0x0
#define IOD_INT_CTL_ENABLE_VECT_WRITE 0x2
#define IOD_INT_CTL_DISABLE_VECT_WRITE 0x0
typedef union _IOD_INT_REQUEST{
struct{
ULONG IntReq: 22; // <21:0> Interrupt State
ULONG SoftErr: 1; // <22> Soft (correctable) error interrupt
ULONG HardErr: 1; // <23> Hard error interrupt
ULONG Reserved: 8; // <31:24>
};
ULONG all;
} IOD_INT_REQUEST, *PIOD_INT_REQUEST;
typedef union _IOD_INT_TARGET_DEVICE{
struct{
ULONG Int0TargDevId: 6; // <5:0> Interrupt Target 0 McDevid
ULONG Int1TargDevId: 6; // <11:6> Interrupt Target 1 McDevid
ULONG Reserved: 20; // <31:12> MBZ
};
ULONG all;
} IOD_INT_TARGET_DEVICE, *PIOD_INT_TARGET_DEVICE;
#define IOD_MAX_INT_TARG 2
typedef union _IOD_INT_ADDR{
struct{
ULONG Reserved1: 2; // <1:0> MBZ
ULONG PciOffset: 4; // <5:2> PCI Offset
ULONG Reserved2: 6; // <11:6> MBZ
ULONG IntAddrLo: 20; // <31:12> Page address of interrupt target
};
ULONG all;
} IOD_INT_ADDR, *PIOD_INT_ADDR;
typedef union _IOD_INT_ADDR_EXT{
struct{
ULONG IntAddrExt: 7; // <6:0> Upper bits of interrupt target address
ULONG Reserved: 25; // <31:7> MBZ
};
ULONG all;
} IOD_INT_ADDR_EXT, *PIOD_INT_ADDR_EXT;
//
// IOD_INT_MASK applies to IntMask0 and IntMask1
//
typedef union _IOD_INT_MASK{
struct{
ULONG IntMask: 24; // <23:0> Interrupt Mask
ULONG Reserved: 8; // <31:24>
};
struct{
ULONG IntA0: 1; // <0> PCI Slot 0
ULONG IntB0: 1;
ULONG IntC0: 1;
ULONG IntD0: 1;
ULONG IntA1: 1; // <4> PCI Slot 1
ULONG IntB1: 1;
ULONG IntC1: 1;
ULONG IntD1: 1;
ULONG IntA2: 1; // <8> PCI Slot 2
ULONG IntB2: 1;
ULONG IntC2: 1;
ULONG IntD2: 1;
ULONG IntA3: 1; // <12> PCI Slot 3
ULONG IntB3: 1;
ULONG IntC3: 1;
ULONG IntD3: 1;
ULONG EisaInt: 1; // <16> 8259 Eisa IRQ's (PCI 0), NCR810 SCSI (PCI 1)
ULONG I2cCtrl: 1; // <17> 8254 I2C Controller (PCI 0 Only)
ULONG I2cBus: 1; // <18> 8254 I2C Bus: Pwr, Fan, etc. (PCI 0 Only)
ULONG Reserved0: 2; // <20:19>
ULONG Nmi: 1; // <21> 8259 Eisa NMI
ULONG SoftErr: 1; // <22> Soft Error from CAP Chip
ULONG HardErr: 1; // <23> Hard Error from CAP Chip
ULONG Reserved1 :8; // <31:24>
};
ULONG all;
} IOD_INT_MASK, *PIOD_INT_MASK;
typedef enum _IOD_MASK_DEFS{
IodPci0IntMask = (1 << 0),
IodPci1IntMask = (1 << 1),
IodPci2IntMask = (1 << 2),
IodPci3IntMask = (1 << 3),
IodPci4IntMask = (1 << 4),
IodPci5IntMask = (1 << 5),
IodPci6IntMask = (1 << 6),
IodPci7IntMask = (1 << 7),
IodPci8IntMask = (1 << 8),
IodPci9IntMask = (1 << 9),
IodPci10IntMask = (1 << 10),
IodPci11IntMask = (1 << 11),
IodPci12IntMask = (1 << 12),
IodPci13IntMask = (1 << 13),
IodPci14IntMask = (1 << 14),
IodPci15IntMask = (1 << 15),
IodEisaIntMask = (1 << 16),
IodScsiIntMask = (1 << 16),
IodI2cCtrlIntMask = (1 << 17),
IodI2cBusIntMask = (1 << 18),
IodEisaNmiIntMask = (1 << 21),
IodSoftErrIntMask = (1 << 22),
IodHardErrIntMask = (1 << 23),
IodIntMask = 0x03ffffff,
IodPciIntMask = 0x0000ffff,
IodIntDisableMask = 0x00000000,
} IOD_MASK_DEFS, *PIOD_MASK_DEFS;
//
// IOD_INT_ACK applies to IntAck0 and IntAck1
//
typedef union _IOD_INT_ACK{
struct{
ULONG Reserved: 32; // <31:0> Reserved
};
ULONG all;
} IOD_INT_ACK, *PIOD_INT_ACK;
//
// Define the structures and definitions for the IOD diagnostic registers.
//
typedef struct _IOD_DIAG_CSRS{
UCHAR CapDiag; // (700) CAP Diagnostic Control register
UCHAR Filler1; // (720)
UCHAR Scratch; // (740) General Purpose Scratch register
UCHAR Filler2; // (760)
UCHAR ScratchAlias; // (780) General Purpose Scratch register alias
UCHAR Filler3; // (7a0)
UCHAR TopOfMem; // (7c0) Top of Memory
} IOD_DIAG_CSRS, *PIOD_DIAG_CSRS;
typedef union _IOD_CAP_DIAG {
struct{
ULONG PciReset: 1; // <0> Reset PCI (must be cleared with 100 us)
ULONG Reserved0: 30; // <29:1>
ULONG ForceMcAddrPe: 1; // <30> Force bad parity to MC bus (one-shot)
ULONG ForcePciAddrPe: 1;// <31> Force bad parity to PCI bus (one-shot)
};
ULONG all;
} IOD_CAP_DIAG, *PIOD_CAP_DIAG;
//
// Define the structures and definitions for the IOD error symptom registers.
//
typedef struct _IOD_ERROR_CSRS{
UCHAR McErr0; // (800) MC Error Information Register 0
UCHAR Filler0; // (820)
UCHAR McErr1; // (840) MC Error Information Register 1
UCHAR Filler1; // (860)
UCHAR CapErr; // (880) CAP Error Register
UCHAR Filler2[61]; // (8a0-1020)
UCHAR PciErr1; // (1040) PCI error - failing address
UCHAR Filler3[381]; // (1060-3fe0)
UCHAR MdpaStat; // (4000) MDPA Status Register
UCHAR Filler4; // (4020)
UCHAR MdpaSyn; // (4040) MDPA Error Syndrome register
UCHAR Filler5; // (4060)
UCHAR MdpaDiag; // (4080) MDPA Diagnostic Check Register
UCHAR Filler6[507]; // (40a0-7fe0)
UCHAR MdpbStat; // (8000) MDPB Status Register
UCHAR Filler7; // (8020)
UCHAR MdpbSyn; // (8040) MDPB Error Syndrome register
UCHAR Filler8; // (8060)
UCHAR MdpbDiag; // (8080) MDPB Diagnostic Check Register
} IOD_ERROR_CSRS, *PIOD_ERROR_CSRS;
typedef union _IOD_MC_ERR0{
struct{
ULONG Addr: 32; // <31:0> address bits 31-4 of current MC bus error
};
ULONG all;
} IOD_MC_ERR0, *PIOD_MC_ERR0;
typedef union _IOD_MC_ERR1{
struct{
ULONG Addr39_32: 8; // <7:0> address bits 39-32 of current MC bus error
ULONG McCmd: 6; // <13:8> MC Bus command active at time of error
ULONG DevId: 6; // <19:14> Gid,Mid of bus master at time of error
ULONG Dirty: 1; // <20> Set if MC Bus Read/Dirty transaction
ULONG Reserved0: 10; // <30:21>
ULONG Valid: 1; // <31> OR of CAP_ERR<30:23), McErr0 and McErr1 valid
};
ULONG all;
} IOD_MC_ERR1, *PIOD_MC_ERR1;
typedef union _IOD_CAP_ERR{
struct{
ULONG Perr: 1; // <0> PCI bus PERR# observed by bridge
ULONG Serr: 1; // <1> PCI bus SERR# observed by bridge
ULONG Mab: 1; // <2> PCI target abort observed by bridge
ULONG PteInv: 1; // <3> Invalid Pte
ULONG PciErrValid: 1; // <4> (RO) PCI Error Valid - Logical OR of <3:0>
ULONG Reserved0: 18; // <22:5>
ULONG PioOvfl: 1; // <23> CAP buffer full, transaction lost
ULONG LostMcErr: 1; // <24> Lost uncorrectable MC error
ULONG McAddrPerr: 1; // <25> MC Bus command/address parity error
ULONG Nxm: 1; // <26> Nonexistent MC Bus address error
ULONG CrdA: 1; // <27> Correctable ECC error detected by MDPA
ULONG CrdB: 1; // <28> Correctable ECC error detected by MDPB
ULONG RdsA: 1; // <29> Uncorrectable ECC error detected by MDPA
ULONG RdsB: 1; // <30> Uncorrectable ECC error detected by MDPB
ULONG McErrValid: 1; // <31> (RO) MC Error Valid - Logical OR of <30:23>
};
ULONG all;
} IOD_CAP_ERR, *PIOD_CAP_ERR;
typedef struct _IOD_PCI_ERR1{
ULONG PciAddress; // (RO) <31:0> PCI Address
} IOD_PCI_ERR1, *PIOD_PCI_ERR1;
typedef union _IOD_MDPA_STAT{
struct{
ULONG MdpaRev: 4; // <3:0> MDP chip revision level
ULONG Reserved: 26; // <29:4>
ULONG Crd: 1; // <30> MdpaSyn contains correctable error syndrome
ULONG Rds: 1; // <31> MdpaSyn contains uncorrectable error syndrome
};
ULONG all;
} IOD_MDPA_STAT, *PIOD_MDPA_STAT;
typedef union _IOD_MDPB_STAT{
struct{
ULONG MdpbRev: 4; // <3:0> MDP chip revision level
ULONG Reserved: 26; // <29:4>
ULONG Crd: 1; // <30> MdpaSyn contains correctable error syndrome
ULONG Rds: 1; // <31> MdpaSyn contains uncorrectable error syndrome
};
ULONG all;
} IOD_MDPB_STAT, *PIOD_MDPB_STAT;
typedef union _IOD_MDPA_SYN{
struct{
ULONG EccSyndrome0: 8; // <8:0> Cycle 0 ECC Syndrome
ULONG EccSyndrome1: 8; // <15:9> Cycle 1 ECC Syndrome
ULONG EccSyndrome2: 8; // <23:16> Cycle 2 ECC Syndrome
ULONG EccSyndrome3: 8; // <31:24> Cycle 3 ECC Syndrome
};
ULONG all;
} IOD_MDPA_SYN, *PIOD_MDPA_SYN;
typedef union _IOD_MDPB_SYN{
struct{
ULONG EccSyndrome0: 8; // <8:0> Cycle 0 ECC Syndrome
ULONG EccSyndrome1: 8; // <15:9> Cycle 1 ECC Syndrome
ULONG EccSyndrome2: 8; // <23:16> Cycle 2 ECC Syndrome
ULONG EccSyndrome3: 8; // <31:24> Cycle 3 ECC Syndrome
};
ULONG all;
} IOD_MDPB_SYN, *PIOD_MDPB_SYN;
typedef union _IOD_MDPA_DIAG{
struct{
ULONG DiagCheck: 8; // <7:0> Data for ECC in diag DMA writes
ULONG Reserved: 20; // <27:8>
ULONG EccCkEn: 1; // <28> Enable ECC check
ULONG ParCkEn: 1; // <29> Enable PCI data parity check
ULONG FpePciLo: 1; // <30> Force bad PCI parity on low 32 bits of data
ULONG UseDiagCheck: 1; // <31> DMA write cycles to mem use DiagCheck as ECC
};
ULONG all;
} IOD_MDPA_DIAG, *PIOD_MDPA_DIAG;
typedef union _IOD_MDPB_DIAG{
struct{
ULONG DiagCheck: 8; // <7:0> Data for ECC in diag DMA writes
ULONG Reserved: 20; // <27:8>
ULONG EccCkEn: 1; // <28> Enable ECC check
ULONG ParCkEn: 1; // <29> Enable PCI data parity check
ULONG FpePciHi: 1; // <30> Force bad PCI parity on high 32 bits of data
ULONG UseDiagCheck: 1; // <31> DMA write cycles to mem use DiagCheck as ECC
};
ULONG all;
} IOD_MDPB_DIAG, *PIOD_MDPB_DIAG;
//
// Define I/O CSRs specific to the Rawhide IOD
//
#if 0
typedef union _IOD_ELCR1{
struct{
ULONG From0Rdy: 1; // <0> (RO) Primary flash ROM ready to accept cmds
ULONG From1Rdy: 1; // <1> (RO) Secondary flash ROM ready to accept cmds
ULONG FsafeWrProt: 1; // <2> (RO) Fail Safe Write Protect (if set)
ULONG AvpPresent: 1; // <3> (RO) Programming jumper inserted (if set)
ULONG From1Sel: 1; // <4> Selects secondary flash ROM
ULONG FromAddr: 3; // <7:5> Selects 64Kb flash ROM range
};
ULONG all;
} IOD_ELCR1, *PIOD_ELCR1;
#else
typedef union _IOD_ELCR1{
struct{
ULONG From0Rdy: 1; // <0> (RO) Primary flash ROM ready to accept cmds
ULONG From1Rdy: 1; // <1> (RO) Secondary flash ROM ready to accept cmds
ULONG AvpPresent: 1; // <2> (RO) Programming jumper inserted (if set)
ULONG FromSel: 1; // <3> (RW) Selects secondary flash ROM
ULONG FromAddr: 4; // <7:4> (RW) Selects 64Kb flash ROM range
};
ULONG all;
} IOD_ELCR1, *PIOD_ELCR1;
#endif
typedef union _IOD_ELCR2{
struct{
ULONG SfwResetReq: 1; // <0> (WO) System-wide reset to Power Control Module
ULONG SfwReset: 1; // <1> (RO) Most recent reset was via SfwResetReq
ULONG CapReset: 1; // <2> (RO) Most recent reset was from CAP chip
ULONG OcpReset: 1; // <3> (RO) Most recent reset was via OCP reset swtch
ULONG RsmReset: 1; // <4> (RO) Most recent reset was via RSM module
ULONG Reserved0: 3; // <7:5>
};
ULONG all;
} IOD_ELCR2, *PIOD_ELCR2;
//
// Define structures and definitions for Scatter/Gather control registers:
//
typedef struct _IOD_SG_CSRS{
UCHAR Tbia; // (1300) Translation buffer invalidate all
UCHAR Filler; // (1320)
UCHAR Hbase; // (1340) PC Hole Compatibility Register
UCHAR Filler0[5]; // (1360-13e0)
UCHAR W0base; // (1400) Base address, DMA window 0
UCHAR Filler1; // (1420)
UCHAR W0mask; // (1440) Mask Register, DMA window 0
UCHAR Filler2; // (1460)
UCHAR T0base; // (1480) Translation Base, DMA window 0
UCHAR Filler3[3]; // (14a0 - 14e0)
UCHAR W1base; // (1500) Base address, DMA window 1
UCHAR Filler4; // (1520)
UCHAR W1mask; // (1540) Mask Register, DMA window 1
UCHAR Filler5; // (1560)
UCHAR T1base; // (1580) Translation Base, DMA window 1
UCHAR Filler6[3]; // (15a0 - 15e0)
UCHAR W2base; // (1600) Base address, DMA window 2
UCHAR Filler7; // (1620)
UCHAR W2mask; // (1640) Mask Register, DMA window 2
UCHAR Filler8; // (1660)
UCHAR T2base; // (1680) Translation Base, DMA window 2
UCHAR Filler9[3]; // (16a0 - 16e0)
UCHAR W3base; // (1700) Base address, DMA window 3
UCHAR Filler10; // (1720)
UCHAR W3mask; // (1740) Mask Register, DMA window 3
UCHAR Filler11; // (1760)
UCHAR T3base; // (1780) Translation Base, DMA window 3
UCHAR Filler12; // (17a0)
UCHAR Wdac; // (17c0) Window DAC Base
UCHAR Filler13; // (17e0)
UCHAR TbTag0; // (1800) Translation Buffer Tag 0
UCHAR Filler14; // (1820)
UCHAR TbTag1; // (1840) Translation Buffer Tag 1
UCHAR Filler15; // (1860)
UCHAR TbTag2; // (1880) Translation Buffer Tag 2
UCHAR Filler16; // (18a0)
UCHAR TbTag3; // (18c0) Translation Buffer Tag 3
UCHAR Filler17; // (18e0)
UCHAR TbTag4; // (1900) Translation Buffer Tag 4
UCHAR Filler18; // (1920)
UCHAR TbTag5; // (1940) Translation Buffer Tag 5
UCHAR Filler19; // (1960)
UCHAR TbTag6; // (1980) Translation Buffer Tag 6
UCHAR Filler20; // (19a0)
UCHAR TbTag7; // (19c0) Translation Buffer Tag 7
UCHAR Filler21; // (19e0)
UCHAR Tb0Page0; // (2000) Translation Buffer 0 Page 0
UCHAR Filler22; // (2020)
UCHAR Tb0Page1; // (2040) Translation Buffer 0 Page 1
UCHAR Filler23; // (2060)
UCHAR Tb0Page2; // (2080) Translation Buffer 0 Page 2
UCHAR Filler24; // (20a0)
UCHAR Tb0Page3; // (20c0) Translation Buffer 0 Page 3
UCHAR Filler25; // (20e0)
UCHAR Tb1Page0; // (2100) Translation Buffer 1 Page 0
UCHAR Filler26; // (2120)
UCHAR Tb1Page1; // (2140) Translation Buffer 1 Page 1
UCHAR Filler27; // (2160)
UCHAR Tb1Page2; // (2180) Translation Buffer 1 Page 2
UCHAR Filler28; // (21a0)
UCHAR Tb1Page3; // (21c0) Translation Buffer 1 Page 3
UCHAR Filler29; // (21e0)
UCHAR Tb2Page0; // (2200) Translation Buffer 2 Page 0
UCHAR Filler30; // (2220)
UCHAR Tb2Page1; // (2240) Translation Buffer 2 Page 1
UCHAR Filler31; // (2260)
UCHAR Tb2Page2; // (2280) Translation Buffer 2 Page 2
UCHAR Filler32; // (22a0)
UCHAR Tb2Page3; // (22c0) Translation Buffer 2 Page 3
UCHAR Filler33; // (22e0)
UCHAR Tb3Page0; // (2300) Translation Buffer 3 Page 0
UCHAR Filler34; // (2320)
UCHAR Tb3Page1; // (2340) Translation Buffer 3 Page 1
UCHAR Filler35; // (2360)
UCHAR Tb3Page2; // (2380) Translation Buffer 3 Page 2
UCHAR Filler36; // (23a0)
UCHAR Tb3Page3; // (23c0) Translation Buffer 3 Page 3
UCHAR Filler37; // (23e0)
UCHAR Tb4Page0; // (2400) Translation Buffer 4 Page 0
UCHAR Filler38; // (2420)
UCHAR Tb4Page1; // (2440) Translation Buffer 4 Page 1
UCHAR Filler39; // (2460)
UCHAR Tb4Page2; // (2480) Translation Buffer 4 Page 2
UCHAR Filler40; // (24a0)
UCHAR Tb4Page3; // (24c0) Translation Buffer 4 Page 3
UCHAR Filler41; // (24e0)
UCHAR Tb5Page0; // (2500) Translation Buffer 5 Page 0
UCHAR Filler42; // (2520)
UCHAR Tb5Page1; // (2540) Translation Buffer 5 Page 1
UCHAR Filler43; // (2560)
UCHAR Tb5Page2; // (2580) Translation Buffer 5 Page 2
UCHAR Filler44; // (25a0)
UCHAR Tb5Page3; // (25c0) Translation Buffer 5 Page 3
UCHAR Filler45; // (25e0)
UCHAR Tb6Page0; // (2600) Translation Buffer 6 Page 0
UCHAR Filler46; // (2620)
UCHAR Tb6Page1; // (2640) Translation Buffer 6 Page 1
UCHAR Filler47; // (2660)
UCHAR Tb6Page2; // (2680) Translation Buffer 6 Page 2
UCHAR Filler48; // (26a0)
UCHAR Tb6Page3; // (26c0) Translation Buffer 6 Page 3
UCHAR Filler49; // (26e0)
UCHAR Tb7Page0; // (2700) Translation Buffer 7 Page 0
UCHAR Filler50; // (2720
UCHAR Tb7Page1; // (2740) Translation Buffer 7 Page 1
UCHAR Filler51; // (2760)
UCHAR Tb7Page2; // (2780) Translation Buffer 7 Page 2
UCHAR Filler52; // (27a0)
UCHAR Tb7Page3; // (27c0) Translation Buffer 7 Page 3
} IOD_SG_CSRS, *PIOD_SG_CSRS;
typedef union _IOD_TBIA{
struct{
ULONG Reserved0: 32; // <31:0> Don't care
};
ULONG all;
} IOD_TBIA, *PIOD_TBIA;
typedef union _IOD_HBASE{
struct{
ULONG Hbound: 9; // <8:0> PC compatibility hole upper bound
ULONG Reserved0: 4; // <12:9>
ULONG PcHe1: 1; // <13> Fixed hole (512 Kb - 1 Mb) enable
ULONG PcHe2: 1; // <14> Moveable hole (Hbase - Hbound) enable
ULONG Hbase: 9; // <23:15> PC compatibility hole lower bound
ULONG Reserved1: 8; // <31:24>
};
ULONG all;
} IOD_HBASE, *PIOD_HBASE;
typedef union _IOD_WBASE{
struct{
ULONG Wen: 1; // <0> Window enable
ULONG SgEn: 1; // <1> Scatter Gather enable
ULONG Reserved: 1; // <2>
ULONG DacEn: 1; // <3> DAC Enable (W3base only)
ULONG Reserved0: 16; // <19:4>
ULONG Wbase: 12; // <31:20> Base address of DMA window, bits <31:20>
};
ULONG all;
} IOD_WBASE, *PIOD_WBASE;
typedef union _IOD_WMASK{
struct{
ULONG Reserved0: 20; // <19:0>
ULONG Wmask: 12; // <31:20> Window mask
};
ULONG all;
} IOD_WMASK, *PIOD_WMASK;
typedef union _IOD_TBASE{
struct{
ULONG Reserved0: 2; // <1:0>
ULONG Tbase: 30; // <31:2> Translation base address, bits <39:10>
};
ULONG all;
} IOD_TBASE, *PIOD_TBASE;
typedef union _IOD_WDAC{
struct{
ULONG Wdac: 8; // <7:0> Bbase addr of DAC DMA window 3, bits <39:32>
ULONG Reserved0: 24; // <31:8>
};
ULONG all;
} IOD_WDAC, *PIOD_WDAC;
typedef union _IOD_TB_TAG{
struct{
ULONG Valid: 1; // <0> SG TB tag is valid
ULONG Reserved0: 1; // <1>
ULONG Dac: 1; // <2> SG TB tag corresponds to a 64-bit (DAC) addr
ULONG Reserved1: 12; // <14:3>
ULONG TbTag: 17; // <31:15> SG TB tag itself
};
ULONG all;
} IOD_TB_TAG, *PIOD_TB_TAG;
typedef union _IOD_TB_PAGE{
struct{
ULONG Valid: 1; // <0> SG Page address is valid
ULONG PageAddr: 27; // <27:1> SG TB Page address
ULONG Reserved1: 12; // <31:28>
};
ULONG all;
} IOD_TB_PAGE, *PIOD_TB_PAGE;
//
// DMA Window Values.
//
// The IOD will be initialized to allow 2 DMA windows.
// The first window will be for the use of of ISA devices and DMA slaves
// and therefore must have logical addresses below 16MB.
// The second window will be for bus masters (non-ISA) and so may be
// above 16MB.
//
// The arrangement of the windows will be as follows:
//
// Window Logical Start Address Window Size
// ------ --------------------- -----------
// Isa 8MB 8MB
// Master 16MB 16MB
//
#define ISA_DMA_WINDOW_BASE (__8MB)
#define ISA_DMA_WINDOW_SIZE (__8MB)
#define MASTER_DMA_WINDOW_BASE (__16MB)
#define MASTER_DMA_WINDOW_SIZE (__16MB)
//
// Define the software control registers for a DMA window.
//
typedef struct _WINDOW_CONTROL_REGISTERS{
PVOID WindowBase;
ULONG WindowSize;
PVOID TranslatedBaseRegister;
PVOID WindowBaseRegister;
PVOID WindowMaskRegister;
PVOID WindowTbiaRegister;
} WINDOW_CONTROL_REGISTERS, *PWINDOW_CONTROL_REGISTERS;
//
// Define types of windows.
//
typedef enum _IOD_WINDOW_NUMBER{
IodIsaWindow,
IodMasterWindow
} IOD_WINDOW_NUMBER, *PIOD_WINDOW_NUMBER;
//
// Define IOD Window Control routines.
//
VOID
HalpIodInitializeSfwWindow(
PWINDOW_CONTROL_REGISTERS WindowRegisters,
IOD_WINDOW_NUMBER WindowNumber
);
VOID
HalpIodProgramDmaWindow(
PWINDOW_CONTROL_REGISTERS WindowRegisters,
PVOID MapRegisterBase
);
VOID
HalpIodInvalidateTlb(
PWINDOW_CONTROL_REGISTERS WindowRegisters
);
PKPCR
HalpRdPcr(
VOID
);
//
// Define IOD CSR Routines
//
VOID
WRITE_IOD_REGISTER(
PVOID,
ULONG
);
ULONG
READ_IOD_REGISTER(
PVOID
);
VOID
WRITE_IOD_REGISTER_NEW(
MC_DEVICE_ID,
PVOID,
ULONG
);
ULONG
READ_IOD_REGISTER_NEW(
MC_DEVICE_ID,
PVOID
);
//
// Define IOD interrupt request/acknowledge routines
//
ULONG
INTERRUPT_ACKNOWLEDGE(
PVOID
);
VOID
IOD_INTERRUPT_ACKNOWLEDGE(
MC_DEVICE_ID McDeviceId,
ULONG Target
);
VOID
CPU_CLOCK_ACKNOWLEDGE(
MC_DEVICE_ID McDeviceId
);
VOID
IP_INTERRUPT_REQUEST(
MC_DEVICE_ID McDeviceId
);
VOID
IP_INTERRUPT_ACKNOWLEDGE(
MC_DEVICE_ID McDeviceId
);
//
// Define MC Bus emumerator routines
//
ULONG
HalpMcBusEnumStart(
MC_DEVICE_MASK McDeviceMask,
PMC_ENUM_CONTEXT McContext
);
BOOLEAN
HalpMcBusEnum(
PMC_ENUM_CONTEXT McContext
);
VOID
HalpMcBusEnumAndCall(
MC_DEVICE_MASK McDeviceMask,
PMC_ENUM_ROUTINE McBusEnumRoutine,
...
);
//
// Define other IOD routines
//
ULONG
HalpReadWhoAmI(
VOID
);
VOID
HalpInitializeIodVectorTable(
VOID
);
VOID
HalpInitializeIodMappingTable(
MC_DEVICE_ID McDeviceId,
ULONG PciBusNumber,
va_list Arguments
);
BOOLEAN
HalpIodUncorrectableError(
PMC_DEVICE_ID pMcDeviceId
);
VOID
HalpIodReportFatalError(
MC_DEVICE_ID McDevid
);
BOOLEAN
HalpIodMachineCheck(
IN PEXCEPTION_RECORD ExceptionRecord,
IN PKEXCEPTION_FRAME ExceptionFrame,
IN PKTRAP_FRAME TrapFrame
);
VOID
HalpInitializeIod(
MC_DEVICE_ID McDeviceId,
ULONG PciBusNumber,
va_list Arguments
);
VOID
HalpInitializeIodVectorCSRs(
MC_DEVICE_ID McDeviceId,
ULONG PciBusNumber,
va_list Arguments
);
VOID
HalpInitializeIodMachineChecks(
IN BOOLEAN ReportCorrectableErrors,
IN BOOLEAN PciParityChecking
);
VOID
HalpIodSoftErrorInterrupt(
VOID
);
VOID
HalpIodHardErrorInterrupt(
VOID
);
VOID
HalpClearAllIods(
IOD_CAP_ERR IodCapErrMask
);
#define ALL_CAP_ERRORS 0xffffffff
#if HALDBG || defined(DUMPIODS)
VOID
DumpIod(
MC_DEVICE_ID DevId,
IOD_REGISTER_CLASS RegistersToDump
);
VOID
DumpAllIods(
IOD_REGISTER_CLASS RegistersToDump
);
#endif //HALDBG
//
// VOID
// INITIALIZE_ISA_DMA_CONTROL(
// PWINDOW_CONTROL_REGISTERS WindowRegisters
// )
//
// Routine Description:
//
// Initialize the DMA Control software window registers for the ISA
// DMA window.
//
// Arguments:
//
// WindowRegisters - Supplies a pointer to the software window control.
//
// Return Value:
//
// None.
//
#define INITIALIZE_ISA_DMA_CONTROL( WR ) \
HalpIodInitializeSfwWindow( (WR), IodIsaWindow );
//
// VOID
// INITIALIZE_MASTER_DMA_CONTROL(
// PWINDOW_CONTROL_REGISTERS WindowRegisters
// )
//
// Routine Description:
//
// Initialize the DMA Control software window registers for the PCI
// DMA window.
//
// Arguments:
//
// WindowRegisters - Supplies a pointer to the software window control.
//
// Return Value:
//
// None.
//
#define INITIALIZE_MASTER_DMA_CONTROL( WR ) \
HalpIodInitializeSfwWindow( (WR), IodMasterWindow );
//
// VOID
// INITIALIZE_DMA_WINDOW(
// PWINDOW_CONTROL_REGISTERS WindowRegisters,
// PTRANSLATION_ENTRY MapRegisterBase
// )
//
// Routine Description:
//
// Program the control windows so that DMA can be started to the
// DMA window.
//
// Arguments:
//
// WindowRegisters - Supplies a pointer to the software window register
// control structure.
//
// MapRegisterBase - Supplies the logical address of the scatter/gather
// array in system memory.
//
// Return Value:
//
// None.
//
#define INITIALIZE_DMA_WINDOW( WR, MRB ) \
HalpIodProgramDmaWindow( (WR), (MRB) );
//
// VOID
// INVALIDATE_DMA_TRANSLATIONS(
// PWINDOW_CONTROL_REGISTERS WindowRegisters
// )
//
// Routine Description:
//
// Invalidate all of the cached translations for a DMA window.
//
//
// Arguments:
//
// WindowRegisters - Supplies a pointer to the software window control
// registers.
//
// Return Value:
//
// None.
//
#define INVALIDATE_DMA_TRANSLATIONS( WR ) \
HalpIodInvalidateTlb( (WR) );
//
// Define the format of a translation entry aka a scatter/gather entry
// or map register.
//
typedef struct _TRANSLATION_ENTRY{
ULONG Valid: 1;
ULONG Pfn: 31;
ULONG Reserved;
} TRANSLATION_ENTRY, *PTRANSLATION_ENTRY;
//
// VOID
// HAL_MAKE_VALID_TRANSLATION(
// PTRANSLATION_ENTRY Entry,
// ULONG PageFrameNumber
// )
//
// Routine Description:
//
// Make the scatter/gather entry pointed to by Entry valid with
// a translation to the page indicated by PageFrameNumber.
//
// Arguments:
//
// Entry - Supplies a pointer to the translation entry to make valid.
//
// PageFrameNumber - Supplies the page frame of the valid translation.
//
// Return Value:
//
// None.
//
#define HAL_MAKE_VALID_TRANSLATION( ENTRY, PFN ) \
{ \
(ENTRY)->Valid = 1; \
(ENTRY)->Pfn = PFN; \
(ENTRY)->Reserved = 0; \
}
//
// VOID
// HAL_INVALIDATE_TRANSLATION(
// PTRANSLATION_ENTRY Entry
// )
//
// Routine Description:
//
// Invalidate the translation indicated by Entry.
//
// Arguments:
//
// Entry - Supplies a pointer to the translation to be invalidated.
//
// Return Value:
//
// None.
//
#define HAL_INVALIDATE_TRANSLATION( ENTRY ) \
(ENTRY)->Valid = 0;
#endif //!_LANGUAGE_ASSEMBLY
#endif //_IODH_