|
@@ -370,26 +370,28 @@ EXPORT_SYMBOL_GPL(pci_get_hp_params);
|
|
|
|
|
|
/**
|
|
|
* pciehp_is_native - Check whether a hotplug port is handled by the OS
|
|
|
- * @pdev: Hotplug port to check
|
|
|
+ * @bridge: Hotplug port to check
|
|
|
*
|
|
|
- * Walk up from @pdev to the host bridge, obtain its cached _OSC Control Field
|
|
|
- * and return the value of the "PCI Express Native Hot Plug control" bit.
|
|
|
- * On failure to obtain the _OSC Control Field return %false.
|
|
|
+ * Returns true if the given @bridge is handled by the native PCIe hotplug
|
|
|
+ * driver.
|
|
|
*/
|
|
|
-bool pciehp_is_native(struct pci_dev *pdev)
|
|
|
+bool pciehp_is_native(struct pci_dev *bridge)
|
|
|
{
|
|
|
- struct acpi_pci_root *root;
|
|
|
- acpi_handle handle;
|
|
|
+ const struct pci_host_bridge *host;
|
|
|
+ u32 slot_cap;
|
|
|
|
|
|
- handle = acpi_find_root_bridge_handle(pdev);
|
|
|
- if (!handle)
|
|
|
+ if (!IS_ENABLED(CONFIG_HOTPLUG_PCI_PCIE))
|
|
|
return false;
|
|
|
|
|
|
- root = acpi_pci_find_root(handle);
|
|
|
- if (!root)
|
|
|
+ pcie_capability_read_dword(bridge, PCI_EXP_SLTCAP, &slot_cap);
|
|
|
+ if (!(slot_cap & PCI_EXP_SLTCAP_HPC))
|
|
|
return false;
|
|
|
|
|
|
- return root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL;
|
|
|
+ if (pcie_ports_native)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ host = pci_find_host_bridge(bridge->bus);
|
|
|
+ return host->native_pcie_hotplug;
|
|
|
}
|
|
|
|
|
|
/**
|