On 5/9/2025 12:01 PM, Paluri, PavanKumar wrote: > > > On 5/8/2025 5:52 PM, Ashish Kalra wrote: >> From: Ashish Kalra <ashish.ka...@amd.com> >> >> During platform init, SNP initialization may fail for several reasons, >> such as firmware command failures and incompatible versions. However, >> the KVM capability may continue to advertise support for it. >> >> The platform may have SNP enabled but if SNP_INIT fails then SNP is >> not supported by KVM. >> >> During KVM module initialization query the SNP platform status to obtain >> the SNP initialization state and use it as an additional condition to >> determine support for SEV-SNP. >> >> Co-developed-by: Sean Christopherson <sea...@google.com> >> Signed-off-by: Sean Christopherson <sea...@google.com> >> Co-developed-by: Pratik R. Sampat <prsam...@amd.com> >> Signed-off-by: Pratik R. Sampat <prsam...@amd.com> >> Signed-off-by: Ashish Kalra <ashish.ka...@amd.com> >> --- >> arch/x86/kvm/svm/sev.c | 43 +++++++++++++++++++++++++++++++++--------- >> 1 file changed, 34 insertions(+), 9 deletions(-) >> >> diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c >> index ada53f04158c..a6abdb26f877 100644 >> --- a/arch/x86/kvm/svm/sev.c >> +++ b/arch/x86/kvm/svm/sev.c >> @@ -2934,6 +2934,32 @@ void __init sev_set_cpu_caps(void) >> } >> } >> >> +static bool sev_is_snp_initialized(void) > > s/sev_is_snp_initialized/is_sev_snp_initalized looks better. >
Actually the convention is sev_is_xx(). >> +{ >> + struct sev_user_data_snp_status *status; >> + struct sev_data_snp_addr buf; >> + bool initialized = false; >> + void *data; >> + int error; >> + >> + data = snp_alloc_firmware_page(GFP_KERNEL_ACCOUNT | __GFP_ZERO); >> + if (!data) >> + return initialized; >> + >> + buf.address = __psp_pa(data); >> + if (sev_do_cmd(SEV_CMD_SNP_PLATFORM_STATUS, &buf, &error)) >> + goto out; >> + >> + status = (struct sev_user_data_snp_status *)data; >> + if (status->state) >> + initialized = true; >> + >> +out: >> + snp_free_firmware_page(data); >> + >> + return initialized; >> +} >> + >> void __init sev_hardware_setup(void) >> { >> unsigned int eax, ebx, ecx, edx, sev_asid_count, sev_es_asid_count; >> @@ -3038,6 +3064,14 @@ void __init sev_hardware_setup(void) >> sev_snp_supported = sev_snp_enabled && >> cc_platform_has(CC_ATTR_HOST_SEV_SNP); >> >> out: >> + if (sev_enabled) { >> + init_args.probe = true; >> + if (sev_platform_init(&init_args)) >> + sev_supported = sev_es_supported = sev_snp_supported = >> false; >> + else >> + sev_snp_supported &= sev_is_snp_initialized(); >> + } >> + >> if (boot_cpu_has(X86_FEATURE_SEV)) >> pr_info("SEV %s (ASIDs %u - %u)\n", >> sev_supported ? min_sev_asid <= max_sev_asid ? >> "enabled" : >> @@ -3064,15 +3098,6 @@ void __init sev_hardware_setup(void) >> sev_supported_vmsa_features = 0; >> if (sev_es_debug_swap_enabled) >> sev_supported_vmsa_features |= SVM_SEV_FEAT_DEBUG_SWAP; > > On what kernel version is this patch based on? I do not see the below > diff in 6.15-rc5. > This is based on linux-next. Thanks, Ashish > Thanks, > Pavan >> - >> - if (!sev_enabled) >> - return; >> - >> - /* >> - * Do both SNP and SEV initialization at KVM module load. >> - */ >> - init_args.probe = true; >> - sev_platform_init(&init_args); >> } >> >> void sev_hardware_unsetup(void) >