PCI: Set device power state to PCI_D0 for device without native PM support
A message that is not in the archive (sent off-list or not yet received): [email protected]
Ok I applied this to for-linus, but git am didn't like it so I had to merge it by hand. Please check it out and make sure it still works for you.
Thanks,
jesse
Quoted 114 lines · On Mon, 12 Dec 2011 13:57:36 +0530 Ajaykumar Hotchandani…
Hi Jesse,
Have following query, please point me to correct person if I am asking this to wrong person:
Any particular reason, why this is not checked in yet? Is something missing here?Thanks,
Ajay-------- Original Message --------
Subject: Re: [PATCH] PCI: Set device power state toPCI_D0for device
without native PM support
Date: Fri, 28 Oct 2011 17:36:43 +0530
From: Ajaykumar Hotchandani <[email protected]>
To: Jesse Barnes <[email protected]>,
"[email protected]" <[email protected]>, "[email protected]" <[email protected]>
CC: Stefano Stabellini <[email protected]>, Yinghai Lu
<[email protected]>Quoted 8 lines · Stefano Stabellini
Quoted 5 lines · Ajaykumar Hotchandani
Quoted 1 line
BTW I am OK with your patch.
Should we revert
47e9037ac16637cd7f12b8790ea7ce6680e42168(your changes inregister_slot())
I think, after this change, it's not needed. Or, am I missing some scenario?I think you are right,
47e9037ac16637cd7f12b8790ea7ce6680e42168is not needed anymore, so I am OK with reverting it.Thanks, following is updated patch.
[PATCH -v2] PCI: Set device power state to
PCI_D0for device without native PM supportDuring test of one IB card with guest VM, found that, msi is not initialized properly.
It turns out
__write_msi_msgwill do nothing if devicecurrent_stateis notPCI_D0.
And, that pci device does not havepm_capin guest VM.There is an error in setting of power state to
PCI_D0inpci_enable_device(), but error is not returned for this. Following is code flow:pci_enable_device()-->__pci_enable_device_flags()-->do_pci_enable_device()-->pci_set_power_state()-->__pci_start_power_transition()
We have following condition inside__pci_start_power_transition():if (platform_pci_power_manageable(dev)) { error = platform_pci_set_power_state(dev, state); if (!error) pci_update_current_state(dev, state); } else { error = -ENODEV; /* Fall back to PCI_D0 if native PM is not supported */ if (!dev->pm_cap) dev->current_state = PCI_D0; }Here, from
platform_pci_set_power_state(),acpi_pci_set_power_state()is getting called and that is failing with ENODEV because of following condition:if (!handle || ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0",&tmp))) return -ENODEV;Because of that,
pci_update_current_state()is not getting called.With this patch, if device power state can not be set via
platform_pci_set_power_stateand that device does not have native pm support, then PCI device power state will be set toPCI_D0.-v2: This also reverts
47e9037ac16637cd7f12b8790ea7ce6680e42168, as it's not needed after this change.Signed-off-by Ajaykumar Hotchandani<[email protected]>Signed-off-by Yinghai Lu<[email protected]>--- drivers/pci/hotplug/acpiphp_glue.c | 1 - drivers/pci/pci.c | 3 +++ 2 files changed, 3 insertions(+), 1 deletions(-)drivers/pci/hotplug/acpiphp_glue.c +0
-1@@ -212,7 +212,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) pdev =pci_get_slot (pbus,PCI_DEVFN (device, function));if (pdev) { - pdev->current_state =PCI_D0 ; slot->flags |= (SLOT_ENABLED |SLOT_POWEREDON );pci_dev_put (pdev);}drivers/pci/pci.c +3
-0@@ -664,6 +664,9 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state) error =platform_pci_set_power_state (dev, state);if (!error)pci_update_current_state (dev, state); +/* Fall back to PCI_D0 if native PM is not supported */ +if (!dev->pm_cap) + dev->current_state =PCI_D0 ; }else { error = -ENODEV ;/* Fall back to PCI_D0 if native PM is not supported */
Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center