Hi Ashish, [Sorry. I didn't see this series and responded to v2]. On 2/4/2025 3:26 AM, Ashish Kalra wrote: > From: Ashish Kalra <ashish.kalra@xxxxxxx> > > Fix issues with enabling SNP host support and effectively SNP support > which is broken with respect to the KVM module being built-in. > > SNP host support is enabled in snp_rmptable_init() which is invoked as > device_initcall(). SNP check on IOMMU is done during IOMMU PCI init > (IOMMU_PCI_INIT stage). And for that reason snp_rmptable_init() is > currently invoked via device_initcall() and cannot be invoked via > subsys_initcall() as core IOMMU subsystem gets initialized via > subsys_initcall(). > > Now, if kvm_amd module is built-in, it gets initialized before SNP host > support is enabled in snp_rmptable_init() : > > [ 10.131811] kvm_amd: TSC scaling supported > [ 10.136384] kvm_amd: Nested Virtualization enabled > [ 10.141734] kvm_amd: Nested Paging enabled > [ 10.146304] kvm_amd: LBR virtualization supported > [ 10.151557] kvm_amd: SEV enabled (ASIDs 100 - 509) > [ 10.156905] kvm_amd: SEV-ES enabled (ASIDs 1 - 99) > [ 10.162256] kvm_amd: SEV-SNP enabled (ASIDs 1 - 99) > [ 10.171508] kvm_amd: Virtual VMLOAD VMSAVE supported > [ 10.177052] kvm_amd: Virtual GIF supported > ... > ... .../... > diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c > index c5cd92edada0..4bcb474e2252 100644 > --- a/drivers/iommu/amd/init.c > +++ b/drivers/iommu/amd/init.c > @@ -3194,7 +3194,7 @@ static bool __init detect_ivrs(void) > return true; > } > > -static void iommu_snp_enable(void) > +static __init void iommu_snp_enable(void) > { > #ifdef CONFIG_KVM_AMD_SEV > if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP)) > @@ -3219,6 +3219,14 @@ static void iommu_snp_enable(void) > goto disable_snp; > } > > + /* > + * Enable host SNP support once SNP support is checked on IOMMU. > + */ > + if (snp_rmptable_init()) { > + pr_warn("SNP: RMP initialization failed, SNP cannot be supported.\n"); > + goto disable_snp; > + } > + > pr_info("IOMMU SNP support enabled.\n"); > return; > > @@ -3318,6 +3326,9 @@ static int __init iommu_go_to_state(enum iommu_init_state state) > ret = state_next(); > } > > + if (ret && !amd_iommu_snp_en && cc_platform_has(CC_ATTR_HOST_SEV_SNP)) I think we should clear when `amd_iommu_snp_en` is true. May be below check is enough? if (ret && amd_iommu_snp_en) -Vasant