Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Dec 2015 18:07:32 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292555 - in head/sys: arm/arm arm/include conf dev/ofw powerpc/include powerpc/ofw
Message-ID:  <201512211807.tBLI7WtW045808@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Mon Dec 21 18:07:32 2015
New Revision: 292555
URL: https://svnweb.freebsd.org/changeset/base/292555

Log:
  Implement OF_decode_addr() for arm.  Move most of powerpc's implementation
  into a new function that other platforms can share.
  
  This creates a new ofw_reg_to_paddr() function (in a new ofw_subr.c file)
  that contains most of the existing ppc implementation, mostly unchanged.
  The ppc code now calls the new MI code from the MD code, then creates a
  ppc-specific bus_space mapping from the results. The new arm implementation
  does the same in an arm-specific way.
  
  This also moves the declaration of OF_decode_addr() from ofw_machdep.h to
  openfirm.h, except on sparc64 which uses a different function signature.
  
  This will help all FDT platforms to set up early console access using
  OF_decode_addr().

Added:
  head/sys/arm/arm/ofw_machdep.c   (contents, props changed)
  head/sys/dev/ofw/ofw_subr.c   (contents, props changed)
  head/sys/dev/ofw/ofw_subr.h   (contents, props changed)
Modified:
  head/sys/arm/include/ofw_machdep.h
  head/sys/conf/files
  head/sys/conf/files.arm
  head/sys/conf/files.powerpc
  head/sys/dev/ofw/openfirm.h
  head/sys/powerpc/include/ofw_machdep.h
  head/sys/powerpc/ofw/ofw_machdep.c

Added: head/sys/arm/arm/ofw_machdep.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/arm/arm/ofw_machdep.c	Mon Dec 21 18:07:32 2015	(r292555)
@@ -0,0 +1,71 @@
+/*-
+ * Copyright (c) 2015 Ian Lepore <ian@freebsd.org>
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+
+#include <machine/bus.h>
+#include <machine/fdt.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_subr.h>
+
+int
+OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *tag,
+    bus_space_handle_t *handle)
+{
+	bus_addr_t addr;
+	bus_size_t size;
+	pcell_t pci_hi;
+	int flags, res;
+
+	res = ofw_reg_to_paddr(dev, regno, &addr, &size, &pci_hi);
+	if (res < 0)
+		return (res);
+
+	/*
+	 * Nothing special to do for PCI busses right now.
+	 * This may need to be handled per-platform when it does come up.
+	 */
+#ifdef notyet
+	if (pci_hi == OFW_PADDR_NOT_PCI) {
+		*tag = fdtbus_bs_tag;
+		flags = 0;
+	} else {
+		*tag = fdtbus_bs_tag;
+		flags = (pci_hi & OFW_PCI_PHYS_HI_PREFETCHABLE) ? 
+		    BUS_SPACE_MAP_PREFETCHABLE: 0;
+	}
+#else
+	*tag = fdtbus_bs_tag;
+	flags = 0;
+#endif
+	return (bus_space_map(*tag, addr, size, flags, handle));
+}
+

Modified: head/sys/arm/include/ofw_machdep.h
==============================================================================
--- head/sys/arm/include/ofw_machdep.h	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/arm/include/ofw_machdep.h	Mon Dec 21 18:07:32 2015	(r292555)
@@ -32,6 +32,9 @@
 #ifndef _MACHINE_OFW_MACHDEP_H_
 #define _MACHINE_OFW_MACHDEP_H_
 
+#include <sys/types.h>
+#include <sys/bus.h>
+#include <sys/rman.h>
 #include <vm/vm.h>
 
 typedef	uint32_t	cell_t;

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/conf/files	Mon Dec 21 18:07:32 2015	(r292555)
@@ -2094,6 +2094,7 @@ dev/ofw/ofw_bus_subr.c		optional fdt
 dev/ofw/ofw_fdt.c		optional fdt
 dev/ofw/ofw_if.m		optional fdt
 dev/ofw/ofw_iicbus.c		optional fdt iicbus
+dev/ofw/ofw_subr.c		optional fdt
 dev/ofw/ofwbus.c		optional fdt
 dev/ofw/openfirm.c		optional fdt
 dev/ofw/openfirmio.c		optional fdt

Modified: head/sys/conf/files.arm
==============================================================================
--- head/sys/conf/files.arm	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/conf/files.arm	Mon Dec 21 18:07:32 2015	(r292555)
@@ -55,6 +55,7 @@ arm/arm/minidump_machdep.c	optional	mem
 arm/arm/mp_machdep.c		optional	smp
 arm/arm/mpcore_timer.c		optional	mpcore_timer
 arm/arm/nexus.c			standard
+arm/arm/ofw_machdep.c		optional	fdt
 arm/arm/physmem.c		standard
 kern/pic_if.m			optional	arm_intrng
 arm/arm/pl190.c			optional	pl190

Modified: head/sys/conf/files.powerpc
==============================================================================
--- head/sys/conf/files.powerpc	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/conf/files.powerpc	Mon Dec 21 18:07:32 2015	(r292555)
@@ -58,6 +58,7 @@ dev/ofw/ofw_disk.c		optional	ofwd aim
 dev/ofw/ofw_iicbus.c		optional	iicbus aim
 dev/ofw/ofwbus.c		optional	aim | fdt
 dev/ofw/ofw_standard.c		optional	aim powerpc
+dev/ofw/ofw_subr.c		optional	aim powerpc
 dev/powermac_nvram/powermac_nvram.c optional	powermac_nvram powermac
 dev/quicc/quicc_bfe_fdt.c	optional	quicc mpc85xx
 dev/scc/scc_bfe_macio.c		optional	scc powermac

Added: head/sys/dev/ofw/ofw_subr.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/ofw/ofw_subr.c	Mon Dec 21 18:07:32 2015	(r292555)
@@ -0,0 +1,177 @@
+/*-
+ * Copyright (c) 2015 Ian Lepore <ian@freebsd.org>
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * The initial ofw_reg_to_paddr() implementation has been copied from powerpc
+ * ofw_machdep.c OF_decode_addr(). It was added by Marcel Moolenaar, who did not
+ * assert copyright with the addition but still deserves credit for the work.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/libkern.h>
+
+#include <machine/bus.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_pci.h>
+#include <dev/ofw/ofw_subr.h>
+
+static void
+get_addr_props(phandle_t node, uint32_t *addrp, uint32_t *sizep, int *pcip)
+{
+	char type[64];
+	uint32_t addr, size;
+	int pci, res;
+
+	res = OF_getencprop(node, "#address-cells", &addr, sizeof(addr));
+	if (res == -1)
+		addr = 2;
+	res = OF_getencprop(node, "#size-cells", &size, sizeof(size));
+	if (res == -1)
+		size = 1;
+	pci = 0;
+	if (addr == 3 && size == 2) {
+		res = OF_getprop(node, "device_type", type, sizeof(type));
+		if (res != -1) {
+			type[sizeof(type) - 1] = '\0';
+			pci = (strcmp(type, "pci") == 0) ? 1 : 0;
+		}
+	}
+	if (addrp != NULL)
+		*addrp = addr;
+	if (sizep != NULL)
+		*sizep = size;
+	if (pcip != NULL)
+		*pcip = pci;
+}
+
+int
+ofw_reg_to_paddr(phandle_t dev, int regno, bus_addr_t *paddr,
+    bus_size_t *psize, pcell_t *ppci_hi)
+{
+	pcell_t cell[32], pci_hi;
+	bus_addr_t addr, raddr, baddr;
+	bus_size_t size, rsize;
+	uint32_t c, nbridge, naddr, nsize;
+	phandle_t bridge, parent;
+	u_int spc, rspc;
+	int pci, pcib, res;
+
+	/* Sanity checking. */
+	if (dev == 0)
+		return (EINVAL);
+	bridge = OF_parent(dev);
+	if (bridge == 0)
+		return (EINVAL);
+	if (regno < 0)
+		return (EINVAL);
+	if (paddr == NULL || psize == NULL)
+		return (EINVAL);
+
+	get_addr_props(bridge, &naddr, &nsize, &pci);
+	res = OF_getencprop(dev, (pci) ? "assigned-addresses" : "reg",
+	    cell, sizeof(cell));
+	if (res == -1)
+		return (ENXIO);
+	if (res % sizeof(cell[0]))
+		return (ENXIO);
+	res /= sizeof(cell[0]);
+	regno *= naddr + nsize;
+	if (regno + naddr + nsize > res)
+		return (EINVAL);
+	pci_hi = pci ? cell[regno] : OFW_PADDR_NOT_PCI;
+	spc = pci_hi & OFW_PCI_PHYS_HI_SPACEMASK;
+	addr = 0;
+	for (c = 0; c < naddr; c++)
+		addr = ((uint64_t)addr << 32) | cell[regno++];
+	size = 0;
+	for (c = 0; c < nsize; c++)
+		size = ((uint64_t)size << 32) | cell[regno++];
+	/*
+	 * Map the address range in the bridge's decoding window as given
+	 * by the "ranges" property. If a node doesn't have such property
+	 * or the property is empty, we assume an identity mapping.  The
+	 * standard says a missing property indicates no possible mapping.
+	 * This code is more liberal since the intended use is to get a
+	 * console running early, and a printf to warn of malformed data
+	 * is probably futile before the console is fully set up.
+	 */
+	parent = OF_parent(bridge);
+	while (parent != 0) {
+		get_addr_props(parent, &nbridge, NULL, &pcib);
+		res = OF_getencprop(bridge, "ranges", cell, sizeof(cell));
+		if (res < 1)
+			goto next;
+		if (res % sizeof(cell[0]))
+			return (ENXIO);
+		/* Capture pci_hi if we just transitioned onto a PCI bus. */
+		if (pcib && pci_hi == OFW_PADDR_NOT_PCI) {
+			pci_hi = cell[0];
+			spc = pci_hi & OFW_PCI_PHYS_HI_SPACEMASK;
+		}
+		res /= sizeof(cell[0]);
+		regno = 0;
+		while (regno < res) {
+			rspc = (pci)
+			    ? cell[regno] & OFW_PCI_PHYS_HI_SPACEMASK
+			    : OFW_PADDR_NOT_PCI;
+			if (rspc != spc) {
+				regno += naddr + nbridge + nsize;
+				continue;
+			}
+			raddr = 0;
+			for (c = 0; c < naddr; c++)
+				raddr = ((uint64_t)raddr << 32) | cell[regno++];
+			rspc = (pcib)
+			    ? cell[regno] & OFW_PCI_PHYS_HI_SPACEMASK
+			    : OFW_PADDR_NOT_PCI;
+			baddr = 0;
+			for (c = 0; c < nbridge; c++)
+				baddr = ((uint64_t)baddr << 32) | cell[regno++];
+			rsize = 0;
+			for (c = 0; c < nsize; c++)
+				rsize = ((uint64_t)rsize << 32) | cell[regno++];
+			if (addr < raddr || addr >= raddr + rsize)
+				continue;
+			addr = addr - raddr + baddr;
+			if (rspc != OFW_PADDR_NOT_PCI)
+				spc = rspc;
+		}
+	next:
+		bridge = parent;
+		parent = OF_parent(bridge);
+		get_addr_props(bridge, &naddr, &nsize, &pci);
+	}
+
+	*paddr = addr;
+	*psize = size;
+	if (ppci_hi != NULL)
+		*ppci_hi = pci_hi;
+
+	return (0);
+}

Added: head/sys/dev/ofw/ofw_subr.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/dev/ofw/ofw_subr.h	Mon Dec 21 18:07:32 2015	(r292555)
@@ -0,0 +1,49 @@
+/*-
+ * Copyright (c) 2015 Ian Lepore <ian@freebsd.org>
+ * 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	_DEV_OFW_OFW_SUBR_H_
+#define	_DEV_OFW_OFW_SUBR_H_
+
+/*
+ * Translate an address from the Nth tuple of a device node's reg properties to
+ * a physical memory address, by applying the range mappings from all ancestors.
+ * This assumes that all ancestor ranges are simple numerical offsets for which
+ * addition and subtraction operations will perform the required mapping (the
+ * bit-options in the high word of standard PCI properties are also handled).
+ * After the call, *pci_hi (if non-NULL) contains the phys.hi cell of the
+ * device's parent PCI bus, or OFW_PADDR_NOT_PCI if no PCI bus is involved.
+ *
+ * This is intended to be a helper function called by the platform-specific
+ * implementation of OF_decode_addr(), and not for direct use by device drivers.
+ */
+#define	OFW_PADDR_NOT_PCI	(~0)
+
+int ofw_reg_to_paddr(phandle_t _dev, int _regno, bus_addr_t *_paddr,
+    bus_size_t *_size, pcell_t *_pci_hi);
+
+#endif

Modified: head/sys/dev/ofw/openfirm.h
==============================================================================
--- head/sys/dev/ofw/openfirm.h	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/dev/ofw/openfirm.h	Mon Dec 21 18:07:32 2015	(r292555)
@@ -167,5 +167,16 @@ void		OF_exit(void) __attribute__((noret
 /* User interface functions */
 int		OF_interpret(const char *cmd, int nreturns, ...);
 
+/*
+ * Decode the Nth register property of the given device node and create a bus
+ * space tag and handle for accessing it.  This is for use in setting up things
+ * like early console output before newbus is available.  The implementation is
+ * machine-dependent, and sparc uses a different function signature as well.
+ */
+#ifndef __sparc64__
+int		OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *ptag,
+		    bus_space_handle_t *phandle);
+#endif
+
 #endif /* _KERNEL */
 #endif /* _DEV_OPENFIRM_H_ */

Modified: head/sys/powerpc/include/ofw_machdep.h
==============================================================================
--- head/sys/powerpc/include/ofw_machdep.h	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/powerpc/include/ofw_machdep.h	Mon Dec 21 18:07:32 2015	(r292555)
@@ -37,7 +37,6 @@
 
 typedef	uint32_t	cell_t;
 
-int  OF_decode_addr(phandle_t, int, bus_space_tag_t *, bus_space_handle_t *);
 void OF_getetheraddr(device_t dev, u_char *addr);
 
 void OF_initial_setup(void *fdt_ptr, void *junk, int (*openfirm)(void *));

Modified: head/sys/powerpc/ofw/ofw_machdep.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_machdep.c	Mon Dec 21 17:54:23 2015	(r292554)
+++ head/sys/powerpc/ofw/ofw_machdep.c	Mon Dec 21 18:07:32 2015	(r292555)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_pci.h>
 #include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_subr.h>
 
 #include <vm/vm.h>
 #include <vm/vm_param.h>
@@ -565,135 +566,28 @@ OF_getetheraddr(device_t dev, u_char *ad
  * register in the address space of its parent and recursively walk
  * the device tree upward this way.
  */
-static void
-OF_get_addr_props(phandle_t node, uint32_t *addrp, uint32_t *sizep, int *pcip)
-{
-	char type[64];
-	uint32_t addr, size;
-	int pci, res;
-
-	res = OF_getencprop(node, "#address-cells", &addr, sizeof(addr));
-	if (res == -1)
-		addr = 2;
-	res = OF_getencprop(node, "#size-cells", &size, sizeof(size));
-	if (res == -1)
-		size = 1;
-	pci = 0;
-	if (addr == 3 && size == 2) {
-		res = OF_getprop(node, "device_type", type, sizeof(type));
-		if (res != -1) {
-			type[sizeof(type) - 1] = '\0';
-			pci = (strcmp(type, "pci") == 0) ? 1 : 0;
-		}
-	}
-	if (addrp != NULL)
-		*addrp = addr;
-	if (sizep != NULL)
-		*sizep = size;
-	if (pcip != NULL)
-		*pcip = pci;
-}
-
 int
 OF_decode_addr(phandle_t dev, int regno, bus_space_tag_t *tag,
     bus_space_handle_t *handle)
 {
-	uint32_t cell[32];
-	bus_addr_t addr, raddr, baddr;
-	bus_size_t size, rsize;
-	uint32_t c, nbridge, naddr, nsize;
-	phandle_t bridge, parent;
-	u_int spc, rspc, prefetch;
-	int pci, pcib, res;
-
-	/* Sanity checking. */
-	if (dev == 0)
-		return (EINVAL);
-	bridge = OF_parent(dev);
-	if (bridge == 0)
-		return (EINVAL);
-	if (regno < 0)
-		return (EINVAL);
-	if (tag == NULL || handle == NULL)
-		return (EINVAL);
-
-	/* Assume big-endian unless we find a PCI device */
-	*tag = &bs_be_tag;
-
-	/* Get the requested register. */
-	OF_get_addr_props(bridge, &naddr, &nsize, &pci);
-	if (pci)
+	bus_addr_t addr;
+	bus_size_t size;
+	pcell_t pci_hi;
+	int flags, res;
+
+	res = ofw_reg_to_paddr(dev, regno, &addr, &size, &pci_hi);
+	if (res < 0)
+		return (res);
+
+	if (pci_hi == OFW_PADDR_NOT_PCI) {
+		*tag = &bs_be_tag;
+		flags = 0;
+	} else {
 		*tag = &bs_le_tag;
-	res = OF_getencprop(dev, (pci) ? "assigned-addresses" : "reg",
-	    cell, sizeof(cell));
-	if (res == -1)
-		return (ENXIO);
-	if (res % sizeof(cell[0]))
-		return (ENXIO);
-	res /= sizeof(cell[0]);
-	regno *= naddr + nsize;
-	if (regno + naddr + nsize > res)
-		return (EINVAL);
-	spc = (pci) ? cell[regno] & OFW_PCI_PHYS_HI_SPACEMASK : ~0;
-	prefetch = (pci) ? cell[regno] & OFW_PCI_PHYS_HI_PREFETCHABLE : 0;
-	addr = 0;
-	for (c = 0; c < naddr; c++)
-		addr = ((uint64_t)addr << 32) | cell[regno++];
-	size = 0;
-	for (c = 0; c < nsize; c++)
-		size = ((uint64_t)size << 32) | cell[regno++];
-
-	/*
-	 * Map the address range in the bridge's decoding window as given
-	 * by the "ranges" property. If a node doesn't have such property
-	 * then no mapping is done.
-	 */
-	parent = OF_parent(bridge);
-	while (parent != 0) {
-		OF_get_addr_props(parent, &nbridge, NULL, &pcib);
-		if (pcib)
-			*tag = &bs_le_tag;
-		res = OF_getencprop(bridge, "ranges", cell, sizeof(cell));
-		if (res == -1)
-			goto next;
-		if (res % sizeof(cell[0]))
-			return (ENXIO);
-		res /= sizeof(cell[0]);
-		regno = 0;
-		while (regno < res) {
-			rspc = (pci)
-			    ? cell[regno] & OFW_PCI_PHYS_HI_SPACEMASK
-			    : ~0;
-			if (rspc != spc) {
-				regno += naddr + nbridge + nsize;
-				continue;
-			}
-			raddr = 0;
-			for (c = 0; c < naddr; c++)
-				raddr = ((uint64_t)raddr << 32) | cell[regno++];
-			rspc = (pcib)
-			    ? cell[regno] & OFW_PCI_PHYS_HI_SPACEMASK
-			    : ~0;
-			baddr = 0;
-			for (c = 0; c < nbridge; c++)
-				baddr = ((uint64_t)baddr << 32) | cell[regno++];
-			rsize = 0;
-			for (c = 0; c < nsize; c++)
-				rsize = ((uint64_t)rsize << 32) | cell[regno++];
-			if (addr < raddr || addr >= raddr + rsize)
-				continue;
-			addr = addr - raddr + baddr;
-			if (rspc != ~0)
-				spc = rspc;
-		}
-
-	next:
-		bridge = parent;
-		parent = OF_parent(bridge);
-		OF_get_addr_props(bridge, &naddr, &nsize, &pci);
+		flags = (pci_hi & OFW_PCI_PHYS_HI_PREFETCHABLE) ? 
+		    BUS_SPACE_MAP_PREFETCHABLE: 0;
 	}
 
-	return (bus_space_map(*tag, addr, size,
-	    prefetch ? BUS_SPACE_MAP_PREFETCHABLE : 0, handle));
+	return (bus_space_map(*tag, addr, size, flags, handle));
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201512211807.tBLI7WtW045808>