Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Jun 2011 11:10:43 GMT
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 194387 for review
Message-ID:  <201106071110.p57BAhvm055315@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@194387?ac=10

Change 194387 by jceel@jceel_cyclone on 2011/06/07 11:10:17

	Apply FDT fixes.

Affected files ...

.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_common.c#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_common.h#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_pci.c#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_powerpc.c#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_static_dtb.S#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdtbus.c#2 edit
.. //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/simplebus.c#2 edit

Differences ...

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_common.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_common.c,v 1.4 2011/01/29 20:25:20 marcel Exp $");
+__FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -46,6 +46,8 @@
 
 #include "ofw_bus_if.h"
 
+#define	DEBUG
+
 #ifdef DEBUG
 #define debugf(fmt, args...) do { printf("%s(): ", __func__);	\
     printf(fmt,##args); } while (0)
@@ -401,13 +403,14 @@
 }
 
 int
-fdt_reg_to_rl(phandle_t node, struct resource_list *rl, u_long base)
+fdt_reg_to_rl(phandle_t node, struct resource_list *rl, 
+    struct fdt_range *ranges, int ranges_count)
 {
-	u_long start, end, count;
+	u_long start, end, count, parent;
 	pcell_t *reg, *regptr;
 	pcell_t addr_cells, size_cells;
 	int tuple_size, tuples;
-	int i, rv;
+	int i, n, rv;
 
 	if (fdt_addrsize_cells(OF_parent(node), &addr_cells, &size_cells) != 0)
 		return (ENXIO);
@@ -432,8 +435,21 @@
 		reg += addr_cells + size_cells;
 
 		/* Calculate address range relative to base. */
-		start &= 0x000ffffful;
-		start = base + start;
+		parent = 0;
+
+		if (ranges == NULL)
+			goto moveon;
+
+		for (n = 0; n < ranges_count; n++) {
+			if (ranges[n].base <= start && (ranges[n].base + 
+			    ranges[n].size >= start + count - 1)) {
+				parent = ranges[n].parent;
+				break;
+			}
+		}
+moveon:
+
+		start = parent + start;
 		end = start + count - 1;
 
 		debugf("reg addr start = %lx, end = %lx, count = %lx\n", start,

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_common.h#2 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/fdt/fdt_common.h,v 1.2 2010/07/19 18:47:18 raj Exp $
+ * $FreeBSD$
  */
 
 #ifndef _FDT_COMMON_H_
@@ -40,6 +40,12 @@
 
 #define DI_MAX_INTR_NUM	8
 
+struct fdt_range {
+	u_long	base;
+	u_long	parent;
+	u_long	size;
+};
+
 struct fdt_pci_range {
 	u_long	base_pci;
 	u_long	base_parent;
@@ -106,7 +112,7 @@
     struct fdt_pci_range *);
 int fdt_pci_route_intr(int, int, int, int, struct fdt_pci_intr *, int *);
 int fdt_ranges_verify(pcell_t *, int, int, int, int);
-int fdt_reg_to_rl(phandle_t, struct resource_list *, u_long);
+int fdt_reg_to_rl(phandle_t, struct resource_list *, struct fdt_range *, int);
 int fdt_pm(phandle_t);
 
 #endif /* _FDT_COMMON_H_ */

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_pci.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_pci.c,v 1.3 2011/01/29 21:14:29 marcel Exp $");
+__FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_powerpc.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_powerpc.c,v 1.1 2010/07/11 20:49:36 raj Exp $");
+__FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_static_dtb.S#2 (text+ko) ====

@@ -26,7 +26,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/dev/fdt/fdt_static_dtb.S,v 1.1 2010/06/02 17:17:45 raj Exp $
+ * $FreeBSD$
  */
 
 #include "fdt_static_dtb.h"

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdtbus.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdt/fdtbus.c,v 1.4 2011/04/29 18:41:21 jhb Exp $");
+__FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,7 +47,7 @@
 #include "ofw_bus_if.h"
 
 #define DEBUG
-#undef DEBUG
+//#undef DEBUG
 
 #ifdef DEBUG
 #define debugf(fmt, args...) do { printf("%s(): ", __func__);	\
@@ -206,7 +206,7 @@
 	 * Mem-mapped I/O space rman.
 	 */
 	start = 0;
-	end = ~0ul;
+	end = ~0u;
 	sc->sc_mem.rm_start = start;
 	sc->sc_mem.rm_end = end;
 	sc->sc_mem.rm_type = RMAN_ARRAY;
@@ -293,7 +293,7 @@
 
 	resource_list_init(&di->di_res);
 
-	if (fdt_reg_to_rl(node, &di->di_res, fdt_immr_va)) {
+	if (fdt_reg_to_rl(node, &di->di_res, NULL, 0)) {
 		device_printf(child, "could not process 'reg' property\n");
 		newbus_device_destroy(child);
 		child = NULL;
@@ -381,9 +381,9 @@
 	}
 
 	/* Calculate address range relative to base. */
-	par_base &= 0x000ffffful;
-	start &= 0x000ffffful;
-	start += par_base + fdt_immr_va;
+	//par_base &= 0x000ffffful;
+	//start &= 0x000ffffful;
+	start += par_base;// + fdt_immr_va;
 	if (count == 0)
 		count = par_size;
 	end = start + count - 1;
@@ -490,6 +490,7 @@
 	struct rman *rm;
 	struct fdtbus_devinfo *di;
 	struct resource_list_entry *rle;
+	bus_space_handle_t bsh;
 	int needactivate;
 
 	/*
@@ -544,8 +545,11 @@
 
 	if (type == SYS_RES_IOPORT || type == SYS_RES_MEMORY) {
 		/* XXX endianess should be set based on SOC node */
+		if (bus_space_map(fdtbus_bs_tag, rman_get_start(res),
+		    rman_get_size(res), 0, &bsh))
+			printf("CANNOT BUS_SPACE_MAP() ON 0x%lx\n", rman_get_start(res));
 		rman_set_bustag(res, fdtbus_bs_tag);
-		rman_set_bushandle(res, rman_get_start(res));
+		rman_set_bushandle(res, bsh);
 	}
 
 	if (needactivate)

==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/simplebus.c#2 (text+ko) ====

@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/fdt/simplebus.c,v 1.2 2010/07/11 20:30:59 raj Exp $");
+__FBSDID("$FreeBSD$");
 
 #include "opt_platform.h"
 #include <sys/param.h>
@@ -62,11 +62,10 @@
 static MALLOC_DEFINE(M_SIMPLEBUS, "simplebus", "simplebus devices information");
 
 struct simplebus_softc {
-	int	sc_addr_cells;
-	int	sc_size_cells;
-	u_long	sc_start_pa;
-	u_long	sc_start_va;
-	u_long	sc_size;
+	int			sc_addr_cells;
+	int			sc_size_cells;
+	struct fdt_range *	sc_ranges;
+	int			sc_ranges_count;
 };
 
 struct simplebus_devinfo {
@@ -155,13 +154,49 @@
 	struct simplebus_devinfo *di;
 	struct simplebus_softc *sc;
 	phandle_t dt_node, dt_child;
+	pcell_t *ranges, *ptr;
+	int i, tuple_size, len, par_addr_cells;
 
 	sc = device_get_softc(dev);
+	dt_node = ofw_bus_get_node(dev);
+
+	if ((fdt_addrsize_cells(dt_node, &sc->sc_addr_cells, &sc->sc_size_cells)) != 0)
+		return (ENXIO);	
+
+	/*
+	 * Process 'ranges' property
+	 */
+	par_addr_cells = fdt_parent_addr_cells(dt_node);
+	if (par_addr_cells > 2)
+		return (ERANGE);
+
+	len = OF_getprop_alloc(dt_node, "ranges", sizeof(pcell_t), (void **)&ranges);
+	if (len <= 0) 
+		device_printf(dev, "WARNING: bus has no 'ranges' property\n");
 
-	sc->sc_start_pa = fdt_immr_pa;
-	sc->sc_start_va = fdt_immr_va;
-	sc->sc_size = fdt_immr_size;
+	tuple_size = sc->sc_addr_cells + par_addr_cells + sc->sc_size_cells;
+	sc->sc_ranges_count = len / tuple_size;
+
+	printf("### tuple_size=%d ranges_count=%d\n", tuple_size, sc->sc_ranges_count);
+
+	ptr = ranges;
+
+	sc->sc_ranges = malloc(sizeof(struct fdt_range) * sc->sc_ranges_count, 
+	    M_SIMPLEBUS, M_WAITOK | M_ZERO);
+
+	for (i = 0; i < sc->sc_ranges_count; i++) {
+		sc->sc_ranges[i].base = fdt_data_get((void *)ptr, sc->sc_addr_cells);
+		ptr += sc->sc_addr_cells;
+		sc->sc_ranges[i].parent = fdt_data_get((void *)ptr, par_addr_cells);
+		ptr += par_addr_cells;
+		sc->sc_ranges[i].size = fdt_data_get((void *)ptr, sc->sc_size_cells); 
+		ptr += sc->sc_size_cells;
 
+		printf("### new range: base=%lx parent=%lx size=%lx\n",
+			sc->sc_ranges[i].base, sc->sc_ranges[i].parent, 
+			sc->sc_ranges[i].size);
+	}
+	
 	/*
 	 * Walk simple-bus and add direct subordinates as our children.
 	 */
@@ -186,7 +221,8 @@
 
 		resource_list_init(&di->di_res);
 
-		if (fdt_reg_to_rl(dt_child, &di->di_res, sc->sc_start_va)) {
+		if (fdt_reg_to_rl(dt_child, &di->di_res, sc->sc_ranges,
+		    sc->sc_ranges_count)) {
 			device_printf(dev, "%s: could not process 'reg' "
 			    "property\n", di->di_ofw.obd_name);
 			ofw_bus_gen_destroy_devinfo(&di->di_ofw);



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