From: "Tycho Andersen (AMD)" <tycho@kernel.org>
In preparation for delayed SNP initialization, create a function
snp_prepare_for_snp_init() that does the necessary architecture setup.
Export this function for the ccp module to allow it to do the setup as
necessary.
Also move {mfd,snp}_enable out of the __init section, since these will be
called later.
Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
---
arch/x86/include/asm/sev.h | 2 ++
arch/x86/virt/svm/sev.c | 46 ++++++++++++++++++++++----------------
2 files changed, 29 insertions(+), 19 deletions(-)
diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h
index 0e6c0940100f..0bcd89d4fe90 100644
--- a/arch/x86/include/asm/sev.h
+++ b/arch/x86/include/asm/sev.h
@@ -661,6 +661,7 @@ static inline void snp_leak_pages(u64 pfn, unsigned int pages)
{
__snp_leak_pages(pfn, pages, true);
}
+void snp_prepare_for_snp_init(void);
#else
static inline bool snp_probe_rmptable_info(void) { return false; }
static inline int snp_rmptable_init(void) { return -ENOSYS; }
@@ -677,6 +678,7 @@ static inline void __snp_leak_pages(u64 pfn, unsigned int npages, bool dump_rmp)
static inline void snp_leak_pages(u64 pfn, unsigned int npages) {}
static inline void kdump_sev_callback(void) { }
static inline void snp_fixup_e820_tables(void) {}
+static inline void snp_prepare_for_snp_init(void) {}
#endif
#endif
diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
index 258e67ba7415..8f50538baf7b 100644
--- a/arch/x86/virt/svm/sev.c
+++ b/arch/x86/virt/svm/sev.c
@@ -132,7 +132,7 @@ static unsigned long snp_nr_leaked_pages;
#undef pr_fmt
#define pr_fmt(fmt) "SEV-SNP: " fmt
-static __init void mfd_enable(void *arg)
+static void mfd_enable(void *arg)
{
u64 val;
@@ -146,7 +146,7 @@ static __init void mfd_enable(void *arg)
wrmsrq(MSR_AMD64_SYSCFG, val);
}
-static __init void snp_enable(void *arg)
+static void snp_enable(void *arg)
{
u64 val;
@@ -509,6 +509,30 @@ static bool __init setup_rmptable(void)
return true;
}
+void snp_prepare_for_snp_init(void)
+{
+ u64 val;
+
+ /*
+ * Check if SEV-SNP is already enabled, this can happen in case of
+ * kexec boot.
+ */
+ rdmsrq(MSR_AMD64_SYSCFG, val);
+ if (val & MSR_AMD64_SYSCFG_SNP_EN)
+ return;
+
+ snp_clear_rmp();
+
+ /*
+ * MtrrFixDramModEn is not shared between threads on a core,
+ * therefore it must be set on all CPUs prior to enabling SNP.
+ */
+ on_each_cpu(mfd_enable, NULL, 1);
+
+ on_each_cpu(snp_enable, NULL, 1);
+}
+EXPORT_SYMBOL_FOR_MODULES(snp_prepare_for_snp_init, "ccp");
+
/*
* Do the necessary preparations which are verified by the firmware as
* described in the SNP_INIT_EX firmware command description in the SNP
@@ -516,8 +540,6 @@ static bool __init setup_rmptable(void)
*/
int __init snp_rmptable_init(void)
{
- u64 val;
-
if (WARN_ON_ONCE(!cc_platform_has(CC_ATTR_HOST_SEV_SNP)))
return -ENOSYS;
@@ -527,22 +549,8 @@ int __init snp_rmptable_init(void)
if (!setup_rmptable())
return -ENOSYS;
- /*
- * Check if SEV-SNP is already enabled, this can happen in case of
- * kexec boot.
- */
- rdmsrq(MSR_AMD64_SYSCFG, val);
- if (val & MSR_AMD64_SYSCFG_SNP_EN)
- goto skip_enable;
-
- snp_clear_rmp();
-
- /* MtrrFixDramModEn must be enabled on all the CPUs prior to enabling SNP. */
- on_each_cpu(mfd_enable, NULL, 1);
-
- on_each_cpu(snp_enable, NULL, 1);
+ snp_prepare_for_snp_init();
-skip_enable:
/*
* Setting crash_kexec_post_notifiers to 'true' to ensure that SNP panic
* notifier is invoked to do SNP IOMMU shutdown before kdump.
--
2.53.0
On 3/2/26 13:13, Tycho Andersen wrote:
> From: "Tycho Andersen (AMD)" <tycho@kernel.org>
>
> In preparation for delayed SNP initialization, create a function
> snp_prepare_for_snp_init() that does the necessary architecture setup.
> Export this function for the ccp module to allow it to do the setup as
> necessary.
>
> Also move {mfd,snp}_enable out of the __init section, since these will be
> called later.
>
> Signed-off-by: Tycho Andersen (AMD) <tycho@kernel.org>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
> ---
> arch/x86/include/asm/sev.h | 2 ++
> arch/x86/virt/svm/sev.c | 46 ++++++++++++++++++++++----------------
> 2 files changed, 29 insertions(+), 19 deletions(-)
>
> diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h
> index 0e6c0940100f..0bcd89d4fe90 100644
> --- a/arch/x86/include/asm/sev.h
> +++ b/arch/x86/include/asm/sev.h
> @@ -661,6 +661,7 @@ static inline void snp_leak_pages(u64 pfn, unsigned int pages)
> {
> __snp_leak_pages(pfn, pages, true);
> }
> +void snp_prepare_for_snp_init(void);
> #else
> static inline bool snp_probe_rmptable_info(void) { return false; }
> static inline int snp_rmptable_init(void) { return -ENOSYS; }
> @@ -677,6 +678,7 @@ static inline void __snp_leak_pages(u64 pfn, unsigned int npages, bool dump_rmp)
> static inline void snp_leak_pages(u64 pfn, unsigned int npages) {}
> static inline void kdump_sev_callback(void) { }
> static inline void snp_fixup_e820_tables(void) {}
> +static inline void snp_prepare_for_snp_init(void) {}
> #endif
>
> #endif
> diff --git a/arch/x86/virt/svm/sev.c b/arch/x86/virt/svm/sev.c
> index 258e67ba7415..8f50538baf7b 100644
> --- a/arch/x86/virt/svm/sev.c
> +++ b/arch/x86/virt/svm/sev.c
> @@ -132,7 +132,7 @@ static unsigned long snp_nr_leaked_pages;
> #undef pr_fmt
> #define pr_fmt(fmt) "SEV-SNP: " fmt
>
> -static __init void mfd_enable(void *arg)
> +static void mfd_enable(void *arg)
> {
> u64 val;
>
> @@ -146,7 +146,7 @@ static __init void mfd_enable(void *arg)
> wrmsrq(MSR_AMD64_SYSCFG, val);
> }
>
> -static __init void snp_enable(void *arg)
> +static void snp_enable(void *arg)
> {
> u64 val;
>
> @@ -509,6 +509,30 @@ static bool __init setup_rmptable(void)
> return true;
> }
>
> +void snp_prepare_for_snp_init(void)
> +{
> + u64 val;
> +
> + /*
> + * Check if SEV-SNP is already enabled, this can happen in case of
> + * kexec boot.
> + */
> + rdmsrq(MSR_AMD64_SYSCFG, val);
> + if (val & MSR_AMD64_SYSCFG_SNP_EN)
> + return;
> +
> + snp_clear_rmp();
> +
> + /*
> + * MtrrFixDramModEn is not shared between threads on a core,
> + * therefore it must be set on all CPUs prior to enabling SNP.
> + */
> + on_each_cpu(mfd_enable, NULL, 1);
> +
> + on_each_cpu(snp_enable, NULL, 1);
> +}
> +EXPORT_SYMBOL_FOR_MODULES(snp_prepare_for_snp_init, "ccp");
> +
> /*
> * Do the necessary preparations which are verified by the firmware as
> * described in the SNP_INIT_EX firmware command description in the SNP
> @@ -516,8 +540,6 @@ static bool __init setup_rmptable(void)
> */
> int __init snp_rmptable_init(void)
> {
> - u64 val;
> -
> if (WARN_ON_ONCE(!cc_platform_has(CC_ATTR_HOST_SEV_SNP)))
> return -ENOSYS;
>
> @@ -527,22 +549,8 @@ int __init snp_rmptable_init(void)
> if (!setup_rmptable())
> return -ENOSYS;
>
> - /*
> - * Check if SEV-SNP is already enabled, this can happen in case of
> - * kexec boot.
> - */
> - rdmsrq(MSR_AMD64_SYSCFG, val);
> - if (val & MSR_AMD64_SYSCFG_SNP_EN)
> - goto skip_enable;
> -
> - snp_clear_rmp();
> -
> - /* MtrrFixDramModEn must be enabled on all the CPUs prior to enabling SNP. */
> - on_each_cpu(mfd_enable, NULL, 1);
> -
> - on_each_cpu(snp_enable, NULL, 1);
> + snp_prepare_for_snp_init();
>
> -skip_enable:
> /*
> * Setting crash_kexec_post_notifiers to 'true' to ensure that SNP panic
> * notifier is invoked to do SNP IOMMU shutdown before kdump.
© 2016 - 2026 Red Hat, Inc.