2 This file describes the contents of the ACPI Multiple APIC Description
3 Table (MADT). Some additional ACPI values are defined in Acpi10.h and
5 To make changes to the MADT, it is necessary to update the count for the
6 APIC structure being updated, and to modify table found in Madt.c.
8 Copyright (c) 2013-2015 Intel Corporation.
10 SPDX-License-Identifier: BSD-2-Clause-Patent
20 // Statements that include other files
23 #include <IndustryStandard/Acpi.h>
24 #include <Library/PcdLib.h>
30 #define EFI_ACPI_OEM_MADT_REVISION 0x00000001
36 #define EFI_ACPI_LOCAL_APIC_ADDRESS 0xFEE00000
39 // Multiple APIC Flags are defined in AcpiX.0.h
41 #define EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS (EFI_ACPI_1_0_PCAT_COMPAT)
42 #define EFI_ACPI_2_0_MULTIPLE_APIC_FLAGS (EFI_ACPI_2_0_PCAT_COMPAT)
45 // Define the number of each table type.
46 // This is where the table layout is modified.
49 #define EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT 2
50 #define EFI_ACPI_IO_APIC_COUNT 1
51 #define EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT 2
52 #define EFI_ACPI_NON_MASKABLE_INTERRUPT_SOURCE_COUNT 0
53 #define EFI_ACPI_LOCAL_APIC_NMI_COUNT 2
54 #define EFI_ACPI_LOCAL_APIC_ADDRESS_OVERRIDE_COUNT 0
55 #define EFI_ACPI_IO_SAPIC_COUNT 0
56 #define EFI_ACPI_PROCESSOR_LOCAL_SAPIC_COUNT 0
57 #define EFI_ACPI_PLATFORM_INTERRUPT_SOURCES_COUNT 0
59 #define EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT_MAX 16
66 // Ensure proper structure formats
71 // ACPI 1.0 Table structure
74 EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER Header
;
76 #if EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT > 0
77 EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE LocalApic
[EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT
];
80 #if EFI_ACPI_IO_APIC_COUNT > 0
81 EFI_ACPI_1_0_IO_APIC_STRUCTURE IoApic
[EFI_ACPI_IO_APIC_COUNT
];
84 #if EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT > 0
85 EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE Iso
[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT
];
88 #if EFI_ACPI_NON_MASKABLE_INTERRUPT_SOURCE_COUNT > 0
89 EFI_ACPI_1_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE NmiSource
[EFI_ACPI_NON_MASKABLE_INTERRUPT_SOURCE_COUNT
];
92 #if EFI_ACPI_LOCAL_APIC_NMI_COUNT > 0
93 EFI_ACPI_1_0_LOCAL_APIC_NMI_STRUCTURE LocalApicNmi
[EFI_ACPI_LOCAL_APIC_NMI_COUNT
];
96 #if EFI_ACPI_LOCAL_APIC_ADDRESS_OVERRIDE_COUNT > 0
97 EFI_ACPI_1_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE LocalApicOverride
[EFI_ACPI_LOCAL_APIC_OVERRIDE_COUNT
];
100 } EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE
;
103 // ACPI 2.0 Table structure
106 EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER Header
;
108 #if EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT > 0
109 EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE LocalApic
[EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT
];
112 #if EFI_ACPI_IO_APIC_COUNT > 0
113 EFI_ACPI_2_0_IO_APIC_STRUCTURE IoApic
[EFI_ACPI_IO_APIC_COUNT
];
116 #if EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT > 0
117 EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE Iso
[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT
];
120 #if EFI_ACPI_NON_MASKABLE_INTERRUPT_SOURCE_COUNT > 0
121 EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE NmiSource
[EFI_ACPI_NON_MASKABLE_INTERRUPT_SOURCE_COUNT
];
124 #if EFI_ACPI_LOCAL_APIC_NMI_COUNT > 0
125 EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE LocalApicNmi
[EFI_ACPI_LOCAL_APIC_NMI_COUNT
];
128 #if EFI_ACPI_LOCAL_APIC_ADDRESS_OVERRIDE_COUNT > 0
129 EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE LocalApicOverride
[EFI_ACPI_LOCAL_APIC_ADDRESS_OVERRIDE_COUNT
];
132 #if EFI_ACPI_IO_SAPIC_COUNT > 0
133 EFI_ACPI_2_0_IO_SAPIC_STRUCTURE IoSapic
[EFI_ACPI_IO_SAPIC_COUNT
];
136 #if EFI_ACPI_PROCESSOR_LOCAL_SAPIC_COUNT > 0
137 EFI_ACPI_2_0_PROCESSOR_LOCAL_SAPIC_STRUCTURE LocalSapic
[EFI_ACPI_PROCESSOR_LOCAL_SAPIC_COUNT
];
140 #if EFI_ACPI_PLATFORM_INTERRUPT_SOURCES_COUNT > 0
141 EFI_ACPI_2_0_PLATFORM_INTERRUPT_SOURCES_STRUCTURE PlatformInterruptSources
[EFI_ACPI_PLATFORM_INTERRUPT_SOURCES_COUNT
];
144 } EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE
;
146 #define _PcdIntSettingTblEnable(x) PcdGet8 (PcdInterruptOverrideSettingTable##x##Enable)
147 #define PcdIntSettingTblEnable(x) _PcdIntSettingTblEnable(x)
149 #define _PcdIntSettingTblSourceIrq(x) PcdGet8 (PcdInterruptOverrideSettingTable##x##Enable)
150 #define PcdIntSettingTblSourceIrq(x) _PcdIntSettingTblSourceIrq(x)
152 #define _PcdIntSettingTblPolarity(x) PcdGet8 (PcdInterruptOverrideSettingTable##x##Polarity)
153 #define PcdIntSettingTblPolarity(x) _PcdIntSettingTblPolarity(x)
155 #define _PcdIntSettingTableTrigerMode(x) PcdGet8 (PcdInterruptOverrideSettingTable##x##TrigerMode)
156 #define PcdIntSettingTableTrigerMode(x) _PcdIntSettingTableTrigerMode(x)
158 #define _PcdIntSettingTableGlobalIrq(x) PcdGet32 (PcdInterruptOverrideSettingTable##x##GlobalIrq)
159 #define PcdIntSettingTableGlobalIrq(x) _PcdIntSettingTableGlobalIrq(x)
167 } INTERRUPT_OVERRIDE_SETTING
;
171 UINT32 IoApicAddress
;
172 UINT32 GlobalInterruptBase
;
181 UINT8 NmiEnabelApicIdMask
;
182 UINT8 AddressOverrideEnable
;
187 UINT32 LocalApicAddress
;
188 UINT64 LocalApicAddressOverride
;
189 } LOCAL_APIC_SETTING
;
191 typedef struct _MADT_CONFIG_DATA
{
192 INTERRUPT_OVERRIDE_SETTING MadtInterruptSetting
[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT_MAX
];
193 IO_APIC_SETTING MadtIoApicSetting
;
194 LOCAL_APIC_SETTING MadtLocalApicSetting
;
201 MadtTableInitialize (
202 OUT EFI_ACPI_COMMON_HEADER
**MadtTable
,