mirror of
https://github.com/reactos/reactos.git
synced 2024-05-31 17:51:49 +00:00
10e7643c80
Will be used for supporting /NOSERIALMICE, /FASTDETECT (NT 5+) switches (see PR #5886), as well as the undocumented /PCIENUM option.
151 lines
4.6 KiB
C
151 lines
4.6 KiB
C
/*
|
|
* PROJECT: FreeLoader UEFI Support
|
|
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
|
|
* PURPOSE: Hardware detection routines
|
|
* COPYRIGHT: Copyright 2022 Justin Miller <justinmiller100@gmail.com>
|
|
*/
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
#include <uefildr.h>
|
|
|
|
#include <debug.h>
|
|
DBG_DEFAULT_CHANNEL(WARNING);
|
|
|
|
/* GLOBALS *******************************************************************/
|
|
|
|
extern EFI_SYSTEM_TABLE * GlobalSystemTable;
|
|
extern EFI_HANDLE GlobalImageHandle;
|
|
extern UCHAR PcBiosDiskCount;
|
|
extern EFI_MEMORY_DESCRIPTOR* EfiMemoryMap;
|
|
extern UINT32 FreeldrDescCount;
|
|
|
|
BOOLEAN AcpiPresent = FALSE;
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
static
|
|
PRSDP_DESCRIPTOR
|
|
FindAcpiBios(VOID)
|
|
{
|
|
UINTN i;
|
|
RSDP_DESCRIPTOR* rsdp = NULL;
|
|
EFI_GUID acpi2_guid = EFI_ACPI_20_TABLE_GUID;
|
|
|
|
for (i = 0; i < GlobalSystemTable->NumberOfTableEntries; i++)
|
|
{
|
|
if (!memcmp(&GlobalSystemTable->ConfigurationTable[i].VendorGuid,
|
|
&acpi2_guid, sizeof(acpi2_guid)))
|
|
{
|
|
rsdp = (RSDP_DESCRIPTOR*)GlobalSystemTable->ConfigurationTable[i].VendorTable;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return rsdp;
|
|
}
|
|
|
|
VOID
|
|
DetectAcpiBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber)
|
|
{
|
|
PCONFIGURATION_COMPONENT_DATA BiosKey;
|
|
PCM_PARTIAL_RESOURCE_LIST PartialResourceList;
|
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor;
|
|
PRSDP_DESCRIPTOR Rsdp;
|
|
PACPI_BIOS_DATA AcpiBiosData;
|
|
ULONG TableSize;
|
|
|
|
Rsdp = FindAcpiBios();
|
|
|
|
if (Rsdp)
|
|
{
|
|
/* Set up the flag in the loader block */
|
|
AcpiPresent = TRUE;
|
|
|
|
/* Calculate the table size */
|
|
TableSize = FreeldrDescCount * sizeof(BIOS_MEMORY_MAP) +
|
|
sizeof(ACPI_BIOS_DATA) - sizeof(BIOS_MEMORY_MAP);
|
|
|
|
/* Set 'Configuration Data' value */
|
|
PartialResourceList = FrLdrHeapAlloc(sizeof(CM_PARTIAL_RESOURCE_LIST) +
|
|
TableSize, TAG_HW_RESOURCE_LIST);
|
|
if (PartialResourceList == NULL)
|
|
{
|
|
ERR("Failed to allocate resource descriptor\n");
|
|
return;
|
|
}
|
|
|
|
RtlZeroMemory(PartialResourceList, sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize);
|
|
PartialResourceList->Version = 0;
|
|
PartialResourceList->Revision = 0;
|
|
PartialResourceList->Count = 1;
|
|
|
|
PartialDescriptor = &PartialResourceList->PartialDescriptors[0];
|
|
PartialDescriptor->Type = CmResourceTypeDeviceSpecific;
|
|
PartialDescriptor->ShareDisposition = CmResourceShareUndetermined;
|
|
PartialDescriptor->u.DeviceSpecificData.DataSize = TableSize;
|
|
|
|
/* Fill the table */
|
|
AcpiBiosData = (PACPI_BIOS_DATA)&PartialResourceList->PartialDescriptors[1];
|
|
|
|
if (Rsdp->revision > 0)
|
|
{
|
|
TRACE("ACPI >1.0, using XSDT address\n");
|
|
AcpiBiosData->RSDTAddress.QuadPart = Rsdp->xsdt_physical_address;
|
|
}
|
|
else
|
|
{
|
|
TRACE("ACPI 1.0, using RSDT address\n");
|
|
AcpiBiosData->RSDTAddress.LowPart = Rsdp->rsdt_physical_address;
|
|
}
|
|
|
|
AcpiBiosData->Count = FreeldrDescCount;
|
|
memcpy(AcpiBiosData->MemoryMap, EfiMemoryMap,
|
|
FreeldrDescCount * sizeof(BIOS_MEMORY_MAP));
|
|
|
|
TRACE("RSDT %p, data size %x\n", Rsdp->rsdt_physical_address, TableSize);
|
|
|
|
/* Create new bus key */
|
|
FldrCreateComponentKey(SystemKey,
|
|
AdapterClass,
|
|
MultiFunctionAdapter,
|
|
0x0,
|
|
0x0,
|
|
0xFFFFFFFF,
|
|
"ACPI BIOS",
|
|
PartialResourceList,
|
|
sizeof(CM_PARTIAL_RESOURCE_LIST) + TableSize,
|
|
&BiosKey);
|
|
|
|
/* Increment bus number */
|
|
(*BusNumber)++;
|
|
}
|
|
}
|
|
|
|
PCONFIGURATION_COMPONENT_DATA
|
|
UefiHwDetect(
|
|
_In_opt_ PCSTR Options)
|
|
{
|
|
PCONFIGURATION_COMPONENT_DATA SystemKey;
|
|
ULONG BusNumber = 0;
|
|
|
|
TRACE("DetectHardware()\n");
|
|
|
|
/* Create the 'System' key */
|
|
#if defined(_M_IX86) || defined(_M_AMD64)
|
|
FldrCreateSystemKey(&SystemKey, "AT/AT COMPATIBLE");
|
|
#elif defined(_M_IA64)
|
|
FldrCreateSystemKey(&SystemKey, "Intel Itanium processor family");
|
|
#elif defined(_M_ARM) || defined(_M_ARM64)
|
|
FldrCreateSystemKey(&SystemKey, "ARM processor family");
|
|
#else
|
|
#error Please define a system key for your architecture
|
|
#endif
|
|
|
|
/* Detect ACPI */
|
|
DetectAcpiBios(SystemKey, &BusNumber);
|
|
|
|
TRACE("DetectHardware() Done\n");
|
|
return SystemKey;
|
|
}
|