/** @file
|
Copies the memory related timing and configuration information into the
|
Compatible BIOS data (BDAT) table.
|
|
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
**/
|
#ifndef _MrcRmtData_h_
|
#define _MrcRmtData_h_
|
|
#include "MrcTypes.h"
|
|
#define VDD_1_350 1350 ///< VDD in millivolts
|
#define VDD_1_500 1500 ///< VDD in millivolts
|
#define PI_STEP_BASE 2048 ///< Magic number from spec
|
#define PI_STEP_INTERVAL 128 ///< tCK is split into this amount of intervals
|
#define PI_STEP ((PI_STEP_BASE) / (PI_STEP_INTERVAL))
|
#define VREF_STEP_BASE 100 ///< Magic number from spec
|
#define TX_VREF_STEP 7800 ///< TX Vref step in microvolts
|
#define TX_VREF(VDD) (((TX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
|
#define RX_VREF_STEP 8000 ///< TX Vref step in microvolts
|
#define RX_VREF(VDD) (((RX_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
|
#define CA_VREF_STEP 8000 ///< TX Vref step in microvolts
|
#define CA_VREF(VDD) (((CA_VREF_STEP) * (VREF_STEP_BASE)) / (VDD)) ///< VDD passed in is in millivolts
|
|
#define MAX_SPD_RMT 512 ///< The maximum amount of data, in bytes, in an SPD structure.
|
#define RMT_PRIMARY_VERSION 4 ///< The BDAT structure that is currently supported.
|
#define RMT_SECONDARY_VERSION 0 ///< The BDAT structure that is currently supported.
|
#define MAX_MODE_REGISTER 7 ///< Number of mode registers
|
#define MAX_DRAM_DEVICE 9 ///< Maximum number of memory devices
|
|
//
|
// Warning: Bdat4.h has its own copy of this #define
|
// make sure to change it in both places
|
//
|
#define MAX_SCHEMA_LIST_LENGTH (10)
|
|
/*
|
Memory Schema GUID
|
This is private GUID used by MemoryInit internally.
|
{CE3F6794-4883-492C-8DBA-2FC098447710}
|
*/
|
#ifdef BDAT_SUPPORT
|
extern EFI_GUID gEfiMemorySchemaGuid;
|
#endif
|
/*
|
GUID for Schema List HOB
|
This is private GUID used by MemoryInit internally.
|
{3047C2AC-5E8E-4C55-A1CB-EAAD0A88861B}
|
*/
|
extern EFI_GUID gMrcSchemaListHobGuid;
|
|
|
#pragma pack(push, 1)
|
|
typedef struct {
|
UINT8 RxDqLeft; ///< Units = piStep
|
UINT8 RxDqRight;
|
UINT8 TxDqLeft;
|
UINT8 TxDqRight;
|
UINT8 RxVrefLow; ///< Units = rxVrefStep
|
UINT8 RxVrefHigh;
|
UINT8 TxVrefLow; ///< Units = txVrefStep
|
UINT8 TxVrefHigh;
|
} BDAT_DQ_MARGIN_STRUCTURE;
|
|
typedef struct {
|
UINT8 RxDqLeft; ///< Units = piStep
|
UINT8 RxDqRight;
|
UINT8 TxDqLeft;
|
UINT8 TxDqRight;
|
UINT8 CmdLeft;
|
UINT8 CmdRight;
|
UINT8 RecvenLeft; ///< Units = recvenStep
|
UINT8 RecvenRight;
|
UINT8 WrLevelLeft; ///< Units = wrLevelStep
|
UINT8 WrLevelRight;
|
UINT8 RxVrefLow; ///< Units = rxVrefStep
|
UINT8 RxVrefHigh;
|
UINT8 TxVrefLow; ///< Units = txVrefStep
|
UINT8 TxVrefHigh;
|
UINT8 CmdVrefLow; ///< Units = caVrefStep
|
UINT8 CmdVrefHigh;
|
} BDAT_RANK_MARGIN_STRUCTURE;
|
|
typedef struct {
|
UINT16 RecEnDelay[MAX_STROBE];
|
UINT16 WlDelay[MAX_STROBE];
|
UINT8 RxDqDelay[MAX_STROBE];
|
UINT8 TxDqDelay[MAX_STROBE];
|
UINT8 ClkDelay;
|
UINT8 CtlDelay;
|
UINT8 CmdDelay[3];
|
UINT8 IoLatency;
|
UINT8 Roundtrip;
|
} BDAT_RANK_TRAINING_STRUCTURE;
|
|
typedef struct {
|
UINT16 ModeRegister[MAX_MODE_REGISTER]; ///< Mode register settings
|
} BDAT_DRAM_MRS_STRUCTURE;
|
|
typedef struct {
|
UINT8 RankEnabled; ///< 0 = Rank disabled
|
UINT8 RankMarginEnabled; ///< 0 = Rank margin disabled
|
UINT8 DqMarginEnabled; ///< 0 = Dq margin disabled
|
BDAT_RANK_MARGIN_STRUCTURE RankMargin; ///< Rank margin data
|
BDAT_DQ_MARGIN_STRUCTURE DqMargin[MAX_DQ]; ///< Array of Dq margin data per rank
|
BDAT_RANK_TRAINING_STRUCTURE RankTraining; ///< Rank training settings
|
BDAT_DRAM_MRS_STRUCTURE RankMRS[MAX_DRAM_DEVICE]; ///< Rank MRS settings
|
} BDAT_RANK_STRUCTURE;
|
|
typedef struct {
|
UINT8 SpdValid[MAX_SPD_RMT / (CHAR_BITS * sizeof (UINT8))]; ///< Each valid bit maps to SPD byte
|
UINT8 SpdData[MAX_SPD_RMT]; ///< Array of raw SPD data bytes
|
} BDAT_SPD_STRUCTURE;
|
|
typedef struct {
|
UINT8 DimmEnabled; ///< 0 = DIMM disabled
|
BDAT_RANK_STRUCTURE RankList[MAX_RANK_IN_DIMM]; ///< Array of ranks per DIMM
|
BDAT_SPD_STRUCTURE SpdBytes; ///< SPD data per DIMM
|
} BDAT_DIMM_STRUCTURE;
|
|
typedef struct {
|
UINT8 ChannelEnabled; ///< 0 = Channel disabled
|
UINT8 NumDimmSlot; ///< Number of slots per channel on the board
|
BDAT_DIMM_STRUCTURE DimmList[MAX_DIMMS_IN_CHANNEL]; ///< Array of DIMMs per channel
|
} BDAT_CHANNEL_STRUCTURE;
|
|
typedef struct {
|
UINT8 ControllerEnabled; ///< 0 = MC disabled
|
UINT16 ControllerDeviceId; ///< MC device Id
|
UINT8 ControllerRevisionId; ///< MC revision Id
|
UINT16 MemoryFrequency; ///< Memory frequency in units of MHz / 10
|
///< e.g. ddrFreq = 13333 for tCK = 1.5 ns
|
UINT16 MemoryVoltage; ///< Memory Vdd in units of mV
|
///< e.g. ddrVoltage = 1350 for Vdd = 1.35 V
|
UINT8 PiStep; ///< Step unit = piStep * tCK / 2048
|
///< e.g. piStep = 16 for step = 11.7 ps (1/128 tCK)
|
UINT16 RxVrefStep; ///< Step unit = rxVrefStep * Vdd / 100
|
///< e.g. rxVrefStep = 520 for step = 7.02 mV
|
UINT16 TxVrefStep; ///< Step unit = txVrefStep * Vdd / 100
|
UINT16 CaVrefStep; ///< Step unit = caVrefStep * Vdd / 100
|
UINT8 RecvenStep; ///< Step unit = recvenStep * tCK / 2048
|
UINT8 WrLevelStep; ///< Step unit = wrLevelStep * tCK / 2048
|
BDAT_CHANNEL_STRUCTURE ChannelList[MAX_CHANNEL]; ///< Array of channels per memory controller
|
} BDAT_SOCKET_STRUCTURE;
|
|
typedef struct {
|
union {
|
UINT32 Data32; ///< MRC version: Major.Minor.Revision.Build
|
struct {
|
UINT8 Build; ///< MRC version: Build
|
UINT8 Revision; ///< MRC version: Revision
|
UINT8 Minor; ///< MRC version: Minor
|
UINT8 Major; ///< MRC version: Major
|
} Version;
|
} RefCodeRevision; ///< Major.Minor.Revision.Build
|
UINT8 MaxController; ///< Max controllers per system, e.g. 1
|
UINT8 MaxChannel; ///< Max channels per memory controller, e.g. 2
|
UINT8 MaxDimm; ///< Max DIMM per channel, e.g. 2
|
UINT8 MaxRankDimm; ///< Max ranks per DIMM, e.g. 2
|
UINT8 MaxStrobe; ///< Number of Dqs used by the rank, e.g. 18
|
UINT8 MaxDq; ///< Number of Dq bits used by the rank, e.g. 72
|
UINT32 MarginLoopCount; ///< Units of cache line
|
BDAT_SOCKET_STRUCTURE ControllerList[MAX_CONTROLLERS]; ///< Array of memory controllers per system
|
} BDAT_SYSTEM_STRUCTURE;
|
|
typedef struct {
|
UINT32 Data1;
|
UINT16 Data2;
|
UINT16 Data3;
|
UINT8 Data4[8];
|
} BDAT_EFI_GUID;
|
|
typedef struct {
|
UINT16 HobType;
|
UINT16 HobLength;
|
UINT32 Reserved;
|
} BDAT_HOB_GENERIC_HEADER;
|
|
typedef struct {
|
BDAT_HOB_GENERIC_HEADER Header;
|
BDAT_EFI_GUID Name;
|
///
|
/// Guid specific data goes here
|
///
|
} BDAT_HOB_GUID_TYPE;
|
|
typedef struct {
|
BDAT_EFI_GUID SchemaId; ///< The GUID uniquely identifies the format of the data contained within the structure.
|
UINT32 DataSize; ///< The total size of the memory block, including both the header as well as the schema specific data.
|
UINT16 Crc16; ///< Crc16 is computed in the same manner as the field in the BDAT_HEADER_STRUCTURE.
|
} MRC_BDAT_SCHEMA_HEADER_STRUCTURE;
|
|
typedef struct {
|
MRC_BDAT_SCHEMA_HEADER_STRUCTURE SchemaHeader; ///< The schema header.
|
union {
|
UINT32 Data; ///< MRC version: Major.Minor.Revision.Build
|
struct {
|
UINT8 Build; ///< MRC version: Build
|
UINT8 Revision; ///< MRC version: Revision
|
UINT8 Minor; ///< MRC version: Minor
|
UINT8 Major; ///< MRC version: Major
|
} Version;
|
} RefCodeRevision; ///< Major.Minor.Revision.Build
|
UINT8 MaxController; ///< Max controllers per system, e.g. 1
|
UINT8 MaxChannel; ///< Max channels per memory controller, e.g. 2
|
UINT8 MaxDimm; ///< Max DIMM per channel, e.g. 2
|
UINT8 MaxRankDimm; ///< Max ranks per DIMM, e.g. 2
|
UINT8 MaxStrobe; ///< Number of Dqs used by the rank, e.g. 18
|
UINT8 MaxDq; ///< Number of Dq bits used by the rank, e.g. 72
|
UINT32 MarginLoopCount; ///< Units of cache line
|
BDAT_SOCKET_STRUCTURE ControllerList[MAX_CONTROLLERS]; ///< Array of memory controllers per system
|
} BDAT_MEMORY_DATA_STRUCTURE;
|
|
typedef struct {
|
BDAT_HOB_GUID_TYPE HobGuidType;
|
BDAT_MEMORY_DATA_STRUCTURE MemorySchema;
|
} BDAT_MEMORY_DATA_HOB;
|
|
#pragma pack (pop)
|
|
typedef struct {
|
BDAT_HOB_GUID_TYPE HobGuidType;
|
UINT16 SchemaHobCount;
|
UINT16 Reserved;
|
BDAT_EFI_GUID SchemaHobGuids[MAX_SCHEMA_LIST_LENGTH];
|
} MRC_BDAT_SCHEMA_LIST_HOB;
|
|
#endif //_MrcRmtData_h_
|