]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/blobdiff - drivers/pci/pci.c
Merge tag 'pci-v4.20-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[mirror_ubuntu-disco-kernel.git] / drivers / pci / pci.c
index 51b6c81671c1e21baba57422cd90d8727992f8e1..d068f11d08a70cf3b8e86a4dd42c714ca9e2732e 100644 (file)
@@ -35,6 +35,8 @@
 #include <linux/aer.h>
 #include "pci.h"
 
+DEFINE_MUTEX(pci_slot_mutex);
+
 const char *pci_power_names[] = {
        "error", "D0", "D1", "D2", "D3hot", "D3cold", "unknown",
 };
@@ -196,7 +198,7 @@ EXPORT_SYMBOL_GPL(pci_ioremap_wc_bar);
 /**
  * pci_dev_str_match_path - test if a path string matches a device
  * @dev:    the PCI device to test
- * @p:      string to match the device against
+ * @path:   string to match the device against
  * @endptr: pointer to the string after the match
  *
  * Test if a string (typically from a kernel parameter) formatted as a
@@ -791,6 +793,11 @@ static inline bool platform_pci_need_resume(struct pci_dev *dev)
        return pci_platform_pm ? pci_platform_pm->need_resume(dev) : false;
 }
 
+static inline bool platform_pci_bridge_d3(struct pci_dev *dev)
+{
+       return pci_platform_pm ? pci_platform_pm->bridge_d3(dev) : false;
+}
+
 /**
  * pci_raw_set_power_state - Use PCI PM registers to set the power state of
  *                           given PCI device
@@ -999,7 +1006,7 @@ static void __pci_start_power_transition(struct pci_dev *dev, pci_power_t state)
                 * because have already delayed for the bridge.
                 */
                if (dev->runtime_d3cold) {
-                       if (dev->d3cold_delay)
+                       if (dev->d3cold_delay && !dev->imm_ready)
                                msleep(dev->d3cold_delay);
                        /*
                         * When powering on a bridge from D3cold, the
@@ -1284,6 +1291,7 @@ int pci_save_state(struct pci_dev *dev)
        if (i != 0)
                return i;
 
+       pci_save_dpc_state(dev);
        return pci_save_vc_state(dev);
 }
 EXPORT_SYMBOL(pci_save_state);
@@ -1389,6 +1397,7 @@ void pci_restore_state(struct pci_dev *dev)
        pci_restore_ats_state(dev);
        pci_restore_vc_state(dev);
        pci_restore_rebar_state(dev);
+       pci_restore_dpc_state(dev);
 
        pci_cleanup_aer_error_status_regs(dev);
 
@@ -2144,10 +2153,13 @@ static int __pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable
        int ret = 0;
 
        /*
-        * Bridges can only signal wakeup on behalf of subordinate devices,
-        * but that is set up elsewhere, so skip them.
+        * Bridges that are not power-manageable directly only signal
+        * wakeup on behalf of subordinate devices which is set up
+        * elsewhere, so skip them. However, bridges that are
+        * power-manageable may signal wakeup for themselves (for example,
+        * on a hotplug event) and they need to be covered here.
         */
-       if (pci_has_subordinate(dev))
+       if (!pci_power_manageable(dev))
                return 0;
 
        /* Don't do the same thing twice in a row for one device. */
@@ -2522,6 +2534,10 @@ bool pci_bridge_d3_possible(struct pci_dev *bridge)
                if (bridge->is_thunderbolt)
                        return true;
 
+               /* Platform might know better if the bridge supports D3 */
+               if (platform_pci_bridge_d3(bridge))
+                       return true;
+
                /*
                 * Hotplug ports handled natively by the OS were not validated
                 * by vendors for runtime D3 at least until 2018 because there
@@ -2655,6 +2671,7 @@ EXPORT_SYMBOL_GPL(pci_d3cold_disable);
 void pci_pm_init(struct pci_dev *dev)
 {
        int pm;
+       u16 status;
        u16 pmc;
 
        pm_runtime_forbid(&dev->dev);
@@ -2717,6 +2734,10 @@ void pci_pm_init(struct pci_dev *dev)
                /* Disable the PME# generation functionality */
                pci_pme_active(dev, false);
        }
+
+       pci_read_config_word(dev, PCI_STATUS, &status);
+       if (status & PCI_STATUS_IMM_READY)
+               dev->imm_ready = 1;
 }
 
 static unsigned long pci_ea_flags(struct pci_dev *dev, u8 prop)
@@ -4387,6 +4408,9 @@ int pcie_flr(struct pci_dev *dev)
 
        pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR);
 
+       if (dev->imm_ready)
+               return 0;
+
        /*
         * Per PCIe r4.0, sec 6.6.2, a device must complete an FLR within
         * 100ms, but may silently discard requests while the FLR is in
@@ -4428,6 +4452,9 @@ static int pci_af_flr(struct pci_dev *dev, int probe)
 
        pci_write_config_byte(dev, pos + PCI_AF_CTRL, PCI_AF_CTRL_FLR);
 
+       if (dev->imm_ready)
+               return 0;
+
        /*
         * Per Advanced Capabilities for Conventional PCI ECN, 13 April 2006,
         * updated 27 July 2006; a device must complete an FLR within
@@ -4496,21 +4523,42 @@ bool pcie_wait_for_link(struct pci_dev *pdev, bool active)
        bool ret;
        u16 lnk_status;
 
+       /*
+        * Some controllers might not implement link active reporting. In this
+        * case, we wait for 1000 + 100 ms.
+        */
+       if (!pdev->link_active_reporting) {
+               msleep(1100);
+               return true;
+       }
+
+       /*
+        * PCIe r4.0 sec 6.6.1, a component must enter LTSSM Detect within 20ms,
+        * after which we should expect an link active if the reset was
+        * successful. If so, software must wait a minimum 100ms before sending
+        * configuration requests to devices downstream this port.
+        *
+        * If the link fails to activate, either the device was physically
+        * removed or the link is permanently failed.
+        */
+       if (active)
+               msleep(20);
        for (;;) {
                pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lnk_status);
                ret = !!(lnk_status & PCI_EXP_LNKSTA_DLLLA);
                if (ret == active)
-                       return true;
+                       break;
                if (timeout <= 0)
                        break;
                msleep(10);
                timeout -= 10;
        }
-
-       pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
-                active ? "set" : "cleared");
-
-       return false;
+       if (active && ret)
+               msleep(100);
+       else if (ret != active)
+               pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
+                       active ? "set" : "cleared");
+       return ret == active;
 }
 
 void pci_reset_secondary_bus(struct pci_dev *dev)
@@ -4582,13 +4630,13 @@ static int pci_reset_hotplug_slot(struct hotplug_slot *hotplug, int probe)
 {
        int rc = -ENOTTY;
 
-       if (!hotplug || !try_module_get(hotplug->ops->owner))
+       if (!hotplug || !try_module_get(hotplug->owner))
                return rc;
 
        if (hotplug->ops->reset_slot)
                rc = hotplug->ops->reset_slot(hotplug, probe);
 
-       module_put(hotplug->ops->owner);
+       module_put(hotplug->owner);
 
        return rc;
 }
@@ -5164,6 +5212,41 @@ static int pci_bus_reset(struct pci_bus *bus, int probe)
        return ret;
 }
 
+/**
+ * pci_bus_error_reset - reset the bridge's subordinate bus
+ * @bridge: The parent device that connects to the bus to reset
+ *
+ * This function will first try to reset the slots on this bus if the method is
+ * available. If slot reset fails or is not available, this will fall back to a
+ * secondary bus reset.
+ */
+int pci_bus_error_reset(struct pci_dev *bridge)
+{
+       struct pci_bus *bus = bridge->subordinate;
+       struct pci_slot *slot;
+
+       if (!bus)
+               return -ENOTTY;
+
+       mutex_lock(&pci_slot_mutex);
+       if (list_empty(&bus->slots))
+               goto bus_reset;
+
+       list_for_each_entry(slot, &bus->slots, list)
+               if (pci_probe_reset_slot(slot))
+                       goto bus_reset;
+
+       list_for_each_entry(slot, &bus->slots, list)
+               if (pci_slot_reset(slot, 0))
+                       goto bus_reset;
+
+       mutex_unlock(&pci_slot_mutex);
+       return 0;
+bus_reset:
+       mutex_unlock(&pci_slot_mutex);
+       return pci_bus_reset(bridge->subordinate, 0);
+}
+
 /**
  * pci_probe_reset_bus - probe whether a PCI bus can be reset
  * @bus: PCI bus to probe
@@ -5701,8 +5784,7 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode,
 void pci_add_dma_alias(struct pci_dev *dev, u8 devfn)
 {
        if (!dev->dma_alias_mask)
-               dev->dma_alias_mask = kcalloc(BITS_TO_LONGS(U8_MAX),
-                                             sizeof(long), GFP_KERNEL);
+               dev->dma_alias_mask = bitmap_zalloc(U8_MAX, GFP_KERNEL);
        if (!dev->dma_alias_mask) {
                pci_warn(dev, "Unable to allocate DMA alias mask\n");
                return;