PERFORCE change 194387 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Tue Jun 7 11:10:44 UTC 2011
http://p4web.freebsd.org/@@194387?ac=10
Change 194387 by jceel at 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);
More information about the p4-projects
mailing list