summaryrefslogtreecommitdiffstats
path: root/util/scripts/decode_spd.sh
diff options
context:
space:
mode:
authorRob Barnes <robbarnes@google.com>2020-02-20 14:35:51 -0700
committerFelix Held <felix-coreboot@felixheld.de>2020-03-19 10:31:08 +0000
commit5baadba532aec78d76d2ba1efea825b5f9b75efc (patch)
tree160a556a186f5c49923f86152ec4800de617fd66 /util/scripts/decode_spd.sh
parent9d49598cd6f323d0119d905f9917f526e0c2920f (diff)
downloadcoreboot-5baadba532aec78d76d2ba1efea825b5f9b75efc.tar.gz
coreboot-5baadba532aec78d76d2ba1efea825b5f9b75efc.tar.bz2
coreboot-5baadba532aec78d76d2ba1efea825b5f9b75efc.zip
util/bincfg: Add DDR4 SPD spec
Additionally provide a simple script for decoding spd hex files using bincfg. BUG=b:148561711 TEST=Decoded spd files in zork BRANCH=None Change-Id: Ic62868d59e075fd6816d7be55cc935e3e3f82499 Signed-off-by: Rob Barnes <robbarnes@google.com> Reviewed-on: https://chromium-review.googlesource.com/2067697 Reviewed-by: Martin Roth <martinroth@google.com> Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/39621 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Michael Niewöhner
Diffstat (limited to 'util/scripts/decode_spd.sh')
-rwxr-xr-xutil/scripts/decode_spd.sh76
1 files changed, 76 insertions, 0 deletions
diff --git a/util/scripts/decode_spd.sh b/util/scripts/decode_spd.sh
new file mode 100755
index 000000000000..9ab9fa30cfd4
--- /dev/null
+++ b/util/scripts/decode_spd.sh
@@ -0,0 +1,76 @@
+#!/bin/bash
+#
+# This file is part of the coreboot project.
+#
+# 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.
+#
+#
+# Parses spd hex files and outputs the contents in various formats
+#
+#
+# Outputs csv, set, and json in same folder as SPD_HEX_FILE
+#
+# Example:
+# decode_spd.sh ../../src/mainboard/google/zork/spd/micron-MT40A512M16TB-062E-J.spd.hex
+#
+# Outputs ../../src/mainboard/google/zork/spd/micron-MT40A512M16TB-062E-J.spd.{json|csv|set}
+#
+# TODO: This script assumes bincfg binary is at ../bincfg/bincfg (which is the
+# result of running the bincfg make), and the specs are at
+# ../bincfg/*.spec. This dependency should be made more resilliant and
+# configurable.
+
+set -e
+
+function read8 () {
+ echo $(( 16#$(xxd -s "${2}" -l 1 -p "${1}") ))
+}
+
+for file in "$@"
+do
+ bintmp=$(mktemp)
+ outfile="${file%.hex}.set"
+
+ echo "Decoding ${file}, outputting to ${outfile}"
+
+ grep -v '^#' "${file}" | xxd -r -p - "${bintmp}"
+ dram_type=$(read8 "${bintmp}" 2)
+ if [ ! "${dram_type}" -eq 12 ]
+ then
+ #TODO: Handle other dram types
+ printf "Error: Expecting dram4 (12), got %d\n" "${dram_type}"
+ continue
+ fi
+
+ revision=$(read8 "${bintmp}" 1)
+ if [ ! "${revision}" -eq $((0x13)) ]
+ then
+ printf "Warning: Expecting revision 0x13, got 0x%x.\n" "${revision}"
+ fi
+
+ module_type=$(read8 "${bintmp}" 3)
+ case "${module_type}" in
+ 1) # RDIMM
+ spec="../bincfg/ddr4_registered_spd_512.spec"
+ ;;
+ 2 | 3) #UDIMM | SO-DIMM
+ spec="../bincfg/ddr4_unbuffered_spd_512.spec"
+ ;;
+ * )
+ printf "Error: Unhandled module type %d.\n" "${module_type}"
+ ;;
+ esac
+
+ ../bincfg/bincfg -d "${spec}" "${bintmp}" "${outfile}"
+ grep -v '^#' "${outfile}" | sed -e 's/ = \([^,]\+\)/: "\1"/g' \
+ > "${file%.hex}.json"
+ grep -v -e '^#' -e '^{' -e '^}' "${outfile}" | sed -e 's/=/,/g' \
+ > "${file%.hex}.csv"
+done