171 lines
3.5 KiB
C
171 lines
3.5 KiB
C
|
|
|||
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992 NCR - MSBU
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
ncrhwsup.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Richard Barton (o-richb) 11-Mar-1992
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "halp.h"
|
|||
|
#include "ncr.h"
|
|||
|
#include "ncrcat.h"
|
|||
|
#include "ncrpsi.h"
|
|||
|
|
|||
|
extern ULONG NCRActiveProcessorCount;
|
|||
|
|
|||
|
ULONG NCRSysIntCount;
|
|||
|
ULONG NCRSingleBitCount;
|
|||
|
|
|||
|
ULONG NCRLockedExchangeAndAdd(PULONG, ULONG);
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NCRHandleSysInt (TrapFramePtr, ExceptionRecordPtr)
|
|||
|
IN PKTRAP_FRAME TrapFramePtr;
|
|||
|
IN PVOID ExceptionRecordPtr;
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
Handles the NCR hardware generated System Interrupt
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Return Value:
|
|||
|
none.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
|
|||
|
DbgBreakPoint();
|
|||
|
return ;
|
|||
|
|
|||
|
#if 0
|
|||
|
ULONG i;
|
|||
|
|
|||
|
i = NCRLockedExchangeAndAdd(&NCRSysIntCount, 1);
|
|||
|
if (i != 0) {
|
|||
|
for (i = 100000;
|
|||
|
((NCRSysIntCount != NCRActiveProcessorCount) &&
|
|||
|
(i > 0)); --i) ;
|
|||
|
KiIpiServiceRoutine(TrapFramePtr, ExceptionRecordPtr);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
DbgPrint("NCRHandleSysInt");
|
|||
|
DbgBreakPoint();
|
|||
|
|
|||
|
NCRSysIntCount = 0;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
NCRHandleSingleBitError (TrapFramePtr, ExceptionRecordPtr)
|
|||
|
IN PKTRAP_FRAME TrapFramePtr;
|
|||
|
IN PVOID ExceptionRecordPtr;
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
Handles the NCR hardware generated Single Bit Error Interrupt and a
|
|||
|
Status Change
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Return Value:
|
|||
|
none.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
CAT_CONTROL cat_control;
|
|||
|
PSI_INFORMATION psi_information;
|
|||
|
|
|||
|
cat_control.Module = PSI;
|
|||
|
cat_control.Asic = CAT_I;
|
|||
|
|
|||
|
//
|
|||
|
// Lets get the CatBus spin lock because the status change interrupt is a broadcast
|
|||
|
// interrupt that goes to all CPU's
|
|||
|
//
|
|||
|
|
|||
|
HalpAcquireCatBusSpinLock();
|
|||
|
|
|||
|
//
|
|||
|
// read status registers from PSI. This will tell us if a status change interrupt occured.
|
|||
|
//
|
|||
|
cat_control.Command = READ_REGISTER;
|
|||
|
cat_control.Address = 0;
|
|||
|
cat_control.NumberOfBytes = sizeof(CAT_REGISTERS);
|
|||
|
HalpCatBusIo(&cat_control,(PUCHAR)&(psi_information.CatRegisters.CatRegs));
|
|||
|
|
|||
|
if (psi_information.INTERRUPT_STATUS) {
|
|||
|
|
|||
|
//
|
|||
|
// A status change interrupt has occured. Lets go read detailed status information so
|
|||
|
// the interrupt will be cleared.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// read power supply mask registers
|
|||
|
//
|
|||
|
cat_control.Command = READ_SUBADDR;
|
|||
|
cat_control.Address = PSI_Pwr_Supply_Status_L5;
|
|||
|
cat_control.NumberOfBytes = 8;
|
|||
|
HalpCatBusIo(&cat_control,(PUCHAR)&(psi_information.PowerSupplyStatus));
|
|||
|
//
|
|||
|
// read disk power registers
|
|||
|
//
|
|||
|
cat_control.Command = READ_SUBADDR;
|
|||
|
cat_control.Address = PSI_DiskStatus_L5;
|
|||
|
cat_control.NumberOfBytes = 16;
|
|||
|
HalpCatBusIo(&cat_control,(PUCHAR)&(psi_information.DiskPowerStatus[0]));
|
|||
|
//
|
|||
|
// read DVM registers
|
|||
|
//
|
|||
|
cat_control.Command = READ_SUBADDR;
|
|||
|
cat_control.Address = PSI_Dvm_Select_L5;
|
|||
|
cat_control.NumberOfBytes = 1;
|
|||
|
HalpCatBusIo(&cat_control,(PUCHAR)&(psi_information.DvmSelect));
|
|||
|
|
|||
|
cat_control.Command = READ_SUBADDR;
|
|||
|
cat_control.Address = DVM_DBASE;
|
|||
|
cat_control.NumberOfBytes = 4;
|
|||
|
HalpCatBusIo(&cat_control,(PUCHAR)&(psi_information.DvmData0));
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// This path means another CPU has handled the status change.
|
|||
|
//
|
|||
|
// NOTE: If single bit error reporting were enabled then this path could also
|
|||
|
// mean a single bit error occured.
|
|||
|
//
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Release the CatBus spin lock.
|
|||
|
//
|
|||
|
|
|||
|
HalpReleaseCatBusSpinLock();
|
|||
|
|
|||
|
if (psi_information.INTERRUPT_STATUS) {
|
|||
|
DBGMSG(("A Status Change Interrupt was received: 0x%x\n",psi_information.INTERRUPT_STATUS));
|
|||
|
}
|
|||
|
}
|