19ee6e8bbSpbrook /* 29ee6e8bbSpbrook * ARM RealView Emulation Baseboard Interrupt Controller 39ee6e8bbSpbrook * 49ee6e8bbSpbrook * Copyright (c) 2006-2007 CodeSourcery. 59ee6e8bbSpbrook * Written by Paul Brook 69ee6e8bbSpbrook * 78e31bf38SMatthew Fernandez * This code is licensed under the GPL. 89ee6e8bbSpbrook */ 99ee6e8bbSpbrook 10fe7e8758SPaul Brook #include "sysbus.h" 119ee6e8bbSpbrook 129ee6e8bbSpbrook #define NCPU 1 139ee6e8bbSpbrook 149ee6e8bbSpbrook /* Only a single "CPU" interface is present. */ 159ee6e8bbSpbrook static inline int 169ee6e8bbSpbrook gic_get_current_cpu(void) 179ee6e8bbSpbrook { 189ee6e8bbSpbrook return 0; 199ee6e8bbSpbrook } 209ee6e8bbSpbrook 219ee6e8bbSpbrook #include "arm_gic.c" 229ee6e8bbSpbrook 23fe7e8758SPaul Brook typedef struct { 24fe7e8758SPaul Brook gic_state gic; 25755c0802SAvi Kivity MemoryRegion container; 26fe7e8758SPaul Brook } RealViewGICState; 27fe7e8758SPaul Brook 28755c0802SAvi Kivity static void realview_gic_map_setup(RealViewGICState *s) 299ee6e8bbSpbrook { 30755c0802SAvi Kivity memory_region_init(&s->container, "realview-gic-container", 0x2000); 31c3ffa595SPeter Maydell memory_region_add_subregion(&s->container, 0, &s->gic.cpuiomem[0]); 32755c0802SAvi Kivity memory_region_add_subregion(&s->container, 0x1000, &s->gic.iomem); 339ee6e8bbSpbrook } 34fe7e8758SPaul Brook 3581a322d4SGerd Hoffmann static int realview_gic_init(SysBusDevice *dev) 36fe7e8758SPaul Brook { 37fe7e8758SPaul Brook RealViewGICState *s = FROM_SYSBUSGIC(RealViewGICState, dev); 38fe7e8758SPaul Brook 39a32134aaSMark Langsdorf /* The GICs on the RealView boards have a fixed nonconfigurable 40a32134aaSMark Langsdorf * number of interrupt lines, so we don't need to expose this as 41a32134aaSMark Langsdorf * a qdev property. 42a32134aaSMark Langsdorf */ 43a32134aaSMark Langsdorf gic_init(&s->gic, 96); 44755c0802SAvi Kivity realview_gic_map_setup(s); 45750ecd44SAvi Kivity sysbus_init_mmio(dev, &s->container); 4681a322d4SGerd Hoffmann return 0; 47fe7e8758SPaul Brook } 48fe7e8758SPaul Brook 49999e12bbSAnthony Liguori static void realview_gic_class_init(ObjectClass *klass, void *data) 50999e12bbSAnthony Liguori { 51999e12bbSAnthony Liguori SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass); 52999e12bbSAnthony Liguori 53999e12bbSAnthony Liguori sdc->init = realview_gic_init; 54999e12bbSAnthony Liguori } 55999e12bbSAnthony Liguori 5639bffca2SAnthony Liguori static TypeInfo realview_gic_info = { 57999e12bbSAnthony Liguori .name = "realview_gic", 5839bffca2SAnthony Liguori .parent = TYPE_SYS_BUS_DEVICE, 5939bffca2SAnthony Liguori .instance_size = sizeof(RealViewGICState), 60999e12bbSAnthony Liguori .class_init = realview_gic_class_init, 61999e12bbSAnthony Liguori }; 62999e12bbSAnthony Liguori 63*83f7d43aSAndreas Färber static void realview_gic_register_types(void) 64fe7e8758SPaul Brook { 6539bffca2SAnthony Liguori type_register_static(&realview_gic_info); 66fe7e8758SPaul Brook } 67fe7e8758SPaul Brook 68*83f7d43aSAndreas Färber type_init(realview_gic_register_types) 69