xref: /qemu/include/hw/intc/bcm2836_control.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
1cc28296dSAndrew Baumann /*
2cc28296dSAndrew Baumann  * Raspberry Pi emulation (c) 2012 Gregory Estrade
3cc28296dSAndrew Baumann  * Upstreaming code cleanup [including bcm2835_*] (c) 2013 Jan Petrous
4cc28296dSAndrew Baumann  *
5cc28296dSAndrew Baumann  * Rasperry Pi 2 emulation and refactoring Copyright (c) 2015, Microsoft
6cc28296dSAndrew Baumann  * Written by Andrew Baumann
7cc28296dSAndrew Baumann  *
867d80321SZoltán Baldaszti  * ARM Local Timer IRQ Copyright (c) 2019. Zoltán Baldaszti
967d80321SZoltán Baldaszti  * Added basic IRQ_TIMER interrupt support
1067d80321SZoltán Baldaszti  *
116111a0c0SPhilippe Mathieu-Daudé  * This work is licensed under the terms of the GNU GPL, version 2 or later.
126111a0c0SPhilippe Mathieu-Daudé  * See the COPYING file in the top-level directory.
13cc28296dSAndrew Baumann  */
14cc28296dSAndrew Baumann 
15cc28296dSAndrew Baumann #ifndef BCM2836_CONTROL_H
16cc28296dSAndrew Baumann #define BCM2836_CONTROL_H
17cc28296dSAndrew Baumann 
18cc28296dSAndrew Baumann #include "hw/sysbus.h"
1967d80321SZoltán Baldaszti #include "qemu/timer.h"
20*db1015e9SEduardo Habkost #include "qom/object.h"
21cc28296dSAndrew Baumann 
22cc28296dSAndrew Baumann /* 4 mailboxes per core, for 16 total */
23cc28296dSAndrew Baumann #define BCM2836_NCORES 4
24cc28296dSAndrew Baumann #define BCM2836_MBPERCORE 4
25cc28296dSAndrew Baumann 
26cc28296dSAndrew Baumann #define TYPE_BCM2836_CONTROL "bcm2836-control"
27*db1015e9SEduardo Habkost typedef struct BCM2836ControlState BCM2836ControlState;
28cc28296dSAndrew Baumann #define BCM2836_CONTROL(obj) \
29cc28296dSAndrew Baumann     OBJECT_CHECK(BCM2836ControlState, (obj), TYPE_BCM2836_CONTROL)
30cc28296dSAndrew Baumann 
31*db1015e9SEduardo Habkost struct BCM2836ControlState {
32cc28296dSAndrew Baumann     /*< private >*/
33cc28296dSAndrew Baumann     SysBusDevice busdev;
34cc28296dSAndrew Baumann     /*< public >*/
35cc28296dSAndrew Baumann     MemoryRegion iomem;
36cc28296dSAndrew Baumann 
37cc28296dSAndrew Baumann     /* mailbox state */
38cc28296dSAndrew Baumann     uint32_t mailboxes[BCM2836_NCORES * BCM2836_MBPERCORE];
39cc28296dSAndrew Baumann 
40cc28296dSAndrew Baumann     /* interrupt routing/control registers */
41cc28296dSAndrew Baumann     uint8_t route_gpu_irq, route_gpu_fiq;
42cc28296dSAndrew Baumann     uint32_t timercontrol[BCM2836_NCORES];
43cc28296dSAndrew Baumann     uint32_t mailboxcontrol[BCM2836_NCORES];
44cc28296dSAndrew Baumann 
45cc28296dSAndrew Baumann     /* interrupt status regs (derived from input pins; not visible to user) */
46cc28296dSAndrew Baumann     bool gpu_irq, gpu_fiq;
47cc28296dSAndrew Baumann     uint8_t timerirqs[BCM2836_NCORES];
48cc28296dSAndrew Baumann 
4967d80321SZoltán Baldaszti     /* local timer */
5067d80321SZoltán Baldaszti     QEMUTimer timer;
5167d80321SZoltán Baldaszti     uint32_t local_timer_control;
5267d80321SZoltán Baldaszti     uint8_t route_localtimer;
5367d80321SZoltán Baldaszti 
54cc28296dSAndrew Baumann     /* interrupt source registers, post-routing (also input-derived; visible) */
55cc28296dSAndrew Baumann     uint32_t irqsrc[BCM2836_NCORES];
56cc28296dSAndrew Baumann     uint32_t fiqsrc[BCM2836_NCORES];
57cc28296dSAndrew Baumann 
58cc28296dSAndrew Baumann     /* outputs to CPU cores */
59cc28296dSAndrew Baumann     qemu_irq irq[BCM2836_NCORES];
60cc28296dSAndrew Baumann     qemu_irq fiq[BCM2836_NCORES];
61*db1015e9SEduardo Habkost };
62cc28296dSAndrew Baumann 
63cc28296dSAndrew Baumann #endif
64