lkml.org 
[lkml]   [2008]   [Jul]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [RFC PATCH] AHCI: speed up resume
    From
    Date

    On Fri, 2008-07-04 at 07:23 +0800, Rafael J. Wysocki wrote:
    > On Thursday, 3 of July 2008, Zhang Rui wrote:
    > > During S3 resume, AHCI driver sleeps 1 second to wait for the HBA
    > reset
    > > to finish. This is luxurious, :)
    > >
    > > According to the AHCI 1.2 spec, We should poll the HOST_CTL
    > register,
    > > and return error if the host reset is not finished within 1 second.
    > >
    > > Test results show that the HBA reset can be done quickly(in usecs).
    > > And this patch may save nearly 1 second during resume.
    >
    > That's a lot.
    >
    > How heavily has it been tested?

    I only tested it on a SantaRosa laptop.

    w/o the patch,
    [ 469.923186] ahci_pci_device_resume
    [ 469.936105] PM: Writing back config space on device 0000:00:1f.2 at
    offset f (was 200, writing 20a)
    [ 469.936145] PM: Writing back config space on device 0000:00:1f.2 at
    offset 1 (was 2b00007, writing 2b00407)
    [ 469.936220] PCI: Setting latency timer of device 0000:00:1f.2 to 64
    [ 470.092053] ata4.00: ACPI cmd ef/03:0c:00:00:00:a0 filtered out
    [ 470.092053] ata4.00: ACPI cmd ef/03:42:00:00:00:a0 filtered out
    [ 470.107675] ata4.00: configured for UDMA/33
    [ 470.942195] ahci_pci_device_resume done

    w/ the patch applied, run S3 for more than ten times in a row,
    [ 571.150339] ahci_pci_device_resume
    [ 571.163193] ahci_pci_device_resume done
    [ 578.560382] ahci_pci_device_resume
    [ 578.576410] ahci_pci_device_resume done
    [ 586.065037] ahci_pci_device_resume
    [ 586.080806] ahci_pci_device_resume done
    [ 770.231756] ahci_pci_device_resume
    [ 770.244431] ahci_pci_device_resume done
    [ 777.537985] ahci_pci_device_resume
    [ 777.553709] ahci_pci_device_resume done
    [ 784.805554] ahci_pci_device_resume
    [ 784.819660] ahci_pci_device_resume done
    [ 791.888451] ahci_pci_device_resume
    [ 791.905222] ahci_pci_device_resume done
    [ 798.943719] ahci_pci_device_resume
    [ 798.959437] ahci_pci_device_resume done
    [ 806.438784] ahci_pci_device_resume
    [ 806.452070] ahci_pci_device_resume done
    [ 813.890609] ahci_pci_device_resume
    [ 813.903247] ahci_pci_device_resume done
    [ 821.265956] ahci_pci_device_resume
    [ 821.278714] ahci_pci_device_resume done
    [ 828.609051] ahci_pci_device_resume
    [ 828.621795] ahci_pci_device_resume done
    [ 835.731528] ahci_pci_device_resume
    [ 835.744210] ahci_pci_device_resume done

    I don't know if this ssleep(1) is required for some platform specific
    problems, but this patch does work well for me. :)
    Hmm, we'd better get some comments from Tejun Heo first.

    thanks,
    rui
    >
    > > Signed-off-by: Zhang Rui <rui.zhang@intel.com>
    > > --
    > > drivers/ata/ahci.c | 17 ++++++++++++++---
    > > 1 file changed, 14 insertions(+), 3 deletions(-)
    > >
    > > Index: linux-2.6/drivers/ata/ahci.c
    > > ===================================================================
    > > --- linux-2.6.orig/drivers/ata/ahci.c 2007-05-03 11:06:33.000000000
    > +0800
    > > +++ linux-2.6/drivers/ata/ahci.c 2008-07-02 16:25:54.000000000
    > +0800
    > > @@ -1073,18 +1073,29 @@
    > >
    > > /* global controller reset */
    > > if (!ahci_skip_host_reset) {
    > > + int delay = msecs_to_jiffies(1000);
    > > + int timeout;
    > > +
    > > tmp = readl(mmio + HOST_CTL);
    > > if ((tmp & HOST_RESET) == 0) {
    > > writel(tmp | HOST_RESET, mmio + HOST_CTL);
    > > readl(mmio + HOST_CTL); /* flush */
    > > }
    > >
    > > - /* reset must complete within 1 second, or
    > > + /*
    > > + * to perform host reset, OS should set HOST_RESET
    > > + * and poll until this bit is read to be "0"
    > > + * reset must complete within 1 second, or
    > > * the hardware should be considered fried.
    > > */
    > > - ssleep(1);
    > > + timeout = jiffies + delay;
    > > + while (jiffies < timeout) {
    > > + tmp = readl(mmio + HOST_CTL);
    > > + if (!(tmp & HOST_RESET))
    > > + break;
    > > + cpu_relax();
    > > + }
    > >
    > > - tmp = readl(mmio + HOST_CTL);
    > > if (tmp & HOST_RESET) {
    > > dev_printk(KERN_ERR, host->dev,
    > > "controller reset failed (0x%x)\n",
    > tmp);
    > >
    > >
    > >
    > >
    >
    >
    >
    > --
    > "Premature optimization is the root of all evil." - Donald Knuth
    >
    >



    \
     
     \ /
      Last update: 2008-07-04 03:51    [W:0.025 / U:30.040 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site