xref: /qemu/include/hw/intc/bcm2836_control.h (revision 6111a0c0eddf320a0702c3fde17c61bb3dd02963)
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  *
11*6111a0c0SPhilippe Mathieu-Daudé  * This work is licensed under the terms of the GNU GPL, version 2 or later.
12*6111a0c0SPhilippe 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"
20cc28296dSAndrew Baumann 
21cc28296dSAndrew Baumann /* 4 mailboxes per core, for 16 total */
22cc28296dSAndrew Baumann #define BCM2836_NCORES 4
23cc28296dSAndrew Baumann #define BCM2836_MBPERCORE 4
24cc28296dSAndrew Baumann 
25cc28296dSAndrew Baumann #define TYPE_BCM2836_CONTROL "bcm2836-control"
26cc28296dSAndrew Baumann #define BCM2836_CONTROL(obj) \
27cc28296dSAndrew Baumann     OBJECT_CHECK(BCM2836ControlState, (obj), TYPE_BCM2836_CONTROL)
28cc28296dSAndrew Baumann 
29cc28296dSAndrew Baumann typedef struct BCM2836ControlState {
30cc28296dSAndrew Baumann     /*< private >*/
31cc28296dSAndrew Baumann     SysBusDevice busdev;
32cc28296dSAndrew Baumann     /*< public >*/
33cc28296dSAndrew Baumann     MemoryRegion iomem;
34cc28296dSAndrew Baumann 
35cc28296dSAndrew Baumann     /* mailbox state */
36cc28296dSAndrew Baumann     uint32_t mailboxes[BCM2836_NCORES * BCM2836_MBPERCORE];
37cc28296dSAndrew Baumann 
38cc28296dSAndrew Baumann     /* interrupt routing/control registers */
39cc28296dSAndrew Baumann     uint8_t route_gpu_irq, route_gpu_fiq;
40cc28296dSAndrew Baumann     uint32_t timercontrol[BCM2836_NCORES];
41cc28296dSAndrew Baumann     uint32_t mailboxcontrol[BCM2836_NCORES];
42cc28296dSAndrew Baumann 
43cc28296dSAndrew Baumann     /* interrupt status regs (derived from input pins; not visible to user) */
44cc28296dSAndrew Baumann     bool gpu_irq, gpu_fiq;
45cc28296dSAndrew Baumann     uint8_t timerirqs[BCM2836_NCORES];
46cc28296dSAndrew Baumann 
4767d80321SZoltán Baldaszti     /* local timer */
4867d80321SZoltán Baldaszti     QEMUTimer timer;
4967d80321SZoltán Baldaszti     uint32_t local_timer_control;
5067d80321SZoltán Baldaszti     uint8_t route_localtimer;
5167d80321SZoltán Baldaszti 
52cc28296dSAndrew Baumann     /* interrupt source registers, post-routing (also input-derived; visible) */
53cc28296dSAndrew Baumann     uint32_t irqsrc[BCM2836_NCORES];
54cc28296dSAndrew Baumann     uint32_t fiqsrc[BCM2836_NCORES];
55cc28296dSAndrew Baumann 
56cc28296dSAndrew Baumann     /* outputs to CPU cores */
57cc28296dSAndrew Baumann     qemu_irq irq[BCM2836_NCORES];
58cc28296dSAndrew Baumann     qemu_irq fiq[BCM2836_NCORES];
59cc28296dSAndrew Baumann } BCM2836ControlState;
60cc28296dSAndrew Baumann 
61cc28296dSAndrew Baumann #endif
62