[coreboot] AMD DBM690T PowerNow table problems

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Thu Jan 15 05:35:29 CET 2009


On 09.01.2009 10:05, Carl-Daniel Hailfinger wrote:
> On 08.01.2009 17:52, Marc Jones wrote:
>   
>> On Wed, Jan 7, 2009 at 7:34 PM, Carl-Daniel Hailfinger
>> <c-d.hailfinger.devel.2006 at gmx.net> wrote:
>>
>>     
>>> The Linux kernel powernow-k8 driver doesn't complain anymore, but now
>>> the machine will lock up or reboot once I put some load on it.
>>> Blacklisting the powernow-k8 driver avoids the issue, but that makes
>>> frequency scaling impossible.    
>>>       
>> Can you dump the current tables or can you not get that far before a
>> crash? The entries are end points and the driver takes care of the
>> stepping that needs to be done to get to those points. We need to
>> check that the table generated the correct vid setting for the fid. It
>> is well described in the bkdg section 10.6.
>>     
>
> I managed to boot fine with the proprietary BIOS, blacklisted the
> k8-powernow driver and rebooted with coreboot.
>
> If I combine the _PSS from the proprietary BIOS with the other tables
> from coreboot, the machine does not crash. I'll try to narrow it down
> further.
>   

I finally found the bug.

The DBM90T code sets bit 10 in _PSS as part of the control value, but
bit 10 is part of NewVID. That means the resulting VID is wrong and
causes the processor to crash.
The Pistachio code has the same bug.

This patch fixes the wrong setting and changes control from a magic and
incorrect unexplained value (0xE8202C00) to a combination of explained
values and shifts which has the right value (0xE8202800).

It is tested on my machine and it survived 200 changes from minimum to
maximum frequency every 100 ms under heavy load and under no load.

In the long term we want to consolidate all AMD FIDVID code into one
generic library file.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>

--- src/mainboard/amd/pistachio/acpi_tables.c	(Revision 3850)
+++ src/mainboard/amd/pistachio/acpi_tables.c	(Arbeitskopie)
@@ -400,10 +400,10 @@
 		Pstate_num++;
 	}
 
-	/* Print Pstate feq,vid,volt,power */
+	/* Print Pstate freq,vid,volt,power */
 
 	for (index = 0; index < Pstate_num; index++) {
-		printk_info("Pstate_feq[%d] = %dMHz\t", index,
+		printk_info("Pstate_freq[%d] = %dMHz\t", index,
 			    Pstate_feq[index]);
 		printk_info("Pstate_vid[%d] = %d\t", index, Pstate_vid[index]);
 		printk_info("Pstate_volt[%d] = %dmv\t", index,
@@ -414,8 +414,11 @@
 
 	/*
 	 * Modify the DSDT Table to put the actural _PSS package
-	 * corefeq-->Pstate_feq[index] power-->Pstate_power[index] transitionlatency-->0x64 busmasterlatency-->0x7,
-	 * control-->0xE8202C00| Pstate_vid[index]<<6 | Pstate_fid[index]
+	 * corefeq-->Pstate_feq[index]
+	 * power-->Pstate_power[index]
+	 * transitionlatency-->0x64
+	 * busmasterlatency-->0x7,
+	 * control--> 0xE8202800| Pstate_vid[index]<<6 | Pstate_fid[index]
 	 * status --> Pstate_vid[index]<<6 | Pstate_fid[index]
 	 * Get the _PSS control method Sig.
 	 */
@@ -461,7 +464,13 @@
 				transitionlatency = 0x64;
 				busmasterlatency = 0x7;
 				control =
-				    0xE8202C00 | (Pstate_vid[index] << 6) |
+				    (0x3 << 30) | /* IRT */
+				    (0x2 << 28) | /* RVO */
+				    (0x1 << 27) | /* ExtType */
+				    (0x2 << 20) | /* PLL_LOCK_TIME */
+				    (0x0 << 18) | /* MVS */
+				    (0x5 << 11) | /* VST */
+				    (Pstate_vid[index] << 6) |
 				    Pstate_fid[index];
 				status =
 				    (Pstate_vid[index] << 6) |
--- src/mainboard/amd/dbm690t/acpi_tables.c	(Revision 3850)
+++ src/mainboard/amd/dbm690t/acpi_tables.c	(Arbeitskopie)
@@ -260,7 +260,7 @@
 
 	/* Get the multipier of the fid frequency */
 	/*
-	 * Fid multiplier is always 100 revF and revG.
+	 * Fid multiplier is always 100 revF and revG.
 	 */
 	fid_multiplier = 100;
 
@@ -400,10 +400,10 @@
 		Pstate_num++;
 	}
 
-	/* Print Pstate feq,vid,volt,power */
+	/* Print Pstate freq,vid,volt,power */
 
 	for (index = 0; index < Pstate_num; index++) {
-		printk_info("Pstate_feq[%d] = %dMHz\t", index,
+		printk_info("Pstate_freq[%d] = %dMHz\t", index,
 			    Pstate_feq[index]);
 		printk_info("Pstate_vid[%d] = %d\t", index, Pstate_vid[index]);
 		printk_info("Pstate_volt[%d] = %dmv\t", index,
@@ -414,8 +414,11 @@
 
 	/*
 	 * Modify the DSDT Table to put the actural _PSS package
-	 * corefeq-->Pstate_feq[index] power-->Pstate_power[index] transitionlatency-->0x64 busmasterlatency-->0x7,
-	 * control-->0xE8202C00| Pstate_vid[index]<<6 | Pstate_fid[index]
+	 * corefeq-->Pstate_feq[index]
+	 * power-->Pstate_power[index]
+	 * transitionlatency-->0x64
+	 * busmasterlatency-->0x7,
+	 * control--> 0xE8202800| Pstate_vid[index]<<6 | Pstate_fid[index]
 	 * status --> Pstate_vid[index]<<6 | Pstate_fid[index]
 	 * Get the _PSS control method Sig.
 	 */
@@ -461,7 +464,13 @@
 				transitionlatency = 0x64;
 				busmasterlatency = 0x7;
 				control =
-				    0xE8202C00 | (Pstate_vid[index] << 6) |
+				    (0x3 << 30) | /* IRT */
+				    (0x2 << 28) | /* RVO */
+				    (0x1 << 27) | /* ExtType */
+				    (0x2 << 20) | /* PLL_LOCK_TIME */
+				    (0x0 << 18) | /* MVS */
+				    (0x5 << 11) | /* VST */
+				    (Pstate_vid[index] << 6) |
 				    Pstate_fid[index];
 				status =
 				    (Pstate_vid[index] << 6) |


-- 
http://www.hailfinger.org/

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: linuxbios_fam0f_fidvid_pss_fix.diff
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20090115/9b1dee7d/attachment.ksh>


More information about the coreboot mailing list