1 #include "hw/arm/bcm2835.h"
2 #include "hw/arm/raspi_platform.h"
4 #include "exec/address-spaces.h"
6 #define DEFAULT_VCRAM_SIZE 0x4000000
8 static void bcm2835_init(Object
*obj
)
10 BCM2835State
*s
= BCM2835(obj
);
12 object_initialize(&s
->cpu
, sizeof(s
->cpu
), "arm1176-" TYPE_ARM_CPU
);
13 object_property_add_child(obj
, "cpu", OBJECT(&s
->cpu
), &error_abort
);
15 object_initialize(&s
->peripherals
, sizeof(s
->peripherals
),
16 TYPE_BCM2835_PERIPHERALS
);
17 object_property_add_child(obj
, "peripherals", OBJECT(&s
->peripherals
),
19 qdev_set_parent_bus(DEVICE(&s
->peripherals
), sysbus_get_default());
22 static void bcm2835_realize(DeviceState
*dev
, Error
**errp
)
24 BCM2835State
*s
= BCM2835(dev
);
27 /* common peripherals from bcm2835 */
28 object_property_set_bool(OBJECT(&s
->peripherals
), true, "realized", &err
);
30 error_propagate(errp
, err
);
34 sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s
->peripherals
), 0,
35 BCM2835_PERI_BASE
, 1);
37 object_property_set_bool(OBJECT(&s
->cpu
), true, "realized", &err
);
39 error_report_err(err
);
43 sysbus_connect_irq(SYS_BUS_DEVICE(&s
->peripherals
), 0,
44 qdev_get_gpio_in(DEVICE(&s
->cpu
), ARM_CPU_IRQ
));
45 sysbus_connect_irq(SYS_BUS_DEVICE(&s
->peripherals
), 1,
46 qdev_get_gpio_in(DEVICE(&s
->cpu
), ARM_CPU_FIQ
));
50 static Property bcm2835_props
[] = {
51 DEFINE_PROP_SIZE("vcram-size", BCM2835State
, vcram_size
, DEFAULT_VCRAM_SIZE
),
52 DEFINE_PROP_END_OF_LIST()
55 static void bcm2835_class_init(ObjectClass
*oc
, void *data
)
57 DeviceClass
*dc
= DEVICE_CLASS(oc
);
59 dc
->props
= bcm2835_props
;
60 dc
->realize
= bcm2835_realize
;
63 * Reason: creates an ARM CPU, thus use after free(), see
64 * arm_cpu_class_init()
66 dc
->cannot_destroy_with_object_finalize_yet
= true;
69 static const TypeInfo bcm2835_type_info
= {
71 .parent
= TYPE_SYS_BUS_DEVICE
,
72 .instance_size
= sizeof(BCM2835State
),
73 .instance_init
= bcm2835_init
,
74 .class_init
= bcm2835_class_init
,
77 static void bcm2835_register_types(void)
79 type_register_static(&bcm2835_type_info
);
82 type_init(bcm2835_register_types
)