summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halalpha/cia.h
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/nthals/halalpha/cia.h')
-rw-r--r--private/ntos/nthals/halalpha/cia.h1141
1 files changed, 1141 insertions, 0 deletions
diff --git a/private/ntos/nthals/halalpha/cia.h b/private/ntos/nthals/halalpha/cia.h
new file mode 100644
index 000000000..510b02c96
--- /dev/null
+++ b/private/ntos/nthals/halalpha/cia.h
@@ -0,0 +1,1141 @@
+/*++
+
+Copyright (c) 1994 Digital Equipment Corporation
+
+Module Name:
+
+ cia.h
+
+Abstract:
+
+ This file defines the structures and definitions for the CIA ASIC.
+
+Author:
+
+ Steve Brooks 30-Jun-1994
+ Joe Notarangelo 30-Jun-1994
+
+Environment:
+
+ Kernel mode
+
+Revision History:
+
+ Chao Chen 31-Aug-1995 Add in new data structures for misc cia registers.
+
+--*/
+
+#ifndef _CIAH_
+#define _CIAH_
+
+
+//
+// CIA Revision definitions.
+//
+
+#define CIA_REVISION_1 (0)
+#define CIA_REVISION_2 (1)
+#define CIA_REVISION_3 (2)
+
+
+//
+// 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 size of I/O and memory space for the CIA.
+// Assume that the HAE==0.
+//
+
+#define PCI_MAX_IO_ADDRESS (__64MB - 1) // I/O: 0 - 64MB
+#define PCI_MAX_SPARSE_MEMORY_ADDRESS (__512MB - 1) // Mem: 0 - 512MB
+#define PCI_MIN_DENSE_MEMORY_ADDRESS PCI_MAX_SPARSE_MEMORY_ADDRESS + 1
+#define PCI_MAX_DENSE_MEMORY_ADDRESS (__2GB + __512MB - 1) // Dense: .5 - 2.5 Gb
+
+//
+// Defines for cia correctable errors.
+//
+
+#define CIA_IO_WRITE_ECC 0x2
+#define CIA_DMA_READ_ECC 0x6
+#define CIA_DMA_WRITE_ECC 0x7
+#define CIA_IO_READ_ECC 0xb
+#define CIA_PROCESSOR_CACHE_ECC 0x2
+#define CIA_SYSTEM_CACHE_ECC 0x3
+
+#if !defined(_LANGUAGE_ASSEMBLY)
+
+#define CIA_QVA_PHYSICAL_BASE ((ULONGLONG)0x8400000000)
+
+//
+// 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 - CIA_QVA_PHYSICAL_BASE) >> IO_BIT_SHIFT) ) )
+
+
+//
+// Define physical address space for CIA.
+//
+
+#define CIA_PCI_SPARSE_MEMORY_PHYSICAL ((ULONGLONG)0x8400000000)
+#define CIA_PCI_SPARSE_IO_PHYSICAL ((ULONGLONG)0x8580000000)
+#define CIA_PCI_DENSE_MEMORY_PHYSICAL ((ULONGLONG)0x8600000000)
+#define CIA_PCI_CONFIGURATION_PHYSICAL ((ULONGLONG)0x8700000000)
+#define CIA_PCI_INTACK_PHYSICAL ((ULONGLONG)0x8720000000)
+#define CIA_MAIN_CSRS_PHYSICAL ((ULONGLONG)0x8740000000)
+
+#define CIA_PCI_CONFIG_BASE_QVA (HAL_MAKE_QVA(CIA_PCI_CONFIGURATION_PHYSICAL))
+#define CIA_PCI_SPARSE_IO_QVA (HAL_MAKE_QVA(CIA_PCI_SPARSE_IO_PHYSICAL))
+#define CIA_PCI_SPARSE_MEMORY_QVA (HAL_MAKE_QVA(CIA_PCI_SPARSE_MEMORY_PHYSICAL))
+#define CIA_PCI_INTACK_QVA (HAL_MAKE_QVA(CIA_PCI_INTACK_PHYSICAL))
+
+//
+// Define the classes of CIA registers.
+//
+
+typedef enum _CIA_REGISTER_CLASS{
+ CiaGeneralRegisters = 0x1,
+ CiaErrorRegisters = 0x2,
+ CiaScatterGatherRegisters = 0x4,
+ CiaAllRegisters = 0xffffffff
+} CIA_REGISTER_CLASS, *PCIA_REGISTER_CLASS;
+
+//
+// Define the structures to access the CIA general csrs.
+//
+
+#define CIA_GENERAL_CSRS_PHYSICAL ((ULONGLONG)0x8740000080)
+#define CIA_GENERAL_CSRS_QVA HAL_MAKE_QVA(CIA_GENERAL_CSRS_PHYSICAL)
+
+typedef struct _CIA_GENERAL_CSRS{
+ UCHAR CiaRevision; // (80) PCI Revision
+ UCHAR Filler1; // (a0)
+ UCHAR PciLat; // (c0) PCI Latency
+ UCHAR Filler2; // (e0)
+ UCHAR CiaCtrl; // (100) CIA control
+ UCHAR Filler3[1]; // (120)
+ UCHAR CiaCnfg; // (140) CIA config
+ UCHAR Filler4[21]; // (160 - 3e0)
+ UCHAR HaeMem; // (400) Host address extension, sparse memory
+ UCHAR Filler5; // (420)
+ UCHAR HaeIo; // (440) Host address extension, space i/o
+ UCHAR Filler6; // (460)
+ UCHAR ConfigType; // (480) Configuration register
+ UCHAR Filler7[11]; // (4a0 - 5e0)
+ UCHAR CackEn; // (600) CIA Acknowledgement
+} CIA_GENERAL_CSRS, *PCIA_GENERAL_CSRS;
+
+extern ULONG HalpCiaRevision; // global containing CIA revision id
+
+typedef union _CIA_REVISION{
+ struct{
+ ULONG CiaRev: 8; // CIA Revision Id
+ ULONG Reserved: 24; //
+ };
+ ULONG all;
+} CIA_REVISION, *PCIA_REVISION;
+
+typedef union _CIA_PCI_LAT{
+ struct{
+ ULONG Reserved0: 8; //
+ ULONG Latency: 8; // PCI Master Latency timer (in PCI clocks)
+ ULONG Reserved1: 16; //
+ };
+ ULONG all;
+} CIA_PCI_LAT, *PCIA_PCI_LAT;
+
+typedef union _CIA_CONTROL{
+ struct{
+ ULONG PciEn: 1; // PCI Reset Enable
+ ULONG PciLockEn: 1; // Enables PCI locking of CIA
+ ULONG PciLoopEn: 1; // Enables CIA as a target
+ ULONG FstBbEn: 1; // Enables fast back to back PCI
+ ULONG PciMstEn: 1; // Enables initiating PCI transactions
+ ULONG PciMemEn: 1; // Enables CIA response to PCI transactions
+ ULONG PciReq64: 1; // Enables initiating 64-bit PCI
+ ULONG PciAck64: 1; // Enables accepting 64-bit PCI transactions
+ ULONG AddrPeEn: 1; // Enables PCI address parity checking
+ ULONG PerrEn: 1; // Enables PCI data parity checking
+ ULONG FillErrEn: 1; // Enables fill error assertion
+ ULONG MchkErrEn: 1; // Enables machine check error assertion
+ ULONG EccChkEn: 1; // Enables ECC error checking
+ ULONG AssertIdleBc: 1; // ????
+ ULONG ConIdleBc: 1; // ????
+ ULONG CsrIoaBypass: 1; // Allow CIA to bypass I/O address queue
+ ULONG IoFlushReqEn: 1; // Enables CIA to accept flush requests
+ ULONG CpuFlushReqEn: 1; // Enables CIA to accept CPU flush requests
+ ULONG ArbEv5En: 1; // Enables EV5 bypass path to memory and io
+ ULONG EnArbLink: 1; // Enable CPU memory reads to link
+ ULONG RdType: 2; // Controls memory pre-fetch algorithm
+ ULONG Reserved1: 2; //
+ ULONG RlType: 2; // Controls memory line pre-fetch algorithm
+ ULONG Reserved2: 2; //
+ ULONG RmType: 2; // Controls memory multiple pre-fetch
+ ULONG Reserved3: 1; //
+ ULONG EnDmaRdPerf: 1; // ????
+ };
+ ULONG all;
+} CIA_CONTROL, *PCIA_CONTROL;
+
+
+typedef union _CIA_CONFIG{
+ struct{
+ ULONG IoaBwen: 1; // EV56 byte/word I/O access enable
+ ULONG Reserved0: 3;
+ ULONG PciMwen: 1; // PCI target monster window enable
+ ULONG PciDwen: 1; // 2nd PCI target DMA write buffer enable
+ ULONG Reserved1: 2;
+ ULONG PciWlen: 1; // CIA link consecutive writes into a
+ ULONG Reserved2: 23; // single PCI transaction.
+ };
+ ULONG all;
+} CIA_CONFIG, *PCIA_CONFIG;
+
+typedef union _CIA_HAE_MEM{
+ struct{
+ ULONG Reserved0: 2; //
+ ULONG Region3: 6; // sets HAE for region 3
+ ULONG Reserved1: 3; //
+ ULONG Region2: 5; // sets HAE for region 2
+ ULONG Reserved: 13; //
+ ULONG Region1: 3; // sets HAE for region 1
+ };
+ ULONG all;
+} CIA_HAE_MEM, *PCIA_HAE_MEM;
+
+typedef union _CIA_HAE_IO{
+ struct{
+ ULONG Reserved0: 25; //
+ ULONG HaeIo: 7; // sets HAE for i/o space
+ };
+ ULONG all;
+} CIA_HAE_IO, *PCIA_HAE_IO;
+
+typedef union _CIA_CONFIG_TYPE{
+ struct{
+ ULONG Cfg: 2; // PCI<10> config address
+ ULONG Reserved0: 30; //
+ };
+ ULONG all;
+} CIA_CONFIG_TYPE, *PCIA_CONFIG_TYPE;
+
+typedef union _CIA_CACK_EN{
+ struct{
+ ULONG CackEn: 4; // Controls CIA acks to EV5
+ ULONG Reserved0: 28; //
+ };
+ ULONG all;
+} CIA_CACK_EN, *PCIA_CACK_EN;
+
+
+//
+// Define the structures and definitions for the CIA diagnostic registers.
+//
+
+#define CIA_DIAG_CSRS_PHYSICAL ((ULONGLONG)0x8740002000)
+#define CIA_DIAG_CSRS_QVA HAL_MAKE_QVA(CIA_DIAG_CSRS_PHYSICAL)
+
+typedef struct _CIA_DIAG_CSRS{
+ UCHAR CiaDiag; // (2000) Diagnostic Control register
+ UCHAR Filler[127]; // (2020-2fe0)
+ UCHAR DiagCheck; // (3000) Diagnostic Check register
+
+} CIA_DIAG_CSRS, *PCIA_DIAG_CSRS;
+
+typedef union _CIA_DIAG {
+ struct{
+ ULONG FromWrtEn: 1; // Flash ROM write enable bit
+ ULONG UseCheck: 1; // use known ecc pattern for writes
+ ULONG Reserved0: 26; //
+ ULONG FpePci: 2; // Force bad parity to PCI bus (if != 0)
+ ULONG Reserved1: 1; //
+ ULONG FpeToEv5: 1; // Force bad parity to the EV5 bus
+ };
+ ULONG all;
+
+} CIA_DIAG, *PCIA_DIAG;
+
+typedef union _CIA_DIAG_CHECK {
+ struct{
+ ULONG DiagCheck: 8; // ECC pattern to use when UseCheck bit set
+ ULONG Reserved: 24;
+ };
+ ULONG all;
+
+} CIA_DIAG_CHECK, *PCIA_DIAG_CHECK;
+
+//
+// Define the structures and definitions for the CIA performance registers.
+//
+
+typedef union _CIA_PERF_MONITOR{
+ struct{
+ ULONG LowCount: 16; // Low Counter Value
+ ULONG HighCount: 16; // High Counter Value
+ };
+ ULONG all;
+} CIA_PERF_MONITOR, *PCIA_PERF_MONITOR;
+
+typedef union _CIA_PERF_CONTROL{
+ struct{
+ ULONG LowSelect: 8; // Low Counter - event to count
+ ULONG Reserved1: 5; //
+ ULONG LowCountClear: 1; // Clear low counter value
+ ULONG LowErrStop: 1; // Stop low counter
+ ULONG LowCountStart: 1; // Start low counter
+ ULONG HighSelect: 8; // High Counter - event to count
+ ULONG Reserved2: 5; //
+ ULONG HighCountClear: 1; // Clear high counter value
+ ULONG HighErrStop: 1; // Stop high counter
+ ULONG HighCountStart: 1; // Start high counter
+ };
+ ULONG all;
+} CIA_PERF_CONTROL, *PCIA_PERF_CONTROL;
+
+typedef enum _CIA_PERF_SELECTS{
+ CiaUseHigh32 = 0x00,
+ CiaClockCycles = 0x01,
+ CiaRefreshCycles = 0x02,
+ CiaEv5CmdAcks = 0x10,
+ CiaEv5Reads = 0x11,
+ CiaEv5ReadMiss = 0x12,
+ CiaEv5ReadMissModify = 0x13,
+ CiaEv5BcacheVictimAcks = 0x14,
+ CiaEv5LockAcks = 0x15,
+ CiaEv5MbAcks = 0x16,
+ CiaEv5Fetch = 0x17,
+ CiaEv5WriteBlocks = 0x18,
+ CiaEv5MemoryCmds = 0x20,
+ CiaEv5IoCmds = 0x21,
+ CiaEv5IoReadCmds = 0x22,
+ CiaEv5IoWriteCmds = 0x23,
+ CiaSystemCommands = 0x24,
+ CiaEv5SystemReads = 0x25,
+ CiaEv5SystemFlushes = 0x26,
+ CiaReceivedNoAck = 0x27,
+ CiaReceivedScacheAck = 0x28,
+ CiaReceivedBcacheAck = 0x29,
+ CiaDmaReadsTotal = 0x30,
+ CiaDmaReads = 0x31,
+ CiaDmaReadLines = 0x32,
+ CiaDmaReadMultiples = 0x33,
+ CiaDmaWritesTotal = 0x34,
+ CiaDmaWrites = 0x35,
+ CiaDmaWriteInvalidates = 0x36,
+ CiaDmaDualAddressCycles = 0x37,
+ CiaDmaCycleRetries = 0x38,
+ CiaIoCycleRetries = 0x39,
+ CiaPciLocks = 0x40,
+ CiaEv5LockAccesses = 0x41,
+ CiaDmaVictimHit = 0x42,
+ CiaRefillTlb = 0x50,
+ CiaSingleBitEccErrors = 0x60
+} CIA_PERF_SELECTORS, *PCIA_PERF_SELECTORS;
+
+
+//
+// Define the structures and definitions for the CIA error registers.
+//
+
+
+#define CIA_ERROR_CSRS_PHYSICAL ((ULONGLONG)0x8740008000)
+#define CIA_ERROR_CSRS_QVA HAL_MAKE_QVA(CIA_ERROR_CSRS_PHYSICAL)
+
+typedef struct _CIA_ERROR_CSRS{
+ UCHAR CpuErr0; // (8000) CPU errors
+ UCHAR Filler0; // (8020)
+ UCHAR CpuErr1; // (8040) CPU errors
+ UCHAR Filler1[13]; // (8060 - 81e0)
+ UCHAR CiaErr; // (8200) Cia errors
+ UCHAR Filler2; // (8020)
+ UCHAR CiaStat; // (8240) Cia error status
+ UCHAR Filler3; // (8060)
+ UCHAR ErrMask; // (8280) Masks off specified errors
+ UCHAR Filler4[3]; // (82a0 - 82e0)
+ UCHAR CiaSyn; // (8300) CIA error syndrome
+ UCHAR Filler5[7]; // (8320 - 83e0)
+ UCHAR MemErr0; // (8400) Memory errors
+ UCHAR Filler6; // (8420)
+ UCHAR MemErr1; // (8440) Memory errors
+ UCHAR Filler7[29]; // (8460 - 87e0)
+ UCHAR PciErr0; // (8800) PCI errors
+ UCHAR Filler8; // (8820)
+ UCHAR PciErr1; // (8840) PCI errors
+ UCHAR Filler9; // (8860)
+ UCHAR PciErr2; // (8880) PCI errors
+} CIA_ERROR_CSRS, *PCIA_ERROR_CSRS;
+
+typedef union _CIA_CPU_ERR0{
+ struct{
+ ULONG Reserved: 4; //
+ ULONG Addr: 28; // CPU addresss bus contents on EV5 error
+ };
+ ULONG all;
+} CIA_CPU_ERR0, *PCIA_CPU_ERR0;
+
+typedef union _CIA_CPU_ERR1{
+ struct{
+ ULONG Addr34_32: 3; // address bits 34-32
+ ULONG Reserved0: 4; //
+ ULONG Addr39: 1; // address bit 39
+ ULONG Cmd: 4; // Cpu address command bus value
+ ULONG Int4Valid: 4; // Contains Int4 valid bits from CPU bus
+ ULONG Reserved1: 5; //
+ ULONG AddrCmdPar: 1; // Contains CPU bus parity bit
+ ULONG Reserved2: 8; //
+ ULONG Fpe_2_Ev5: 1; // ????
+ ULONG CpuPe: 1; // Indicates CPU interface detected parity
+ };
+ ULONG all;
+} CIA_CPU_ERR1, *PCIA_CPU_ERR1;
+
+typedef union _CIA_ERR{
+ struct{
+ ULONG CorErr: 1; // Correctable error
+ ULONG UnCorErr: 1; // Uncorrectable error
+ ULONG CpuPe: 1; // Ev5 bus parity error
+ ULONG MemNem: 1; // Nonexistent memory error
+ ULONG PciSerr: 1; // PCI bus serr detected
+ ULONG PciPerr: 1; // PCI bus perr detected
+ ULONG PciAddrPe: 1; // PCI bus address parity error
+ ULONG RcvdMasAbt: 1; // Pci Master Abort
+ ULONG RcvdTarAbt: 1; // Pci Target Abort
+ ULONG PaPteInv: 1; // Invalid Pte
+ ULONG FromWrtErr: 1; // Invalid write to flash rom
+ ULONG IoaTimeout: 1; // Io Timeout occurred
+ ULONG Reserved0: 4; //
+ ULONG LostCorErr: 1; // Lost correctable error
+ ULONG LostUnCorErr: 1; // Lost uncorrectable error
+ ULONG LostCpuPe: 1; // Lost Ev5 bus parity error
+ ULONG LostMemNem: 1; // Lost Nonexistent memory error
+ ULONG Reserved1: 1; //
+ ULONG LostPciPerr: 1; // Lost PCI bus perr detected
+ ULONG LostPciAddrPe: 1; // Lost PCI bus address parity error
+ ULONG LostRcvdMasAbt: 1; // Lost Pci Master Abort
+ ULONG LostRcvdTarAbt: 1; // Lost Pci Target Abort
+ ULONG LostPaPteInv: 1; // Lost Invalid Pte
+ ULONG LostFromWrtErr: 1; // Lost Invalid write to flash rom
+ ULONG LostIoaTimeout: 1; // Lost Io Timeout occurred
+ ULONG Reserved2: 3; //
+ ULONG ErrValid: 1; // Self explanatory
+ };
+ ULONG all;
+} CIA_ERR, *PCIA_ERR;
+
+#define CIA_ERR_FATAL_MASK 0x00000ffe
+#define CIA_ERR_LOST_MASK 0x0fff0000
+
+typedef union _CIA_STAT{
+ struct{
+ ULONG PciStatus: 2; // Pci Status
+ ULONG Reserved0: 1; //
+ ULONG MemSource: 1; // 0=ev5 1=Pci
+ ULONG IoaValid: 4; // Valid bits for Io command address queue
+ ULONG CpuQueue: 3; // Valid bits for Cpu command address queue
+ ULONG TlbMiss: 1; // Tlb Miss refill in progress
+ ULONG DmSt: 4; // state machine values
+ ULONG PaCpuRes: 2; // Ev5 response for DMA
+ ULONG Reserved1: 14; //
+ };
+ ULONG all;
+} CIA_STAT, *PCIA_STAT;
+
+
+typedef union _CIA_ERR_MASK{
+ struct{
+ ULONG CorErr: 1; // Enable Correctable error
+ ULONG UnCorErr: 1; // Enable Uncorrectable error
+ ULONG CpuPe: 1; // Enable Ev5 bus parity error
+ ULONG MemNem: 1; // Enable Nonexistent memory error
+ ULONG PciSerr: 1; // Enable PCI bus serr detected
+ ULONG PciPerr: 1; // Enable PCI bus perr detected
+ ULONG PciAddrPe: 1; // Enable PCI bus address parity error
+ ULONG RcvdMasAbt: 1; // Enable Pci Master Abort
+ ULONG RcvdTarAbt: 1; // Enable Pci Target Abort
+ ULONG PaPteInv: 1; // Enable Invalid Pte
+ ULONG FromWrtErr: 1; // Enable Invalid write to flash rom
+ ULONG IoaTimeout: 1; // Enable Io Timeout occurred
+ ULONG Reserved0: 20; //
+ };
+ ULONG all;
+} CIA_ERR_MASK, *PCIA_ERR_MASK;
+
+typedef union _CIA_SYN{
+ struct{
+ ULONG EccSyndrome: 8; // Ecc syndrome
+ ULONG Reserved0: 24; //
+ };
+ ULONG all;
+} CIA_SYN, *PCIA_SYN;
+
+typedef union _CIA_MEM_ERR0{
+ struct{
+ ULONG Reserved0: 4; //
+ ULONG Addr31_4: 28; // Memory port address bits
+ };
+ ULONG all;
+} CIA_MEM_ERR0, *PCIA_MEM_ERR0;
+
+typedef union _CIA_MEM_ERR1{
+ struct{
+ ULONG Addr33_32: 2; // memory port address bits
+ ULONG Reserved0: 5; //
+ ULONG Addr39: 1; // Address bit 39
+ ULONG MemPortCmd: 4; // Memory port command
+ ULONG MemPortMask: 4; // Mask bits when error occurred
+ ULONG SeqSt: 4; // Memory sequencer state
+ ULONG MemPortSrc: 1; // 0=cpu, 1=dma
+ ULONG Reserved1: 3; //
+ ULONG SetSel: 5; // Indicates active memory set
+ ULONG Reserved2: 3; //
+ };
+ ULONG all;
+} CIA_MEM_ERR1, *PCIA_MEM_ERR1;
+
+typedef union _CIA_PCI_ERR0{
+ struct{
+ ULONG Cmd: 4; // Pci command
+ ULONG LockState: 1; // Indicates CIA locked
+ ULONG DacCycle: 1; // indicates PCI dual address cycle
+ ULONG Reserved0: 2; //
+ ULONG Window: 4; // Selected DMA window
+ ULONG Reserved1: 4; //
+ ULONG MasterState: 4; // State of PCI master
+ ULONG TargetState: 3; // State of PCI target
+ ULONG Reserved2: 9; //
+ };
+ ULONG all;
+} CIA_PCI_ERR0, *PCIA_PCI_ERR0;
+
+typedef struct _CIA_PCI_ERR1{
+ ULONG PciAddress; // Pci Address
+} CIA_PCI_ERR1, *PCIA_PCI_ERR1;
+
+typedef struct _CIA_PCI_ERR2{
+ ULONG PciAddress; // Pci Address
+} CIA_PCI_ERR2, *PCIA_PCI_ERR2;
+
+//
+// Define the structures and definitions for the CIA memory registers.
+//
+
+#define CIA_MEMORY_CSRS_PHYSICAL ((ULONGLONG)0x8750000000)
+#define CIA_MEMORY_CSRS_QVA HAL_MAKE_QVA(CIA_MEMORY_CSRS_PHYSICAL)
+
+typedef struct _CIA_MEMORY_CSRS{
+ UCHAR Mcr; // (0000) MCR register
+ UCHAR Filler0[47]; // (0020 - 05e0)
+ UCHAR Mba0; // (0600) Mba0 register
+ UCHAR Filler1[3]; // (0620 - 0660)
+ UCHAR Mba2; // (0680) Mba2 register
+ UCHAR Filler2[3]; // (06a0 - 06e0)
+ UCHAR Mba4; // (0700) Mba4 register
+ UCHAR Filler3[3]; // (0720 - 0760)
+ UCHAR Mba6; // (0780) Mba6 register
+ UCHAR Filler4[3]; // (07a0 - 07e0)
+ UCHAR Mba8; // (0800) Mba8 register
+ UCHAR Filler5[3]; // (0820 - 0860)
+ UCHAR MbaA; // (0880) MbaA register
+ UCHAR Filler6[3]; // (08a0 - 08e0)
+ UCHAR MbaC; // (0900) MbaC register
+ UCHAR Filler7[3]; // (0920 - 960)
+ UCHAR MbaE; // (0980) MbaE register
+ UCHAR Filler8[8]; // (0a00 - ae0)
+ UCHAR Tmg0; // (0b00) Tmg0 register
+ UCHAR Filer9; // (0b20)
+ UCHAR Tmg1; // (0b40) Tmg1 register
+ UCHAR Filer10; // (0b60)
+ UCHAR Tmg2; // (0b80) Tmg2 register
+} CIA_MEMORY_CSRS, *PCIA_MEMORY_CSRS;
+
+//
+// Define structures and definitions for Memory control registers:
+//
+
+typedef union _CIA_MCR{
+ struct{
+ ULONG MemSize: 1; // Memory path width (256 vs. 128)
+ ULONG Reserved1: 3; //
+ ULONG CacheSize: 3; // Bcache size
+ ULONG Reserved2: 1; //
+ ULONG RefRate: 10; // Memory refresh rate
+ ULONG RefBurst: 2; // Refresh configuration
+ ULONG TmgR0: 2; // Row address setup control
+ ULONG LongCbrCas: 1; // CAS pulse width
+ ULONG Reserved3: 3; //
+ ULONG DelayIdleBc: 2; // ??
+ ULONG Reserved4: 1; //
+ ULONG EarlyIdleBc: 1; // ??
+ ULONG Reserved5: 2; //
+ };
+ ULONG all;
+} CIA_MCR, *PCIA_MCR;
+
+typedef union _CIA_MBA{
+ struct{
+ ULONG MbaS0Valid: 1; // Indiates side 0 of bank is valid
+ ULONG MbaRowType: 2; // Row and column configuration
+ ULONG Reserved1: 1; //
+ ULONG MbaMask: 5; // Comparision Mask
+ ULONG Reserved2: 6; //
+ ULONG MbaS1Valid: 1; // Indicates side 1 of bank is valid
+ ULONG MbaPattern: 10; // Address decode pattern
+ ULONG Reserved3: 2; //
+ ULONG MbaTiming: 2; // TMGx CSR select
+ ULONG Reserved4: 2; //
+ };
+ ULONG all;
+} CIA_MBA, *PCIA_MBA;
+
+typedef union _CIA_TMG{
+ struct{
+ ULONG TmgR1: 2; // Read starting, data delay
+ ULONG TmgR2: 2; // Row address hold
+ ULONG TmgR3: 2; // Read cycle time
+ ULONG TmgR4: 2; // Read, CAS assertion delay
+ ULONG TmgR5: 2; // Read, CAS pulse width
+ ULONG TmgR6: 2; // Read, column address hold
+ ULONG TmgW1: 2; // Write, data delay
+ ULONG TmgW4: 3; // Write, CAS assertion delay
+ ULONG TmgPre: 1; // RAS precharge delay
+ ULONG TmgV3: 2; // Write, cycle time
+ ULONG TmgV4: 3; // Linked victim, CAS assertion delay
+ ULONG Reserved1: 1; //
+ ULONG TmgV5: 2; // Victim/Write, CAS pulse width
+ ULONG TmgV6: 2; // Victim/Write, Column address hold
+ ULONG TmgRv: 2; // Read to victim start delay
+ ULONG TmgRdDelay: 2; // Read data delay
+ };
+ ULONG all;
+} CIA_TMG, *PCIA_TMG;
+
+//
+// Define structures and definitions for Scatter/Gather control registers:
+//
+
+#define CIA_SCATTER_GATHER_CSRS_PHYSICAL ((ULONGLONG)0x8760000100)
+#define CIA_SG_CSRS_QVA (HAL_MAKE_QVA(CIA_SCATTER_GATHER_CSRS_PHYSICAL))
+
+typedef struct _CIA_SG_CSRS{
+ UCHAR Tbia; // (100) Translation buffer invalidate all
+ UCHAR Filler0[23]; // (120-3e0)
+ UCHAR Wbase0; // (400) Base address, DMA window 0
+ UCHAR Filler1; // (420)
+ UCHAR Wmask0; // (440) Mask Register, DMA window 0
+ UCHAR Filler2; // (460)
+ UCHAR Tbase0; // (480) Translation Base, DMA window 0
+ UCHAR Filler3[3]; // (4a0 - 4e0)
+ UCHAR Wbase1; // (500) Base address, DMA window 1
+ UCHAR Filler4; // (520)
+ UCHAR Wmask1; // (540) Mask Register, DMA window 1
+ UCHAR Filler5; // (560)
+ UCHAR Tbase1; // (580) Translation Base, DMA window 1
+ UCHAR Filler6[3]; // (5a0 - 5e0)
+ UCHAR Wbase2; // (600) Base address, DMA window 2
+ UCHAR Filler7; // (620)
+ UCHAR Wmask2; // (640) Mask Register, DMA window 2
+ UCHAR Filler8; // (660)
+ UCHAR Tbase2; // (680) Translation Base, DMA window 2
+ UCHAR Filler9[3]; // (6a0 - 6e0)
+ UCHAR Wbase3; // (700) Base address, DMA window 3
+ UCHAR Filler10; // (720)
+ UCHAR Wmask3; // (740) Mask Register, DMA window 3
+ UCHAR Filler11; // (760)
+ UCHAR Tbase3; // (780) Translation Base, DMA window 3
+ UCHAR Filler12; // (7a0)
+ UCHAR Dac; // (7c0) Window DAC Base
+ UCHAR Filler13; // (7e0)
+ UCHAR LtbTag0; // (800) Lockable Translation Buffer Tag 0
+ UCHAR Filler14; // (820)
+ UCHAR LtbTag1; // (840) Lockable Translation Buffer Tag 1
+ UCHAR Filler15; // (860)
+ UCHAR LtbTag2; // (880) Lockable Translation Buffer Tag 2
+ UCHAR Filler16; // (8a0)
+ UCHAR LtbTag3; // (8c0) Lockable Translation Buffer Tag 3
+ UCHAR Filler17; // (8e0)
+ UCHAR TbTag0; // (900) Translation Buffer Tag 0
+ UCHAR Filler18; // (920)
+ UCHAR TbTag1; // (940) Translation Buffer Tag 1
+ UCHAR Filler19; // (960)
+ UCHAR TbTag2; // (980) Translation Buffer Tag 2
+ UCHAR Filler20; // (9a0)
+ UCHAR TbTag3; // (9c0) Translation Buffer Tag 3
+ UCHAR Filler21; // (9e0)
+ UCHAR Tb0Page0; // (1000) Translation Buffer 0 Page 0
+ UCHAR Filler22; // (1020)
+ UCHAR Tb0Page1; // (1040) Translation Buffer 0 Page 1
+ UCHAR Filler23; // (1060)
+ UCHAR Tb0Page2; // (1080) Translation Buffer 0 Page 2
+ UCHAR Filler24; // (10a0)
+ UCHAR Tb0Page3; // (10c0) Translation Buffer 0 Page 3
+ UCHAR Filler25; // (10e0)
+ UCHAR Tb1Page0; // (1100) Translation Buffer 1 Page 0
+ UCHAR Filler26; // (1120)
+ UCHAR Tb1Page1; // (1140) Translation Buffer 1 Page 1
+ UCHAR Filler27; // (1160)
+ UCHAR Tb1Page2; // (1180) Translation Buffer 1 Page 2
+ UCHAR Filler28; // (11a0)
+ UCHAR Tb1Page3; // (11c0) Translation Buffer 1 Page 3
+ UCHAR Filler29; // (11e0)
+ UCHAR Tb2Page0; // (1200) Translation Buffer 2 Page 0
+ UCHAR Filler30; // (1220)
+ UCHAR Tb2Page1; // (1240) Translation Buffer 2 Page 1
+ UCHAR Filler31; // (1260)
+ UCHAR Tb2Page2; // (1280) Translation Buffer 2 Page 2
+ UCHAR Filler32; // (12a0)
+ UCHAR Tb2Page3; // (12c0) Translation Buffer 2 Page 3
+ UCHAR Filler33; // (12e0)
+ UCHAR Tb3Page0; // (1300) Translation Buffer 3 Page 0
+ UCHAR Filler34; // (1320)
+ UCHAR Tb3Page1; // (1340) Translation Buffer 3 Page 1
+ UCHAR Filler35; // (1360)
+ UCHAR Tb3Page2; // (1380) Translation Buffer 3 Page 2
+ UCHAR Filler36; // (13a0)
+ UCHAR Tb3Page3; // (13c0) Translation Buffer 3 Page 3
+ UCHAR Filler37; // (13e0)
+ UCHAR Tb4Page0; // (1400) Translation Buffer 4 Page 0
+ UCHAR Filler38; // (1420)
+ UCHAR Tb4Page1; // (1440) Translation Buffer 4 Page 1
+ UCHAR Filler39; // (1460)
+ UCHAR Tb4Page2; // (1480) Translation Buffer 4 Page 2
+ UCHAR Filler40; // (14a0)
+ UCHAR Tb4Page3; // (14c0) Translation Buffer 4 Page 3
+ UCHAR Filler41; // (14e0)
+ UCHAR Tb5Page0; // (1500) Translation Buffer 5 Page 0
+ UCHAR Filler42; // (1520)
+ UCHAR Tb5Page1; // (1540) Translation Buffer 5 Page 1
+ UCHAR Filler43; // (1560)
+ UCHAR Tb5Page2; // (1580) Translation Buffer 5 Page 2
+ UCHAR Filler44; // (15a0)
+ UCHAR Tb5Page3; // (15c0) Translation Buffer 5 Page 3
+ UCHAR Filler45; // (15e0)
+ UCHAR Tb6Page0; // (1600) Translation Buffer 6 Page 0
+ UCHAR Filler46; // (1620)
+ UCHAR Tb6Page1; // (1640) Translation Buffer 6 Page 1
+ UCHAR Filler47; // (1660)
+ UCHAR Tb6Page2; // (1680) Translation Buffer 6 Page 2
+ UCHAR Filler48; // (16a0)
+ UCHAR Tb6Page3; // (16c0) Translation Buffer 6 Page 3
+ UCHAR Filler49; // (16e0)
+ UCHAR Tb7Page0; // (1700) Translation Buffer 7 Page 0
+ UCHAR Filler50; // (1720
+ UCHAR Tb7Page1; // (1740) Translation Buffer 7 Page 1
+ UCHAR Filler51; // (1760)
+ UCHAR Tb7Page2; // (1780) Translation Buffer 7 Page 2
+ UCHAR Filler52; // (17a0)
+ UCHAR Tb7Page3; // (17c0) Translation Buffer 7 Page 3
+
+} CIA_SG_CSRS, *PCIA_SG_CSRS;
+
+
+typedef union _CIA_TBIA{
+ struct{
+ ULONG InvalidateType: 2; // Type of invalidation
+ ULONG Reserved0: 30; //
+ };
+ ULONG all;
+} CIA_TBIA, *PCIA_TBIA;
+
+typedef union _CIA_WBASE{
+ struct{
+ ULONG Wen: 1; // Window enable
+ ULONG SgEn: 1; // Scatter Gather enable
+ ULONG MemcsEn: 1; // Memory Cs Enable
+ ULONG DacEn: 1; // DAC Enable
+ ULONG Reserved0: 16; //
+ ULONG Wbase: 12; // Base address of DMA window
+ };
+ ULONG all;
+} CIA_WBASE, *PCIA_WBASE;
+
+typedef union _CIA_WMASK{
+ struct{
+ ULONG Reserved0: 20; //
+ ULONG Wmask: 12; // Window mask
+ };
+ ULONG all;
+} CIA_WMASK, *PCIA_WMASK;
+
+typedef union _CIA_TBASE{
+ struct{
+ ULONG Reserved0: 8; //
+ ULONG Tbase: 24; // Translation base address
+ };
+ ULONG all;
+} CIA_TBASE, *PCIA_TBASE;
+
+typedef union _CIA_LTB_TAG{
+ struct{
+ ULONG Valid: 1;
+ ULONG Locked: 1;
+ ULONG Dac: 1;
+ ULONG Reserved0: 12;
+ ULONG TbTag: 17;
+ };
+ ULONG all;
+} CIA_LTB_TAG, *PCIA_LTB_TAG;
+
+typedef union _CIA_TB_TAG{
+ struct{
+ ULONG Valid: 1;
+ ULONG Reserved0: 1;
+ ULONG Dac: 1;
+ ULONG Reserved1: 12;
+ ULONG TbTag: 17;
+ };
+ ULONG all;
+} CIA_TB_TAG, *PCIA_TB_TAG;
+
+
+//
+// DMA Window Values.
+//
+// The CIA 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 _CIA_WINDOW_NUMBER{
+ CiaIsaWindow,
+ CiaMasterWindow
+} CIA_WINDOW_NUMBER, *PCIA_WINDOW_NUMBER;
+
+//
+// Define the types of invalidates that can be performed by the CIA.
+//
+
+typedef enum _CIA_INVALIDATE_TYPE{
+ InvalidateNoop = 0x0,
+ InvalidateLocked = 0x1,
+ InvalidateVolatile = 0x2,
+ InvalidateAll = 0x3
+} CIA_INVALIDATE_TYPE, *PCIA_INVALIDATE_TYPE;
+
+//
+// Define CIA Window Control routines.
+//
+
+VOID
+HalpCiaInitializeSfwWindow(
+ PWINDOW_CONTROL_REGISTERS WindowRegisters,
+ CIA_WINDOW_NUMBER WindowNumber
+ );
+
+VOID
+HalpCiaProgramDmaWindow(
+ PWINDOW_CONTROL_REGISTERS WindowRegisters,
+ PVOID MapRegisterBase
+ );
+
+VOID
+HalpCiaInvalidateTlb(
+ PWINDOW_CONTROL_REGISTERS WindowRegisters,
+ CIA_INVALIDATE_TYPE InvalidateType
+ );
+
+VOID
+WRITE_CIA_REGISTER(
+ PVOID,
+ ULONGLONG
+ );
+
+ULONG
+READ_CIA_REGISTER(
+ PVOID
+ );
+
+VOID
+WRITE_GRU_REGISTER(
+ PVOID,
+ ULONGLONG
+ );
+
+ULONG
+READ_GRU_REGISTER(
+ PVOID
+ );
+
+ULONG
+INTERRUPT_ACKNOWLEDGE(
+ PVOID
+ );
+
+BOOLEAN
+HalpCiaUncorrectableError(
+ VOID
+ );
+
+VOID
+HalpCiaReportFatalError(
+ VOID
+ );
+
+BOOLEAN
+HalpCiaMachineCheck(
+ IN PEXCEPTION_RECORD ExceptionRecord,
+ IN PKEXCEPTION_FRAME ExceptionFrame,
+ IN PKTRAP_FRAME TrapFrame
+ );
+
+VOID
+HalpInitializeCia(
+ PLOADER_PARAMETER_BLOCK LoaderBlock
+ );
+
+VOID
+HalpInitializeCiaMachineChecks(
+ IN BOOLEAN ReportCorrectableErrors,
+ IN BOOLEAN PciParityChecking
+ );
+
+#if HALDBG
+
+VOID
+DumpCia(
+ CIA_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 ) \
+ HalpCiaInitializeSfwWindow( (WR), CiaIsaWindow );
+
+
+//
+// VOID
+// INITIALIZE_MASTER_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_MASTER_DMA_CONTROL( WR ) \
+ HalpCiaInitializeSfwWindow( (WR), CiaMasterWindow );
+
+
+//
+// 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 ) \
+ HalpCiaProgramDmaWindow( (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 ) \
+ HalpCiaInvalidateTlb( (WR), InvalidateAll );
+
+
+//
+// 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 //_CIAH_