Complete raspi/raspi2 and Windows support fixes, ported from qemu-ar7
[qemu/ar7.git] / hw / misc / bcm2835_vchiq.c
blobcc74c290551dcb21c1e542638d22cada7bc0840b
1 /*
2 * Raspberry Pi emulation (c) 2012 Gregory Estrade
3 * This code is licensed under the GNU GPLv2 and later.
4 */
6 #include "hw/sysbus.h"
8 #include "hw/arm/bcm2835_common.h"
10 #define TYPE_BCM2835_VCHIQ "bcm2835_vchiq"
11 #define BCM2835_VCHIQ(obj) \
12 OBJECT_CHECK(bcm2835_vchiq_state, (obj), TYPE_BCM2835_VCHIQ)
14 typedef struct {
15 SysBusDevice busdev;
16 MemoryRegion iomem;
17 int pending;
18 qemu_irq mbox_irq;
19 } bcm2835_vchiq_state;
21 static uint64_t bcm2835_vchiq_read(void *opaque, hwaddr offset,
22 unsigned size)
24 bcm2835_vchiq_state *s = (bcm2835_vchiq_state *)opaque;
25 uint32_t res = 0;
27 switch (offset) {
28 case 0:
29 res = MBOX_CHAN_VCHIQ;
30 s->pending = 0;
31 qemu_set_irq(s->mbox_irq, 0);
32 break;
33 case 4:
34 res = s->pending;
35 break;
36 default:
37 qemu_log_mask(LOG_GUEST_ERROR,
38 "bcm2835_vchiq_read: Bad offset %x\n", (int)offset);
39 return 0;
41 return res;
43 static void bcm2835_vchiq_write(void *opaque, hwaddr offset,
44 uint64_t value, unsigned size)
46 bcm2835_vchiq_state *s = (bcm2835_vchiq_state *)opaque;
47 switch (offset) {
48 case 0:
49 s->pending = 1;
50 qemu_set_irq(s->mbox_irq, 1);
51 break;
52 default:
53 qemu_log_mask(LOG_GUEST_ERROR,
54 "bcm2835_vchiq_write: Bad offset %x\n", (int)offset);
55 return;
61 static const MemoryRegionOps bcm2835_vchiq_ops = {
62 .read = bcm2835_vchiq_read,
63 .write = bcm2835_vchiq_write,
64 .endianness = DEVICE_NATIVE_ENDIAN,
68 static const VMStateDescription vmstate_bcm2835_vchiq = {
69 .name = TYPE_BCM2835_VCHIQ,
70 .version_id = 1,
71 .minimum_version_id = 1,
72 .minimum_version_id_old = 1,
73 .fields = (VMStateField[]) {
74 VMSTATE_END_OF_LIST()
78 static int bcm2835_vchiq_init(SysBusDevice *sbd)
80 DeviceState *dev = DEVICE(sbd);
81 bcm2835_vchiq_state *s = BCM2835_VCHIQ(dev);
83 s->pending = 0;
85 sysbus_init_irq(sbd, &s->mbox_irq);
86 memory_region_init_io(&s->iomem, OBJECT(s), &bcm2835_vchiq_ops, s,
87 TYPE_BCM2835_VCHIQ, 0x10);
88 sysbus_init_mmio(sbd, &s->iomem);
89 vmstate_register(dev, -1, &vmstate_bcm2835_vchiq, s);
91 return 0;
94 static void bcm2835_vchiq_class_init(ObjectClass *klass, void *data)
96 SysBusDeviceClass *sdc = SYS_BUS_DEVICE_CLASS(klass);
98 sdc->init = bcm2835_vchiq_init;
101 static TypeInfo bcm2835_vchiq_info = {
102 .name = TYPE_BCM2835_VCHIQ,
103 .parent = TYPE_SYS_BUS_DEVICE,
104 .instance_size = sizeof(bcm2835_vchiq_state),
105 .class_init = bcm2835_vchiq_class_init,
108 static void bcm2835_vchiq_register_types(void)
110 type_register_static(&bcm2835_vchiq_info);
113 type_init(bcm2835_vchiq_register_types)