/* $NoKeywords */ /** * @file * * Iscp.h * * Contains common ISCP-related structures and defines. * * @xrefitem bom "File Content Label" "Release Content" * @e project: FDK * @e sub-project: UEFI * @e version: $Revision: 338015 $ @e date: $Date: 2016-04-04 10:40:16 -0500 (Mon, 04 Apr 2016) $ * */ /***************************************************************************** * * Copyright 2013 - 2016 ADVANCED MICRO DEVICES, INC. All Rights Reserved. * * This program and the accompanying materials are licensed and made available * under the terms and conditions of the BSD License which accompanies this * distribution. The full text of the license may be found at * http://opensource.org/licenses/bsd-license.php * * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR * IMPLIED. * ***************************************************************************/ //######################################################################### //######################################################################### //######################################################################### // NOTE: This file shared between SCP and UEFI, make sure all // // changes are reflected in both copies. // //######################################################################### //######################################################################### //######################################################################### #ifndef ISCP_H_ #define ISCP_H_ #ifdef __cplusplus extern "C" { #endif /*---------------------------------------------------------------------------------------- * M O D U L E S U S E D *---------------------------------------------------------------------------------------- */ #include "SocConfiguration.h" #include "IscpConfig.h" #include "CoreState.h" #include "MemSetup.h" #include "MemIscp.h" #include "UartLineSettings.h" #include "CpuIscp.h" #include "NetworkAddress.h" /*---------------------------------------------------------------------------------------- * T Y P E D E F S A N D S T R U C T U R E S *---------------------------------------------------------------------------------------- */ // *** NOTE: This controls the size of a queue in SRAM. This is the // maximum number of elements that will fit, without changing the // overall SRAM layout. #define ISCP_ECC_EVENT_QUEUE_SIZE 8 /// Types of ECC errors typedef enum _ECC_FAIL_TYPE { ECC_FAIL_NO_ERROR = 0, ///< ECC No Error ECC_FAIL_CORRECTABLE, ///< ECC Multiple Correctable Error ECC_FAIL_CORRECTABLE_MULTIPLE, ///< ECC Correctable Multiple Error ECC_FAIL_UNCORRECTABLE, ///< ECC Correctable Error ECC_FAIL_UNCORRECTABLE_MULTIPLE, ///< ECC Uncorrectable Multiple Error ECC_FAIL_PARITY, ///< ECC Parity Error ECC_FAIL_END ///< End of ECC Fail Types } ECC_FAIL_TYPE; /// ISCP ECC error events typedef struct _ISCP_ECC_EVENT_DETAILS { UINT64 Address; ///< Address UINT64 PhysicalAddress; ///< DRAM Physical Address UINT64 Data; ///< Data UINT32 Channel; ///< DRAM Channel UINT32 SourceId; ///< Scource ID UINT32 Syndrome; ///< ECC Syndrome UINT32 Type; ///< Restricted to ECC_FAIL_TYPE values UINT32 Module; ///< DRAM Module UINT32 Bank; ///< DRAM Bank UINT32 Row; ///< DRAM Row UINT32 Column; ///< DRAM Column } ISCP_ECC_EVENT_DETAILS; /// ISCP Block Transfer Memory Buffer typedef struct { UINT64 BuffAddress; ///< 64-Bit Communication Buffer Address UINT64 BufferSize; ///< 64-Bit Communication Buffer Size } BLOCK_TRANSFER_BUFFER; /// ISCP Data Window typedef struct { union { UINT8 szData[248]; ///< 8-bit ISCP data array BLOCK_TRANSFER_BUFFER BlockTransferBuffer; ///< ISCP Memory block Transfer Buffer structure } Data; } DATA_WINDOW; /// ISCP Communication Block. This structure must fit within the 4K SRAM area. typedef struct { UINT32 Signature; ///< Command Signature UINT8 BlockLength; ///< Block Length of the entire message UINT8 RequestCode; ///< Request Code - Operation Requested by the recipient UINT8 ResponseCode; ///< Response Code - Response Code from recipient UINT8 DataLength; ///< Data Length - Length in bytes of data ///< being transmitted, zero if MEMORY_BUFFER is used DATA_WINDOW DataWin; ///< Data Window Union (This completes the 256 byte header) UINT8 ExtraPayload[3072]; ///< Reserved for large payloads (A maximum of 3K) ISCP_ECC_EVENT_DETAILS FatalEccEvent; ///< Only one fatal ECC error event needed (56 bytes) ISCP_ECC_EVENT_DETAILS EccEventList[ISCP_ECC_EVENT_QUEUE_SIZE]; ///< List of ECC error events (448 bytes, which nearly finishes the 4K area) UINT8 HeadIndex; ///< Index of first ECC event, when head == tail queue is empty UINT8 TailIndex; ///< Index of empty queue entry, to be filled next. UINT8 Overflow; ///< Indicates a queue overflow, saturates at 0xFF } ISCP_COMM_BLOCK __attribute__ ((__aligned__ (64))); /// Memory info HOB structure typedef struct { UINT32 Version; ///< Version of HOB structure UINT32 NumberOfDescriptor; ///< Number of memory range descriptor AMD_MEMORY_RANGE_DESCRIPTOR Ranges; ///< Memory ranges } ISCP_MEMORY_INFO; /// SMBIOS Memory Buffer structure typedef struct { ISCP_TYPE16_SMBIOS_INFO T16; ///< SMBIOS Type 16 Record Data ISCP_TYPE17_SMBIOS_INFO T17[2][2]; ///< SMBIOS Type 17 Record Data ISCP_TYPE19_SMBIOS_INFO T19; ///< SMBIOS Type 19 Record Data } AMD_SMBIOS_MEM_BUFFER; /// SMBIOS CPU Buffer structure typedef struct { ISCP_TYPE4_SMBIOS_INFO T4[1]; ///< SMBIOS Type 4 Record Data ISCP_TYPE7_SMBIOS_INFO T7L1[1]; ///< SMBIOS Type 7 Level 1 Cache Record Data ISCP_TYPE7_SMBIOS_INFO T7L2[1]; ///< SMBIOS Type 7 Level 2 Cache Record Data ISCP_TYPE7_SMBIOS_INFO T7L3[1]; ///< SMBIOS Type 7 Level 3 Cache Record Data } AMD_SMBIOS_CPU_BUFFER; /// SMBIOS Buffer structure typedef struct { AMD_SMBIOS_MEM_BUFFER SmbiosMemBuffer; ///< SMBIOS Memory Buffer AMD_SMBIOS_CPU_BUFFER SmbiosCpuBuffer; ///< SMBIOS CPU Buffer } ISCP_SMBIOS_INFO; /// NV Data structure typedef struct { UINT32 Version; ///< Version of NV data structure UINT32 FvOffset; ///< Offset from the base of the UEFI image UINT32 FvSize; ///< Firmware Volume Data Size to be written, read, or erased UINT8 FvData[64*1024]; ///< Firmware Volume Data block } ISCP_OEM_NV_INFO; /// Firmware Fuse Buffer structure typedef struct { UINT32 Version; ///< Version of Fuse Info Buffer structure SocConfiguration SocConfiguration; ///< Fuse Structure to be passed to UEFI } ISCP_FUSE_INFO; /// Firmware CPU Reset Buffer structure typedef struct { UINT32 Version; ///< Version of CPU reset Buffer structure UINT32 CoreNum; ///< The core number we want data for, e.g. 0,1,2,.. SocCoreStatus CoreStatus; ///< Core Status Structure } ISCP_CPU_RESET_INFO; /// Firmware MAC Address structure typedef struct { UINT32 Version; ///< Version of MAC address Info Buffer structure UINT8 MacAddress0[6]; ///< MAC Address 0 10Gb Ethernet port 0 UINT8 MacAddress1[6]; ///< MAC Address 1 10Gb Ethernet port 1 UINT8 MacAddress2[6]; ///< MAC Address 2 1Gb Ethernet } ISCP_MAC_INFO; /// ISCP RTC Time structure (Based on subset of EFI_TIME structure) typedef struct { UINT32 Version; ///< Version of RTC Info Buffer structure UINT16 Year; ///< Year: 2000 - 20XX UINT8 Month; ///< Month: 1 - 12 UINT8 Day; ///< Day: 1 - 31 UINT8 Hour; ///< Hour: 0 - 23 UINT8 Minute; ///< Minute: 0 - 59 UINT8 Second; ///< Second: 0 - 59 UINT8 Pad; ///< Padding to made structure 32-bit aligned } ISCP_RTC_INFO; /// ISCP PCIE Reset structure typedef struct { UINT32 Version; ///< Version of PCIE reset Buffer structure UINT8 ResetSeq; ///< Sequence of Reset UINT16 SVID; ///< VRM value / Voltage } ISCP_PCIE_RESET_INFO; /// ISCP Ready To Boot structure typedef struct { UINT32 Version; ///< Version of Ready To Boot UINT8 ReadyToBoot; ///< Signal Ready To Boot Event } ISCP_READY_TO_BOOT_INFO; /// ISCP BMC IP Address structure typedef struct { UINT32 Version; ///< Version of BMC IP Address ISCP_BMC_IPV4_ADDRESS Ipv4Address; ///< BMC IPv4 Address Structure ISCP_BMC_IPV6_ADDRESS Ipv6Address; ///< BMC IPv6 Address Structure } ISCP_BMC_IP_ADDRESS_INFO; /// EEPROM info structure typedef struct { UINT32 Version; ///< Version of EEPROM Info structure UINT32 EepromOffset; ///< EEPROM Offset from the base of the UEFI image UINT32 EepromSize; ///< EEPROM Data Size to be written, read, or erased UINT32 EepromArea; ///< EEPROM Area to be affected by read, write,erase commands UINT8 EepromData[64*1024]; ///< EEPROm Data block [64K] } ISCP_EEPROM_INFO; /// UART info structure. The legal values for these fields are in UartLineSettings.h and are /// shared between the SCP and UEFI. typedef struct { UINT32 Version; ///< Version of UART Info structure UART_LINE_SETTINGS A57UartConfig; ///< A57 UART Config } ISCP_UART_INFO; /// Override Command structure typedef struct { UINT32 Version; ///< Version of Override Command structure UINT8 Command; ///< Override command } ISCP_OVERRIDE_CMD_INFO; /// SATA1 reset structure typedef struct { UINT32 Version; ///< Version of SATA en/disable structure UINT8 State; ///< Enable/Disable state } ISCP_SATA1_RESET_INFO; /// BMC presence structure typedef struct { UINT32 Version; ///< Version of BMC presence structure UINT8 BmcPresent; ///< BMC presence } ISCP_BMC_PRESENCE_INFO; /// BERT Region structure typedef struct { UINT32 IscpVersion; ///< Version of BERT Region structure UINT64 RegionPhysAddr; ///< ACPI v6.0: Table 18-319 [Boot Error Region] UINT32 RegionLength; ///< ACPI v6.0: Table 18-319 [Boot Error Region Length] } ISCP_BERT_REGION_INFO; /// SCP Doorbell Record structure typedef struct { UINT32 IscpVersion; ///< Version of Doorbell Info structure UINT32 ToggleRateMilliSec; ///< Doorbell Toggle Rate } ISCP_SCP_DOORBELL_INFO; /*---------------------------------------------------------------------------------------- * D E F I N I T I O N S A N D M A C R O S *---------------------------------------------------------------------------------------- */ #define ISCP_TIMEOUT (1000000) // Request Codes #define ISCP_TRANSACTION_SUCCESS (0x00) #define ISCP_REQ_MEMORY (0x03) #define ISCP_RETRIEVE_SETUP (0x04) #define ISCP_STORE_SETUP (0x05) #define ISCP_FUSE_BLOB (0x07) #define ISCP_CPU_RETRIEVE_ID (0x09) #define ISCP_CPU_RESET (0x0A) #define ISCP_REQ_OEM_NV (0x0B) #define ISCP_STORE_OEM_NV (0x0C) #define ISCP_ERASE_OEM_NV (0x0D) #define ISCP_GET_MAC_ADDRESS (0x0E) #define ISCP_SET_MAC_ADDRESS (0x0F) #define ISCP_REQ_RTC (0x10) #define ISCP_SET_RTC (0x11) #define ISCP_GET_SMBIOS (0x12) #define ISCP_RESET_PCIE (0x13) #define ISCP_READY_TO_BOOT (0x14) #define ISCP_GET_BMC_IP (0x15) #define ISCP_RETRIEVE_VERSION (0x16) #define ISCP_STORE_EEPROM (0x17) #define ISCP_REQ_EEPROM (0x18) #define ISCP_ERASE_EEPROM (0x19) #define ISCP_MEM_SETUP (0x1A) #define ISCP_SEND_UART_CONFIG (0x1C) #define ISCP_OVERRIDE_CMD (0x1D) #define ISCP_SATA1_GET (0x1E) #define ISCP_SATA1_SET (0x1F) #define ISCP_BMC_PRESENT (0x20) #define ISCP_RETRIEVE_BERT_RECORD (0x21) #define ISCP_SUBMIT_BERT_RECORD (0x22) #define ISCP_POWER_OFF (0xAA) #define ISCP_SYSTEM_RESET (0xBB) // Response Codes #define ISCP_TRANSACTION_SUCCESS (0x00) #define ISCP_UNSUCCESSFUL (0x01) #define ISCP_INVALID (0x02) #define ISCP_SIGNATURE_NOT_FOUND (0x03) #define ISCP_NOT_SUPPORTED (0x04) #define ISCP_INVALID_BLOCK_LENGTH (0x05) #define ISCP_INVALID_REQUEST_CODE (0x06) #define ISCP_INVALID_DATA_LENGTH (0x07) #define ISCP_NV_WRITE_FAIL (0x0A) #define ISCP_NV_READ_FAIL (0x0B) #define ISCP_NV_ERASE_FAIL (0x0C) #define ISCP_SETUP_READ_FAIL (0x0D) #define ISCP_SETUP_WRITE_FAIL (0x0E) #define ISCP_EE_WRITE_FAIL (0x0F) #define ISCP_EE_READ_FAIL (0x10) #define ISCP_EE_ERASE_FAIL (0x11) #define ISCP_SMBIOS_FAIL (0x12) #define ISCP_INVALID_RESPONSE_CODE (0xFF) // ISCP Signatures #define BOOT_CORE_SIG (0x524F4342) //"BCOR" spelled backwards - Boot Core #define BERT_SIG (0x54524542) //"BERT" spelled backwards - BERT Error Block Buffer Address #define BMC_PRESENT_SIG (0x50434D42) //"BMCP" spelled backwards - BMC Present #define BMC_IP_ADDR_SIG (0x50494D42) //"BMIP" spelled backwards - BMC IP Address #define CPU_MP_SIG (0x4D555043) //"CPUM" spelled backwards - CPU Reset #define DOORBELL_SIG (0x4C454244) //"DBEL" spelled backwards - Doorbell #define EEPROM_SIG (0x52504545) //"EEPR" spelled backwards - EEPROM #define FUSE_BLOB_SIG (0x45535546) //"FUSE" spelled backwards - Fuse blob #define HOBS_SIG (0x53424F48) //"HOBS" spelled backwards - Memory HOBs buffer #define GET_MAC_ADDR_SIG (0x4143414D) //"MACA" spelled backwards - Get MAC Address #define OEM_NV_SIG (0x564E454F) //"OENV" spelled backwards - OEM NV Storage save and retrieval actions #define OVERRIDE_CMD_SIG (0x4452564F) //"OVRD" spelled backwards - Override Command #define PCIE_SIG (0x45494350) //"PCIE" spelled backwards - PCIE Reset #define READY2BOOT_SIG (0x54425452) //"RTBT" spelled backwards - Ready-To-Boot #define RTC_SIG (0x4B435452) //"RTCK" spelled backwards - Real-Time-Clock #define SATA1_GET_SIG (0x47544153) //"SATG" spelled backwards - SATA 1 get state #define SATA1_SET_SIG (0x53544153) //"SATS" spelled backwards - SATA 1 set state #define SETUP_SIG (0x55544553) //"SETU" spelled backwards - BIOS Setup #define SHUTDOWN_SIG (0x4E444853) //"SHDN" spelled backwards - System Shutdown #define SET_MAC_ADDR_SIG (0x43414D53) //"SMAC" spelled backwards - Set MAC Address #define SMBIOS_SIG (0x534D4253) //"SMBS" spelled backwards - SMBIOS #define UART_SIG (0x54524155) //"UART" spelled backwards - UART Config #define ISCP_BERT_REGION_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES #define ISCP_BMC_PRESENT_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #endif #define ISCP_BMC_IP_ADDR_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #define ISCP_CPU_RESET_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES #define ISCP_DOORBELL_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #endif #define ISCP_EEPROM_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #define ISCP_FUSE_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #define ISCP_MEMORY_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #define ISCP_MAC_INFO_VERSION (0x00000002ul) ///< Ver: 00.00.00.02 #define ISCP_OEM_NV_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES #define ISCP_OVERRIDE_CMD_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #endif #define ISCP_PCIE_RESET_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES #define ISCP_READY2BOOT_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #endif #define ISCP_RTC_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #ifdef THESE_SHOULD_BE_USED_ON_BOTH_SIDES #define ISCP_SATA1_RESET_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #endif #define ISCP_UART_CONFIG_INFO_VERSION (0x00000001ul) ///< Ver: 00.00.00.01 #define ISCP_COMM_BLK_MAX_SIZE (0x100) ///< Max length of ISCP communication block, 256 bytes #define MAX_NUMBER_OF_EXTENDED_MEMORY_DESCRIPTOR (2) #define MAX_SIZEOF_AMD_MEMORY_INFO_HOB_BUFFER (sizeof (ISCP_MEM_HOB) + \ (MAX_NUMBER_OF_EXTENDED_MEMORY_DESCRIPTOR * sizeof (AMD_MEMORY_RANGE_DESCRIPTOR))) #define MAX_SIZEOF_AMD_SETUP_BUFFER (sizeof (ISCP_SETUP_INFO)) #define MAX_SIZEOF_AMD_SMBIOS_BUFFER (sizeof (AMD_ISCP_SMBIOS_INFO)) #define FOREVER for (;;) #define USE_DRAM_BUFFER (0x00) #define ISCP_BLOCK_LENGTH (0x08) #ifdef __cplusplus } #endif #endif /* ISCP_H_ */