blob: e8e956ed80b808aeeaa0c63ebb94ae8ef166cb76 [file] [log] [blame]
/** @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;
}