lkml.org 
[lkml]   [2008]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: ACPI PM-Timer on K6-3 SiS5591: Houston...
    Hi Andreas,

    On Sun, Aug 10, 2008 at 09:08:02PM +0200, Andreas Mohr wrote:
    > And it's in fact not this triple-read which has any weakness here but rather
    > the init check.

    right.

    > IMHO the current init check is too weak, it will catch the very simplest
    > types of problems only, and that's not a good thing.

    what about this?

    Best,
    Dominik


    acpi_pm.c: check for monotonicity

    Expand the check for monotonicity by doing ten tests instead of one.

    Applies on top of "acpi_pm.c: use proper read function also in errata mode."

    Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.de>

    diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c
    index 2c00edd..f05c4fb 100644
    --- a/drivers/clocksource/acpi_pm.c
    +++ b/drivers/clocksource/acpi_pm.c
    @@ -178,7 +178,7 @@ static int verify_pmtmr_rate(void)
    static int __init init_acpi_pm_clocksource(void)
    {
    cycle_t value1, value2;
    - unsigned int i;
    + unsigned int i, j, good = 0;

    if (!pmtmr_ioport)
    return -ENODEV;
    @@ -187,24 +187,32 @@ static int __init init_acpi_pm_clocksource(void)
    clocksource_acpi_pm.shift);

    /* "verify" this timing source: */
    - value1 = clocksource_acpi_pm.read();
    - for (i = 0; i < 10000; i++) {
    - value2 = clocksource_acpi_pm.read();
    - if (value2 == value1)
    - continue;
    - if (value2 > value1)
    - goto pm_good;
    - if ((value2 < value1) && ((value2) < 0xFFF))
    - goto pm_good;
    - printk(KERN_INFO "PM-Timer had inconsistent results:"
    - " 0x%#llx, 0x%#llx - aborting.\n", value1, value2);
    - return -EINVAL;
    + for (j = 0; j < 10; j++) {
    + value1 = clocksource_acpi_pm.read();
    + for (i = 0; i < 10000; i++) {
    + value2 = clocksource_acpi_pm.read();
    + if (value2 == value1)
    + continue;
    + if (value2 > value1)
    + good++;
    + break;
    + if ((value2 < value1) && ((value2) < 0xFFF))
    + good++;
    + break;
    + printk(KERN_INFO "PM-Timer had inconsistent results:"
    + " 0x%#llx, 0x%#llx - aborting.\n",
    + value1, value2);
    + return -EINVAL;
    + }
    + udelay(300 * i);
    + }
    +
    + if (good != 10) {
    + printk(KERN_INFO "PM-Timer had no reasonable result:"
    + " 0x%#llx - aborting.\n", value1);
    + return -ENODEV;
    }
    - printk(KERN_INFO "PM-Timer had no reasonable result:"
    - " 0x%#llx - aborting.\n", value1);
    - return -ENODEV;

    -pm_good:
    if (verify_pmtmr_rate() != 0)
    return -ENODEV;


    \
     
     \ /
      Last update: 2008-08-10 22:05    [W:0.027 / U:1.188 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site