[coreboot] AMD DBM690T PowerNow table problems
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Fri Jan 16 06:32:11 CET 2009
Hi,
if anyone wants to ack this, I'll commit it.
Regards,
Carl-Daniel
On 15.01.2009 07:42, Li, Maggie wrote:
> Hi
>
> I have tested it on my DBM690T board. It is ok.
>
> Best regards
> Maggie li
>
> -----Original Message-----
> From: coreboot-bounces+maggie.li=amd.com at coreboot.org [mailto:coreboot-bounces+maggie.li=amd.com at coreboot.org] On Behalf Of Carl-Daniel Hailfinger
> Sent: Thursday, January 15, 2009 12:35 PM
> To: Marc Jones
> Cc: Rudolf Marek; Bao, Zheng; Coreboot
> Subject: Re: [coreboot] AMD DBM690T PowerNow table problems
>
> 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) |
>
>
More information about the coreboot
mailing list