/*++ Copyright (c) 1992 Microsoft Corporation Module Name: detecthw.c Abstract: Routines for determining which drivers/HAL need to be loaded. Author: John Vert (jvert) 20-Oct-1993 Revision History: --*/ #include "haldtect.h" #include // // detection function prototypes // #if 0 ULONG DetectPicACPI_NEC98(PBOOLEAN); ULONG DetectMPS_NEC98(PBOOLEAN); ULONG DetectUPMPS_NEC98(PBOOLEAN); ULONG DetectTmr_NEC98(PBOOLEAN); ULONG DetectNonTmr_NEC98(PBOOLEAN); ULONG DetectSystemPro(PBOOLEAN); ULONG DetectWyse7(PBOOLEAN); ULONG NCRDeterminePlatform(PBOOLEAN); ULONG Detect486CStep(PBOOLEAN); ULONG DetectOlivettiMp(PBOOLEAN); ULONG DetectAST(PBOOLEAN); ULONG DetectCbusII(PBOOLEAN); ULONG DetectMPACPI(PBOOLEAN); ULONG DetectApicACPI(PBOOLEAN); ULONG DetectPicACPI(PBOOLEAN); ULONG DetectUPMPS(PBOOLEAN); ULONG DetectMPS(PBOOLEAN); #endif ULONG DetectTrue(PBOOLEAN); typedef struct _HAL_DETECT_ENTRY { INTERFACE_TYPE BusType; ULONG (*DetectFunction)(PBOOLEAN); PCHAR Shortname; } HAL_DETECT_ENTRY, *PHAL_DETECT_ENTRY; HAL_DETECT_ENTRY DetectHal[] = { #if 0 // First check for a HAL to match some specific hardware. Isa, DetectPicACPI_NEC98, "nec98acpipic_up", Isa, DetectMPS_NEC98, "nec98mps_mp", Isa, DetectUPMPS_NEC98, "nec98mps_up", Isa, DetectTmr_NEC98, "nec98tmr_up", Isa, DetectNonTmr_NEC98, "nec98Notmr_up", MicroChannel, NCRDeterminePlatform, "ncr3x_mp", Eisa, DetectCbusII, "cbus2_mp", Isa, DetectCbusII, "cbus2_mp", MicroChannel, DetectCbusII, "cbusmc_mp", Eisa, DetectMPACPI, "acpiapic_mp", Isa, DetectMPACPI, "acpiapic_mp", Eisa, DetectApicACPI, "acpiapic_up", Isa, DetectApicACPI, "acpiapic_up", Isa, DetectPicACPI, "acpipic_up", Eisa, DetectMPS, "mps_mp", Isa, DetectMPS, "mps_mp", MicroChannel, DetectMPS, "mps_mca_mp", Eisa, DetectUPMPS, "mps_up", Isa, DetectUPMPS, "mps_up", Eisa, DetectSystemPro, "syspro_mp", // check SystemPro last // Before using default HAL make sure we don't need a special one Isa, Detect486CStep, "486c_up", Eisa, Detect486CStep, "486c_up", // Use default hal for given bus type... Isa, DetectTrue, "e_isa_up", Eisa, DetectTrue, "e_isa_up", MicroChannel, DetectTrue, "mca_up", #endif Isa, DetectTrue, "acpipic_up", Eisa, DetectTrue, "acpipic_up", MicroChannel, DetectTrue, "acpipic_up", 0, NULL, NULL }; PCHAR SlDetectHal( VOID ) /*++ Routine Description: Determines which HAL to load and returns the filename. Arguments: None. Return Value: PCHAR - pointer to the filename of the HAL to be loaded. --*/ { PCONFIGURATION_COMPONENT_DATA Adapter; INTERFACE_TYPE BusType; BOOLEAN IsMpMachine; ULONG i; PCHAR MachineShortname; // // Determine the bus type by searching the ARC configuration tree // BusType = Isa; // // Check for Eisa // Adapter = KeFindConfigurationEntry(BlLoaderBlock->ConfigurationRoot, AdapterClass, EisaAdapter, NULL); if (Adapter != NULL) { BusType = Eisa; } // // Check for MCA // Adapter = NULL; for (; ;) { Adapter = KeFindConfigurationNextEntry ( BlLoaderBlock->ConfigurationRoot, AdapterClass, MultiFunctionAdapter, NULL, &Adapter ); if (!Adapter) { break; } if (_stricmp(Adapter->ComponentEntry.Identifier,"MCA")==0) { BusType = MicroChannel; break; } } // // Now go figure out machine and hal type. // for (i=0;;i++) { if (DetectHal[i].DetectFunction == NULL) { // // We reached the end of the list without // figuring it out! // SlFatalError(i); return(NULL); } if ((DetectHal[i].BusType == BusType) || (DetectHal[i].BusType == Internal)) { IsMpMachine = FALSE; if ((DetectHal[i].DetectFunction)(&IsMpMachine) != 0) { // // Found the correct HAL. // MachineShortname = DetectHal[i].Shortname; break; } } } return(MachineShortname); } ULONG DetectTrue( OUT PBOOLEAN IsMP ) /*++ Routine Description: To Return TRUE Return Value: TRUE --*/ { UNREFERENCED_PARAMETER( IsMP ); return TRUE; }