287 lines
5.8 KiB
C
287 lines
5.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1991 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
xxinithl.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
|
|||
|
This module implements the initialization of the system dependent
|
|||
|
functions that define the Hardware Architecture Layer (HAL) for a
|
|||
|
MIPS R3000 or R4000 system.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
David N. Cutler (davec) 25-Apr-1991
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
Kernel mode only.
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "halp.h"
|
|||
|
#include "iousage.h"
|
|||
|
|
|||
|
//
|
|||
|
// Constants
|
|||
|
//
|
|||
|
|
|||
|
ADDRESS_USAGE
|
|||
|
UniFlexPCIMainMemorySpace = {
|
|||
|
NULL, CmResourceTypeMemory, PCIUsage,
|
|||
|
{
|
|||
|
__0MB, __1GB, // Start=0MB; Length=1GB
|
|||
|
0,0
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
//ADDRESS_USAGE
|
|||
|
//UniFlexPCIReservedMemorySpace = {
|
|||
|
// NULL, CmResourceTypeMemory, PCIUsage,
|
|||
|
// {
|
|||
|
// __1GB + __128MB, __2GB + __1GB - __128MB, // Start=0MB; Length=1GB
|
|||
|
// 0,0
|
|||
|
// }
|
|||
|
//};
|
|||
|
|
|||
|
//ADDRESS_USAGE
|
|||
|
//UniFlexPCIReservedIoSpace = {
|
|||
|
// NULL, CmResourceTypePort, PCIUsage,
|
|||
|
// {
|
|||
|
// __32MB, ~(__32MB) + 1, // Start=32MB; Length= 4GB - 32MB
|
|||
|
// 0,0
|
|||
|
// }
|
|||
|
//};
|
|||
|
|
|||
|
//
|
|||
|
// Type Declarations
|
|||
|
//
|
|||
|
|
|||
|
typedef
|
|||
|
VOID
|
|||
|
(*PGET_PLATFORM_PARAMETER_BLOCK) (
|
|||
|
OUT PLATFORM_PARAMETER_BLOCK **PlatformParameterBlock
|
|||
|
);
|
|||
|
|
|||
|
//
|
|||
|
// Global Veriables
|
|||
|
//
|
|||
|
|
|||
|
KAFFINITY HalpActiveProcessors;
|
|||
|
ULONG HalpBusType = UNIFLEX_MACHINE_TYPE_EISA;
|
|||
|
ULONG HalpMapBufferSize;
|
|||
|
PHYSICAL_ADDRESS HalpMapBufferPhysicalAddress;
|
|||
|
PLATFORM_PARAMETER_BLOCK *HalpPlatformParameterBlock = NULL;
|
|||
|
PLATFORM_SPECIFIC_EXTENSION *HalpPlatformSpecificExtension = NULL;
|
|||
|
|
|||
|
|
|||
|
VOID HalpGetPlatformParameterBlock(VOID)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function gets the PlatformParameterBlock data structure from the
|
|||
|
firmware. If the PlatformParameterBlock is not available, then the
|
|||
|
system is halted.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PSYSTEM_PARAMETER_BLOCK SystemParameterBlock = SYSTEM_BLOCK;
|
|||
|
PGET_PLATFORM_PARAMETER_BLOCK PrivateGetPlatformParameterBlock;
|
|||
|
|
|||
|
//
|
|||
|
// Get Platform Parameter Block from Firmware
|
|||
|
//
|
|||
|
|
|||
|
if ((SystemParameterBlock->VendorVectorLength / 4) >= 37) {
|
|||
|
PrivateGetPlatformParameterBlock = *(PGET_PLATFORM_PARAMETER_BLOCK *)((ULONG)(SystemParameterBlock->VendorVector) + 37*4);
|
|||
|
PrivateGetPlatformParameterBlock(&HalpPlatformParameterBlock);
|
|||
|
HalpPlatformSpecificExtension = (PLATFORM_SPECIFIC_EXTENSION *)(HalpPlatformParameterBlock->PlatformSpecificExtension);
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// HALT system. No platform parameter block available.
|
|||
|
//
|
|||
|
|
|||
|
for(;;);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
BOOLEAN
|
|||
|
HalInitSystem (
|
|||
|
IN ULONG Phase,
|
|||
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function initializes the Hardware Architecture Layer (HAL) for a
|
|||
|
MIPS R3000 or R4000 system.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Phase - Supplies the initialization phase (zero or one).
|
|||
|
|
|||
|
LoaderBlock - Supplies a pointer to a loader parameter block.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
A value of TRUE is returned is the initialization was successfully
|
|||
|
complete. Otherwise a value of FALSE is returend.
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
PKPRCB Prcb;
|
|||
|
ULONG BuildType = 0;
|
|||
|
|
|||
|
Prcb = KeGetCurrentPrcb();
|
|||
|
if (Phase == 0) {
|
|||
|
|
|||
|
//
|
|||
|
// Phase 0 initialization.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Verify that the processor block major version number conform
|
|||
|
// to the system that is being loaded.
|
|||
|
//
|
|||
|
|
|||
|
if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) {
|
|||
|
KeBugCheck(MISMATCHED_HAL);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Set the active processor affinity mask.
|
|||
|
//
|
|||
|
|
|||
|
HalpActiveProcessors = 1 << Prcb->Number;
|
|||
|
|
|||
|
//
|
|||
|
// Set the DMA I/O Coherency to not coherent. This means that the instruction
|
|||
|
// cache is not coherent with DMA, and the data cache is not coherent with DMA
|
|||
|
// on either reads or writes.
|
|||
|
//
|
|||
|
|
|||
|
KeSetDmaIoCoherency(0);
|
|||
|
|
|||
|
//
|
|||
|
// Set the time increment value.
|
|||
|
//
|
|||
|
|
|||
|
HalpCurrentTimeIncrement = MAXIMUM_INCREMENT;
|
|||
|
HalpNextTimeIncrement = MAXIMUM_INCREMENT;
|
|||
|
HalpNextIntervalCount = 0;
|
|||
|
KeSetTimeIncrement(MAXIMUM_INCREMENT, MINIMUM_INCREMENT);
|
|||
|
|
|||
|
//
|
|||
|
// Fill in handlers for APIs which this HAL supports
|
|||
|
//
|
|||
|
|
|||
|
HalQuerySystemInformation = HaliQuerySystemInformation;
|
|||
|
HalSetSystemInformation = HaliSetSystemInformation;
|
|||
|
HalRegisterBusHandler = HaliRegisterBusHandler;
|
|||
|
HalHandlerForBus = HaliHandlerForBus;
|
|||
|
HalHandlerForConfigSpace = HaliHandlerForConfigSpace;
|
|||
|
|
|||
|
//
|
|||
|
// Get Platform Parameter Block from Firmware
|
|||
|
//
|
|||
|
|
|||
|
HalpGetPlatformParameterBlock();
|
|||
|
|
|||
|
//
|
|||
|
// Do platform specific initialization.
|
|||
|
//
|
|||
|
|
|||
|
HalpInitSystem(Phase,LoaderBlock);
|
|||
|
|
|||
|
//
|
|||
|
// Initialize interrupts.
|
|||
|
//
|
|||
|
|
|||
|
HalpInitializeInterrupts();
|
|||
|
|
|||
|
//
|
|||
|
// Register HAL Reserved Address Spaces
|
|||
|
//
|
|||
|
|
|||
|
// HalpRegisterAddressUsage (&UniFlexPCIMainMemorySpace);
|
|||
|
// HalpRegisterAddressUsage (&UniFlexPCIReservedMemorySpace);
|
|||
|
// HalpRegisterAddressUsage (&UniFlexPCIReservedIoSpace);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
//
|
|||
|
// Phase 1 initialization.
|
|||
|
//
|
|||
|
|
|||
|
//
|
|||
|
// Do platform specific initialization.
|
|||
|
//
|
|||
|
|
|||
|
HalpInitSystem(Phase,LoaderBlock);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
VOID
|
|||
|
HalInitializeProcessor (
|
|||
|
IN ULONG Number
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This function is called early in the initialization of the kernel
|
|||
|
to perform platform dependent initialization for each processor
|
|||
|
before the HAL Is fully functional.
|
|||
|
|
|||
|
N.B. When this routine is called, the PCR is present but is not
|
|||
|
fully initialized.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Number - Supplies the number of the processor to initialize.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
HalpVerifyPrcbVersion ()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|