2020-09-30 17:12:29 +02:00

241 lines
5.9 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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;
}