Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 90cc0c3c authored by Mika Westerberg's avatar Mika Westerberg Committed by Bjorn Helgaas
Browse files

PCI: shpchp: Add shpchp_is_native()



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: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent bed4e9cf
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;
+0 −1
Original line number Diff line number Diff line
@@ -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 */
+1 −13
Original line number Diff line number Diff line
@@ -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);
+29 −0
Original line number Diff line number Diff line
@@ -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.
+2 −0
Original line number Diff line number Diff line
@@ -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
Loading