aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/smbios.h42
-rw-r--r--src/soc/intel/common/romstage.c34
2 files changed, 74 insertions, 2 deletions
diff --git a/src/include/smbios.h b/src/include/smbios.h
index 66d2b2f541..b654c23169 100644
--- a/src/include/smbios.h
+++ b/src/include/smbios.h
@@ -77,6 +77,48 @@ const char *smbios_mainboard_family(void);
#define MEMORY_TYPE_DETAIL_UNBUFFERED (1 << 14)
typedef enum {
+ MEMORY_BUS_WIDTH_8 = 0,
+ MEMORY_BUS_WIDTH_16 = 1,
+ MEMORY_BUS_WIDTH_32 = 2,
+ MEMORY_BUS_WIDTH_64 = 3,
+ MEMORY_BUS_WIDTH_128 = 4,
+ MEMORY_BUS_WIDTH_256 = 5,
+ MEMORY_BUS_WIDTH_512 = 6,
+ MEMORY_BUS_WIDTH_1024 = 7,
+ MEMORY_BUS_WIDTH_MAX = 7,
+} smbios_memory_bus_width;
+
+typedef enum {
+ MEMORY_DEVICE_OTHER = 0x01,
+ MEMORY_DEVICE_UNKNOWN = 0x02,
+ MEMORY_DEVICE_DRAM = 0x03,
+ MEMORY_DEVICE_EDRAM = 0x04,
+ MEMORY_DEVICE_VRAM = 0x05,
+ MEMORY_DEVICE_SRAM = 0x06,
+ MEMORY_DEVICE_RAM = 0x07,
+ MEMORY_DEVICE_ROM = 0x08,
+ MEMORY_DEVICE_FLASH = 0x09,
+ MEMORY_DEVICE_EEPROM = 0x0A,
+ MEMORY_DEVICE_FEPROM = 0x0B,
+ MEMORY_DEVICE_EPROM = 0x0C,
+ MEMORY_DEVICE_CDRAM = 0x0D,
+ MEMORY_DEVICE_3DRAM = 0x0E,
+ MEMORY_DEVICE_SDRAM = 0x0F,
+ MEMORY_DEVICE_SGRAM = 0x10,
+ MEMORY_DEVICE_RDRAM = 0x11,
+ MEMORY_DEVICE_DDR = 0x12,
+ MEMORY_DEVICE_DDR2 = 0x13,
+ MEMORY_DEVICE_DDR2_FB_DIMM = 0x14,
+ MEMORY_DEVICE_DDR3 = 0x18,
+ MEMORY_DEVICE_DBD2 = 0x19,
+ MEMORY_DEVICE_DDR4 = 0x1A,
+ MEMORY_DEVICE_LPDDR = 0x1B,
+ MEMORY_DEVICE_LPDDR2 = 0x1C,
+ MEMORY_DEVICE_LPDDR3 = 0x1D,
+ MEMORY_DEVICE_LPDDR4 = 0x1E,
+} smbios_memory_device_type;
+
+typedef enum {
MEMORY_FORMFACTOR_OTHER = 0x01,
MEMORY_FORMFACTOR_UNKNOWN = 0x02,
MEMORY_FORMFACTOR_SIMM = 0x03,
diff --git a/src/soc/intel/common/romstage.c b/src/soc/intel/common/romstage.c
index 370d973cf7..99ac890d5f 100644
--- a/src/soc/intel/common/romstage.c
+++ b/src/soc/intel/common/romstage.c
@@ -34,6 +34,7 @@
#include <memory_info.h>
#include <reset.h>
#include <romstage_handoff.h>
+#include <smbios.h>
#include <soc/intel/common/mrc_cache.h>
#include <soc/intel/common/util.h>
#include <soc/pei_wrapper.h>
@@ -273,8 +274,10 @@ __attribute__((weak)) void mainboard_save_dimm_info(
memory_info_hob->Revision);
printk(BIOS_DEBUG, " 0x%02x: MemoryType\n",
memory_info_hob->MemoryType);
- printk(BIOS_DEBUG, " 0x%04x: MemoryFrequencyInMHz\n",
+ printk(BIOS_DEBUG, " %d: MemoryFrequencyInMHz\n",
memory_info_hob->MemoryFrequencyInMHz);
+ printk(BIOS_DEBUG, " %d: DataWidth in bits\n",
+ memory_info_hob->DataWidth);
printk(BIOS_DEBUG, " 0x%02x: ErrorCorrectionType\n",
memory_info_hob->ErrorCorrectionType);
printk(BIOS_DEBUG, " 0x%02x: ChannelCount\n",
@@ -293,7 +296,7 @@ __attribute__((weak)) void mainboard_save_dimm_info(
printk(BIOS_DEBUG, " DIMM %d\n", dimm);
printk(BIOS_DEBUG, " 0x%02x: DimmId\n",
dimm_info->DimmId);
- printk(BIOS_DEBUG, " 0x%02x: SizeInMb\n",
+ printk(BIOS_DEBUG, " %d: SizeInMb\n",
dimm_info->SizeInMb);
}
}
@@ -333,6 +336,33 @@ __attribute__((weak)) void mainboard_save_dimm_info(
channel_info->ChannelId;
mem_info->dimm[index].dimm_num =
dimm_info->DimmId;
+ switch (memory_info_hob->DataWidth) {
+ default:
+ case 8:
+ mem_info->dimm[index].bus_width =
+ MEMORY_BUS_WIDTH_8;
+ break;
+
+ case 16:
+ mem_info->dimm[index].bus_width =
+ MEMORY_BUS_WIDTH_16;
+ break;
+
+ case 32:
+ mem_info->dimm[index].bus_width =
+ MEMORY_BUS_WIDTH_32;
+ break;
+
+ case 64:
+ mem_info->dimm[index].bus_width =
+ MEMORY_BUS_WIDTH_64;
+ break;
+
+ case 128:
+ mem_info->dimm[index].bus_width =
+ MEMORY_BUS_WIDTH_128;
+ break;
+ }
index++;
}
}