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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
*
@@ -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 <[email protected]>
@@ -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 <[email protected]>
@@ -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 <[email protected]>
+ * 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;
+}