On Sat, Jul 12, 2014 at 4:14 AM, Bjorn Helgaas <bhelg...@google.com> wrote:
> [updated Naga's email address]
>
> On Wed, Jul 09, 2014 at 11:50:01PM +0530, vidya sagar wrote:
>> On Tue, Jul 8, 2014 at 2:42 AM, Bjorn Helgaas <bhelg...@google.com> wrote:
>> > On Mon, Jul 7, 2014 at 12:00 PM, Vidya Sagar <vid...@nvidia.com> wrote:
>> >>> -----Original Message-----
>> >>> From: Bjorn Helgaas [mailto:bhelg...@google.com]
>> >>> Sent: Sunday, July 06, 2014 12:32 AM
>> >>> To: Vidya Sagar
>> >>> Cc: nagananda.chumbal...@hp.com; thierry.red...@gmail.com; Stephen
>> >>> Warren; Krishna Thota; linux-...@vger.kernel.org; linux-
>> >>> ker...@vger.kernel.org; Matthew Garrett; Rafael J. Wysocki
>> >>> Subject: Re: [PATCH v1] PCI: enable ASPM configuration in PCIE POWERSAVE
>> >>> mode
>> >>>
>> >>> [+cc Rafael]
>> >>>
>> >>> On Sat, Jul 05, 2014 at 12:57:36PM -0600, Bjorn Helgaas wrote:
>> >>> > [+cc Matthew]
>> >>> >
>> >>> > On Tue, Jul 01, 2014 at 12:46:18PM +0530, Vidya Sagar wrote:
>> >>> > > commit 1a680b7c moved pcie_aspm_powersave_config_link() out of
>> >>> > > pci_raw_set_power_state() to pci_set_power_state() which would
>> >>> > > enable ASPM. But, with commit db288c9c, which re-introduced the
>> >>> > > following check
>> >>> > > ./drivers/pci/pci.c: pci_set_power_state()
>> >>> > > +   /* Check if we're already there */
>> >>> > > +   if (dev->current_state == state)
>> >>> > > +       return 0;
>> >>> > > in pci_set_power_state(), call to pcie_aspm_powersave_config_link()
>> >>> > > is never made leaving ASPM broken.
>> >>> > > Fix it by not returning from when the above condition is true,
>> >>> > > rather, jump to ASPM configuration code and exit from there 
>> >>> > > eventually.
>> >>> >
>> >>> > Rafael, Matthew, any comments?  We have vacillated on this before and
>> >>> > the web is already pretty tangled.
>> >>> >
>> >> I've raised a bugzilla bug  
>> >> https://bugzilla.kernel.org/show_bug.cgi?id=79621 for the same.
>> >> Scenario here is, when the driver of a particular PCIe device is loaded 
>> >> and when CONFIG_PCIEASPM_POWERSAVE=y, ASPM is expected to get configured 
>> >> by the sub system which is not happening as of today.
>> >> The reason for this behavior is the 'if' condition that checks for the 
>> >> device's power state and returns if it is already in D0. Ideally, it 
>> >> shouldn't return from there, rather proceed to configure ASPM.
>> >
>> Please find the attached files (before_aspm_patch.txt &
>> after_aspm_patch.txt) with 'dmesg' and 'lspci -vvv' info.
>> BTW, my understanding is that this issue (enabling ASPM while booting)
>> exists for all the devices which are in D0 state.
>> Please correct my understanding if it's wrong.
>> Though, enabling aspm through writing 'powersave' to
>> '/sys/module/pcie_aspm/parameters' is working fine always.
>
> I think your observation is correct: it looks like if we boot with all
> devices in D0 (which I would expect to be a very common case), we don't
> touch ASPM configuration at all.  That would mean we would just leave
> the BIOS settings alone.
>
> It seems pretty surprising that it could have been this way since
> v3.6, when db288c9c5f9d was merged, and we haven't noticed until now,
> but if most BIOSes configure ASPM themselves, maybe it's possible.
>
> But I wonder if we can untangle ASPM from pci_set_power_state().  I
> don't think they're really related.  There are a zillion .suspend()
> and .resume() methods that call pci_set_power_state().  I doubt that
> we need to do ASPM configuration during suspend, and I'm dubious about
> resume, too.  What about a patch like the following?
>

yes. this looks better. I've tested this and is working fine.
I'll push a new patch with this.

>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 63a54a340863..75fabd1f72bc 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -839,12 +839,6 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t 
> state)
>
>         if (!__pci_complete_power_transition(dev, state))
>                 error = 0;
> -       /*
> -        * When aspm_policy is "powersave" this call ensures
> -        * that ASPM is configured.
> -        */
> -       if (!error && dev->bus->self)
> -               pcie_aspm_powersave_config_link(dev->bus->self);
>
>         return error;
>  }
> @@ -1195,12 +1189,18 @@ int __weak pcibios_enable_device(struct pci_dev *dev, 
> int bars)
>  static int do_pci_enable_device(struct pci_dev *dev, int bars)
>  {
>         int err;
> +       struct pci_dev *bridge;
>         u16 cmd;
>         u8 pin;
>
>         err = pci_set_power_state(dev, PCI_D0);
>         if (err < 0 && err != -EIO)
>                 return err;
> +
> +       bridge = pci_upstream_bridge(dev);
> +       if (bridge)
> +               pcie_aspm_powersave_config_link(bridge);
> +
>         err = pcibios_enable_device(dev, bars);
>         if (err < 0)
>                 return err;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to