• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Main SAL API's defined in Intel Itanium Processor Family System Abstraction
3   Layer Specification Revision 3.2 (December 2003)
4 
5 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials are licensed and made available under
7 the terms and conditions of the BSD License that accompanies this distribution.
8 The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __SAL_API_H__
17 #define __SAL_API_H__
18 
19 ///
20 /// SAL return status type
21 ///
22 typedef INTN EFI_SAL_STATUS;
23 
24 ///
25 /// Call completed without error.
26 ///
27 #define EFI_SAL_SUCCESS               ((EFI_SAL_STATUS) 0)
28 ///
29 /// Call completed without error, but some information was lost due to overflow.
30 ///
31 #define EFI_SAL_OVERFLOW              ((EFI_SAL_STATUS) 1)
32 ///
33 /// Call completed without error; effect a warm boot of the system to complete the update.
34 ///
35 #define EFI_SAL_WARM_BOOT_NEEDED      ((EFI_SAL_STATUS) 2)
36 ///
37 /// More information is available for retrieval.
38 ///
39 #define EFI_SAL_MORE_RECORDS          ((EFI_SAL_STATUS) 3)
40 ///
41 /// Not implemented.
42 ///
43 #define EFI_SAL_NOT_IMPLEMENTED       ((EFI_SAL_STATUS) - 1)
44 ///
45 /// Invalid Argument.
46 ///
47 #define EFI_SAL_INVALID_ARGUMENT      ((EFI_SAL_STATUS) - 2)
48 ///
49 /// Call completed without error.
50 ///
51 #define EFI_SAL_ERROR                 ((EFI_SAL_STATUS) - 3)
52 ///
53 /// Virtual address not registered.
54 ///
55 #define EFI_SAL_VIRTUAL_ADDRESS_ERROR ((EFI_SAL_STATUS) - 4)
56 ///
57 /// No information available.
58 ///
59 #define EFI_SAL_NO_INFORMATION        ((EFI_SAL_STATUS) - 5)
60 ///
61 /// Scratch buffer required.
62 ///
63 #define EFI_SAL_NOT_ENOUGH_SCRATCH    ((EFI_SAL_STATUS) - 9)
64 
65 ///
66 /// Return registers from SAL.
67 ///
68 typedef struct {
69   ///
70   /// SAL return status value in r8.
71   ///
72   EFI_SAL_STATUS  Status;
73   ///
74   /// SAL returned value in r9.
75   ///
76   UINTN           r9;
77   ///
78   /// SAL returned value in r10.
79   ///
80   UINTN           r10;
81   ///
82   /// SAL returned value in r11.
83   ///
84   UINTN           r11;
85 } SAL_RETURN_REGS;
86 
87 /**
88   Prototype of SAL procedures.
89 
90   @param  FunctionId         Functional identifier.
91                              The upper 32 bits are ignored and only the lower 32 bits
92                              are used. The following functional identifiers are defined:
93                              0x01XXXXXX - Architected SAL functional group.
94                              0x02XXXXXX to 0x03XXXXXX - OEM SAL functional group. Each OEM is
95                              allowed to use the entire range in the 0x02XXXXXX to 0x03XXXXXX range.
96                              0x04XXXXXX to 0xFFFFFFFF - Reserved.
97   @param  Arg1               The first parameter of the architected/OEM specific SAL functions.
98   @param  Arg2               The second parameter of the architected/OEM specific SAL functions.
99   @param  Arg3               The third parameter passed to the ESAL function based.
100   @param  Arg4               The fourth parameter passed to the ESAL function based.
101   @param  Arg5               The fifth parameter passed to the ESAL function based.
102   @param  Arg6               The sixth parameter passed to the ESAL function.
103   @param  Arg7               The seventh parameter passed to the ESAL function based.
104 
105   @return r8                 Return status: positive number indicates successful,
106                              negative number indicates failure.
107           r9                 Other return parameter in r9.
108           r10                Other return parameter in r10.
109           r11                Other return parameter in r11.
110 
111 **/
112 typedef
113 SAL_RETURN_REGS
114 (EFIAPI *SAL_PROC)(
115   IN UINT64 FunctionId,
116   IN UINT64 Arg1,
117   IN UINT64 Arg2,
118   IN UINT64 Arg3,
119   IN UINT64 Arg4,
120   IN UINT64 Arg5,
121   IN UINT64 Arg6,
122   IN UINT64 Arg7
123   );
124 
125 //
126 // SAL Procedure FunctionId definition
127 //
128 
129 ///
130 /// Register software code locations with SAL.
131 ///
132 #define EFI_SAL_SET_VECTORS             0x01000000
133 ///
134 /// Return Machine State information obtained by SAL.
135 ///
136 #define EFI_SAL_GET_STATE_INFO          0x01000001
137 ///
138 /// Obtain size of Machine State information.
139 ///
140 #define EFI_SAL_GET_STATE_INFO_SIZE     0x01000002
141 ///
142 /// Clear Machine State information.
143 ///
144 #define EFI_SAL_CLEAR_STATE_INFO        0x01000003
145 ///
146 /// Cause the processor to go into a spin loop within SAL.
147 ///
148 #define EFI_SAL_MC_RENDEZ               0x01000004
149 ///
150 /// Register the machine check interface layer with SAL.
151 ///
152 #define EFI_SAL_MC_SET_PARAMS           0x01000005
153 ///
154 /// Register the physical addresses of locations needed by SAL.
155 ///
156 #define EFI_SAL_REGISTER_PHYSICAL_ADDR  0x01000006
157 ///
158 /// Flush the instruction or data caches.
159 ///
160 #define EFI_SAL_CACHE_FLUSH             0x01000008
161 ///
162 /// Initialize the instruction and data caches.
163 ///
164 #define EFI_SAL_CACHE_INIT              0x01000009
165 ///
166 /// Read from the PCI configuration space.
167 ///
168 #define EFI_SAL_PCI_CONFIG_READ         0x01000010
169 ///
170 /// Write to the PCI configuration space.
171 ///
172 #define EFI_SAL_PCI_CONFIG_WRITE        0x01000011
173 ///
174 /// Return the base frequency of the platform.
175 ///
176 #define EFI_SAL_FREQ_BASE               0x01000012
177 ///
178 /// Returns information on the physical processor mapping within the platform.
179 ///
180 #define EFI_SAL_PHYSICAL_ID_INFO        0x01000013
181 ///
182 /// Update the contents of firmware blocks.
183 ///
184 #define EFI_SAL_UPDATE_PAL              0x01000020
185 
186 #define EFI_SAL_FUNCTION_ID_MASK        0x0000ffff
187 #define EFI_SAL_MAX_SAL_FUNCTION_ID     0x00000021
188 
189 //
190 // SAL Procedure parameter definitions
191 // Not much point in using typedefs or enums because all params
192 // are UINT64 and the entry point is common
193 //
194 
195 //
196 // Parameter of EFI_SAL_SET_VECTORS
197 //
198 // Vector type
199 //
200 #define EFI_SAL_SET_MCA_VECTOR          0x0
201 #define EFI_SAL_SET_INIT_VECTOR         0x1
202 #define EFI_SAL_SET_BOOT_RENDEZ_VECTOR  0x2
203 ///
204 /// The format of a length_cs_n argument.
205 ///
206 typedef struct {
207   UINT64  Length : 32;
208   UINT64  ChecksumValid : 1;
209   UINT64  Reserved1 : 7;
210   UINT64  ByteChecksum : 8;
211   UINT64  Reserved2 : 16;
212 } SAL_SET_VECTORS_CS_N;
213 
214 //
215 // Parameter of EFI_SAL_GET_STATE_INFO, EFI_SAL_GET_STATE_INFO_SIZE, and EFI_SAL_CLEAR_STATE_INFO
216 //
217 // Type of information
218 //
219 #define EFI_SAL_MCA_STATE_INFO  0x0
220 #define EFI_SAL_INIT_STATE_INFO 0x1
221 #define EFI_SAL_CMC_STATE_INFO  0x2
222 #define EFI_SAL_CP_STATE_INFO   0x3
223 
224 //
225 // Parameter of EFI_SAL_MC_SET_PARAMS
226 //
227 // Unsigned 64-bit integer value for the parameter type of the machine check interface
228 //
229 #define EFI_SAL_MC_SET_RENDEZ_PARAM 0x1
230 #define EFI_SAL_MC_SET_WAKEUP_PARAM 0x2
231 #define EFI_SAL_MC_SET_CPE_PARAM    0x3
232 //
233 // Unsigned 64-bit integer value indicating whether interrupt vector or
234 // memory address is specified
235 //
236 #define EFI_SAL_MC_SET_INTR_PARAM   0x1
237 #define EFI_SAL_MC_SET_MEM_PARAM    0x2
238 
239 //
240 // Parameter of EFI_SAL_REGISTER_PAL_PHYSICAL_ADDR
241 //
242 // The encoded value of the entity whose physical address is registered
243 //
244 #define EFI_SAL_REGISTER_PAL_ADDR 0x0
245 
246 //
247 // Parameter of EFI_SAL_CACHE_FLUSH
248 //
249 // Unsigned 64-bit integer denoting type of cache flush operation
250 //
251 #define EFI_SAL_FLUSH_I_CACHE       0x01
252 #define EFI_SAL_FLUSH_D_CACHE       0x02
253 #define EFI_SAL_FLUSH_BOTH_CACHE    0x03
254 #define EFI_SAL_FLUSH_MAKE_COHERENT 0x04
255 
256 //
257 // Parameter of EFI_SAL_PCI_CONFIG_READ and EFI_SAL_PCI_CONFIG_WRITE
258 //
259 // PCI config size
260 //
261 #define EFI_SAL_PCI_CONFIG_ONE_BYTE   0x1
262 #define EFI_SAL_PCI_CONFIG_TWO_BYTES  0x2
263 #define EFI_SAL_PCI_CONFIG_FOUR_BYTES 0x4
264 //
265 // The type of PCI configuration address
266 //
267 #define EFI_SAL_PCI_COMPATIBLE_ADDRESS         0x0
268 #define EFI_SAL_PCI_EXTENDED_REGISTER_ADDRESS  0x1
269 ///
270 /// The format of PCI Compatible Address.
271 ///
272 typedef struct {
273   UINT64  Register : 8;
274   UINT64  Function : 3;
275   UINT64  Device : 5;
276   UINT64  Bus : 8;
277   UINT64  Segment : 8;
278   UINT64  Reserved : 32;
279 } SAL_PCI_ADDRESS;
280 ///
281 /// The format of Extended Register Address.
282 ///
283 typedef struct {
284   UINT64  Register : 8;
285   UINT64  ExtendedRegister : 4;
286   UINT64  Function : 3;
287   UINT64  Device : 5;
288   UINT64  Bus : 8;
289   UINT64  Segment : 16;
290   UINT64  Reserved : 20;
291 } SAL_PCI_EXTENDED_REGISTER_ADDRESS;
292 
293 //
294 // Parameter of EFI_SAL_FREQ_BASE
295 //
296 // Unsigned 64-bit integer specifying the type of clock source
297 //
298 #define EFI_SAL_CPU_INPUT_FREQ_BASE     0x0
299 #define EFI_SAL_PLATFORM_IT_FREQ_BASE   0x1
300 #define EFI_SAL_PLATFORM_RTC_FREQ_BASE  0x2
301 
302 //
303 // Parameter and return value of EFI_SAL_UPDATE_PAL
304 //
305 // Return parameter provides additional information on the
306 // failure when the status field contains a value of -3,
307 // returned in r9.
308 //
309 #define EFI_SAL_UPDATE_BAD_PAL_VERSION  ((UINT64) -1)
310 #define EFI_SAL_UPDATE_PAL_AUTH_FAIL    ((UINT64) -2)
311 #define EFI_SAL_UPDATE_PAL_BAD_TYPE     ((UINT64) -3)
312 #define EFI_SAL_UPDATE_PAL_READONLY     ((UINT64) -4)
313 #define EFI_SAL_UPDATE_PAL_WRITE_FAIL   ((UINT64) -10)
314 #define EFI_SAL_UPDATE_PAL_ERASE_FAIL   ((UINT64) -11)
315 #define EFI_SAL_UPDATE_PAL_READ_FAIL    ((UINT64) -12)
316 #define EFI_SAL_UPDATE_PAL_CANT_FIT     ((UINT64) -13)
317 ///
318 /// 64-byte header of update data block.
319 ///
320 typedef struct {
321   UINT32  Size;
322   UINT32  MmddyyyyDate;
323   UINT16  Version;
324   UINT8   Type;
325   UINT8   Reserved[5];
326   UINT64  FwVendorId;
327   UINT8   Reserved2[40];
328 } SAL_UPDATE_PAL_DATA_BLOCK;
329 ///
330 /// Data structure pointed by the parameter param_buf.
331 /// It is a 16-byte aligned data structure in memory with a length of 32 bytes
332 /// that describes the new firmware. This information is organized in the form
333 /// of a linked list with each element describing one firmware component.
334 ///
335 typedef struct _SAL_UPDATE_PAL_INFO_BLOCK {
336   struct _SAL_UPDATE_PAL_INFO_BLOCK *Next;
337   struct SAL_UPDATE_PAL_DATA_BLOCK  *DataBlock;
338   UINT8                             StoreChecksum;
339   UINT8                             Reserved[15];
340 } SAL_UPDATE_PAL_INFO_BLOCK;
341 
342 ///
343 /// SAL System Table Definitions.
344 ///
345 #pragma pack(1)
346 typedef struct {
347   ///
348   /// The ASCII string representation of "SST_" that confirms the presence of the table.
349   ///
350   UINT32  Signature;
351   ///
352   /// The length of the entire table in bytes, starting from offset zero and including the
353   /// header and all entries indicated by the EntryCount field.
354   ///
355   UINT32  Length;
356   ///
357   /// The revision number of the Itanium Processor Family System Abstraction Layer
358   /// Specification supported by the SAL implementation, in binary coded decimal (BCD) format.
359   ///
360   UINT16  SalRevision;
361   ///
362   /// The number of entries in the variable portion of the table.
363   ///
364   UINT16  EntryCount;
365   ///
366   /// A modulo checksum of the entire table and the entries following this table.
367   ///
368   UINT8   CheckSum;
369   ///
370   /// Unused, must be zero.
371   ///
372   UINT8   Reserved[7];
373   ///
374   /// Version Number of the SAL_A firmware implementation in BCD format.
375   ///
376   UINT16  SalAVersion;
377   ///
378   /// Version Number of the SAL_B firmware implementation in BCD format.
379   ///
380   UINT16  SalBVersion;
381   ///
382   /// An ASCII identification string which uniquely identifies the manufacturer
383   /// of the system hardware.
384   ///
385   UINT8   OemId[32];
386   ///
387   /// An ASCII identification string which uniquely identifies a family of
388   /// compatible products from the manufacturer.
389   ///
390   UINT8   ProductId[32];
391   ///
392   /// Unused, must be zero.
393   ///
394   UINT8   Reserved2[8];
395 } SAL_SYSTEM_TABLE_HEADER;
396 
397 #define EFI_SAL_ST_HEADER_SIGNATURE "SST_"
398 #define EFI_SAL_REVISION            0x0320
399 //
400 // SAL System Types
401 //
402 #define EFI_SAL_ST_ENTRY_POINT        0
403 #define EFI_SAL_ST_MEMORY_DESCRIPTOR  1
404 #define EFI_SAL_ST_PLATFORM_FEATURES  2
405 #define EFI_SAL_ST_TR_USAGE           3
406 #define EFI_SAL_ST_PTC                4
407 #define EFI_SAL_ST_AP_WAKEUP          5
408 
409 //
410 // SAL System Type Sizes
411 //
412 #define EFI_SAL_ST_ENTRY_POINT_SIZE        48
413 #define EFI_SAL_ST_MEMORY_DESCRIPTOR_SIZE  32
414 #define EFI_SAL_ST_PLATFORM_FEATURES_SIZE  16
415 #define EFI_SAL_ST_TR_USAGE_SIZE           32
416 #define EFI_SAL_ST_PTC_SIZE                16
417 #define EFI_SAL_ST_AP_WAKEUP_SIZE          16
418 
419 ///
420 /// Format of Entrypoint Descriptor Entry.
421 ///
422 typedef struct {
423   UINT8   Type;         ///< Type here should be 0.
424   UINT8   Reserved[7];
425   UINT64  PalProcEntry;
426   UINT64  SalProcEntry;
427   UINT64  SalGlobalDataPointer;
428   UINT64  Reserved2[2];
429 } SAL_ST_ENTRY_POINT_DESCRIPTOR;
430 
431 ///
432 /// Format of Platform Features Descriptor Entry.
433 ///
434 typedef struct {
435   UINT8 Type;           ///< Type here should be 2.
436   UINT8 PlatformFeatures;
437   UINT8 Reserved[14];
438 } SAL_ST_PLATFORM_FEATURES;
439 
440 //
441 // Value of Platform Feature List
442 //
443 #define SAL_PLAT_FEAT_BUS_LOCK      0x01
444 #define SAL_PLAT_FEAT_PLAT_IPI_HINT 0x02
445 #define SAL_PLAT_FEAT_PROC_IPI_HINT 0x04
446 
447 ///
448 /// Format of Translation Register Descriptor Entry.
449 ///
450 typedef struct {
451   UINT8   Type;         ///< Type here should be 3.
452   UINT8   TRType;
453   UINT8   TRNumber;
454   UINT8   Reserved[5];
455   UINT64  VirtualAddress;
456   UINT64  EncodedPageSize;
457   UINT64  Reserved1;
458 } SAL_ST_TR_DECRIPTOR;
459 
460 //
461 // Type of Translation Register
462 //
463 #define EFI_SAL_ST_TR_USAGE_INSTRUCTION 00
464 #define EFI_SAL_ST_TR_USAGE_DATA        01
465 
466 ///
467 /// Definition of Coherence Domain Information.
468 ///
469 typedef struct {
470   UINT64  NumberOfProcessors;
471   UINT64  LocalIDRegister;
472 } SAL_COHERENCE_DOMAIN_INFO;
473 
474 ///
475 /// Format of Purge Translation Cache Coherence Domain Entry.
476 ///
477 typedef struct {
478   UINT8                     Type;       ///< Type here should be 4.
479   UINT8                     Reserved[3];
480   UINT32                    NumberOfDomains;
481   SAL_COHERENCE_DOMAIN_INFO *DomainInformation;
482 } SAL_ST_CACHE_COHERENCE_DECRIPTOR;
483 
484 ///
485 /// Format of Application Processor Wake-Up Descriptor Entry.
486 ///
487 typedef struct {
488   UINT8   Type;                   ///< Type here should be 5.
489   UINT8   WakeUpType;
490   UINT8   Reserved[6];
491   UINT64  ExternalInterruptVector;
492 } SAL_ST_AP_WAKEUP_DECRIPTOR;
493 
494 ///
495 /// Format of Firmware Interface Table (FIT) Entry.
496 ///
497 typedef struct {
498   UINT64  Address;
499   UINT8   Size[3];
500   UINT8   Reserved;
501   UINT16  Revision;
502   UINT8   Type : 7;
503   UINT8   CheckSumValid : 1;
504   UINT8   CheckSum;
505 } EFI_SAL_FIT_ENTRY;
506 //
507 // FIT Types
508 //
509 #define EFI_SAL_FIT_FIT_HEADER_TYPE                0x00
510 #define EFI_SAL_FIT_PAL_B_TYPE                     0x01
511 //
512 // Type from 0x02 to 0x0D is reserved.
513 //
514 #define EFI_SAL_FIT_PROCESSOR_SPECIFIC_PAL_A_TYPE  0x0E
515 #define EFI_SAL_FIT_PAL_A_TYPE                     0x0F
516 //
517 // OEM-defined type range is from 0x10 to 0x7E.
518 // Here we defined the PEI_CORE type as 0x10
519 //
520 #define EFI_SAL_FIT_PEI_CORE_TYPE                  0x10
521 #define EFI_SAL_FIT_UNUSED_TYPE                    0x7F
522 
523 //
524 // FIT Entry
525 //
526 #define EFI_SAL_FIT_ENTRY_PTR   (0x100000000 - 32)  // 4GB - 24
527 #define EFI_SAL_FIT_PALA_ENTRY  (0x100000000 - 48)  // 4GB - 32
528 #define EFI_SAL_FIT_PALB_TYPE   01
529 
530 //
531 // Following definitions are for Error Record Structure
532 //
533 
534 ///
535 /// Format of TimeStamp field in Record Header.
536 ///
537 typedef struct {
538   UINT8 Seconds;
539   UINT8 Minutes;
540   UINT8 Hours;
541   UINT8 Reserved;
542   UINT8 Day;
543   UINT8 Month;
544   UINT8 Year;
545   UINT8 Century;
546 } SAL_TIME_STAMP;
547 ///
548 /// Definition of Record Header.
549 ///
550 typedef struct {
551   UINT64          RecordId;
552   UINT16          Revision;
553   UINT8           ErrorSeverity;
554   UINT8           ValidationBits;
555   UINT32          RecordLength;
556   SAL_TIME_STAMP  TimeStamp;
557   UINT8           OemPlatformId[16];
558 } SAL_RECORD_HEADER;
559 ///
560 /// Definition of Section Header.
561 ///
562 typedef struct {
563   GUID      Guid;
564   UINT16    Revision;
565   UINT8     ErrorRecoveryInfo;
566   UINT8     Reserved;
567   UINT32    SectionLength;
568 } SAL_SEC_HEADER;
569 
570 ///
571 /// GUID of Processor Machine Check Errors.
572 ///
573 #define SAL_PROCESSOR_ERROR_RECORD_INFO \
574   { \
575     0xe429faf1, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
576   }
577 //
578 // Bit masks for valid bits of MOD_ERROR_INFO
579 //
580 #define CHECK_INFO_VALID_BIT_MASK   0x1
581 #define REQUESTOR_ID_VALID_BIT_MASK 0x2
582 #define RESPONDER_ID_VALID_BIT_MASK 0x4
583 #define TARGER_ID_VALID_BIT_MASK    0x8
584 #define PRECISE_IP_VALID_BIT_MASK   0x10
585 ///
586 /// Definition of MOD_ERROR_INFO_STRUCT.
587 ///
588 typedef struct {
589   UINT64  InfoValid : 1;
590   UINT64  ReqValid : 1;
591   UINT64  RespValid : 1;
592   UINT64  TargetValid : 1;
593   UINT64  IpValid : 1;
594   UINT64  Reserved : 59;
595   UINT64  Info;
596   UINT64  Req;
597   UINT64  Resp;
598   UINT64  Target;
599   UINT64  Ip;
600 } MOD_ERROR_INFO;
601 ///
602 /// Definition of CPUID_INFO_STRUCT.
603 ///
604 typedef struct {
605   UINT8 CpuidInfo[40];
606   UINT8 Reserved;
607 } CPUID_INFO;
608 
609 typedef struct {
610   UINT64  FrLow;
611   UINT64  FrHigh;
612 } FR_STRUCT;
613 //
614 // Bit masks for PSI_STATIC_STRUCT.ValidFieldBits
615 //
616 #define MIN_STATE_VALID_BIT_MASK  0x1
617 #define BR_VALID_BIT_MASK         0x2
618 #define CR_VALID_BIT_MASK         0x4
619 #define AR_VALID_BIT_MASK         0x8
620 #define RR_VALID_BIT_MASK         0x10
621 #define FR_VALID_BIT_MASK         0x20
622 ///
623 /// Definition of PSI_STATIC_STRUCT.
624 ///
625 typedef struct {
626   UINT64    ValidFieldBits;
627   UINT8     MinStateInfo[1024];
628   UINT64    Br[8];
629   UINT64    Cr[128];
630   UINT64    Ar[128];
631   UINT64    Rr[8];
632   FR_STRUCT Fr[128];
633 } PSI_STATIC_STRUCT;
634 //
635 // Bit masks for SAL_PROCESSOR_ERROR_RECORD.ValidationBits
636 //
637 #define PROC_ERROR_MAP_VALID_BIT_MASK       0x1
638 #define PROC_STATE_PARAMETER_VALID_BIT_MASK 0x2
639 #define PROC_CR_LID_VALID_BIT_MASK          0x4
640 #define PROC_STATIC_STRUCT_VALID_BIT_MASK   0x8
641 #define CPU_INFO_VALID_BIT_MASK             0x1000000
642 ///
643 /// Definition of Processor Machine Check Error Record.
644 ///
645 typedef struct {
646   SAL_SEC_HEADER    SectionHeader;
647   UINT64            ValidationBits;
648   UINT64            ProcErrorMap;
649   UINT64            ProcStateParameter;
650   UINT64            ProcCrLid;
651   MOD_ERROR_INFO    CacheError[15];
652   MOD_ERROR_INFO    TlbError[15];
653   MOD_ERROR_INFO    BusError[15];
654   MOD_ERROR_INFO    RegFileCheck[15];
655   MOD_ERROR_INFO    MsCheck[15];
656   CPUID_INFO        CpuInfo;
657   PSI_STATIC_STRUCT PsiValidData;
658 } SAL_PROCESSOR_ERROR_RECORD;
659 
660 ///
661 /// GUID of Platform Memory Device Error Info.
662 ///
663 #define SAL_MEMORY_ERROR_RECORD_INFO \
664   { \
665     0xe429faf2, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
666   }
667 //
668 // Bit masks for SAL_MEMORY_ERROR_RECORD.ValidationBits
669 //
670 #define MEMORY_ERROR_STATUS_VALID_BIT_MASK                0x1
671 #define MEMORY_PHYSICAL_ADDRESS_VALID_BIT_MASK            0x2
672 #define MEMORY_ADDR_BIT_MASK                              0x4
673 #define MEMORY_NODE_VALID_BIT_MASK                        0x8
674 #define MEMORY_CARD_VALID_BIT_MASK                        0x10
675 #define MEMORY_MODULE_VALID_BIT_MASK                      0x20
676 #define MEMORY_BANK_VALID_BIT_MASK                        0x40
677 #define MEMORY_DEVICE_VALID_BIT_MASK                      0x80
678 #define MEMORY_ROW_VALID_BIT_MASK                         0x100
679 #define MEMORY_COLUMN_VALID_BIT_MASK                      0x200
680 #define MEMORY_BIT_POSITION_VALID_BIT_MASK                0x400
681 #define MEMORY_PLATFORM_REQUESTOR_ID_VALID_BIT_MASK       0x800
682 #define MEMORY_PLATFORM_RESPONDER_ID_VALID_BIT_MASK       0x1000
683 #define MEMORY_PLATFORM_TARGET_VALID_BIT_MASK             0x2000
684 #define MEMORY_PLATFORM_BUS_SPECIFIC_DATA_VALID_BIT_MASK  0x4000
685 #define MEMORY_PLATFORM_OEM_ID_VALID_BIT_MASK             0x8000
686 #define MEMORY_PLATFORM_OEM_DATA_STRUCT_VALID_BIT_MASK    0x10000
687 ///
688 /// Definition of Platform Memory Device Error Info Record.
689 ///
690 typedef struct {
691   SAL_SEC_HEADER  SectionHeader;
692   UINT64          ValidationBits;
693   UINT64          MemErrorStatus;
694   UINT64          MemPhysicalAddress;
695   UINT64          MemPhysicalAddressMask;
696   UINT16          MemNode;
697   UINT16          MemCard;
698   UINT16          MemModule;
699   UINT16          MemBank;
700   UINT16          MemDevice;
701   UINT16          MemRow;
702   UINT16          MemColumn;
703   UINT16          MemBitPosition;
704   UINT64          ModRequestorId;
705   UINT64          ModResponderId;
706   UINT64          ModTargetId;
707   UINT64          BusSpecificData;
708   UINT8           MemPlatformOemId[16];
709 } SAL_MEMORY_ERROR_RECORD;
710 
711 ///
712 /// GUID of Platform PCI Bus Error Info.
713 ///
714 #define SAL_PCI_BUS_ERROR_RECORD_INFO \
715   { \
716     0xe429faf4, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
717   }
718 //
719 // Bit masks for SAL_PCI_BUS_ERROR_RECORD.ValidationBits
720 //
721 #define PCI_BUS_ERROR_STATUS_VALID_BIT_MASK     0x1
722 #define PCI_BUS_ERROR_TYPE_VALID_BIT_MASK       0x2
723 #define PCI_BUS_ID_VALID_BIT_MASK               0x4
724 #define PCI_BUS_ADDRESS_VALID_BIT_MASK          0x8
725 #define PCI_BUS_DATA_VALID_BIT_MASK             0x10
726 #define PCI_BUS_CMD_VALID_BIT_MASK              0x20
727 #define PCI_BUS_REQUESTOR_ID_VALID_BIT_MASK     0x40
728 #define PCI_BUS_RESPONDER_ID_VALID_BIT_MASK     0x80
729 #define PCI_BUS_TARGET_VALID_BIT_MASK           0x100
730 #define PCI_BUS_OEM_ID_VALID_BIT_MASK           0x200
731 #define PCI_BUS_OEM_DATA_STRUCT_VALID_BIT_MASK  0x400
732 
733 ///
734 /// Designated PCI Bus identifier.
735 ///
736 typedef struct {
737   UINT8 BusNumber;
738   UINT8 SegmentNumber;
739 } PCI_BUS_ID;
740 
741 ///
742 /// Definition of Platform PCI Bus Error Info Record.
743 ///
744 typedef struct {
745   SAL_SEC_HEADER  SectionHeader;
746   UINT64          ValidationBits;
747   UINT64          PciBusErrorStatus;
748   UINT16          PciBusErrorType;
749   PCI_BUS_ID      PciBusId;
750   UINT32          Reserved;
751   UINT64          PciBusAddress;
752   UINT64          PciBusData;
753   UINT64          PciBusCommand;
754   UINT64          PciBusRequestorId;
755   UINT64          PciBusResponderId;
756   UINT64          PciBusTargetId;
757   UINT8           PciBusOemId[16];
758 } SAL_PCI_BUS_ERROR_RECORD;
759 
760 ///
761 /// GUID of Platform PCI Component Error Info.
762 ///
763 #define SAL_PCI_COMP_ERROR_RECORD_INFO \
764   { \
765     0xe429faf6, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
766   }
767 //
768 // Bit masks for SAL_PCI_COMPONENT_ERROR_RECORD.ValidationBits
769 //
770 #define PCI_COMP_ERROR_STATUS_VALID_BIT_MASK    0x1
771 #define PCI_COMP_INFO_VALID_BIT_MASK            0x2
772 #define PCI_COMP_MEM_NUM_VALID_BIT_MASK         0x4
773 #define PCI_COMP_IO_NUM_VALID_BIT_MASK          0x8
774 #define PCI_COMP_REG_DATA_PAIR_VALID_BIT_MASK   0x10
775 #define PCI_COMP_OEM_DATA_STRUCT_VALID_BIT_MASK 0x20
776 ///
777 /// Format of PCI Component Information to identify the device.
778 ///
779 typedef struct {
780   UINT16  VendorId;
781   UINT16  DeviceId;
782   UINT8   ClassCode[3];
783   UINT8   FunctionNumber;
784   UINT8   DeviceNumber;
785   UINT8   BusNumber;
786   UINT8   SegmentNumber;
787   UINT8   Reserved[5];
788 } PCI_COMP_INFO;
789 ///
790 /// Definition of Platform PCI Component Error Info.
791 ///
792 typedef struct {
793   SAL_SEC_HEADER  SectionHeader;
794   UINT64          ValidationBits;
795   UINT64          PciComponentErrorStatus;
796   PCI_COMP_INFO   PciComponentInfo;
797   UINT32          PciComponentMemNum;
798   UINT32          PciComponentIoNum;
799   UINT8           PciBusOemId[16];
800 } SAL_PCI_COMPONENT_ERROR_RECORD;
801 
802 ///
803 /// Platform SEL Device Error Info.
804 ///
805 #define SAL_SEL_DEVICE_ERROR_RECORD_INFO \
806   { \
807     0xe429faf3, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
808   }
809 //
810 // Bit masks for SAL_SEL_DEVICE_ERROR_RECORD.ValidationBits
811 //
812 #define SEL_RECORD_ID_VALID_BIT_MASK      0x1;
813 #define SEL_RECORD_TYPE_VALID_BIT_MASK    0x2;
814 #define SEL_GENERATOR_ID_VALID_BIT_MASK   0x4;
815 #define SEL_EVM_REV_VALID_BIT_MASK        0x8;
816 #define SEL_SENSOR_TYPE_VALID_BIT_MASK    0x10;
817 #define SEL_SENSOR_NUM_VALID_BIT_MASK     0x20;
818 #define SEL_EVENT_DIR_TYPE_VALID_BIT_MASK 0x40;
819 #define SEL_EVENT_DATA1_VALID_BIT_MASK    0x80;
820 #define SEL_EVENT_DATA2_VALID_BIT_MASK    0x100;
821 #define SEL_EVENT_DATA3_VALID_BIT_MASK    0x200;
822 ///
823 /// Definition of Platform SEL Device Error Info Record.
824 ///
825 typedef struct {
826   SAL_SEC_HEADER  SectionHeader;
827   UINT64          ValidationBits;
828   UINT16          SelRecordId;
829   UINT8           SelRecordType;
830   UINT32          TimeStamp;
831   UINT16          GeneratorId;
832   UINT8           EvmRevision;
833   UINT8           SensorType;
834   UINT8           SensorNum;
835   UINT8           EventDirType;
836   UINT8           Data1;
837   UINT8           Data2;
838   UINT8           Data3;
839 } SAL_SEL_DEVICE_ERROR_RECORD;
840 
841 ///
842 /// GUID of Platform SMBIOS Device Error Info.
843 ///
844 #define SAL_SMBIOS_ERROR_RECORD_INFO \
845   { \
846     0xe429faf5, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
847   }
848 //
849 // Bit masks for SAL_SMBIOS_DEVICE_ERROR_RECORD.ValidationBits
850 //
851 #define SMBIOS_EVENT_TYPE_VALID_BIT_MASK  0x1
852 #define SMBIOS_LENGTH_VALID_BIT_MASK      0x2
853 #define SMBIOS_TIME_STAMP_VALID_BIT_MASK  0x4
854 #define SMBIOS_DATA_VALID_BIT_MASK        0x8
855 ///
856 /// Definition of Platform SMBIOS Device Error Info Record.
857 ///
858 typedef struct {
859   SAL_SEC_HEADER  SectionHeader;
860   UINT64          ValidationBits;
861   UINT8           SmbiosEventType;
862   UINT8           SmbiosLength;
863   UINT8           SmbiosBcdTimeStamp[6];
864 } SAL_SMBIOS_DEVICE_ERROR_RECORD;
865 
866 ///
867 /// GUID of Platform Specific Error Info.
868 ///
869 #define SAL_PLATFORM_ERROR_RECORD_INFO \
870   { \
871     0xe429faf7, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \
872   }
873 //
874 // Bit masks for SAL_PLATFORM_SPECIFIC_ERROR_RECORD.ValidationBits
875 //
876 #define PLATFORM_ERROR_STATUS_VALID_BIT_MASK    0x1
877 #define PLATFORM_REQUESTOR_ID_VALID_BIT_MASK    0x2
878 #define PLATFORM_RESPONDER_ID_VALID_BIT_MASK    0x4
879 #define PLATFORM_TARGET_VALID_BIT_MASK          0x8
880 #define PLATFORM_SPECIFIC_DATA_VALID_BIT_MASK   0x10
881 #define PLATFORM_OEM_ID_VALID_BIT_MASK          0x20
882 #define PLATFORM_OEM_DATA_STRUCT_VALID_BIT_MASK 0x40
883 #define PLATFORM_OEM_DEVICE_PATH_VALID_BIT_MASK 0x80
884 ///
885 /// Definition of Platform Specific Error Info Record.
886 ///
887 typedef struct {
888   SAL_SEC_HEADER  SectionHeader;
889   UINT64          ValidationBits;
890   UINT64          PlatformErrorStatus;
891   UINT64          PlatformRequestorId;
892   UINT64          PlatformResponderId;
893   UINT64          PlatformTargetId;
894   UINT64          PlatformBusSpecificData;
895   UINT8           OemComponentId[16];
896 } SAL_PLATFORM_SPECIFIC_ERROR_RECORD;
897 
898 ///
899 /// Union of all the possible SAL Error Record Types.
900 ///
901 typedef union {
902   SAL_RECORD_HEADER                   *RecordHeader;
903   SAL_PROCESSOR_ERROR_RECORD          *SalProcessorRecord;
904   SAL_PCI_BUS_ERROR_RECORD            *SalPciBusRecord;
905   SAL_PCI_COMPONENT_ERROR_RECORD      *SalPciComponentRecord;
906   SAL_SEL_DEVICE_ERROR_RECORD         *ImpiRecord;
907   SAL_SMBIOS_DEVICE_ERROR_RECORD      *SmbiosRecord;
908   SAL_PLATFORM_SPECIFIC_ERROR_RECORD  *PlatformRecord;
909   SAL_MEMORY_ERROR_RECORD             *MemoryRecord;
910   UINT8                               *Raw;
911 } SAL_ERROR_RECORDS_POINTERS;
912 
913 #pragma pack()
914 
915 #endif
916