Module Name:    src
Committed By:   jmcneill
Date:           Tue Jan 21 11:24:48 UTC 2020

Modified Files:
        src/sys/arch/arm/acpi: acpi_machdep.c acpipchb.c

Log Message:
Provide a properly constrained 32-bit DMA tag to ACPI.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/arm/acpi/acpi_machdep.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/acpi/acpipchb.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/acpi/acpi_machdep.c
diff -u src/sys/arch/arm/acpi/acpi_machdep.c:1.18 src/sys/arch/arm/acpi/acpi_machdep.c:1.19
--- src/sys/arch/arm/acpi/acpi_machdep.c:1.18	Tue Dec 31 17:26:04 2019
+++ src/sys/arch/arm/acpi/acpi_machdep.c	Tue Jan 21 11:24:47 2020
@@ -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_t
 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
 	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, 
 
 	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);

Index: src/sys/arch/arm/acpi/acpipchb.c
diff -u src/sys/arch/arm/acpi/acpipchb.c:1.16 src/sys/arch/arm/acpi/acpipchb.c:1.17
--- src/sys/arch/arm/acpi/acpipchb.c:1.16	Fri Jan 17 17:06:33 2020
+++ src/sys/arch/arm/acpi/acpipchb.c	Tue Jan 21 11:24:47 2020
@@ -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_
 	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_
 	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;

Reply via email to