lkml.org 
[lkml]   [2012]   [Jun]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 02/15] ACPI: Ignore invalid _PSS entries, but use valid ones
    Date
    From: Marco Aurelio da Costa <costa@gamic.com>

    The EliteBook 8560W has non-initialized entries in its _PSS ACPI
    table. Instead of bailing out when the first non-initialized entry is
    found, ignore it and use only the valid entries. Only bail out if there
    is no valid entry at all.

    [v3: Fixes suggested by Konrad]

    Signed-off-by: Marco Aurelio da Costa <costa@gamic.com>
    Signed-off-by: Len Brown <len.brown@intel.com>
    ---
    drivers/acpi/processor_perflib.c | 30 +++++++++++++++++++++++++-----
    1 file changed, 25 insertions(+), 5 deletions(-)

    diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
    index 0af48a8..a093dc1 100644
    --- a/drivers/acpi/processor_perflib.c
    +++ b/drivers/acpi/processor_perflib.c
    @@ -333,6 +333,7 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
    struct acpi_buffer state = { 0, NULL };
    union acpi_object *pss = NULL;
    int i;
    + int last_invalid = -1;


    status = acpi_evaluate_object(pr->handle, "_PSS", NULL, &buffer);
    @@ -394,14 +395,33 @@ static int acpi_processor_get_performance_states(struct acpi_processor *pr)
    ((u32)(px->core_frequency * 1000) !=
    (px->core_frequency * 1000))) {
    printk(KERN_ERR FW_BUG PREFIX
    - "Invalid BIOS _PSS frequency: 0x%llx MHz\n",
    - px->core_frequency);
    - result = -EFAULT;
    - kfree(pr->performance->states);
    - goto end;
    + "Invalid BIOS _PSS frequency found for processor %d: 0x%llx MHz\n",
    + pr->id, px->core_frequency);
    + if (last_invalid == -1)
    + last_invalid = i;
    + } else {
    + if (last_invalid != -1) {
    + /*
    + * Copy this valid entry over last_invalid entry
    + */
    + memcpy(&(pr->performance->states[last_invalid]),
    + px, sizeof(struct acpi_processor_px));
    + ++last_invalid;
    + }
    }
    }

    + if (last_invalid == 0) {
    + printk(KERN_ERR FW_BUG PREFIX
    + "No valid BIOS _PSS frequency found for processor %d\n", pr->id);
    + result = -EFAULT;
    + kfree(pr->performance->states);
    + pr->performance->states = NULL;
    + }
    +
    + if (last_invalid > 0)
    + pr->performance->state_count = last_invalid;
    +
    end:
    kfree(buffer.pointer);

    --
    1.7.11.rc0.100.g5498c5f


    \
     
     \ /
      Last update: 2012-06-04 09:41    [W:0.026 / U:89.552 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site