[coreboot-gerrit] New patch to review for coreboot: 0ba8715 intel/gm45: Refactor DDR3 read training

Nico Huber (nico.huber@secunet.com) gerrit at coreboot.org
Fri May 17 15:52:03 CEST 2013


Nico Huber (nico.huber at secunet.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3253

-gerrit

commit 0ba8715f4deebfed37fa4fb9ffd5d566b82c60ef
Author: Nico Huber <nico.huber at secunet.com>
Date:   Tue May 14 11:43:03 2013 +0200

    intel/gm45: Refactor DDR3 read training
    
    Split some code in individual functions. It's the refactoring part of
    a bigger change, following...
    
    Change-Id: Ied551a011eaf22f6f8f6db0044de3634134f0b37
    Signed-off-by: Nico Huber <nico.huber at secunet.com>
---
 .../intel/gm45/raminit_read_write_training.c       | 74 ++++++++++++++--------
 1 file changed, 46 insertions(+), 28 deletions(-)

diff --git a/src/northbridge/intel/gm45/raminit_read_write_training.c b/src/northbridge/intel/gm45/raminit_read_write_training.c
index 8c8e66a..6936d07 100644
--- a/src/northbridge/intel/gm45/raminit_read_write_training.c
+++ b/src/northbridge/intel/gm45/raminit_read_write_training.c
@@ -99,50 +99,68 @@ static int read_training_test(const int channel, const int lane,
 	}
 	return 1;
 }
-static void read_training_per_lane(const int channel, const int lane,
-				   const address_bunch_t *const addresses)
+static void read_training_find_lower(const int channel, const int lane,
+				     const address_bunch_t *const addresses,
+				     read_timing_t *const lower)
 {
-	read_timing_t lower, upper;
-
-	MCHBAR32(CxRDTy_MCHBAR(channel, lane)) |= 3 << 25;
-
-	/* Search lower bound. */
-	lower.t = 0;
-	lower.p = 0;
-	program_read_timing(channel, lane, &lower);
 	/* Coarse search for good t. */
+	program_read_timing(channel, lane, lower);
 	while (!read_training_test(channel, lane, addresses)) {
-		++lower.t;
-		program_read_timing(channel, lane, &lower);
+		++lower->t;
+		program_read_timing(channel, lane, lower);
 	}
+
 	/* Step back, then fine search for good p. */
-	if (lower.t > 0) {
-		--lower.t;
-		program_read_timing(channel, lane, &lower);
+	if (lower->t > 0) {
+		--lower->t;
+		program_read_timing(channel, lane, lower);
 		while (!read_training_test(channel, lane, addresses)) {
-			++lower.p;
-			program_read_timing(channel, lane, &lower);
+			++lower->p;
+			program_read_timing(channel, lane, lower);
 		}
 	}
-
-	/* Search upper bound. */
-	upper.t = lower.t + 1;
-	upper.p = lower.p;
-	program_read_timing(channel, lane, &upper);
+}
+static void read_training_find_upper(const int channel, const int lane,
+				     const address_bunch_t *const addresses,
+				     read_timing_t *const upper)
+{
+	program_read_timing(channel, lane, upper);
 	if (!read_training_test(channel, lane, addresses))
 		die("Read training failed: limits too narrow.\n");
 	/* Coarse search for bad t. */
 	do {
-		++upper.t;
-		program_read_timing(channel, lane, &upper);
+		++upper->t;
+		program_read_timing(channel, lane, upper);
 	} while (read_training_test(channel, lane, addresses));
 	/* Fine search for bad p. */
-	--upper.t;
-	program_read_timing(channel, lane, &upper);
+	--upper->t;
+	program_read_timing(channel, lane, upper);
 	while (read_training_test(channel, lane, addresses)) {
-		++upper.p;
-		program_read_timing(channel, lane, &upper);
+		++upper->p;
+		program_read_timing(channel, lane, upper);
 	}
+}
+static void read_training_per_lane(const int channel, const int lane,
+				   const address_bunch_t *const addresses)
+{
+	read_timing_t lower, upper;
+
+	MCHBAR32(CxRDTy_MCHBAR(channel, lane)) |= 3 << 25;
+
+	/*** Search lower bound. ***/
+
+	/* Start at zero. */
+	lower.t = 0;
+	lower.p = 0;
+	read_training_find_lower(channel, lane, addresses, &lower);
+
+	/*** Search upper bound. ***/
+
+	/* Start at lower + 1t. */
+	upper.t = lower.t + 1;
+	upper.p = lower.p;
+
+	read_training_find_upper(channel, lane, addresses, &upper);
 
 	/* Calculate and program mean value. */
 	lower.p += lower.t << READ_TIMING_P_SHIFT;



More information about the coreboot-gerrit mailing list