PCI: shpchp: Add shpchp_is_native()
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 31 May 2018 16:42:11 +0000 (11:42 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 4 Jun 2018 17:08:06 +0000 (12:08 -0500)
In the same way we do for pciehp, add shpchp_is_native(), which returns
true if the bridge should be handled by the native SHPC driver.  Then
convert the driver to use this function.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/hotplug/acpi_pcihp.c
drivers/pci/hotplug/shpchp.h
drivers/pci/hotplug/shpchp_core.c
drivers/pci/pci-acpi.c
include/linux/pci_hotplug.h
include/linux/pci_ids.h

index 597d22a..3979f89 100644 (file)
@@ -83,11 +83,11 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *pdev)
         * OSHP within the scope of the hotplug controller and its parents,
         * up to the host bridge under which this controller exists.
         */
-       host = pci_find_host_bridge(pdev->bus);
-       if (host->native_shpc_hotplug)
+       if (shpchp_is_native(pdev))
                return 0;
 
        /* If _OSC exists, we should not evaluate OSHP */
+       host = pci_find_host_bridge(pdev->bus);
        root = acpi_pci_find_root(ACPI_HANDLE(&host->dev));
        if (root->osc_support_set)
                goto no_control;
index 9675ab7..516e483 100644 (file)
@@ -105,7 +105,6 @@ struct controller {
 };
 
 /* Define AMD SHPC ID  */
-#define PCI_DEVICE_ID_AMD_GOLAM_7450   0x7450
 #define PCI_DEVICE_ID_AMD_POGO_7458    0x7458
 
 /* AMD PCI-X bridge registers */
index 47decc9..e91be28 100644 (file)
@@ -270,24 +270,12 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
        return 0;
 }
 
-static int is_shpc_capable(struct pci_dev *dev)
-{
-       if (dev->vendor == PCI_VENDOR_ID_AMD &&
-           dev->device == PCI_DEVICE_ID_AMD_GOLAM_7450)
-               return 1;
-       if (!pci_find_capability(dev, PCI_CAP_ID_SHPC))
-               return 0;
-       if (acpi_get_hp_hw_control_from_firmware(dev))
-               return 0;
-       return 1;
-}
-
 static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
        int rc;
        struct controller *ctrl;
 
-       if (!is_shpc_capable(pdev))
+       if (acpi_get_hp_hw_control_from_firmware(pdev))
                return -ENODEV;
 
        ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
index 52b8434..65113b6 100644 (file)
@@ -394,6 +394,35 @@ bool pciehp_is_native(struct pci_dev *bridge)
        return host->native_pcie_hotplug;
 }
 
+/**
+ * shpchp_is_native - Check whether a hotplug port is handled by the OS
+ * @bridge: Hotplug port to check
+ *
+ * Returns true if the given @bridge is handled by the native SHPC hotplug
+ * driver.
+ */
+bool shpchp_is_native(struct pci_dev *bridge)
+{
+       const struct pci_host_bridge *host;
+
+       if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_SHPC))
+               return false;
+
+       /*
+        * It is assumed that AMD GOLAM chips support SHPC but they do not
+        * have SHPC capability.
+        */
+       if (bridge->vendor == PCI_VENDOR_ID_AMD &&
+           bridge->device == PCI_DEVICE_ID_AMD_GOLAM_7450)
+               return true;
+
+       if (!pci_find_capability(bridge, PCI_CAP_ID_SHPC))
+               return false;
+
+       host = pci_find_host_bridge(bridge->bus);
+       return host->native_shpc_hotplug;
+}
+
 /**
  * pci_acpi_wake_bus - Root bus wakeup notification fork function.
  * @context: Device wakeup context.
index 1f5c935..4c37836 100644 (file)
@@ -164,6 +164,7 @@ struct hotplug_params {
 int pci_get_hp_params(struct pci_dev *dev, struct hotplug_params *hpp);
 bool pciehp_is_native(struct pci_dev *bridge);
 int acpi_get_hp_hw_control_from_firmware(struct pci_dev *bridge);
+bool shpchp_is_native(struct pci_dev *bridge);
 int acpi_pci_check_ejectable(struct pci_bus *pbus, acpi_handle handle);
 int acpi_pci_detect_ejectable(acpi_handle handle);
 #else
@@ -178,5 +179,6 @@ static inline int acpi_get_hp_hw_control_from_firmware(struct pci_dev *bridge)
        return 0;
 }
 static inline bool pciehp_is_native(struct pci_dev *bridge) { return true; }
+static inline bool shpchp_is_native(struct pci_dev *bridge) { return true; }
 #endif
 #endif
index 883cb7b..5aace6c 100644 (file)
 #define PCI_DEVICE_ID_AMD_OPUS_7443    0x7443
 #define PCI_DEVICE_ID_AMD_VIPER_7443   0x7443
 #define PCI_DEVICE_ID_AMD_OPUS_7445    0x7445
+#define PCI_DEVICE_ID_AMD_GOLAM_7450   0x7450
 #define PCI_DEVICE_ID_AMD_8111_PCI     0x7460
 #define PCI_DEVICE_ID_AMD_8111_LPC     0x7468
 #define PCI_DEVICE_ID_AMD_8111_IDE     0x7469