| /*++ | |
| Copyright (c) 2004 - 2015, 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 that 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. | |
| Module Name: | |
| Madt3.0.c | |
| Abstract: | |
| This file contains a structure definition for the ACPI 2.0 Multiple APIC | |
| Description Table (MADT). Any changes to the MADT table require updating the | |
| respective structure count in Madt.h and then adding the structure to the | |
| MADT defined in this file. The table layout is defined in Madt.h and the | |
| table contents are defined in Acpi3_0.h and Madt.h. | |
| --*/ | |
| // | |
| // Statements that include other files | |
| // | |
| #include "Madt.h" | |
| #include <IndustryStandard/Acpi50.h> | |
| // | |
| // Multiple APIC Description Table | |
| // | |
| EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = { | |
| EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, // **Signatures are the same 1.0-3.0 because it says "APIC". | |
| sizeof (EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE), // **Length | |
| EFI_ACPI_5_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, | |
| // | |
| // EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, // **Table Revision must be 2.0 for ACPI 3.0 | |
| // Checksum will be updated at runtime | |
| // | |
| 0x00, // **Check sum | |
| // | |
| // It is expected that these values will be programmed at runtime | |
| // | |
| ' ', // OEMID | |
| ' ', // Creative way to | |
| ' ', // make six bytes | |
| ' ', // of space in | |
| ' ', // a table for | |
| ' ', // **OEMID | |
| 0, // **OEM Table ID | |
| EFI_ACPI_OEM_MADT_REVISION, // **OEM Revision | |
| 0, // **Creator ID | |
| 0, // **Creator Revision | |
| // | |
| // MADT specific fields | |
| // | |
| LOCAL_APIC_ADDRESS, // **Local APIC Address | |
| EFI_ACPI_4_0_MULTIPLE_APIC_FLAGS, // **Flags | |
| // | |
| // Processor Local APIC Structure | |
| // Correct processor order, Primary threads first then Hyper threads | |
| // And correct APIC-ids | |
| // This text below is included as a reference until Thurley is 100%: | |
| // According to EDS the Local APIC ID is determined based of a bit structure | |
| // Bit 24: Core ID Bit 25: Core Pair ID Bit 26-27: Reserved Bit 28-30: Socket ID Bit 31: Reserved | |
| // 4 Sockets and 4 Cores per Socket. | |
| // So possible LAPIC IDs 00, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33 | |
| // Static Entries 00, 10, 20, 30, 01, 11, 21, 31, 02, 12, 22, 32, 03, 13, 23, 33 | |
| // BSP needs to be first entry in table. Check before boot. If BSP non zero need to rotate the entries. | |
| // Suppore BSP is LAPIC ID xy. Rotate the table by using formula [x + (y * 4)] | |
| // So if BSP LAPIC ID is 21 then table rotated 6 times. | |
| // End of Reference Text. | |
| // Thurley is supposed to be 2 sockets, 4 cores, and hyperthreading available per each core. | |
| // 2 (sockets) x 4 (cores) = 8 (processors non-HT), 8 (processors non-HT) x 2 (HT/proc) = 16 (HT procs) | |
| // Rhyme & reason of the ordering below. This is a best guess ordering for now, | |
| // Thurley EPS may give better info on LAPIC numbers. | |
| // Ordering was established to help dissipate heat across two sockets evenly. | |
| // Since logical processor number only has to be unique, I followed | |
| // a similar approach to high end servers and have the first digit of the LAPIC | |
| // id the socket number. | |
| // | |
| EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type 0x00 | |
| sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length | |
| 0x01, // Processor ID | |
| 0x00, // Local APIC ID | |
| 0x00000001, // Flags - Disabled (until initialized by platform driver) | |
| EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type | |
| sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length | |
| 0x02, // Processor ID | |
| 0x04, // Local APIC ID | |
| 0x00000001, // Flags - Disabled (until initialized by platform driver) | |
| EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type | |
| sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length | |
| 0x03, // Processor ID | |
| 0x02, // Local APIC ID | |
| 0x00000001, // Flags - Disabled (until initialized by platform driver) | |
| EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type | |
| sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length | |
| 0x04, // Processor ID | |
| 0x06, // Local APIC ID | |
| 0x00000001, // Flags - Disabled (until initialized by platform driver) | |
| // | |
| // *************** IO APIC Structure ****************** | |
| // | |
| // | |
| // | |
| // ************************** I/O APIC ************** | |
| // | |
| EFI_ACPI_3_0_IO_APIC, // Type 0x01 | |
| sizeof (EFI_ACPI_3_0_IO_APIC_STRUCTURE), // Length | |
| ICH_IOAPIC_ID, // IO APIC ID | |
| EFI_ACPI_RESERVED_BYTE, // Reserved EFI_ACPI_RESERVED_BYTE | |
| IO_APIC_ADDRESS, // IO APIC Address (physical) 0xFEC00000 | |
| 0x18 * 0, // Global System Interrupt Base | |
| // | |
| // Interrupt Source Override Structure: Sample | |
| // | |
| // EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02 | |
| // sizeof (EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length | |
| // 0x00, // Bus | |
| // 0x00, // Source | |
| // 0x00000000, // Global System Interrupt | |
| // 0x0000, // Flags | |
| // | |
| // IRQ0=>IRQ2 Interrupt Source Override Structure | |
| // | |
| EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02 | |
| sizeof (EFI_ACPI_3_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_3_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02 | |
| sizeof (EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE), // Length | |
| 0x00, // Bus - ISA | |
| 0x09, // Source - IRQ0 | |
| 0x00000009, // Global System Interrupt - IRQ2 | |
| 0x000D, // Flags - Level-tiggered, Active High | |
| EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type | |
| sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length | |
| 0x01, // ACPI Processor ID | |
| 0x000D, // Flags - Level-tiggered, Active High | |
| 0x01, // Local APIC LINT# | |
| EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type | |
| sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length | |
| 0x02, // ACPI Processor ID | |
| 0x000D, // Flags - Level-tiggered, Active High | |
| 0x01, // Local APIC LINT# | |
| EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type | |
| sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length | |
| 0x03, // ACPI Processor ID | |
| 0x000D, // Flags - Level-tiggered, Active High | |
| 0x01, // Local APIC LINT# | |
| EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type | |
| sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length | |
| 0x04, // ACPI Processor ID | |
| 0x000D, // Flags - Level-tiggered, Active High | |
| 0x01, // Local APIC LINT# | |
| }; | |
| VOID* | |
| ReferenceAcpiTable ( | |
| VOID | |
| ) | |
| { | |
| // | |
| // Reference the table being generated to prevent the optimizer from | |
| // removing the data structure from the executable | |
| // | |
| return (VOID*)&Madt; | |
| } |