git: c94e4d91da37 - main - Clean up PCI DEN0115 driver probing

From: Andrew Turner <andrew_at_FreeBSD.org>
Date: Mon, 24 Apr 2023 15:51:17 UTC
The branch main has been updated by andrew:

URL: https://cgit.FreeBSD.org/src/commit/?id=c94e4d91da37f6216f3c9cd128e508fd334f06e8

commit c94e4d91da37f6216f3c9cd128e508fd334f06e8
Author:     Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2023-04-24 14:35:56 +0000
Commit:     Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2023-04-24 15:34:21 +0000

    Clean up PCI DEN0115 driver probing
    
    Rather than checking for the SMCCC version check if the PCI_VERSION
    call returns a valid version.
    
    Sponsored by:   Arm Ltd
---
 sys/dev/pci/pci_host_generic_den0115.c | 43 ++++++++++++++++++++++------------
 1 file changed, 28 insertions(+), 15 deletions(-)

diff --git a/sys/dev/pci/pci_host_generic_den0115.c b/sys/dev/pci/pci_host_generic_den0115.c
index 08cb77cea22c..d620a755a1ca 100644
--- a/sys/dev/pci/pci_host_generic_den0115.c
+++ b/sys/dev/pci/pci_host_generic_den0115.c
@@ -52,13 +52,14 @@ static device_attach_t pci_host_acpi_smccc_attach;
 static pcib_read_config_t pci_host_acpi_smccc_read_config;
 static pcib_write_config_t pci_host_acpi_smccc_write_config;
 
+static bool pci_host_acpi_smccc_pci_version(uint32_t *);
+
 static int
 pci_host_acpi_smccc_probe(device_t dev)
 {
 	ACPI_DEVICE_INFO *devinfo;
 	struct resource *res;
 	ACPI_HANDLE h;
-	uint32_t smccc_version;
 	int rid, root;
 
 	if (acpi_disabled("pcib") || (h = acpi_get_handle(dev)) == NULL ||
@@ -80,17 +81,13 @@ pci_host_acpi_smccc_probe(device_t dev)
 		return (ENXIO);
 	}
 
-	/* Check the SMCCC is at least v1.1 */
-	smccc_version = smccc_get_version();
-	if (SMCCC_VERSION_MAJOR(smccc_version) > 1 ||
-	    (SMCCC_VERSION_MAJOR(smccc_version) == 1 &&
-	     SMCCC_VERSION_MINOR(smccc_version) == 0)) {
-		device_set_desc(dev,
-		    "ARM PCI Firmware config space host controller");
-		return (BUS_PROBE_SPECIFIC);
+	/* Check for the PCI_VERSION call */
+	if (!pci_host_acpi_smccc_pci_version(NULL)) {
+		return (ENXIO);
 	}
 
-	return (EINVAL);
+	device_set_desc(dev, "ARM PCI Firmware config space host controller");
+	return (BUS_PROBE_SPECIFIC);
 }
 
 #define	SMCCC_PCI_VERSION						\
@@ -134,11 +131,28 @@ pci_host_acpi_smccc_has_feature(uint32_t pci_func_id)
 	return (true);
 }
 
+static bool
+pci_host_acpi_smccc_pci_version(uint32_t *versionp)
+{
+	struct arm_smccc_res result;
+
+	if (psci_callfn(SMCCC_PCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &result) < 0) {
+		return (false);
+	}
+
+	if (versionp != NULL) {
+		*versionp = result.a0;
+	}
+
+	return (true);
+}
+
 static int
 pci_host_acpi_smccc_attach(device_t dev)
 {
 	struct generic_pcie_acpi_softc *sc;
 	struct arm_smccc_res result;
+	uint32_t version;
 	int end, start;
 	int error;
 
@@ -147,17 +161,16 @@ pci_host_acpi_smccc_attach(device_t dev)
 
 	MPASS(psci_callfn != NULL);
 
-	/* Check there is a version */
-	if (psci_callfn(SMCCC_PCI_VERSION, 0, 0, 0, 0, 0, 0, 0, &result) < 0) {
+	/* Read the version */
+	if (!pci_host_acpi_smccc_pci_version(&version)) {
 		device_printf(dev,
-		    "Failed to read the SMCCC PCI version: %lx\n", result.a0);
+		    "Failed to read the SMCCC PCI version\n");
 		return (ENXIO);
 	}
 
 	if (bootverbose) {
 		device_printf(dev, "Firmware v%d.%d\n",
-		    SMCCC_PCI_MAJOR((uint32_t)result.a0),
-		    SMCCC_PCI_MINOR((uint32_t)result.a0));
+		    SMCCC_PCI_MAJOR(version), SMCCC_PCI_MINOR(version));
 	}
 
 	if (!pci_host_acpi_smccc_has_feature(SMCCC_PCI_READ) ||