xref: /qemu/hw/intc/realview_gic.c (revision 83f7d43a9ef70b1b91e465173e18c845420e931e)
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