xref: /qemu/include/hw/intc/bcm2836_control.h (revision 67d80321f26d9ea2b623ffac567a2f758ceae037)
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  *
8*67d80321SZoltán Baldaszti  * ARM Local Timer IRQ Copyright (c) 2019. Zoltán Baldaszti
9*67d80321SZoltán Baldaszti  * Added basic IRQ_TIMER interrupt support
10*67d80321SZoltán Baldaszti  *
11cc28296dSAndrew Baumann  * This code is licensed under the GNU GPLv2 and later.
12cc28296dSAndrew Baumann  */
13cc28296dSAndrew Baumann 
14cc28296dSAndrew Baumann #ifndef BCM2836_CONTROL_H
15cc28296dSAndrew Baumann #define BCM2836_CONTROL_H
16cc28296dSAndrew Baumann 
17cc28296dSAndrew Baumann #include "hw/sysbus.h"
18*67d80321SZoltán Baldaszti #include "qemu/timer.h"
19cc28296dSAndrew Baumann 
20cc28296dSAndrew Baumann /* 4 mailboxes per core, for 16 total */
21cc28296dSAndrew Baumann #define BCM2836_NCORES 4
22cc28296dSAndrew Baumann #define BCM2836_MBPERCORE 4
23cc28296dSAndrew Baumann 
24cc28296dSAndrew Baumann #define TYPE_BCM2836_CONTROL "bcm2836-control"
25cc28296dSAndrew Baumann #define BCM2836_CONTROL(obj) \
26cc28296dSAndrew Baumann     OBJECT_CHECK(BCM2836ControlState, (obj), TYPE_BCM2836_CONTROL)
27cc28296dSAndrew Baumann 
28cc28296dSAndrew Baumann typedef struct BCM2836ControlState {
29cc28296dSAndrew Baumann     /*< private >*/
30cc28296dSAndrew Baumann     SysBusDevice busdev;
31cc28296dSAndrew Baumann     /*< public >*/
32cc28296dSAndrew Baumann     MemoryRegion iomem;
33cc28296dSAndrew Baumann 
34cc28296dSAndrew Baumann     /* mailbox state */
35cc28296dSAndrew Baumann     uint32_t mailboxes[BCM2836_NCORES * BCM2836_MBPERCORE];
36cc28296dSAndrew Baumann 
37cc28296dSAndrew Baumann     /* interrupt routing/control registers */
38cc28296dSAndrew Baumann     uint8_t route_gpu_irq, route_gpu_fiq;
39cc28296dSAndrew Baumann     uint32_t timercontrol[BCM2836_NCORES];
40cc28296dSAndrew Baumann     uint32_t mailboxcontrol[BCM2836_NCORES];
41cc28296dSAndrew Baumann 
42cc28296dSAndrew Baumann     /* interrupt status regs (derived from input pins; not visible to user) */
43cc28296dSAndrew Baumann     bool gpu_irq, gpu_fiq;
44cc28296dSAndrew Baumann     uint8_t timerirqs[BCM2836_NCORES];
45cc28296dSAndrew Baumann 
46*67d80321SZoltán Baldaszti     /* local timer */
47*67d80321SZoltán Baldaszti     QEMUTimer timer;
48*67d80321SZoltán Baldaszti     uint32_t local_timer_control;
49*67d80321SZoltán Baldaszti     uint8_t route_localtimer;
50*67d80321SZoltán Baldaszti 
51cc28296dSAndrew Baumann     /* interrupt source registers, post-routing (also input-derived; visible) */
52cc28296dSAndrew Baumann     uint32_t irqsrc[BCM2836_NCORES];
53cc28296dSAndrew Baumann     uint32_t fiqsrc[BCM2836_NCORES];
54cc28296dSAndrew Baumann 
55cc28296dSAndrew Baumann     /* outputs to CPU cores */
56cc28296dSAndrew Baumann     qemu_irq irq[BCM2836_NCORES];
57cc28296dSAndrew Baumann     qemu_irq fiq[BCM2836_NCORES];
58cc28296dSAndrew Baumann } BCM2836ControlState;
59cc28296dSAndrew Baumann 
60cc28296dSAndrew Baumann #endif
61