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