241 lines
5.9 KiB
C
241 lines
5.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1993 Digital Equipment Corporation
|
||
|
||
Module Name:
|
||
|
||
mkmapio.c
|
||
|
||
Abstract:
|
||
|
||
This module contains the functions to map HAL-accessed I/O addresses
|
||
on the Mikasa EV5 (Pinnacle) system.
|
||
|
||
Author:
|
||
|
||
Joe Notarangelo 25-Oct-1993
|
||
|
||
Environment:
|
||
|
||
Kernel mode
|
||
|
||
Revision History:
|
||
|
||
Scott Lee 29-Nov-1995
|
||
Adapted from Mikasa module for Mikasa EV5 (Pinnacle) systems.
|
||
|
||
--*/
|
||
|
||
#include "halp.h"
|
||
#include "mikasa.h"
|
||
|
||
//
|
||
// Define global data used to locate the EISA control space.
|
||
//
|
||
|
||
PVOID HalpEisaControlBase;
|
||
PVOID HalpEisaIntAckBase;
|
||
PVOID HalpCMOSRamBase;
|
||
PVOID HalpServerControlQva;
|
||
|
||
PVOID HalpMikasaPciIrQva;
|
||
PVOID HalpMikasaPciImrQva;
|
||
|
||
PVOID HalpNoritakePciIr1Qva;
|
||
PVOID HalpNoritakePciIr2Qva;
|
||
PVOID HalpNoritakePciIr3Qva;
|
||
PVOID HalpNoritakePciImr1Qva;
|
||
PVOID HalpNoritakePciImr2Qva;
|
||
PVOID HalpNoritakePciImr3Qva;
|
||
|
||
PVOID HalpCorellePciIr1Qva;
|
||
PVOID HalpCorellePciIr2Qva;
|
||
PVOID HalpCorellePciImr1Qva;
|
||
PVOID HalpCorellePciImr2Qva;
|
||
|
||
|
||
|
||
BOOLEAN
|
||
HalpMapIoSpace (
|
||
VOID
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine maps the HAL I/O space for a Mikasa system using
|
||
the Quasi VA mechanism.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
If the initialization is successfully completed, than a value of TRUE
|
||
is returned. Otherwise, a value of FALSE is returned.
|
||
|
||
--*/
|
||
|
||
{
|
||
PVOID PciIoSpaceBase;
|
||
|
||
//
|
||
// Map base addresses in QVA space.
|
||
//
|
||
|
||
PciIoSpaceBase = HAL_MAKE_QVA( CIA_PCI_SPARSE_IO_PHYSICAL );
|
||
|
||
HalpEisaControlBase = PciIoSpaceBase;
|
||
HalpEisaIntAckBase = HAL_MAKE_QVA( CIA_PCI_INTACK_PHYSICAL );
|
||
|
||
//
|
||
// Set up the Mikasa interrupt registers.
|
||
//
|
||
// Map PCI interrupt and interrupt mask registers. The former register
|
||
// receives the interrupt state of each individual pin in each PCI slot,
|
||
// the state of the NCR 53C810 interrupt, and two server management
|
||
// interrupts' states. The PCI interrupt mask register can mask each
|
||
// of the interrupts in the IR.
|
||
//
|
||
|
||
HalpMikasaPciIrQva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER);
|
||
HalpMikasaPciImrQva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER);
|
||
|
||
//
|
||
// Set up the Noritake interrupt registers.
|
||
//
|
||
// Map the PCI interrupt and interrupt mask registers for Noritake.
|
||
// There are three interrupt registers, and three mask registers.
|
||
// The exact contents are described in mikasa.h.
|
||
//
|
||
// The Base Address Register of the interrupt registers is set up in SROM.
|
||
// We can change this if we choose.
|
||
//
|
||
|
||
HalpNoritakePciIr1Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER_1);
|
||
HalpNoritakePciImr1Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER_1);
|
||
|
||
HalpNoritakePciIr2Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER_2);
|
||
HalpNoritakePciImr2Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER_2);
|
||
|
||
HalpNoritakePciIr3Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER_3);
|
||
HalpNoritakePciImr3Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER_3);
|
||
|
||
|
||
//
|
||
// Set up the Corelle interrupt registers.
|
||
//
|
||
// Map the PCI interrupt and interrupt mask registers for Corelle.
|
||
// There are two interrupt registers, and two mask registers. The exact
|
||
// contents are described in mikasa.h.
|
||
//
|
||
|
||
HalpCorellePciIr1Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER_1);
|
||
HalpCorellePciImr1Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER_1);
|
||
|
||
HalpCorellePciIr2Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_REGISTER_2);
|
||
HalpCorellePciImr2Qva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ PCI_INTERRUPT_MASK_REGISTER_2);
|
||
|
||
//
|
||
// Map the Mikasa server management register. This single byte register
|
||
// contains the bits that enable control of the high-availability options
|
||
// on Mikasa. This is at the same location in the Noritake, but it has a
|
||
// slightly different content.
|
||
//
|
||
|
||
HalpServerControlQva = (PVOID)((ULONG)PciIoSpaceBase
|
||
+ SERVER_MANAGEMENT_REGISTER);
|
||
//
|
||
// Map CMOS RAM address.
|
||
//
|
||
|
||
HalpCMOSRamBase = (PVOID)((ULONG)PciIoSpaceBase + ESC_CMOS_ISA_PORT);
|
||
|
||
//
|
||
// Map the real-time clock registers.
|
||
//
|
||
|
||
HalpRtcAddressPort = (PVOID)((ULONG)PciIoSpaceBase + RTC_ISA_ADDRESS_PORT);
|
||
HalpRtcDataPort = (PVOID)((ULONG)PciIoSpaceBase + RTC_ISA_DATA_PORT);
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
ULONG
|
||
HalpMapDebugPort(
|
||
IN ULONG ComPort,
|
||
OUT PULONG ReadQva,
|
||
OUT PULONG WriteQva
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine maps the debug com port so that the kernel debugger
|
||
may function - if called it is called very earlier in the boot sequence.
|
||
|
||
Arguments:
|
||
|
||
ComPort - Supplies the number of the com port to use as the debug port.
|
||
|
||
ReadQva - Receives the QVA used to access the read registers of the debug
|
||
port.
|
||
|
||
WriteQva - Receives the QVA used to access the write registers of the
|
||
debug port.
|
||
|
||
Return Value:
|
||
|
||
Returns the base bus address of the device used as the debug port.
|
||
|
||
--*/
|
||
{
|
||
ULONG ComPortAddress;
|
||
ULONG PortQva;
|
||
|
||
//
|
||
// Compute the port address, based on the desired com port.
|
||
//
|
||
|
||
switch( ComPort ){
|
||
|
||
case 1:
|
||
|
||
ComPortAddress = COM1_ISA_PORT_ADDRESS;
|
||
break;
|
||
|
||
case 2:
|
||
default:
|
||
|
||
ComPortAddress = COM2_ISA_PORT_ADDRESS;
|
||
|
||
}
|
||
|
||
//
|
||
// Return the QVAs for read and write access.
|
||
//
|
||
|
||
PortQva = (ULONG)HAL_MAKE_QVA(CIA_PCI_SPARSE_IO_PHYSICAL) + ComPortAddress;
|
||
|
||
*ReadQva = PortQva;
|
||
*WriteQva = PortQva;
|
||
|
||
return ComPortAddress;
|
||
|
||
}
|