Re: [PATCH Part2 v5 02/45] iommu/amd: Introduce function to check SEV-SNP support
From: Borislav Petkov <bp@alien8.de>
Date: 2021-09-16 17:35:01
Also in:
kvm, linux-crypto, linux-mm, lkml
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.
quoted hunk ↗ jump to hunk
SEV-SNP feature. Signed-off-by: Brijesh Singh <redacted> --- 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.
quoted hunk ↗ jump to hunk
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