amdk8: This patch fixes ram init problems when using the 9W Sempron part.
authorDan Lykowski <lykowdk@gmail.com>
Thu, 15 Jan 2009 02:21:27 +0000 (02:21 +0000)
committerPeter Stuge <peter@stuge.se>
Thu, 15 Jan 2009 02:21:27 +0000 (02:21 +0000)
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@gmail.com>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3863 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

src/northbridge/amd/amdk8/raminit_f.c
src/northbridge/amd/amdk8/raminit_f_dqs.c

index a883fa401d54b56b0b8c1e2768af82c497b53c6e..0dcb0f6821cf2f0b6e67057939b5f5acedfa99f2 100644 (file)
@@ -1656,14 +1656,28 @@ static uint8_t get_exact_divisor(int i, uint8_t divisor)
          /*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;
 
index e8add87a7ebd2c5d9fcb4be8eaa0107237df8f4c..dc49d4e893470b85d004b570360a34c771f70552 100644 (file)
@@ -432,14 +432,27 @@ static uint16_t get_exact_T1000(unsigned i)
         /*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];