• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/** @file
2  MADT Table
3
4  This file contains a structure definition for the ACPI 1.0 Multiple APIC
5  Description Table (MADT).
6
7  Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
8  This program and the accompanying materials are
9  licensed and made available under the terms and conditions of the BSD License
10  which accompanies this distribution.  The full text of the license may be found at
11  http://opensource.org/licenses/bsd-license.php
12
13  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15
16**/
17
18#include <IndustryStandard/Acpi.h>
19#include <Platform.h>
20
21//
22// Local APIC address
23//
24#define EFI_ACPI_LOCAL_APIC_ADDRESS 0xFEE00000 // TBD
25
26//
27// Multiple APIC Flags are defined in AcpiX.0.h
28//
29#define EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS (EFI_ACPI_1_0_PCAT_COMPAT)
30
31//
32// Define the number of each table type.
33// This is where the table layout is modified.
34//
35#define EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT           1
36#define EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT      2
37#define EFI_ACPI_IO_APIC_COUNT                        1
38
39//
40// Ensure proper structure formats
41//
42#pragma pack (1)
43
44//
45// ACPI 1.0 MADT structure
46//
47typedef struct {
48  EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER   Header;
49
50#if EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT > 0
51  EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE           LocalApic[EFI_ACPI_PROCESSOR_LOCAL_APIC_COUNT];
52#endif
53
54#if EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT > 0
55  EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE      Iso[EFI_ACPI_INTERRUPT_SOURCE_OVERRIDE_COUNT];
56#endif
57
58#if EFI_ACPI_IO_APIC_COUNT > 0
59  EFI_ACPI_1_0_IO_APIC_STRUCTURE                        IoApic[EFI_ACPI_IO_APIC_COUNT];
60#endif
61
62} EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE;
63
64#pragma pack ()
65
66//
67// Multiple APIC Description Table
68//
69EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = {
70  {
71    {
72      EFI_ACPI_1_0_APIC_SIGNATURE,
73      sizeof (EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE),
74      EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION,
75      0x00,                                                     // Checksum will be updated at runtime
76      {EFI_ACPI_OEM_ID},
77      EFI_ACPI_OEM_TABLE_ID,
78      EFI_ACPI_OEM_REVISION,
79      EFI_ACPI_CREATOR_ID,
80      EFI_ACPI_CREATOR_REVISION
81    },
82
83    //
84    // MADT specific fields
85    //
86    EFI_ACPI_LOCAL_APIC_ADDRESS,
87    EFI_ACPI_1_0_MULTIPLE_APIC_FLAGS,
88  },
89
90  //
91  // Processor Local APIC Structure
92  //
93  {
94    {
95      EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC,                        // Type
96      sizeof (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE),     // Length
97      0x00,                                                     // Processor ID
98      0x00,                                                     // Local APIC ID
99      0x00000001                                                // Flags - Enabled by default
100    }
101  },
102
103  //
104  // Interrupt Source Override Structure
105  //
106
107  {
108    {
109      //
110      // IRQ0=>IRQ2 Interrupt Source Override Structure
111      //
112      EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE,                   // Type
113      sizeof (EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length
114      0x00,                                                     // Bus - ISA
115      0x00,                                                     // Source - IRQ0
116      0x00000002,                                               // Global System Interrupt - IRQ2
117      0x0000                                                    // Flags - Conforms to specifications of the bus
118    },
119
120    {
121      //
122      // ISO (SCI Active High) Interrupt Source Override Structure
123      //
124      EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE,                   // Type
125      sizeof (EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE),// Length
126      0x00,                                                     // Bus - ISA
127      0x09,                                                     // Source - IRQ0
128      0x00000009,                                               // Global System Interrupt - IRQ2
129      0x000D                                                    // Flags - Level-tiggered, Active High
130    }
131  },
132
133  //
134  // IO APIC Structure
135  //
136  {
137    {
138      EFI_ACPI_1_0_IO_APIC,                                     // Type
139      sizeof (EFI_ACPI_1_0_IO_APIC_STRUCTURE),                  // Length
140      0x02,                                                     // IO APIC ID
141      EFI_ACPI_RESERVED_BYTE,                                   // Reserved
142      0xFEC00000,                                               // IO APIC Address (physical)
143      0x00000000                                                // Global System Interrupt Base
144    }
145  },
146};
147
148
149VOID*
150ReferenceAcpiTable (
151  VOID
152  )
153{
154  //
155  // Reference the table being generated to prevent the optimizer from removing the
156  // data structure from the exeutable
157  //
158  return (VOID*)&Madt;
159}
160