]>
Commit | Line | Data |
---|---|---|
b303605e MK |
1 | /** @file\r |
2 | This file contains Madt Talbe initialized work.\r | |
3 | \r | |
4 | Copyright (c) 2013-2015 Intel Corporation.\r | |
5 | \r | |
6 | This program and the accompanying materials\r | |
7 | are licensed and made available under the terms and conditions of the BSD License\r | |
8 | which accompanies this distribution. The full text of the license may be found at\r | |
9 | http://opensource.org/licenses/bsd-license.php\r | |
10 | \r | |
11 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
12 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
13 | \r | |
14 | \r | |
15 | **/\r | |
16 | \r | |
17 | //\r | |
18 | // Statements that include other files\r | |
19 | //\r | |
20 | \r | |
21 | #include "AcpiPlatform.h"\r | |
22 | \r | |
23 | VOID\r | |
24 | InitMadtConfigData (MADT_CONFIG_DATA *mConfigData)\r | |
25 | {\r | |
26 | mConfigData->MadtInterruptSetting[0].Enable = PcdGet8 (PcdInterruptOverrideSettingTable0Enable);\r | |
27 | mConfigData->MadtInterruptSetting[0].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable0SourceIrq);\r | |
28 | mConfigData->MadtInterruptSetting[0].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable0Polarity);\r | |
29 | mConfigData->MadtInterruptSetting[0].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable0TrigerMode);\r | |
30 | mConfigData->MadtInterruptSetting[0].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable0GlobalIrq);\r | |
31 | \r | |
32 | mConfigData->MadtInterruptSetting[1].Enable = PcdGet8 (PcdInterruptOverrideSettingTable1Enable);\r | |
33 | mConfigData->MadtInterruptSetting[1].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable1SourceIrq);\r | |
34 | mConfigData->MadtInterruptSetting[1].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable1Polarity);\r | |
35 | mConfigData->MadtInterruptSetting[1].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable1TrigerMode);\r | |
36 | mConfigData->MadtInterruptSetting[1].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable1GlobalIrq);\r | |
37 | \r | |
38 | mConfigData->MadtInterruptSetting[2].Enable = PcdGet8 (PcdInterruptOverrideSettingTable2Enable);\r | |
39 | mConfigData->MadtInterruptSetting[2].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable2SourceIrq);\r | |
40 | mConfigData->MadtInterruptSetting[2].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable2Polarity);\r | |
41 | mConfigData->MadtInterruptSetting[2].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable2TrigerMode);\r | |
42 | mConfigData->MadtInterruptSetting[2].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable2GlobalIrq);\r | |
43 | \r | |
44 | mConfigData->MadtInterruptSetting[3].Enable = PcdGet8 (PcdInterruptOverrideSettingTable3Enable);\r | |
45 | mConfigData->MadtInterruptSetting[3].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable3SourceIrq);\r | |
46 | mConfigData->MadtInterruptSetting[3].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable3Polarity);\r | |
47 | mConfigData->MadtInterruptSetting[3].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable3TrigerMode);\r | |
48 | mConfigData->MadtInterruptSetting[3].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable3GlobalIrq);\r | |
49 | \r | |
50 | mConfigData->MadtInterruptSetting[4].Enable = PcdGet8 (PcdInterruptOverrideSettingTable4Enable);\r | |
51 | mConfigData->MadtInterruptSetting[4].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable4SourceIrq);\r | |
52 | mConfigData->MadtInterruptSetting[4].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable4Polarity);\r | |
53 | mConfigData->MadtInterruptSetting[4].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable4TrigerMode);\r | |
54 | mConfigData->MadtInterruptSetting[4].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable4GlobalIrq);\r | |
55 | \r | |
56 | mConfigData->MadtInterruptSetting[5].Enable = PcdGet8 (PcdInterruptOverrideSettingTable5Enable);\r | |
57 | mConfigData->MadtInterruptSetting[5].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable5SourceIrq);\r | |
58 | mConfigData->MadtInterruptSetting[5].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable5Polarity);\r | |
59 | mConfigData->MadtInterruptSetting[5].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable5TrigerMode);\r | |
60 | mConfigData->MadtInterruptSetting[5].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable5GlobalIrq);\r | |
61 | \r | |
62 | mConfigData->MadtInterruptSetting[6].Enable = PcdGet8 (PcdInterruptOverrideSettingTable6Enable);\r | |
63 | mConfigData->MadtInterruptSetting[6].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable6SourceIrq);\r | |
64 | mConfigData->MadtInterruptSetting[6].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable6Polarity);\r | |
65 | mConfigData->MadtInterruptSetting[6].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable6TrigerMode);\r | |
66 | mConfigData->MadtInterruptSetting[6].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable6GlobalIrq);\r | |
67 | \r | |
68 | mConfigData->MadtInterruptSetting[7].Enable = PcdGet8 (PcdInterruptOverrideSettingTable7Enable);\r | |
69 | mConfigData->MadtInterruptSetting[7].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable7SourceIrq);\r | |
70 | mConfigData->MadtInterruptSetting[7].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable7Polarity);\r | |
71 | mConfigData->MadtInterruptSetting[7].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable7TrigerMode);\r | |
72 | mConfigData->MadtInterruptSetting[7].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable7GlobalIrq);\r | |
73 | \r | |
74 | mConfigData->MadtInterruptSetting[8].Enable = PcdGet8 (PcdInterruptOverrideSettingTable8Enable);\r | |
75 | mConfigData->MadtInterruptSetting[8].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable8SourceIrq);\r | |
76 | mConfigData->MadtInterruptSetting[8].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable8Polarity);\r | |
77 | mConfigData->MadtInterruptSetting[8].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable8TrigerMode);\r | |
78 | mConfigData->MadtInterruptSetting[8].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable8GlobalIrq);\r | |
79 | \r | |
80 | mConfigData->MadtInterruptSetting[9].Enable = PcdGet8 (PcdInterruptOverrideSettingTable9Enable);\r | |
81 | mConfigData->MadtInterruptSetting[9].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable9SourceIrq);\r | |
82 | mConfigData->MadtInterruptSetting[9].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable9Polarity);\r | |
83 | mConfigData->MadtInterruptSetting[9].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable9TrigerMode);\r | |
84 | mConfigData->MadtInterruptSetting[9].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable9GlobalIrq);\r | |
85 | \r | |
86 | mConfigData->MadtInterruptSetting[10].Enable = PcdGet8 (PcdInterruptOverrideSettingTable10Enable);\r | |
87 | mConfigData->MadtInterruptSetting[10].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable10SourceIrq);\r | |
88 | mConfigData->MadtInterruptSetting[10].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable10Polarity);\r | |
89 | mConfigData->MadtInterruptSetting[10].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable10TrigerMode);\r | |
90 | mConfigData->MadtInterruptSetting[10].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable10GlobalIrq);\r | |
91 | \r | |
92 | mConfigData->MadtInterruptSetting[11].Enable = PcdGet8 (PcdInterruptOverrideSettingTable11Enable);\r | |
93 | mConfigData->MadtInterruptSetting[11].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable11SourceIrq);\r | |
94 | mConfigData->MadtInterruptSetting[11].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable11Polarity);\r | |
95 | mConfigData->MadtInterruptSetting[11].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable11TrigerMode);\r | |
96 | mConfigData->MadtInterruptSetting[11].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable11GlobalIrq);\r | |
97 | \r | |
98 | mConfigData->MadtInterruptSetting[12].Enable = PcdGet8 (PcdInterruptOverrideSettingTable12Enable);\r | |
99 | mConfigData->MadtInterruptSetting[12].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable12SourceIrq);\r | |
100 | mConfigData->MadtInterruptSetting[12].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable12Polarity);\r | |
101 | mConfigData->MadtInterruptSetting[12].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable12TrigerMode);\r | |
102 | mConfigData->MadtInterruptSetting[12].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable12GlobalIrq);\r | |
103 | \r | |
104 | mConfigData->MadtInterruptSetting[13].Enable = PcdGet8 (PcdInterruptOverrideSettingTable13Enable);\r | |
105 | mConfigData->MadtInterruptSetting[13].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable13SourceIrq);\r | |
106 | mConfigData->MadtInterruptSetting[13].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable13Polarity);\r | |
107 | mConfigData->MadtInterruptSetting[13].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable13TrigerMode);\r | |
108 | mConfigData->MadtInterruptSetting[13].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable13GlobalIrq);\r | |
109 | \r | |
110 | mConfigData->MadtInterruptSetting[14].Enable = PcdGet8 (PcdInterruptOverrideSettingTable14Enable);\r | |
111 | mConfigData->MadtInterruptSetting[14].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable14SourceIrq);\r | |
112 | mConfigData->MadtInterruptSetting[14].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable14Polarity);\r | |
113 | mConfigData->MadtInterruptSetting[14].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable14TrigerMode);\r | |
114 | mConfigData->MadtInterruptSetting[14].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable14GlobalIrq);\r | |
115 | \r | |
116 | mConfigData->MadtInterruptSetting[15].Enable = PcdGet8 (PcdInterruptOverrideSettingTable15Enable);\r | |
117 | mConfigData->MadtInterruptSetting[15].SourceIrq = PcdGet8 (PcdInterruptOverrideSettingTable15SourceIrq);\r | |
118 | mConfigData->MadtInterruptSetting[15].Polarity = PcdGet8 (PcdInterruptOverrideSettingTable15Polarity);\r | |
119 | mConfigData->MadtInterruptSetting[15].TrigerMode = PcdGet8 (PcdInterruptOverrideSettingTable15TrigerMode);\r | |
120 | mConfigData->MadtInterruptSetting[15].GlobalIrq = PcdGet32 (PcdInterruptOverrideSettingTable15GlobalIrq);\r | |
121 | \r | |
122 | mConfigData->MadtIoApicSetting.IoApicAddress = (UINT32)PcdGet64(PcdIoApicBaseAddress);\r | |
123 | mConfigData->MadtIoApicSetting.GlobalInterruptBase = PcdGet32 (PcdIoApicSettingGlobalInterruptBase);\r | |
124 | mConfigData->MadtIoApicSetting.IoApicId = PcdGet8 (PcdIoApicSettingIoApicId);\r | |
125 | mConfigData->MadtIoApicSetting.NmiEnable = PcdGet8 (PcdIoApicSettingNmiEnable);\r | |
126 | mConfigData->MadtIoApicSetting.NmiSource = PcdGet8 (PcdIoApicSettingNmiSource);\r | |
127 | mConfigData->MadtIoApicSetting.Polarity = PcdGet8 (PcdIoApicSettingPolarity);\r | |
128 | mConfigData->MadtIoApicSetting.TrigerMode = PcdGet8 (PcdIoApicSettingTrigerMode);\r | |
129 | \r | |
130 | mConfigData->MadtLocalApicSetting.NmiEnabelApicIdMask = PcdGet8 (PcdLocalApicSettingNmiEnabelApicIdMask);\r | |
131 | mConfigData->MadtLocalApicSetting.AddressOverrideEnable = PcdGet8 (PcdLocalApicSettingAddressOverrideEnable);\r | |
132 | mConfigData->MadtLocalApicSetting.Polarity = PcdGet8 (PcdLocalApicSettingPolarity);\r | |
133 | mConfigData->MadtLocalApicSetting.TrigerMode = PcdGet8 (PcdLocalApicSettingTrigerMode);\r | |
134 | mConfigData->MadtLocalApicSetting.LocalApicLint = PcdGet8 (PcdLocalApicSettingLocalApicLint);\r | |
135 | mConfigData->MadtLocalApicSetting.LocalApicAddressOverride = PcdGet64 (PcdLocalApicAddressOverride);\r | |
136 | mConfigData->MadtLocalApicSetting.LocalApicAddress = PcdGet32 (PcdCpuLocalApicBaseAddress);\r | |
137 | }\r | |
138 | UINT32\r | |
139 | GetAcutalMadtTableSize (\r | |
140 | IN MADT_CONFIG_DATA * MadtConfigData,\r | |
141 | IN INTN NumberOfCPUs\r | |
142 | )\r | |
143 | {\r | |
144 | UINT32 MadtSize;\r | |
145 | UINT8 Index;\r | |
146 | MadtSize = (UINT32)(sizeof (EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER) +\r | |
147 | sizeof (EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE) * NumberOfCPUs +\r | |
148 | sizeof (EFI_ACPI_2_0_IO_APIC_STRUCTURE) +\r | |
149 | sizeof (EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE) * (MadtConfigData->MadtLocalApicSetting.AddressOverrideEnable != 0?1:0)\r | |
150 | );\r | |
151 | for (Index = 0; Index < EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT_MAX; Index ++ ) {\r | |
152 | if (MadtConfigData->MadtInterruptSetting[Index].Enable != 0) {\r | |
153 | MadtSize += sizeof (EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE);\r | |
154 | }\r | |
155 | }\r | |
156 | for (Index = 0; Index < NumberOfCPUs; Index ++ ) {\r | |
157 | if (0 != (MadtConfigData->MadtLocalApicSetting.NmiEnabelApicIdMask & (1 << Index))) {\r | |
158 | MadtSize += sizeof (EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE);\r | |
159 | }\r | |
160 | }\r | |
161 | if (0 != MadtConfigData->MadtIoApicSetting.NmiEnable) {\r | |
162 | MadtSize += sizeof (EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE);\r | |
163 | }\r | |
164 | return MadtSize;\r | |
165 | }\r | |
166 | \r | |
167 | //\r | |
168 | // Init Multiple APIC Description Table\r | |
169 | //\r | |
170 | EFI_STATUS\r | |
171 | MadtTableInitialize (\r | |
172 | OUT EFI_ACPI_COMMON_HEADER **MadtTable,\r | |
173 | OUT UINTN *Size\r | |
174 | )\r | |
175 | {\r | |
176 | EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt;\r | |
177 | EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *ProcLocalApic;\r | |
178 | EFI_ACPI_2_0_IO_APIC_STRUCTURE *IoApic;\r | |
179 | EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *InterruptSourceOverride;\r | |
180 | EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE *IoApicNmiSource;\r | |
181 | EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE *LocalApicNmiSource;\r | |
182 | EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE *LocalApicAddressOverride;\r | |
183 | \r | |
184 | EFI_MP_SERVICES_PROTOCOL *MpService;\r | |
185 | UINTN NumberOfCPUs;\r | |
186 | UINTN NumberOfEnabledCPUs;\r | |
187 | MADT_CONFIG_DATA MadtConfigData;\r | |
188 | \r | |
189 | UINT32 MadtSize;\r | |
190 | UINTN Index;\r | |
191 | EFI_STATUS Status;\r | |
192 | \r | |
193 | \r | |
194 | ASSERT (NULL != MadtTable);\r | |
195 | ASSERT (NULL != Size);\r | |
196 | //\r | |
197 | // Init Madt table data\r | |
198 | //\r | |
199 | InitMadtConfigData (&MadtConfigData);\r | |
200 | //\r | |
201 | // Find the MP Protocol. This is an MP platform, so MP protocol must be\r | |
202 | // there.\r | |
203 | //\r | |
204 | Status = gBS->LocateProtocol (\r | |
205 | &gEfiMpServiceProtocolGuid,\r | |
206 | NULL,\r | |
207 | (VOID **)&MpService\r | |
208 | );\r | |
209 | ASSERT_EFI_ERROR (Status);\r | |
210 | //\r | |
211 | // Determine the number of processors\r | |
212 | //\r | |
213 | MpService->GetNumberOfProcessors (\r | |
214 | MpService,\r | |
215 | &NumberOfCPUs,\r | |
216 | &NumberOfEnabledCPUs\r | |
217 | );\r | |
218 | //ASSERT (NumberOfCPUs <= 2 && NumberOfCPUs > 0);\r | |
219 | MadtSize = GetAcutalMadtTableSize (&MadtConfigData, NumberOfCPUs);\r | |
220 | Madt = (EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *)AllocateZeroPool (MadtSize);\r | |
74e00be5 | 221 | ASSERT (Madt != NULL);\r |
b303605e MK |
222 | //\r |
223 | // Initialize MADT Header information\r | |
224 | //\r | |
225 | Madt->Header.Signature = EFI_ACPI_2_0_MULTIPLE_SAPIC_DESCRIPTION_TABLE_SIGNATURE;\r | |
226 | Madt->Header.Length = MadtSize;\r | |
227 | Madt->Header.Revision = EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION;\r | |
228 | Madt->Header.OemTableId = EFI_ACPI_OEM_TABLE_ID;\r | |
229 | Madt->Header.OemRevision = EFI_ACPI_OEM_MADT_REVISION;\r | |
230 | Madt->Header.CreatorId = EFI_ACPI_CREATOR_ID;\r | |
231 | Madt->LocalApicAddress = MadtConfigData.MadtLocalApicSetting.LocalApicAddress;\r | |
232 | Madt->Flags = EFI_ACPI_2_0_MULTIPLE_APIC_FLAGS;\r | |
233 | CopyMem (Madt->Header.OemId, EFI_ACPI_OEM_ID, 6);\r | |
234 | \r | |
235 | ProcLocalApic = (EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *) (Madt + 1);\r | |
236 | //\r | |
237 | // Initialization of Processor's local APICs\r | |
238 | //\r | |
239 | for (Index = 0;Index < NumberOfCPUs; Index++) {\r | |
240 | ProcLocalApic[Index].Type = EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC;\r | |
241 | ProcLocalApic[Index].Length = sizeof (EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE);\r | |
242 | ProcLocalApic[Index].AcpiProcessorId = (UINT8)(Index + 1);\r | |
243 | ProcLocalApic[Index].ApicId = 0xff;\r | |
244 | ProcLocalApic[Index].Flags = 0;\r | |
245 | }\r | |
246 | //\r | |
247 | // Initialization of IO APIC.\r | |
248 | // Note: Here assumes that there must be one and only one IO APIC in platform.\r | |
249 | //\r | |
250 | IoApic = (EFI_ACPI_2_0_IO_APIC_STRUCTURE *) (&ProcLocalApic[Index]);\r | |
251 | IoApic->Type = EFI_ACPI_2_0_IO_APIC;\r | |
252 | IoApic->Length = sizeof (EFI_ACPI_2_0_IO_APIC_STRUCTURE);\r | |
253 | IoApic->IoApicId = MadtConfigData.MadtIoApicSetting.IoApicId;\r | |
254 | IoApic->IoApicAddress = MadtConfigData.MadtIoApicSetting.IoApicAddress;\r | |
255 | IoApic->GlobalSystemInterruptBase = MadtConfigData.MadtIoApicSetting.GlobalInterruptBase;\r | |
256 | \r | |
257 | InterruptSourceOverride = (EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *) (IoApic + 1);\r | |
258 | for (Index = 0;Index < EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT_MAX; Index++ ){\r | |
259 | if (MadtConfigData.MadtInterruptSetting[Index].Enable) {\r | |
260 | InterruptSourceOverride->Type = EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE;\r | |
261 | InterruptSourceOverride->Length = sizeof (EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE);\r | |
262 | InterruptSourceOverride->Bus = 0;\r | |
263 | InterruptSourceOverride->Source = MadtConfigData.MadtInterruptSetting[Index].SourceIrq;\r | |
264 | InterruptSourceOverride->Flags = ((MadtConfigData.MadtInterruptSetting[Index].TrigerMode & 0x03) << 2) | (MadtConfigData.MadtInterruptSetting[Index].Polarity & 0x03);\r | |
265 | InterruptSourceOverride->GlobalSystemInterrupt = MadtConfigData.MadtInterruptSetting[Index].GlobalIrq;\r | |
266 | InterruptSourceOverride++;\r | |
267 | }\r | |
268 | }\r | |
269 | //\r | |
270 | // support NMI source configuration.\r | |
271 | //\r | |
272 | IoApicNmiSource = (EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE *) InterruptSourceOverride;\r | |
273 | if ((BOOLEAN) MadtConfigData.MadtIoApicSetting.NmiEnable) {\r | |
274 | IoApicNmiSource->Type = EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE;\r | |
275 | IoApicNmiSource->Length = sizeof (EFI_ACPI_2_0_NON_MASKABLE_INTERRUPT_SOURCE_STRUCTURE);\r | |
276 | IoApicNmiSource->Flags = ((MadtConfigData.MadtIoApicSetting.TrigerMode & 0x03) << 2) | (MadtConfigData.MadtIoApicSetting.Polarity & 0x03);\r | |
277 | IoApicNmiSource->GlobalSystemInterrupt = MadtConfigData.MadtIoApicSetting.NmiSource;\r | |
278 | IoApicNmiSource ++;\r | |
279 | }\r | |
280 | //\r | |
281 | // Assume each processor has same NMI interrupt source.\r | |
282 | //\r | |
283 | LocalApicNmiSource = (EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE *) IoApicNmiSource;\r | |
284 | for (Index = 0;Index < NumberOfCPUs; Index++) {\r | |
285 | if (0 != (MadtConfigData.MadtLocalApicSetting.NmiEnabelApicIdMask & (1 << Index))){\r | |
286 | LocalApicNmiSource->Type = EFI_ACPI_2_0_LOCAL_APIC_NMI;\r | |
287 | LocalApicNmiSource->Length = sizeof (EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE);\r | |
288 | LocalApicNmiSource->LocalApicLint = MadtConfigData.MadtLocalApicSetting.LocalApicLint;\r | |
289 | LocalApicNmiSource->Flags = ((MadtConfigData.MadtLocalApicSetting.TrigerMode & 0x03) << 2) | (MadtConfigData.MadtLocalApicSetting.Polarity & 0x03);\r | |
290 | LocalApicNmiSource->AcpiProcessorId = (UINT8)(Index + 1);\r | |
291 | LocalApicNmiSource++;\r | |
292 | }\r | |
293 | }\r | |
294 | \r | |
295 | LocalApicAddressOverride = (EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE *) LocalApicNmiSource;\r | |
296 | if ((BOOLEAN) MadtConfigData.MadtLocalApicSetting.AddressOverrideEnable) {\r | |
297 | LocalApicAddressOverride->Type = EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE;\r | |
298 | LocalApicAddressOverride->Length = sizeof (EFI_ACPI_2_0_LOCAL_APIC_ADDRESS_OVERRIDE_STRUCTURE);\r | |
299 | LocalApicAddressOverride->LocalApicAddress = MadtConfigData.MadtLocalApicSetting.LocalApicAddressOverride;\r | |
300 | LocalApicAddressOverride++;\r | |
301 | }\r | |
302 | *Size = MadtSize;\r | |
303 | *MadtTable = (EFI_ACPI_COMMON_HEADER *) Madt;\r | |
304 | \r | |
305 | return EFI_SUCCESS;\r | |
306 | }\r |