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.
169 lines
3.0 KiB
169 lines
3.0 KiB
/*++
|
|
|
|
Copyright (c) 1992 AST Research Inc.
|
|
|
|
Module Name:
|
|
|
|
astdetct.c
|
|
|
|
Abstract:
|
|
|
|
|
|
Author:
|
|
|
|
Bob Beard (v-bobb) 24-Jul-1992
|
|
|
|
Environment:
|
|
|
|
Kernel mode only.
|
|
|
|
Revision History:
|
|
|
|
Bob Beard (v-bobb) 19-Aug-1992 detect if MP
|
|
Quang Phan (v-quangp) 27-Aug-1992 modified to work with the NT Setup
|
|
program.
|
|
|
|
--*/
|
|
|
|
#ifndef _NTOS_
|
|
#include "nthal.h"
|
|
#endif
|
|
|
|
#include "halp.h"
|
|
#include "astebiii.h"
|
|
|
|
#define AST_MANUFACTURER_ID 0x0674
|
|
#define AST_EBI2_STRING 0x32494245
|
|
|
|
ULONG ProcCount;
|
|
//#define MAX_EBI_SLOTS 32L
|
|
//VOID* EBI2_MMIOTable[MAX_EBI_SLOTS];
|
|
|
|
//
|
|
// EBI_II function offset table
|
|
//
|
|
|
|
EBI_II EBI2_CallTab;
|
|
|
|
//
|
|
// Global pointer to BIOS
|
|
//
|
|
|
|
PVOID BiosPtr;
|
|
|
|
BOOLEAN
|
|
GetProcCount()
|
|
/*++
|
|
|
|
Routine Description:
|
|
Call EBI2 to get the number of processors in the system.
|
|
To make this call work with the NT current Setup environment,
|
|
(memory address limited to 16MB), a fake MMIOTable is passed to EBI.
|
|
ProcCount contains the number of processors in the system.
|
|
|
|
Arguments:
|
|
none.
|
|
|
|
Return Value:
|
|
True if successfully initialized. False otherwise.
|
|
|
|
--*/
|
|
{
|
|
|
|
ULONG i;
|
|
ULONG *Alias = (ULONG *)&EBI2_CallTab;
|
|
ebi_iiSig *Sig = (ebi_iiSig*)((ULONG)BiosPtr + EBI_II_SIGNATURE);
|
|
ULONG *OffTab;
|
|
|
|
//
|
|
// Build the EBI II offset table
|
|
//
|
|
|
|
OffTab =(ULONG *) ((ULONG)BiosPtr + (REAL_TO_LIN(Sig->seg,Sig->off) -
|
|
REAL_TO_LIN(BIOS_SEG, 0)));
|
|
for( i = 0; i < ( sizeof( offsetTable ) / sizeof( ULONG )); i++ )
|
|
Alias[i] = OffTab[i] + (ULONG)BiosPtr;
|
|
|
|
//
|
|
// Find out the number of good processors
|
|
//
|
|
|
|
if ( (EBI2_CallTab.GetNumProcs)( (VOID *) 0, &ProcCount ) )
|
|
return(FALSE);
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
|
|
|
|
ULONG
|
|
DetectAST(
|
|
OUT PBOOLEAN IsConfiguredMp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Determine on which AST platform we are running. Special HAL is needed
|
|
for EBI II based AST machines.
|
|
|
|
Arguments:
|
|
PBOOLEAN IsConfiguredMp returns with value of TRUE if MP. FALSE if
|
|
UP.
|
|
|
|
Return Value:
|
|
Boolean that indicates if AST EBI II platform is detected. TRUE means
|
|
an AST EBI II platform was detected. FALSE indicates it was not.
|
|
|
|
|
|
--*/
|
|
{
|
|
|
|
USHORT ManufacturerId;
|
|
PULONG EBI2StringPtr;
|
|
ULONG ProcCount;
|
|
UCHAR ProductId;
|
|
|
|
//
|
|
// Read the EISA ManufactuerID and check for AST
|
|
//
|
|
|
|
ManufacturerId = (((USHORT)(READ_PORT_UCHAR((PUCHAR)0xc80))) << 8)
|
|
| (READ_PORT_UCHAR((PUCHAR)0xc81));
|
|
if (ManufacturerId != AST_MANUFACTURER_ID)
|
|
return(FALSE);
|
|
|
|
//
|
|
//This HAL works with Manhattans that have EISA's ProductId 0x40-0x4F.
|
|
//
|
|
|
|
ProductId = ((READ_PORT_UCHAR((PUCHAR)0xc82)));
|
|
if ((ProductId & 0xF0) != 0x40)
|
|
return(FALSE);
|
|
|
|
//
|
|
// Map in all of AST BIOS for EBI II calls
|
|
//
|
|
|
|
BiosPtr = (PVOID)((ULONG)REAL_TO_LIN( BIOS_SEG, 0 ));
|
|
BiosPtr = HalpMapPhysicalMemory(BiosPtr, 0x10000/PAGE_SIZE); // assumes PAGE_SIZE <= 64k
|
|
if (BiosPtr == NULL)
|
|
return(FALSE);
|
|
|
|
EBI2StringPtr = (PULONG)((ULONG)BiosPtr + EBI_II_SIGNATURE);
|
|
if (*EBI2StringPtr != AST_EBI2_STRING)
|
|
return(FALSE);
|
|
|
|
//
|
|
// Call EBI II to get num. of processors
|
|
//
|
|
if (!GetProcCount())
|
|
return(FALSE);
|
|
|
|
//
|
|
// This is an MP hal
|
|
//
|
|
|
|
*IsConfiguredMp = TRUE;
|
|
|
|
return(TRUE);
|
|
}
|