770 lines
20 KiB
C
770 lines
20 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1994 Digital Equipment Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
cia.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements functions that are specific to the CIA ASIC.
|
|||
|
The CIA ASIC is a control ASIC for cache, memory, and PCI on EV5-based
|
|||
|
systems.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Joe Notarangelo 26-Jul-1994
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "halp.h"
|
|||
|
#include "cia.h"
|
|||
|
|
|||
|
BOOLEAN CiaInitialized = FALSE;
|
|||
|
|
|||
|
//
|
|||
|
// The revision of the CIA. Software visible differences exist between
|
|||
|
// passes of the CIA. The revision is determined once at the start of
|
|||
|
// run-time and used in places where the software must diverge.
|
|||
|
//
|
|||
|
|
|||
|
ULONG HalpCiaRevision = CIA_REVISION_1;
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalpInitializeCia(
|
|||
|
PLOADER_PARAMETER_BLOCK LoaderBlock
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the CIA.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
LoaderBlock - Supplies a pointer to the loader parameter block.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
CIA_CONFIG CiaConfig;
|
|||
|
CIA_CONTROL CiaControl;
|
|||
|
CIA_ERR CiaError;
|
|||
|
CIA_WBASE Wbase;
|
|||
|
CIA_TBASE Tbase;
|
|||
|
CIA_WMASK Wmask;
|
|||
|
CIA_TBIA Tbia;
|
|||
|
|
|||
|
//
|
|||
|
// Read the CIA revision.
|
|||
|
//
|
|||
|
// N.B. The revision must be read assuming pass 1 CIA.
|
|||
|
//
|
|||
|
// N.B. The revision must be determined before reading PCI configuration.
|
|||
|
//
|
|||
|
|
|||
|
HalpCiaRevision =
|
|||
|
READ_CIA_REGISTER(
|
|||
|
&((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaRevision );
|
|||
|
|
|||
|
#if HALDBG
|
|||
|
|
|||
|
DbgPrint( "Cia Revision = 0x%x\n", HalpCiaRevision );
|
|||
|
|
|||
|
#endif //HALDBG
|
|||
|
|
|||
|
//
|
|||
|
// Initialize CIA Control.
|
|||
|
//
|
|||
|
|
|||
|
CiaControl.all =
|
|||
|
READ_CIA_REGISTER(
|
|||
|
&((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCtrl );
|
|||
|
|
|||
|
//
|
|||
|
// Set CIA to optimal setting according to Paul Lemmon.
|
|||
|
//
|
|||
|
|
|||
|
CiaControl.PciEn = 1;
|
|||
|
CiaControl.PciLockEn = 0;
|
|||
|
CiaControl.PciLoopEn = 1;
|
|||
|
CiaControl.FstBbEn = 0;
|
|||
|
CiaControl.PciMstEn = 1;
|
|||
|
CiaControl.PciMemEn = 1;
|
|||
|
|
|||
|
//
|
|||
|
// Specifically disable PCI parity checking so firmware would work.
|
|||
|
// Parity can be re-enabled later by the HAL for the OS.
|
|||
|
//
|
|||
|
|
|||
|
CiaControl.AddrPeEn = 0;
|
|||
|
CiaControl.PerrEn = 0;
|
|||
|
|
|||
|
CiaControl.FillErrEn = 1;
|
|||
|
CiaControl.MchkErrEn = 1;
|
|||
|
CiaControl.EccChkEn = 1;
|
|||
|
CiaControl.AssertIdleBc = 0;
|
|||
|
CiaControl.ConIdleBc = 1;
|
|||
|
CiaControl.CsrIoaBypass = 0;
|
|||
|
CiaControl.IoFlushReqEn = 0;
|
|||
|
CiaControl.CpuFlushReqEn = 0;
|
|||
|
CiaControl.ArbEv5En = 0;
|
|||
|
|
|||
|
//
|
|||
|
// Old revisions of CIA should have ArbLink off since it doesn't work.
|
|||
|
//
|
|||
|
|
|||
|
if (HalpCiaRevision < CIA_REVISION_3) {
|
|||
|
|
|||
|
CiaControl.EnArbLink = 0;
|
|||
|
} else {
|
|||
|
|
|||
|
CiaControl.EnArbLink = 1;
|
|||
|
}
|
|||
|
|
|||
|
CiaControl.RdType = 0;
|
|||
|
CiaControl.RlType = 1;
|
|||
|
CiaControl.RmType = 2;
|
|||
|
CiaControl.EnDmaRdPerf = 0;
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCtrl,
|
|||
|
CiaControl.all );
|
|||
|
|
|||
|
//
|
|||
|
// Initialize CIA Config. Turn on the performance enhancement features of
|
|||
|
// CIA2. No-op for rev 1 CIA.
|
|||
|
//
|
|||
|
|
|||
|
CiaConfig.all =
|
|||
|
READ_CIA_REGISTER(
|
|||
|
&((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCnfg );
|
|||
|
|
|||
|
CiaConfig.IoaBwen = 0;
|
|||
|
CiaConfig.PciDwen = 1;
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCnfg,
|
|||
|
CiaConfig.all );
|
|||
|
|
|||
|
//
|
|||
|
// Disable all of the scatter/gather windows.
|
|||
|
//
|
|||
|
|
|||
|
Wbase.all = 0;
|
|||
|
Wbase.Wen = 0;
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase0,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase1,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase2,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase3,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
//
|
|||
|
// Invalidate all of the TLB Entries:
|
|||
|
//
|
|||
|
|
|||
|
Tbia.all = 0;
|
|||
|
Tbia.InvalidateType = InvalidateAll;
|
|||
|
|
|||
|
//
|
|||
|
// Perform the invalidation.
|
|||
|
//
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbia,
|
|||
|
Tbia.all );
|
|||
|
|
|||
|
//
|
|||
|
// Clear any pending error bits in the CIA_ERR register:
|
|||
|
//
|
|||
|
|
|||
|
CiaError.all = 0; // Clear all bits
|
|||
|
|
|||
|
CiaError.CorErr = 1; // Correctable error
|
|||
|
CiaError.UnCorErr = 1; // Uncorrectable error
|
|||
|
CiaError.CpuPe = 1; // Ev5 bus parity error
|
|||
|
CiaError.MemNem = 1; // Nonexistent memory error
|
|||
|
CiaError.PciSerr = 1; // PCI bus serr detected
|
|||
|
CiaError.PciPerr = 1; // PCI bus perr detected
|
|||
|
CiaError.PciAddrPe = 1; // PCI bus address parity error
|
|||
|
CiaError.RcvdMasAbt = 1; // Pci Master Abort
|
|||
|
CiaError.RcvdTarAbt = 1; // Pci Target Abort
|
|||
|
CiaError.PaPteInv = 1; // Invalid Pte
|
|||
|
CiaError.FromWrtErr = 1; // Invalid write to flash rom
|
|||
|
CiaError.IoaTimeout = 1; // Io Timeout occurred
|
|||
|
CiaError.LostCorErr = 1; // Lost correctable error
|
|||
|
CiaError.LostUnCorErr = 1; // Lost uncorrectable error
|
|||
|
CiaError.LostCpuPe = 1; // Lost Ev5 bus parity error
|
|||
|
CiaError.LostMemNem = 1; // Lost Nonexistent memory error
|
|||
|
CiaError.LostPciPerr = 1; // Lost PCI bus perr detected
|
|||
|
CiaError.LostPciAddrPe = 1; // Lost PCI bus address parity error
|
|||
|
CiaError.LostRcvdMasAbt = 1; // Lost Pci Master Abort
|
|||
|
CiaError.LostRcvdTarAbt = 1; // Lost Pci Target Abort
|
|||
|
CiaError.LostPaPteInv = 1; // Lost Invalid Pte
|
|||
|
CiaError.LostFromWrtErr = 1; // Lost Invalid write to flash rom
|
|||
|
CiaError.LostIoaTimeout = 1; // Lost Io Timeout occurred
|
|||
|
CiaError.ErrValid = 1; // Self explanatory
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CiaErr,
|
|||
|
CiaError.all
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
#if defined(CIA_PASS1)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
ULONG Allocated;
|
|||
|
PTRANSLATION_ENTRY MapRegister;
|
|||
|
ULONG MaxPhysicalAddress;
|
|||
|
ULONG NumberOfPages;
|
|||
|
BOOLEAN __64KAlignment;
|
|||
|
ULONG i;
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Create a special scatter/gather window to use for diagnostic
|
|||
|
// DMAs that we can use to insure that the TLB is flushed of any
|
|||
|
// other entries.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Allocate a page of memory to hold the scatter/gather entries.
|
|||
|
//
|
|||
|
|
|||
|
Allocated = HalpAllocPhysicalMemory( LoaderBlock,
|
|||
|
MaxPhysicalAddress = __1GB - 1,
|
|||
|
NumberOfPages = 1,
|
|||
|
__64KAlignment = TRUE ); // FALSE );
|
|||
|
|
|||
|
//
|
|||
|
// Make the first 32 entries in the new table valid, point them
|
|||
|
// to the first 32 pages in memory.
|
|||
|
//
|
|||
|
|
|||
|
MapRegister = (PTRANSLATION_ENTRY)(Allocated | KSEG0_BASE);
|
|||
|
|
|||
|
for( i=0; i < 32; i++ ){
|
|||
|
|
|||
|
ULONG Pfn = 0x700000 >> PAGE_SHIFT;
|
|||
|
|
|||
|
HAL_MAKE_VALID_TRANSLATION( MapRegister, Pfn );
|
|||
|
MapRegister += 1;
|
|||
|
|
|||
|
Pfn += 1;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Enable window 3 for the diagnostic dmas to the special scatter/gather
|
|||
|
// table. Base of the window in PCI space is 32MB, size of the window
|
|||
|
// is 1MB.
|
|||
|
//
|
|||
|
|
|||
|
Wbase.all = 0;
|
|||
|
Wbase.Wen = 1;
|
|||
|
Wbase.SgEn = 1;
|
|||
|
Wbase.Wbase = (ULONG)(__1MB * 32) >> 20;
|
|||
|
|
|||
|
Wmask.all = 0;
|
|||
|
Wmask.Wmask = 0;
|
|||
|
|
|||
|
Tbase.all = 0;
|
|||
|
Tbase.Tbase = (ULONG)(Allocated) >> 10;
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase3,
|
|||
|
Tbase.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask3,
|
|||
|
Wmask.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase3,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endif //CIA_PASS1
|
|||
|
|
|||
|
CiaInitialized = TRUE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalpCiaInitializeSfwWindow(
|
|||
|
PWINDOW_CONTROL_REGISTERS WindowRegisters,
|
|||
|
CIA_WINDOW_NUMBER WindowNumber
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize the DMA Control software window registers for the specified
|
|||
|
DMA Window.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
WindowRegisters - Supplies a pointer to the software window control.
|
|||
|
|
|||
|
WindowNumber - Supplies the window number initialized. (0 = Isa Dma
|
|||
|
Window, 1 = Master Dma Window).
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
switch( WindowNumber ){
|
|||
|
|
|||
|
//
|
|||
|
// The ISA DMA Window.
|
|||
|
//
|
|||
|
|
|||
|
case CiaIsaWindow:
|
|||
|
|
|||
|
WindowRegisters->WindowBase = (PVOID)ISA_DMA_WINDOW_BASE;
|
|||
|
WindowRegisters->WindowSize = ISA_DMA_WINDOW_SIZE;
|
|||
|
WindowRegisters->TranslatedBaseRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase1;
|
|||
|
WindowRegisters->WindowBaseRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase1;
|
|||
|
WindowRegisters->WindowMaskRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask1;
|
|||
|
WindowRegisters->WindowTbiaRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbia;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
case CiaMasterWindow:
|
|||
|
|
|||
|
WindowRegisters->WindowBase = (PVOID)MASTER_DMA_WINDOW_BASE;
|
|||
|
WindowRegisters->WindowSize = MASTER_DMA_WINDOW_SIZE;
|
|||
|
WindowRegisters->TranslatedBaseRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase0;
|
|||
|
WindowRegisters->WindowBaseRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase0;
|
|||
|
WindowRegisters->WindowMaskRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask0;
|
|||
|
WindowRegisters->WindowTbiaRegister =
|
|||
|
&((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbia;
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
|
|||
|
#if HALDBG
|
|||
|
|
|||
|
DbgPrint( "CiaInitializeSfwWindow: Bad Window Number = %x\n",
|
|||
|
WindowNumber );
|
|||
|
|
|||
|
#endif //HALDBG
|
|||
|
|
|||
|
break;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalpCiaProgramDmaWindow(
|
|||
|
PWINDOW_CONTROL_REGISTERS WindowRegisters,
|
|||
|
PVOID MapRegisterBase
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Program the control windows in the hardware 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.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
CIA_WBASE Wbase;
|
|||
|
CIA_TBASE Tbase;
|
|||
|
CIA_WMASK Wmask;
|
|||
|
|
|||
|
//
|
|||
|
// Program the windows as specified by the caller.
|
|||
|
//
|
|||
|
|
|||
|
Wbase.all = 0;
|
|||
|
Wbase.Wen = 1;
|
|||
|
Wbase.SgEn = 1;
|
|||
|
Wbase.Wbase = (ULONG)(WindowRegisters->WindowBase) >> 20;
|
|||
|
|
|||
|
Wmask.all = 0;
|
|||
|
Wmask.Wmask = (WindowRegisters->WindowSize >> 20) - 1;
|
|||
|
|
|||
|
Tbase.all = 0;
|
|||
|
Tbase.Tbase = (ULONG)MapRegisterBase >> 10;
|
|||
|
|
|||
|
//
|
|||
|
// Dump the CIA registers.
|
|||
|
//
|
|||
|
|
|||
|
#if HALDBG
|
|||
|
|
|||
|
DumpCia( CiaScatterGatherRegisters );
|
|||
|
|
|||
|
#endif //HALDBG
|
|||
|
|
|||
|
//
|
|||
|
// Clear the window base, temporarily disabling transactions to this
|
|||
|
// DMA window.
|
|||
|
//
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( WindowRegisters->WindowBaseRegister, 0 );
|
|||
|
|
|||
|
//
|
|||
|
// Now program the window by writing the translated base, then the size
|
|||
|
// of the window in the mask register and finally the window base,
|
|||
|
// enabling both the window and scatter gather.
|
|||
|
//
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( WindowRegisters->TranslatedBaseRegister,
|
|||
|
Tbase.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( WindowRegisters->WindowMaskRegister,
|
|||
|
Wmask.all );
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( WindowRegisters->WindowBaseRegister,
|
|||
|
Wbase.all );
|
|||
|
|
|||
|
//
|
|||
|
// Flush the volatile entries in the CIA's scatter/gather Tlb.
|
|||
|
//
|
|||
|
|
|||
|
HalpCiaInvalidateTlb( WindowRegisters, InvalidateVolatile );
|
|||
|
|
|||
|
//
|
|||
|
// Dump the CIA registers.
|
|||
|
//
|
|||
|
|
|||
|
#if HALDBG
|
|||
|
|
|||
|
DumpCia( CiaScatterGatherRegisters | CiaGeneralRegisters );
|
|||
|
|
|||
|
#endif //HALDBG
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalpCiaInvalidateTlb(
|
|||
|
PWINDOW_CONTROL_REGISTERS WindowRegisters,
|
|||
|
CIA_INVALIDATE_TYPE InvalidateType
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Invalidate the DMA Scatter/Gather TLB in the CIA. The TLB is invalidated
|
|||
|
whenever the scatter/gather translation entries are modified.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
WindowRegisters - Supplies a pointer to the software window register
|
|||
|
control structure.
|
|||
|
|
|||
|
InvalidateType - Supplies the type of invalidate the caller requires.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
//
|
|||
|
// Perform the invalidation based on the pass of the CIA.
|
|||
|
//
|
|||
|
|
|||
|
if( HalpCiaRevision == CIA_REVISION_1 ){
|
|||
|
|
|||
|
ULONG LoopbackAddress;
|
|||
|
ULONG i;
|
|||
|
|
|||
|
//
|
|||
|
// Perform 8 reads to PCI Dense space through the special loopback
|
|||
|
// scatter/gather window to invalidate each entry in the CIA TLB.
|
|||
|
// Each TLB fill prefetches 4 entries so our 8 reads must each be
|
|||
|
// 32K bytes apart.
|
|||
|
//
|
|||
|
|
|||
|
LoopbackAddress = __1MB * 32;
|
|||
|
|
|||
|
HalpMb();
|
|||
|
|
|||
|
for( i=0; i < 8; i++ ){
|
|||
|
|
|||
|
ULONG dummy;
|
|||
|
|
|||
|
dummy = READ_REGISTER_ULONG( (PULONG)LoopbackAddress );
|
|||
|
|
|||
|
LoopbackAddress += __1K * 32;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
HalpMb();
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
CIA_TBIA Tbia;
|
|||
|
|
|||
|
//
|
|||
|
// Set the invalidate as specified by the flush type.
|
|||
|
//
|
|||
|
|
|||
|
Tbia.all = 0;
|
|||
|
Tbia.InvalidateType = InvalidateType;
|
|||
|
|
|||
|
//
|
|||
|
// Perform the invalidation.
|
|||
|
//
|
|||
|
|
|||
|
WRITE_CIA_REGISTER( WindowRegisters->WindowTbiaRegister, Tbia.all );
|
|||
|
|
|||
|
} //end if( HalpCiaRevision == CIA_REVISION_1 )
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#if HALDBG
|
|||
|
|
|||
|
VOID
|
|||
|
DumpCia(
|
|||
|
CIA_REGISTER_CLASS RegistersToDump
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Read the interesting Cia registers and print them to the debug port.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PVOID RegisterQva;
|
|||
|
ULONG Value;
|
|||
|
|
|||
|
DbgPrint( "CIA Register Dump: \n" );
|
|||
|
|
|||
|
//
|
|||
|
// Dump the CIA General Control registers.
|
|||
|
//
|
|||
|
|
|||
|
if( (RegistersToDump & CiaGeneralRegisters) != 0 ){
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaRevision;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaRevision = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->PciLat;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "PciLat = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCtrl;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaCtrl = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CiaCnfg;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaCnfg = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->HaeMem;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "HaeMem = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->HaeIo;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "HaeIo = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->ConfigType;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "ConfigType = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_GENERAL_CSRS)(CIA_GENERAL_CSRS_QVA))->CackEn;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CackEn = 0x%x\n", Value );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Dump the CIA Error registers.
|
|||
|
//
|
|||
|
|
|||
|
if( (RegistersToDump & CiaErrorRegisters) != 0 ){
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CpuErr0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CpuErr0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CpuErr1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CpuErr1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CiaErr;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaErr = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CiaStat;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaStat = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->ErrMask;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "ErrMask = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->CiaSyn;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "CiaSyn = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->MemErr0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "MemErr0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->MemErr1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "MemErr1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->PciErr0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "PciErr0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_ERROR_CSRS)(CIA_ERROR_CSRS_QVA))->PciErr1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "PciErr1 = 0x%x\n", Value );
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Dump the PCI Scatter/Gather registers.
|
|||
|
//
|
|||
|
|
|||
|
if( (RegistersToDump & CiaScatterGatherRegisters) != 0 ){
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbia;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Tbia = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wbase0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wmask0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Tbase0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wbase1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wmask1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Tbase1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase2;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wbase2 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask2;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wmask2 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase2;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Tbase2 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wbase3;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wbase3 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Wmask3;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Wmask3 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Tbase3;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Tbase3 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->Dac;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "Dac = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->LtbTag0;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "LtbTag0 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->LtbTag1;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "LtbTag1 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->LtbTag2;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "LtbTag2 = 0x%x\n", Value );
|
|||
|
|
|||
|
RegisterQva = &((PCIA_SG_CSRS)(CIA_SG_CSRS_QVA))->LtbTag3;
|
|||
|
Value = READ_CIA_REGISTER( RegisterQva );
|
|||
|
DbgPrint( "LtbTag3 = 0x%x\n", Value );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
DbgPrint( "--end CIA Register dump\n\n" );
|
|||
|
|
|||
|
return;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
#endif //HALDBG
|
|||
|
|