Statistics
| Branch: | Revision:

root / hw / realview_gic.c @ d46ccfce

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)