Re: git: 7029f2c887a1 - main - Allow pci_host_generic attachments to manage registers
Date: Mon, 24 Apr 2023 11:54:16 UTC
> On 24. Apr 2023, at 13:34, Andrew Turner <andrew@FreeBSD.org> wrote:
>
> The branch main has been updated by andrew:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=7029f2c887a16c823faf08e8a79dc0d3887989ab
>
> commit 7029f2c887a16c823faf08e8a79dc0d3887989ab
> Author: Andrew Turner <andrew@FreeBSD.org>
> AuthorDate: 2022-06-04 10:59:46 +0000
> Commit: Andrew Turner <andrew@FreeBSD.org>
> 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
Not sure if it is related to this commit. But trying to run a kernel with
this revision on VM Fusion on an M1 MacBook Pro results in:
Mounting from ufs:/dev/nda0p2 failed with error 19.
A kernel build with
https://cgit.FreeBSD.org/src/commit/?id=390c31c4289e66f1bd9cb2349d6e55fd4dc468f8 <https://cgit.freebsd.org/src/commit/?id=390c31c4289e66f1bd9cb2349d6e55fd4dc468f8>
boots without problems.
Best regards
Michael
> ---
> 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);
>