lkml.org 
[lkml]   [2011]   [May]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/5] ACPI: Add fixups for AMD P-state figures
    Date
    Some AMD systems may round the frequencies in ACPI tables to 100MHz
    boundaries. We can obtain the real frequencies from MSRs, so add a quirk
    to fix these frequencies up on AMD systems.

    Signed-off-by: Matthew Garrett <mjg@redhat.com>
    ---
    drivers/acpi/processor_perflib.c | 30 ++++++++++++++++++++++++++++++
    1 files changed, 30 insertions(+), 0 deletions(-)

    diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
    index 3a73a93..6c7d49d 100644
    --- a/drivers/acpi/processor_perflib.c
    +++ b/drivers/acpi/processor_perflib.c
    @@ -306,6 +306,34 @@ static int acpi_processor_get_performance_control(struct acpi_processor *pr)
    return result;
    }

    +#ifdef CONFIG_X86
    +/*
    + * Some AMDs have 50MHz frequency multiples, but only provide 100MHz rounding
    + * in their ACPI data. Calculate the real values and fix up the _PSS data.
    + */
    +static void amd_fixup_frequency(struct acpi_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(0xc0010064 + index, lo, hi);
    + 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;
    + }
    +}
    +#else
    +static void amd_fixup_frequency(struct acpi_processor_px *px, int i) {};
    +#endif
    +
    static int acpi_processor_get_performance_states(struct acpi_processor *pr)
    {
    int result = 0;
    @@ -360,6 +388,8 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
    goto end;
    }

    + amd_fixup_frequency(px, i);
    +
    ACPI_DEBUG_PRINT((ACPI_DB_INFO,
    "State [%d]: core_frequency[%d] power[%d] transition_latency[%d] bus_master_latency[%d] control[0x%x] status[0x%x]\n",
    i,
    --
    1.7.5


    \
     
     \ /
      Last update: 2011-05-17 19:07    [W:0.026 / U:0.452 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site