The branch main has been updated by andrew:

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

commit 7029f2c887a16c823faf08e8a79dc0d3887989ab
Author:     Andrew Turner <[email protected]>
AuthorDate: 2022-06-04 10:59:46 +0000
Commit:     Andrew Turner <[email protected]>
CommitDate: 2023-04-24 11:33:50 +0000

    Allow pci_host_generic attachments to manage registers
    
    To allow for attachments that don't use memory mapped registers add
    a flag they can set when the base driver shouldn't map them.
    
    Sponsored by:   Arm Ltd
    Differential Revision:  https://reviews.freebsd.org/D39227
---
 sys/dev/pci/pci_host_generic.c | 45 +++++++++++++++++++++++-------------------
 sys/dev/pci/pci_host_generic.h |  2 ++
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/sys/dev/pci/pci_host_generic.c b/sys/dev/pci/pci_host_generic.c
index 986318548eab..ca74b0c650c3 100644
--- a/sys/dev/pci/pci_host_generic.c
+++ b/sys/dev/pci/pci_host_generic.c
@@ -106,27 +106,30 @@ pci_host_generic_core_attach(device_t dev)
        if (error != 0)
                return (error);
 
-       rid = 0;
-       sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
-           PCI_RF_FLAGS | RF_ACTIVE);
-       if (sc->res == NULL) {
-               device_printf(dev, "could not allocate memory.\n");
-               error = ENXIO;
-               goto err_resource;
-       }
+       if ((sc->quirks & PCIE_CUSTOM_CONFIG_SPACE_QUIRK) == 0) {
+               rid = 0;
+               sc->res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+                   PCI_RF_FLAGS | RF_ACTIVE);
+               if (sc->res == NULL) {
+                       device_printf(dev, "could not allocate memory.\n");
+                       error = ENXIO;
+                       goto err_resource;
+               }
 #ifdef PCI_UNMAPPED
-       resource_init_map_request(&req);
-       req.memattr = VM_MEMATTR_DEVICE_NP;
-       error = bus_map_resource(dev, SYS_RES_MEMORY, sc->res, &req, &map);
-       if (error != 0) {
-               device_printf(dev, "could not map memory.\n");
-               return (error);
-       }
-       rman_set_mapping(sc->res, &map);
+               resource_init_map_request(&req);
+               req.memattr = VM_MEMATTR_DEVICE_NP;
+               error = bus_map_resource(dev, SYS_RES_MEMORY, sc->res, &req,
+                   &map);
+               if (error != 0) {
+                       device_printf(dev, "could not map memory.\n");
+                       return (error);
+               }
+               rman_set_mapping(sc->res, &map);
 #endif
 
-       sc->bst = rman_get_bustag(sc->res);
-       sc->bsh = rman_get_bushandle(sc->res);
+               sc->bst = rman_get_bustag(sc->res);
+               sc->bsh = rman_get_bushandle(sc->res);
+       }
 
        sc->has_pmem = false;
        sc->pmem_rman.rm_type = RMAN_ARRAY;
@@ -196,7 +199,8 @@ err_io_rman:
 err_mem_rman:
        rman_fini(&sc->pmem_rman);
 err_pmem_rman:
-       bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
+       if (sc->res != NULL)
+               bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
 err_resource:
        bus_dma_tag_destroy(sc->dmat);
        return (error);
@@ -217,7 +221,8 @@ pci_host_generic_core_detach(device_t dev)
        rman_fini(&sc->io_rman);
        rman_fini(&sc->mem_rman);
        rman_fini(&sc->pmem_rman);
-       bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
+       if (sc->res != NULL)
+               bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->res);
        bus_dma_tag_destroy(sc->dmat);
 
        return (0);
diff --git a/sys/dev/pci/pci_host_generic.h b/sys/dev/pci/pci_host_generic.h
index 80da4f523165..b3242c8bdaf5 100644
--- a/sys/dev/pci/pci_host_generic.h
+++ b/sys/dev/pci/pci_host_generic.h
@@ -90,6 +90,8 @@ struct generic_pcie_core_softc {
 
 /* Quirks */
 #define PCIE_ECAM_DESIGNWARE_QUIRK     (1 << 0)
+/* Child will map resources to access config registers */
+#define PCIE_CUSTOM_CONFIG_SPACE_QUIRK (1 << 1)
 
 DECLARE_CLASS(generic_pcie_core_driver);
 

Reply via email to