Home | History | Annotate | Download | only in Common
      1 /* $NoKeywords */
      2 /**
      3  * @file
      4  *
      5  * Iscp.h
      6  *
      7  * Contains common ISCP-related structures and defines.
      8  *
      9  * @xrefitem bom "File Content Label" "Release Content"
     10  * @e project: FDK
     11  * @e sub-project: UEFI
     12  * @e version: $Revision: 338015 $ @e date: $Date: 2016-04-04 10:40:16 -0500 (Mon, 04 Apr 2016) $
     13  *
     14  */
     15 /*****************************************************************************
     16 *
     17 *  Copyright 2013 - 2016 ADVANCED MICRO DEVICES, INC.  All Rights Reserved.
     18 *
     19 *  This program and the accompanying materials are licensed and made available
     20 *  under the terms and conditions of the BSD License which accompanies this
     21 *  distribution. The full text of the license may be found at
     22 *  http://opensource.org/licenses/bsd-license.php
     23 *
     24 *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     25 *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
     26 *  IMPLIED.
     27 *
     28 ***************************************************************************/
     29 
     30 //#########################################################################
     31 //#########################################################################
     32 //#########################################################################
     33 //        NOTE: This file shared between SCP and UEFI, make sure all     //
     34 //              changes are reflected in both copies.                    //
     35 //#########################################################################
     36 //#########################################################################
     37 //#########################################################################
     38 
     39 #ifndef ISCP_H_
     40 #define ISCP_H_
     41 
     42 #ifdef __cplusplus
     43   extern "C" {
     44   #endif
     45 
     46 /*----------------------------------------------------------------------------------------
     47  *                             M O D U L E S    U S E D
     48  *----------------------------------------------------------------------------------------
     49  */
     50   #include "SocConfiguration.h"
     51   #include "IscpConfig.h"
     52   #include "CoreState.h"
     53   #include "MemSetup.h"
     54   #include "MemIscp.h"
     55   #include "UartLineSettings.h"
     56   #include "CpuIscp.h"
     57   #include "NetworkAddress.h"
     58 
     59 /*----------------------------------------------------------------------------------------
     60  *                  T Y P E D E F S     A N D     S T R U C T U R E S
     61  *----------------------------------------------------------------------------------------
     62  */
     63 
     64 // *** NOTE: This controls the size of a queue in SRAM. This is the
     65 // maximum number of elements that will fit, without changing the
     66 // overall SRAM layout.
     67 #define ISCP_ECC_EVENT_QUEUE_SIZE    8
     68 
     69   /// Types of ECC errors
     70   typedef enum _ECC_FAIL_TYPE {
     71     ECC_FAIL_NO_ERROR = 0,            ///< ECC No Error
     72     ECC_FAIL_CORRECTABLE,             ///< ECC Multiple Correctable Error
     73     ECC_FAIL_CORRECTABLE_MULTIPLE,    ///< ECC Correctable Multiple Error
     74     ECC_FAIL_UNCORRECTABLE,           ///< ECC Correctable Error
     75     ECC_FAIL_UNCORRECTABLE_MULTIPLE,  ///< ECC Uncorrectable Multiple Error
     76     ECC_FAIL_PARITY,                  ///< ECC Parity Error
     77     ECC_FAIL_END                      ///< End of ECC Fail Types
     78   } ECC_FAIL_TYPE;
     79 
     80   /// ISCP ECC error events
     81   typedef struct _ISCP_ECC_EVENT_DETAILS {
     82     UINT64 Address;            ///< Address
     83     UINT64 PhysicalAddress;    ///< DRAM Physical Address
     84     UINT64 Data;               ///< Data
     85     UINT32 Channel;            ///< DRAM Channel
     86     UINT32 SourceId;           ///< Scource ID
     87     UINT32 Syndrome;           ///< ECC Syndrome
     88     UINT32 Type;               ///< Restricted to ECC_FAIL_TYPE values
     89     UINT32 Module;             ///< DRAM Module
     90     UINT32 Bank;               ///< DRAM Bank
     91     UINT32 Row;                ///< DRAM Row
     92     UINT32 Column;             ///< DRAM Column
     93   } ISCP_ECC_EVENT_DETAILS;
     94 
     95   /// ISCP Block Transfer Memory Buffer
     96   typedef struct {
     97     UINT64  BuffAddress;                      ///< 64-Bit Communication Buffer Address
     98     UINT64  BufferSize;                       ///< 64-Bit Communication Buffer Size
     99   } BLOCK_TRANSFER_BUFFER;
    100 
    101   /// ISCP Data Window
    102   typedef struct {
    103     union {
    104       UINT8   szData[248];                       ///< 8-bit ISCP data array
    105       BLOCK_TRANSFER_BUFFER BlockTransferBuffer; ///< ISCP Memory block Transfer Buffer structure
    106     } Data;
    107   } DATA_WINDOW;
    108 
    109   /// ISCP Communication Block. This structure must fit within the 4K SRAM area.
    110   typedef struct {
    111     UINT32  Signature;                        ///< Command Signature
    112     UINT8   BlockLength;                      ///< Block Length of the entire message
    113     UINT8   RequestCode;                      ///< Request Code - Operation Requested by the recipient
    114     UINT8   ResponseCode;                     ///< Response Code - Response Code from recipient
    115     UINT8   DataLength;                       ///< Data Length - Length in bytes of data
    116                                               ///< being transmitted, zero if MEMORY_BUFFER is used
    117     DATA_WINDOW   DataWin;                    ///< Data Window Union (This completes the 256 byte header)
    118     UINT8   ExtraPayload[3072];               ///< Reserved for large payloads (A maximum of 3K)
    119     ISCP_ECC_EVENT_DETAILS FatalEccEvent;     ///< Only one fatal ECC error event needed (56 bytes)
    120     ISCP_ECC_EVENT_DETAILS EccEventList[ISCP_ECC_EVENT_QUEUE_SIZE];   ///< List of ECC error events (448 bytes, which nearly finishes the 4K area)
    121     UINT8   HeadIndex;                        ///< Index of first ECC event, when head == tail queue is empty
    122     UINT8   TailIndex;                        ///< Index of empty queue entry, to be filled next.
    123     UINT8   Overflow;                         ///< Indicates a queue overflow, saturates at 0xFF
    124   } ISCP_COMM_BLOCK __attribute__ ((__aligned__ (64)));
    125 
    126   /// Memory info HOB structure
    127   typedef struct {
    128     UINT32  Version;                          ///< Version of HOB structure
    129     UINT32  NumberOfDescriptor;               ///< Number of memory range descriptor
    130     AMD_MEMORY_RANGE_DESCRIPTOR  Ranges;      ///< Memory ranges
    131   } ISCP_MEMORY_INFO;
    132 
    133   /// SMBIOS Memory Buffer structure
    134   typedef struct {
    135     ISCP_TYPE16_SMBIOS_INFO      T16;         ///< SMBIOS Type 16 Record Data
    136     ISCP_TYPE17_SMBIOS_INFO      T17[2][2];   ///< SMBIOS Type 17 Record Data
    137     ISCP_TYPE19_SMBIOS_INFO      T19;         ///< SMBIOS Type 19 Record Data
    138   } AMD_SMBIOS_MEM_BUFFER;
    139 
    140   /// SMBIOS CPU Buffer structure
    141   typedef struct {
    142     ISCP_TYPE4_SMBIOS_INFO       T4[1];       ///< SMBIOS Type 4 Record Data
    143     ISCP_TYPE7_SMBIOS_INFO       T7L1[1];     ///< SMBIOS Type 7 Level 1 Cache Record Data
    144     ISCP_TYPE7_SMBIOS_INFO       T7L2[1];     ///< SMBIOS Type 7 Level 2 Cache Record Data
    145     ISCP_TYPE7_SMBIOS_INFO       T7L3[1];     ///< SMBIOS Type 7 Level 3 Cache Record Data
    146   } AMD_SMBIOS_CPU_BUFFER;
    147 
    148   /// SMBIOS Buffer structure
    149   typedef struct {
    150     AMD_SMBIOS_MEM_BUFFER        SmbiosMemBuffer;  ///< SMBIOS Memory Buffer
    151     AMD_SMBIOS_CPU_BUFFER        SmbiosCpuBuffer;  ///< SMBIOS CPU Buffer
    152   } ISCP_SMBIOS_INFO;
    153 
    154   /// NV Data structure
    155   typedef struct {
    156     UINT32  Version;                          ///< Version of NV data structure
    157     UINT32  FvOffset;                         ///< Offset from the base of the UEFI image
    158     UINT32  FvSize;                           ///< Firmware Volume Data Size to be written, read, or erased
    159     UINT8   FvData[64*1024];                  ///< Firmware Volume Data block
    160   } ISCP_OEM_NV_INFO;
    161 
    162   /// Firmware Fuse Buffer structure
    163   typedef struct {
    164     UINT32              Version;              ///< Version of Fuse Info Buffer structure
    165     SocConfiguration    SocConfiguration;     ///< Fuse Structure to be passed to UEFI
    166   } ISCP_FUSE_INFO;
    167 
    168   /// Firmware CPU Reset Buffer structure
    169   typedef struct {
    170     UINT32            Version;                ///< Version of CPU reset Buffer structure
    171     UINT32            CoreNum;                ///< The core number we want data for, e.g. 0,1,2,..
    172     SocCoreStatus     CoreStatus;             ///< Core Status Structure
    173   } ISCP_CPU_RESET_INFO;
    174 
    175   /// Firmware MAC Address structure
    176   typedef struct {
    177     UINT32    Version;                        ///< Version of MAC address Info Buffer structure
    178     UINT8     MacAddress0[6];                 ///< MAC Address 0 10Gb Ethernet port 0
    179     UINT8     MacAddress1[6];                 ///< MAC Address 1 10Gb Ethernet port 1
    180     UINT8     MacAddress2[6];                 ///< MAC Address 2 1Gb Ethernet
    181   } ISCP_MAC_INFO;
    182 
    183   /// ISCP RTC Time structure (Based on subset of EFI_TIME structure)
    184   typedef struct {
    185     UINT32      Version;                      ///< Version of RTC Info Buffer structure
    186     UINT16      Year;                         ///< Year: 2000 - 20XX
    187     UINT8       Month;                        ///< Month:  1 - 12
    188     UINT8       Day;                          ///< Day:  1 - 31
    189     UINT8       Hour;                         ///< Hour: 0 - 23
    190     UINT8       Minute;                       ///< Minute: 0 - 59
    191     UINT8       Second;                       ///< Second: 0 - 59
    192     UINT8       Pad;                          ///< Padding to made structure 32-bit aligned
    193   } ISCP_RTC_INFO;
    194 
    195   /// ISCP PCIE Reset structure
    196   typedef struct {
    197     UINT32      Version;                      ///< Version of PCIE reset Buffer structure
    198     UINT8       ResetSeq;                     ///< Sequence of Reset
    199     UINT16      SVID;                         ///< VRM value / Voltage
    200   } ISCP_PCIE_RESET_INFO;
    201 
    202   /// ISCP Ready To Boot structure
    203   typedef struct {
    204     UINT32         Version;                   ///< Version of Ready To Boot
    205     UINT8          ReadyToBoot;               ///< Signal Ready To Boot Event
    206   } ISCP_READY_TO_BOOT_INFO;
    207 
    208   /// ISCP BMC IP Address structure
    209   typedef struct {
    210     UINT32         Version;                   ///< Version of BMC IP Address
    211     ISCP_BMC_IPV4_ADDRESS  Ipv4Address;       ///< BMC IPv4 Address Structure
    212     ISCP_BMC_IPV6_ADDRESS  Ipv6Address;       ///< BMC IPv6 Address Structure
    213   } ISCP_BMC_IP_ADDRESS_INFO;
    214 
    215   /// EEPROM info structure
    216   typedef struct {
    217     UINT32  Version;                          ///< Version of EEPROM Info structure
    218     UINT32  EepromOffset;                     ///< EEPROM Offset from the base of the UEFI image
    219     UINT32  EepromSize;                       ///< EEPROM Data Size to be written, read, or erased
    220     UINT32  EepromArea;                       ///< EEPROM Area to be affected by read, write,erase commands
    221     UINT8   EepromData[64*1024];              ///< EEPROm Data block [64K]
    222   } ISCP_EEPROM_INFO;
    223 
    224   /// UART info structure. The legal values for these fields are in UartLineSettings.h and are
    225   /// shared between the SCP and UEFI.
    226   typedef struct {
    227     UINT32  Version;                          ///< Version of UART Info structure
    228     UART_LINE_SETTINGS  A57UartConfig;        ///< A57 UART Config
    229   } ISCP_UART_INFO;
    230 
    231   /// Override Command structure
    232   typedef struct {
    233     UINT32         Version;                   ///< Version of Override Command structure
    234     UINT8          Command;                   ///< Override command
    235   } ISCP_OVERRIDE_CMD_INFO;
    236 
    237   /// SATA1 reset structure
    238   typedef struct {
    239     UINT32         Version;                   ///< Version of SATA en/disable structure
    240     UINT8          State;                     ///< Enable/Disable state
    241   } ISCP_SATA1_RESET_INFO;
    242 
    243   /// BMC presence structure
    244   typedef struct {
    245     UINT32         Version;                   ///< Version of BMC presence structure
    246     UINT8          BmcPresent;                ///< BMC presence
    247   } ISCP_BMC_PRESENCE_INFO;
    248 
    249   /// BERT Region structure
    250   typedef struct {
    251     UINT32 IscpVersion;                       ///< Version of BERT Region structure
    252     UINT64 RegionPhysAddr;                    ///< ACPI v6.0: Table 18-319 [Boot Error Region]
    253     UINT32 RegionLength;                      ///< ACPI v6.0: Table 18-319 [Boot Error Region Length]
    254   } ISCP_BERT_REGION_INFO;
    255 
    256   /// SCP Doorbell Record structure
    257   typedef struct {
    258         UINT32 IscpVersion;                       ///< Version of Doorbell Info structure
    259         UINT32 ToggleRateMilliSec;                ///< Doorbell Toggle Rate
    260   } ISCP_SCP_DOORBELL_INFO;
    261 
    262 /*----------------------------------------------------------------------------------------
    263  *                   D E F I N I T I O N S    A N D    M A C R O S
    264  *----------------------------------------------------------------------------------------
    265  */
    266 #define ISCP_TIMEOUT                (1000000)
    267 
    268 // Request Codes
    269 #define ISCP_TRANSACTION_SUCCESS    (0x00)
    270 
    271 #define ISCP_REQ_MEMORY             (0x03)
    272 #define ISCP_RETRIEVE_SETUP         (0x04)
    273 #define ISCP_STORE_SETUP            (0x05)
    274 #define ISCP_FUSE_BLOB              (0x07)
    275 #define ISCP_CPU_RETRIEVE_ID        (0x09)
    276 #define ISCP_CPU_RESET              (0x0A)
    277 #define ISCP_REQ_OEM_NV             (0x0B)
    278 #define ISCP_STORE_OEM_NV           (0x0C)
    279 #define ISCP_ERASE_OEM_NV           (0x0D)
    280 #define ISCP_GET_MAC_ADDRESS        (0x0E)
    281 #define ISCP_SET_MAC_ADDRESS        (0x0F)
    282 #define ISCP_REQ_RTC                (0x10)
    283 #define ISCP_SET_RTC                (0x11)
    284 #define ISCP_GET_SMBIOS             (0x12)
    285 #define ISCP_RESET_PCIE             (0x13)
    286 #define ISCP_READY_TO_BOOT          (0x14)
    287 #define ISCP_GET_BMC_IP             (0x15)
    288 #define ISCP_RETRIEVE_VERSION       (0x16)
    289 #define ISCP_STORE_EEPROM           (0x17)
    290 #define ISCP_REQ_EEPROM             (0x18)
    291 #define ISCP_ERASE_EEPROM           (0x19)
    292 #define ISCP_MEM_SETUP              (0x1A)
    293 #define ISCP_SEND_UART_CONFIG       (0x1C)
    294 #define ISCP_OVERRIDE_CMD           (0x1D)
    295 #define ISCP_SATA1_GET              (0x1E)
    296 #define ISCP_SATA1_SET              (0x1F)
    297 #define ISCP_BMC_PRESENT            (0x20)
    298 #define ISCP_RETRIEVE_BERT_RECORD   (0x21)
    299 #define ISCP_SUBMIT_BERT_RECORD     (0x22)
    300 #define ISCP_POWER_OFF              (0xAA)
    301 #define ISCP_SYSTEM_RESET           (0xBB)
    302 
    303 // Response Codes
    304 #define ISCP_TRANSACTION_SUCCESS    (0x00)
    305 #define ISCP_UNSUCCESSFUL           (0x01)
    306 #define ISCP_INVALID                (0x02)
    307 #define ISCP_SIGNATURE_NOT_FOUND    (0x03)
    308 #define ISCP_NOT_SUPPORTED          (0x04)
    309 #define ISCP_INVALID_BLOCK_LENGTH   (0x05)
    310 #define ISCP_INVALID_REQUEST_CODE   (0x06)
    311 #define ISCP_INVALID_DATA_LENGTH    (0x07)
    312 #define ISCP_NV_WRITE_FAIL          (0x0A)
    313 #define ISCP_NV_READ_FAIL           (0x0B)
    314 #define ISCP_NV_ERASE_FAIL          (0x0C)
    315 #define ISCP_SETUP_READ_FAIL        (0x0D)
    316 #define ISCP_SETUP_WRITE_FAIL       (0x0E)
    317 #define ISCP_EE_WRITE_FAIL          (0x0F)
    318 #define ISCP_EE_READ_FAIL           (0x10)
    319 #define ISCP_EE_ERASE_FAIL          (0x11)
    320 #define ISCP_SMBIOS_FAIL            (0x12)
    321 #define ISCP_INVALID_RESPONSE_CODE  (0xFF)
    322 
    323 // ISCP Signatures
    324 #define BOOT_CORE_SIG               (0x524F4342)   //"BCOR" spelled backwards - Boot Core
    325 #define BERT_SIG                    (0x54524542)   //"BERT" spelled backwards - BERT Error Block Buffer Address
    326 #define BMC_PRESENT_SIG             (0x50434D42)   //"BMCP" spelled backwards - BMC Present
    327 #define BMC_IP_ADDR_SIG             (0x50494D42)   //"BMIP" spelled backwards - BMC IP Address
    328 #define CPU_MP_SIG                  (0x4D555043)   //"CPUM" spelled backwards - CPU Reset
    329 #define DOORBELL_SIG                (0x4C454244)   //"DBEL" spelled backwards - Doorbell
    330 #define EEPROM_SIG                  (0x52504545)   //"EEPR" spelled backwards - EEPROM
    331 #define FUSE_BLOB_SIG               (0x45535546)   //"FUSE" spelled backwards - Fuse blob
    332 #define HOBS_SIG                    (0x53424F48)   //"HOBS" spelled backwards - Memory HOBs buffer
    333 #define GET_MAC_ADDR_SIG            (0x4143414D)   //"MACA" spelled backwards - Get MAC Address
    334 #define OEM_NV_SIG                  (0x564E454F)   //"OENV" spelled backwards - OEM NV Storage save and retrieval actions
    335 #define OVERRIDE_CMD_SIG            (0x4452564F)   //"OVRD" spelled backwards - Override Command
    336 #define PCIE_SIG                    (0x45494350)   //"PCIE" spelled backwards - PCIE Reset
    337 #define READY2BOOT_SIG              (0x54425452)   //"RTBT" spelled backwards - Ready-To-Boot
    338 #define RTC_SIG                     (0x4B435452)   //"RTCK" spelled backwards - Real-Time-Clock
    339 #define SATA1_GET_SIG               (0x47544153)   //"SATG" spelled backwards - SATA 1 get state
    340 #define SATA1_SET_SIG               (0x53544153)   //"SATS" spelled backwards - SATA 1 set state
    341 #define SETUP_SIG                   (0x55544553)   //"SETU" spelled backwards - BIOS Setup
    342 #define SHUTDOWN_SIG                (0x4E444853)   //"SHDN" spelled backwards - System Shutdown
    343 #define SET_MAC_ADDR_SIG            (0x43414D53)   //"SMAC" spelled backwards - Set MAC Address
    344 #define SMBIOS_SIG                  (0x534D4253)   //"SMBS" spelled backwards - SMBIOS
    345 #define UART_SIG                    (0x54524155)   //"UART" spelled backwards - UART Config
    346 
    347 
    348 #define ISCP_BERT_REGION_INFO_VERSION               (0x00000001ul)    ///< Ver: 00.00.00.01
    349 
    350 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES
    351 #define ISCP_BMC_PRESENT_INFO_VERSION               (0x00000001ul)    ///< Ver: 00.00.00.01
    352 #endif
    353 
    354 #define ISCP_BMC_IP_ADDR_INFO_VERSION               (0x00000001ul)    ///< Ver: 00.00.00.01
    355 #define ISCP_CPU_RESET_INFO_VERSION                 (0x00000001ul)    ///< Ver: 00.00.00.01
    356 
    357 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES
    358 #define ISCP_DOORBELL_INFO_VERSION                  (0x00000001ul)    ///< Ver: 00.00.00.01
    359 #endif
    360 
    361 #define ISCP_EEPROM_VERSION                         (0x00000001ul)    ///< Ver: 00.00.00.01
    362 #define ISCP_FUSE_INFO_VERSION                      (0x00000001ul)    ///< Ver: 00.00.00.01
    363 #define ISCP_MEMORY_INFO_VERSION                    (0x00000001ul)    ///< Ver: 00.00.00.01
    364 #define ISCP_MAC_INFO_VERSION                       (0x00000002ul)    ///< Ver: 00.00.00.02
    365 #define ISCP_OEM_NV_VERSION                         (0x00000001ul)    ///< Ver: 00.00.00.01
    366 
    367 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES
    368 #define ISCP_OVERRIDE_CMD_INFO_VERSION              (0x00000001ul)    ///< Ver: 00.00.00.01
    369 #endif
    370 
    371 #define ISCP_PCIE_RESET_INFO_VERSION                (0x00000001ul)    ///< Ver: 00.00.00.01
    372 
    373 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES
    374 #define ISCP_READY2BOOT_INFO_VERSION                (0x00000001ul)    ///< Ver: 00.00.00.01
    375 #endif
    376 
    377 #define ISCP_RTC_INFO_VERSION                       (0x00000001ul)    ///< Ver: 00.00.00.01
    378 
    379 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES
    380 #define ISCP_SATA1_RESET_INFO_VERSION               (0x00000001ul)    ///< Ver: 00.00.00.01
    381 #endif
    382 
    383 #define ISCP_UART_CONFIG_INFO_VERSION               (0x00000001ul)    ///< Ver: 00.00.00.01
    384 
    385 #define ISCP_COMM_BLK_MAX_SIZE                      (0x100)           ///< Max length of ISCP communication block, 256 bytes
    386 #define MAX_NUMBER_OF_EXTENDED_MEMORY_DESCRIPTOR    (2)
    387 #define MAX_SIZEOF_AMD_MEMORY_INFO_HOB_BUFFER       (sizeof (ISCP_MEM_HOB) +  \
    388           (MAX_NUMBER_OF_EXTENDED_MEMORY_DESCRIPTOR * sizeof (AMD_MEMORY_RANGE_DESCRIPTOR)))
    389 #define MAX_SIZEOF_AMD_SETUP_BUFFER                 (sizeof (ISCP_SETUP_INFO))
    390 #define MAX_SIZEOF_AMD_SMBIOS_BUFFER                (sizeof (AMD_ISCP_SMBIOS_INFO))
    391 
    392 #define FOREVER                         for (;;)
    393 #define USE_DRAM_BUFFER                 (0x00)
    394 #define ISCP_BLOCK_LENGTH               (0x08)
    395 
    396   #ifdef __cplusplus
    397   }
    398 #endif
    399 
    400 #endif /* ISCP_H_ */
    401