[PATCH v6 03/12] arm64/mte: Make TCF field values and naming more standard
Mark Rutland
mark.rutland at arm.com
Wed May 4 06:26:47 PDT 2022
On Tue, May 03, 2022 at 06:02:24PM +0100, Mark Brown wrote:
> In preparation for automatic generation of the defines for system registers
> make the values used for the enumeration in SCTLR_ELx.TCF suitable for use
> with the newly defined SYS_FIELD_PREP_ENUM helper, removing the shift from
> the define and using the helper to generate it on use instead. Since we
> only ever interact with this field in EL1 and in preparation for generation
> of the defines also rename from SCTLR_ELx to SCTLR_EL1. SCTLR_EL2 is not
> quite the same as SCTLR_EL1 so the conversion does not share the field
> definitions.
>
> There should be no functional change from this patch.
>
> Signed-off-by: Mark Brown <broonie at kernel.org>
Acked-by: Mark Rutland <mark.rutland at arm.com>
Mark.
> ---
> arch/arm64/include/asm/sysreg.h | 14 +++++++-------
> arch/arm64/kernel/mte.c | 9 +++++----
> arch/arm64/mm/fault.c | 3 ++-
> 3 files changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
> index 6dc840be0268..732d84111d9f 100644
> --- a/arch/arm64/include/asm/sysreg.h
> +++ b/arch/arm64/include/asm/sysreg.h
> @@ -631,13 +631,6 @@
> #define SCTLR_ELx_DSSBS (BIT(44))
> #define SCTLR_ELx_ATA (BIT(43))
>
> -#define SCTLR_ELx_TCF_SHIFT 40
> -#define SCTLR_ELx_TCF_NONE (UL(0x0) << SCTLR_ELx_TCF_SHIFT)
> -#define SCTLR_ELx_TCF_SYNC (UL(0x1) << SCTLR_ELx_TCF_SHIFT)
> -#define SCTLR_ELx_TCF_ASYNC (UL(0x2) << SCTLR_ELx_TCF_SHIFT)
> -#define SCTLR_ELx_TCF_ASYMM (UL(0x3) << SCTLR_ELx_TCF_SHIFT)
> -#define SCTLR_ELx_TCF_MASK (UL(0x3) << SCTLR_ELx_TCF_SHIFT)
> -
> #define SCTLR_ELx_ENIA_SHIFT 31
>
> #define SCTLR_ELx_ITFSB (BIT(37))
> @@ -677,6 +670,13 @@
> #define SCTLR_EL1_EPAN (BIT(57))
> #define SCTLR_EL1_ATA0 (BIT(42))
>
> +#define SCTLR_EL1_TCF_SHIFT 40
> +#define SCTLR_EL1_TCF_NONE (UL(0x0))
> +#define SCTLR_EL1_TCF_SYNC (UL(0x1))
> +#define SCTLR_EL1_TCF_ASYNC (UL(0x2))
> +#define SCTLR_EL1_TCF_ASYMM (UL(0x3))
> +#define SCTLR_EL1_TCF_MASK (UL(0x3) << SCTLR_EL1_TCF_SHIFT)
> +
> #define SCTLR_EL1_TCF0_SHIFT 38
> #define SCTLR_EL1_TCF0_NONE (UL(0x0))
> #define SCTLR_EL1_TCF0_SYNC (UL(0x1))
> diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c
> index 41469b69a48e..98f5e1e13c36 100644
> --- a/arch/arm64/kernel/mte.c
> +++ b/arch/arm64/kernel/mte.c
> @@ -106,7 +106,8 @@ int memcmp_pages(struct page *page1, struct page *page2)
> static inline void __mte_enable_kernel(const char *mode, unsigned long tcf)
> {
> /* Enable MTE Sync Mode for EL1. */
> - sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, tcf);
> + sysreg_clear_set(sctlr_el1, SCTLR_EL1_TCF_MASK,
> + SYS_FIELD_PREP(SCTLR_EL1, TCF, tcf));
> isb();
>
> pr_info_once("MTE: enabled in %s mode at EL1\n", mode);
> @@ -122,12 +123,12 @@ void mte_enable_kernel_sync(void)
> WARN_ONCE(system_uses_mte_async_or_asymm_mode(),
> "MTE async mode enabled system wide!");
>
> - __mte_enable_kernel("synchronous", SCTLR_ELx_TCF_SYNC);
> + __mte_enable_kernel("synchronous", SCTLR_EL1_TCF_SYNC);
> }
>
> void mte_enable_kernel_async(void)
> {
> - __mte_enable_kernel("asynchronous", SCTLR_ELx_TCF_ASYNC);
> + __mte_enable_kernel("asynchronous", SCTLR_EL1_TCF_ASYNC);
>
> /*
> * MTE async mode is set system wide by the first PE that
> @@ -144,7 +145,7 @@ void mte_enable_kernel_async(void)
> void mte_enable_kernel_asymm(void)
> {
> if (cpus_have_cap(ARM64_MTE_ASYMM)) {
> - __mte_enable_kernel("asymmetric", SCTLR_ELx_TCF_ASYMM);
> + __mte_enable_kernel("asymmetric", SCTLR_EL1_TCF_ASYMM);
>
> /*
> * MTE asymm mode behaves as async mode for store
> diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
> index 77341b160aca..5e280cc566ca 100644
> --- a/arch/arm64/mm/fault.c
> +++ b/arch/arm64/mm/fault.c
> @@ -335,7 +335,8 @@ static void do_tag_recovery(unsigned long addr, unsigned int esr,
> * It will be done lazily on the other CPUs when they will hit a
> * tag fault.
> */
> - sysreg_clear_set(sctlr_el1, SCTLR_ELx_TCF_MASK, SCTLR_ELx_TCF_NONE);
> + sysreg_clear_set(sctlr_el1, SCTLR_EL1_TCF_MASK,
> + SYS_FIELD_PREP_ENUM(SCTLR_EL1, TCF, NONE));
> isb();
> }
>
> --
> 2.30.2
>
More information about the linux-arm-kernel
mailing list