1 /*++
2 
3 Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   LegacyBiosMpTable.h
15 
16 Abstract:
17   Defives data structures per Multi Processor Specification Ver 1.4.
18 
19 --*/
20 
21 #ifndef LEGACY_BIOS_MPTABLE_H_
22 #define LEGACY_BIOS_MPTABLE_H_
23 
24 #include "Tiano.h"
25 
26 #define EFI_LEGACY_MP_TABLE_REV_1_4 0x04
27 
28 //
29 // Define MP table structures. All are packed.
30 //
31 #pragma pack(1)
32 
33 #define EFI_LEGACY_MP_TABLE_FLOATING_POINTER_SIGNATURE  EFI_SIGNATURE_32 ('_', 'M', 'P', '_')
34 typedef struct {
35   UINT32  Signature;
36   UINT32  PhysicalAddress;
37   UINT8   Length;
38   UINT8   SpecRev;
39   UINT8   Checksum;
40   UINT8   FeatureByte1;
41   struct {
42     UINT32  Reserved1 : 6;
43     UINT32  MutipleClk : 1;
44     UINT32  Imcr : 1;
45     UINT32  Reserved2 : 24;
46   } FeatureByte2_5;
47 } EFI_LEGACY_MP_TABLE_FLOATING_POINTER;
48 
49 #define EFI_LEGACY_MP_TABLE_HEADER_SIGNATURE  EFI_SIGNATURE_32 ('P', 'C', 'M', 'P')
50 typedef struct {
51   UINT32  Signature;
52   UINT16  BaseTableLength;
53   UINT8   SpecRev;
54   UINT8   Checksum;
55   CHAR8   OemId[8];
56   CHAR8   OemProductId[12];
57   UINT32  OemTablePointer;
58   UINT16  OemTableSize;
59   UINT16  EntryCount;
60   UINT32  LocalApicAddress;
61   UINT16  ExtendedTableLength;
62   UINT8   ExtendedChecksum;
63   UINT8   Reserved;
64 } EFI_LEGACY_MP_TABLE_HEADER;
65 
66 typedef struct {
67   UINT8 EntryType;
68 } EFI_LEGACY_MP_TABLE_ENTRY_TYPE;
69 
70 //
71 // Entry Type 0: Processor.
72 //
73 #define EFI_LEGACY_MP_TABLE_ENTRY_TYPE_PROCESSOR  0x00
74 typedef struct {
75   UINT8 EntryType;
76   UINT8 Id;
77   UINT8 Ver;
78   struct {
79     UINT8 Enabled : 1;
80     UINT8 Bsp : 1;
81     UINT8 Reserved : 6;
82   } Flags;
83   struct {
84     UINT32  Stepping : 4;
85     UINT32  Model : 4;
86     UINT32  Family : 4;
87     UINT32  Reserved : 20;
88   } Signature;
89   struct {
90     UINT32  Fpu : 1;
91     UINT32  Reserved1 : 6;
92     UINT32  Mce : 1;
93     UINT32  Cx8 : 1;
94     UINT32  Apic : 1;
95     UINT32  Reserved2 : 22;
96   } Features;
97   UINT32  Reserved1;
98   UINT32  Reserved2;
99 } EFI_LEGACY_MP_TABLE_ENTRY_PROCESSOR;
100 
101 //
102 // Entry Type 1: Bus.
103 //
104 #define EFI_LEGACY_MP_TABLE_ENTRY_TYPE_BUS  0x01
105 typedef struct {
106   UINT8 EntryType;
107   UINT8 Id;
108   CHAR8 TypeString[6];
109 } EFI_LEGACY_MP_TABLE_ENTRY_BUS;
110 
111 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_CBUS   "CBUS  "  // Corollary CBus
112 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_CBUSII "CBUSII"  // Corollary CBUS II
113 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_EISA   "EISA  "  // Extended ISA
114 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_FUTURE "FUTURE"  // IEEE FutureBus
115 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_INTERN "INTERN"  // Internal bus
116 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_ISA    "ISA   "  // Industry Standard Architecture
117 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_MBI    "MBI   "  // Multibus I
118 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_MBII   "MBII  "  // Multibus II
119 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_MCA    "MCA   "  // Micro Channel Architecture
120 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_MPI    "MPI   "  // MPI
121 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_MPSA   "MPSA  "  // MPSA
122 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_NUBUS  "NUBUS "  // Apple Macintosh NuBus
123 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_PCI    "PCI   "  // Peripheral Component Interconnect
124 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_PCMCIA "PCMCIA"  // PC Memory Card International Assoc.
125 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_TC     "TC    "  // DEC TurboChannel
126 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_VL     "VL    "  // VESA Local Bus
127 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_VME    "VME   "  // VMEbus
128 #define EFI_LEGACY_MP_TABLE_ENTRY_BUS_STRING_XPRESS "XPRESS"  // Express System Bus
129 //
130 // Entry Type 2: I/O APIC.
131 //
132 #define EFI_LEGACY_MP_TABLE_ENTRY_TYPE_IOAPIC 0x02
133 typedef struct {
134   UINT8 EntryType;
135   UINT8 Id;
136   UINT8 Ver;
137   struct {
138     UINT8 Enabled : 1;
139     UINT8 Reserved : 7;
140   } Flags;
141   UINT32  Address;
142 } EFI_LEGACY_MP_TABLE_ENTRY_IOAPIC;
143 
144 //
145 // Entry Type 3: I/O Interrupt Assignment.
146 //
147 #define EFI_LEGACY_MP_TABLE_ENTRY_TYPE_IO_INT 0x03
148 typedef struct {
149   UINT8 EntryType;
150   UINT8 IntType;
151   struct {
152     UINT16  Polarity : 2;
153     UINT16  Trigger : 2;
154     UINT16  Reserved : 12;
155   } Flags;
156   UINT8 SourceBusId;
157   union {
158     struct {
159       UINT8 IntNo : 2;
160       UINT8 Dev : 5;
161       UINT8 Reserved : 1;
162     } fields;
163     UINT8 byte;
164   } SourceBusIrq;
165   UINT8 DestApicId;
166   UINT8 DestApicIntIn;
167 } EFI_LEGACY_MP_TABLE_ENTRY_IO_INT;
168 
169 typedef enum {
170   EfiLegacyMpTableEntryIoIntTypeInt   = 0,
171   EfiLegacyMpTableEntryIoIntTypeNmi   = 1,
172   EfiLegacyMpTableEntryIoIntTypeSmi   = 2,
173   EfiLegacyMpTableEntryIoIntTypeExtInt= 3,
174 } EFI_LEGACY_MP_TABLE_ENTRY_IO_INT_TYPE;
175 
176 typedef enum {
177   EfiLegacyMpTableEntryIoIntFlagsPolaritySpec       = 0x0,
178   EfiLegacyMpTableEntryIoIntFlagsPolarityActiveHigh = 0x1,
179   EfiLegacyMpTableEntryIoIntFlagsPolarityReserved   = 0x2,
180   EfiLegacyMpTableEntryIoIntFlagsPolarityActiveLow  = 0x3,
181 } EFI_LEGACY_MP_TABLE_ENTRY_IO_INT_FLAGS_POLARITY;
182 
183 typedef enum {
184   EfiLegacyMpTableEntryIoIntFlagsTriggerSpec        = 0x0,
185   EfiLegacyMpTableEntryIoIntFlagsTriggerEdge        = 0x1,
186   EfiLegacyMpTableEntryIoIntFlagsTriggerReserved    = 0x2,
187   EfiLegacyMpTableEntryIoIntFlagsTriggerLevel       = 0x3,
188 } EFI_LEGACY_MP_TABLE_ENTRY_IO_INT_FLAGS_TRIGGER;
189 
190 //
191 // Entry Type 4: Local Interrupt Assignment.
192 //
193 #define EFI_LEGACY_MP_TABLE_ENTRY_TYPE_LOCAL_INT  0x04
194 typedef struct {
195   UINT8 EntryType;
196   UINT8 IntType;
197   struct {
198     UINT16  Polarity : 2;
199     UINT16  Trigger : 2;
200     UINT16  Reserved : 12;
201   } Flags;
202   UINT8 SourceBusId;
203   UINT8 SourceBusIrq;
204   UINT8 DestApicId;
205   UINT8 DestApicIntIn;
206 } EFI_LEGACY_MP_TABLE_ENTRY_LOCAL_INT;
207 
208 typedef enum {
209   EfiLegacyMpTableEntryLocalIntTypeInt              = 0,
210   EfiLegacyMpTableEntryLocalIntTypeNmi              = 1,
211   EfiLegacyMpTableEntryLocalIntTypeSmi              = 2,
212   EfiLegacyMpTableEntryLocalIntTypeExtInt           = 3,
213 } EFI_LEGACY_MP_TABLE_ENTRY_LOCAL_INT_TYPE;
214 
215 typedef enum {
216   EfiLegacyMpTableEntryLocalIntFlagsPolaritySpec      = 0x0,
217   EfiLegacyMpTableEntryLocalIntFlagsPolarityActiveHigh= 0x1,
218   EfiLegacyMpTableEntryLocalIntFlagsPolarityReserved  = 0x2,
219   EfiLegacyMpTableEntryLocalIntFlagsPolarityActiveLow = 0x3,
220 } EFI_LEGACY_MP_TABLE_ENTRY_LOCAL_INT_FLAGS_POLARITY;
221 
222 typedef enum {
223   EfiLegacyMpTableEntryLocalIntFlagsTriggerSpec       = 0x0,
224   EfiLegacyMpTableEntryLocalIntFlagsTriggerEdge       = 0x1,
225   EfiLegacyMpTableEntryLocalIntFlagsTriggerReserved   = 0x2,
226   EfiLegacyMpTableEntryLocalIntFlagsTriggerLevel      = 0x3,
227 } EFI_LEGACY_MP_TABLE_ENTRY_LOCAL_INT_FLAGS_TRIGGER;
228 
229 //
230 // Entry Type 128: System Address Space Mapping.
231 //
232 #define EFI_LEGACY_MP_TABLE_ENTRY_EXT_TYPE_SYS_ADDR_SPACE_MAPPING 0x80
233 typedef struct {
234   UINT8   EntryType;
235   UINT8   Length;
236   UINT8   BusId;
237   UINT8   AddressType;
238   UINT64  AddressBase;
239   UINT64  AddressLength;
240 } EFI_LEGACY_MP_TABLE_ENTRY_EXT_SYS_ADDR_SPACE_MAPPING;
241 
242 typedef enum {
243   EfiLegacyMpTableEntryExtSysAddrSpaceMappingIo       = 0,
244   EfiLegacyMpTableEntryExtSysAddrSpaceMappingMemory   = 1,
245   EfiLegacyMpTableEntryExtSysAddrSpaceMappingPrefetch = 2,
246 } EFI_LEGACY_MP_TABLE_ENTRY_EXT_SYS_ADDR_SPACE_MAPPING_TYPE;
247 
248 //
249 // Entry Type 129: Bus Hierarchy.
250 //
251 #define EFI_LEGACY_MP_TABLE_ENTRY_EXT_TYPE_BUS_HIERARCHY  0x81
252 typedef struct {
253   UINT8 EntryType;
254   UINT8 Length;
255   UINT8 BusId;
256   struct {
257     UINT8 SubtractiveDecode : 1;
258     UINT8 Reserved : 7;
259   } BusInfo;
260   UINT8 ParentBus;
261   UINT8 Reserved1;
262   UINT8 Reserved2;
263   UINT8 Reserved3;
264 } EFI_LEGACY_MP_TABLE_ENTRY_EXT_BUS_HIERARCHY;
265 
266 //
267 // Entry Type 130: Compatibility Bus Address Space Modifier.
268 //
269 #define EFI_LEGACY_MP_TABLE_ENTRY_EXT_TYPE_COMPAT_BUS_ADDR_SPACE_MODIFIER 0x82
270 typedef struct {
271   UINT8 EntryType;
272   UINT8 Length;
273   UINT8 BusId;
274   struct {
275     UINT8 RangeMode : 1;
276     UINT8 Reserved : 7;
277   } AddrMode;
278   UINT32  PredefinedRangeList;
279 } EFI_LEGACY_MP_TABLE_ENTRY_EXT_COMPAT_BUS_ADDR_SPACE_MODIFIER;
280 
281 #pragma pack()
282 
283 #endif
284