arch/arm: enable eoimode only select CONFIG_XXX_GIC_EOIMODE
On a GICv2 implementation, setting GICC_CTLR.EOImode to 1 separates the priority drop and interrupt deactivation operations. Signed-off-by: zhangyuan21 <zhangyuan21@xiaomi.com>
This commit is contained in:
parent
c239d19df0
commit
024b13f3ed
@ -13,6 +13,17 @@ config ARMV7A_HAVE_GICv2
|
|||||||
Selected by the configuration tool if the architecture supports the
|
Selected by the configuration tool if the architecture supports the
|
||||||
Generic Interrupt Controller (GIC)
|
Generic Interrupt Controller (GIC)
|
||||||
|
|
||||||
|
if ARMV7A_HAVE_GICv2
|
||||||
|
|
||||||
|
config ARMV7A_GIC_EOIMODE
|
||||||
|
bool "Enable GIC EOImode"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable GICC_CTLR.EOImode, this will separates the priority drop and interrupt
|
||||||
|
deactivation operations.
|
||||||
|
|
||||||
|
endif # ARMV7A_HAVE_GICv2
|
||||||
|
|
||||||
config ARMV7A_HAVE_GTM
|
config ARMV7A_HAVE_GTM
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
@ -244,16 +244,17 @@ void arm_gic_initialize(void)
|
|||||||
iccicr |= GIC_ICCICRS_CBPR;
|
iccicr |= GIC_ICCICRS_CBPR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
#ifdef CONFIG_ARMV7A_GIC_EOIMODE
|
||||||
|
# if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in secure state.
|
* NOTE: Only for processors that operate in secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODES;
|
iccicr |= GIC_ICCICRS_EOIMODES;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
# if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
@ -261,13 +262,14 @@ void arm_gic_initialize(void)
|
|||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODENS;
|
iccicr |= GIC_ICCICRS_EOIMODENS;
|
||||||
|
|
||||||
#elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
# elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRU_EOIMODENS;
|
iccicr |= GIC_ICCICRU_EOIMODENS;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
||||||
@ -370,6 +372,10 @@ uint32_t *arm_decodeirq(uint32_t *regs)
|
|||||||
regval = getreg32(GIC_ICCIAR);
|
regval = getreg32(GIC_ICCIAR);
|
||||||
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARMV7A_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
||||||
* interrupt.
|
* interrupt.
|
||||||
*/
|
*/
|
||||||
@ -384,7 +390,11 @@ uint32_t *arm_decodeirq(uint32_t *regs)
|
|||||||
|
|
||||||
/* Write to the end-of-interrupt register */
|
/* Write to the end-of-interrupt register */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARMV7A_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCDIR);
|
||||||
|
#else
|
||||||
putreg32(regval, GIC_ICCEOIR);
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
return regs;
|
return regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,17 @@ config ARMV7R_HAVE_GICv2
|
|||||||
Selected by the configuration tool if the architecture supports the
|
Selected by the configuration tool if the architecture supports the
|
||||||
Generic Interrupt Controller (GIC)
|
Generic Interrupt Controller (GIC)
|
||||||
|
|
||||||
|
if ARMV7R_HAVE_GICv2
|
||||||
|
|
||||||
|
config ARMV7R_GIC_EOIMODE
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable GICC_CTLR.EOImode, this will separates the priority drop and interrupt
|
||||||
|
deactivation operations.
|
||||||
|
|
||||||
|
endif # ARMV7R_GIC_EOIMODE
|
||||||
|
|
||||||
config ARMV7R_HAVE_PTM
|
config ARMV7R_HAVE_PTM
|
||||||
bool
|
bool
|
||||||
default n
|
default n
|
||||||
|
@ -228,16 +228,17 @@ void arm_gic_initialize(void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
#ifdef CONFIG_ARMV7R_GIC_EOIMODE
|
||||||
|
# if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in secure state.
|
* NOTE: Only for processors that operate in secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODES;
|
iccicr |= GIC_ICCICRS_EOIMODES;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
# if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
@ -245,13 +246,14 @@ void arm_gic_initialize(void)
|
|||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODENS;
|
iccicr |= GIC_ICCICRS_EOIMODENS;
|
||||||
|
|
||||||
#elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
# elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRU_EOIMODENS;
|
iccicr |= GIC_ICCICRU_EOIMODENS;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
||||||
@ -343,6 +345,10 @@ uint32_t *arm_decodeirq(uint32_t *regs)
|
|||||||
regval = getreg32(GIC_ICCIAR);
|
regval = getreg32(GIC_ICCIAR);
|
||||||
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARMV7R_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
||||||
* interrupt.
|
* interrupt.
|
||||||
*/
|
*/
|
||||||
@ -357,7 +363,11 @@ uint32_t *arm_decodeirq(uint32_t *regs)
|
|||||||
|
|
||||||
/* Write to the end-of-interrupt register */
|
/* Write to the end-of-interrupt register */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARMV7R_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCDIR);
|
||||||
|
#else
|
||||||
putreg32(regval, GIC_ICCEOIR);
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
return regs;
|
return regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +203,17 @@ config ARM_GIC_VERSION
|
|||||||
Version of Generic Interrupt Controller (GIC) supported by the
|
Version of Generic Interrupt Controller (GIC) supported by the
|
||||||
architecture
|
architecture
|
||||||
|
|
||||||
|
if ARM_GIC_VERSION = 2
|
||||||
|
|
||||||
|
config ARM_GIC_EOIMODE
|
||||||
|
bool
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
Enable GICC_CTLR.EOImode, this will separates the priority drop and interrupt
|
||||||
|
deactivation operations.
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
if ARCH_CHIP_A64
|
if ARCH_CHIP_A64
|
||||||
source "arch/arm64/src/a64/Kconfig"
|
source "arch/arm64/src/a64/Kconfig"
|
||||||
endif
|
endif
|
||||||
|
@ -952,16 +952,17 @@ static void arm_gic_initialize(void)
|
|||||||
iccicr |= GIC_ICCICRS_CBPR;
|
iccicr |= GIC_ICCICRS_CBPR;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
#ifdef CONFIG_ARM_GIC_EOIMODE
|
||||||
|
# if defined(CONFIG_ARCH_TRUSTZONE_SECURE) || defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
/* Set EnableS=1 to enable CPU interface to signal secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in secure state.
|
* NOTE: Only for processors that operate in secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODES;
|
iccicr |= GIC_ICCICRS_EOIMODES;
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
# if defined(CONFIG_ARCH_TRUSTZONE_NONSECURE)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
@ -969,13 +970,14 @@ static void arm_gic_initialize(void)
|
|||||||
|
|
||||||
iccicr |= GIC_ICCICRS_EOIMODENS;
|
iccicr |= GIC_ICCICRS_EOIMODENS;
|
||||||
|
|
||||||
#elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
# elif defined(CONFIG_ARCH_TRUSTZONE_BOTH)
|
||||||
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
/* Set EnableNS=1 to enable the CPU to signal non-secure interrupts.
|
||||||
*
|
*
|
||||||
* NOTE: Only for processors that operate in non-secure state.
|
* NOTE: Only for processors that operate in non-secure state.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
iccicr |= GIC_ICCICRU_EOIMODENS;
|
iccicr |= GIC_ICCICRU_EOIMODENS;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
#ifdef CONFIG_ARCH_TRUSTZONE_BOTH
|
||||||
@ -1081,6 +1083,10 @@ uint64_t * arm64_decodeirq(uint64_t * regs)
|
|||||||
regval = getreg32(GIC_ICCIAR);
|
regval = getreg32(GIC_ICCIAR);
|
||||||
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
irq = (regval & GIC_ICCIAR_INTID_MASK) >> GIC_ICCIAR_INTID_SHIFT;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
/* Ignore spurions IRQs. ICCIAR will report 1023 if there is no pending
|
||||||
* interrupt.
|
* interrupt.
|
||||||
*/
|
*/
|
||||||
@ -1095,7 +1101,11 @@ uint64_t * arm64_decodeirq(uint64_t * regs)
|
|||||||
|
|
||||||
/* Write to the end-of-interrupt register */
|
/* Write to the end-of-interrupt register */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM_GIC_EOIMODE
|
||||||
|
putreg32(regval, GIC_ICCDIR);
|
||||||
|
#else
|
||||||
putreg32(regval, GIC_ICCEOIR);
|
putreg32(regval, GIC_ICCEOIR);
|
||||||
|
#endif
|
||||||
return regs;
|
return regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user