diff options
author | Florian Lugou <florian.lugou@provenrun.com> | 2021-09-08 12:40:24 +0200 |
---|---|---|
committer | Florian Lugou <florian.lugou@provenrun.com> | 2022-09-14 16:08:29 +0200 |
commit | dcb31ff79096fc88b45df8068e5de83b93f833ed (patch) | |
tree | 22d7dd734bfeeb614027d064e5cf77f435941700 /include | |
parent | 28a28511c47bc9c6ccd8aacbe47098e9db34ebd5 (diff) | |
download | arm-trusted-firmware-dcb31ff79096fc88b45df8068e5de83b93f833ed.tar.gz |
feat(gic): add APIs to raise NS and S-EL1 SGIs
This patch adds two helper functions:
- plat_ic_raise_ns_sgi to raise a NS SGI
- plat_ic_raise_s_el1_sgi to raise a S-EL1 SGI
Signed-off-by: Florian Lugou <florian.lugou@provenrun.com>
Change-Id: I6f262dd1da1d77fec3f850eb74189e726b8e24da
Diffstat (limited to 'include')
-rw-r--r-- | include/arch/aarch32/arch_helpers.h | 4 | ||||
-rw-r--r-- | include/arch/aarch64/arch.h | 1 | ||||
-rw-r--r-- | include/arch/aarch64/arch_helpers.h | 1 | ||||
-rw-r--r-- | include/drivers/arm/gicv2.h | 8 | ||||
-rw-r--r-- | include/drivers/arm/gicv3.h | 9 | ||||
-rw-r--r-- | include/plat/common/platform.h | 2 |
6 files changed, 22 insertions, 3 deletions
diff --git a/include/arch/aarch32/arch_helpers.h b/include/arch/aarch32/arch_helpers.h index 033098915..95d056f45 100644 --- a/include/arch/aarch32/arch_helpers.h +++ b/include/arch/aarch32/arch_helpers.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2021, ARM Limited and Contributors. All rights reserved. + * Portions copyright (c) 2021-2022, ProvenRun S.A.S. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -282,6 +283,7 @@ DEFINE_COPROCR_RW_FUNCS(icc_eoir0_el1, ICC_EOIR0) DEFINE_COPROCR_RW_FUNCS(icc_eoir1_el1, ICC_EOIR1) DEFINE_COPROCR_RW_FUNCS_64(icc_sgi0r_el1, ICC_SGI0R_EL1_64) DEFINE_COPROCR_WRITE_FUNC_64(icc_sgi1r, ICC_SGI1R_EL1_64) +DEFINE_COPROCR_WRITE_FUNC_64(icc_asgi1r, ICC_ASGI1R_EL1_64) DEFINE_COPROCR_RW_FUNCS(sdcr, SDCR) DEFINE_COPROCR_RW_FUNCS(hdcr, HDCR) @@ -402,6 +404,8 @@ static inline unsigned int get_current_el(void) #define read_ctr_el0() read_ctr() #define write_icc_sgi0r_el1(_v) write64_icc_sgi0r_el1(_v) +#define write_icc_sgi1r(_v) write64_icc_sgi1r(_v) +#define write_icc_asgi1r(_v) write64_icc_asgi1r(_v) #define read_daif() read_cpsr() #define write_daif(flags) write_cpsr(flags) diff --git a/include/arch/aarch64/arch.h b/include/arch/aarch64/arch.h index 3a2a032fd..8d3e31db0 100644 --- a/include/arch/aarch64/arch.h +++ b/include/arch/aarch64/arch.h @@ -79,6 +79,7 @@ ******************************************************************************/ #define ICC_IGRPEN1_EL1 S3_0_C12_C12_7 #define ICC_SGI1R S3_0_C12_C11_5 +#define ICC_ASGI1R S3_0_C12_C11_6 #define ICC_SRE_EL1 S3_0_C12_C12_5 #define ICC_SRE_EL2 S3_4_C12_C9_5 #define ICC_SRE_EL3 S3_6_C12_C12_5 diff --git a/include/arch/aarch64/arch_helpers.h b/include/arch/aarch64/arch_helpers.h index 10b0a0b97..8c6155400 100644 --- a/include/arch/aarch64/arch_helpers.h +++ b/include/arch/aarch64/arch_helpers.h @@ -492,6 +492,7 @@ DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir0_el1, ICC_EOIR0_EL1) DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_eoir1_el1, ICC_EOIR1_EL1) DEFINE_RENAME_SYSREG_WRITE_FUNC(icc_sgi0r_el1, ICC_SGI0R_EL1) DEFINE_RENAME_SYSREG_RW_FUNCS(icc_sgi1r, ICC_SGI1R) +DEFINE_RENAME_SYSREG_RW_FUNCS(icc_asgi1r, ICC_ASGI1R) DEFINE_RENAME_SYSREG_READ_FUNC(amcfgr_el0, AMCFGR_EL0) DEFINE_RENAME_SYSREG_READ_FUNC(amcgcr_el0, AMCGCR_EL0) diff --git a/include/drivers/arm/gicv2.h b/include/drivers/arm/gicv2.h index b960194db..cfc168d5b 100644 --- a/include/drivers/arm/gicv2.h +++ b/include/drivers/arm/gicv2.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. + * Portions copyright (c) 2021-2022, ProvenRun S.A.S. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -50,13 +51,15 @@ #define SGIR_TGTLSTFLT_MASK U(0x3) #define SGIR_TGTLST_SHIFT 16 #define SGIR_TGTLST_MASK U(0xff) +#define SGIR_NSATT (U(0x1) << 16) #define SGIR_INTID_MASK ULL(0xf) #define SGIR_TGT_SPECIFIC U(0) -#define GICV2_SGIR_VALUE(tgt_lst_flt, tgt, intid) \ +#define GICV2_SGIR_VALUE(tgt_lst_flt, tgt, nsatt, intid) \ ((((tgt_lst_flt) & SGIR_TGTLSTFLT_MASK) << SGIR_TGTLSTFLT_SHIFT) | \ (((tgt) & SGIR_TGTLST_MASK) << SGIR_TGTLST_SHIFT) | \ + ((nsatt) ? SGIR_NSATT : U(0)) | \ ((intid) & SGIR_INTID_MASK)) /******************************************************************************* @@ -127,6 +130,7 @@ #ifndef __ASSEMBLER__ #include <cdefs.h> +#include <stdbool.h> #include <stdint.h> #include <common/interrupt_props.h> @@ -185,7 +189,7 @@ void gicv2_enable_interrupt(unsigned int id); void gicv2_disable_interrupt(unsigned int id); void gicv2_set_interrupt_priority(unsigned int id, unsigned int priority); void gicv2_set_interrupt_type(unsigned int id, unsigned int type); -void gicv2_raise_sgi(int sgi_num, int proc_num); +void gicv2_raise_sgi(int sgi_num, bool ns, int proc_num); void gicv2_set_spi_routing(unsigned int id, int proc_num); void gicv2_set_interrupt_pending(unsigned int id); void gicv2_clear_interrupt_pending(unsigned int id); diff --git a/include/drivers/arm/gicv3.h b/include/drivers/arm/gicv3.h index 8371dd529..1c71149b2 100644 --- a/include/drivers/arm/gicv3.h +++ b/include/drivers/arm/gicv3.h @@ -354,6 +354,12 @@ #include <drivers/arm/gic_common.h> #include <lib/utils_def.h> +typedef enum { + GICV3_G1S, + GICV3_G1NS, + GICV3_G0 +} gicv3_irq_group_t; + static inline uintptr_t gicv3_redist_size(uint64_t typer_val) { #if GIC_ENABLE_V4_EXTN @@ -575,7 +581,8 @@ void gicv3_set_interrupt_priority(unsigned int id, unsigned int proc_num, unsigned int priority); void gicv3_set_interrupt_type(unsigned int id, unsigned int proc_num, unsigned int type); -void gicv3_raise_secure_g0_sgi(unsigned int sgi_num, u_register_t target); +void gicv3_raise_sgi(unsigned int sgi_num, gicv3_irq_group_t group, + u_register_t target); void gicv3_set_spi_routing(unsigned int id, unsigned int irm, u_register_t mpidr); void gicv3_set_interrupt_pending(unsigned int id, unsigned int proc_num); diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h index 184606a12..31607c2e9 100644 --- a/include/plat/common/platform.h +++ b/include/plat/common/platform.h @@ -104,6 +104,8 @@ int plat_ic_has_interrupt_type(unsigned int type); void plat_ic_set_interrupt_type(unsigned int id, unsigned int type); void plat_ic_set_interrupt_priority(unsigned int id, unsigned int priority); void plat_ic_raise_el3_sgi(int sgi_num, u_register_t target); +void plat_ic_raise_ns_sgi(int sgi_num, u_register_t target); +void plat_ic_raise_s_el1_sgi(int sgi_num, u_register_t target); void plat_ic_set_spi_routing(unsigned int id, unsigned int routing_mode, u_register_t mpidr); void plat_ic_set_interrupt_pending(unsigned int id); |