diff options
| author | jmcneill <jmcneill@NetBSD.org> | 2020-01-21 11:24:47 +0000 |
|---|---|---|
| committer | jmcneill <jmcneill@NetBSD.org> | 2020-01-21 11:24:47 +0000 |
| commit | 27ef2e5c8a91aa3a32f880bde9abde1e9893162f (patch) | |
| tree | 0502323b31aa67967b723595da80649094955144 /sys | |
| parent | 34958d8a1af6bbc2ece060a9d07dd0609a01d809 (diff) | |
Provide a properly constrained 32-bit DMA tag to ACPI.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/arch/arm/acpi/acpi_machdep.c | 36 | ||||
| -rw-r--r-- | sys/arch/arm/acpi/acpipchb.c | 12 |
2 files changed, 32 insertions, 16 deletions
diff --git a/sys/arch/arm/acpi/acpi_machdep.c b/sys/arch/arm/acpi/acpi_machdep.c index 34b082bf208..3c131769ea0 100644 --- a/sys/arch/arm/acpi/acpi_machdep.c +++ b/sys/arch/arm/acpi/acpi_machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_machdep.c,v 1.18 2019/12/31 17:26:04 jmcneill Exp $ */ +/* $NetBSD: acpi_machdep.c,v 1.19 2020/01/21 11:24:47 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include "pci.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.18 2019/12/31 17:26:04 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_machdep.c,v 1.19 2020/01/21 11:24:47 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -63,7 +63,8 @@ extern struct bus_space arm_generic_bs_tag; extern struct arm32_bus_dma_tag acpi_coherent_dma_tag; extern struct arm32_bus_dma_tag arm_generic_dma_tag; -bus_dma_tag_t arm_acpi_dma_tag(struct acpi_softc *, struct acpi_devnode *); +bus_dma_tag_t arm_acpi_dma32_tag(struct acpi_softc *, struct acpi_devnode *); +bus_dma_tag_t arm_acpi_dma64_tag(struct acpi_softc *, struct acpi_devnode *); static int acpi_md_pmapflags(paddr_t pa) @@ -473,14 +474,34 @@ arm_acpi_dma_flags(struct acpi_softc *sc, struct acpi_devnode *ad) return cca ? _BUS_DMAMAP_COHERENT : 0; } - bus_dma_tag_t -arm_acpi_dma_tag(struct acpi_softc *sc, struct acpi_devnode *ad) +arm_acpi_dma32_tag(struct acpi_softc *sc, struct acpi_devnode *ad) { - struct arm32_bus_dma_tag *dmat; + bus_dma_tag_t dmat64, dmat32; + int error; if (ad->ad_dmat != NULL) return ad->ad_dmat; + + dmat64 = arm_acpi_dma64_tag(sc, ad); + + const uint32_t flags = arm_acpi_dma_flags(sc, ad); + error = bus_dmatag_subregion(dmat64, 0, UINT32_MAX, &dmat32, flags); + if (error != 0) + panic("arm_acpi_dma32_tag: bus_dmatag_subregion returned %d", + error); + + return dmat32; +} +__strong_alias(acpi_get_dma_tag,arm_acpi_dma32_tag); + +bus_dma_tag_t +arm_acpi_dma64_tag(struct acpi_softc *sc, struct acpi_devnode *ad) +{ + struct arm32_bus_dma_tag *dmat; + + if (ad->ad_dmat64 != NULL) + return ad->ad_dmat64; dmat = kmem_alloc(sizeof(*dmat), KM_SLEEP); *dmat = arm_generic_dma_tag; @@ -490,5 +511,4 @@ arm_acpi_dma_tag(struct acpi_softc *sc, struct acpi_devnode *ad) return dmat; } -__strong_alias(acpi_get_dma_tag,arm_acpi_dma_tag); -__strong_alias(acpi_get_dma64_tag,arm_acpi_dma_tag); +__strong_alias(acpi_get_dma64_tag,arm_acpi_dma64_tag); diff --git a/sys/arch/arm/acpi/acpipchb.c b/sys/arch/arm/acpi/acpipchb.c index 09b1127bad9..01ec727bd8b 100644 --- a/sys/arch/arm/acpi/acpipchb.c +++ b/sys/arch/arm/acpi/acpipchb.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpipchb.c,v 1.16 2020/01/17 17:06:33 jmcneill Exp $ */ +/* $NetBSD: acpipchb.c,v 1.17 2020/01/21 11:24:47 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.16 2020/01/17 17:06:33 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpipchb.c,v 1.17 2020/01/21 11:24:47 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -84,8 +84,6 @@ struct acpipchb_softc { bus_space_tag_t sc_memt; - struct arm32_bus_dma_tag sc_dmat; - ACPI_HANDLE sc_handle; ACPI_INTEGER sc_bus; @@ -139,8 +137,6 @@ acpipchb_attach(device_t parent, device_t self, void *aux) aprint_naive("\n"); aprint_normal(": PCI Express Host Bridge\n"); - sc->sc_dmat = *aa->aa_dmat; - if (acpi_pci_ignore_boot_config(sc->sc_handle)) { if (acpimcfg_configure_bus(self, aa->aa_pc, sc->sc_handle, sc->sc_bus, PCIHOST_CACHELINE_SIZE) != 0) aprint_error_dev(self, "failed to configure bus\n"); @@ -150,9 +146,9 @@ acpipchb_attach(device_t parent, device_t self, void *aux) pba.pba_flags = aa->aa_pciflags & ~(PCI_FLAGS_MEM_OKAY | PCI_FLAGS_IO_OKAY); pba.pba_memt = 0; pba.pba_iot = 0; - pba.pba_dmat = &sc->sc_dmat; + pba.pba_dmat = aa->aa_dmat; #ifdef _PCI_HAVE_DMA64 - pba.pba_dmat64 = &sc->sc_dmat; + pba.pba_dmat64 = aa->aa_dmat64; #endif pba.pba_pc = aa->aa_pc; pba.pba_bus = sc->sc_bus; |
