[coreboot-gerrit] Patch set updated for coreboot: 214f063 Add a device/dram function to read in a users SPD

Dave Frodin (dave.frodin@se-eng.com) gerrit at coreboot.org
Tue Dec 24 19:00:08 CET 2013


Dave Frodin (dave.frodin at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4533

-gerrit

commit 214f0633aa325d4da2adb55b76985c64dac9b426
Author: Dave Frodin <dave.frodin at se-eng.com>
Date:   Sat Dec 14 11:21:26 2013 -0700

    Add a device/dram function to read in a users SPD
    
    This allows mainboards with solder-down memory and without
    a solder-down SPD EEPROM to have the SPD values set by
    a mainboard include file.
    
    Change-Id: I3fb351f4b84cf290e3f4374bcee8a038bccf7eed
    Signed-off-by: Dave Frodin <dave.frodin at se-eng.com>
---
 src/device/Makefile.inc        |  1 +
 src/device/dram/ddr3.c         | 31 +++++++++++++++++++++++++++++++
 src/include/device/dram/ddr3.h | 11 +++++++++++
 3 files changed, 43 insertions(+)

diff --git a/src/device/Makefile.inc b/src/device/Makefile.inc
index 1dbb510..07ea4d0 100644
--- a/src/device/Makefile.inc
+++ b/src/device/Makefile.inc
@@ -14,6 +14,7 @@ ramstage-$(CONFIG_PCI) += pci_ops.c
 ramstage-y += smbus_ops.c
 
 romstage-y+= device_romstage.c
+romstage-$(CONFIG_USER_DEFINED_SPD) += dram/ddr3.c
 
 subdirs-y += oprom
 
diff --git a/src/device/dram/ddr3.c b/src/device/dram/ddr3.c
index 9b4f490..97a4ef4 100644
--- a/src/device/dram/ddr3.c
+++ b/src/device/dram/ddr3.c
@@ -609,3 +609,34 @@ mrs_cmd_t ddr3_mrs_mirror_pins(mrs_cmd_t cmd)
 	cmd |= (downshift >> 1) | (upshift << 1);
 	return cmd;
 }
+
+/**
+ * \brief Fill SPD array with user data and calculate the CRC.
+ *
+ * The spd_num allows the user to specify a position in a
+ * input array that contains multiple SPDs.
+ */
+#if IS_ENABLED(CONFIG_USER_DEFINED_SPD)
+int fill_users_spd(unsigned char *spd_ptr)
+{
+	extern const u8 user_ddr3_spd[SPD_SIZE];
+	u16 index, crc;
+
+	for (index = 0; index < SPD_SIZE; index++)
+		spd_ptr[index] = user_ddr3_spd[index];
+
+	/* If CRC bytes are zeroes, calculate and store the CRC of the data */
+	if ((spd_ptr[SPD_CRC_LO] == 0) && (spd_ptr[SPD_CRC_HI] == 0)) {
+		crc = spd_ddr3_calc_crc(spd_ptr, SPD_CRC_SIZE);
+		spd_ptr[SPD_CRC_LO] = (unsigned char)(crc & 0xff);
+		spd_ptr[SPD_CRC_HI] = (unsigned char)(crc >> 8);
+	}
+	printk(BIOS_SPEW, "\nDisplay the SPD");
+	for (index = 0; index < SPD_SIZE; index++) {
+		if((index % 16) == 0x00) printk(BIOS_SPEW, "\n%02x:  ",index);
+		printk(BIOS_SPEW, "%02x ", spd_ptr[index]);
+	}
+	printk(BIOS_SPEW, "\n");
+	return 0;
+}
+#endif
diff --git a/src/include/device/dram/ddr3.h b/src/include/device/dram/ddr3.h
index b19c51c..3266345 100644
--- a/src/include/device/dram/ddr3.h
+++ b/src/include/device/dram/ddr3.h
@@ -47,6 +47,16 @@
 /** @} */
 
 /**
+ * \brief Convenience definition for SPD related values
+ * @{
+ */
+#define SPD_SIZE        256
+#define SPD_CRC_SIZE    128
+#define SPD_CRC_LO      126
+#define SPD_CRC_HI      127
+/** @} */
+
+/**
  * \brief Convenience macro for enabling printk with CONFIG_DEBUG_RAM_SETUP
  *
  * Use this macro instead of printk(); for verbose RAM initialization messages.
@@ -174,6 +184,7 @@ u16 spd_ddr3_calc_crc(u8 *spd, int len);
 int spd_decode_ddr3(dimm_attr * dimm, spd_raw_data spd_data);
 int dimm_is_registered(enum spd_dimm_type type);
 void dram_print_spd_ddr3(const dimm_attr * dimm);
+int fill_users_spd(unsigned char *spd_ptr);
 
 /**
  * \brief Read double word from specified address



More information about the coreboot-gerrit mailing list