206 lines
4.0 KiB
C
Raw Permalink Normal View History

2001-01-01 00:00:00 +01:00
/*++
Copyright (c) 1993 Digital Equipment Corporation
Module Name:
ebmapio.c
Abstract:
This module contains the functions to map HAL-accessed I/O addresses
on the Sable system.
Author:
Joe Notarangelo 25-Oct-1993
Environment:
Kernel mode
Revision History:
--*/
#include "halp.h"
#include "isaaddr.h"
//
// Define global data used to locate the EISA control space.
//
PVOID HalpEisaControlBase;
PVOID HalpEisaIntAckBase;
PVOID HalpCMOSRamBase;
//
// Define the array that maps logical processor numbers to the corresponding
// QVA for that processor's CPU CSRs.
//
PSABLE_CPU_CSRS HalpSableCpuCsrs[HAL_MAXIMUM_PROCESSOR+1];
BOOLEAN
HalpMapIoSpace (
VOID
)
/*++
Routine Description:
This routine maps the HAL I/O space for a Sable
system using the Quasi VA.
Arguments:
None.
Return Value:
If the initialization is successfully completed, then a value of TRUE
is returned. Otherwise, a value of FALSE is returned.
--*/
{
PVOID PciIoSpaceBase;
#if !defined(AXP_FIRMWARE)
PKPRCB Prcb;
extern HalpLogicalToPhysicalProcessor[HAL_MAXIMUM_PROCESSOR+1];
Prcb = PCR->Prcb;
//
// Assign CPU specific CSR address
//
switch( HalpLogicalToPhysicalProcessor[Prcb->Number] ) {
case SABLE_CPU0:
HAL_PCR->IpirSva = SABLE_CPU0_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
HAL_PCR->CpuCsrsQva = SABLE_CPU0_CSRS_QVA;
HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU0_CSRS_QVA;
break;
case SABLE_CPU1:
HAL_PCR->IpirSva = SABLE_CPU1_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
HAL_PCR->CpuCsrsQva = SABLE_CPU1_CSRS_QVA;
HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU1_CSRS_QVA;
break;
case SABLE_CPU2:
HAL_PCR->IpirSva = SABLE_CPU2_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
HAL_PCR->CpuCsrsQva = SABLE_CPU2_CSRS_QVA;
HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU2_CSRS_QVA;
break;
case SABLE_CPU3:
HAL_PCR->IpirSva = SABLE_CPU3_IPIR_PHYSICAL | SUPERPAGE_ENABLE;
HAL_PCR->CpuCsrsQva = SABLE_CPU3_CSRS_QVA;
HalpSableCpuCsrs[Prcb->Number] = SABLE_CPU3_CSRS_QVA;
break;
default:
#ifdef HALDBG
DbgPrint("HalpMapIoSpace: Invalid Cpu number %d\n", Prcb->Number);
DbgBreakPoint();
#else
;
#endif // HALDBG
}
#endif // AXP_FIRMWARE
//
// Map EISA control space.
//
PciIoSpaceBase = HAL_MAKE_QVA( SABLE_PCI0_SPARSE_IO_PHYSICAL );
HalpEisaControlBase = PciIoSpaceBase;
HalpCMOSRamBase = (PVOID)
( (ULONG)HAL_MAKE_QVA( SABLE_PCI0_SPARSE_IO_PHYSICAL ) +
CMOS_ISA_PORT_ADDRESS );
//
// 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(SABLE_PCI0_SPARSE_IO_PHYSICAL) +
ComPortAddress;
*ReadQva = PortQva;
*WriteQva = PortQva;
return ComPortAddress;
}