• Ajaykumar Hotchandani's avatar
    PCI: Set device power state to PCI_D0 for device without native PM support · b51306c6
    Ajaykumar Hotchandani authored
    During test of one IB card with guest VM, found that, msi is not
    initialized properly.
    
    It turns out __write_msi_msg will do nothing if device current_state is
    not PCI_D0.  And, that pci device does not have pm_cap in guest VM.
    
    There is an error in setting of power state to PCI_D0 in
    pci_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_state and that device does not have native pm
    support, then PCI device power state will be set to PCI_D0.
    
    -v2: This also reverts 47e9037a, as it's
         not needed after this change.
    Acked-by: default avatar"Rafael J. Wysocki" <rjw@sisk.pl>
    Signed-off-by: Ajaykumar Hotchandani<ajaykumar.hotchandani@oracle.com>
    Signed-off-by: Yinghai Lu<yinghai.lu@oracle.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    b51306c6
acpiphp_glue.c 37.8 KB