1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
/* $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_ */
|