Date: Fri, 22 Mar 2013 19:52:05 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 226199 for review Message-ID: <201303221952.r2MJq5Xa009112@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@226199?ac=10 Change 226199 by brooks@brooks_zenith on 2013/03/22 19:51:51 Merge the BERI PIC driver and required support for bus_space_*_8 functions. Affected files ... .. //depot/projects/ctsrd/cheribsd/src/sys/boot/fdt/dts/beripad-de4.dts#7 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/conf/files#8 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.c#6 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.h#5 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_ic_if.m#1 branch .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_mips.c#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/simplebus.c#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/beri_pic.c#1 branch .. //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/files.beri#13 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cpufunc.h#4 integrate .. //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/bus_space_generic.c#5 integrate Differences ... ==== //depot/projects/ctsrd/cheribsd/src/sys/boot/fdt/dts/beripad-de4.dts#7 (text+ko) ==== @@ -48,6 +48,9 @@ #size-cells = <1>; cpus { + #address-cells = <1>; + #size-cells = <1>; + cpu@0 { compatible = "sri-cambridge,beri"; }; @@ -70,10 +73,29 @@ reg = <0x0 0x40000000>; // 1G at 0x0 }; + beripic: beripic@7f804000 { + compatible = "sri-cambridge,beri-pic"; + interrupt-controller; + #address-cells = <0>; + #interrupt-cells = <1>; + reg = <0x7f804000 0x400 + 0x7f806000 0x10 + 0x7f806080 0x10 + 0x7f806100 0x10>; + interrupts = <0 1 2 3 4>; + hard-interrupt-sources = <64>; + soft-interrupt-sources = <64>; + /* + * Ideally we'd have phandle to our core here so we + * can query things like nthreads. + */ + } + serial@7f000000 { compatible = "altera,jtag_uart-11_0"; reg = <0x7f000000 0x40>; interrupts = <0>; + interrupt-parent = <&beripic>; }; serial@7f001000 { @@ -147,6 +169,7 @@ 0x7f007420 0x20>; /* RX, TX */ interrupts = <1 2>; + interrupt-parent = <&beripic>; }; ethernet@7f005000 { ==== //depot/projects/ctsrd/cheribsd/src/sys/conf/files#8 (text+ko) ==== @@ -1293,6 +1293,7 @@ dev/fatm/if_fatm.c optional fatm pci dev/fb/splash.c optional splash dev/fdt/fdt_common.c optional fdt +dev/fdt/fdt_ic_if.m optional fdt dev/fdt/fdt_pci.c optional fdt pci dev/fdt/fdt_slicer.c optional fdt cfi | fdt nand dev/fdt/fdt_static_dtb.S optional fdt fdt_dtb_static ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.c#6 (text+ko) ==== @@ -63,6 +63,8 @@ vm_offset_t fdt_immr_va; vm_offset_t fdt_immr_size; +struct fdt_ic_list fdt_ic_list_head = SLIST_HEAD_INITIALIZER(fdt_ic_list_head); + int fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) { ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_common.h#5 (text+ko) ==== @@ -70,6 +70,13 @@ }; extern struct fdt_fixup_entry fdt_fixup_table[]; +extern SLIST_HEAD(fdt_ic_list, fdt_ic) fdt_ic_list_head; +struct fdt_ic { + SLIST_ENTRY(fdt_ic) fdt_ics; + ihandle_t iph; + device_t dev; +}; + extern vm_paddr_t fdt_immr_pa; extern vm_offset_t fdt_immr_va; extern vm_offset_t fdt_immr_size; ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/fdt_mips.c#4 (text+ko) ==== @@ -68,7 +68,26 @@ return (0); } +/* + * CHERI PIC decoder. + */ +static int +fdt_pic_decode_beri(phandle_t node, pcell_t *intr, int *interrupt, + int *trig, int *pol) +{ + + if (!fdt_is_compatible(node, "sri-cambridge,beri-pic")) + return (ENXIO); + + *interrupt = fdt32_to_cpu(intr[0]); + *trig = INTR_TRIGGER_CONFORM; + *pol = INTR_POLARITY_CONFORM; + + return (0); +} + fdt_pic_decode_t fdt_pic_table[] = { &fdt_pic_decode_mips4k_cp0, + &fdt_pic_decode_beri, NULL }; ==== //depot/projects/ctsrd/cheribsd/src/sys/dev/fdt/simplebus.c#4 (text+ko) ==== @@ -47,6 +47,7 @@ #include <dev/ofw/openfirm.h> #include "fdt_common.h" +#include "fdt_ic_if.h" #include "ofw_bus_if.h" #ifdef DEBUG @@ -80,9 +81,18 @@ static int simplebus_print_child(device_t, device_t); static int simplebus_setup_intr(device_t, device_t, struct resource *, int, driver_filter_t *, driver_intr_t *, void *, void **); +static int simplebus_teardown_intr(device_t, device_t, struct resource *, + void *); +static int simplebus_activate_resource(device_t, device_t, int, int, + struct resource *); static struct resource *simplebus_alloc_resource(device_t, device_t, int, int *, u_long, u_long, u_long, u_int); +static int simplebus_deactivate_resource(device_t, device_t, int, int, + struct resource *); +static int simplebus_release_resource(device_t, device_t, int, int, + struct resource *); +static device_t simplebus_get_interrupt_parent(device_t); static struct resource_list *simplebus_get_resource_list(device_t, device_t); static ofw_bus_get_devinfo_t simplebus_get_devinfo; @@ -102,11 +112,11 @@ /* Bus interface */ DEVMETHOD(bus_print_child, simplebus_print_child), DEVMETHOD(bus_alloc_resource, simplebus_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), - DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_release_resource, simplebus_release_resource), + DEVMETHOD(bus_activate_resource, simplebus_activate_resource), + DEVMETHOD(bus_deactivate_resource, simplebus_deactivate_resource), DEVMETHOD(bus_setup_intr, simplebus_setup_intr), - DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), + DEVMETHOD(bus_teardown_intr, simplebus_teardown_intr), DEVMETHOD(bus_get_resource_list, simplebus_get_resource_list), /* OFW bus interface */ @@ -238,6 +248,7 @@ simplebus_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { + device_t ic; struct simplebus_devinfo *di; struct resource_list_entry *rle; @@ -263,10 +274,53 @@ count = rle->count; } + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return(FDT_IC_ALLOC_INTR(ic, child, rid, start, flags)); + return (bus_generic_alloc_resource(bus, child, type, rid, start, end, count, flags)); } +static int +simplebus_activate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_ACTIVATE_INTR(ic, r)); + + return (bus_generic_activate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_deactivate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_DEACTIVATE_INTR(ic, r)); + + return (bus_generic_deactivate_resource(dev, child, type, rid, r)); +} + +static int +simplebus_release_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + device_t ic; + + if (type == SYS_RES_IRQ && + (ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_RELEASE_INTR(ic, r)); + + return (bus_generic_release_resource(dev, child, type, rid, r)); +} + static struct resource_list * simplebus_get_resource_list(device_t bus, device_t child) { @@ -276,15 +330,40 @@ return (&di->di_res); } +static device_t +simplebus_get_interrupt_parent(device_t dev) +{ + struct simplebus_devinfo *di; + struct fdt_ic *ic; + ihandle_t iph; + phandle_t ph; + + di = device_get_ivars(dev); + if (di == NULL) + return (NULL); + + if (OF_getprop(di->di_ofw.obd_node, "interrupt-parent", &iph, + sizeof(iph)) > 0) { + iph = fdt32_to_cpu(iph); + ph = OF_instance_to_package(iph); + SLIST_FOREACH(ic, &fdt_ic_list_head, fdt_ics) { + if (ic->iph == ph) + return (ic->dev); + } + } + return (NULL); +} + static int simplebus_setup_intr(device_t bus, device_t child, struct resource *res, int flags, driver_filter_t *filter, driver_intr_t *ihand, void *arg, void **cookiep) { struct simplebus_devinfo *di; + device_t ic; enum intr_trigger trig; enum intr_polarity pol; - int error, rid; + int error, irq, rid; if (device_get_parent(child) != bus) return (ECHILD); @@ -300,20 +379,41 @@ if (rid >= DI_MAX_INTR_NUM) return (ENOENT); + ic = simplebus_get_interrupt_parent(child); + trig = di->di_intr_sl[rid].trig; pol = di->di_intr_sl[rid].pol; if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM) { - error = bus_generic_config_intr(bus, rman_get_start(res), - trig, pol); + irq = rman_get_start(res); + if (ic != NULL) + error = FDT_IC_CONFIG_INTR(ic, irq, trig, pol); + else + error = bus_generic_config_intr(bus, irq, trig, pol); if (error) return (error); } - error = bus_generic_setup_intr(bus, child, res, flags, filter, ihand, - arg, cookiep); + if (ic != NULL) + error = FDT_IC_SETUP_INTR(ic, child, res, flags, filter, + ihand, arg, cookiep); + else + error = bus_generic_setup_intr(bus, child, res, flags, filter, + ihand, arg, cookiep); return (error); } +static int +simplebus_teardown_intr(device_t bus, device_t child, struct resource *res, + void *cookie) +{ + device_t ic; + + if ((ic = simplebus_get_interrupt_parent(child)) != NULL) + return (FDT_IC_TEARDOWN_INTR(ic, child, res, cookie)); + + return (bus_generic_teardown_intr(bus, child, res, cookie)); +} + static const struct ofw_bus_devinfo * simplebus_get_devinfo(device_t bus, device_t child) { ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/beri/files.beri#13 (text+ko) ==== @@ -19,6 +19,7 @@ mips/beri/beri_asm.S standard mips/beri/beri_machdep.c standard mips/beri/beri_mp.c optional smp +mips/beri/beri_pic.c optional fdt mips/cheri/cheri.c optional cpu_cheri mips/mips/intr_machdep.c standard mips/mips/tick.c standard ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/include/cpufunc.h#4 (text+ko) ==== @@ -354,9 +354,11 @@ #define readb(va) (*(volatile uint8_t *) (va)) #define readw(va) (*(volatile uint16_t *) (va)) #define readl(va) (*(volatile uint32_t *) (va)) +#define readd(va) mips3_ld(va) #define writeb(va, d) (*(volatile uint8_t *) (va) = (d)) #define writew(va, d) (*(volatile uint16_t *) (va) = (d)) #define writel(va, d) (*(volatile uint32_t *) (va) = (d)) +#define writed(va, d) mips3_sd((va), (d)) #endif /* !_MACHINE_CPUFUNC_H_ */ ==== //depot/projects/ctsrd/cheribsd/src/sys/mips/mips/bus_space_generic.c#5 (text+ko) ==== @@ -202,9 +202,11 @@ #define rd8(a) cvmx_read64_uint8(a) #define rd16(a) cvmx_read64_uint16(a) #define rd32(a) cvmx_read64_uint32(a) +#define rd64(a) cvmx_read64_uint64(a) #define wr8(a, v) cvmx_write64_uint8(a, v) #define wr16(a, v) cvmx_write64_uint16(a, v) #define wr32(a, v) cvmx_write64_uint32(a, v) +#define wr64(a, v) cvmx_write64_uint64(a, v) #elif defined(CPU_SB1) && _BYTE_ORDER == _BIG_ENDIAN #include <mips/sibyte/sb_bus_space.h> #define rd8(a) sb_big_endian_read8(a) @@ -217,9 +219,11 @@ #define rd8(a) readb(a) #define rd16(a) readw(a) #define rd32(a) readl(a) +#define rd64(a) readd(a) #define wr8(a, v) writeb(a, v) #define wr16(a, v) writew(a, v) #define wr32(a, v) writel(a, v) +#define wr64(a, v) writed(a, v) #endif /* generic bus_space tag */ @@ -297,7 +301,11 @@ generic_bs_r_8(void *t, bus_space_handle_t handle, bus_size_t offset) { +#ifdef rd64 + return(rd64(handle + offset)); +#else panic("%s: not implemented", __func__); +#endif } void @@ -333,8 +341,14 @@ generic_bs_rm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + *addr++ = rd64(baddr); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -382,8 +396,16 @@ generic_bs_rr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + *addr++ = rd64(baddr); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -419,7 +441,11 @@ uint64_t value) { +#ifdef rd64 + wr64(bsh + offset, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -460,8 +486,14 @@ generic_bs_wm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) + wr64(baddr, *addr++); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -508,8 +540,16 @@ generic_bs_wr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, const uint64_t *addr, size_t count) { +#ifdef rd64 + bus_addr_t baddr = bsh + offset; + while (count--) { + wr64(baddr, *addr++); + baddr += 8; + } +#else panic("%s: not implemented", __func__); +#endif } /* @@ -550,8 +590,14 @@ generic_bs_sm_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + while (count--) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -592,8 +638,14 @@ generic_bs_sr_8(void *t, bus_space_handle_t bsh, bus_size_t offset, uint64_t value, size_t count) { +#ifdef rd64 + bus_addr_t addr = bsh + offset; + for (; count != 0; count--, addr += 8) + wr64(addr, value); +#else panic("%s: not implemented", __func__); +#endif } /* @@ -664,8 +716,23 @@ generic_bs_c_8(void *t, bus_space_handle_t bsh1, bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, size_t count) { +#ifdef rd64 + bus_addr_t addr1 = bsh1 + off1; + bus_addr_t addr2 = bsh2 + off2; + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; count != 0; count--, addr1 += 8, addr2 += 8) + wr64(addr2, rd64(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 8 * (count - 1), addr2 += 8 * (count - 1); + count != 0; count--, addr1 -= 8, addr2 -= 8) + wr64(addr2, rd64(addr1)); + } +#else panic("%s: not implemented", __func__); +#endif } void
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303221952.r2MJq5Xa009112>