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