You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
9.6 KiB
265 lines
9.6 KiB
3 weeks ago
|
/* vxbArmGenIntCtlrV3.h - ARM Generic interrupt controller driver */
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it;
|
||
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef __INCvxbArmGenIntCtlrV3h
|
||
|
#define __INCvxbArmGenIntCtlrV3h
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C"{
|
||
|
#endif
|
||
|
|
||
|
#define GIC_VERSION_DEFAULT 2
|
||
|
#define GIC_VERSION_GIC400 3
|
||
|
|
||
|
/*
|
||
|
* the explanation of some abbreviations
|
||
|
*
|
||
|
* CPC - Cross Processor Call
|
||
|
* IPI - Inter Processor Interrupt
|
||
|
* GIC - General Interrupt Controller
|
||
|
* SGI - Software Generated Interrupt
|
||
|
* PPI - Private Peripheral Interrupt
|
||
|
* SPI - Shared Peripheral Interrupt
|
||
|
*/
|
||
|
|
||
|
/* MPCore GIC interrupt levels */
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI00 0 /* This is vxWorks CPC IPI */
|
||
|
#define INT_LVL_MPCORE_CPC INT_LVL_MPCORE_IPI00
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI01 1 /* This is vxWorks Debug IPI */
|
||
|
#define INT_LVL_MPCORE_DEBUG INT_LVL_MPCORE_IPI01
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI02 2 /* This is vxWorks Reschedule IPI */
|
||
|
#define INT_LVL_MPCORE_SCHED INT_LVL_MPCORE_IPI02
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI03 3 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI04 4 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI05 5 /* IPI -> use SWI register in GIC */
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI06 6 /* This is vxWorks Core Reset IPI */
|
||
|
#define INT_LVL_MPCORE_RESET INT_LVL_MPCORE_IPI06
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI07 7 /* This is vxWorks Core Start IPI */
|
||
|
#define INT_LVL_MPCORE_START INT_LVL_MPCORE_IPI07
|
||
|
|
||
|
#define INT_LVL_MPCORE_IPI08 8 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI09 9 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI10 10 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI11 11 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI12 12 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI13 13 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI14 14 /* IPI -> use SWI register in GIC */
|
||
|
#define INT_LVL_MPCORE_IPI15 15 /* IPI -> use SWI register in GIC */
|
||
|
|
||
|
|
||
|
#define SGI_INT_MAX 16
|
||
|
#define ARM_GIC_IPI_COUNT 16 /* MPCore IPI count */
|
||
|
#define SPI_START_INT_NUM 32 /* SPI start at ID32 */
|
||
|
#define PPI_START_INT_NUM 16 /* PPI start at ID16 */
|
||
|
#define GIC_INT_MAX_NUM 1020 /* GIC max interrupts count */
|
||
|
|
||
|
#define GIC_INT_ALL_ENABLED 0xFF /* priority 0-0xFF can run */
|
||
|
#define GIC_INT_ALL_DISABLED 0x00 /* nothing higher than 0 hence disabled */
|
||
|
#define GIC_INT_SPURIOUS 0x3FF /* no interrupt currently */
|
||
|
#define GIC_INT_ONEMINUS_HIGH 0x55555555 /* interrupt config to 1-N, High */
|
||
|
#define GIC_CPU_BINP_DEFAULT 0x07 /* split all priority to subpriority */
|
||
|
#define GIC_CPU_BINP_PREEMPT_VAL 0x00 /* split all priority to group-priority */
|
||
|
#define GIC_CPU_BINP_NONPREEMPT_VAL 0x07 /* split all priority to sub-priority */
|
||
|
#define GIC_CPU_CONTROL_ENABLE 0x1 /* enable the processor interface */
|
||
|
#define GIC_CPU_ALL_ENABLED 0xFF /* priority 0-E can run */
|
||
|
#define GIC_CPU_ALL_DISABLED 0x00 /* nothing higher than 0 */
|
||
|
#define GIC_SGI_SRC_CPU_ID_MASK 0x1C00
|
||
|
#define GIC_INT_HIGHEST_PRIORITY 0x0 /* the highest priority for interrupts */
|
||
|
#define GIC_INT_LOWEST_PRIORITY 0x1F /* the lowest priority for interrupts */
|
||
|
#define GIC_INT_PRIORITY_SHIFT 0x8
|
||
|
#define GIC_INT_PRIORITY_MASK 0xFF
|
||
|
#define GIC_INT_TRIGGER_SHIFT 0x2
|
||
|
|
||
|
#define GIC_CPU_DIR_DEFAULT 0x01010101 /* all interrupts are directed to CPU0 */
|
||
|
#define GIC_V3_CPU_DIR_DEFAULT 0x0llu /* all interrupts are directed to CPU0 */
|
||
|
#define GIC_CONTROL_ENABLE 0x01
|
||
|
|
||
|
#define ALL_PPI_INT_MASK 0xFFFF0000 /* bit field for all PPI interrupts */
|
||
|
#define ALL_SGI_INT_MASK 0x0000FFFF /* bit field for all SGI interrupts */
|
||
|
|
||
|
#define GIC_AFF_ALL_MASK 0xff00ffffff
|
||
|
#define GIC_AFF_LOW32_MASK 0x00ffffff
|
||
|
/* ARM GIC interrupt distributor and CPU interface register access macros */
|
||
|
|
||
|
#define SHIFT_PER_WORD 5
|
||
|
#define BITS_PER_WORD 32
|
||
|
#define CONFIGS_PER_WORD 16
|
||
|
#define PRIOS_PER_WORD 4
|
||
|
#define TARGETS_PER_WORD 4
|
||
|
#define NWORD(bitnum) (bitnum / 32)
|
||
|
#define BIT(bitnum) (1 << (bitnum % BITS_PER_WORD))
|
||
|
|
||
|
/* trigger modes */
|
||
|
|
||
|
#define GIC_TRIG_RISING_EDGE (0x1)
|
||
|
#define GIC_TRIG_FALLING_EDGE (0x2)
|
||
|
#define GIC_TRIG_ACTIVE_HIGH (0x4)
|
||
|
#define GIC_TRIG_ACTIVE_LOW (0x8)
|
||
|
|
||
|
/* SGI & PPI configuration for GIC 400 */
|
||
|
|
||
|
#define GIC_SGI_OFF (1 << 16)
|
||
|
#define GICR_ICFGR0 (0x0C00) /* SGI & PPI Configuration Register */
|
||
|
#define GICR_ICFGR1 (0x0C04) /* PPI Configuration Register */
|
||
|
#define GICR_ISENABLER0 (0x100)
|
||
|
#define GICR_ICENABLER0 (0x180)
|
||
|
|
||
|
/* SGI Configuration Register */
|
||
|
|
||
|
#define IMR (1 << (40 - 32))
|
||
|
#define ipiId_MASK (0xffff)
|
||
|
|
||
|
#define GICR_WAKER_CPU(cpu) ((volatile UINT32 *)(GIC_REDIST + cpu*(2<<16) + 0x14))
|
||
|
#define GICR_IntEnable_CPU(cpu) ((volatile UINT32 *)(GIC_SGI_BASE + cpu*(2<<16) +0x100))
|
||
|
#define GICR_IntEnClr_CPU(cpu) ((volatile UINT32 *)(GIC_SGI_BASE + cpu*(2<<16) + 0x180))
|
||
|
#define GICR_IntPendClr_CPU(cpu) ((volatile UINT32 *)(GIC_SGI_BASE + cpu*(2<<16) + 0x280))
|
||
|
#define GICR_Prio_CPU(cpu,Periph) ((volatile UINT32 *)(GIC_SGI_BASE+ cpu*(2<<16) + 0x400 + \
|
||
|
(0x4 * (Periph / PRIOS_PER_WORD))))
|
||
|
|
||
|
#define GICR_WAKER ((volatile UINT32 *)(GIC_REDIST + 0x14))
|
||
|
#define GICR_TYPERLO ((volatile UINT32 *)(GIC_REDIST + 0x8))
|
||
|
#define GICR_TYPERHI ((volatile UINT32 *)(GIC_REDIST + 0xC))
|
||
|
|
||
|
#define GICR_Config0 ((volatile UINT32 *)(GIC_SGI_BASE + 0xC00))
|
||
|
|
||
|
/* PPI Configuration Register */
|
||
|
|
||
|
#define GICR_Config1 ((volatile UINT32 *)(GIC_SGI_BASE + 0xC04))
|
||
|
|
||
|
/*Interrupt Group Register 0*/
|
||
|
|
||
|
#define GICR_IGROUPR0 ((volatile UINT32 *)(GIC_SGI_BASE + 0x80))
|
||
|
/* interrupt enable */
|
||
|
|
||
|
#define GICR_IntEnable ((volatile UINT32 *)(GIC_SGI_BASE + 0x100))
|
||
|
|
||
|
/* clear interrupt enable */
|
||
|
|
||
|
#define GICR_IntEnClr ((volatile UINT32 *)(GIC_SGI_BASE + 0x180))
|
||
|
|
||
|
/* set pending interrupt */
|
||
|
|
||
|
#define GICR_IntPendSet ((volatile UINT32 *)(GIC_SGI_BASE + 0x200))
|
||
|
|
||
|
/* clear pending interrupt */
|
||
|
|
||
|
#define GICR_IntPendClr ((volatile UINT32 *)(GIC_SGI_BASE + 0x280))
|
||
|
|
||
|
/* interrupt priority */
|
||
|
|
||
|
#define GICR_Prio(Periph) ((volatile UINT32 *)(GIC_SGI_BASE + 0x400 + \
|
||
|
(0x4 * (Periph / PRIOS_PER_WORD))))
|
||
|
#ifndef _ASMLANGUAGE
|
||
|
|
||
|
/* GIC distributor and CPU interface register base offsets */
|
||
|
|
||
|
#define GIC_REDIST (armGicBase + armGicReDistOffset)
|
||
|
#define GIC_SGI_BASE (armGicBase + armGicReDistOffset+ GIC_SGI_OFF)
|
||
|
#define GIC_DIST (armGicBase + armGicDistOffset)
|
||
|
#ifdef SUPPORT_GICC
|
||
|
#define GIC_CPU (armGicBase + armGicCpuOffset)
|
||
|
#endif
|
||
|
/* interrupt distributor control */
|
||
|
|
||
|
#define GIC_Control ((volatile UINT32 *)(GIC_DIST + 0x000))
|
||
|
|
||
|
/* interrupt distributor control */
|
||
|
|
||
|
#define GIC_SET_SPI ((volatile UINT32 *)(GIC_DIST + 0x040))
|
||
|
|
||
|
#define GIC_CL_SPI ((volatile UINT32 *)(GIC_DIST + 0x048))
|
||
|
|
||
|
/* interrupt controller type */
|
||
|
|
||
|
#define GIC_Type ((volatile UINT32 *)(GIC_DIST + 0x004))
|
||
|
|
||
|
/* interrupt enable */
|
||
|
|
||
|
#define GIC_IntEnable(Periph) ((volatile UINT32 *)(GIC_DIST + 0x100 + \
|
||
|
(0x4 * NWORD(Periph))))
|
||
|
/* clear interrupt enable */
|
||
|
|
||
|
#define GIC_IntEnClr(Periph) ((volatile UINT32 *)(GIC_DIST + 0x180 + \
|
||
|
(0x4 * NWORD(Periph))))
|
||
|
/* interrupt active status */
|
||
|
|
||
|
#define GIC_IntActSts(Periph) ((volatile UINT32 *)(GIC_DIST + 0x300 + \
|
||
|
(0x4 * NWORD(Periph))))
|
||
|
/* set pending interrupt */
|
||
|
|
||
|
#define GIC_IntPendSet(Periph) ((volatile UINT32 *)(GIC_DIST + 0x200 + \
|
||
|
(0x4 * NWORD(Periph))))
|
||
|
|
||
|
/* clear pending interrupt */
|
||
|
|
||
|
#define GIC_IntPendClr(Periph) ((volatile UINT32 *)(GIC_DIST + 0x280 + \
|
||
|
(0x4 * NWORD(Periph))))
|
||
|
/* interrupt configuration */
|
||
|
|
||
|
#define GIC_Config(Periph) ((volatile UINT32 *)(GIC_DIST + 0xC00 + \
|
||
|
(0x4 * (Periph / CONFIGS_PER_WORD))))
|
||
|
/* interrupt priority */
|
||
|
|
||
|
#define GIC_Prio(Periph) ((volatile UINT32 *)(GIC_DIST + 0x400 + \
|
||
|
(0x4 * (Periph / PRIOS_PER_WORD))))
|
||
|
/* CPU target */
|
||
|
|
||
|
#define GIC_CPUTarg(Periph) ((volatile UINT32 *)(GIC_DIST + 0x800 + \
|
||
|
(0x4 * (Periph / TARGETS_PER_WORD))))
|
||
|
|
||
|
/* Interrupt Routing */
|
||
|
|
||
|
#define GIC_IntRpute(Periph) ((volatile UINT64 *)(GIC_DIST + 0x6000 + \
|
||
|
(0x8 * (Periph))))
|
||
|
|
||
|
|
||
|
/* software interrupt generate */
|
||
|
|
||
|
#define GIC_SWInterrupt ((volatile UINT32 *)(GIC_DIST + 0xF00))
|
||
|
|
||
|
/* CPU interrupt control */
|
||
|
#ifdef SUPPORT_GICC
|
||
|
#define GIC_CPU_Control ((volatile UINT32 *)(GIC_CPU + 0x00))
|
||
|
|
||
|
/* CPU priority mask */
|
||
|
|
||
|
#define GIC_CPU_PriMask ((volatile UINT32 *)(GIC_CPU + 0x04))
|
||
|
|
||
|
/* CPU binary point */
|
||
|
|
||
|
#define GIC_CPU_BinPoint ((volatile UINT32 *)(GIC_CPU + 0x08))
|
||
|
|
||
|
/* CPU interrupt acknowledge */
|
||
|
|
||
|
#define GIC_CPU_IntAck ((volatile UINT32 *)(GIC_CPU + 0x0C))
|
||
|
|
||
|
/* CPU end of interrupt */
|
||
|
|
||
|
#define GIC_CPU_EOInt ((volatile UINT32 *)(GIC_CPU + 0x10))
|
||
|
|
||
|
/* CPU running priority */
|
||
|
|
||
|
#define GIC_CPU_RunPri ((volatile UINT32 *)(GIC_CPU + 0x14))
|
||
|
#endif
|
||
|
#endif /* _ASMLANGUAGE */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* __INCvxbArmGenIntCtlrV3h */
|