lkml.org 
[lkml]   [2013]   [Jan]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [Xen-devel] kernel 3.7+ cpufreq regression on AMD system running as dom0


On 01/18/2013 02:00 PM, Konrad Rzeszutek Wilk wrote:
>
> So something like this in the hypervisor maybe (not even tested):
>
> diff --git a/xen/arch/x86/acpi/cpufreq/powernow.c b/xen/arch/x86/acpi/cpufreq/powernow.c
> index a9b7792..54e7808 100644
> --- a/xen/arch/x86/acpi/cpufreq/powernow.c
> +++ b/xen/arch/x86/acpi/cpufreq/powernow.c
> @@ -146,7 +146,40 @@ static int powernow_cpufreq_target(struct cpufreq_policy *policy,
>
> return 0;
> }
> +#define MSR_AMD_PSTATE_DEF_BASE 0xc0010064
> +static void amd_fixup_frequency(struct xen_processor_px *px, int i)
> +{
> + u32 hi, lo, fid, did;
> + int index = px->control & 0x00000007;
> +
> + if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
> + return;
> +
> + if ((boot_cpu_data.x86 == 0x10 && boot_cpu_data.x86_model < 10)
> + || boot_cpu_data.x86 == 0x11) {
> + rdmsr(MSR_AMD_PSTATE_DEF_BASE + index, lo, hi);
> + /* Bit 63 indicates whether contents are valid */
> + if (!(hi & 0x80000000))
> + return;
> +
> + fid = lo & 0x3f;
> + did = (lo >> 6) & 7;
> + if (boot_cpu_data.x86 == 0x10)
> + px->core_frequency = (100 * (fid + 0x10)) >> did;
> + else
> + px->core_frequency = (100 * (fid + 8)) >> did;
> + }
> +}
> +
> +static void amd_fixup_freq(struct processor_performance *perf)
> +{
>
> + int i;
> +
> + for (i = 0; i < perf->state_count; i++)
> + amd_fixup_frequency(perf->states, i);

amd_fixup_frequency(&perf->states[i]) will walk P-states.

> +
> +}
> static int powernow_cpufreq_verify(struct cpufreq_policy *policy)
> {
> struct acpi_cpufreq_data *data;
> @@ -158,6 +191,8 @@ static int powernow_cpufreq_verify(struct cpufreq_policy *policy)
>
> perf = &processor_pminfo[policy->cpu]->perf;
>
> + amd_fixup_freq(perf);

Maybe move to powernow_cpufreq_cpu_init(), although this works too.


-boris


> +
> cpufreq_verify_within_limits(policy, 0,
> perf->states[perf->platform_limit].core_frequency * 1000);
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
>



\
 
 \ /
  Last update: 2013-01-22 01:41    [W:0.099 / U:0.072 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site