/** @file | |
MADT Table | |
This file contains a structure definition for the ACPI 1.0 Multiple APIC | |
Description Table (MADT). | |
Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com> | |
Copyright (c) 2014, Pluribus Networks, Inc. | |
Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <IndustryStandard/Acpi.h> | |
#include <Platform.h> | |
#define EFI_ACPI_OEM_TABLE_ID SIGNATURE_64('B','V','M','A','D','T',' ',' ') | |
// | |
// Local APIC address | |
// | |
#define EFI_ACPI_LOCAL_APIC_ADDRESS 0xFEE00000 | |
// | |
// Multiple APIC Flags are defined in AcpiX.0.h | |
// | |
#define EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS (EFI_ACPI_1_0_PCAT_COMPAT) | |
// | |
// Define the number of each table type. | |
// This is where the table layout is modified. | |
// | |
#define EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT 1 | |
#define EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT 1 | |
#define EFI_ACPI_IO_APIC_COUNT 1 | |
// | |
// Ensure proper structure formats | |
// | |
#pragma pack (1) | |
// | |
// ACPI 1.0 MADT structure | |
// | |
typedef struct { | |
EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER Header; | |
#if EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT > 0 | |
EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE LocalApic[EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT]; | |
#endif | |
#if EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT > 0 | |
EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE Iso[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT]; | |
#endif | |
#if EFI_ACPI_IO_APIC_COUNT > 0 | |
EFI_ACPI_1_0_IO_APIC_STRUCTURE IoApic[EFI_ACPI_IO_APIC_COUNT]; | |
#endif | |
} EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE; | |
#pragma pack () | |
// | |
// Multiple APIC Description Table | |
// | |
EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = { | |
{ | |
{ | |
EFI_ACPI_1_0_APIC_SIGNATURE, | |
sizeof (EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE), | |
EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, | |
0x00, // Checksum will be updated at runtime | |
{EFI_ACPI_OEM_ID}, | |
EFI_ACPI_OEM_TABLE_ID, | |
EFI_ACPI_OEM_REVISION, | |
EFI_ACPI_CREATOR_ID, | |
EFI_ACPI_CREATOR_REVISION | |
}, | |
// | |
// MADT specific fields | |
// | |
EFI_ACPI_LOCAL_APIC_ADDRESS, | |
EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS, | |
}, | |
// | |
// Processor Local APIC Structure | |
// | |
{ | |
{ | |
EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC, // Type | |
sizeof (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length | |
0x00, // Processor ID | |
0x00, // Local APIC ID | |
0x00000001 // Flags - Enabled by default | |
} | |
}, | |
// | |
// Interrupt Source Override Structure | |
// | |
{ | |
{ | |
// | |
// IRQ0=>IRQ2 Interrupt Source Override Structure | |
// | |
EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE, // Type | |
sizeof (EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length | |
0x00, // Bus - ISA | |
0x00, // Source - IRQ0 | |
0x00000002, // Global System Interrupt - IRQ2 | |
0x0005 // Flags - Conforms to specifications of the bus | |
}, | |
}, | |
// | |
// IO APIC Structure | |
// | |
{ | |
{ | |
EFI_ACPI_1_0_IO_APIC, // Type | |
sizeof (EFI_ACPI_1_0_IO_APIC_STRUCTURE), // Length | |
0x01, // IO APIC ID | |
EFI_ACPI_RESERVED_BYTE, // Reserved | |
0xFEC00000, // IO APIC Address (physical) | |
0x00000000 // Global System Interrupt Base | |
} | |
}, | |
}; | |
VOID* | |
ReferenceAcpiTable ( | |
VOID | |
) | |
{ | |
// | |
// Reference the table being generated to prevent the optimizer from removing the | |
// data structure from the exeutable | |
// | |
return (VOID*)&Madt; | |
} |