summaryrefslogtreecommitdiffstats
path: root/util/inteltool/ivy_memory.c
diff options
context:
space:
mode:
authorJacob Garber <jgarber1@ualberta.ca>2019-05-09 14:24:02 -0600
committerPatrick Georgi <pgeorgi@google.com>2019-05-13 09:24:14 +0000
commita75440739d172bea6eeefc08af2bbdefc528e912 (patch)
tree4841a076eb6f4951874e4dfa9af8a7f427449109 /util/inteltool/ivy_memory.c
parent7528f834447de52d1d62e979cd93af0ac30d5f6f (diff)
downloadcoreboot-a75440739d172bea6eeefc08af2bbdefc528e912.tar.gz
coreboot-a75440739d172bea6eeefc08af2bbdefc528e912.tar.bz2
coreboot-a75440739d172bea6eeefc08af2bbdefc528e912.zip
util/inteltool: Use appropriate channel for printing timings
At least one channel must be present, so print an error if there is not. However, we cannot always assume it will be the first channel, so make the appropriate selection when printing the timings. Found-by: Coverity Scan #1370{584,585,588,589,590-596,600} Signed-off-by: Jacob Garber <jgarber1@ualberta.ca> Change-Id: I6b59989242e498474782876302e0850e3e4cf2d3 Reviewed-on: https://review.coreboot.org/c/coreboot/+/32713 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <siro@das-labor.org>
Diffstat (limited to 'util/inteltool/ivy_memory.c')
-rw-r--r--util/inteltool/ivy_memory.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/util/inteltool/ivy_memory.c b/util/inteltool/ivy_memory.c
index 8ce861127bc3..16c1d8920c4f 100644
--- a/util/inteltool/ivy_memory.c
+++ b/util/inteltool/ivy_memory.c
@@ -97,6 +97,11 @@ void ivybridge_dump_timings(const char *dump_spd_file)
rankmap[channel] = read_mchbar32(0xc14 + 0x100 * channel) >> 24;
}
+ if ((rankmap[0] == 0) && (rankmap[1] == 0)) {
+ fputs("Error: no memory channels found\n", stderr);
+ exit(1);
+ }
+
two_channels = rankmap[0] && rankmap[1];
mr0[0] = read_mchbar32(0x0004);
@@ -172,49 +177,52 @@ void ivybridge_dump_timings(const char *dump_spd_file)
printf(".reg_4004_b30 = { %d, %d },\n", reg_4004_b30[0],
reg_4004_b30[1]);
+
+ channel = (rankmap[0] != 0) ? 0 : 1;
+
if (two_channels && tFAW[0] != tFAW[1])
printf("/* tFAW mismatch: %d, %d */\n", tFAW[0], tFAW[1]);
- print_time("tFAW", tFAW[0], tCK);
+ print_time("tFAW", tFAW[channel], tCK);
if (two_channels && tWTR[0] != tWTR[1])
printf("/* tWTR mismatch: %d, %d */\n", tWTR[0], tWTR[1]);
- print_time("tWTR", tWTR[0], tCK);
+ print_time("tWTR", tWTR[channel], tCK);
if (two_channels && tCKE[0] != tCKE[1])
printf("/* tCKE mismatch: %d, %d */\n", tCKE[0], tCKE[1]);
- print_time("tCKE", tCKE[0], tCK);
+ print_time("tCKE", tCKE[channel], tCK);
if (two_channels && tRTP[0] != tRTP[1])
printf("/* tRTP mismatch: %d, %d */\n", tRTP[0], tRTP[1]);
- print_time("tRTP", tRTP[0], tCK);
+ print_time("tRTP", tRTP[channel], tCK);
if (two_channels && tRRD[0] != tRRD[1])
printf("/* tRRD mismatch: %d, %d */\n", tRRD[0], tRRD[1]);
- print_time("tRRD", tRRD[0], tCK);
+ print_time("tRRD", tRRD[channel], tCK);
if (two_channels && tRAS[0] != tRAS[1])
printf("/* tRAS mismatch: %d, %d */\n", tRAS[0], tRAS[1]);
- print_time("tRAS", tRAS[0], tCK);
+ print_time("tRAS", tRAS[channel], tCK);
if (two_channels && tCWL[0] != tCWL[1])
printf("/* tCWL mismatch: %d, %d */\n", tCWL[0], tCWL[1]);
- print_time("tCWL", tCWL[0], tCK);
+ print_time("tCWL", tCWL[channel], tCK);
if (two_channels && tRP[0] != tRP[1])
printf("/* tRP mismatch: %d, %d */\n", tRP[0], tRP[1]);
- print_time("tRP", tRP[0], tCK);
+ print_time("tRP", tRP[channel], tCK);
if (two_channels && tRCD[0] != tRCD[1])
printf("/* tRCD mismatch: %d, %d */\n", tRCD[0], tRCD[1]);
- print_time("tRCD", tRCD[0], tCK);
+ print_time("tRCD", tRCD[channel], tCK);
if (two_channels && tXPDLL[0] != tXPDLL[1])
printf("/* tXPDLL mismatch: %d, %d */\n", tXPDLL[0], tXPDLL[1]);
- print_time("tXPDLL", tXPDLL[0], tCK);
+ print_time("tXPDLL", tXPDLL[channel], tCK);
if (two_channels && tXP[0] != tXP[1])
printf("/* tXP mismatch: %d, %d */\n", tXP[0], tXP[1]);
- print_time("tXP", tXP[0], tCK);
+ print_time("tXP", tXP[channel], tCK);
if (two_channels && tAONPD[0] != tAONPD[1])
printf("/* tAONPD mismatch: %d, %d */\n", tAONPD[0], tAONPD[1]);
- print_time("tAONPD", tAONPD[0], tCK);
+ print_time("tAONPD", tAONPD[channel], tCK);
reg = read_mchbar32(0x4298);
if (reg != read_mchbar32(0x4698) && two_channels)