arm64: rsi: Map unprotected MMIO as decrypted
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 17 Oct 2024 13:14:28 +0000 (14:14 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Wed, 23 Oct 2024 09:19:32 +0000 (10:19 +0100)
Instead of marking every MMIO as shared, check if the given region is
"Protected" and apply the permissions accordingly.

Reviewed-by: Gavin Shan <gshan@redhat.com>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Steven Price <steven.price@arm.com>
Link: https://lore.kernel.org/r/20241017131434.40935-6-steven.price@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/rsi.c

index 7e7934c4fca04f359865c3201382f2ed50bb5503..3e0c83e2296f50356d84f76cceac4d89794eaf45 100644 (file)
@@ -6,6 +6,8 @@
 #include <linux/jump_label.h>
 #include <linux/memblock.h>
 #include <linux/psci.h>
+
+#include <asm/io.h>
 #include <asm/rsi.h>
 
 static struct realm_config config;
@@ -93,6 +95,16 @@ bool __arm64_is_protected_mmio(phys_addr_t base, size_t size)
 }
 EXPORT_SYMBOL(__arm64_is_protected_mmio);
 
+static int realm_ioremap_hook(phys_addr_t phys, size_t size, pgprot_t *prot)
+{
+       if (__arm64_is_protected_mmio(phys, size))
+               *prot = pgprot_encrypted(*prot);
+       else
+               *prot = pgprot_decrypted(*prot);
+
+       return 0;
+}
+
 void __init arm64_rsi_init(void)
 {
        if (arm_smccc_1_1_get_conduit() != SMCCC_CONDUIT_SMC)
@@ -103,6 +115,9 @@ void __init arm64_rsi_init(void)
                return;
        prot_ns_shared = BIT(config.ipa_bits - 1);
 
+       if (arm64_ioremap_prot_hook_register(realm_ioremap_hook))
+               return;
+
        arm64_rsi_setup_memory();
 
        static_branch_enable(&rsi_present);