Module Name:    src
Committed By:   jmcneill
Date:           Mon Sep  6 14:03:18 UTC 2021

Modified Files:
        src/sys/arch/arm/apple: apple_dart.c apple_intc.c apple_pcie.c
            apple_wdog.c
        src/sys/arch/arm/fdt: pcihost_fdt.c pcihost_fdtvar.h
        src/sys/arch/arm/rockchip: rk3399_pcie.c
        src/sys/arch/evbarm/conf: files.fdt
        src/sys/arch/mips/cavium: mainbus.c
        src/sys/dev/fdt: fdtbus.c fdtvar.h
Added Files:
        src/sys/arch/evbarm/fdt: fdt_bus_machdep.c

Log Message:
Instead of requiring drivers to be explicit about their device memory
mapping requirements, move this decision into the fdt layer. This
introduces a new MD function, fdtbus_bus_tag_create, which is responsible
for returning per-node bus_space handles.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/apple/apple_dart.c \
    src/sys/arch/arm/apple/apple_pcie.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/apple/apple_intc.c \
    src/sys/arch/arm/apple/apple_wdog.c
cvs rdiff -u -r1.26 -r1.27 src/sys/arch/arm/fdt/pcihost_fdt.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/fdt/pcihost_fdtvar.h
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/rockchip/rk3399_pcie.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/conf/files.fdt
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/fdt/fdt_bus_machdep.c
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/mips/cavium/mainbus.c
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/fdt/fdtbus.c
cvs rdiff -u -r1.71 -r1.72 src/sys/dev/fdt/fdtvar.h

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/apple/apple_dart.c
diff -u src/sys/arch/arm/apple/apple_dart.c:1.2 src/sys/arch/arm/apple/apple_dart.c:1.3
--- src/sys/arch/arm/apple/apple_dart.c:1.2	Sat Sep  4 12:35:31 2021
+++ src/sys/arch/arm/apple/apple_dart.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: apple_dart.c,v 1.2 2021/09/04 12:35:31 jmcneill Exp $ */
+/* $NetBSD: apple_dart.c,v 1.3 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 Mark Kettenis <kette...@openbsd.org>
@@ -20,7 +20,7 @@
 //#define APPLE_DART_DEBUG
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_dart.c,v 1.2 2021/09/04 12:35:31 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_dart.c,v 1.3 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -482,8 +482,7 @@ apple_dart_attach(device_t parent, devic
 	sc->sc_phandle = phandle;
 	sc->sc_dmat = faa->faa_dmat;
 	sc->sc_bst = faa->faa_bst;
-	if (bus_space_map(sc->sc_bst, addr, size,
-	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &sc->sc_bsh) != 0) {
+	if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
 		aprint_error(": couldn't map registers\n");
 		return;
 	}
Index: src/sys/arch/arm/apple/apple_pcie.c
diff -u src/sys/arch/arm/apple/apple_pcie.c:1.2 src/sys/arch/arm/apple/apple_pcie.c:1.3
--- src/sys/arch/arm/apple/apple_pcie.c:1.2	Sat Sep  4 12:35:31 2021
+++ src/sys/arch/arm/apple/apple_pcie.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: apple_pcie.c,v 1.2 2021/09/04 12:35:31 jmcneill Exp $ */
+/* $NetBSD: apple_pcie.c,v 1.3 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_pcie.c,v 1.2 2021/09/04 12:35:31 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_pcie.c,v 1.3 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -106,9 +106,13 @@ apple_pcie_attach(device_t parent, devic
 	sc->sc_dev = self;
 	sc->sc_dmat = faa->faa_dmat;
 	sc->sc_bst = faa->faa_bst;
+	/*
+	 * Create a new bus tag for PCIe devices that does not inherit the
+	 * nonposted MMIO flag from the host controller.
+	 */
+	sc->sc_pci_bst = fdtbus_bus_tag_create(phandle, 0);
 	sc->sc_phandle = phandle;
-	error = bus_space_map(sc->sc_bst, cs_addr, cs_size,
-	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &sc->sc_bsh);
+	error = bus_space_map(faa->faa_bst, cs_addr, cs_size, 0, &sc->sc_bsh);
 	if (error) {
 		aprint_error(": couldn't map registers: %d\n", error);
 		return;
@@ -146,8 +150,7 @@ apple_pcie_setup_port(struct apple_pcie_
 		aprint_error(": couldn't get %s regs\n", regname);
 		return;
 	}
-	error = bus_space_map(bst, addr, size,
-	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &bsh);
+	error = bus_space_map(bst, addr, size, 0, &bsh);
 	if (error != 0) {
 		aprint_error(": couldn't map %s regs\n", regname);
 		return;

Index: src/sys/arch/arm/apple/apple_intc.c
diff -u src/sys/arch/arm/apple/apple_intc.c:1.1 src/sys/arch/arm/apple/apple_intc.c:1.2
--- src/sys/arch/arm/apple/apple_intc.c:1.1	Mon Aug 30 23:26:26 2021
+++ src/sys/arch/arm/apple/apple_intc.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: apple_intc.c,v 1.1 2021/08/30 23:26:26 jmcneill Exp $ */
+/* $NetBSD: apple_intc.c,v 1.2 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca>
@@ -31,7 +31,7 @@
 #define	_INTR_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_intc.c,v 1.1 2021/08/30 23:26:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_intc.c,v 1.2 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -465,8 +465,7 @@ apple_intc_attach(device_t parent, devic
 
 	sc->sc_dev = self;
 	sc->sc_bst = faa->faa_bst;
-	if (bus_space_map(sc->sc_bst, addr, size,
-	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &sc->sc_bsh) != 0) {
+	if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
 		aprint_error(": couldn't map registers\n");
 		return;
 	}
Index: src/sys/arch/arm/apple/apple_wdog.c
diff -u src/sys/arch/arm/apple/apple_wdog.c:1.1 src/sys/arch/arm/apple/apple_wdog.c:1.2
--- src/sys/arch/arm/apple/apple_wdog.c:1.1	Mon Aug 30 23:26:26 2021
+++ src/sys/arch/arm/apple/apple_wdog.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: apple_wdog.c,v 1.1 2021/08/30 23:26:26 jmcneill Exp $ */
+/* $NetBSD: apple_wdog.c,v 1.2 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: apple_wdog.c,v 1.1 2021/08/30 23:26:26 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: apple_wdog.c,v 1.2 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -99,8 +99,7 @@ apple_wdog_attach(device_t parent, devic
 
 	sc->sc_dev = self;
 	sc->sc_bst = faa->faa_bst;
-	if (bus_space_map(sc->sc_bst, addr, size,
-	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &sc->sc_bsh) != 0) {
+	if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
 		aprint_error(": couldn't map registers\n");
 		return;
 	}

Index: src/sys/arch/arm/fdt/pcihost_fdt.c
diff -u src/sys/arch/arm/fdt/pcihost_fdt.c:1.26 src/sys/arch/arm/fdt/pcihost_fdt.c:1.27
--- src/sys/arch/arm/fdt/pcihost_fdt.c:1.26	Sat Aug  7 16:18:43 2021
+++ src/sys/arch/arm/fdt/pcihost_fdt.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pcihost_fdt.c,v 1.26 2021/08/07 16:18:43 thorpej Exp $ */
+/* $NetBSD: pcihost_fdt.c,v 1.27 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcihost_fdt.c,v 1.26 2021/08/07 16:18:43 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcihost_fdt.c,v 1.27 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 
@@ -126,6 +126,7 @@ pcihost_attach(device_t parent, device_t
 	sc->sc_dev = self;
 	sc->sc_dmat = faa->faa_dmat;
 	sc->sc_bst = faa->faa_bst;
+	sc->sc_pci_bst = faa->faa_bst;
 	sc->sc_phandle = faa->faa_phandle;
 	error = bus_space_map(sc->sc_bst, cs_addr, cs_size,
 	    _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED, &sc->sc_bsh);
@@ -230,14 +231,14 @@ pcihost_config(struct pcihost_softc *sc)
 	bool swap;
 
 	struct pcih_bus_space * const pibs = &sc->sc_io;
-	pibs->bst = *sc->sc_bst;
+	pibs->bst = *sc->sc_pci_bst;
 	pibs->bst.bs_cookie = pibs;
 	pibs->map = pibs->bst.bs_map;
 	pibs->flags = PCI_FLAGS_IO_OKAY;
 	pibs->bst.bs_map = pcihost_bus_space_map;
 
 	struct pcih_bus_space * const pmbs = &sc->sc_mem;
-	pmbs->bst = *sc->sc_bst;
+	pmbs->bst = *sc->sc_pci_bst;
 	pmbs->bst.bs_cookie = pmbs;
 	pmbs->map = pmbs->bst.bs_map;
 	pmbs->flags = PCI_FLAGS_MEM_OKAY;

Index: src/sys/arch/arm/fdt/pcihost_fdtvar.h
diff -u src/sys/arch/arm/fdt/pcihost_fdtvar.h:1.3 src/sys/arch/arm/fdt/pcihost_fdtvar.h:1.4
--- src/sys/arch/arm/fdt/pcihost_fdtvar.h:1.3	Sat Dec 28 17:19:43 2019
+++ src/sys/arch/arm/fdt/pcihost_fdtvar.h	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: pcihost_fdtvar.h,v 1.3 2019/12/28 17:19:43 jmcneill Exp $ */
+/* $NetBSD: pcihost_fdtvar.h,v 1.4 2021/09/06 14:03:17 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 Jared D. McNeill <jmcne...@invisible.ca>
@@ -67,6 +67,7 @@ struct pcihost_softc {
 	bus_dma_tag_t		sc_dmat;
 	bus_space_tag_t		sc_bst;
 	bus_space_handle_t	sc_bsh;
+	bus_space_tag_t		sc_pci_bst;
 	int			sc_phandle;
 
 	enum pcihost_type	sc_type;

Index: src/sys/arch/arm/rockchip/rk3399_pcie.c
diff -u src/sys/arch/arm/rockchip/rk3399_pcie.c:1.16 src/sys/arch/arm/rockchip/rk3399_pcie.c:1.17
--- src/sys/arch/arm/rockchip/rk3399_pcie.c:1.16	Fri Sep  3 01:21:48 2021
+++ src/sys/arch/arm/rockchip/rk3399_pcie.c	Mon Sep  6 14:03:17 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rk3399_pcie.c,v 1.16 2021/09/03 01:21:48 mrg Exp $ */
+/* $NetBSD: rk3399_pcie.c,v 1.17 2021/09/06 14:03:17 jmcneill Exp $ */
 /*
  * Copyright (c) 2018 Mark Kettenis <kette...@openbsd.org>
  *
@@ -17,7 +17,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: rk3399_pcie.c,v 1.16 2021/09/03 01:21:48 mrg Exp $");
+__KERNEL_RCSID(1, "$NetBSD: rk3399_pcie.c,v 1.17 2021/09/06 14:03:17 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -215,11 +215,12 @@ rkpcie_attach(device_t parent, device_t 
 
 	phsc->sc_dev = self;
 	phsc->sc_bst = faa->faa_bst;
+	phsc->sc_pci_bst = faa->faa_bst;
 	phsc->sc_dmat = faa->faa_dmat;
 	sc->sc_iot = phsc->sc_bst;
 	phsc->sc_phandle = faa->faa_phandle;
 	const int phandle = phsc->sc_phandle;
-	
+
 	if (fdtbus_get_reg_byname(faa->faa_phandle, "axi-base", &sc->sc_axi_addr, &sc->sc_axi_size) != 0) {
 		aprint_error(": couldn't get axi registers\n");
 		return;

Index: src/sys/arch/evbarm/conf/files.fdt
diff -u src/sys/arch/evbarm/conf/files.fdt:1.8 src/sys/arch/evbarm/conf/files.fdt:1.9
--- src/sys/arch/evbarm/conf/files.fdt:1.8	Wed May 12 23:22:32 2021
+++ src/sys/arch/evbarm/conf/files.fdt	Mon Sep  6 14:03:17 2021
@@ -1,8 +1,9 @@
-#	$NetBSD: files.fdt,v 1.8 2021/05/12 23:22:32 thorpej Exp $
+#	$NetBSD: files.fdt,v 1.9 2021/09/06 14:03:17 jmcneill Exp $
 #
 # FDT-based kernel configuration info
 #
 
+file	arch/evbarm/fdt/fdt_bus_machdep.c	fdt
 file	arch/evbarm/fdt/fdt_dma_machdep.c	fdt
 file	arch/evbarm/fdt/fdt_machdep.c		fdt
 file	dev/ofw/ofw_pci_subr.c			fdt & pci

Index: src/sys/arch/mips/cavium/mainbus.c
diff -u src/sys/arch/mips/cavium/mainbus.c:1.9 src/sys/arch/mips/cavium/mainbus.c:1.10
--- src/sys/arch/mips/cavium/mainbus.c:1.9	Sat Aug  7 16:18:59 2021
+++ src/sys/arch/mips/cavium/mainbus.c	Mon Sep  6 14:03:18 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: mainbus.c,v 1.9 2021/08/07 16:18:59 thorpej Exp $	*/
+/*	$NetBSD: mainbus.c,v 1.10 2021/09/06 14:03:18 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2007
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.9 2021/08/07 16:18:59 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.10 2021/09/06 14:03:18 jmcneill Exp $");
 
 #define	_MIPS_BUS_DMA_PRIVATE
 
@@ -186,3 +186,9 @@ mainbus_print(void *aux, const char *pnp
 #define	CHIP_W1_SYS_END(v)	0xffffffffffffffffULL
 
 #include <mips/mips/bus_space_alignstride_chipdep.c>
+
+bus_space_tag_t
+fdtbus_bus_tag_create(int phandle, uint32_t flags)
+{
+	return &simplebus_bus_tag;
+}

Index: src/sys/dev/fdt/fdtbus.c
diff -u src/sys/dev/fdt/fdtbus.c:1.42 src/sys/dev/fdt/fdtbus.c:1.43
--- src/sys/dev/fdt/fdtbus.c:1.42	Sat Aug  7 16:19:10 2021
+++ src/sys/dev/fdt/fdtbus.c	Mon Sep  6 14:03:18 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtbus.c,v 1.42 2021/08/07 16:19:10 thorpej Exp $ */
+/* $NetBSD: fdtbus.c,v 1.43 2021/09/06 14:03:18 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.42 2021/08/07 16:19:10 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdtbus.c,v 1.43 2021/09/06 14:03:18 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -206,7 +206,9 @@ fdt_init_attach_args(const struct fdt_at
 	faa->faa_phandle = node->n_phandle;
 	faa->faa_name = node->n_name;
 	faa->faa_quiet = quiet;
-	faa->faa_dmat = node->n_faa.faa_dmat;
+	faa->faa_bst = node->n_faa.faa_bst;
+	faa->faa_dmat = fdtbus_iommu_map(node->n_phandle, 0,
+	   node->n_faa.faa_dmat);
 }
 
 static bool
@@ -295,6 +297,34 @@ fdt_get_dma_tag(struct fdt_node *node)
 	return fdtbus_dma_tag_create(node->n_phandle, ranges, nranges);
 }
 
+static uint32_t
+fdt_bus_flags(int phandle, uint32_t *flags)
+{
+	if (of_hasprop(phandle, "nonposted-mmio")) {
+		*flags |= FDT_BUS_SPACE_FLAG_NONPOSTED_MMIO;
+		return 1;
+	}
+
+	return 0;
+}
+
+static bus_space_tag_t
+fdt_get_bus_tag(struct fdt_node *node)
+{
+	uint32_t flags = 0;
+	int parent;
+
+	parent = OF_parent(node->n_phandle);
+	while (parent != -1) {
+		if (fdt_bus_flags(parent, &flags) != 0) {
+			break;
+		}
+		parent = OF_parent(parent);
+	}
+
+	return fdtbus_bus_tag_create(node->n_phandle, flags);
+}
+
 void
 fdt_add_child(device_t bus, const int child, struct fdt_attach_args *faa,
     u_int order)
@@ -313,6 +343,7 @@ fdt_add_child(device_t bus, const int ch
 	node->n_faa = *faa;
 	node->n_faa.faa_phandle = child;
 	node->n_faa.faa_name = node->n_name;
+	node->n_faa.faa_bst = fdt_get_bus_tag(node);
 	node->n_faa.faa_dmat = fdt_get_dma_tag(node);
 
 	fdt_add_node(node);

Index: src/sys/dev/fdt/fdtvar.h
diff -u src/sys/dev/fdt/fdtvar.h:1.71 src/sys/dev/fdt/fdtvar.h:1.72
--- src/sys/dev/fdt/fdtvar.h:1.71	Sat Sep  4 12:34:39 2021
+++ src/sys/dev/fdt/fdtvar.h	Mon Sep  6 14:03:18 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: fdtvar.h,v 1.71 2021/09/04 12:34:39 jmcneill Exp $ */
+/* $NetBSD: fdtvar.h,v 1.72 2021/09/06 14:03:18 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca>
@@ -275,6 +275,8 @@ struct fdt_dma_range {
 	bus_size_t	dr_len;
 };
 
+#define	FDT_BUS_SPACE_FLAG_NONPOSTED_MMIO	__BIT(0)
+
 int		fdtbus_register_interrupt_controller(device_t, int,
 		    const struct fdtbus_interrupt_controller_func *);
 int		fdtbus_register_i2c_controller(i2c_tag_t, int);
@@ -447,5 +449,6 @@ int		fdtbus_print(void *, const char *);
 
 bus_dma_tag_t	fdtbus_dma_tag_create(int, const struct fdt_dma_range *,
 		    u_int);
+bus_space_tag_t	fdtbus_bus_tag_create(int, uint32_t);
 
 #endif /* _DEV_FDT_FDTVAR_H_ */

Added files:

Index: src/sys/arch/evbarm/fdt/fdt_bus_machdep.c
diff -u /dev/null src/sys/arch/evbarm/fdt/fdt_bus_machdep.c:1.1
--- /dev/null	Mon Sep  6 14:03:18 2021
+++ src/sys/arch/evbarm/fdt/fdt_bus_machdep.c	Mon Sep  6 14:03:18 2021
@@ -0,0 +1,68 @@
+/* $NetBSD: fdt_bus_machdep.c,v 1.1 2021/09/06 14:03:18 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2021 Jared McNeill <jmcne...@invisible.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: fdt_bus_machdep.c,v 1.1 2021/09/06 14:03:18 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/kmem.h>
+
+#include <dev/fdt/fdtvar.h>
+#include <arm/fdt/arm_fdtvar.h>
+
+extern struct bus_space arm_generic_bs_tag;
+
+static int
+nonposted_mmio_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flag,
+    bus_space_handle_t *bshp)
+{
+	if (flag == 0) {
+		flag |= _ARM_BUS_SPACE_MAP_STRONGLY_ORDERED;
+	}
+
+	return bus_space_map(&arm_generic_bs_tag, bpa, size, flag, bshp);
+}
+
+bus_space_tag_t
+fdtbus_bus_tag_create(int phandle, uint32_t flags)
+{
+	const struct arm_platform *plat = arm_fdt_platform();
+	struct bus_space *tagp;
+	struct fdt_attach_args faa;
+
+	plat->ap_init_attach_args(&faa);
+
+	tagp = kmem_alloc(sizeof(*tagp), KM_SLEEP);
+	*tagp = *faa.faa_bst;
+	if ((flags & FDT_BUS_SPACE_FLAG_NONPOSTED_MMIO) != 0) {
+		tagp->bs_map = nonposted_mmio_bs_map;
+	}
+
+	return tagp;
+}

Reply via email to