/** @file | |
MADT Table | |
This file contains a structure definition for the ACPI 1.0 Multiple APIC | |
Description Table (MADT). | |
Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials are | |
licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include <IndustryStandard/Acpi.h> | |
#include <Platform.h> | |
// | |
// Local APIC address | |
// | |
#define EFI_ACPI_LOCAL_APIC_ADDRESS 0xFEE00000 // TBD | |
// | |
// 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 2 | |
#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 | |
0x0000 // Flags - Conforms to specifications of the bus | |
}, | |
{ | |
// | |
// ISO (SCI Active High) 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 | |
0x09, // Source - IRQ0 | |
0x00000009, // Global System Interrupt - IRQ2 | |
0x000D // Flags - Level-tiggered, Active High | |
} | |
}, | |
// | |
// IO APIC Structure | |
// | |
{ | |
{ | |
EFI_ACPI_1_0_IO_APIC, // Type | |
sizeof (EFI_ACPI_1_0_IO_APIC_STRUCTURE), // Length | |
0x02, // 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; | |
} |