diff mbox

[v1,1/4] PCI: shpchp: Manage SHPC unconditionally on non-ACPI systems

Message ID 152996758037.260522.6880919949506497973.stgit@bhelgaas-glaptop.roam.corp.google.com (mailing list archive)
State New, archived
Delegated to: Bjorn Helgaas
Headers show

Commit Message

Bjorn Helgaas June 25, 2018, 10:59 p.m. UTC
From: Bjorn Helgaas <bhelgaas@google.com>

If acpi_pci_find_root() returns NULL, it means there's no ACPI host bridge
device (PNP0A03 or PNP0A08), and the OS is always allowed to manage the
SHPC, so return success in that case.

This fixes a NULL pointer dereference when CONFIG_ACPI=y but the current
hardware/firmware platform doesn't support ACPI.  In that case,
acpi_get_hp_hw_control_from_firmware() is implemented but
acpi_pci_find_root() returns NULL.

Fixes: 90cc0c3cc709 ("PCI: shpchp: Add shpchp_is_native()")
Link: https://lkml.kernel.org/r/20180621164715.28160-1-marc.zyngier@arm.com
Reported-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
---
 drivers/pci/hotplug/acpi_pcihp.c |   10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Marc Zyngier June 26, 2018, 8:01 a.m. UTC | #1
On 25/06/18 23:59, Bjorn Helgaas wrote:
> From: Bjorn Helgaas <bhelgaas@google.com>
> 
> If acpi_pci_find_root() returns NULL, it means there's no ACPI host bridge
> device (PNP0A03 or PNP0A08), and the OS is always allowed to manage the
> SHPC, so return success in that case.
> 
> This fixes a NULL pointer dereference when CONFIG_ACPI=y but the current
> hardware/firmware platform doesn't support ACPI.  In that case,
> acpi_get_hp_hw_control_from_firmware() is implemented but
> acpi_pci_find_root() returns NULL.
> 
> Fixes: 90cc0c3cc709 ("PCI: shpchp: Add shpchp_is_native()")
> Link: https://lkml.kernel.org/r/20180621164715.28160-1-marc.zyngier@arm.com
> Reported-by: Marc Zyngier <marc.zyngier@arm.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>

Tested-by: Marc Zyngier <marc.zyngier@arm.com>

Thanks for the quick turnaround!

	M.
diff mbox

Patch

diff --git a/drivers/pci/hotplug/acpi_pcihp.c b/drivers/pci/hotplug/acpi_pcihp.c
index 3979f89b250a..5bd6c1573295 100644
--- a/drivers/pci/hotplug/acpi_pcihp.c
+++ b/drivers/pci/hotplug/acpi_pcihp.c
@@ -7,7 +7,6 @@ 
  * All rights reserved.
  *
  * Send feedback to <kristen.c.accardi@intel.com>
- *
  */
 
 #include <linux/module.h>
@@ -87,8 +86,17 @@  int acpi_get_hp_hw_control_from_firmware(struct pci_dev *pdev)
 		return 0;
 
 	/* If _OSC exists, we should not evaluate OSHP */
+
+	/*
+	 * If there's no ACPI host bridge (i.e., ACPI support is compiled
+	 * into the kernel but the hardware platform doesn't support ACPI),
+	 * there's nothing to do here.
+	 */
 	host = pci_find_host_bridge(pdev->bus);
 	root = acpi_pci_find_root(ACPI_HANDLE(&host->dev));
+	if (!root)
+		return 0;
+
 	if (root->osc_support_set)
 		goto no_control;