[coreboot] r3689 - trunk/coreboot-v2/src/northbridge/amd/lx

svn at coreboot.org svn at coreboot.org
Thu Oct 23 00:26:10 CEST 2008


Author: mjones
Date: 2008-10-23 00:26:09 +0200 (Thu, 23 Oct 2008)
New Revision: 3689

Modified:
   trunk/coreboot-v2/src/northbridge/amd/lx/raminit.c
Log:
Changed RAM speed calculation to fix RAM modules getting rejected only
due to integer rounding errors. Previously, the formula was:
	speed = 2 * (10000/spd_value)
For spd_value=60 this means speed = 2 * 166 = 332, which is less than
333 and coreboot died saying RAM was incompatible. The new formula is:
	speed = 20000 / spd_value
For spd_value=60, speed=333, which is fine.

Signed-off-by: Jens Rottmann <JRottmann at LiPPERTEmbedded.de>
Acked-by: Marc Jones <marc.jones at amd.com>


Modified: trunk/coreboot-v2/src/northbridge/amd/lx/raminit.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/lx/raminit.c	2008-10-22 22:24:47 UTC (rev 3688)
+++ trunk/coreboot-v2/src/northbridge/amd/lx/raminit.c	2008-10-22 22:26:09 UTC (rev 3689)
@@ -194,7 +194,7 @@
 	}
 
 	/* Turn SPD ns time into MHZ. Check what the asm does to this math. */
-	speed = 2 * ((10000 / (((spd_byte0 >> 4) * 10) + (spd_byte0 & 0x0F))));
+	speed = 20000 / (((spd_byte0 >> 4) * 10) + (spd_byte0 & 0x0F));
 
 	/* current speed > max speed? */
 	if (GeodeLinkSpeed() > speed) {
@@ -274,15 +274,14 @@
 		spd_byte = spd_read_byte(DIMM0, SPD_SDRAM_CYCLE_TIME_2ND);
 		if (spd_byte != 0) {
 			/* Turn SPD ns time into MHZ. Check what the asm does to this math. */
-			dimm_speed = 2 * (10000 / (((spd_byte >> 4) * 10) +
-						(spd_byte & 0x0F)));
+			dimm_speed = 20000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F));
 			if (dimm_speed >= glspeed) {
 				casmap_shift = 1; /* -.5 is a shift of 1 */
 				/* IF -1 timing is supported, check -1 timing > GeodeLink */
 				spd_byte = spd_read_byte(DIMM0, SPD_SDRAM_CYCLE_TIME_3RD);
 				if (spd_byte != 0) {
 					/* Turn SPD ns time into MHZ. Check what the asm does to this math. */
-					dimm_speed = 2 * (10000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F)));
+					dimm_speed = 20000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F));
 					if (dimm_speed >= glspeed) {
 						casmap_shift = 2; /* -1 is a shift of 2 */
 					}
@@ -306,14 +305,14 @@
 		spd_byte = spd_read_byte(DIMM1, SPD_SDRAM_CYCLE_TIME_2ND);
 		if (spd_byte != 0) {
 			/* Turn SPD ns time into MHZ. Check what the asm does to this math. */
-			dimm_speed = 2 * (10000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F)));
+			dimm_speed = 20000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F));
 			if (dimm_speed >= glspeed) {
 				casmap_shift = 1; /* -.5 is a shift of 1 */
 				/* IF -1 timing is supported, check -1 timing > GeodeLink */
 				spd_byte = spd_read_byte(DIMM1, SPD_SDRAM_CYCLE_TIME_3RD);
 				if (spd_byte != 0) {
 					/* Turn SPD ns time into MHZ. Check what the asm does to this math. */
-					dimm_speed = 2 * (10000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F)));
+					dimm_speed = 20000 / (((spd_byte >> 4) * 10) + (spd_byte & 0x0F));
 					if (dimm_speed >= glspeed) {
 						casmap_shift = 2; /* -1 is a shift of 2 */
 					}





More information about the coreboot mailing list