KVM: arm64: Fix clearing pvm firmware on init failure

When pKVM fails to initialise (for example, due to lack of IOMMU)
then the pvm firmware should be cleared. This was not happening:
Fix it.

Signed-off-by: Keir Fraser <keirf@google.com>
diff --git a/arch/arm64/kvm/pkvm.c b/arch/arm64/kvm/pkvm.c
index bd0100b..9b52ca9 100644
--- a/arch/arm64/kvm/pkvm.c
+++ b/arch/arm64/kvm/pkvm.c
@@ -312,12 +312,16 @@ static int __init pkvm_drop_host_privileges(void)
 	return ret;
 }
 
+static int __init pkvm_firmware_rmem_clear(void);
+
 static int __init finalize_pkvm(void)
 {
 	int ret;
 
-	if (!is_protected_kvm_enabled() || !is_kvm_arm_initialised())
+	if (!is_protected_kvm_enabled() || !is_kvm_arm_initialised()) {
+		pkvm_firmware_rmem_clear();
 		return 0;
+	}
 
 	/*
 	 * Exclude HYP sections from kmemleak so that they don't get peeked
@@ -328,8 +332,10 @@ static int __init finalize_pkvm(void)
 	kmemleak_free_part_phys(hyp_mem_base, hyp_mem_size);
 
 	ret = pkvm_drop_host_privileges();
-	if (ret)
+	if (ret) {
 		pr_err("Failed to finalize Hyp protection: %d\n", ret);
+		pkvm_firmware_rmem_clear();
+	}
 
 	return ret;
 }
@@ -377,10 +383,10 @@ static int __init pkvm_firmware_rmem_clear(void)
 	void *addr;
 	phys_addr_t size;
 
-	if (likely(!pkvm_firmware_mem) || is_protected_kvm_enabled())
+	if (likely(!pkvm_firmware_mem))
 		return 0;
 
-	kvm_info("Clearing unused pKVM firmware memory\n");
+	kvm_info("Clearing pKVM firmware memory\n");
 	size = pkvm_firmware_mem->size;
 	addr = memremap(pkvm_firmware_mem->base, size, MEMREMAP_WB);
 	if (!addr)
@@ -391,7 +397,6 @@ static int __init pkvm_firmware_rmem_clear(void)
 	memunmap(addr);
 	return 0;
 }
-device_initcall_sync(pkvm_firmware_rmem_clear);
 
 static int pkvm_vm_ioctl_set_fw_ipa(struct kvm *kvm, u64 ipa)
 {