From: Vasant Hegde <vasant.hegde@amd.com>
To: <iommu@lists.linux.dev>, <joro@8bytes.org>
Cc: <will@kernel.org>, <robin.murphy@arm.com>,
<suravee.suthikulpanit@amd.com>,
Vasant Hegde <vasant.hegde@amd.com>,
Amandeep Kaur Longia <AmandeepKaur.Longia@amd.com>
Subject: [PATCH v2] iommu/amd: Add SNP page mode 0 support
Date: Tue, 11 Aug 2026 05:22:57 +0000 [thread overview]
Message-ID: <20260811052257.9247-1-vasant.hegde@amd.com> (raw)
Newer AMD IOMMUs supports DTE[Mode]=0 for SNP-enabled system. This is
detected using new feature bit (EFR2[SNP_Page_Mode_0_Sup]). If this
feature is enabled, then IOMMU supports:
- Passthrough mode (i.e. iommu=pt)
- amd_iommu=pgtbl_v2: Forcing Linux DMA-API to use IOMMU v2 page table
- Setting up device for SVA mode in the host.
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Tested-by: Amandeep Kaur Longia <AmandeepKaur.Longia@amd.com>
---
Joerg,
I have rebased this on top of amd/amd-vi branch and it should apply
cleanly.
Sorry. I missed to include this one along with PRI series. I think
think one is ready. Can you please pick this up for 7.3
-Vasant
drivers/iommu/amd/amd_iommu_types.h | 4 +++
drivers/iommu/amd/init.c | 42 ++++++++++++++++++++---------
drivers/iommu/amd/iommu.c | 4 +--
3 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 3c292fdfa95a..d421151e9b7a 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -113,6 +113,7 @@
#define FEATURE_SNPAVICSUP_GAM(x) \
(FIELD_GET(FEATURE_SNPAVICSUP, x) == 0x1)
#define FEATURE_HT_RANGE_IGNORE BIT_ULL(11)
+#define FEATURE_SNP_PAGE_MODE0_SUP BIT_ULL(13)
#define FEATURE_NUM_INT_REMAP_SUP GENMASK_ULL(9, 8)
#define FEATURE_NUM_INT_REMAP_SUP_2K(x) \
@@ -416,6 +417,9 @@ extern bool amd_iommu_dump;
pr_info(format, ## arg); \
} while(0);
+/* SNP page mode 0 support */
+extern bool amd_iommu_snp_mode0_sup;
+
/* global flag if IOMMUs cache non-present entries */
extern bool amd_iommu_np_cache;
/* Only true if all IOMMUs support device IOTLBs */
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index c0748521dff8..a1f85d44f2a4 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -180,6 +180,9 @@ bool amd_iommu_hatdis;
bool amd_iommu_snp_en;
EXPORT_SYMBOL(amd_iommu_snp_en);
+/* SNP page mode 0 support */
+bool amd_iommu_snp_mode0_sup;
+
LIST_HEAD(amd_iommu_pci_seg_list); /* list of all PCI segments */
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the system */
LIST_HEAD(amd_ivhd_dev_flags_list); /* list of all IVHD device entry settings */
@@ -3394,18 +3397,28 @@ static __init void iommu_snp_enable(void)
#ifdef CONFIG_KVM_AMD_SEV
if (!cc_platform_has(CC_ATTR_HOST_SEV_SNP))
return;
- /*
- * The SNP support requires that IOMMU must be enabled, and is
- * configured with V1 page table (DTE[Mode] = 0 is not supported).
- */
- if (no_iommu || iommu_default_passthrough()) {
- pr_warn("SNP: IOMMU disabled or configured in passthrough mode, SNP cannot be supported.\n");
+
+ /* SNP support required IOMMU to be ON */
+ if (no_iommu) {
+ pr_warn("SNP: IOMMU disabled, SNP cannot be supported.\n");
goto disable_snp;
}
- if (amd_iommu_pgtable != PD_MODE_V1) {
- pr_warn("SNP: IOMMU is configured with V2 page table mode, SNP cannot be supported.\n");
- goto disable_snp;
+ amd_iommu_snp_mode0_sup = check_feature2(FEATURE_SNP_PAGE_MODE0_SUP);
+ /*
+ * If SNP page mode 0 is not enabled, then SNP support requires that IOMMU
+ * must be configured with V1 page table (DTE[Mode] != 0).
+ */
+ if (!amd_iommu_snp_mode0_sup) {
+ if (iommu_default_passthrough()) {
+ pr_warn("SNP: IOMMU configured in passthrough mode, SNP cannot be supported.\n");
+ goto disable_snp;
+ }
+
+ if (amd_iommu_pgtable != PD_MODE_V1) {
+ pr_warn("SNP: IOMMU is configured with V2 page table mode, SNP cannot be supported.\n");
+ goto disable_snp;
+ }
}
amd_iommu_snp_en = check_feature(FEATURE_SNP);
@@ -3940,12 +3953,15 @@ bool amd_iommu_pasid_supported(void)
amd_iommu_gpt_level != PAGE_MODE_5_LEVEL)
return false;
+ if (!amd_iommu_gt_ppr_supported())
+ return false;
+
/*
- * Since DTE[Mode]=0 is prohibited on SNP-enabled system
- * (i.e. EFR[SNPSup]=1), IOMMUv2 page table cannot be used without
- * setting up IOMMUv1 page table.
+ * If SNP page mode 0 is not supported, then DTE[Mode]=0 is prohibited
+ * on SNP-enabled system (i.e. EFR[SNPSup]=1). IOMMUv2 page table
+ * cannot be used without setting up IOMMUv1 page table.
*/
- return amd_iommu_gt_ppr_supported() && !amd_iommu_snp_en;
+ return (!amd_iommu_snp_en) || (amd_iommu_snp_en && amd_iommu_snp_mode0_sup);
}
struct amd_iommu *get_amd_iommu(unsigned int idx)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 563f9c2672d5..d8f626d7f784 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -2910,9 +2910,9 @@ static int amd_iommu_identity_attach(struct iommu_domain *dom, struct device *de
{
/*
* Don't allow attaching a device to the identity domain if SNP is
- * enabled.
+ * enabled and SNP Mode0 support is not present.
*/
- if (amd_iommu_snp_en)
+ if (amd_iommu_snp_en && !amd_iommu_snp_mode0_sup)
return -EINVAL;
return amd_iommu_attach_device(dom, dev, old);
--
2.31.1
next reply other threads:[~2026-08-11 5:23 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-11 5:22 Vasant Hegde [this message]
2026-08-11 7:04 ` [PATCH v2] iommu/amd: Add SNP page mode 0 support Jörg Rödel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260811052257.9247-1-vasant.hegde@amd.com \
--to=vasant.hegde@amd.com \
--cc=AmandeepKaur.Longia@amd.com \
--cc=iommu@lists.linux.dev \
--cc=joro@8bytes.org \
--cc=robin.murphy@arm.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.