The branch main has been updated by andrew:

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

commit c94e4d91da37f6216f3c9cd128e508fd334f06e8
Author:     Andrew Turner <and...@freebsd.org>
AuthorDate: 2023-04-24 14:35:56 +0000
Commit:     Andrew Turner <and...@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) ||

Reply via email to