aboutsummaryrefslogtreecommitdiff
path: root/src/device/dram/ddr_common.c
diff options
context:
space:
mode:
authorAndrey Petrov <anpetrov@fb.com>2019-08-01 14:18:06 -0700
committerMartin Roth <martinroth@google.com>2019-08-14 03:35:29 +0000
commit3f85edbcc554c4db704ed23bdfb1f384f5e2239e (patch)
treec475615f6ac1e05cdab1d0a58a9b8e0b97c10230 /src/device/dram/ddr_common.c
parentbb9506121f709f452d18d135ed163166f76e44e4 (diff)
dram: Add basic DDR4 SPD parsing
Add ability to decode basic fields of DDR4 SPDs and produce SMBIOS table 17. XMP, schemas, extended field parising is totally not yet implemented. Also, put CRC function used in DDR2, DDR3 and DDR4 ina common file. Signed-off-by: Andrey Petrov <anpetrov@fb.com> Change-Id: If3befbc55cf37e1018baa432cb2f03743b929211 Reviewed-on: https://review.coreboot.org/c/coreboot/+/34680 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Matt DeVillier <matt.devillier@gmail.com> Reviewed-by: David Hendricks <david.hendricks@gmail.com>
Diffstat (limited to 'src/device/dram/ddr_common.c')
-rw-r--r--src/device/dram/ddr_common.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/device/dram/ddr_common.c b/src/device/dram/ddr_common.c
new file mode 100644
index 0000000000..eb36bf52a0
--- /dev/null
+++ b/src/device/dram/ddr_common.c
@@ -0,0 +1,43 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2019 Facebook, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <console/console.h>
+#include <device/dram/common.h>
+#include <types.h>
+
+/**
+ * \brief Calculate the CRC of a DDR SPD data
+ *
+ * @param spd pointer to raw SPD data
+ * @param len length of data in SPD
+ *
+ * @return the CRC of the SPD data
+ */
+u16 ddr_crc16(const u8 *ptr, int n_crc)
+{
+ int i;
+ u16 crc = 0;
+
+ while (--n_crc >= 0) {
+ crc = crc ^ ((int)*ptr++ << 8);
+ for (i = 0; i < 8; ++i)
+ if (crc & 0x8000)
+ crc = (crc << 1) ^ 0x1021;
+ else
+ crc = crc << 1;
+ }
+
+ return crc;
+}