From owner-p4-projects@FreeBSD.ORG Tue Jun 7 11:10:44 2011 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id DDE8F1065673; Tue, 7 Jun 2011 11:10:43 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 91359106566B for ; Tue, 7 Jun 2011 11:10:43 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 7EFBF8FC0A for ; Tue, 7 Jun 2011 11:10:43 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id p57BAhL3055320 for ; Tue, 7 Jun 2011 11:10:43 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id p57BAhvm055315 for perforce@freebsd.org; Tue, 7 Jun 2011 11:10:43 GMT (envelope-from jceel@freebsd.org) Date: Tue, 7 Jun 2011 11:10:43 GMT Message-Id: <201106071110.p57BAhvm055315@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 194387 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 07 Jun 2011 11:10:44 -0000 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 -__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_common.c,v 1.4 2011/01/29 20:25:20 marcel Exp $"); +__FBSDID("$FreeBSD$"); #include #include @@ -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 -__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_pci.c,v 1.3 2011/01/29 21:14:29 marcel Exp $"); +__FBSDID("$FreeBSD$"); #include #include ==== //depot/projects/soc2011/jceel_lpc/sys/dev/fdt/fdt_powerpc.c#2 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/dev/fdt/fdt_powerpc.c,v 1.1 2010/07/11 20:49:36 raj Exp $"); +__FBSDID("$FreeBSD$"); #include #include ==== //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 -__FBSDID("$FreeBSD: src/sys/dev/fdt/fdtbus.c,v 1.4 2011/04/29 18:41:21 jhb Exp $"); +__FBSDID("$FreeBSD$"); #include #include @@ -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 -__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 @@ -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);