Home | History | Annotate | Download | only in Ipf
      1 /*++
      2 
      3 Copyright (c) 2004, 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   SalApi.h
     15 
     16 Abstract:
     17 
     18   Main SAL API's defined in SAL 3.0 specification.
     19 
     20 
     21 Revision History:
     22 
     23 --*/
     24 
     25 #ifndef _SAL_API_H_
     26 #define _SAL_API_H_
     27 
     28 typedef UINTN EFI_SAL_STATUS;
     29 
     30 //
     31 // EFI_SAL_STATUS defines
     32 //
     33 #define EFI_SAL_SUCCESS               ((EFI_SAL_STATUS) 0)
     34 #define EFI_SAL_MORE_RECORDS          ((EFI_SAL_STATUS) 3)
     35 #define EFI_SAL_NOT_IMPLEMENTED       ((EFI_SAL_STATUS) - 1)
     36 #define EFI_SAL_INVALID_ARGUMENT      ((EFI_SAL_STATUS) - 2)
     37 #define EFI_SAL_ERROR                 ((EFI_SAL_STATUS) - 3)
     38 #define EFI_SAL_VIRTUAL_ADDRESS_ERROR ((EFI_SAL_STATUS) - 4)
     39 #define EFI_SAL_NO_INFORMATION        ((EFI_SAL_STATUS) - 5)
     40 #define EFI_SAL_NOT_ENOUGH_SCRATCH    ((EFI_SAL_STATUS) - 9)
     41 
     42 //
     43 //  Delivery Mode of IPF CPU.
     44 //
     45 typedef enum {
     46   INT,
     47   MPreserved1,
     48   PMI,
     49   MPreserved2,
     50   NMI,
     51   INIT,
     52   MPreserved3,
     53   ExtINT
     54 } EFI_DELIVERY_MODE;
     55 
     56 //
     57 //  Return values from SAL
     58 //
     59 typedef struct {
     60   EFI_SAL_STATUS  Status; // register r8
     61   UINTN           r9;
     62   UINTN           r10;
     63   UINTN           r11;
     64 } SAL_RETURN_REGS;
     65 
     66 typedef SAL_RETURN_REGS (EFIAPI *SAL_PROC)
     67   (
     68     IN UINT64 FunctionId,
     69     IN UINT64 Arg2,
     70     IN UINT64 Arg3,
     71     IN UINT64 Arg4,
     72     IN UINT64 Arg5,
     73     IN UINT64 Arg6,
     74     IN UINT64 Arg7,
     75     IN UINT64 Arg8
     76   );
     77 
     78 //
     79 // SAL Procedure FunctionId definition
     80 //
     81 #define EFI_SAL_SET_VECTORS             0x01000000
     82 #define EFI_SAL_GET_STATE_INFO          0x01000001
     83 #define EFI_SAL_GET_STATE_INFO_SIZE     0x01000002
     84 #define EFI_SAL_CLEAR_STATE_INFO        0x01000003
     85 #define EFI_SAL_MC_RENDEZ               0x01000004
     86 #define EFI_SAL_MC_SET_PARAMS           0x01000005
     87 #define EFI_SAL_REGISTER_PHYSICAL_ADDR  0x01000006
     88 #define EFI_SAL_CACHE_FLUSH             0x01000008
     89 #define EFI_SAL_CACHE_INIT              0x01000009
     90 #define EFI_SAL_PCI_CONFIG_READ         0x01000010
     91 #define EFI_SAL_PCI_CONFIG_WRITE        0x01000011
     92 #define EFI_SAL_FREQ_BASE               0x01000012
     93 #define EFI_SAL_UPDATE_PAL              0x01000020
     94 
     95 #define EFI_SAL_FUNCTION_ID_MASK        0x0000ffff
     96 #define EFI_SAL_MAX_SAL_FUNCTION_ID     0x00000021
     97 
     98 //
     99 // SAL Procedure parameter definitions
    100 // Not much point in using typedefs or enums because all params
    101 // are UINT64 and the entry point is common
    102 //
    103 // EFI_SAL_SET_VECTORS
    104 //
    105 #define EFI_SAL_SET_MCA_VECTOR          0x0
    106 #define EFI_SAL_SET_INIT_VECTOR         0x1
    107 #define EFI_SAL_SET_BOOT_RENDEZ_VECTOR  0x2
    108 
    109 typedef struct {
    110   UINT64  Length : 32;
    111   UINT64  ChecksumValid : 1;
    112   UINT64  Reserved1 : 7;
    113   UINT64  ByteChecksum : 8;
    114   UINT64  Reserved2 : 16;
    115 } SAL_SET_VECTORS_CS_N;
    116 
    117 //
    118 // EFI_SAL_GET_STATE_INFO, EFI_SAL_GET_STATE_INFO_SIZE,
    119 // EFI_SAL_CLEAR_STATE_INFO
    120 //
    121 #define EFI_SAL_MCA_STATE_INFO  0x0
    122 #define EFI_SAL_INIT_STATE_INFO 0x1
    123 #define EFI_SAL_CMC_STATE_INFO  0x2
    124 #define EFI_SAL_CP_STATE_INFO   0x3
    125 
    126 //
    127 // EFI_SAL_MC_SET_PARAMS
    128 //
    129 #define EFI_SAL_MC_SET_RENDEZ_PARAM 0x1
    130 #define EFI_SAL_MC_SET_WAKEUP_PARAM 0x2
    131 #define EFI_SAL_MC_SET_CPE_PARAM    0x3
    132 
    133 #define EFI_SAL_MC_SET_INTR_PARAM   0x1
    134 #define EFI_SAL_MC_SET_MEM_PARAM    0x2
    135 
    136 //
    137 // EFI_SAL_REGISTER_PAL_PHYSICAL_ADDR
    138 //
    139 #define EFI_SAL_REGISTER_PAL_ADDR 0x0
    140 
    141 //
    142 // EFI_SAL_CACHE_FLUSH
    143 //
    144 #define EFI_SAL_FLUSH_I_CACHE       0x01
    145 #define EFI_SAL_FLUSH_D_CACHE       0x02
    146 #define EFI_SAL_FLUSH_BOTH_CACHE    0x03
    147 #define EFI_SAL_FLUSH_MAKE_COHERENT 0x04
    148 
    149 //
    150 // EFI_SAL_PCI_CONFIG_READ, EFI_SAL_PCI_CONFIG_WRITE
    151 //
    152 #define EFI_SAL_PCI_CONFIG_ONE_BYTE   0x1
    153 #define EFI_SAL_PCI_CONFIG_TWO_BYTES  0x2
    154 #define EFI_SAL_PCI_CONFIG_FOUR_BYTES 0x4
    155 
    156 typedef struct {
    157   UINT64  Register : 8;
    158   UINT64  Function : 3;
    159   UINT64  Device : 5;
    160   UINT64  Bus : 8;
    161   UINT64  Segment : 8;
    162   UINT64  Reserved : 32;
    163 } SAL_PCI_ADDRESS;
    164 
    165 //
    166 // EFI_SAL_FREQ_BASE
    167 //
    168 #define EFI_SAL_CPU_INPUT_FREQ_BASE     0x0
    169 #define EFI_SAL_PLATFORM_IT_FREQ_BASE   0x1
    170 #define EFI_SAL_PLATFORM_RTC_FREQ_BASE  0x2
    171 
    172 //
    173 // EFI_SAL_UPDATE_PAL
    174 //
    175 #define EFI_SAL_UPDATE_BAD_PAL_VERSION  ((UINT64) -1)
    176 #define EFI_SAL_UPDATE_PAL_AUTH_FAIL    ((UINT64) -2)
    177 #define EFI_SAL_UPDATE_PAL_BAD_TYPE     ((UINT64) -3)
    178 #define EFI_SAL_UPDATE_PAL_READONLY     ((UINT64) -4)
    179 #define EFI_SAL_UPDATE_PAL_WRITE_FAIL   ((UINT64) -10)
    180 #define EFI_SAL_UPDATE_PAL_ERASE_FAIL   ((UINT64) -11)
    181 #define EFI_SAL_UPDATE_PAL_READ_FAIL    ((UINT64) -12)
    182 #define EFI_SAL_UPDATE_PAL_CANT_FIT     ((UINT64) -13)
    183 
    184 typedef struct {
    185   UINT32  Size;
    186   UINT32  MmddyyyyDate;
    187   UINT16  Version;
    188   UINT8   Type;
    189   UINT8   Reserved[5];
    190   UINT64  FwVendorId;
    191 } SAL_UPDATE_PAL_DATA_BLOCK;
    192 
    193 typedef struct _SAL_UPDATE_PAL_INFO_BLOCK {
    194   struct _SAL_UPDATE_PAL_INFO_BLOCK *Next;
    195   struct SAL_UPDATE_PAL_DATA_BLOCK  *DataBlock;
    196   UINT8                             StoreChecksum;
    197   UINT8                             Reserved[15];
    198 } SAL_UPDATE_PAL_INFO_BLOCK;
    199 
    200 //
    201 // SAL System Table Definitions
    202 //
    203 #pragma pack(1)
    204 typedef struct {
    205   UINT32  Signature;
    206   UINT32  Length;
    207   UINT16  SalRevision;
    208   UINT16  EntryCount;
    209   UINT8   CheckSum;
    210   UINT8   Reserved[7];
    211   UINT16  SalAVersion;
    212   UINT16  SalBVersion;
    213   UINT8   OemId[32];
    214   UINT8   ProductId[32];
    215   UINT8   Reserved2[8];
    216 } SAL_SYSTEM_TABLE_HEADER;
    217 #pragma pack()
    218 
    219 #define EFI_SAL_ST_HEADER_SIGNATURE "SST_"
    220 #define EFI_SAL_REVISION            0x0300
    221 //
    222 // SAL System Types
    223 //
    224 #define EFI_SAL_ST_ENTRY_POINT        0
    225 #define EFI_SAL_ST_MEMORY_DESCRIPTOR  1
    226 #define EFI_SAL_ST_PLATFORM_FEATURES  2
    227 #define EFI_SAL_ST_TR_USAGE           3
    228 #define EFI_SAL_ST_PTC                4
    229 #define EFI_SAL_ST_AP_WAKEUP          5
    230 
    231 #pragma pack(1)
    232 typedef struct {
    233   UINT8   Type; //  Type == 0
    234   UINT8   Reserved[7];
    235   UINT64  PalProcEntry;
    236   UINT64  SalProcEntry;
    237   UINT64  SalGlobalDataPointer;
    238   UINT64  Reserved2[2];
    239 } SAL_ST_ENTRY_POINT_DESCRIPTOR;
    240 
    241 //
    242 // Not needed for Itanium-based OS boot
    243 //
    244 typedef struct {
    245   UINT8   Type; //  Type == 1
    246   UINT8   NeedVirtualRegistration;
    247   UINT8   MemoryAttributes;
    248   UINT8   PageAccessRights;
    249   UINT8   SupportedAttributes;
    250   UINT8   Reserved;
    251   UINT8   MemoryType;
    252   UINT8   MemoryUsage;
    253   UINT64  PhysicalMemoryAddress;
    254   UINT32  Length;
    255   UINT32  Reserved1;
    256   UINT64  OemReserved;
    257 } SAL_ST_MEMORY_DESCRIPTOR_ENTRY;
    258 
    259 #pragma pack()
    260 //
    261 // Memory Attributes
    262 //
    263 #define SAL_MDT_ATTRIB_WB 0x00
    264 //
    265 // #define SAL_MDT_ATTRIB_UC   0x02
    266 //
    267 #define SAL_MDT_ATTRIB_UC   0x04
    268 #define SAL_MDT_ATTRIB_UCE  0x05
    269 #define SAL_MDT_ATTRIB_WC   0x06
    270 
    271 //
    272 // Supported memory Attributes
    273 //
    274 #define SAL_MDT_SUPPORT_WB  0x1
    275 #define SAL_MDT_SUPPORT_UC  0x2
    276 #define SAL_MDT_SUPPORT_UCE 0x4
    277 #define SAL_MDT_SUPPORT_WC  0x8
    278 
    279 //
    280 // Virtual address registration
    281 //
    282 #define SAL_MDT_NO_VA   0x00
    283 #define SAL_MDT_NEED_VA 0x01
    284 //
    285 // MemoryType info
    286 //
    287 #define SAL_REGULAR_MEMORY  0x0000
    288 #define SAL_MMIO_MAPPING    0x0001
    289 #define SAL_SAPIC_IPI_BLOCK 0x0002
    290 #define SAL_IO_PORT_MAPPING 0x0003
    291 #define SAL_FIRMWARE_MEMORY 0x0004
    292 #define SAL_BLACK_HOLE      0x000A
    293 //
    294 // Memory Usage info
    295 //
    296 #define SAL_MDT_USAGE_UNSPECIFIED 0x00
    297 #define SAL_PAL_CODE              0x01
    298 #define SAL_BOOTSERVICE_CODE      0x02
    299 #define SAL_BOOTSERVICE_DATA      0x03
    300 #define SAL_RUNTIMESERVICE_CODE   0x04
    301 #define SAL_RUNTIMESERVICE_DATA   0x05
    302 #define SAL_IA32_OPTIONROM        0x06
    303 #define SAL_IA32_SYSTEMROM        0x07
    304 #define SAL_PMI_CODE              0x0a
    305 #define SAL_PMI_DATA              0x0b
    306 
    307 #pragma pack(1)
    308 typedef struct {
    309   UINT8 Type;                     // Type == 2
    310   UINT8 PlatformFeatures;
    311   UINT8 Reserved[14];
    312 } SAL_ST_PLATFORM_FEATURES;
    313 #pragma pack()
    314 
    315 #define SAL_PLAT_FEAT_BUS_LOCK      0x01
    316 #define SAL_PLAT_FEAT_PLAT_IPI_HINT 0x02
    317 #define SAL_PLAT_FEAT_PROC_IPI_HINT 0x04
    318 
    319 #pragma pack(1)
    320 typedef struct {
    321   UINT8   Type;                   // Type == 3
    322   UINT8   TRType;
    323   UINT8   TRNumber;
    324   UINT8   Reserved[5];
    325   UINT64  VirtualAddress;
    326   UINT64  EncodedPageSize;
    327   UINT64  Reserved1;
    328 } SAL_ST_TR_DECRIPTOR;
    329 #pragma pack()
    330 
    331 #define EFI_SAL_ST_TR_USAGE_INSTRUCTION 00
    332 #define EFI_SAL_ST_TR_USAGE_DATA        01
    333 
    334 #pragma pack(1)
    335 typedef struct {
    336   UINT64  NumberOfProcessors;
    337   UINT64  LocalIDRegister;
    338 } SAL_COHERENCE_DOMAIN_INFO;
    339 #pragma pack()
    340 
    341 #pragma pack(1)
    342 typedef struct {
    343   UINT8                     Type; // Type == 4
    344   UINT8                     Reserved[3];
    345   UINT32                    NumberOfDomains;
    346   SAL_COHERENCE_DOMAIN_INFO *DomainInformation;
    347 } SAL_ST_CACHE_COHERENCE_DECRIPTOR;
    348 #pragma pack()
    349 
    350 #pragma pack(1)
    351 typedef struct {
    352   UINT8   Type;                   // Type == 5
    353   UINT8   WakeUpType;
    354   UINT8   Reserved[6];
    355   UINT64  ExternalInterruptVector;
    356 } SAL_ST_AP_WAKEUP_DECRIPTOR;
    357 #pragma pack()
    358 //
    359 // FIT Entry
    360 //
    361 #define EFI_SAL_FIT_ENTRY_PTR   (0x100000000 - 32)  // 4GB - 24
    362 #define EFI_SAL_FIT_PALA_ENTRY  (0x100000000 - 48)  // 4GB - 32
    363 #define EFI_SAL_FIT_PALB_TYPE   01
    364 
    365 typedef struct {
    366   UINT64  Address;
    367   UINT8   Size[3];
    368   UINT8   Reserved;
    369   UINT16  Revision;
    370   UINT8   Type : 7;
    371   UINT8   CheckSumValid : 1;
    372   UINT8   CheckSum;
    373 } EFI_SAL_FIT_ENTRY;
    374 
    375 //
    376 //  SAL Common Record Header
    377 //
    378 typedef struct {
    379   UINT16  Length;
    380   UINT8   Data[1024];
    381 } SAL_OEM_DATA;
    382 
    383 typedef struct {
    384   UINT8 Seconds;
    385   UINT8 Minutes;
    386   UINT8 Hours;
    387   UINT8 Reserved;
    388   UINT8 Day;
    389   UINT8 Month;
    390   UINT8 Year;
    391   UINT8 Century;
    392 } SAL_TIME_STAMP;
    393 
    394 typedef struct {
    395   UINT64          RecordId;
    396   UINT16          Revision;
    397   UINT8           ErrorSeverity;
    398   UINT8           ValidationBits;
    399   UINT32          RecordLength;
    400   SAL_TIME_STAMP  TimeStamp;
    401   UINT8           OemPlatformId[16];
    402 } SAL_RECORD_HEADER;
    403 
    404 typedef struct {
    405   EFI_GUID  Guid;
    406   UINT16    Revision;
    407   UINT8     ErrorRecoveryInfo;
    408   UINT8     Reserved;
    409   UINT32    SectionLength;
    410 } SAL_SEC_HEADER;
    411 
    412 //
    413 // SAL Processor Record
    414 //
    415 #define SAL_PROCESSOR_ERROR_RECORD_INFO \
    416   { \
    417     0xe429faf1, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    418   }
    419 
    420 #define CHECK_INFO_VALID_BIT_MASK   0x1
    421 #define REQUESTOR_ID_VALID_BIT_MASK 0x2
    422 #define RESPONDER_ID_VALID_BIT_MASK 0x4
    423 #define TARGER_ID_VALID_BIT_MASK    0x8
    424 #define PRECISE_IP_VALID_BIT_MASK   0x10
    425 
    426 typedef struct {
    427   UINT64  InfoValid : 1;
    428   UINT64  ReqValid : 1;
    429   UINT64  RespValid : 1;
    430   UINT64  TargetValid : 1;
    431   UINT64  IpValid : 1;
    432   UINT64  Reserved : 59;
    433   UINT64  Info;
    434   UINT64  Req;
    435   UINT64  Resp;
    436   UINT64  Target;
    437   UINT64  Ip;
    438 } MOD_ERROR_INFO;
    439 
    440 typedef struct {
    441   UINT8 CpuidInfo[40];
    442   UINT8 Reserved;
    443 } CPUID_INFO;
    444 
    445 typedef struct {
    446   UINT64  FrLow;
    447   UINT64  FrHigh;
    448 } FR_STRUCT;
    449 
    450 #define MIN_STATE_VALID_BIT_MASK  0x1
    451 #define BR_VALID_BIT_MASK         0x2
    452 #define CR_VALID_BIT_MASK         0x4
    453 #define AR_VALID_BIT_MASK         0x8
    454 #define RR_VALID_BIT_MASK         0x10
    455 #define FR_VALID_BIT_MASK         0x20
    456 
    457 typedef struct {
    458   UINT64    ValidFieldBits;
    459   UINT8     MinStateInfo[1024];
    460   UINT64    Br[8];
    461   UINT64    Cr[128];
    462   UINT64    Ar[128];
    463   UINT64    Rr[8];
    464   FR_STRUCT Fr[128];
    465 } PSI_STATIC_STRUCT;
    466 
    467 #define PROC_ERROR_MAP_VALID_BIT_MASK       0x1
    468 #define PROC_STATE_PARAMETER_VALID_BIT_MASK 0x2
    469 #define PROC_CR_LID_VALID_BIT_MASK          0x4
    470 #define PROC_STATIC_STRUCT_VALID_BIT_MASK   0x8
    471 #define CPU_INFO_VALID_BIT_MASK             0x1000000
    472 
    473 typedef struct {
    474   SAL_SEC_HEADER    SectionHeader;
    475   UINT64            ValidationBits;
    476   UINT64            ProcErrorMap;
    477   UINT64            ProcStateParameter;
    478   UINT64            ProcCrLid;
    479   MOD_ERROR_INFO    CacheError[15];
    480   MOD_ERROR_INFO    TlbError[15];
    481   MOD_ERROR_INFO    BusError[15];
    482   MOD_ERROR_INFO    RegFileCheck[15];
    483   MOD_ERROR_INFO    MsCheck[15];
    484   CPUID_INFO        CpuInfo;
    485   PSI_STATIC_STRUCT PsiValidData;
    486 } SAL_PROCESSOR_ERROR_RECORD;
    487 
    488 //
    489 //  Sal Platform memory Error Record
    490 //
    491 #define SAL_MEMORY_ERROR_RECORD_INFO \
    492   { \
    493     0xe429faf2, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    494   }
    495 
    496 #define MEMORY_ERROR_STATUS_VALID_BIT_MASK                0x1
    497 #define MEMORY_PHYSICAL_ADDRESS_VALID_BIT_MASK            0x2
    498 #define MEMORY_ADDR_BIT_MASK                              0x4
    499 #define MEMORY_NODE_VALID_BIT_MASK                        0x8
    500 #define MEMORY_CARD_VALID_BIT_MASK                        0x10
    501 #define MEMORY_MODULE_VALID_BIT_MASK                      0x20
    502 #define MEMORY_BANK_VALID_BIT_MASK                        0x40
    503 #define MEMORY_DEVICE_VALID_BIT_MASK                      0x80
    504 #define MEMORY_ROW_VALID_BIT_MASK                         0x100
    505 #define MEMORY_COLUMN_VALID_BIT_MASK                      0x200
    506 #define MEMORY_BIT_POSITION_VALID_BIT_MASK                0x400
    507 #define MEMORY_PLATFORM_REQUESTOR_ID_VALID_BIT_MASK       0x800
    508 #define MEMORY_PLATFORM_RESPONDER_ID_VALID_BIT_MASK       0x1000
    509 #define MEMORY_PLATFORM_TARGET_VALID_BIT_MASK             0x2000
    510 #define MEMORY_PLATFORM_BUS_SPECIFIC_DATA_VALID_BIT_MASK  0x4000
    511 #define MEMORY_PLATFORM_OEM_ID_VALID_BIT_MASK             0x8000
    512 #define MEMORY_PLATFORM_OEM_DATA_STRUCT_VALID_BIT_MASK    0x10000
    513 
    514 typedef struct {
    515   SAL_SEC_HEADER  SectionHeader;
    516   UINT64          ValidationBits;
    517   UINT64          MemErrorStatus;
    518   UINT64          MemPhysicalAddress;
    519   UINT64          MemPhysicalAddressMask;
    520   UINT16          MemNode;
    521   UINT16          MemCard;
    522   UINT16          MemModule;
    523   UINT16          MemBank;
    524   UINT16          MemDevice;
    525   UINT16          MemRow;
    526   UINT16          MemColumn;
    527   UINT16          MemBitPosition;
    528   UINT64          ModRequestorId;
    529   UINT64          ModResponderId;
    530   UINT64          ModTargetId;
    531   UINT64          BusSpecificData;
    532   UINT8           MemPlatformOemId[16];
    533 } SAL_MEMORY_ERROR_RECORD;
    534 
    535 //
    536 //  PCI BUS Errors
    537 //
    538 #define SAL_PCI_BUS_ERROR_RECORD_INFO \
    539   { \
    540     0xe429faf4, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    541   }
    542 
    543 #define PCI_BUS_ERROR_STATUS_VALID_BIT_MASK     0x1
    544 #define PCI_BUS_ERROR_TYPE_VALID_BIT_MASK       0x2
    545 #define PCI_BUS_ID_VALID_BIT_MASK               0x4
    546 #define PCI_BUS_ADDRESS_VALID_BIT_MASK          0x8
    547 #define PCI_BUS_DATA_VALID_BIT_MASK             0x10
    548 #define PCI_BUS_CMD_VALID_BIT_MASK              0x20
    549 #define PCI_BUS_REQUESTOR_ID_VALID_BIT_MASK     0x40
    550 #define PCI_BUS_RESPONDER_ID_VALID_BIT_MASK     0x80
    551 #define PCI_BUS_TARGET_VALID_BIT_MASK           0x100
    552 #define PCI_BUS_OEM_ID_VALID_BIT_MASK           0x200
    553 #define PCI_BUS_OEM_DATA_STRUCT_VALID_BIT_MASK  0x400
    554 
    555 typedef enum {
    556   Unknown,
    557   DataParityError,
    558   SystemError,
    559   MasterAbort,
    560   BusTimeout,
    561   MasterDataParityError,
    562   AddressParityError,
    563   CommandParityError
    564 } PCI_BUS_ERROR_TYPE;
    565 
    566 typedef struct {
    567   UINT8 BusNumber;
    568   UINT8 SegmentNumber;
    569 } PCI_BUS_ID;
    570 
    571 typedef struct {
    572   SAL_SEC_HEADER  SectionHeader;
    573   UINT64          ValidationBits;
    574   UINT64          PciBusErrorStatus;
    575   UINT16          PciBusErrorType;
    576   PCI_BUS_ID      PciBusId;
    577   UINT32          Reserved;
    578   UINT64          PciBusAddress;
    579   UINT64          PciBusData;
    580   UINT64          PciBusCommand;
    581   UINT64          PciBusRequestorId;
    582   UINT64          PciBusResponderId;
    583   UINT64          PciBusTargetId;
    584   UINT8           PciBusOemId[16];
    585 } SAL_PCI_BUS_ERROR_RECORD;
    586 
    587 //
    588 //  PCI Component Errors
    589 //
    590 #define SAL_PCI_COMP_ERROR_RECORD_INFO \
    591   { \
    592     0xe429faf6, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    593   }
    594 
    595 #define PCI_COMP_ERROR_STATUS_VALID_BIT_MASK    0x1
    596 #define PCI_COMP_INFO_VALID_BIT_MASK            0x2
    597 #define PCI_COMP_MEM_NUM_VALID_BIT_MASK         0x4
    598 #define PCI_COMP_IO_NUM_VALID_BIT_MASK          0x8
    599 #define PCI_COMP_REG_DATA_PAIR_VALID_BIT_MASK   0x10
    600 #define PCI_COMP_OEM_DATA_STRUCT_VALID_BIT_MASK 0x20
    601 
    602 typedef struct {
    603   UINT16  VendorId;
    604   UINT16  DeviceId;
    605   UINT8   ClassCode[3];
    606   UINT8   FunctionNumber;
    607   UINT8   DeviceNumber;
    608   UINT8   BusNumber;
    609   UINT8   SegmentNumber;
    610   UINT8   Reserved[5];
    611 } PCI_COMP_INFO;
    612 
    613 typedef struct {
    614   SAL_SEC_HEADER  SectionHeader;
    615   UINT64          ValidationBits;
    616   UINT64          PciComponentErrorStatus;
    617   PCI_COMP_INFO   PciComponentInfo;
    618   UINT32          PciComponentMemNum;
    619   UINT32          PciComponentIoNum;
    620   UINT8           PciBusOemId[16];
    621 } SAL_PCI_COMPONENT_ERROR_RECORD;
    622 
    623 //
    624 //  Sal Device Errors Info.
    625 //
    626 #define SAL_DEVICE_ERROR_RECORD_INFO \
    627   { \
    628     0xe429faf3, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    629   }
    630 
    631 #define SEL_RECORD_ID_VALID_BIT_MASK      0x1;
    632 #define SEL_RECORD_TYPE_VALID_BIT_MASK    0x2;
    633 #define SEL_GENERATOR_ID_VALID_BIT_MASK   0x4;
    634 #define SEL_EVM_REV_VALID_BIT_MASK        0x8;
    635 #define SEL_SENSOR_TYPE_VALID_BIT_MASK    0x10;
    636 #define SEL_SENSOR_NUM_VALID_BIT_MASK     0x20;
    637 #define SEL_EVENT_DIR_TYPE_VALID_BIT_MASK 0x40;
    638 #define SEL_EVENT_DATA1_VALID_BIT_MASK    0x80;
    639 #define SEL_EVENT_DATA2_VALID_BIT_MASK    0x100;
    640 #define SEL_EVENT_DATA3_VALID_BIT_MASK    0x200;
    641 
    642 typedef struct {
    643   SAL_SEC_HEADER  SectionHeader;
    644   UINT64          ValidationBits;
    645   UINT16          SelRecordId;
    646   UINT8           SelRecordType;
    647   UINT32          TimeStamp;
    648   UINT16          GeneratorId;
    649   UINT8           EvmRevision;
    650   UINT8           SensorType;
    651   UINT8           SensorNum;
    652   UINT8           EventDirType;
    653   UINT8           Data1;
    654   UINT8           Data2;
    655   UINT8           Data3;
    656 } SAL_DEVICE_ERROR_RECORD;
    657 
    658 //
    659 //  Sal SMBIOS Device Errors Info.
    660 //
    661 #define SAL_SMBIOS_ERROR_RECORD_INFO \
    662   { \
    663     0xe429faf5, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    664   }
    665 
    666 #define SMBIOS_EVENT_TYPE_VALID_BIT_MASK  0x1
    667 #define SMBIOS_LENGTH_VALID_BIT_MASK      0x2
    668 #define SMBIOS_TIME_STAMP_VALID_BIT_MASK  0x4
    669 #define SMBIOS_DATA_VALID_BIT_MASK        0x8
    670 
    671 typedef struct {
    672   SAL_SEC_HEADER  SectionHeader;
    673   UINT64          ValidationBits;
    674   UINT8           SmbiosEventType;
    675   UINT8           SmbiosLength;
    676   UINT8           SmbiosBcdTimeStamp[6];
    677 } SAL_SMBIOS_DEVICE_ERROR_RECORD;
    678 
    679 //
    680 //  Sal Platform Specific Errors Info.
    681 //
    682 #define SAL_PLATFORM_ERROR_RECORD_INFO \
    683   { \
    684     0xe429faf7, 0x3cb7, 0x11d4, {0xbc, 0xa7, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} \
    685   }
    686 
    687 #define PLATFORM_ERROR_STATUS_VALID_BIT_MASK    0x1
    688 #define PLATFORM_REQUESTOR_ID_VALID_BIT_MASK    0x2
    689 #define PLATFORM_RESPONDER_ID_VALID_BIT_MASK    0x4
    690 #define PLATFORM_TARGET_VALID_BIT_MASK          0x8
    691 #define PLATFORM_SPECIFIC_DATA_VALID_BIT_MASK   0x10
    692 #define PLATFORM_OEM_ID_VALID_BIT_MASK          0x20
    693 #define PLATFORM_OEM_DATA_STRUCT_VALID_BIT_MASK 0x40
    694 #define PLATFORM_OEM_DEVICE_PATH_VALID_BIT_MASK 0x80
    695 
    696 typedef struct {
    697   SAL_SEC_HEADER  SectionHeader;
    698   UINT64          ValidationBits;
    699   UINT64          PlatformErrorStatus;
    700   UINT64          PlatformRequestorId;
    701   UINT64          PlatformResponderId;
    702   UINT64          PlatformTargetId;
    703   UINT64          PlatformBusSpecificData;
    704   UINT8           OemComponentId[16];
    705 } SAL_PLATFORM_SPECIFIC_ERROR_RECORD;
    706 
    707 //
    708 // Union of all the possible Sal Record Types
    709 //
    710 typedef union {
    711   SAL_RECORD_HEADER                   *RecordHeader;
    712   SAL_PROCESSOR_ERROR_RECORD          *SalProcessorRecord;
    713   SAL_PCI_BUS_ERROR_RECORD            *SalPciBusRecord;
    714   SAL_PCI_COMPONENT_ERROR_RECORD      *SalPciComponentRecord;
    715   SAL_DEVICE_ERROR_RECORD             *ImpiRecord;
    716   SAL_SMBIOS_DEVICE_ERROR_RECORD      *SmbiosRecord;
    717   SAL_PLATFORM_SPECIFIC_ERROR_RECORD  *PlatformRecord;
    718   SAL_MEMORY_ERROR_RECORD             *MemoryRecord;
    719   UINT8                               *Raw;
    720 } SAL_ERROR_RECORDS_POINTERS;
    721 
    722 #pragma pack()
    723 
    724 #endif
    725