@@ -552,8 +552,9 @@ static const struct pci_platform_pm_ops *pci_platform_pm;
552552
553553int pci_set_platform_pm (const struct pci_platform_pm_ops * ops )
554554{
555- if (!ops -> is_manageable || !ops -> set_state || !ops -> choose_state ||
556- !ops -> sleep_wake || !ops -> run_wake || !ops -> need_resume )
555+ if (!ops -> is_manageable || !ops -> set_state || !ops -> get_state ||
556+ !ops -> choose_state || !ops -> sleep_wake || !ops -> run_wake ||
557+ !ops -> need_resume )
557558 return - EINVAL ;
558559 pci_platform_pm = ops ;
559560 return 0 ;
@@ -570,6 +571,11 @@ static inline int platform_pci_set_power_state(struct pci_dev *dev,
570571 return pci_platform_pm ? pci_platform_pm -> set_state (dev , t ) : - ENOSYS ;
571572}
572573
574+ static inline pci_power_t platform_pci_get_power_state (struct pci_dev * dev )
575+ {
576+ return pci_platform_pm ? pci_platform_pm -> get_state (dev ) : PCI_UNKNOWN ;
577+ }
578+
573579static inline pci_power_t platform_pci_choose_state (struct pci_dev * dev )
574580{
575581 return pci_platform_pm ?
@@ -701,26 +707,25 @@ static int pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state)
701707}
702708
703709/**
704- * pci_update_current_state - Read PCI power state of given device from its
705- * PCI PM registers and cache it
710+ * pci_update_current_state - Read power state of given device and cache it
706711 * @dev: PCI device to handle.
707712 * @state: State to cache in case the device doesn't have the PM capability
713+ *
714+ * The power state is read from the PMCSR register, which however is
715+ * inaccessible in D3cold. The platform firmware is therefore queried first
716+ * to detect accessibility of the register. In case the platform firmware
717+ * reports an incorrect state or the device isn't power manageable by the
718+ * platform at all, we try to detect D3cold by testing accessibility of the
719+ * vendor ID in config space.
708720 */
709721void pci_update_current_state (struct pci_dev * dev , pci_power_t state )
710722{
711- if (dev -> pm_cap ) {
723+ if (platform_pci_get_power_state (dev ) == PCI_D3cold ||
724+ !pci_device_is_present (dev )) {
725+ dev -> current_state = PCI_D3cold ;
726+ } else if (dev -> pm_cap ) {
712727 u16 pmcsr ;
713728
714- /*
715- * Configuration space is not accessible for device in
716- * D3cold, so just keep or set D3cold for safety
717- */
718- if (dev -> current_state == PCI_D3cold )
719- return ;
720- if (state == PCI_D3cold ) {
721- dev -> current_state = PCI_D3cold ;
722- return ;
723- }
724729 pci_read_config_word (dev , dev -> pm_cap + PCI_PM_CTRL , & pmcsr );
725730 dev -> current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK );
726731 } else {
@@ -1959,9 +1964,22 @@ static pci_power_t pci_target_state(struct pci_dev *dev)
19591964 default :
19601965 target_state = state ;
19611966 }
1962- } else if (!dev -> pm_cap ) {
1967+
1968+ return target_state ;
1969+ }
1970+
1971+ if (!dev -> pm_cap )
19631972 target_state = PCI_D0 ;
1964- } else if (device_may_wakeup (& dev -> dev )) {
1973+
1974+ /*
1975+ * If the device is in D3cold even though it's not power-manageable by
1976+ * the platform, it may have been powered down by non-standard means.
1977+ * Best to let it slumber.
1978+ */
1979+ if (dev -> current_state == PCI_D3cold )
1980+ target_state = PCI_D3cold ;
1981+
1982+ if (device_may_wakeup (& dev -> dev )) {
19651983 /*
19661984 * Find the deepest state from which the device can generate
19671985 * wake-up events, make it the target state and enable device
0 commit comments