Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame] | 1 | /*++
|
| 2 |
|
| 3 | Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
|
| 4 |
|
| 5 | This program and the accompanying materials are licensed and made available under
|
| 6 | the terms and conditions of the BSD License that accompanies this distribution.
|
| 7 | The full text of the license may be found at
|
| 8 | http://opensource.org/licenses/bsd-license.php.
|
| 9 |
|
| 10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 12 |
|
| 13 |
|
| 14 |
|
| 15 | Module Name:
|
| 16 |
|
| 17 | Madt3.0.c
|
| 18 |
|
| 19 | Abstract:
|
| 20 |
|
| 21 | This file contains a structure definition for the ACPI 2.0 Multiple APIC
|
| 22 | Description Table (MADT). Any changes to the MADT table require updating the
|
| 23 | respective structure count in Madt.h and then adding the structure to the
|
| 24 | MADT defined in this file. The table layout is defined in Madt.h and the
|
| 25 | table contents are defined in Acpi3_0.h and Madt.h.
|
| 26 |
|
| 27 | --*/
|
| 28 |
|
| 29 | //
|
| 30 | // Statements that include other files
|
| 31 | //
|
| 32 | #include "Madt.h"
|
| 33 | #include <IndustryStandard/Acpi50.h>
|
| 34 |
|
| 35 | //
|
| 36 | // Multiple APIC Description Table
|
| 37 | //
|
| 38 | EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = {
|
| 39 | EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE, // **Signatures are the same 1.0-3.0 because it says "APIC".
|
| 40 | sizeof (EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE), // **Length
|
| 41 | EFI_ACPI_5_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
|
| 42 | //
|
| 43 | // EFI_ACPI_3_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION, // **Table Revision must be 2.0 for ACPI 3.0
|
| 44 | // Checksum will be updated at runtime
|
| 45 | //
|
| 46 | 0x00, // **Check sum
|
| 47 | //
|
| 48 | // It is expected that these values will be programmed at runtime
|
| 49 | //
|
| 50 | ' ', // OEMID
|
| 51 | ' ', // Creative way to
|
| 52 | ' ', // make six bytes
|
| 53 | ' ', // of space in
|
| 54 | ' ', // a table for
|
| 55 | ' ', // **OEMID
|
| 56 | 0, // **OEM Table ID
|
| 57 | EFI_ACPI_OEM_MADT_REVISION, // **OEM Revision
|
| 58 | 0, // **Creator ID
|
| 59 | 0, // **Creator Revision
|
| 60 | //
|
| 61 | // MADT specific fields
|
| 62 | //
|
| 63 | LOCAL_APIC_ADDRESS, // **Local APIC Address
|
| 64 | EFI_ACPI_4_0_MULTIPLE_APIC_FLAGS, // **Flags
|
| 65 | //
|
| 66 | // Processor Local APIC Structure
|
| 67 | // Correct processor order, Primary threads first then Hyper threads
|
| 68 | // And correct APIC-ids
|
| 69 | // This text below is included as a reference until Thurley is 100%:
|
| 70 | // According to EDS the Local APIC ID is determined based of a bit structure
|
| 71 | // Bit 24: Core ID Bit 25: Core Pair ID Bit 26-27: Reserved Bit 28-30: Socket ID Bit 31: Reserved
|
| 72 | // 4 Sockets and 4 Cores per Socket.
|
| 73 | // So possible LAPIC IDs 00, 01, 02, 03, 10, 11, 12, 13, 20, 21, 22, 23, 30, 31, 32, 33
|
| 74 | // Static Entries 00, 10, 20, 30, 01, 11, 21, 31, 02, 12, 22, 32, 03, 13, 23, 33
|
| 75 | // BSP needs to be first entry in table. Check before boot. If BSP non zero need to rotate the entries.
|
| 76 | // Suppore BSP is LAPIC ID xy. Rotate the table by using formula [x + (y * 4)]
|
| 77 | // So if BSP LAPIC ID is 21 then table rotated 6 times.
|
| 78 | // End of Reference Text.
|
| 79 | // Thurley is supposed to be 2 sockets, 4 cores, and hyperthreading available per each core.
|
| 80 | // 2 (sockets) x 4 (cores) = 8 (processors non-HT), 8 (processors non-HT) x 2 (HT/proc) = 16 (HT procs)
|
| 81 | // Rhyme & reason of the ordering below. This is a best guess ordering for now,
|
| 82 | // Thurley EPS may give better info on LAPIC numbers.
|
| 83 | // Ordering was established to help dissipate heat across two sockets evenly.
|
| 84 | // Since logical processor number only has to be unique, I followed
|
| 85 | // a similar approach to high end servers and have the first digit of the LAPIC
|
| 86 | // id the socket number.
|
| 87 | //
|
| 88 | EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type 0x00
|
| 89 | sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length
|
| 90 | 0x01, // Processor ID
|
| 91 | 0x00, // Local APIC ID
|
| 92 | 0x00000001, // Flags - Disabled (until initialized by platform driver)
|
| 93 | EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type
|
| 94 | sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length
|
| 95 | 0x02, // Processor ID
|
| 96 | 0x02, // Local APIC ID //Todo: Temp change APIC ID order for fixing VLV X0 not enable 2 CPU in Windows.
|
| 97 | 0x00000001, // Flags - Disabled (until initialized by platform driver)
|
| 98 | EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type
|
| 99 | sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length
|
| 100 | 0x03, // Processor ID
|
| 101 | 0x04, // Local APIC ID
|
| 102 | 0x00000001, // Flags - Disabled (until initialized by platform driver)
|
| 103 | EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC, // Type
|
| 104 | sizeof (EFI_ACPI_3_0_PROCESSOR_LOCAL_APIC_STRUCTURE), // Length
|
| 105 | 0x04, // Processor ID
|
| 106 | 0x06, // Local APIC ID
|
| 107 | 0x00000001, // Flags - Disabled (until initialized by platform driver)
|
| 108 | //
|
| 109 | // *************** IO APIC Structure ******************
|
| 110 | //
|
| 111 | //
|
| 112 | //
|
| 113 | // ************************** I/O APIC **************
|
| 114 | //
|
| 115 | EFI_ACPI_3_0_IO_APIC, // Type 0x01
|
| 116 | sizeof (EFI_ACPI_3_0_IO_APIC_STRUCTURE), // Length
|
| 117 | ICH_IOAPIC_ID, // IO APIC ID
|
| 118 | EFI_ACPI_RESERVED_BYTE, // Reserved EFI_ACPI_RESERVED_BYTE
|
| 119 | IO_APIC_ADDRESS, // IO APIC Address (physical) 0xFEC00000
|
| 120 | 0x18 * 0, // Global System Interrupt Base
|
| 121 |
|
| 122 | //
|
| 123 | // Interrupt Source Override Structure: Sample
|
| 124 | //
|
| 125 | // EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02
|
| 126 | // sizeof (EFI_ACPI_2_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length
|
| 127 | // 0x00, // Bus
|
| 128 | // 0x00, // Source
|
| 129 | // 0x00000000, // Global System Interrupt
|
| 130 | // 0x0000, // Flags
|
| 131 | //
|
| 132 | // IRQ0=>IRQ2 Interrupt Source Override Structure
|
| 133 | //
|
| 134 | EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02
|
| 135 | sizeof (EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE), // Length
|
| 136 | 0x00, // Bus - ISA
|
| 137 | 0x00, // Source - IRQ0
|
| 138 | 0x00000002, // Global System Interrupt - IRQ2
|
| 139 | 0x0000, // Flags - Conforms to specifications of the bus
|
| 140 | //
|
| 141 | // ISO (SCI Active High) Interrupt Source Override Structure
|
| 142 | //
|
| 143 | EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE, // Type 0x02
|
| 144 | sizeof (EFI_ACPI_3_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE), // Length
|
| 145 | 0x00, // Bus - ISA
|
| 146 | 0x09, // Source - IRQ0
|
| 147 | 0x00000009, // Global System Interrupt - IRQ2
|
| 148 | 0x000D, // Flags - Level-tiggered, Active High
|
| 149 |
|
| 150 |
|
| 151 |
|
| 152 | EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type
|
| 153 | sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length
|
| 154 | 0x01, // ACPI Processor ID
|
| 155 | 0x000D, // Flags - Level-tiggered, Active High
|
| 156 | 0x01, // Local APIC LINT#
|
| 157 | EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type
|
| 158 | sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length
|
| 159 | 0x02, // ACPI Processor ID
|
| 160 | 0x000D, // Flags - Level-tiggered, Active High
|
| 161 | 0x01, // Local APIC LINT#
|
| 162 | EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type
|
| 163 | sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length
|
| 164 | 0x03, // ACPI Processor ID
|
| 165 | 0x000D, // Flags - Level-tiggered, Active High
|
| 166 | 0x01, // Local APIC LINT#
|
| 167 | EFI_ACPI_3_0_LOCAL_APIC_NMI, // Type
|
| 168 | sizeof (EFI_ACPI_3_0_LOCAL_APIC_NMI_STRUCTURE), // Length
|
| 169 | 0x04, // ACPI Processor ID
|
| 170 | 0x000D, // Flags - Level-tiggered, Active High
|
| 171 | 0x01, // Local APIC LINT#
|
| 172 | };
|
| 173 |
|
| 174 | VOID*
|
| 175 | ReferenceAcpiTable (
|
| 176 | VOID
|
| 177 | )
|
| 178 | {
|
| 179 | //
|
| 180 | // Reference the table being generated to prevent the optimizer from
|
| 181 | // removing the data structure from the executable
|
| 182 | //
|
| 183 | return (VOID*)&Madt;
|
| 184 | }
|