[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH ARM v4 11/12] mini-os: get GIC addresses from FDT
Signed-off-by: Thomas Leonard <talex5@xxxxxxxxx> --- extras/mini-os/drivers/gic.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/extras/mini-os/drivers/gic.c b/extras/mini-os/drivers/gic.c index 3141830..8a9e427 100644 --- a/extras/mini-os/drivers/gic.c +++ b/extras/mini-os/drivers/gic.c @@ -2,6 +2,7 @@ #include <mini-os/os.h> #include <mini-os/hypervisor.h> +#include <libfdt.h> //#define VGIC_DEBUG #ifdef VGIC_DEBUG @@ -168,9 +169,38 @@ static void gic_handler(void) { } void gic_init(void) { - // FIXME Get from dt! - gic.gicd_base = (char *)0x2c001000ULL; - gic.gicc_base = (char *)0x2c002000ULL; + gic.gicd_base = NULL; + int node = 0; + int depth = 0; + for (;;) + { + node = fdt_next_node(device_tree, node, &depth); + if (node <= 0 || depth < 0) + break; + + /* + int name_len = 0; + const char *name = fdt_get_name(device_tree, node, &name_len); + printk("Found node: %d (%.*s)\n", node, name_len, name); + */ + + if (fdt_getprop(device_tree, node, "interrupt-controller", NULL)) { + int len = 0; + const uint64_t *reg = fdt_getprop(device_tree, node, "reg", &len); + if (reg == NULL || len != 32) { + printk("Bad 'reg' property: %p %d\n", reg, len); + continue; + } + gic.gicd_base = (char *) (long) fdt64_to_cpu(reg[0]); + gic.gicc_base = (char *) (long) fdt64_to_cpu(reg[2]); + printk("Found GIC: gicd_base = %p, gicc_base = %p\n", gic.gicd_base, gic.gicc_base); + break; + } + } + if (!gic.gicd_base) { + printk("GIC not found!\n"); + BUG(); + } wmb(); IRQ_handler = gic_handler; -- 2.0.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |