From 7029f2c887a16c823faf08e8a79dc0d3887989ab Mon Sep 17 00:00:00 2001 From: Andrew Turner Date: Sat, 4 Jun 2022 11:59:46 +0100 Subject: [PATCH] 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 @@ pci_host_generic_core_attach(device_t dev) 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);