Home | History | Annotate | Download | only in IndustryStandard
      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