On Fri, Aug 20, 2021 at 10:58:35AM -0500, Brijesh Singh wrote: > The SEV-SNP support requires that IOMMU must to enabled, see the IOMMU s/must to/is/ > spec section 2.12 for further details. If IOMMU is not enabled or the > SNPSup extended feature register is not set then the SNP_INIT command > (used for initializing firmware) will fail. > > The iommu_sev_snp_supported() can be used to check if IOMMU supports the "can be used"? Just say what is going to use it. > SEV-SNP feature. > > Signed-off-by: Brijesh Singh <brijesh.singh@xxxxxxx> > --- > drivers/iommu/amd/init.c | 30 ++++++++++++++++++++++++++++++ > include/linux/iommu.h | 9 +++++++++ > 2 files changed, 39 insertions(+) > > diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c > index 46280e6e1535..bd420fb71126 100644 > --- a/drivers/iommu/amd/init.c > +++ b/drivers/iommu/amd/init.c > @@ -3320,3 +3320,33 @@ int amd_iommu_pc_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, u8 fxn, u64 > > return iommu_pc_get_set_reg(iommu, bank, cntr, fxn, value, true); > } > + > +bool iommu_sev_snp_supported(void) > +{ > + struct amd_iommu *iommu; > + > + /* > + * The SEV-SNP support requires that IOMMU must be enabled, and is > + * not configured in the passthrough mode. > + */ > + if (no_iommu || iommu_default_passthrough()) { > + pr_err("SEV-SNP: IOMMU is either disabled or configured in passthrough mode.\n"); > + return false; > + } > + > + /* > + * Iterate through all the IOMMUs and verify the SNPSup feature is > + * enabled. > + */ > + for_each_iommu(iommu) { > + if (!iommu_feature(iommu, FEATURE_SNP)) { > + pr_err("SNPSup is disabled (devid: %02x:%02x.%x)\n", > + PCI_BUS_NUM(iommu->devid), PCI_SLOT(iommu->devid), > + PCI_FUNC(iommu->devid)); > + return false; > + } > + } > + > + return true; > +} > +EXPORT_SYMBOL_GPL(iommu_sev_snp_supported); That export is not needed. > diff --git a/include/linux/iommu.h b/include/linux/iommu.h > index 32d448050bf7..269abc17b2c3 100644 > --- a/include/linux/iommu.h > +++ b/include/linux/iommu.h > @@ -604,6 +604,12 @@ struct iommu_sva *iommu_sva_bind_device(struct device *dev, > void iommu_sva_unbind_device(struct iommu_sva *handle); > u32 iommu_sva_get_pasid(struct iommu_sva *handle); > > +#ifdef CONFIG_AMD_MEM_ENCRYPT > +bool iommu_sev_snp_supported(void); > +#else > +static inline bool iommu_sev_snp_supported(void) { return false; } > +#endif > + > #else /* CONFIG_IOMMU_API */ > > struct iommu_ops {}; > @@ -999,6 +1005,9 @@ static inline struct iommu_fwspec *dev_iommu_fwspec_get(struct device *dev) > { > return NULL; > } > + > +static inline bool iommu_sev_snp_supported(void) { return false; } > + Most of those stubs and ifdeffery is not needed if you put the function itself in #ifdef CONFIG_AMD_MEM_ENCRYPT ... #endif as it is called by sev.c only, AFAICT, and latter is enabled by CONFIG_AMD_MEM_ENCRYPT anyway. Thx. -- Regards/Gruss, Boris. https://people.kernel.org/tglx/notes-about-netiquette