[coreboot] r3863 - trunk/coreboot-v2/src/northbridge/amd/amdk8

svn at coreboot.org svn at coreboot.org
Thu Jan 15 03:21:27 CET 2009


Author: stuge
Date: 2009-01-15 03:21:27 +0100 (Thu, 15 Jan 2009)
New Revision: 3863

Modified:
   trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f.c
   trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f_dqs.c
Log:
amdk8: This patch fixes ram init problems when using the 9W Sempron part.

Trying to read the FIDVID register when the processor does not support FIDVID
control causes a GP Fault. This patch reads the startup FID from a different
MSR. I have verified this patch to work on the dbm690t platform.

Signed-off-by: Dan Lykowski <lykowdk at gmail.com>
Acked-by: Peter Stuge <peter at stuge.se>


Modified: trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f.c	2009-01-15 02:13:18 UTC (rev 3862)
+++ trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f.c	2009-01-15 02:21:27 UTC (rev 3863)
@@ -1656,15 +1656,29 @@
 	  /*15*/   200, 160, 120, 100,
 	};
 
-	unsigned fid_cur;
+	
 	int index;
-
 	msr_t msr;
-	msr = rdmsr(0xc0010042);
-	fid_cur = msr.lo & 0x3f;
 
-	index = fid_cur>>1;
+	/* Check for FID control support */
+	struct cpuid_result cpuid1;
+	cpuid1 = cpuid(0x8000007);
+	if( cpuid1.edx & 0x02 ) {
+		/* Use current FID */
+		unsigned fid_cur;
+		msr = rdmsr(0xc0010042);
+		fid_cur = msr.lo & 0x3f;
 
+		index = fid_cur>>1;
+	} else {
+		/* Use startup FID */
+		unsigned fid_start;
+		msr = rdmsr(0xc0010015);
+		fid_start = (msr.lo & (0x3f << 24));
+		
+		index = fid_start>>25;
+	}
+
 	if (index>12) return divisor;
 
 	if (i>3) return divisor;

Modified: trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f_dqs.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f_dqs.c	2009-01-15 02:13:18 UTC (rev 3862)
+++ trunk/coreboot-v2/src/northbridge/amd/amdk8/raminit_f_dqs.c	2009-01-15 02:21:27 UTC (rev 3863)
@@ -432,15 +432,28 @@
 	 /*15*/   5000, 4000, 3000, 2500,
 	};
 
-	unsigned fid_cur;
 	int index;
-
 	msr_t msr;
-	msr = rdmsr(0xc0010042);
-	fid_cur = msr.lo & 0x3f;
 
-	index = fid_cur>>1;
+	/* Check for FID control support */
+	struct cpuid_result cpuid1;
+	cpuid1 = cpuid(0x8000007);
+	if( cpuid1.edx & 0x02 ) {
+		/* Use current FID */
+		unsigned fid_cur;
+		msr = rdmsr(0xc0010042);
+		fid_cur = msr.lo & 0x3f;
 
+		index = fid_cur>>1;
+	} else {
+		/* Use startup FID */
+		unsigned fid_start;
+		msr = rdmsr(0xc0010015);
+		fid_start = (msr.lo & (0x3f << 24));
+		
+		index = fid_start>>25;
+	}
+
 	if(index>12) return T1000_a[i];
 
 	return TT_a[index * 4+i];





More information about the coreboot mailing list