diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nthals/halsable/alpha/sbsysint.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/nthals/halsable/alpha/sbsysint.c')
-rw-r--r-- | private/ntos/nthals/halsable/alpha/sbsysint.c | 456 |
1 files changed, 456 insertions, 0 deletions
diff --git a/private/ntos/nthals/halsable/alpha/sbsysint.c b/private/ntos/nthals/halsable/alpha/sbsysint.c new file mode 100644 index 000000000..3dd114faa --- /dev/null +++ b/private/ntos/nthals/halsable/alpha/sbsysint.c @@ -0,0 +1,456 @@ +/*++ + +Copyright (c) 1993 Digital Equipment Corporation + +Module Name: + + sbsysint.c + +Abstract: + + This module implements the HAL enable/disable system interrupt, and + request interprocessor interrupt routines for the Sable system. + +Author: + + Joe Notarangelo 29-Oct-1993 + Steve Jenness 29-Oct-1993 + +Environment: + + Kernel mode + +Revision History: + + +--*/ + +#include "halp.h" +#include "axp21064.h" +#include "siintsup.h" +#include "lyintsup.h" +#include "xiintsup.h" + +// +// Define reference to the builtin device interrupt enables. +// + +extern USHORT HalpBuiltinInterruptEnable; + + +VOID +HalDisableSystemInterrupt ( + IN ULONG Vector, + IN KIRQL Irql + ) + +/*++ + +Routine Description: + + This routine disables the specified system interrupt. + +Arguments: + + Vector - Supplies the vector of the system interrupt that is disabled. + + Irql - Supplies the IRQL of the interrupting source. + +Return Value: + + None. + +--*/ + +{ + ULONG Irq; + KIRQL OldIrql; + + // + // Raise IRQL to the highest level and acquire the system interrupt + // lock. + // + + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + KiAcquireSpinLock(&HalpSystemInterruptLock); + + // + // If the vector is a performance counter vector or one of the internal + // device vectors then disable the interrupt for the 21064. + // + + switch( Vector ){ + + // + // Performance counter 0 interrupt (internal to 21064) + // + + case PC0_VECTOR: + case PC0_SECONDARY_VECTOR: + + HalpDisable21064PerformanceInterrupt( PC0_VECTOR ); + + break; + + // + // Performance counter 1 interrupt (internal to 21064) + // + + case PC1_VECTOR: + case PC1_SECONDARY_VECTOR: + + HalpDisable21064PerformanceInterrupt( PC1_VECTOR ); + + break; + + default: + + if( Irql == DEVICE_LEVEL ){ + + if( HalpLynxPlatform ){ + + HalpDisableLynxSioInterrupt( Vector ); + + } else { + + HalpDisableSableSioInterrupt( Vector ); + + } + + } + + break; + + } + + // + // Release the system interrupt lock and restore the IRWL. + // + + KiReleaseSpinLock(&HalpSystemInterruptLock); + + KeLowerIrql(OldIrql); +} + +BOOLEAN +HalEnableSystemInterrupt ( + IN ULONG Vector, + IN KIRQL Irql, + IN KINTERRUPT_MODE InterruptMode + ) + +/*++ + +Routine Description: + + This routine enables the specified system interrupt. + +Arguments: + + Vector - Supplies the vector of the system interrupt that is enabled. + + Irql - Supplies the IRQL of the interrupting source. + + InterruptMode - Supplies the mode of the interrupt; LevelSensitive or + Latched. + +Return Value: + + TRUE if the system interrupt was enabled + +--*/ + +{ + BOOLEAN Enabled = FALSE; + ULONG Irq; + KIRQL OldIrql; + + // + // Raise IRQL to the highest level. + // + + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + // + // If the vector is a performance counter vector or one of the + // internal device vectors then perform 21064-specific enable. + // + + switch (Vector) { + + // + // Performance counter 0 (internal to 21064) + // + + case PC0_VECTOR: + case PC0_SECONDARY_VECTOR: + + HalpEnable21064PerformanceInterrupt( PC0_VECTOR, Irql ); + Enabled = TRUE; + break; + + // + // Performance counter 1 (internal to 21064) + // + + case PC1_VECTOR: + case PC1_SECONDARY_VECTOR: + + HalpEnable21064PerformanceInterrupt( PC1_VECTOR, Irql ); + Enabled = TRUE; + break; + + default: + + if( HalpLynxPlatform ){ + + Enabled = HalpEnableLynxSioInterrupt( Vector, InterruptMode ); + + } else { + + Enabled = HalpEnableSableSioInterrupt( Vector, InterruptMode ); + + } + + break; + + } + + // + // Lower IRQL to the previous level. + // + + KeLowerIrql(OldIrql); + + return Enabled; +} + +ULONG +HalpGetSystemInterruptVector( + IN PBUS_HANDLER BusHandler, + IN PBUS_HANDLER RootHandler, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity + ) + +/*++ + +Routine Description: + + This function returns the system interrupt vector and IRQL level + corresponding to the specified bus interrupt level and/or vector. The + system interrupt vector and IRQL are suitable for use in a subsequent call + to KeInitializeInterrupt. + +// We only use InterfaceType, and BusInterruptLevel. BusInterruptVector + for ISA and EISA are the same as the InterruptLevel, so ignore. + +Arguments: + + BusHandler - Registered BUSHANDLER for the target configuration space + + RootHandler - Registered BUSHANDLER for the orginating HalGetBusData + request. + + BusInterruptLevel - Supplies the bus specific interrupt level. + + BusInterruptVector - Supplies the bus specific interrupt vector. + + Irql - Returns the system request priority. + + Affinity - Returns the affinity for the requested vector + +Return Value: + + Returns the system interrupt vector corresponding to the specified device. + +--*/ + +{ + INTERFACE_TYPE InterfaceType = BusHandler->InterfaceType; + ULONG BusNumber = BusHandler->BusNumber; + ULONG Vector; + + // + // Handle the special internal bus defined for the processor itself + // and used to control the performance counters in the 21064. + // + + if( InterfaceType == ProcessorInternal ) { + + Vector = HalpGet21064PerformanceVector( BusInterruptLevel, Irql ); + + if( Vector != 0 ){ + + // + // Success + // + + *Affinity = HalpActiveProcessors; + return Vector; + + } else { + + // + // Unrecognized processor interrupt. + // + + *Irql = 0; + *Affinity = 0; + return 0; + + } + + } + + // + // Handle Isa/Eisa bus and Internal devices. + // + // N.B. The bus interrupt level is the actual E/ISA signal name for + // option boards while the bus interrupt level is the actual + // interrupt vector number for internal devices. The interrupt + // vectors for internal devices are specified in the firmware + // configuration and are agreed upon between the firmware and this + // code. + // + + if( (InterfaceType == Internal) || + (InterfaceType == Isa) || + (InterfaceType == PCIBus) || + (InterfaceType == Eisa) ){ + + if( HalpLynxPlatform ){ + + return HalpGetLynxSioInterruptVector( + BusHandler, + RootHandler, + BusInterruptLevel, + BusInterruptVector, + Irql, + Affinity + ); + + } else { + + return HalpGetSableSioInterruptVector( + BusHandler, + RootHandler, + BusInterruptLevel, + BusInterruptVector, + Irql, + Affinity + ); + + } + + } + + + // + // Not an interface supported on Alpha systems + // + + *Irql = 0; + *Affinity = 0; + return(0); + +} + +VOID +HalRequestIpi ( + IN ULONG Mask + ) + +/*++ + +Routine Description: + + This routine requests an interprocessor interrupt on a set of processors. + +Arguments: + + Mask - Supplies the set of processors that are sent an interprocessor + interrupt. + +Return Value: + + None. + +--*/ + +{ + SABLE_IPIR_CSR Ipir; + extern PSABLE_CPU_CSRS HalpSableCpuCsrs[HAL_MAXIMUM_PROCESSOR+1]; + + // + // Set up to request an interprocessor interrupt. + // + + Ipir.all = 0; + Ipir.RequestInterrupt = 1; + + // + // N.B. Sable supports up to 4 processors only. + // + // N.B. A read-modify-write is not performed on the Ipir register + // which implies that the value of the request halt interrupt + // bit may be lost. Currently, this is not an important + // consideration because that feature is not being used. + // If later it is used than more consideration must be given + // to the possibility of losing the bit. + // + + // + // The request mask is specified as a mask of the logical processors + // that must receive IPI requests. HalpSableCpuCsrs[] contains the + // CPU CSRs address for the logical processors. + // + + // + // Request an IPI for processor 0 if requested. + // + + if( Mask & HAL_CPU0_MASK ){ + + WRITE_CPU_REGISTER( &(HalpSableCpuCsrs[SABLE_CPU0]->Ipir), Ipir.all ); + + } + + // + // Request an IPI for processor 1 if requested. + // + + if( Mask & HAL_CPU1_MASK ){ + + WRITE_CPU_REGISTER( &(HalpSableCpuCsrs[SABLE_CPU1]->Ipir), Ipir.all ); + + } + + // + // Request an IPI for processor 2 if requested. + // + + if( Mask & HAL_CPU2_MASK ){ + + WRITE_CPU_REGISTER( &(HalpSableCpuCsrs[SABLE_CPU2]->Ipir), Ipir.all ); + + } + + // + // Request an IPI for processor 3 if requested. + // + + if( Mask & HAL_CPU3_MASK ){ + + WRITE_CPU_REGISTER( &(HalpSableCpuCsrs[SABLE_CPU3]->Ipir), Ipir.all ); + + } + + + + + return; +} |