root / hw / realview_gic.c @ 0200db65
History | View | Annotate | Download (1.9 kB)
1 | 9ee6e8bb | pbrook | /*
|
---|---|---|---|
2 | 9ee6e8bb | pbrook | * ARM RealView Emulation Baseboard Interrupt Controller
|
3 | 9ee6e8bb | pbrook | *
|
4 | 9ee6e8bb | pbrook | * Copyright (c) 2006-2007 CodeSourcery.
|
5 | 9ee6e8bb | pbrook | * Written by Paul Brook
|
6 | 9ee6e8bb | pbrook | *
|
7 | 8e31bf38 | Matthew Fernandez | * This code is licensed under the GPL.
|
8 | 9ee6e8bb | pbrook | */
|
9 | 9ee6e8bb | pbrook | |
10 | fe7e8758 | Paul Brook | #include "sysbus.h" |
11 | 9ee6e8bb | pbrook | |
12 | 9ee6e8bb | pbrook | #define GIC_NIRQ 96 |
13 | 9ee6e8bb | pbrook | #define NCPU 1 |
14 | 9ee6e8bb | pbrook | |
15 | 9ee6e8bb | pbrook | /* Only a single "CPU" interface is present. */
|
16 | 9ee6e8bb | pbrook | static inline int |
17 | 9ee6e8bb | pbrook | gic_get_current_cpu(void)
|
18 | 9ee6e8bb | pbrook | { |
19 | 9ee6e8bb | pbrook | return 0; |
20 | 9ee6e8bb | pbrook | } |
21 | 9ee6e8bb | pbrook | |
22 | 9ee6e8bb | pbrook | #include "arm_gic.c" |
23 | 9ee6e8bb | pbrook | |
24 | fe7e8758 | Paul Brook | typedef struct { |
25 | fe7e8758 | Paul Brook | gic_state gic; |
26 | 755c0802 | Avi Kivity | MemoryRegion iomem; |
27 | 755c0802 | Avi Kivity | MemoryRegion container; |
28 | fe7e8758 | Paul Brook | } RealViewGICState; |
29 | fe7e8758 | Paul Brook | |
30 | 755c0802 | Avi Kivity | static uint64_t realview_gic_cpu_read(void *opaque, target_phys_addr_t offset, |
31 | 755c0802 | Avi Kivity | unsigned size)
|
32 | 9ee6e8bb | pbrook | { |
33 | 9ee6e8bb | pbrook | gic_state *s = (gic_state *)opaque; |
34 | 9ee6e8bb | pbrook | return gic_cpu_read(s, gic_get_current_cpu(), offset);
|
35 | 9ee6e8bb | pbrook | } |
36 | 9ee6e8bb | pbrook | |
37 | c227f099 | Anthony Liguori | static void realview_gic_cpu_write(void *opaque, target_phys_addr_t offset, |
38 | 755c0802 | Avi Kivity | uint64_t value, unsigned size)
|
39 | 9ee6e8bb | pbrook | { |
40 | 9ee6e8bb | pbrook | gic_state *s = (gic_state *)opaque; |
41 | 9ee6e8bb | pbrook | gic_cpu_write(s, gic_get_current_cpu(), offset, value); |
42 | 9ee6e8bb | pbrook | } |
43 | 9ee6e8bb | pbrook | |
44 | 755c0802 | Avi Kivity | static const MemoryRegionOps realview_gic_cpu_ops = { |
45 | 755c0802 | Avi Kivity | .read = realview_gic_cpu_read, |
46 | 755c0802 | Avi Kivity | .write = realview_gic_cpu_write, |
47 | 755c0802 | Avi Kivity | .endianness = DEVICE_NATIVE_ENDIAN, |
48 | 9ee6e8bb | pbrook | }; |
49 | 9ee6e8bb | pbrook | |
50 | 755c0802 | Avi Kivity | static void realview_gic_map_setup(RealViewGICState *s) |
51 | 9ee6e8bb | pbrook | { |
52 | 755c0802 | Avi Kivity | memory_region_init(&s->container, "realview-gic-container", 0x2000); |
53 | 755c0802 | Avi Kivity | memory_region_init_io(&s->iomem, &realview_gic_cpu_ops, &s->gic, |
54 | 755c0802 | Avi Kivity | "realview-gic", 0x1000); |
55 | 755c0802 | Avi Kivity | memory_region_add_subregion(&s->container, 0, &s->iomem);
|
56 | 755c0802 | Avi Kivity | memory_region_add_subregion(&s->container, 0x1000, &s->gic.iomem);
|
57 | fe7e8758 | Paul Brook | } |
58 | fe7e8758 | Paul Brook | |
59 | 81a322d4 | Gerd Hoffmann | static int realview_gic_init(SysBusDevice *dev) |
60 | fe7e8758 | Paul Brook | { |
61 | fe7e8758 | Paul Brook | RealViewGICState *s = FROM_SYSBUSGIC(RealViewGICState, dev); |
62 | 9ee6e8bb | pbrook | |
63 | fe7e8758 | Paul Brook | gic_init(&s->gic); |
64 | 755c0802 | Avi Kivity | realview_gic_map_setup(s); |
65 | 755c0802 | Avi Kivity | sysbus_init_mmio_region(dev, &s->container); |
66 | 81a322d4 | Gerd Hoffmann | return 0; |
67 | 9ee6e8bb | pbrook | } |
68 | fe7e8758 | Paul Brook | |
69 | fe7e8758 | Paul Brook | static void realview_gic_register_devices(void) |
70 | fe7e8758 | Paul Brook | { |
71 | fe7e8758 | Paul Brook | sysbus_register_dev("realview_gic", sizeof(RealViewGICState), |
72 | fe7e8758 | Paul Brook | realview_gic_init); |
73 | fe7e8758 | Paul Brook | } |
74 | fe7e8758 | Paul Brook | |
75 | fe7e8758 | Paul Brook | device_init(realview_gic_register_devices) |