mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
5.2 KiB
192 lines
5.2 KiB
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
jxmapio.c
|
|
|
|
Abstract:
|
|
|
|
This module implements the mapping of HAL I/O space a MIPS R3000
|
|
or R4000 Jazz system.
|
|
|
|
Author:
|
|
|
|
David N. Cutler (davec) 28-Apr-1991
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "halp.h"
|
|
|
|
//
|
|
// Define global data used to locate the EISA control space and the realtime
|
|
// clock registers.
|
|
//
|
|
|
|
PVOID HalpEisaControlBase[MAX_EISA_BUSSES];
|
|
PVOID HalpEisaMemoryBase[MAX_EISA_BUSSES];
|
|
PVOID HalpPciControlBase[MAX_PCI_BUSSES];
|
|
PVOID HalpPciMemoryBase[MAX_PCI_BUSSES];
|
|
PVOID HalpRealTimeClockBase;
|
|
PVOID HalpFirmwareVirtualBase;
|
|
PVOID PciInterruptRegisterBase;
|
|
PVOID HalpSecondaryCacheResetBase;
|
|
|
|
|
|
BOOLEAN
|
|
HalpMapIoSpace (
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine maps the HAL I/O space for a MIPS R3000 or R4000 Jazz
|
|
system.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
If the initialization is successfully completed, than a value of TRUE
|
|
is returned. Otherwise, a value of FALSE is returned.
|
|
|
|
--*/
|
|
|
|
{
|
|
PHYSICAL_ADDRESS physicalAddress;
|
|
|
|
//
|
|
// Map EISA control space. Map all 16 slots. This is done so the NMI
|
|
// code can probe the cards.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpIsaIoBasePhysical;
|
|
HalpEisaControlBase[0] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE * 16,
|
|
FALSE);
|
|
|
|
if (HalpMotherboardType == TREBBIA20) {
|
|
physicalAddress.QuadPart = HalpIsa1IoBasePhysical;
|
|
HalpEisaControlBase[1] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE * 16,
|
|
FALSE);
|
|
}
|
|
|
|
//
|
|
// Map realtime clock registers.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpIsaIoBasePhysical + 0x71;
|
|
HalpRealTimeClockBase = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE,
|
|
FALSE);
|
|
|
|
//
|
|
// Map ISA Memory Space.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpIsaMemoryBasePhysical;
|
|
HalpEisaMemoryBase[0] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE*256,
|
|
FALSE);
|
|
|
|
if (HalpMotherboardType == TREBBIA20) {
|
|
physicalAddress.QuadPart = HalpIsa1MemoryBasePhysical;
|
|
HalpEisaMemoryBase[1] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE*256,
|
|
FALSE);
|
|
}
|
|
|
|
//
|
|
// Map PCI control space. Map all 16 slots. This is done so the NMI
|
|
// code can probe the cards.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpPciIoBasePhysical;
|
|
HalpPciControlBase[0] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE * 16,
|
|
FALSE);
|
|
|
|
//
|
|
// Map PCI Memory Space.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpPciMemoryBasePhysical;
|
|
HalpPciMemoryBase[0] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE*256,
|
|
FALSE);
|
|
|
|
if (HalpMotherboardType == TREBBIA20) {
|
|
physicalAddress.QuadPart = HalpPci1IoBasePhysical;
|
|
HalpPciControlBase[1] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE * 16,
|
|
FALSE);
|
|
|
|
physicalAddress.QuadPart = HalpPci1MemoryBasePhysical;
|
|
HalpPciMemoryBase[1] = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE*256,
|
|
FALSE);
|
|
}
|
|
|
|
//
|
|
// Map PCI interrupt space.
|
|
//
|
|
|
|
physicalAddress.QuadPart = GAMBIT_PCI_INTERRUPT_BASE_PHYSICAL;
|
|
PciInterruptRegisterBase = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE,
|
|
FALSE);
|
|
|
|
//
|
|
// Map Secondary Cache Reset space.
|
|
//
|
|
|
|
physicalAddress.QuadPart = GAMBIT_SECONDARY_CACHE_RESET_BASE_PHYSICAL;
|
|
HalpSecondaryCacheResetBase = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE,
|
|
FALSE);
|
|
|
|
|
|
//
|
|
// If either mapped address is NULL, then return FALSE as the function
|
|
// value. Otherwise, return TRUE.
|
|
//
|
|
|
|
if ((HalpEisaControlBase[0] == NULL) ||
|
|
(HalpRealTimeClockBase == NULL) ||
|
|
(HalpEisaMemoryBase[0] == NULL) ||
|
|
(HalpPciControlBase[0] == NULL) ||
|
|
(HalpPciMemoryBase[0] == NULL) ||
|
|
(HalpSecondaryCacheResetBase == NULL)) {
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Map 1 page of EISA control space to generate a virtual address that the firmware can use.
|
|
//
|
|
|
|
physicalAddress.QuadPart = HalpIsaIoBasePhysical;
|
|
HalpFirmwareVirtualBase = MmMapIoSpace(physicalAddress,
|
|
PAGE_SIZE,
|
|
FALSE);
|
|
|
|
// HalpArcsSetVirtualBase(0,HalpEisaControlBase[0]);
|
|
// HalpArcsSetVirtualBase(1,HalpEisaMemoryBase[0]);
|
|
// HalpArcsSetVirtualBase(4,HalpPciControlBase);
|
|
// HalpArcsSetVirtualBase(5,HalpPciMemoryBase);
|
|
|
|
HalpArcsSetVirtualBase(7,HalpFirmwareVirtualBase);
|
|
|
|
return TRUE;
|
|
}
|