Files
seL4/include/drivers/irq/bcm2836-armctrl-ic.h
Gerwin Klein 40c4ad5112 arm: plat_SGITargetValid for non-GIC platforms
Provide an implementation of the header function plat_SGITargetValid
even for non-GIC platforms. This function will not be called, but
verification has a general lemma about it, and the default
implementation makes that lemma true without adding special cases.

Signed-off-by: Gerwin Klein <gerwin.klein@proofcraft.systems>
2025-10-10 14:36:43 +11:00

158 lines
6.6 KiB
C

/*
* Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#pragma once
#include <plat/machine/devices_gen.h>
#include <machine/io.h>
#include <machine/interrupt.h>
/* SGI not supported on this platform. */
#define NUM_SGIS 0
#define BASIC_IRQ_OFFSET 32
#define NORMAL_IRQ_OFFSET (BASIC_IRQ_OFFSET + 32)
enum {
INTERRUPT_CORE_CNTPSIRQ = 0,
INTERRUPT_CORE_CNTPNSIRQ = 1,
INTERRUPT_CORE_CNTHPIRQ = 2,
INTERRUPT_CORE_CNTVIRQ = 3,
INTERRUPT_CORE_MAILBOX_0 = 4,
INTERRUPT_CORE_MAILBOX_1 = 5,
INTERRUPT_CORE_MAILBOX_2 = 6,
INTERRUPT_CORE_MAILBOX_3 = 7,
INTERRUPT_CORE_GPU = 8,
INTERRUPT_CORE_PMU = 9,
INTERRUPT_CORE_AXI = 10,
INTERRUPT_CORE_LOCAL_TIMER = 11,
//17:12 Peripheral 1..15 interrupt (Currently not used)
//31:28 <Reserved>
INTERRUPT_BASIC_IRQ_ARM_TIMER = (BASIC_IRQ_OFFSET + 0),
INTERRUPT_BASIC_IRQ_ARM_MAILBOX = (BASIC_IRQ_OFFSET + 1),
INTERRUPT_BASIC_IRQ_ARM_DOORBELL0 = (BASIC_IRQ_OFFSET + 2),
INTERRUPT_BASIC_IRQ_ARM_DOORBELL1 = (BASIC_IRQ_OFFSET + 3),
INTERRUPT_BASIC_IRQ_GPU0_HALTED = (BASIC_IRQ_OFFSET + 4),
INTERRUPT_BASIC_IRQ_GPU1_HALTED = (BASIC_IRQ_OFFSET + 5),
INTERRUPT_BASIC_IRQ_ILLEGAL_ACCESS_TYPE1 = (BASIC_IRQ_OFFSET + 6),
INTERRUPT_BASIC_IRQ_ILLEGAL_ACCESS_TYPE0 = (BASIC_IRQ_OFFSET + 7),
INTERRUPT_BASIC_IRQ_PENDING_REGISTER1 = (BASIC_IRQ_OFFSET + 8),
INTERRUPT_BASIC_IRQ_PENDING_REGISTER2 = (BASIC_IRQ_OFFSET + 9),
INTERRUPT_BASIC_IRQ_GPU_IRQ_7 = (BASIC_IRQ_OFFSET + 10),
INTERRUPT_BASIC_IRQ_GPU_IRQ_9 = (BASIC_IRQ_OFFSET + 11),
INTERRUPT_BASIC_IRQ_GPU_IRQ_10 = (BASIC_IRQ_OFFSET + 12),
INTERRUPT_BASIC_IRQ_GPU_IRQ_18 = (BASIC_IRQ_OFFSET + 13),
INTERRUPT_BASIC_IRQ_GPU_IRQ_19 = (BASIC_IRQ_OFFSET + 14),
INTERRUPT_BASIC_IRQ_GPU_IRQ_53 = (BASIC_IRQ_OFFSET + 15),
INTERRUPT_BASIC_IRQ_GPU_IRQ_54 = (BASIC_IRQ_OFFSET + 16),
INTERRUPT_BASIC_IRQ_GPU_IRQ_55 = (BASIC_IRQ_OFFSET + 17),
INTERRUPT_BASIC_IRQ_GPU_IRQ_56 = (BASIC_IRQ_OFFSET + 18),
INTERRUPT_BASIC_IRQ_GPU_IRQ_57 = (BASIC_IRQ_OFFSET + 19),
INTERRUPT_BASIC_IRQ_GPU_IRQ_62 = (BASIC_IRQ_OFFSET + 20),
// 31:21 <unused>
INTERRUPT_IRQ_AUX = (NORMAL_IRQ_OFFSET + 29),
INTERRUPT_IRQ_I2C_SPI_SLV = (NORMAL_IRQ_OFFSET + 43),
INTERRUPT_IRQ_PWA0 = (NORMAL_IRQ_OFFSET + 45),
INTERRUPT_IRQ_PWA1 = (NORMAL_IRQ_OFFSET + 46),
INTERRUPT_IRQ_SMI = (NORMAL_IRQ_OFFSET + 48),
INTERRUPT_IRQ_GPIO0 = (NORMAL_IRQ_OFFSET + 49),
INTERRUPT_IRQ_GPIO1 = (NORMAL_IRQ_OFFSET + 50),
INTERRUPT_IRQ_GPIO2 = (NORMAL_IRQ_OFFSET + 51),
INTERRUPT_IRQ_GPIO3 = (NORMAL_IRQ_OFFSET + 52),
INTERRUPT_IRQ_I2C = (NORMAL_IRQ_OFFSET + 53),
INTERRUPT_IRQ_SPI = (NORMAL_IRQ_OFFSET + 54),
INTERRUPT_IRQ_PCM = (NORMAL_IRQ_OFFSET + 55),
INTERRUPT_IRQ_UART = (NORMAL_IRQ_OFFSET + 57),
};
#define FIQCTRL_FIQ_ENABLE BIT(7)
#define FIQCTRL_FIQ_SRC_GPU_IRQ(x) (x)
#define FIQCTRL_FIQ_SRC_ARM_TIMER 64
#define FIQCTRL_FIQ_SRC_ARM_MAILBOX 65
#define FIQCTRL_FIQ_SRC_ARM_DOORBELL0 66
#define FIQCTRL_FIQ_SRC_ARM_DOORBELL1 67
#define FIQCTRL_FIQ_SRC_GPU0_HALTED 68
#define FIQCTRL_FIQ_SRC_GPU1_HALTED 69
#define FIQCTRL_FIQ_SRC_ILLEGAL_ACCESS_TYPE1 70
#define FIQCTRL_FIQ_SRC_ILLEGAL_ACCESS_TYPE0 71
#define FIQCTRL_FIQ_SRC(src) (FIQCTRL_FIQ_SRC_##src)
volatile struct intc_regs {
uint32_t bfIRQBasicPending; /* 0x200 R */
uint32_t bfGPUIRQPending[2]; /* 0x204 R */
uint32_t FIQ_control; /* 0x20C R/W */
uint32_t bfEnableIRQs[2]; /* 0x210 R/Wbs */
uint32_t bfEnableBasicIRQs; /* 0x218 R/Wbs */
uint32_t bfDisableIRQs[2]; /* 0x21C R/Wbc */
uint32_t bfDisableBasicIRQs; /* 0x224 R/Wbc */
} *intc_regs = (volatile struct intc_regs *)INTC_PPTR;
volatile struct core_regs {
uint32_t controlRegister; /* 0x00 */
uint32_t unused0; /* 0x04 */
uint32_t coreTimerPrescaler; /* 0x08 */
uint32_t gpuInterruptsRouting; /* 0x0C */
uint32_t pmirSet; /* 0x10 */
uint32_t pmirClear; /* 0x14 */
uint32_t unused1; /* 0x18 */
uint32_t coreTimerAccessLS; /* 0x1C */
uint32_t coreTimerAccessMS; /* 0x20 */
uint32_t localInterrupt0Routing; /* 0x24 */
uint32_t unused2; /* 0x28 */
uint32_t axiOutstandingCounters; /* 0x2C */
uint32_t axiOutstandingIRQ; /* 0x30 */
uint32_t localTimerCtl; /* 0x34 */
uint32_t localTimerFlags; /* 0x38 */
uint32_t unused3; /* 0x3C */
uint32_t coreTimersIrqCtrl[4]; /* 0x40 Timers interrupt control registers */
uint32_t coreMailboxesIrqCtrl[4]; /* 0x50 Mailbox interrupt control */
uint32_t coreIRQSource[4]; /* 0x60 IRQ source registers */
uint32_t coreFIQSource[4]; /* 0x70 FIQ source registers */
uint32_t coreMailboxWriteset[4][4]; /* 0x80 Mailbox write-set registers (Write only) */
uint32_t coreMailboxRW[4][4]; /* 0xC0 Mailbox write-clear registers (Read & Write) */
} *core_regs = (volatile struct core_regs *) ARM_LOCAL_PPTR;
#define LOCAL_TIMER_IRQ_STATUS 31
#define LOCAL_TIMER_CTRL_IRQ_BIT 29
#define LOCAL_TIMER_CTRL_EN_BIT 28
#define LOCAL_TIMER_CTRL_RL_MASK MASK(28)
static const irq_t irqInvalid = 255;
static inline bool_t isIRQPending(void)
{
uint32_t pending;
pending = core_regs->coreIRQSource[0];
/* Mask out invalid bits */
pending &= MASK(12);
return pending != 0;
}
static inline void ackInterrupt(UNUSED irq_t irq)
{
/* No way to ACK an interrupt */
}
static inline void handleSpuriousIRQ(void)
{
/* Nothing to do here */
}
static inline void plat_sendSGI(word_t irq, word_t target)
{
/* Unreachable; not supported on this platform. */
halt();
}
static inline bool_t plat_SGITargetValid(word_t target)
{
/* no SGIs on this platform */
return false;
}