summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2020-01-21 11:24:47 +0000
committerjmcneill <jmcneill@NetBSD.org>2020-01-21 11:24:47 +0000
commit27ef2e5c8a91aa3a32f880bde9abde1e9893162f (patch)
tree0502323b31aa67967b723595da80649094955144 /sys
parent34958d8a1af6bbc2ece060a9d07dd0609a01d809 (diff)
Provide a properly constrained 32-bit DMA tag to ACPI.
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/arm/acpi/acpi_machdep.c36
-rw-r--r--sys/arch/arm/acpi/acpipchb.c12
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;