* Re: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01
[not found] <1741EA9C96A244C9.31982@groups.io>
@ 2023-02-08 18:04 ` Rebecca Cran
0 siblings, 0 replies; 4+ messages in thread
From: Rebecca Cran @ 2023-02-08 18:04 UTC (permalink / raw)
To: devel, quic_rcran; +Cc: Michael D Kinney, Zhiguang Liu, Liming Gao
+Liming at his correct email address.
Sorry, I used the email address from the DDR4 commit back in 2016.
On 2/8/23 10:47, Rebecca Cran wrote:
> Copying the style of SdramSpdDdr4.h, add DDR5 SPD definitions to
> SpdDdr5.h per JEDEC JESD400-5A.01 specification
> (https://www.jedec.org/standards-documents/docs/jesd400-5a01).
>
> Signed-off-by: Rebecca Cran <rebecca@quicinc.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
> ---
> MdePkg/Include/IndustryStandard/SpdDdr5.h | 541 ++++++++++++++++++++
> 1 file changed, 541 insertions(+)
>
> diff --git a/MdePkg/Include/IndustryStandard/SpdDdr5.h b/MdePkg/Include/IndustryStandard/SpdDdr5.h
> new file mode 100644
> index 000000000000..305ab69af852
> --- /dev/null
> +++ b/MdePkg/Include/IndustryStandard/SpdDdr5.h
> @@ -0,0 +1,541 @@
> +/** @file
> + This file contains definitions for DDR5 SPD.
> +
> + Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved.<BR>
> + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> + @par Revision Reference:
> + - DDR5 Serial Presence Detect (SPD), Document Release 1.1 (Jan 2023)
> + https://www.jedec.org/standards-documents/docs/jesd400-5a01
> +**/
> +
> +#ifndef SPD_DDR5_H_
> +#define SPD_DDR5_H_
> +
> +#include <Uefi/UefiBaseType.h>
> +
> +#pragma pack (push, 1)
> +
> +typedef union {
> + struct {
> + UINT8 BetaLevel3_0 : 4; ///< Bits 3:0
> + UINT8 BytesTotal : 3; ///< Bits 6:4
> + UINT8 BetaLevel4 : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_DEVICE_DESCRIPTION_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Minor : 4; ///< Bits 3:0
> + UINT8 Major : 4; ///< Bits 7:4
> + } Bits;
> + UINT8 Data;
> +} SPD5_REVISION_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Type : 8; ///< Bits 7:0
> + } Bits;
> + UINT8 Data;
> +} SPD5_DEVICE_TYPE_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 ModuleType : 4; ///< Bits 3:0
> + UINT8 HybridMedia : 3; ///< Bits 6:4
> + UINT8 Hybrid : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_TYPE_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Density : 5; ///< Bits 4:0
> + UINT8 Die : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_DENSITY_PACKAGE_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 RowAddress : 5; ///< Bits 4:0
> + UINT8 ColumnAddress : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_ADDRESSING_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Reserved : 5; ///< Bits 4:0
> + UINT8 IoWidth : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_IO_WIDTH_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 BanksPerBankGroup : 3; ///< Bits 2:0
> + UINT8 Reserved : 2; ///< Bits 4:3
> + UINT8 BankGroups : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_BANKS_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Reserved0 : 1; ///< Bits 0:0
> + UINT8 Mbist_mPpr : 1; ///< Bits 1:1
> + UINT8 Reserved1 : 2; ///< Bits 3:2
> + UINT8 BL32 : 1; ///< Bits 4:4
> + UINT8 SPprUndo_Lock : 1; ///< Bits 5:5
> + UINT8 Reserved2 : 1; ///< Bits 6:6
> + UINT8 SPprGranularity : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 DcaTypesSupported : 2; ///< Bits 1:0
> + UINT8 Reserved0 : 2; ///< Bits 3:2
> + UINT8 Pasr : 1; ///< Bits 4:4
> + UINT8 Reserved1 : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_DCA_AND_PASR_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 BoundedFault : 1; ///< Bits 0:0
> + UINT8 x4RmwEcsWbSuppressionMrSelector : 1; ///< Bits 1:1
> + UINT8 x4RmwEcsWriteBackSuppresion : 1; ///< Bits 2:2
> + UINT8 WideTemperatureSense : 1; ///< Bits 3:3
> + UINT8 Reserved : 4; ///< Bits 7:4
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 Endurant : 2; ///< Bits 1:0
> + UINT8 Operational : 2; ///< Bits 3:2
> + UINT8 Nominal : 4; ///< Bits 7:4
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT8 NonStandardCoreTimings : 1; ///< Bits 0:0
> + UINT8 Reserved : 7; ///< Bits 7:1
> + } Bits;
> + UINT8 Data;
> +} SPD5_SDRAM_TIMINGS_STRUCT;
> +
> +typedef struct {
> + UINT8 Lsb;
> + UINT8 Msb;
> +} SPD5_SDRAM_T_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT32 Cl20 : 1; ///< Bits 0:0
> + UINT32 Cl22 : 1; ///< Bits 1:1
> + UINT32 Cl24 : 1; ///< Bits 2:2
> + UINT32 Cl26 : 1; ///< Bits 3:3
> + UINT32 Cl28 : 1; ///< Bits 4:4
> + UINT32 Cl30 : 1; ///< Bits 5:5
> + UINT32 Cl32 : 1; ///< Bits 6:6
> + UINT32 Cl34 : 1; ///< Bits 7:7
> + UINT32 Cl36 : 1; ///< Bits 8:8
> + UINT32 Cl38 : 1; ///< Bits 9:9
> + UINT32 Cl40 : 1; ///< Bits 10:10
> + UINT32 Cl42 : 1; ///< Bits 11:11
> + UINT32 Cl44 : 1; ///< Bits 12:12
> + UINT32 Cl46 : 1; ///< Bits 13:13
> + UINT32 Cl48 : 1; ///< Bits 14:14
> + UINT32 Cl50 : 1; ///< Bits 15:15
> + UINT32 Cl52 : 1; ///< Bits 16:16
> + UINT32 Cl54 : 1; ///< Bits 17:17
> + UINT32 Cl56 : 1; ///< Bits 18:18
> + UINT32 Cl58 : 1; ///< Bits 19:19
> + UINT32 Cl60 : 1; ///< Bits 20:20
> + UINT32 Cl62 : 1; ///< Bits 21:21
> + UINT32 Cl64 : 1; ///< Bits 22:22
> + UINT32 Cl66 : 1; ///< Bits 23:23
> + UINT32 Cl68 : 1; ///< Bits 24:24
> + UINT32 Cl70 : 1; ///< Bits 25:25
> + UINT32 Cl72 : 1; ///< Bits 26:26
> + UINT32 Cl74 : 1; ///< Bits 27:27
> + UINT32 Cl76 : 1; ///< Bits 28:28
> + UINT32 Cl78 : 1; ///< Bits 29:29
> + UINT32 Cl80 : 1; ///< Bits 30:30
> + UINT32 Cl82 : 1; ///< Bits 31:31
> + } Byte0_3;
> + struct {
> + UINT8 Cl84 : 1; ///< Bits 0:0
> + UINT8 Cl86 : 1; ///< Bits 1:1
> + UINT8 Cl88 : 1; ///< Bits 2:2
> + UINT8 Cl90 : 1; ///< Bits 3:3
> + UINT8 Cl92 : 1; ///< Bits 4:4
> + UINT8 Cl94 : 1; ///< Bits 5:5
> + UINT8 Cl96 : 1; ///< Bits 6:6
> + UINT8 Cl98 : 1; ///< Bits 7:7
> + } Byte4;
> + UINT8 Data8[5];
> +} SPD5_CAS_LATENCIES_SUPPORTED_STRUCT;
> +
> +typedef union {
> + struct {
> + UINT16 RfmRequired : 1; ///< Bits 0:0
> + UINT16 Raaimt : 4; ///< Bits 4:1
> + UINT16 Raammt : 3; ///< Bits 7:5
> + UINT16 DrfmSupported : 1; ///< Bits 8:8
> + UINT16 RecommendedBoundedRefreshCfg : 2; ///< Bits 10:9
> + UINT16 BrcSupportLevel : 1; ///< Bits 11:11
> + UINT16 ArfmLevel : 2; ///< Bits 13:12
> + UINT16 RfmRaaCounterDecPerRefCmd : 2; ///< Bits 15:14
> + } Bits;
> + UINT16 Data;
> +} SPD5_REFRESH_MANAGEMENT_STRUCT;
> +
> +typedef struct {
> + SPD5_DEVICE_DESCRIPTION_STRUCT Description; ///< 0 Number of Bytes in SPD Device and Beta Level
> + SPD5_REVISION_STRUCT Revision; ///< 1 SPD Revision for Base Configuration Parameters
> + SPD5_DEVICE_TYPE_STRUCT HostBusCommandProtocolType; ///< 2 Host Bus Command Protocol Type
> + SPD5_MODULE_TYPE_STRUCT ModuleType; ///< 3 Module Type
> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT FirstSdramDensityAndPackage; ///< 4 First SDRAM Density and Package
> + SPD5_SDRAM_ADDRESSING_STRUCT FirstSdramAddressing; ///< 5 First SDRAM Addressing
> + SPD5_SDRAM_IO_WIDTH_STRUCT FirstSdramIoWidth; ///< 6 First SDRAM I/O Width
> + SPD5_SDRAM_BANKS_STRUCT FirstSdramBanks; ///< 7 First SDRAM Bank Groups and Banks Per Bank Group
> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT SecondSdramDensityAndPackage; ///< 8 Second SDRAM Density and Package
> + SPD5_SDRAM_ADDRESSING_STRUCT SecondSdramAddressing; ///< 9 Second SDRAM Addressing
> + SPD5_SDRAM_IO_WIDTH_STRUCT SecondSdramIoWidth; ///< 10 Second SDRAM I/O Width
> + SPD5_SDRAM_BANKS_STRUCT SecondSdramBanks; ///< 11 Second SDRAM Bank Groups and Banks Per Bank Group
> + SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT SdramBl32AndPostPackageRepair; ///< 12 SDRAM BL32 and Post Package Repair
> + SPD5_SDRAM_DCA_AND_PASR_STRUCT SdramDcaAndPasr; ///< 13 SDRAM Duty Cycle Adjuster and Partial Array Self Refresh
> + SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT SdramFaultHandlingAndTempSense; ///< 14 SDRAM Fault Handling and Temperature Sense
> + UINT8 Reserved0; ///< 15 Reserved
> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT ModuleNominalVoltageVdd; ///< 16 SDRAM Nominal Voltage, VDD
> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT ModuleNominalVoltageVddq; ///< 17 SDRAM Nominal Voltage, VDDQ
> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT ModuleNominalVoltageVpp; ///< 18 SDRAM Nominal Voltage, VPP
> + SPD5_SDRAM_TIMINGS_STRUCT SdramUsesNonStandardTimings; ///< 19 SDRAM Timing
> + SPD5_SDRAM_T_STRUCT tCKavgMin; ///< 20-21 SDRAM Minimum Cycle Time (tCK_avg_min)
> + SPD5_SDRAM_T_STRUCT tCKavgMax; ///< 22-23 SDRAM Maximum Cycle Time (tCK_avg_max)
> + SPD5_CAS_LATENCIES_SUPPORTED_STRUCT CasLatenciesSupported; ///< 24-28 SDRAM CAS Latenies Supported
> + UINT8 Reserved1; ///< 29 Reserved
> + SPD5_SDRAM_T_STRUCT tAA; ///< 30-31 SDRAM Read Command to First Data (tAA)
> + SPD5_SDRAM_T_STRUCT tRCD; ///< 32-33 SDRAM Activate to Read or Write Command Delay (tRCD)
> + SPD5_SDRAM_T_STRUCT tRP; ///< 34-35 SDRAM Row Precharge Time (tRP)
> + SPD5_SDRAM_T_STRUCT tRAS; ///< 36-37 SDRAM Activate to Precharge Command Period (tRAS)
> + SPD5_SDRAM_T_STRUCT tRC; ///< 38-39 SDRAM Activate to Activate or Refresh Command Period (tRC)
> + SPD5_SDRAM_T_STRUCT tWR; ///< 40-41 SDRAM Write Recovery Time (tWR)
> + SPD5_SDRAM_T_STRUCT tRFC1_tRFC1Slr; ///< 42-43 SDRAM Normal Refresh Recovery Time (tRFC1, tRFC1_slr)
> + SPD5_SDRAM_T_STRUCT tRFC2_tRFC2Slr; ///< 44-45 SDRAM Fine Granularity Refresh Recovery Time (tRFC2, tRFC2_slr)
> + SPD5_SDRAM_T_STRUCT tRFCsb_tRFCsbSlr; ///< 46-47 SDRAM Same Bank Refresh Recovery Time (tRFC_sb, tRFC_sb_slr)
> + SPD5_SDRAM_T_STRUCT tRFC1Dlr; ///< 48-49 SDRAM Normal Refresh Recovery Time, 3DS Different Logical Rank (tRFC1_dlr)
> + SPD5_SDRAM_T_STRUCT tRFC2Dlr; ///< 50-51 SDRAM Fine Granularity Refresh Recovery Time, 3DS Different Logical Rank (tRFC2_dir)
> + SPD5_SDRAM_T_STRUCT tRFCsbDir; ///< 52-53 SDRAM Same Bank Refresh Recovery Time, 3DS Different Logical Rank (tRFC_sb_dlr)
> + SPD5_REFRESH_MANAGEMENT_STRUCT FirstSdramRefreshManagement; ///< 54-55 SDRAM Refresh Management, First SDRAM
> + SPD5_REFRESH_MANAGEMENT_STRUCT SecondSdramRefreshManagement; ///< 56-57 SDRAM Refresh Management, Second SDRAM
> + SPD5_REFRESH_MANAGEMENT_STRUCT FirstSdramAdaptiveRefreshMgmtLevelA; ///< 58-59 SDRAM Adaptive Refresh Management, First DRAM, ARFM Level A
> + SPD5_REFRESH_MANAGEMENT_STRUCT SecondSdramAdaptiveRefreshMgmtLevelA; ///< 60-61 SDRAM Adaptive Refresh Management, Second SDRAM, ARFM Level A
> + SPD5_REFRESH_MANAGEMENT_STRUCT FirstSdramAdaptiveRefreshMgmtLevelB; ///< 62-63 SDRAM Adaptive Refresh Management, First SDRAM, ARFM Level B
> + SPD5_REFRESH_MANAGEMENT_STRUCT SecondSdramAdaptiveRefreshMgmtLevelB; ///< 64-65 SDRAM Adaptive Refresh Management, Second SDRAM, ARFM Level B
> + SPD5_REFRESH_MANAGEMENT_STRUCT FirstSdramAdaptiveRefreshMgmtLevelC; ///< 66-67 SDRAM Adaptive Refresh Management, First SDRAM, ARFM Level C
> + SPD5_REFRESH_MANAGEMENT_STRUCT SecondSdramAdaptiveRefreshMgmtLevelC; ///< 68-69 SDRAM Adaptive Refresh Management, Second SDRAM, ARFM Level C
> + SPD5_SDRAM_T_STRUCT tRRD_L; ///< 70-71 SDRAM Activate to Activate Command Delay for Same Bank Group (tRRD_L)
> + UINT8 tRRD_L_LowerClockLimit; ///< 72 SDRAM Activate to Activate Command Delay for Same Bank Group, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tCCD_L; ///< 73-74 SDRAM Read to Read Command Delay for Same Bank Group (tCCD_L)
> + UINT8 tCCD_L_LowerClockLimit; ///< 75 SDRAM Read to Read Command Delay for Same Bank Group, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tCCD_L_WR; ///< 76-77 SDRAM Write to Write Command Delay for Same Bank Group (tCCD_L_WR)
> + UINT8 tCCD_L_WR_LowerClockLimit; ///< 78 SDRAM Write to Write Command Delay for Same Bank Group, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tCCD_L_WR2; ///< 79-80 SDRAM Write to Write Command Delay for Same Bank Group, Second Write not RMW (tCCD_L_WR2)
> + UINT8 tCCD_L_WR2_LowerClockLimit; ///< 81 SDRAM Write to Write Command Delay for Same Bank Group, Second Write not RMW, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tFAW; ///< 82-83 SDRAM Four Activate Window (tFAW)
> + UINT8 tFAW_LowerClockLimit; ///< 84 SDRAM Four Activate Window, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tCCD_L_WTR; ///< 85-86 SDRAM Write to Read Command Delay for Same Bank (tCCD_L_WTR)
> + UINT8 tCCD_L_WTR_LowerClockLimit; ///< 87 SDRAM Write to Read Command Delay for Same Bank, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tCCD_S_WTR; ///< 88-89 SDRAM Write to Read Command Delay for Different Bank Group (tCCD_S_WTR)
> + UINT8 tCCD_S_WTR_LowerClockLimit; ///< 90 SDRAM Write to Read Command Delay for Different Bank Group, Lower Clock Limit
> + SPD5_SDRAM_T_STRUCT tRTP_tRTPslr; ///< 91-92 SDRAM Read to Precharge Command Delay (tRTP, tRTP_slr)
> + UINT8 tRTP_tRTPslr_LowerClockLimit; ///< 93 SDRAM Read to Precharge Command Delay, Lower Clock Limit
> + UINT8 Reserved2[127 - 94 + 1]; ///< 94-127 Reserved
> +} SPD5_BASE_SECTION;
> +
> +STATIC_ASSERT (sizeof (SPD5_BASE_SECTION) == 128, "sizeof (SPD5_BASE_SECTION) does not match DDR5 SPD 1.1 specification");
> +
> +typedef union {
> + struct {
> + UINT8 SerialNumberHashingSequence : 3; ///< Bits 2:0
> + UINT8 Reserved : 5; ///< Bits 7:3
> + } Bits;
> + UINT8 Data;
> +} SPD5_HASHING_SEQUENCE;
> +
> +typedef union {
> + struct {
> + UINT16 ContinuationCount : 7; ///< Bits 6:0
> + UINT16 ContinuationParity : 1; ///< Bits 7:7
> + UINT16 LastNonZeroByte : 8; ///< Bits 15:8
> + } Bits;
> + UINT16 Data;
> + UINT8 Data8[2];
> +} SPD5_MANUFACTURER_ID_CODE;
> +
> +typedef union {
> + struct {
> + UINT8 DeviceType : 4; ///< Bits 3:0
> + UINT8 Reserved0 : 2; ///< Bits 5:4
> + UINT8 Rsvd_TempSensor : 1; ///< Bits 6:6
> + UINT8 DeviceInstalled : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_DEVICE_TYPE;
> +
> +typedef union {
> + struct {
> + UINT8 Height : 5; ///< Bits 4:0
> + UINT8 Reserved : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_NOMINAL_HEIGHT;
> +
> +typedef union {
> + struct {
> + UINT8 FrontThickness : 4; ///< Bits 3:0
> + UINT8 BackThickness : 4; ///< Bits 7:4
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_NOMINAL_THICKNESS;
> +
> +typedef union {
> + struct {
> + UINT8 Card : 5; ///< Bits 4:0
> + UINT8 Revision : 3; ///< Bits 7:5
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_REFERENCE_RAW_CARD;
> +
> +typedef union {
> + struct {
> + UINT8 DramRowCount : 2; ///< Bits 1:0
> + UINT8 HeatSpreader : 1; ///< Bits 2:2
> + UINT8 Reserved : 1; ///< Bits 3:3
> + UINT8 OperatingTempRange : 4; ///< Bits 7:4
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_DIMM_ATTRIBUTES;
> +
> +typedef union {
> + struct {
> + UINT8 Reserved0 : 3; ///< Bits 2:0
> + UINT8 PackageRanksCount : 3; ///< Bits 5:3
> + UINT8 RankMix : 1; ///< Bits 6:6
> + UINT8 Reserved1 : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_MODULE_ORGANIZATION;
> +
> +typedef union {
> + struct {
> + UINT8 PrimaryBusWidthPerSubChannel : 3; ///< Bits 2:0
> + UINT8 BusWidthExtensionPerSubChannel : 2; ///< Bits 4:3
> + UINT8 SubChannelsPerDimmCount : 2; ///< Bits 6:5
> + UINT8 Reserved : 1; ///< Bits 7:7
> + } Bits;
> + UINT8 Data;
> +} SPD5_MEMORY_CHANNEL_BUS_WIDTH;
> +
> +
> +typedef struct {
> + SPD5_REVISION_STRUCT SpdRevisionBytes192_447; ///< 192 SPD Revision for SPD bytes 192-447
> + SPD5_HASHING_SEQUENCE HashingSequence; ///< 193 Hashing Sequence
> + SPD5_MANUFACTURER_ID_CODE SpdManufacturer; ///< 194-195 SPD Manufacturer ID Code
> + SPD5_MODULE_DEVICE_TYPE SpdDeviceType; ///< 196 SPD Device Type
> + SPD5_REVISION_STRUCT SpdRevisionNumber; ///< 197 SPD Device Revision Number
> + SPD5_MANUFACTURER_ID_CODE Pmic0Manufacturer; ///< 198-199 PMIC 0 Manufacturer ID Code
> + SPD5_MODULE_DEVICE_TYPE Pmic0DeviceType; ///< 200 PMIC 0 Device Type
> + SPD5_REVISION_STRUCT Pmic0RevisionNumber; ///< 201 PMIC 0 Revision Number
> + SPD5_MANUFACTURER_ID_CODE Pmic1Manufacturer; ///< 202-203 PMIC 1 Manufacturer ID Code
> + SPD5_MODULE_DEVICE_TYPE Pmic1DeviceType; ///< 204 PMIC 1 Device Type
> + SPD5_REVISION_STRUCT Pmic1RevisionNumber; ///< 205 PMIC 1 Revision Number
> + SPD5_MANUFACTURER_ID_CODE Pmic2Manufacturer; ///< 206-207 PMIC 2 Manufacturer ID Code
> + SPD5_MODULE_DEVICE_TYPE Pmic2DeviceType; ///< 208 PMIC 2 Device Type
> + SPD5_REVISION_STRUCT Pmic2RevisionNumber; ///< 209 PMIC 2 Revision Number
> + SPD5_MANUFACTURER_ID_CODE ThermalSensorManufacturer; ///< 210-211 Thermal Sensor Manufacturer ID Code
> + SPD5_MODULE_DEVICE_TYPE ThermalSensorDeviceType; ///< 212 Thermal Sensor Revision Number
> + SPD5_REVISION_STRUCT ThermalSensorRevisionNumber; ///< 213 Thermal Sensor Revision Number
> + UINT8 Reserved0[229 - 214 + 1]; ///< 214-229 Reserved
> + SPD5_MODULE_NOMINAL_HEIGHT ModuleNominalHeight; ///< 230 Module Nominal Height
> + SPD5_MODULE_NOMINAL_THICKNESS ModuleMaximumThickness; ///< 231 Module Maximum Thickness
> + SPD5_MODULE_REFERENCE_RAW_CARD ReferenceRawCardUsed; ///< 232 Reference Raw Card Used
> + SPD5_MODULE_DIMM_ATTRIBUTES DimmAttributes; ///< 233 DIMM Attributes
> + SPD5_MODULE_ORGANIZATION ModuleOrganization; ///< 234 Module Organization
> + SPD5_MEMORY_CHANNEL_BUS_WIDTH MemoryChannelBusWidth; ///< 235 Memory Channel Bus Width
> + UINT8 Reserved1[239 - 236 + 1]; ///< 236-239 Reserved
> +} SPD5_MODULE_COMMON;
> +
> + STATIC_ASSERT (sizeof (SPD5_MODULE_COMMON) == 48, "sizeof (SPD5_MODULE_COMMON) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + UINT8 Reserved[447 - 240 + 1]; ///< 240-447 Reserved
> +} SPD5_MODULE_SOLDER_DOWN;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_SOLDER_DOWN) == 208, "sizeof (SPD5_MODULE_SOLDER_DOWN) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE ClockDriverManufacturerId; ///< 240-241 Clock Driver Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT ClockDriverDeviceType; ///< 242 Clock Driver Device Type
> + SPD5_REVISION_STRUCT ClockDriverRevisionNumber; ///< 243 Clock Driver Revision Number
> + UINT8 Reserved[447 - 244 + 1];
> +} SPD5_MODULE_UNBUFFERED;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_UNBUFFERED) == 208, "sizeof (SPD5_MODULE_UNBUFFERED) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock Driver Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType; ///< 242 Register Device Type
> + SPD5_REVISION_STRUCT RegisterRevisionNumber; ///< 243 Register Revision Number
> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId; ///< 244-245 Data Buffer Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType; ///< 246 Data Buffer Device Type
> + SPD5_REVISION_STRUCT DataBufferRevisionNumber; ///< 247 Data Buffer Revision Number
> + UINT8 RcdRw08ClockDriverEnable; ///< 248 RCD-RW08 Clock Driver Enable
> + UINT8 RcdRw09OutputAddressAndControlEnable; ///< 249 RCD-RW09 Output Address and Control Enable
> + UINT8 RcdRw0AQckDriverCharacteristics; ///< 250 RCD-RW0A QCK Driver Characteristics
> + UINT8 RcdRw0B; ///< 251 RCD-RW0B
> + UINT8 RcdRw0CQxCaAndQcsnDriverCharacteristics; ///< 252 RCD-RW0C QxCA and QxCS_n Driver Characteristics
> + UINT8 RcdRw0DDataBufferInterfaceDriverCharacteristics; ///< 253 RCD-RW0D Data Buffer Interface Driver Characteristics
> + UINT8 RcdRw0EQckQcaAndQcsOutputSlewRate; ///< 254 RCD-RW0E QCK, QCA and QCS Output Slew Rate
> + UINT8 RcdRw0FBckBcomAndBcsOutputSlewRate; ///< 255 RCD-RW0F BCK, BCOM, and BCS Output Slew Rate
> + UINT8 DbRw86DqsRttParkTermination; ///< 256 DB-RW86 DQS RTT Park Termination
> + UINT8 Reserved[447 - 257 + 1]; ///< 257-447 Reserved
> +} SPD5_MODULE_REGISTERED;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_REGISTERED) == 208, "sizeof (SPD5_MODULE_REGISTERED) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE MultiplexRegisteringClockDriverManufacturerId; ///< 240-241 Multiplex Registering Clock Driver Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType; ///< 242 Register Device Type
> + SPD5_REVISION_STRUCT RegisterRevisionNumber; ///< 243 Register Revision Number
> + SPD5_MANUFACTURER_ID_CODE MultiplexDataBufferManufacturerId; ///< 244-245 Multiplex Data Buffer Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType; ///< 246 Data Buffer Device Type
> + SPD5_REVISION_STRUCT DataBufferRevisionNumber; ///< 247 Data Buffer Revision Number
> + UINT8 Reserved[447 - 248 + 1]; ///< 248-447 Reserved
> +} SPD5_MODULE_MULTIPLEXED_RANK;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_MULTIPLEXED_RANK) == 208, "sizeof (SPD5_MODULE_MULTIPLEXED_RANK) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE DifferentialMemoryBufferManufacturerId; ///< 240-241 Differential Memory Buffer Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT DifferentialMemoryBufferDeviceType; ///< 242 Differential Memory Buffer Device Type
> + SPD5_REVISION_STRUCT DifferentialMemoryBufferRevisionNumber; ///< 243 Differential Memory Buffer Revision Number
> + UINT8 Reserved[447 - 244 + 1]; ///< 244-447 Reserved
> +} SPD5_MODULE_DIFFERENTIAL;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_DIFFERENTIAL) == 208, "sizeof (SPD5_MODULE_DIFFERENTIAL) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock Driver Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType; ///< 242 Register Device Type
> + SPD5_REVISION_STRUCT RegisterRevisionNumber; ///< 243 Register Revision Number
> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId; ///< 244-245 Data Buffer Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType; ///< 246 Data Buffer Device Type
> + SPD5_REVISION_STRUCT DataBufferRevisionNumber; ///< 247 Data Buffer Revision Number
> + UINT8 Reserved[447 - 248 + 1]; ///< 248-447 Reserved
> +} SPD5_MODULE_NVDIMM_N;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_N) == 208, "sizeof (SPD5_MODULE_NVDIMM_N) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock Driver Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType; ///< 242 Register Device Type
> + SPD5_REVISION_STRUCT RegisterRevisionNumber; ///< 243 Register Revision Number
> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId; ///< 244-245 Data Buffer Manufacturer ID Code
> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType; ///< 246 Data Buffer Device Type
> + SPD5_REVISION_STRUCT DataBufferRevisionNumber; ///< 247 Data Buffer Revision Number
> + UINT8 ModuleStorageCapacity[2]; ///< 248-249 Module Storage Capacity
> + UINT8 ProtocolProfile; ///< 250 Protocol Profile
> + UINT8 Reserved[447 - 251 + 1]; ///< 251-447 Reserved
> +} SPD5_MODULE_NVDIMM_P;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_P) == 208, "sizeof (SPD5_MODULE_NVDIMM_P) does not match DDR5 SPD 1.1 specification");
> +
> +typedef union {
> + SPD5_MODULE_SOLDER_DOWN SolderDown; ///< 240-447 Solder Down Memory Module Types
> + SPD5_MODULE_UNBUFFERED Unbuffered; ///< 240-447 Unbuffered Memory Module Types
> + SPD5_MODULE_REGISTERED Registered; ///< 240-447 Registered Memory Module Types
> + SPD5_MODULE_MULTIPLEXED_RANK MultiplexedRank; ///< 240-447 Mutiplexed Rank Memory Module Types
> + SPD5_MODULE_DIFFERENTIAL Differential; ///< 240-447 Differentual (DDR-D) Memory Module Types
> + SPD5_MODULE_NVDIMM_N NvDimmN; ///< 240-447 Non-Volatile (NVDIMM-N) Hybrid Memory Parameters
> + SPD5_MODULE_NVDIMM_P NvDimmP; ///< 240-447 Non-Volatile (NVDIMM-P) Hybrid Memory Parameters
> +} SPD5_MODULE_SPECIFIC;
> +
> +STATIC_ASSERT (sizeof (SPD5_MODULE_SPECIFIC) == 208, "sizeof (SPD5_MODULE_SPECIFIC) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + UINT8 ManufacturerSpecificData[639 - 555 + 1]; ///< 639-555 Manufacturer's Specific Data
> +} SPD5_MANUFACTURER_SPECIFIC;
> +
> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURER_SPECIFIC) == 85, "sizeof (SPD5_MANUFACTURER_SPECIFIC) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + UINT8 Year; ///< Year represented in BCD (00h = 2000)
> + UINT8 Week; ///< Year represented in BCD (47h = week 47)
> +} SPD5_MANUFACTURING_DATE;
> +
> +typedef union {
> + UINT32 SerialNumber32; ///< 517-520 Serial Number
> + UINT16 SerialNumber16[2];
> + UINT8 SerialNumber8[4];
> +} SPD5_MANUFACTURER_SERIAL_NUMBER;
> +
> +typedef struct {
> + UINT8 ModulePartNumber[550 - 521 + 1]; ///< 521-550 Module Part Number
> +} SPD5_MODULE_PART_NUMBER;
> +
> +typedef UINT8 SPD5_MANUFACTURING_LOCATION; ///< 514 Module Manufacturing Location
> +typedef UINT8 SPD5_MODULE_REVISION_CODE; ///< 551 Module Revision Code
> +typedef UINT8 SPD5_DRAM_STEPPING; ///< 554 DRAM Stepping
> +
> +typedef struct {
> + SPD5_MANUFACTURER_ID_CODE ModuleManufacturer; ///< 512-513 Module Manufacturer ID Code
> + SPD5_MANUFACTURING_LOCATION ModuleManufacturingLocation; ///< 514 Module Manufacuring Location
> + SPD5_MANUFACTURING_DATE ModuleManufacturingDate; ///< 515-516 Module Manufacturing Date
> + SPD5_MANUFACTURER_SERIAL_NUMBER ModuleSerialNumber; ///< 517-520 Module Serial Number
> + SPD5_MODULE_PART_NUMBER ModulePartNumber; ///< 521-550 Module Part Number
> + SPD5_MODULE_REVISION_CODE ModuleRevisionCode; ///< 551 Module Revision Code
> + SPD5_MANUFACTURER_ID_CODE DramManufacturer; ///< 552-553 DRAM Manufacturer ID Code
> + SPD5_DRAM_STEPPING DramStepping; ///< 554 DRAM Stepping
> + SPD5_MANUFACTURER_SPECIFIC ManufacturerSpecificData; ///< 555-639 Manufacturer's Specific Data
> +} SPD5_MANUFACTURING_DATA;
> +
> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURING_DATA) == 128, "sizeof (SPD5_MANUFACTURING_DATA) does not match DDR5 SPD 1.1 specification");
> +
> +typedef struct {
> + UINT8 EndUserBytes[1023 - 640 + 1]; ///< 640-1023 End User Programmable Bytes
> +} SPD5_END_USER_SECTION;
> +
> +STATIC_ASSERT (sizeof (SPD5_END_USER_SECTION) == 384, "sizeof (SPD5_END_USER_SECTION) does not match DDR5 SPD 1.1 specification");
> +
> +///
> +/// DDR5 Serial Presence Detect structure
> +///
> +typedef struct {
> + SPD5_BASE_SECTION Base; ///< 0-127 Base Configuration and DRAM Parameters
> + UINT8 Reserved0[191 - 128 + 1]; ///< 128-191 Reserved
> + SPD5_MODULE_COMMON Common; ///< 192-239 Common Module Parameters
> + SPD5_MODULE_SPECIFIC Module; ///< 240-447 Module Type Specific Information
> + UINT8 Reserved1[509 - 448 + 1]; ///< 448-509 Reserved for future use
> + UINT8 Crc[2]; ///< 510-511 CRC for bytes 0-509
> + SPD5_MANUFACTURING_DATA ManufacturerInfo; ///< 512-639 Manufacturing Information
> + SPD5_END_USER_SECTION EndUser; ///< 640-1023 End User Programmable
> +} SPD_DDR5;
> +
> +STATIC_ASSERT (sizeof (SPD_DDR5) == 1024, "sizeof (SPD_DDR5) does not match DDR5 SPD 1.1 specification");
> +
> +#pragma pack (pop)
> +
> +#endif /* SPD_DDR5_H_ */
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01
2023-02-10 5:23 ` 回复: [edk2-devel] " gaoliming
@ 2023-02-10 11:04 ` Rebecca Cran
2023-02-10 18:01 ` Michael D Kinney
0 siblings, 1 reply; 4+ messages in thread
From: Rebecca Cran @ 2023-02-10 11:04 UTC (permalink / raw)
To: devel, gaoliming
Cc: 'Liming Gao', Kinney, Michael D, 'Zhiguang Liu'
Yes I’ve verified locally that this file builds. It doesn’t pass CI though since like the DDR4 header it has fields that begin with a lower-case letter.
I added the include of Uefi/UefiBaseType.h because the UEFI type UINT8 is used.
—
Rebecca
On Thu, Feb 9, 2023, at 10:23 PM, gaoliming via groups.io wrote:
> Rebecca:
> Have you verified this header file with build? For example, include this
> new header file into module, and make sure this module pass build.
>
>> -----邮件原件-----
>> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Rebecca Cran
>> 发送时间: 2023年2月9日 1:48
>> 收件人: devel@edk2.groups.io
>> 抄送: Rebecca Cran <rebecca@quicinc.com>; Liming Gao
>> <liming.gao@intel.com>; Michael D Kinney <michael.d.kinney@intel.com>;
>> Zhiguang Liu <zhiguang.liu@intel.com>
>> 主题: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to
>> IndustryStandard per JESD400-5A.01
>>
>> Copying the style of SdramSpdDdr4.h, add DDR5 SPD definitions to
>> SpdDdr5.h per JEDEC JESD400-5A.01 specification
>> (https://www.jedec.org/standards-documents/docs/jesd400-5a01).
>>
>> Signed-off-by: Rebecca Cran <rebecca@quicinc.com>
>> Cc: Liming Gao <liming.gao@intel.com>
>> Cc: Michael D Kinney <michael.d.kinney@intel.com>
>> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
>> ---
>> MdePkg/Include/IndustryStandard/SpdDdr5.h | 541
>> ++++++++++++++++++++
>> 1 file changed, 541 insertions(+)
>>
>> diff --git a/MdePkg/Include/IndustryStandard/SpdDdr5.h
>> b/MdePkg/Include/IndustryStandard/SpdDdr5.h
>> new file mode 100644
>> index 000000000000..305ab69af852
>> --- /dev/null
>> +++ b/MdePkg/Include/IndustryStandard/SpdDdr5.h
>> @@ -0,0 +1,541 @@
>> +/** @file
>> + This file contains definitions for DDR5 SPD.
>> +
>> + Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights
>> reserved.<BR>
>> + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>> + SPDX-License-Identifier: BSD-2-Clause-Patent
>> +
>> + @par Revision Reference:
>> + - DDR5 Serial Presence Detect (SPD), Document Release 1.1 (Jan 2023)
>> + https://www.jedec.org/standards-documents/docs/jesd400-5a01
>> +**/
>> +
>> +#ifndef SPD_DDR5_H_
>> +#define SPD_DDR5_H_
>> +
>> +#include <Uefi/UefiBaseType.h>
>
> Is there any uefi definition used in this header file? If no, this include
> can be removed.
>
> Thanks
> Liming
>
>> +
>> +#pragma pack (push, 1)
>> +
>> +typedef union {
>> + struct {
>> + UINT8 BetaLevel3_0 : 4; ///< Bits
>> 3:0
>> + UINT8 BytesTotal : 3; ///< Bits
>> 6:4
>> + UINT8 BetaLevel4 : 1; ///< Bits
>> 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_DEVICE_DESCRIPTION_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Minor : 4; ///< Bits
>> 3:0
>> + UINT8 Major : 4; ///< Bits
>> 7:4
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_REVISION_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Type : 8; ///< Bits
>> 7:0
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_DEVICE_TYPE_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 ModuleType : 4; ///< Bits
>> 3:0
>> + UINT8 HybridMedia : 3; ///< Bits
>> 6:4
>> + UINT8 Hybrid : 1; ///< Bits
>> 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_TYPE_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Density : 5; ///< Bits
>> 4:0
>> + UINT8 Die : 3; ///< Bits
>> 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_DENSITY_PACKAGE_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 RowAddress : 5; ///< Bits
>> 4:0
>> + UINT8 ColumnAddress : 3; ///< Bits
>> 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_ADDRESSING_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Reserved : 5; ///< Bits
>> 4:0
>> + UINT8 IoWidth : 3; ///< Bits
>> 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_IO_WIDTH_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 BanksPerBankGroup : 3; ///< Bits
>> 2:0
>> + UINT8 Reserved : 2; ///< Bits
>> 4:3
>> + UINT8 BankGroups : 3; ///< Bits
>> 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_BANKS_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Reserved0 : 1; ///< Bits
>> 0:0
>> + UINT8 Mbist_mPpr : 1; ///< Bits
>> 1:1
>> + UINT8 Reserved1 : 2; ///< Bits
>> 3:2
>> + UINT8 BL32 : 1; ///< Bits
>> 4:4
>> + UINT8 SPprUndo_Lock : 1; ///< Bits
>> 5:5
>> + UINT8 Reserved2 : 1; ///< Bits
>> 6:6
>> + UINT8 SPprGranularity : 1; ///< Bits 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 DcaTypesSupported : 2; ///< Bits
>> 1:0
>> + UINT8 Reserved0 : 2; ///< Bits
>> 3:2
>> + UINT8 Pasr : 1; ///< Bits
>> 4:4
>> + UINT8 Reserved1 : 3; ///< Bits
>> 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_DCA_AND_PASR_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 BoundedFault : 1; ///< Bits
>> 0:0
>> + UINT8 x4RmwEcsWbSuppressionMrSelector : 1; ///< Bits
>> 1:1
>> + UINT8 x4RmwEcsWriteBackSuppresion : 1; ///< Bits
>> 2:2
>> + UINT8 WideTemperatureSense : 1; ///< Bits
>> 3:3
>> + UINT8 Reserved : 4; ///< Bits
>> 7:4
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Endurant : 2; ///< Bits
>> 1:0
>> + UINT8 Operational : 2; ///< Bits
>> 3:2
>> + UINT8 Nominal : 4; ///< Bits
>> 7:4
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 NonStandardCoreTimings : 1; ///< Bits
>> 0:0
>> + UINT8 Reserved : 7; ///< Bits
>> 7:1
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_SDRAM_TIMINGS_STRUCT;
>> +
>> +typedef struct {
>> + UINT8 Lsb;
>> + UINT8 Msb;
>> +} SPD5_SDRAM_T_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT32 Cl20 : 1; ///< Bits
>> 0:0
>> + UINT32 Cl22 : 1; ///< Bits
>> 1:1
>> + UINT32 Cl24 : 1; ///< Bits
>> 2:2
>> + UINT32 Cl26 : 1; ///< Bits
>> 3:3
>> + UINT32 Cl28 : 1; ///< Bits
>> 4:4
>> + UINT32 Cl30 : 1; ///< Bits
>> 5:5
>> + UINT32 Cl32 : 1; ///< Bits
>> 6:6
>> + UINT32 Cl34 : 1; ///< Bits
>> 7:7
>> + UINT32 Cl36 : 1; ///< Bits
>> 8:8
>> + UINT32 Cl38 : 1; ///< Bits
>> 9:9
>> + UINT32 Cl40 : 1; ///< Bits
>> 10:10
>> + UINT32 Cl42 : 1; ///< Bits
>> 11:11
>> + UINT32 Cl44 : 1; ///< Bits
>> 12:12
>> + UINT32 Cl46 : 1; ///< Bits
>> 13:13
>> + UINT32 Cl48 : 1; ///< Bits
>> 14:14
>> + UINT32 Cl50 : 1; ///< Bits
>> 15:15
>> + UINT32 Cl52 : 1; ///< Bits
>> 16:16
>> + UINT32 Cl54 : 1; ///< Bits
>> 17:17
>> + UINT32 Cl56 : 1; ///< Bits
>> 18:18
>> + UINT32 Cl58 : 1; ///< Bits
>> 19:19
>> + UINT32 Cl60 : 1; ///< Bits
>> 20:20
>> + UINT32 Cl62 : 1; ///< Bits
>> 21:21
>> + UINT32 Cl64 : 1; ///< Bits
>> 22:22
>> + UINT32 Cl66 : 1; ///< Bits
>> 23:23
>> + UINT32 Cl68 : 1; ///< Bits
>> 24:24
>> + UINT32 Cl70 : 1; ///< Bits
>> 25:25
>> + UINT32 Cl72 : 1; ///< Bits
>> 26:26
>> + UINT32 Cl74 : 1; ///< Bits
>> 27:27
>> + UINT32 Cl76 : 1; ///< Bits
>> 28:28
>> + UINT32 Cl78 : 1; ///< Bits
>> 29:29
>> + UINT32 Cl80 : 1; ///< Bits
>> 30:30
>> + UINT32 Cl82 : 1; ///< Bits
>> 31:31
>> + } Byte0_3;
>> + struct {
>> + UINT8 Cl84 : 1; ///< Bits
>> 0:0
>> + UINT8 Cl86 : 1; ///< Bits
>> 1:1
>> + UINT8 Cl88 : 1; ///< Bits
>> 2:2
>> + UINT8 Cl90 : 1; ///< Bits
>> 3:3
>> + UINT8 Cl92 : 1; ///< Bits
>> 4:4
>> + UINT8 Cl94 : 1; ///< Bits
>> 5:5
>> + UINT8 Cl96 : 1; ///< Bits
>> 6:6
>> + UINT8 Cl98 : 1; ///< Bits
>> 7:7
>> + } Byte4;
>> + UINT8 Data8[5];
>> +} SPD5_CAS_LATENCIES_SUPPORTED_STRUCT;
>> +
>> +typedef union {
>> + struct {
>> + UINT16 RfmRequired : 1; ///< Bits
>> 0:0
>> + UINT16 Raaimt : 4; ///< Bits
>> 4:1
>> + UINT16 Raammt : 3; ///<
>> Bits 7:5
>> + UINT16 DrfmSupported : 1; ///< Bits
>> 8:8
>> + UINT16 RecommendedBoundedRefreshCfg : 2; ///< Bits
>> 10:9
>> + UINT16 BrcSupportLevel : 1; ///< Bits
>> 11:11
>> + UINT16 ArfmLevel : 2; ///< Bits
>> 13:12
>> + UINT16 RfmRaaCounterDecPerRefCmd : 2; ///< Bits
>> 15:14
>> + } Bits;
>> + UINT16 Data;
>> +} SPD5_REFRESH_MANAGEMENT_STRUCT;
>> +
>> +typedef struct {
>> + SPD5_DEVICE_DESCRIPTION_STRUCT Description;
>> ///< 0 Number of Bytes in SPD Device and Beta Level
>> + SPD5_REVISION_STRUCT Revision;
>> ///< 1 SPD Revision for Base Configuration Parameters
>> + SPD5_DEVICE_TYPE_STRUCT
>> HostBusCommandProtocolType; ///< 2 Host Bus
>> Command Protocol Type
>> + SPD5_MODULE_TYPE_STRUCT ModuleType;
>> ///< 3 Module Type
>> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT
>> FirstSdramDensityAndPackage; ///< 4 First SDRAM Density
>> and Package
>> + SPD5_SDRAM_ADDRESSING_STRUCT
>> FirstSdramAddressing; ///< 5 First SDRAM
>> Addressing
>> + SPD5_SDRAM_IO_WIDTH_STRUCT
>> FirstSdramIoWidth; ///< 6 First SDRAM I/O
>> Width
>> + SPD5_SDRAM_BANKS_STRUCT
>> FirstSdramBanks; ///< 7 First SDRAM Bank
>> Groups and Banks Per Bank Group
>> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT
>> SecondSdramDensityAndPackage; ///< 8 Second SDRAM
>> Density and Package
>> + SPD5_SDRAM_ADDRESSING_STRUCT
>> SecondSdramAddressing; ///< 9 Second SDRAM
>> Addressing
>> + SPD5_SDRAM_IO_WIDTH_STRUCT
>> SecondSdramIoWidth; ///< 10 Second SDRAM
>> I/O Width
>> + SPD5_SDRAM_BANKS_STRUCT
>> SecondSdramBanks; ///< 11 Second SDRAM
>> Bank Groups and Banks Per Bank Group
>> + SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT
>> SdramBl32AndPostPackageRepair; ///< 12 SDRAM BL32 and
>> Post Package Repair
>> + SPD5_SDRAM_DCA_AND_PASR_STRUCT
>> SdramDcaAndPasr; ///< 13 SDRAM Duty
>> Cycle Adjuster and Partial Array Self Refresh
>> + SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT
>> SdramFaultHandlingAndTempSense; ///< 14 SDRAM Fault
>> Handling and Temperature Sense
>> + UINT8 Reserved0;
>> ///< 15 Reserved
>> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
>> ModuleNominalVoltageVdd; ///< 16 SDRAM Nominal
>> Voltage, VDD
>> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
>> ModuleNominalVoltageVddq; ///< 17 SDRAM Nominal
>> Voltage, VDDQ
>> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
>> ModuleNominalVoltageVpp; ///< 18 SDRAM Nominal
>> Voltage, VPP
>> + SPD5_SDRAM_TIMINGS_STRUCT
>> SdramUsesNonStandardTimings; ///< 19 SDRAM Timing
>> + SPD5_SDRAM_T_STRUCT tCKavgMin;
>> ///< 20-21 SDRAM Minimum Cycle Time (tCK_avg_min)
>> + SPD5_SDRAM_T_STRUCT tCKavgMax;
>> ///< 22-23 SDRAM Maximum Cycle Time (tCK_avg_max)
>> + SPD5_CAS_LATENCIES_SUPPORTED_STRUCT
>> CasLatenciesSupported; ///< 24-28 SDRAM CAS Latenies
>> Supported
>> + UINT8 Reserved1;
>> ///< 29 Reserved
>> + SPD5_SDRAM_T_STRUCT tAA;
>> ///< 30-31 SDRAM Read Command to First Data (tAA)
>> + SPD5_SDRAM_T_STRUCT tRCD;
>> ///< 32-33 SDRAM Activate to Read or Write Command Delay (tRCD)
>> + SPD5_SDRAM_T_STRUCT tRP;
>> ///< 34-35 SDRAM Row Precharge Time (tRP)
>> + SPD5_SDRAM_T_STRUCT tRAS;
>> ///< 36-37 SDRAM Activate to Precharge Command Period (tRAS)
>> + SPD5_SDRAM_T_STRUCT tRC;
>> ///< 38-39 SDRAM Activate to Activate or Refresh Command Period (tRC)
>> + SPD5_SDRAM_T_STRUCT tWR;
>> ///< 40-41 SDRAM Write Recovery Time (tWR)
>> + SPD5_SDRAM_T_STRUCT tRFC1_tRFC1Slr;
>> ///< 42-43 SDRAM Normal Refresh Recovery Time (tRFC1, tRFC1_slr)
>> + SPD5_SDRAM_T_STRUCT tRFC2_tRFC2Slr;
>> ///< 44-45 SDRAM Fine Granularity Refresh Recovery Time (tRFC2,
>> tRFC2_slr)
>> + SPD5_SDRAM_T_STRUCT
>> tRFCsb_tRFCsbSlr; ///< 46-47 SDRAM Same Bank
>> Refresh Recovery Time (tRFC_sb, tRFC_sb_slr)
>> + SPD5_SDRAM_T_STRUCT tRFC1Dlr;
>> ///< 48-49 SDRAM Normal Refresh Recovery Time, 3DS Different Logical
>> Rank (tRFC1_dlr)
>> + SPD5_SDRAM_T_STRUCT tRFC2Dlr;
>> ///< 50-51 SDRAM Fine Granularity Refresh Recovery Time, 3DS Different
>> Logical Rank (tRFC2_dir)
>> + SPD5_SDRAM_T_STRUCT tRFCsbDir;
>> ///< 52-53 SDRAM Same Bank Refresh Recovery Time, 3DS Different Logical
>> Rank (tRFC_sb_dlr)
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> FirstSdramRefreshManagement; ///< 54-55 SDRAM Refresh
>> Management, First SDRAM
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> SecondSdramRefreshManagement; ///< 56-57 SDRAM Refresh
>> Management, Second SDRAM
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> FirstSdramAdaptiveRefreshMgmtLevelA; ///< 58-59 SDRAM Adaptive
>> Refresh Management, First DRAM, ARFM Level A
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> SecondSdramAdaptiveRefreshMgmtLevelA; ///< 60-61 SDRAM Adaptive
>> Refresh Management, Second SDRAM, ARFM Level A
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> FirstSdramAdaptiveRefreshMgmtLevelB; ///< 62-63 SDRAM Adaptive
>> Refresh Management, First SDRAM, ARFM Level B
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> SecondSdramAdaptiveRefreshMgmtLevelB; ///< 64-65 SDRAM Adaptive
>> Refresh Management, Second SDRAM, ARFM Level B
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> FirstSdramAdaptiveRefreshMgmtLevelC; ///< 66-67 SDRAM Adaptive
>> Refresh Management, First SDRAM, ARFM Level C
>> + SPD5_REFRESH_MANAGEMENT_STRUCT
>> SecondSdramAdaptiveRefreshMgmtLevelC; ///< 68-69 SDRAM Adaptive
>> Refresh Management, Second SDRAM, ARFM Level C
>> + SPD5_SDRAM_T_STRUCT tRRD_L;
>> ///< 70-71 SDRAM Activate to Activate Command Delay for Same Bank
>> Group (tRRD_L)
>> + UINT8
>> tRRD_L_LowerClockLimit; ///< 72 SDRAM Activate to
>> Activate Command Delay for Same Bank Group, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tCCD_L;
>> ///< 73-74 SDRAM Read to Read Command Delay for Same Bank Group
>> (tCCD_L)
>> + UINT8
>> tCCD_L_LowerClockLimit; ///< 75 SDRAM Read to
>> Read Command Delay for Same Bank Group, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tCCD_L_WR;
>> ///< 76-77 SDRAM Write to Write Command Delay for Same Bank Group
>> (tCCD_L_WR)
>> + UINT8
>> tCCD_L_WR_LowerClockLimit; ///< 78 SDRAM Write to
>> Write Command Delay for Same Bank Group, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tCCD_L_WR2;
>> ///< 79-80 SDRAM Write to Write Command Delay for Same Bank Group,
>> Second Write not RMW (tCCD_L_WR2)
>> + UINT8
>> tCCD_L_WR2_LowerClockLimit; ///< 81 SDRAM Write to
>> Write Command Delay for Same Bank Group, Second Write not RMW, Lower
>> Clock Limit
>> + SPD5_SDRAM_T_STRUCT tFAW;
>> ///< 82-83 SDRAM Four Activate Window (tFAW)
>> + UINT8
>> tFAW_LowerClockLimit; ///< 84 SDRAM Four
>> Activate Window, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tCCD_L_WTR;
>> ///< 85-86 SDRAM Write to Read Command Delay for Same Bank
>> (tCCD_L_WTR)
>> + UINT8
>> tCCD_L_WTR_LowerClockLimit; ///< 87 SDRAM Write to
>> Read Command Delay for Same Bank, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tCCD_S_WTR;
>> ///< 88-89 SDRAM Write to Read Command Delay for Different Bank Group
>> (tCCD_S_WTR)
>> + UINT8
>> tCCD_S_WTR_LowerClockLimit; ///< 90 SDRAM Write to
>> Read Command Delay for Different Bank Group, Lower Clock Limit
>> + SPD5_SDRAM_T_STRUCT tRTP_tRTPslr;
>> ///< 91-92 SDRAM Read to Precharge Command Delay (tRTP, tRTP_slr)
>> + UINT8
>> tRTP_tRTPslr_LowerClockLimit; ///< 93 SDRAM Read to
>> Precharge Command Delay, Lower Clock Limit
>> + UINT8 Reserved2[127 -
>> 94 + 1]; ///< 94-127 Reserved
>> +} SPD5_BASE_SECTION;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_BASE_SECTION) == 128, "sizeof
>> (SPD5_BASE_SECTION) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef union {
>> + struct {
>> + UINT8 SerialNumberHashingSequence : 3; ///< Bits 2:0
>> + UINT8 Reserved : 5; ///< Bits 7:3
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_HASHING_SEQUENCE;
>> +
>> +typedef union {
>> + struct {
>> + UINT16 ContinuationCount : 7; ///< Bits 6:0
>> + UINT16 ContinuationParity : 1; ///< Bits 7:7
>> + UINT16 LastNonZeroByte : 8; ///< Bits 15:8
>> + } Bits;
>> + UINT16 Data;
>> + UINT8 Data8[2];
>> +} SPD5_MANUFACTURER_ID_CODE;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 DeviceType : 4; ///< Bits 3:0
>> + UINT8 Reserved0 : 2; ///< Bits 5:4
>> + UINT8 Rsvd_TempSensor : 1; ///< Bits 6:6
>> + UINT8 DeviceInstalled : 1; ///< Bits 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_DEVICE_TYPE;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Height : 5; ///< Bits 4:0
>> + UINT8 Reserved : 3; ///< Bits 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_NOMINAL_HEIGHT;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 FrontThickness : 4; ///< Bits 3:0
>> + UINT8 BackThickness : 4; ///< Bits 7:4
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_NOMINAL_THICKNESS;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Card : 5; ///< Bits 4:0
>> + UINT8 Revision : 3; ///< Bits 7:5
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_REFERENCE_RAW_CARD;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 DramRowCount : 2; ///< Bits
>> 1:0
>> + UINT8 HeatSpreader : 1; ///< Bits 2:2
>> + UINT8 Reserved : 1; ///< Bits 3:3
>> + UINT8 OperatingTempRange : 4; ///< Bits 7:4
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_DIMM_ATTRIBUTES;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 Reserved0 : 3; ///< Bits 2:0
>> + UINT8 PackageRanksCount : 3; ///< Bits 5:3
>> + UINT8 RankMix : 1; ///< Bits 6:6
>> + UINT8 Reserved1 : 1; ///< Bits 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MODULE_ORGANIZATION;
>> +
>> +typedef union {
>> + struct {
>> + UINT8 PrimaryBusWidthPerSubChannel : 3; ///< Bits 2:0
>> + UINT8 BusWidthExtensionPerSubChannel : 2; ///< Bits 4:3
>> + UINT8 SubChannelsPerDimmCount : 2; ///< Bits 6:5
>> + UINT8 Reserved : 1; ///< Bits 7:7
>> + } Bits;
>> + UINT8 Data;
>> +} SPD5_MEMORY_CHANNEL_BUS_WIDTH;
>> +
>> +
>> +typedef struct {
>> + SPD5_REVISION_STRUCT SpdRevisionBytes192_447;
>> ///< 192 SPD Revision for SPD bytes 192-447
>> + SPD5_HASHING_SEQUENCE HashingSequence;
>> ///< 193 Hashing Sequence
>> + SPD5_MANUFACTURER_ID_CODE SpdManufacturer;
>> ///< 194-195 SPD Manufacturer ID Code
>> + SPD5_MODULE_DEVICE_TYPE SpdDeviceType;
>> ///< 196 SPD Device Type
>> + SPD5_REVISION_STRUCT SpdRevisionNumber;
>> ///< 197 SPD Device Revision Number
>> + SPD5_MANUFACTURER_ID_CODE Pmic0Manufacturer;
>> ///< 198-199 PMIC 0 Manufacturer ID Code
>> + SPD5_MODULE_DEVICE_TYPE Pmic0DeviceType;
>> ///< 200 PMIC 0 Device Type
>> + SPD5_REVISION_STRUCT Pmic0RevisionNumber;
>> ///< 201 PMIC 0 Revision Number
>> + SPD5_MANUFACTURER_ID_CODE Pmic1Manufacturer;
>> ///< 202-203 PMIC 1 Manufacturer ID Code
>> + SPD5_MODULE_DEVICE_TYPE Pmic1DeviceType;
>> ///< 204 PMIC 1 Device Type
>> + SPD5_REVISION_STRUCT Pmic1RevisionNumber;
>> ///< 205 PMIC 1 Revision Number
>> + SPD5_MANUFACTURER_ID_CODE Pmic2Manufacturer;
>> ///< 206-207 PMIC 2 Manufacturer ID Code
>> + SPD5_MODULE_DEVICE_TYPE Pmic2DeviceType;
>> ///< 208 PMIC 2 Device Type
>> + SPD5_REVISION_STRUCT Pmic2RevisionNumber;
>> ///< 209 PMIC 2 Revision Number
>> + SPD5_MANUFACTURER_ID_CODE ThermalSensorManufacturer;
>> ///< 210-211 Thermal Sensor Manufacturer ID Code
>> + SPD5_MODULE_DEVICE_TYPE ThermalSensorDeviceType;
>> ///< 212 Thermal Sensor Revision Number
>> + SPD5_REVISION_STRUCT ThermalSensorRevisionNumber;
>> ///< 213 Thermal Sensor Revision Number
>> + UINT8 Reserved0[229 - 214 + 1];
>> ///< 214-229 Reserved
>> + SPD5_MODULE_NOMINAL_HEIGHT ModuleNominalHeight;
>> ///< 230 Module Nominal Height
>> + SPD5_MODULE_NOMINAL_THICKNESS ModuleMaximumThickness;
>> ///< 231 Module Maximum Thickness
>> + SPD5_MODULE_REFERENCE_RAW_CARD ReferenceRawCardUsed;
>> ///< 232 Reference Raw Card Used
>> + SPD5_MODULE_DIMM_ATTRIBUTES DimmAttributes;
>> ///< 233 DIMM Attributes
>> + SPD5_MODULE_ORGANIZATION ModuleOrganization;
>> ///< 234 Module Organization
>> + SPD5_MEMORY_CHANNEL_BUS_WIDTH MemoryChannelBusWidth;
>> ///< 235 Memory Channel Bus Width
>> + UINT8 Reserved1[239 - 236 + 1];
>> ///< 236-239 Reserved
>> +} SPD5_MODULE_COMMON;
>> +
>> + STATIC_ASSERT (sizeof (SPD5_MODULE_COMMON) == 48, "sizeof
>> (SPD5_MODULE_COMMON) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef struct {
>> + UINT8 Reserved[447 - 240 + 1]; ///< 240-447 Reserved
>> +} SPD5_MODULE_SOLDER_DOWN;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_SOLDER_DOWN) == 208, "sizeof
>> (SPD5_MODULE_SOLDER_DOWN) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE ClockDriverManufacturerId; ///<
>> 240-241 Clock Driver Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT ClockDriverDeviceType; ///< 242
>> Clock Driver Device Type
>> + SPD5_REVISION_STRUCT ClockDriverRevisionNumber; ///< 243
>> Clock Driver Revision Number
>> + UINT8 Reserved[447 - 244 + 1];
>> +} SPD5_MODULE_UNBUFFERED;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_UNBUFFERED) == 208, "sizeof
>> (SPD5_MODULE_UNBUFFERED) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE
>> RegisteringClockDriverManufacturerId; ///< 240-241
>> Registering Clock Driver Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
>> ///< 242 Register Device Type
>> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
>> ///< 243 Register Revision Number
>> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
>> ///< 244-245 Data Buffer Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
>> ///< 246 Data Buffer Device Type
>> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
>> ///< 247 Data Buffer Revision Number
>> + UINT8 RcdRw08ClockDriverEnable;
>> ///< 248 RCD-RW08 Clock Driver Enable
>> + UINT8
>> RcdRw09OutputAddressAndControlEnable; ///< 249
>> RCD-RW09 Output Address and Control Enable
>> + UINT8 RcdRw0AQckDriverCharacteristics;
>> ///< 250 RCD-RW0A QCK Driver Characteristics
>> + UINT8 RcdRw0B;
>> ///< 251 RCD-RW0B
>> + UINT8
>> RcdRw0CQxCaAndQcsnDriverCharacteristics; ///< 252
>> RCD-RW0C QxCA and QxCS_n Driver Characteristics
>> + UINT8
>> RcdRw0DDataBufferInterfaceDriverCharacteristics; ///< 253
>> RCD-RW0D Data Buffer Interface Driver Characteristics
>> + UINT8
>> RcdRw0EQckQcaAndQcsOutputSlewRate; ///< 254
>> RCD-RW0E QCK, QCA and QCS Output Slew Rate
>> + UINT8
>> RcdRw0FBckBcomAndBcsOutputSlewRate; ///< 255
>> RCD-RW0F BCK, BCOM, and BCS Output Slew Rate
>> + UINT8 DbRw86DqsRttParkTermination;
>> ///< 256 DB-RW86 DQS RTT Park Termination
>> + UINT8 Reserved[447 - 257 + 1];
>> ///< 257-447 Reserved
>> +} SPD5_MODULE_REGISTERED;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_REGISTERED) == 208, "sizeof
>> (SPD5_MODULE_REGISTERED) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE
>> MultiplexRegisteringClockDriverManufacturerId; ///< 240-241 Multiplex
>> Registering Clock Driver Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
>> ///< 242 Register Device Type
>> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
>> ///< 243 Register Revision Number
>> + SPD5_MANUFACTURER_ID_CODE MultiplexDataBufferManufacturerId;
>> ///< 244-245 Multiplex Data Buffer Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
>> ///< 246 Data Buffer Device Type
>> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
>> ///< 247 Data Buffer Revision Number
>> + UINT8 Reserved[447 - 248 + 1];
>> ///< 248-447 Reserved
>> +} SPD5_MODULE_MULTIPLEXED_RANK;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_MULTIPLEXED_RANK) == 208,
>> "sizeof (SPD5_MODULE_MULTIPLEXED_RANK) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE
>> DifferentialMemoryBufferManufacturerId; ///< 240-241
>> Differential Memory Buffer Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT DifferentialMemoryBufferDeviceType;
>> ///< 242 Differential Memory Buffer Device Type
>> + SPD5_REVISION_STRUCT
>> DifferentialMemoryBufferRevisionNumber; ///< 243
>> Differential Memory Buffer Revision Number
>> + UINT8 Reserved[447 - 244 + 1];
>> ///< 244-447 Reserved
>> +} SPD5_MODULE_DIFFERENTIAL;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_DIFFERENTIAL) == 208, "sizeof
>> (SPD5_MODULE_DIFFERENTIAL) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE
>> RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock
> Driver
>> Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
>> ///< 242 Register Device Type
>> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
>> ///< 243 Register Revision Number
>> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
>> ///< 244-245 Data Buffer Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
>> ///< 246 Data Buffer Device Type
>> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
>> ///< 247 Data Buffer Revision Number
>> + UINT8 Reserved[447 - 248 + 1];
>> ///< 248-447 Reserved
>> +} SPD5_MODULE_NVDIMM_N;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_N) == 208, "sizeof
>> (SPD5_MODULE_NVDIMM_N) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE
>> RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock
> Driver
>> Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
>> ///< 242 Register Device Type
>> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
>> ///< 243 Register Revision Number
>> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
>> ///< 244-245 Data Buffer Manufacturer ID Code
>> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
>> ///< 246 Data Buffer Device Type
>> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
>> ///< 247 Data Buffer Revision Number
>> + UINT8 ModuleStorageCapacity[2];
>> ///< 248-249 Module Storage Capacity
>> + UINT8 ProtocolProfile;
>> ///< 250 Protocol Profile
>> + UINT8 Reserved[447 - 251 + 1];
>> ///< 251-447 Reserved
>> +} SPD5_MODULE_NVDIMM_P;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_P) == 208, "sizeof
>> (SPD5_MODULE_NVDIMM_P) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef union {
>> + SPD5_MODULE_SOLDER_DOWN SolderDown; ///<
>> 240-447 Solder Down Memory Module Types
>> + SPD5_MODULE_UNBUFFERED Unbuffered; ///< 240-447
>> Unbuffered Memory Module Types
>> + SPD5_MODULE_REGISTERED Registered; ///< 240-447
>> Registered Memory Module Types
>> + SPD5_MODULE_MULTIPLEXED_RANK MultiplexedRank; ///< 240-447
>> Mutiplexed Rank Memory Module Types
>> + SPD5_MODULE_DIFFERENTIAL Differential; ///< 240-447
>> Differentual (DDR-D) Memory Module Types
>> + SPD5_MODULE_NVDIMM_N NvDimmN; ///<
>> 240-447 Non-Volatile (NVDIMM-N) Hybrid Memory Parameters
>> + SPD5_MODULE_NVDIMM_P NvDimmP; ///<
>> 240-447 Non-Volatile (NVDIMM-P) Hybrid Memory Parameters
>> +} SPD5_MODULE_SPECIFIC;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MODULE_SPECIFIC) == 208, "sizeof
>> (SPD5_MODULE_SPECIFIC) does not match DDR5 SPD 1.1 specification");
>> +
>> +typedef struct {
>> + UINT8 ManufacturerSpecificData[639 - 555 + 1]; ///< 639-555
>> Manufacturer's Specific Data
>> +} SPD5_MANUFACTURER_SPECIFIC;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURER_SPECIFIC) == 85, "sizeof
>> (SPD5_MANUFACTURER_SPECIFIC) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + UINT8 Year; ///< Year
>> represented in BCD (00h = 2000)
>> + UINT8 Week; ///< Year
>> represented in BCD (47h = week 47)
>> +} SPD5_MANUFACTURING_DATE;
>> +
>> +typedef union {
>> + UINT32 SerialNumber32; ///< 517-520
>> Serial Number
>> + UINT16 SerialNumber16[2];
>> + UINT8 SerialNumber8[4];
>> +} SPD5_MANUFACTURER_SERIAL_NUMBER;
>> +
>> +typedef struct {
>> + UINT8 ModulePartNumber[550 - 521 + 1]; ///< 521-550
>> Module Part Number
>> +} SPD5_MODULE_PART_NUMBER;
>> +
>> +typedef UINT8 SPD5_MANUFACTURING_LOCATION; ///< 514
>> Module Manufacturing Location
>> +typedef UINT8 SPD5_MODULE_REVISION_CODE; ///< 551
>> Module Revision Code
>> +typedef UINT8 SPD5_DRAM_STEPPING; ///< 554 DRAM
>> Stepping
>> +
>> +typedef struct {
>> + SPD5_MANUFACTURER_ID_CODE ModuleManufacturer;
>> ///< 512-513 Module Manufacturer ID Code
>> + SPD5_MANUFACTURING_LOCATION
>> ModuleManufacturingLocation; ///< 514 Module Manufacuring Location
>> + SPD5_MANUFACTURING_DATE ModuleManufacturingDate;
>> ///< 515-516 Module Manufacturing Date
>> + SPD5_MANUFACTURER_SERIAL_NUMBER ModuleSerialNumber;
>> ///< 517-520 Module Serial Number
>> + SPD5_MODULE_PART_NUMBER ModulePartNumber;
>> ///< 521-550 Module Part Number
>> + SPD5_MODULE_REVISION_CODE ModuleRevisionCode;
>> ///< 551 Module Revision Code
>> + SPD5_MANUFACTURER_ID_CODE DramManufacturer;
>> ///< 552-553 DRAM Manufacturer ID Code
>> + SPD5_DRAM_STEPPING DramStepping;
>> ///< 554 DRAM Stepping
>> + SPD5_MANUFACTURER_SPECIFIC ManufacturerSpecificData;
>> ///< 555-639 Manufacturer's Specific Data
>> +} SPD5_MANUFACTURING_DATA;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURING_DATA) == 128, "sizeof
>> (SPD5_MANUFACTURING_DATA) does not match DDR5 SPD 1.1
>> specification");
>> +
>> +typedef struct {
>> + UINT8 EndUserBytes[1023 - 640 + 1]; ///< 640-1023
>> End User Programmable Bytes
>> +} SPD5_END_USER_SECTION;
>> +
>> +STATIC_ASSERT (sizeof (SPD5_END_USER_SECTION) == 384, "sizeof
>> (SPD5_END_USER_SECTION) does not match DDR5 SPD 1.1 specification");
>> +
>> +///
>> +/// DDR5 Serial Presence Detect structure
>> +///
>> +typedef struct {
>> + SPD5_BASE_SECTION Base; ///<
>> 0-127 Base Configuration and DRAM Parameters
>> + UINT8 Reserved0[191 - 128 + 1]; ///< 128-191
>> Reserved
>> + SPD5_MODULE_COMMON Common; ///<
>> 192-239 Common Module Parameters
>> + SPD5_MODULE_SPECIFIC Module; ///<
>> 240-447 Module Type Specific Information
>> + UINT8 Reserved1[509 - 448 + 1]; ///< 448-509
>> Reserved for future use
>> + UINT8 Crc[2]; ///<
>> 510-511 CRC for bytes 0-509
>> + SPD5_MANUFACTURING_DATA ManufacturerInfo; ///<
>> 512-639 Manufacturing Information
>> + SPD5_END_USER_SECTION EndUser; ///<
>> 640-1023 End User Programmable
>> +} SPD_DDR5;
>> +
>> +STATIC_ASSERT (sizeof (SPD_DDR5) == 1024, "sizeof (SPD_DDR5) does not
>> match DDR5 SPD 1.1 specification");
>> +
>> +#pragma pack (pop)
>> +
>> +#endif /* SPD_DDR5_H_ */
>> --
>> 2.30.2
>>
>>
>>
>>
>>
>>
>>
>
>
>
>
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01
2023-02-10 11:04 ` Rebecca Cran
@ 2023-02-10 18:01 ` Michael D Kinney
2023-02-14 15:37 ` Rebecca Cran
0 siblings, 1 reply; 4+ messages in thread
From: Michael D Kinney @ 2023-02-10 18:01 UTC (permalink / raw)
To: devel@edk2.groups.io, rebecca@bsdio.com, Gao, Liming
Cc: 'Liming Gao', Liu, Zhiguang, Kinney, Michael D
We usually do not include basetype includes from .h files in Protocol/PPI/GUID/IndustryStandard.
This is because we always get base types from AutoGen.h and from C/H files in modules/libs
That have to include top level include files for their module type. Base.h, PiPei.h, PiDxe,h, Uefi.h.
Also UINT8 is available from Base.h that does not assume UEFI or PI env.
Mike
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Rebecca Cran
> Sent: Friday, February 10, 2023 3:05 AM
> To: devel@edk2.groups.io; Gao, Liming <gaoliming@byosoft.com.cn>
> Cc: 'Liming Gao' <liming.gao@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>; Liu, Zhiguang <zhiguang.liu@intel.com>
> Subject: Re: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01
>
> Yes I’ve verified locally that this file builds. It doesn’t pass CI though since like the DDR4 header it has fields that begin
> with a lower-case letter.
>
> I added the include of Uefi/UefiBaseType.h because the UEFI type UINT8 is used.
>
> —
> Rebecca
>
> On Thu, Feb 9, 2023, at 10:23 PM, gaoliming via groups.io wrote:
> > Rebecca:
> > Have you verified this header file with build? For example, include this
> > new header file into module, and make sure this module pass build.
> >
> >> -----邮件原件-----
> >> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Rebecca Cran
> >> 发送时间: 2023年2月9日 1:48
> >> 收件人: devel@edk2.groups.io
> >> 抄送: Rebecca Cran <rebecca@quicinc.com>; Liming Gao
> >> <liming.gao@intel.com>; Michael D Kinney <michael.d.kinney@intel.com>;
> >> Zhiguang Liu <zhiguang.liu@intel.com>
> >> 主题: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to
> >> IndustryStandard per JESD400-5A.01
> >>
> >> Copying the style of SdramSpdDdr4.h, add DDR5 SPD definitions to
> >> SpdDdr5.h per JEDEC JESD400-5A.01 specification
> >> (https://www.jedec.org/standards-documents/docs/jesd400-5a01).
> >>
> >> Signed-off-by: Rebecca Cran <rebecca@quicinc.com>
> >> Cc: Liming Gao <liming.gao@intel.com>
> >> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> >> Cc: Zhiguang Liu <zhiguang.liu@intel.com>
> >> ---
> >> MdePkg/Include/IndustryStandard/SpdDdr5.h | 541
> >> ++++++++++++++++++++
> >> 1 file changed, 541 insertions(+)
> >>
> >> diff --git a/MdePkg/Include/IndustryStandard/SpdDdr5.h
> >> b/MdePkg/Include/IndustryStandard/SpdDdr5.h
> >> new file mode 100644
> >> index 000000000000..305ab69af852
> >> --- /dev/null
> >> +++ b/MdePkg/Include/IndustryStandard/SpdDdr5.h
> >> @@ -0,0 +1,541 @@
> >> +/** @file
> >> + This file contains definitions for DDR5 SPD.
> >> +
> >> + Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights
> >> reserved.<BR>
> >> + Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> >> + SPDX-License-Identifier: BSD-2-Clause-Patent
> >> +
> >> + @par Revision Reference:
> >> + - DDR5 Serial Presence Detect (SPD), Document Release 1.1 (Jan 2023)
> >> + https://www.jedec.org/standards-documents/docs/jesd400-5a01
> >> +**/
> >> +
> >> +#ifndef SPD_DDR5_H_
> >> +#define SPD_DDR5_H_
> >> +
> >> +#include <Uefi/UefiBaseType.h>
> >
> > Is there any uefi definition used in this header file? If no, this include
> > can be removed.
> >
> > Thanks
> > Liming
> >
> >> +
> >> +#pragma pack (push, 1)
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 BetaLevel3_0 : 4; ///< Bits
> >> 3:0
> >> + UINT8 BytesTotal : 3; ///< Bits
> >> 6:4
> >> + UINT8 BetaLevel4 : 1; ///< Bits
> >> 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_DEVICE_DESCRIPTION_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Minor : 4; ///< Bits
> >> 3:0
> >> + UINT8 Major : 4; ///< Bits
> >> 7:4
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_REVISION_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Type : 8; ///< Bits
> >> 7:0
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_DEVICE_TYPE_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 ModuleType : 4; ///< Bits
> >> 3:0
> >> + UINT8 HybridMedia : 3; ///< Bits
> >> 6:4
> >> + UINT8 Hybrid : 1; ///< Bits
> >> 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_TYPE_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Density : 5; ///< Bits
> >> 4:0
> >> + UINT8 Die : 3; ///< Bits
> >> 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_DENSITY_PACKAGE_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 RowAddress : 5; ///< Bits
> >> 4:0
> >> + UINT8 ColumnAddress : 3; ///< Bits
> >> 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_ADDRESSING_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Reserved : 5; ///< Bits
> >> 4:0
> >> + UINT8 IoWidth : 3; ///< Bits
> >> 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_IO_WIDTH_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 BanksPerBankGroup : 3; ///< Bits
> >> 2:0
> >> + UINT8 Reserved : 2; ///< Bits
> >> 4:3
> >> + UINT8 BankGroups : 3; ///< Bits
> >> 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_BANKS_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Reserved0 : 1; ///< Bits
> >> 0:0
> >> + UINT8 Mbist_mPpr : 1; ///< Bits
> >> 1:1
> >> + UINT8 Reserved1 : 2; ///< Bits
> >> 3:2
> >> + UINT8 BL32 : 1; ///< Bits
> >> 4:4
> >> + UINT8 SPprUndo_Lock : 1; ///< Bits
> >> 5:5
> >> + UINT8 Reserved2 : 1; ///< Bits
> >> 6:6
> >> + UINT8 SPprGranularity : 1; ///< Bits 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 DcaTypesSupported : 2; ///< Bits
> >> 1:0
> >> + UINT8 Reserved0 : 2; ///< Bits
> >> 3:2
> >> + UINT8 Pasr : 1; ///< Bits
> >> 4:4
> >> + UINT8 Reserved1 : 3; ///< Bits
> >> 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_DCA_AND_PASR_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 BoundedFault : 1; ///< Bits
> >> 0:0
> >> + UINT8 x4RmwEcsWbSuppressionMrSelector : 1; ///< Bits
> >> 1:1
> >> + UINT8 x4RmwEcsWriteBackSuppresion : 1; ///< Bits
> >> 2:2
> >> + UINT8 WideTemperatureSense : 1; ///< Bits
> >> 3:3
> >> + UINT8 Reserved : 4; ///< Bits
> >> 7:4
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Endurant : 2; ///< Bits
> >> 1:0
> >> + UINT8 Operational : 2; ///< Bits
> >> 3:2
> >> + UINT8 Nominal : 4; ///< Bits
> >> 7:4
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 NonStandardCoreTimings : 1; ///< Bits
> >> 0:0
> >> + UINT8 Reserved : 7; ///< Bits
> >> 7:1
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_SDRAM_TIMINGS_STRUCT;
> >> +
> >> +typedef struct {
> >> + UINT8 Lsb;
> >> + UINT8 Msb;
> >> +} SPD5_SDRAM_T_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT32 Cl20 : 1; ///< Bits
> >> 0:0
> >> + UINT32 Cl22 : 1; ///< Bits
> >> 1:1
> >> + UINT32 Cl24 : 1; ///< Bits
> >> 2:2
> >> + UINT32 Cl26 : 1; ///< Bits
> >> 3:3
> >> + UINT32 Cl28 : 1; ///< Bits
> >> 4:4
> >> + UINT32 Cl30 : 1; ///< Bits
> >> 5:5
> >> + UINT32 Cl32 : 1; ///< Bits
> >> 6:6
> >> + UINT32 Cl34 : 1; ///< Bits
> >> 7:7
> >> + UINT32 Cl36 : 1; ///< Bits
> >> 8:8
> >> + UINT32 Cl38 : 1; ///< Bits
> >> 9:9
> >> + UINT32 Cl40 : 1; ///< Bits
> >> 10:10
> >> + UINT32 Cl42 : 1; ///< Bits
> >> 11:11
> >> + UINT32 Cl44 : 1; ///< Bits
> >> 12:12
> >> + UINT32 Cl46 : 1; ///< Bits
> >> 13:13
> >> + UINT32 Cl48 : 1; ///< Bits
> >> 14:14
> >> + UINT32 Cl50 : 1; ///< Bits
> >> 15:15
> >> + UINT32 Cl52 : 1; ///< Bits
> >> 16:16
> >> + UINT32 Cl54 : 1; ///< Bits
> >> 17:17
> >> + UINT32 Cl56 : 1; ///< Bits
> >> 18:18
> >> + UINT32 Cl58 : 1; ///< Bits
> >> 19:19
> >> + UINT32 Cl60 : 1; ///< Bits
> >> 20:20
> >> + UINT32 Cl62 : 1; ///< Bits
> >> 21:21
> >> + UINT32 Cl64 : 1; ///< Bits
> >> 22:22
> >> + UINT32 Cl66 : 1; ///< Bits
> >> 23:23
> >> + UINT32 Cl68 : 1; ///< Bits
> >> 24:24
> >> + UINT32 Cl70 : 1; ///< Bits
> >> 25:25
> >> + UINT32 Cl72 : 1; ///< Bits
> >> 26:26
> >> + UINT32 Cl74 : 1; ///< Bits
> >> 27:27
> >> + UINT32 Cl76 : 1; ///< Bits
> >> 28:28
> >> + UINT32 Cl78 : 1; ///< Bits
> >> 29:29
> >> + UINT32 Cl80 : 1; ///< Bits
> >> 30:30
> >> + UINT32 Cl82 : 1; ///< Bits
> >> 31:31
> >> + } Byte0_3;
> >> + struct {
> >> + UINT8 Cl84 : 1; ///< Bits
> >> 0:0
> >> + UINT8 Cl86 : 1; ///< Bits
> >> 1:1
> >> + UINT8 Cl88 : 1; ///< Bits
> >> 2:2
> >> + UINT8 Cl90 : 1; ///< Bits
> >> 3:3
> >> + UINT8 Cl92 : 1; ///< Bits
> >> 4:4
> >> + UINT8 Cl94 : 1; ///< Bits
> >> 5:5
> >> + UINT8 Cl96 : 1; ///< Bits
> >> 6:6
> >> + UINT8 Cl98 : 1; ///< Bits
> >> 7:7
> >> + } Byte4;
> >> + UINT8 Data8[5];
> >> +} SPD5_CAS_LATENCIES_SUPPORTED_STRUCT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT16 RfmRequired : 1; ///< Bits
> >> 0:0
> >> + UINT16 Raaimt : 4; ///< Bits
> >> 4:1
> >> + UINT16 Raammt : 3; ///<
> >> Bits 7:5
> >> + UINT16 DrfmSupported : 1; ///< Bits
> >> 8:8
> >> + UINT16 RecommendedBoundedRefreshCfg : 2; ///< Bits
> >> 10:9
> >> + UINT16 BrcSupportLevel : 1; ///< Bits
> >> 11:11
> >> + UINT16 ArfmLevel : 2; ///< Bits
> >> 13:12
> >> + UINT16 RfmRaaCounterDecPerRefCmd : 2; ///< Bits
> >> 15:14
> >> + } Bits;
> >> + UINT16 Data;
> >> +} SPD5_REFRESH_MANAGEMENT_STRUCT;
> >> +
> >> +typedef struct {
> >> + SPD5_DEVICE_DESCRIPTION_STRUCT Description;
> >> ///< 0 Number of Bytes in SPD Device and Beta Level
> >> + SPD5_REVISION_STRUCT Revision;
> >> ///< 1 SPD Revision for Base Configuration Parameters
> >> + SPD5_DEVICE_TYPE_STRUCT
> >> HostBusCommandProtocolType; ///< 2 Host Bus
> >> Command Protocol Type
> >> + SPD5_MODULE_TYPE_STRUCT ModuleType;
> >> ///< 3 Module Type
> >> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT
> >> FirstSdramDensityAndPackage; ///< 4 First SDRAM Density
> >> and Package
> >> + SPD5_SDRAM_ADDRESSING_STRUCT
> >> FirstSdramAddressing; ///< 5 First SDRAM
> >> Addressing
> >> + SPD5_SDRAM_IO_WIDTH_STRUCT
> >> FirstSdramIoWidth; ///< 6 First SDRAM I/O
> >> Width
> >> + SPD5_SDRAM_BANKS_STRUCT
> >> FirstSdramBanks; ///< 7 First SDRAM Bank
> >> Groups and Banks Per Bank Group
> >> + SPD5_SDRAM_DENSITY_PACKAGE_STRUCT
> >> SecondSdramDensityAndPackage; ///< 8 Second SDRAM
> >> Density and Package
> >> + SPD5_SDRAM_ADDRESSING_STRUCT
> >> SecondSdramAddressing; ///< 9 Second SDRAM
> >> Addressing
> >> + SPD5_SDRAM_IO_WIDTH_STRUCT
> >> SecondSdramIoWidth; ///< 10 Second SDRAM
> >> I/O Width
> >> + SPD5_SDRAM_BANKS_STRUCT
> >> SecondSdramBanks; ///< 11 Second SDRAM
> >> Bank Groups and Banks Per Bank Group
> >> + SPD5_SDRAM_BL32_POST_PACKAGE_REPAIR_STRUCT
> >> SdramBl32AndPostPackageRepair; ///< 12 SDRAM BL32 and
> >> Post Package Repair
> >> + SPD5_SDRAM_DCA_AND_PASR_STRUCT
> >> SdramDcaAndPasr; ///< 13 SDRAM Duty
> >> Cycle Adjuster and Partial Array Self Refresh
> >> + SPD5_SDRAM_FAULT_HANDLING_TEMP_SENSE_STRUCT
> >> SdramFaultHandlingAndTempSense; ///< 14 SDRAM Fault
> >> Handling and Temperature Sense
> >> + UINT8 Reserved0;
> >> ///< 15 Reserved
> >> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
> >> ModuleNominalVoltageVdd; ///< 16 SDRAM Nominal
> >> Voltage, VDD
> >> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
> >> ModuleNominalVoltageVddq; ///< 17 SDRAM Nominal
> >> Voltage, VDDQ
> >> + SPD5_MODULE_NOMINAL_VOLTAGE_STRUCT
> >> ModuleNominalVoltageVpp; ///< 18 SDRAM Nominal
> >> Voltage, VPP
> >> + SPD5_SDRAM_TIMINGS_STRUCT
> >> SdramUsesNonStandardTimings; ///< 19 SDRAM Timing
> >> + SPD5_SDRAM_T_STRUCT tCKavgMin;
> >> ///< 20-21 SDRAM Minimum Cycle Time (tCK_avg_min)
> >> + SPD5_SDRAM_T_STRUCT tCKavgMax;
> >> ///< 22-23 SDRAM Maximum Cycle Time (tCK_avg_max)
> >> + SPD5_CAS_LATENCIES_SUPPORTED_STRUCT
> >> CasLatenciesSupported; ///< 24-28 SDRAM CAS Latenies
> >> Supported
> >> + UINT8 Reserved1;
> >> ///< 29 Reserved
> >> + SPD5_SDRAM_T_STRUCT tAA;
> >> ///< 30-31 SDRAM Read Command to First Data (tAA)
> >> + SPD5_SDRAM_T_STRUCT tRCD;
> >> ///< 32-33 SDRAM Activate to Read or Write Command Delay (tRCD)
> >> + SPD5_SDRAM_T_STRUCT tRP;
> >> ///< 34-35 SDRAM Row Precharge Time (tRP)
> >> + SPD5_SDRAM_T_STRUCT tRAS;
> >> ///< 36-37 SDRAM Activate to Precharge Command Period (tRAS)
> >> + SPD5_SDRAM_T_STRUCT tRC;
> >> ///< 38-39 SDRAM Activate to Activate or Refresh Command Period (tRC)
> >> + SPD5_SDRAM_T_STRUCT tWR;
> >> ///< 40-41 SDRAM Write Recovery Time (tWR)
> >> + SPD5_SDRAM_T_STRUCT tRFC1_tRFC1Slr;
> >> ///< 42-43 SDRAM Normal Refresh Recovery Time (tRFC1, tRFC1_slr)
> >> + SPD5_SDRAM_T_STRUCT tRFC2_tRFC2Slr;
> >> ///< 44-45 SDRAM Fine Granularity Refresh Recovery Time (tRFC2,
> >> tRFC2_slr)
> >> + SPD5_SDRAM_T_STRUCT
> >> tRFCsb_tRFCsbSlr; ///< 46-47 SDRAM Same Bank
> >> Refresh Recovery Time (tRFC_sb, tRFC_sb_slr)
> >> + SPD5_SDRAM_T_STRUCT tRFC1Dlr;
> >> ///< 48-49 SDRAM Normal Refresh Recovery Time, 3DS Different Logical
> >> Rank (tRFC1_dlr)
> >> + SPD5_SDRAM_T_STRUCT tRFC2Dlr;
> >> ///< 50-51 SDRAM Fine Granularity Refresh Recovery Time, 3DS Different
> >> Logical Rank (tRFC2_dir)
> >> + SPD5_SDRAM_T_STRUCT tRFCsbDir;
> >> ///< 52-53 SDRAM Same Bank Refresh Recovery Time, 3DS Different Logical
> >> Rank (tRFC_sb_dlr)
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> FirstSdramRefreshManagement; ///< 54-55 SDRAM Refresh
> >> Management, First SDRAM
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> SecondSdramRefreshManagement; ///< 56-57 SDRAM Refresh
> >> Management, Second SDRAM
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> FirstSdramAdaptiveRefreshMgmtLevelA; ///< 58-59 SDRAM Adaptive
> >> Refresh Management, First DRAM, ARFM Level A
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> SecondSdramAdaptiveRefreshMgmtLevelA; ///< 60-61 SDRAM Adaptive
> >> Refresh Management, Second SDRAM, ARFM Level A
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> FirstSdramAdaptiveRefreshMgmtLevelB; ///< 62-63 SDRAM Adaptive
> >> Refresh Management, First SDRAM, ARFM Level B
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> SecondSdramAdaptiveRefreshMgmtLevelB; ///< 64-65 SDRAM Adaptive
> >> Refresh Management, Second SDRAM, ARFM Level B
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> FirstSdramAdaptiveRefreshMgmtLevelC; ///< 66-67 SDRAM Adaptive
> >> Refresh Management, First SDRAM, ARFM Level C
> >> + SPD5_REFRESH_MANAGEMENT_STRUCT
> >> SecondSdramAdaptiveRefreshMgmtLevelC; ///< 68-69 SDRAM Adaptive
> >> Refresh Management, Second SDRAM, ARFM Level C
> >> + SPD5_SDRAM_T_STRUCT tRRD_L;
> >> ///< 70-71 SDRAM Activate to Activate Command Delay for Same Bank
> >> Group (tRRD_L)
> >> + UINT8
> >> tRRD_L_LowerClockLimit; ///< 72 SDRAM Activate to
> >> Activate Command Delay for Same Bank Group, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tCCD_L;
> >> ///< 73-74 SDRAM Read to Read Command Delay for Same Bank Group
> >> (tCCD_L)
> >> + UINT8
> >> tCCD_L_LowerClockLimit; ///< 75 SDRAM Read to
> >> Read Command Delay for Same Bank Group, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tCCD_L_WR;
> >> ///< 76-77 SDRAM Write to Write Command Delay for Same Bank Group
> >> (tCCD_L_WR)
> >> + UINT8
> >> tCCD_L_WR_LowerClockLimit; ///< 78 SDRAM Write to
> >> Write Command Delay for Same Bank Group, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tCCD_L_WR2;
> >> ///< 79-80 SDRAM Write to Write Command Delay for Same Bank Group,
> >> Second Write not RMW (tCCD_L_WR2)
> >> + UINT8
> >> tCCD_L_WR2_LowerClockLimit; ///< 81 SDRAM Write to
> >> Write Command Delay for Same Bank Group, Second Write not RMW, Lower
> >> Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tFAW;
> >> ///< 82-83 SDRAM Four Activate Window (tFAW)
> >> + UINT8
> >> tFAW_LowerClockLimit; ///< 84 SDRAM Four
> >> Activate Window, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tCCD_L_WTR;
> >> ///< 85-86 SDRAM Write to Read Command Delay for Same Bank
> >> (tCCD_L_WTR)
> >> + UINT8
> >> tCCD_L_WTR_LowerClockLimit; ///< 87 SDRAM Write to
> >> Read Command Delay for Same Bank, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tCCD_S_WTR;
> >> ///< 88-89 SDRAM Write to Read Command Delay for Different Bank Group
> >> (tCCD_S_WTR)
> >> + UINT8
> >> tCCD_S_WTR_LowerClockLimit; ///< 90 SDRAM Write to
> >> Read Command Delay for Different Bank Group, Lower Clock Limit
> >> + SPD5_SDRAM_T_STRUCT tRTP_tRTPslr;
> >> ///< 91-92 SDRAM Read to Precharge Command Delay (tRTP, tRTP_slr)
> >> + UINT8
> >> tRTP_tRTPslr_LowerClockLimit; ///< 93 SDRAM Read to
> >> Precharge Command Delay, Lower Clock Limit
> >> + UINT8 Reserved2[127 -
> >> 94 + 1]; ///< 94-127 Reserved
> >> +} SPD5_BASE_SECTION;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_BASE_SECTION) == 128, "sizeof
> >> (SPD5_BASE_SECTION) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 SerialNumberHashingSequence : 3; ///< Bits 2:0
> >> + UINT8 Reserved : 5; ///< Bits 7:3
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_HASHING_SEQUENCE;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT16 ContinuationCount : 7; ///< Bits 6:0
> >> + UINT16 ContinuationParity : 1; ///< Bits 7:7
> >> + UINT16 LastNonZeroByte : 8; ///< Bits 15:8
> >> + } Bits;
> >> + UINT16 Data;
> >> + UINT8 Data8[2];
> >> +} SPD5_MANUFACTURER_ID_CODE;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 DeviceType : 4; ///< Bits 3:0
> >> + UINT8 Reserved0 : 2; ///< Bits 5:4
> >> + UINT8 Rsvd_TempSensor : 1; ///< Bits 6:6
> >> + UINT8 DeviceInstalled : 1; ///< Bits 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_DEVICE_TYPE;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Height : 5; ///< Bits 4:0
> >> + UINT8 Reserved : 3; ///< Bits 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_NOMINAL_HEIGHT;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 FrontThickness : 4; ///< Bits 3:0
> >> + UINT8 BackThickness : 4; ///< Bits 7:4
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_NOMINAL_THICKNESS;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Card : 5; ///< Bits 4:0
> >> + UINT8 Revision : 3; ///< Bits 7:5
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_REFERENCE_RAW_CARD;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 DramRowCount : 2; ///< Bits
> >> 1:0
> >> + UINT8 HeatSpreader : 1; ///< Bits 2:2
> >> + UINT8 Reserved : 1; ///< Bits 3:3
> >> + UINT8 OperatingTempRange : 4; ///< Bits 7:4
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_DIMM_ATTRIBUTES;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 Reserved0 : 3; ///< Bits 2:0
> >> + UINT8 PackageRanksCount : 3; ///< Bits 5:3
> >> + UINT8 RankMix : 1; ///< Bits 6:6
> >> + UINT8 Reserved1 : 1; ///< Bits 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MODULE_ORGANIZATION;
> >> +
> >> +typedef union {
> >> + struct {
> >> + UINT8 PrimaryBusWidthPerSubChannel : 3; ///< Bits 2:0
> >> + UINT8 BusWidthExtensionPerSubChannel : 2; ///< Bits 4:3
> >> + UINT8 SubChannelsPerDimmCount : 2; ///< Bits 6:5
> >> + UINT8 Reserved : 1; ///< Bits 7:7
> >> + } Bits;
> >> + UINT8 Data;
> >> +} SPD5_MEMORY_CHANNEL_BUS_WIDTH;
> >> +
> >> +
> >> +typedef struct {
> >> + SPD5_REVISION_STRUCT SpdRevisionBytes192_447;
> >> ///< 192 SPD Revision for SPD bytes 192-447
> >> + SPD5_HASHING_SEQUENCE HashingSequence;
> >> ///< 193 Hashing Sequence
> >> + SPD5_MANUFACTURER_ID_CODE SpdManufacturer;
> >> ///< 194-195 SPD Manufacturer ID Code
> >> + SPD5_MODULE_DEVICE_TYPE SpdDeviceType;
> >> ///< 196 SPD Device Type
> >> + SPD5_REVISION_STRUCT SpdRevisionNumber;
> >> ///< 197 SPD Device Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE Pmic0Manufacturer;
> >> ///< 198-199 PMIC 0 Manufacturer ID Code
> >> + SPD5_MODULE_DEVICE_TYPE Pmic0DeviceType;
> >> ///< 200 PMIC 0 Device Type
> >> + SPD5_REVISION_STRUCT Pmic0RevisionNumber;
> >> ///< 201 PMIC 0 Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE Pmic1Manufacturer;
> >> ///< 202-203 PMIC 1 Manufacturer ID Code
> >> + SPD5_MODULE_DEVICE_TYPE Pmic1DeviceType;
> >> ///< 204 PMIC 1 Device Type
> >> + SPD5_REVISION_STRUCT Pmic1RevisionNumber;
> >> ///< 205 PMIC 1 Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE Pmic2Manufacturer;
> >> ///< 206-207 PMIC 2 Manufacturer ID Code
> >> + SPD5_MODULE_DEVICE_TYPE Pmic2DeviceType;
> >> ///< 208 PMIC 2 Device Type
> >> + SPD5_REVISION_STRUCT Pmic2RevisionNumber;
> >> ///< 209 PMIC 2 Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE ThermalSensorManufacturer;
> >> ///< 210-211 Thermal Sensor Manufacturer ID Code
> >> + SPD5_MODULE_DEVICE_TYPE ThermalSensorDeviceType;
> >> ///< 212 Thermal Sensor Revision Number
> >> + SPD5_REVISION_STRUCT ThermalSensorRevisionNumber;
> >> ///< 213 Thermal Sensor Revision Number
> >> + UINT8 Reserved0[229 - 214 + 1];
> >> ///< 214-229 Reserved
> >> + SPD5_MODULE_NOMINAL_HEIGHT ModuleNominalHeight;
> >> ///< 230 Module Nominal Height
> >> + SPD5_MODULE_NOMINAL_THICKNESS ModuleMaximumThickness;
> >> ///< 231 Module Maximum Thickness
> >> + SPD5_MODULE_REFERENCE_RAW_CARD ReferenceRawCardUsed;
> >> ///< 232 Reference Raw Card Used
> >> + SPD5_MODULE_DIMM_ATTRIBUTES DimmAttributes;
> >> ///< 233 DIMM Attributes
> >> + SPD5_MODULE_ORGANIZATION ModuleOrganization;
> >> ///< 234 Module Organization
> >> + SPD5_MEMORY_CHANNEL_BUS_WIDTH MemoryChannelBusWidth;
> >> ///< 235 Memory Channel Bus Width
> >> + UINT8 Reserved1[239 - 236 + 1];
> >> ///< 236-239 Reserved
> >> +} SPD5_MODULE_COMMON;
> >> +
> >> + STATIC_ASSERT (sizeof (SPD5_MODULE_COMMON) == 48, "sizeof
> >> (SPD5_MODULE_COMMON) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef struct {
> >> + UINT8 Reserved[447 - 240 + 1]; ///< 240-447 Reserved
> >> +} SPD5_MODULE_SOLDER_DOWN;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_SOLDER_DOWN) == 208, "sizeof
> >> (SPD5_MODULE_SOLDER_DOWN) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE ClockDriverManufacturerId; ///<
> >> 240-241 Clock Driver Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT ClockDriverDeviceType; ///< 242
> >> Clock Driver Device Type
> >> + SPD5_REVISION_STRUCT ClockDriverRevisionNumber; ///< 243
> >> Clock Driver Revision Number
> >> + UINT8 Reserved[447 - 244 + 1];
> >> +} SPD5_MODULE_UNBUFFERED;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_UNBUFFERED) == 208, "sizeof
> >> (SPD5_MODULE_UNBUFFERED) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE
> >> RegisteringClockDriverManufacturerId; ///< 240-241
> >> Registering Clock Driver Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
> >> ///< 242 Register Device Type
> >> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
> >> ///< 243 Register Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
> >> ///< 244-245 Data Buffer Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
> >> ///< 246 Data Buffer Device Type
> >> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
> >> ///< 247 Data Buffer Revision Number
> >> + UINT8 RcdRw08ClockDriverEnable;
> >> ///< 248 RCD-RW08 Clock Driver Enable
> >> + UINT8
> >> RcdRw09OutputAddressAndControlEnable; ///< 249
> >> RCD-RW09 Output Address and Control Enable
> >> + UINT8 RcdRw0AQckDriverCharacteristics;
> >> ///< 250 RCD-RW0A QCK Driver Characteristics
> >> + UINT8 RcdRw0B;
> >> ///< 251 RCD-RW0B
> >> + UINT8
> >> RcdRw0CQxCaAndQcsnDriverCharacteristics; ///< 252
> >> RCD-RW0C QxCA and QxCS_n Driver Characteristics
> >> + UINT8
> >> RcdRw0DDataBufferInterfaceDriverCharacteristics; ///< 253
> >> RCD-RW0D Data Buffer Interface Driver Characteristics
> >> + UINT8
> >> RcdRw0EQckQcaAndQcsOutputSlewRate; ///< 254
> >> RCD-RW0E QCK, QCA and QCS Output Slew Rate
> >> + UINT8
> >> RcdRw0FBckBcomAndBcsOutputSlewRate; ///< 255
> >> RCD-RW0F BCK, BCOM, and BCS Output Slew Rate
> >> + UINT8 DbRw86DqsRttParkTermination;
> >> ///< 256 DB-RW86 DQS RTT Park Termination
> >> + UINT8 Reserved[447 - 257 + 1];
> >> ///< 257-447 Reserved
> >> +} SPD5_MODULE_REGISTERED;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_REGISTERED) == 208, "sizeof
> >> (SPD5_MODULE_REGISTERED) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE
> >> MultiplexRegisteringClockDriverManufacturerId; ///< 240-241 Multiplex
> >> Registering Clock Driver Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
> >> ///< 242 Register Device Type
> >> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
> >> ///< 243 Register Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE MultiplexDataBufferManufacturerId;
> >> ///< 244-245 Multiplex Data Buffer Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
> >> ///< 246 Data Buffer Device Type
> >> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
> >> ///< 247 Data Buffer Revision Number
> >> + UINT8 Reserved[447 - 248 + 1];
> >> ///< 248-447 Reserved
> >> +} SPD5_MODULE_MULTIPLEXED_RANK;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_MULTIPLEXED_RANK) == 208,
> >> "sizeof (SPD5_MODULE_MULTIPLEXED_RANK) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE
> >> DifferentialMemoryBufferManufacturerId; ///< 240-241
> >> Differential Memory Buffer Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT DifferentialMemoryBufferDeviceType;
> >> ///< 242 Differential Memory Buffer Device Type
> >> + SPD5_REVISION_STRUCT
> >> DifferentialMemoryBufferRevisionNumber; ///< 243
> >> Differential Memory Buffer Revision Number
> >> + UINT8 Reserved[447 - 244 + 1];
> >> ///< 244-447 Reserved
> >> +} SPD5_MODULE_DIFFERENTIAL;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_DIFFERENTIAL) == 208, "sizeof
> >> (SPD5_MODULE_DIFFERENTIAL) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE
> >> RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock
> > Driver
> >> Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
> >> ///< 242 Register Device Type
> >> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
> >> ///< 243 Register Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
> >> ///< 244-245 Data Buffer Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
> >> ///< 246 Data Buffer Device Type
> >> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
> >> ///< 247 Data Buffer Revision Number
> >> + UINT8 Reserved[447 - 248 + 1];
> >> ///< 248-447 Reserved
> >> +} SPD5_MODULE_NVDIMM_N;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_N) == 208, "sizeof
> >> (SPD5_MODULE_NVDIMM_N) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE
> >> RegisteringClockDriverManufacturerId; ///< 240-241 Registering Clock
> > Driver
> >> Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT RegisterDeviceType;
> >> ///< 242 Register Device Type
> >> + SPD5_REVISION_STRUCT RegisterRevisionNumber;
> >> ///< 243 Register Revision Number
> >> + SPD5_MANUFACTURER_ID_CODE DataBufferManufacturerId;
> >> ///< 244-245 Data Buffer Manufacturer ID Code
> >> + SPD5_DEVICE_TYPE_STRUCT DataBufferDeviceType;
> >> ///< 246 Data Buffer Device Type
> >> + SPD5_REVISION_STRUCT DataBufferRevisionNumber;
> >> ///< 247 Data Buffer Revision Number
> >> + UINT8 ModuleStorageCapacity[2];
> >> ///< 248-249 Module Storage Capacity
> >> + UINT8 ProtocolProfile;
> >> ///< 250 Protocol Profile
> >> + UINT8 Reserved[447 - 251 + 1];
> >> ///< 251-447 Reserved
> >> +} SPD5_MODULE_NVDIMM_P;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_NVDIMM_P) == 208, "sizeof
> >> (SPD5_MODULE_NVDIMM_P) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef union {
> >> + SPD5_MODULE_SOLDER_DOWN SolderDown; ///<
> >> 240-447 Solder Down Memory Module Types
> >> + SPD5_MODULE_UNBUFFERED Unbuffered; ///< 240-447
> >> Unbuffered Memory Module Types
> >> + SPD5_MODULE_REGISTERED Registered; ///< 240-447
> >> Registered Memory Module Types
> >> + SPD5_MODULE_MULTIPLEXED_RANK MultiplexedRank; ///< 240-447
> >> Mutiplexed Rank Memory Module Types
> >> + SPD5_MODULE_DIFFERENTIAL Differential; ///< 240-447
> >> Differentual (DDR-D) Memory Module Types
> >> + SPD5_MODULE_NVDIMM_N NvDimmN; ///<
> >> 240-447 Non-Volatile (NVDIMM-N) Hybrid Memory Parameters
> >> + SPD5_MODULE_NVDIMM_P NvDimmP; ///<
> >> 240-447 Non-Volatile (NVDIMM-P) Hybrid Memory Parameters
> >> +} SPD5_MODULE_SPECIFIC;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MODULE_SPECIFIC) == 208, "sizeof
> >> (SPD5_MODULE_SPECIFIC) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +typedef struct {
> >> + UINT8 ManufacturerSpecificData[639 - 555 + 1]; ///< 639-555
> >> Manufacturer's Specific Data
> >> +} SPD5_MANUFACTURER_SPECIFIC;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURER_SPECIFIC) == 85, "sizeof
> >> (SPD5_MANUFACTURER_SPECIFIC) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + UINT8 Year; ///< Year
> >> represented in BCD (00h = 2000)
> >> + UINT8 Week; ///< Year
> >> represented in BCD (47h = week 47)
> >> +} SPD5_MANUFACTURING_DATE;
> >> +
> >> +typedef union {
> >> + UINT32 SerialNumber32; ///< 517-520
> >> Serial Number
> >> + UINT16 SerialNumber16[2];
> >> + UINT8 SerialNumber8[4];
> >> +} SPD5_MANUFACTURER_SERIAL_NUMBER;
> >> +
> >> +typedef struct {
> >> + UINT8 ModulePartNumber[550 - 521 + 1]; ///< 521-550
> >> Module Part Number
> >> +} SPD5_MODULE_PART_NUMBER;
> >> +
> >> +typedef UINT8 SPD5_MANUFACTURING_LOCATION; ///< 514
> >> Module Manufacturing Location
> >> +typedef UINT8 SPD5_MODULE_REVISION_CODE; ///< 551
> >> Module Revision Code
> >> +typedef UINT8 SPD5_DRAM_STEPPING; ///< 554 DRAM
> >> Stepping
> >> +
> >> +typedef struct {
> >> + SPD5_MANUFACTURER_ID_CODE ModuleManufacturer;
> >> ///< 512-513 Module Manufacturer ID Code
> >> + SPD5_MANUFACTURING_LOCATION
> >> ModuleManufacturingLocation; ///< 514 Module Manufacuring Location
> >> + SPD5_MANUFACTURING_DATE ModuleManufacturingDate;
> >> ///< 515-516 Module Manufacturing Date
> >> + SPD5_MANUFACTURER_SERIAL_NUMBER ModuleSerialNumber;
> >> ///< 517-520 Module Serial Number
> >> + SPD5_MODULE_PART_NUMBER ModulePartNumber;
> >> ///< 521-550 Module Part Number
> >> + SPD5_MODULE_REVISION_CODE ModuleRevisionCode;
> >> ///< 551 Module Revision Code
> >> + SPD5_MANUFACTURER_ID_CODE DramManufacturer;
> >> ///< 552-553 DRAM Manufacturer ID Code
> >> + SPD5_DRAM_STEPPING DramStepping;
> >> ///< 554 DRAM Stepping
> >> + SPD5_MANUFACTURER_SPECIFIC ManufacturerSpecificData;
> >> ///< 555-639 Manufacturer's Specific Data
> >> +} SPD5_MANUFACTURING_DATA;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_MANUFACTURING_DATA) == 128, "sizeof
> >> (SPD5_MANUFACTURING_DATA) does not match DDR5 SPD 1.1
> >> specification");
> >> +
> >> +typedef struct {
> >> + UINT8 EndUserBytes[1023 - 640 + 1]; ///< 640-1023
> >> End User Programmable Bytes
> >> +} SPD5_END_USER_SECTION;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD5_END_USER_SECTION) == 384, "sizeof
> >> (SPD5_END_USER_SECTION) does not match DDR5 SPD 1.1 specification");
> >> +
> >> +///
> >> +/// DDR5 Serial Presence Detect structure
> >> +///
> >> +typedef struct {
> >> + SPD5_BASE_SECTION Base; ///<
> >> 0-127 Base Configuration and DRAM Parameters
> >> + UINT8 Reserved0[191 - 128 + 1]; ///< 128-191
> >> Reserved
> >> + SPD5_MODULE_COMMON Common; ///<
> >> 192-239 Common Module Parameters
> >> + SPD5_MODULE_SPECIFIC Module; ///<
> >> 240-447 Module Type Specific Information
> >> + UINT8 Reserved1[509 - 448 + 1]; ///< 448-509
> >> Reserved for future use
> >> + UINT8 Crc[2]; ///<
> >> 510-511 CRC for bytes 0-509
> >> + SPD5_MANUFACTURING_DATA ManufacturerInfo; ///<
> >> 512-639 Manufacturing Information
> >> + SPD5_END_USER_SECTION EndUser; ///<
> >> 640-1023 End User Programmable
> >> +} SPD_DDR5;
> >> +
> >> +STATIC_ASSERT (sizeof (SPD_DDR5) == 1024, "sizeof (SPD_DDR5) does not
> >> match DDR5 SPD 1.1 specification");
> >> +
> >> +#pragma pack (pop)
> >> +
> >> +#endif /* SPD_DDR5_H_ */
> >> --
> >> 2.30.2
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >
> >
> >
> >
> >
> >
>
>
>
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01
2023-02-10 18:01 ` Michael D Kinney
@ 2023-02-14 15:37 ` Rebecca Cran
0 siblings, 0 replies; 4+ messages in thread
From: Rebecca Cran @ 2023-02-14 15:37 UTC (permalink / raw)
To: Kinney, Michael D, devel@edk2.groups.io, Gao, Liming
Cc: 'Liming Gao', Liu, Zhiguang
On 2/10/23 11:01, Kinney, Michael D wrote:
> We usually do not include basetype includes from .h files in Protocol/PPI/GUID/IndustryStandard.
>
> This is because we always get base types from AutoGen.h and from C/H files in modules/libs
> That have to include top level include files for their module type. Base.h, PiPei.h, PiDxe,h, Uefi.h.
>
> Also UINT8 is available from Base.h that does not assume UEFI or PI env.
Thanks. I've sent out a v2 patch with the include line removed.
--
Rebecca Cran
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-02-14 15:37 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1741EA9C96A244C9.31982@groups.io>
2023-02-08 18:04 ` [edk2-devel] [PATCH 1/1] MdePkg: Add DDR5 SPD defs to IndustryStandard per JESD400-5A.01 Rebecca Cran
2023-02-08 17:47 Rebecca Cran
2023-02-10 5:23 ` 回复: [edk2-devel] " gaoliming
2023-02-10 11:04 ` Rebecca Cran
2023-02-10 18:01 ` Michael D Kinney
2023-02-14 15:37 ` Rebecca Cran
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox