]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
arm64/cpufeature: Optionally disable MTE via command-line
authorYee Lee <yee.lee@mediatek.com>
Tue, 3 Aug 2021 07:08:22 +0000 (15:08 +0800)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 3 Aug 2021 14:48:01 +0000 (15:48 +0100)
MTE support needs to be optionally disabled in runtime
for HW issue workaround, FW development and some
evaluation works on system resource and performance.

This patch makes two changes:
(1) moves init of tag-allocation bits(ATA/ATA0) to
cpu_enable_mte() as not cached in TLB.

(2) allows ID_AA64PFR1_EL1.MTE to be overridden on
its shadow value by giving "arm64.nomte" on cmdline.

When the feature value is off, ATA and TCF will not set
and the related functionalities are accordingly suppressed.

Suggested-by: Catalin Marinas <catalin.marinas@arm.com>
Suggested-by: Marc Zyngier <maz@kernel.org>
Suggested-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Yee Lee <yee.lee@mediatek.com>
Link: https://lore.kernel.org/r/20210803070824.7586-2-yee.lee@mediatek.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Documentation/admin-guide/kernel-parameters.txt
arch/arm64/include/asm/sysreg.h
arch/arm64/kernel/cpufeature.c
arch/arm64/kernel/idreg-override.c

index bdb22006f713fd3ca8f3566376191f3ae200713f..6f257e39d89e7ba2f54a37adae67bfb25766100b 100644 (file)
        arm64.nopauth   [ARM64] Unconditionally disable Pointer Authentication
                        support
 
+       arm64.nomte     [ARM64] Unconditionally disable Memory Tagging Extension
+                       support
+
        ataflop=        [HW,M68k]
 
        atarimouse=     [HW,MOUSE] Atari Mouse
index f6687f6f536b513c80d1e9dfbc0a555f3c39c37a..fc887399c68cd2e42340399f19c2f3b4c0126d85 100644 (file)
        (SCTLR_ELx_M    | SCTLR_ELx_C    | SCTLR_ELx_SA   | SCTLR_EL1_SA0   | \
         SCTLR_EL1_SED  | SCTLR_ELx_I    | SCTLR_EL1_DZE  | SCTLR_EL1_UCT   | \
         SCTLR_EL1_NTWE | SCTLR_ELx_IESB | SCTLR_EL1_SPAN | SCTLR_ELx_ITFSB | \
-        SCTLR_ELx_ATA  | SCTLR_EL1_ATA0 | ENDIAN_SET_EL1 | SCTLR_EL1_UCI   | \
-        SCTLR_EL1_EPAN | SCTLR_EL1_RES1)
+        ENDIAN_SET_EL1 | SCTLR_EL1_UCI  | SCTLR_EL1_EPAN | SCTLR_EL1_RES1)
 
 /* MAIR_ELx memory attributes (used by Linux) */
 #define MAIR_ATTR_DEVICE_nGnRnE                UL(0x00)
index 0ead8bfedf201fef16dd883aea788b9f86db1007..51e6bf4bb7b5b02aea75189591b62929c63540e2 100644 (file)
@@ -1843,6 +1843,9 @@ static void bti_enable(const struct arm64_cpu_capabilities *__unused)
 #ifdef CONFIG_ARM64_MTE
 static void cpu_enable_mte(struct arm64_cpu_capabilities const *cap)
 {
+       sysreg_clear_set(sctlr_el1, 0, SCTLR_ELx_ATA | SCTLR_EL1_ATA0);
+       isb();
+
        /*
         * Clear the tags in the zero page. This needs to be done via the
         * linear map which has the Tagged attribute.
index 53a381a7f65dd48b23ddd82246be7a59453d635b..d8e606fe3c21bcae2927a448214201cdc25b01d5 100644 (file)
@@ -54,6 +54,7 @@ static const struct ftr_set_desc pfr1 __initconst = {
        .override       = &id_aa64pfr1_override,
        .fields         = {
                { "bt", ID_AA64PFR1_BT_SHIFT },
+               { "mte", ID_AA64PFR1_MTE_SHIFT},
                {}
        },
 };
@@ -100,6 +101,7 @@ static const struct {
        { "arm64.nopauth",
          "id_aa64isar1.gpi=0 id_aa64isar1.gpa=0 "
          "id_aa64isar1.api=0 id_aa64isar1.apa=0"          },
+       { "arm64.nomte",                "id_aa64pfr1.mte=0" },
        { "nokaslr",                    "kaslr.disabled=1" },
 };