summaryrefslogtreecommitdiff
path: root/util/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'util/scripts')
-rwxr-xr-xutil/scripts/decode_spd.sh76
-rw-r--r--util/scripts/description.md2
2 files changed, 78 insertions, 0 deletions
diff --git a/util/scripts/decode_spd.sh b/util/scripts/decode_spd.sh
new file mode 100755
index 0000000000..9ab9fa30cf
--- /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
diff --git a/util/scripts/description.md b/util/scripts/description.md
index 1f4e7df042..a08771d48d 100644
--- a/util/scripts/description.md
+++ b/util/scripts/description.md
@@ -3,6 +3,8 @@ __scripts__
line `Bash`
* _cross-repo-cherrypick_ - Pull in patches from another tree from a
gerrit repository. `Shell`
+ * _decode_spd.sh_ - Decodes Serial Presence Detect (SPD) files into
+ various human readable formats.
* _dts-to-fmd.sh_ -Converts a depthcharge fmap.dts into an fmaptool
compatible .fmd format `Bash`
* _find-unused-kconfig-symbols.sh_ - Points out Kconfig variables