All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5] iommu/amd: PRI related cleanup and fixes
@ 2026-07-27  5:39 Vasant Hegde
  2026-07-27  5:39 ` [PATCH 1/5] iommu/amd: Fix incorrect device ID in invalid PASID error message Vasant Hegde
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde

This series does few cleanup and fixes to PRI related code.

I will have followup series to re-arrange PASID/PRI enablement code
and then eventually enable PRI support without PASID.


Vasant Hegde (5):
  iommu/amd: Fix incorrect device ID in invalid PASID error message
  iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
  iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
  iommu/amd: Rate limit INVALID_PPR_REQUEST error logging
  iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command

 drivers/iommu/amd/amd_iommu_types.h |  5 ++-
 drivers/iommu/amd/iommu.c           | 63 ++++++++++++++++++++++++-----
 drivers/iommu/amd/ppr.c             |  9 ++---
 3 files changed, 61 insertions(+), 16 deletions(-)

-- 
2.31.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/5] iommu/amd: Fix incorrect device ID in invalid PASID error message
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
@ 2026-07-27  5:39 ` Vasant Hegde
  2026-07-27  5:39 ` [PATCH 2/5] iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro Vasant Hegde
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde

The IO page fault notifier handler logs pdev->dev.id when reporting an
invalid PASID, but pdev->dev.id is the kernel-internal device ID and
not the IOMMU device ID (BDF). Use dev_data->devid instead, which
reflects actual devid.

Fixes: 978d626b8f1a ("iommu/amd: Add IO page fault notifier handler")
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
 drivers/iommu/amd/ppr.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/iommu/amd/ppr.c b/drivers/iommu/amd/ppr.c
index 1f8d2823bea4..ad75d1f03451 100644
--- a/drivers/iommu/amd/ppr.c
+++ b/drivers/iommu/amd/ppr.c
@@ -140,7 +140,7 @@ static void iommu_call_iopf_notifier(struct amd_iommu *iommu, u64 *raw)
 	if (event.fault.prm.pasid == 0 ||
 	    event.fault.prm.pasid >= dev_data->max_pasids) {
 		pr_info_ratelimited("Invalid PASID : 0x%x, device : 0x%x\n",
-				    event.fault.prm.pasid, pdev->dev.id);
+				    event.fault.prm.pasid, dev_data->devid);
 		goto out;
 	}
 
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/5] iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
  2026-07-27  5:39 ` [PATCH 1/5] iommu/amd: Fix incorrect device ID in invalid PASID error message Vasant Hegde
@ 2026-07-27  5:39 ` Vasant Hegde
  2026-07-27  5:39 ` [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests Vasant Hegde
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro
  Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde,
	Wei Huang

The PPR tag field (PPRtag) encodes two distinct fields: the 9-bit tag
value (bits 8-0) and the last-page indicator L bit (bit 9).

Fix PPR_TAG() to mask only the 9-bit tag field and introduce
PPR_TAG_LAST_PAGE to explicitly extract the L bit. This way it becomes
easy to read.

Cc: Wei Huang <wei.huang2@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
 drivers/iommu/amd/amd_iommu_types.h | 3 ++-
 drivers/iommu/amd/ppr.c             | 7 +++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 3c292fdfa95a..a7aa9411b2e9 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -280,7 +280,8 @@
 #define PPR_REQ_TYPE(x)		(((x) >> 60) & 0xfULL)
 #define PPR_FLAGS(x)		(((x) >> 48) & 0xfffULL)
 #define PPR_DEVID(x)		((x) & 0xffffULL)
-#define PPR_TAG(x)		(((x) >> 32) & 0x3ffULL)
+#define PPR_TAG(x)		(((x) >> 32) & 0x1ffULL)
+#define PPR_TAG_LAST_PAGE(x)	(((x) >> 32) & 0x200ULL)
 #define PPR_PASID1(x)		(((x) >> 16) & 0xffffULL)
 #define PPR_PASID2(x)		(((x) >> 42) & 0xfULL)
 #define PPR_PASID(x)		((PPR_PASID2(x) << 16) | PPR_PASID1(x))
diff --git a/drivers/iommu/amd/ppr.c b/drivers/iommu/amd/ppr.c
index ad75d1f03451..4fc50e24f591 100644
--- a/drivers/iommu/amd/ppr.c
+++ b/drivers/iommu/amd/ppr.c
@@ -130,7 +130,7 @@ static void iommu_call_iopf_notifier(struct amd_iommu *iommu, u64 *raw)
 	event.fault.prm.perm = ppr_flag_to_fault_perm(PPR_FLAGS(raw[0]));
 	event.fault.prm.addr = (u64)(raw[1] & PAGE_MASK);
 	event.fault.prm.pasid = PPR_PASID(raw[0]);
-	event.fault.prm.grpid = PPR_TAG(raw[0]) & 0x1FF;
+	event.fault.prm.grpid = PPR_TAG(raw[0]);
 
 	/*
 	 * PASID zero is used for requests from the I/O device without
@@ -146,7 +146,7 @@ static void iommu_call_iopf_notifier(struct amd_iommu *iommu, u64 *raw)
 
 	event.fault.prm.flags |= IOMMU_FAULT_PAGE_RESPONSE_NEEDS_PASID;
 	event.fault.prm.flags |= IOMMU_FAULT_PAGE_REQUEST_PASID_VALID;
-	if (PPR_TAG(raw[0]) & 0x200)
+	if (PPR_TAG_LAST_PAGE(raw[0]))
 		event.fault.prm.flags |= IOMMU_FAULT_PAGE_REQUEST_LAST_PAGE;
 
 	/* Submit event */
@@ -157,8 +157,7 @@ static void iommu_call_iopf_notifier(struct amd_iommu *iommu, u64 *raw)
 out:
 	/* Nobody cared, abort */
 	amd_iommu_complete_ppr(&pdev->dev, PPR_PASID(raw[0]),
-			       IOMMU_PAGE_RESP_FAILURE,
-			       PPR_TAG(raw[0]) & 0x1FF);
+			       IOMMU_PAGE_RESP_FAILURE, PPR_TAG(raw[0]));
 }
 
 void amd_iommu_poll_ppr_log(struct amd_iommu *iommu)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
  2026-07-27  5:39 ` [PATCH 1/5] iommu/amd: Fix incorrect device ID in invalid PASID error message Vasant Hegde
  2026-07-27  5:39 ` [PATCH 2/5] iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro Vasant Hegde
@ 2026-07-27  5:39 ` Vasant Hegde
  2026-07-28  6:32   ` Ankit Soni
  2026-07-27  5:39 ` [PATCH 4/5] iommu/amd: Rate limit INVALID_PPR_REQUEST error logging Vasant Hegde
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro
  Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde,
	Gaultier Delbarre, Wei Huang

The AMD IOMMU spec, requires the host to respond with a CMD_COMPLETE_PPR
command when an EVENT_TYPE_INV_PPR_REQ event is received with the RX bit
cleared. This response was missing in the current implementation, leaving
invalid PPR requests unacknowledged.

Introduce amd_iommu_report_ppr_err() to handle EVENT_TYPE_INV_PPR_REQ
events. The new function logs the invalid PPR request and when the RX
bit is cleared, sends CMD_COMPLETE_PPR response.

Reported-by: Gaultier Delbarre <Gaultier.Delbarre@amd.com>
Co-developed-by: Wei Huang <wei.huang2@amd.com>
Signed-off-by: Wei Huang <wei.huang2@amd.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
 drivers/iommu/amd/amd_iommu_types.h |  1 +
 drivers/iommu/amd/iommu.c           | 38 ++++++++++++++++++++++++-----
 2 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index a7aa9411b2e9..500952e752b4 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -159,6 +159,7 @@
 #define EVENT_FLAGS_SHIFT	0x10
 #define EVENT_FLAG_RW		0x020
 #define EVENT_FLAG_I		0x008
+#define EVENT_FLAG_PPR_RX	0x001
 
 /* feature control bits */
 #define CONTROL_IOMMU_EN	0
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 563f9c2672d5..4372d3908e67 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -905,10 +905,40 @@ static void amd_iommu_report_page_fault(struct amd_iommu *iommu,
 		pci_dev_put(pdev);
 }
 
+static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *event,
+				     u16 devid, u64 address, int flags)
+{
+	struct pci_dev *pdev;
+	struct device *dev = iommu->iommu.dev;
+	u32 pasid = PPR_PASID(*((u64 *)event));
+	int tag = event[1] & 0x03FF;
+
+	dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
+		iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
+		pasid, address, flags, tag);
+
+	/* Skip COMPLETE_PPR_REQUEST response if RX=1 */
+	if (flags & EVENT_FLAG_PPR_RX)
+		return;
+
+	pdev = pci_get_domain_bus_and_slot(iommu->pci_seg->id, PCI_BUS_NUM(devid),
+					   devid & 0xff);
+	if (!pdev)
+		return;
+
+	if (!dev_iommu_priv_get(&pdev->dev)) {
+		pci_dev_put(pdev);
+		return;
+	}
+
+	amd_iommu_complete_ppr(&pdev->dev, pasid, IOMMU_PAGE_RESP_FAILURE, tag);
+	pci_dev_put(pdev);
+}
+
 static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
 {
 	struct device *dev = iommu->iommu.dev;
-	int type, devid, flags, tag;
+	int type, devid, flags;
 	volatile u32 *event = __evt;
 	int count = 0;
 	u64 address, ctrl;
@@ -982,11 +1012,7 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
 		amd_iommu_report_rmp_hw_error(iommu, event);
 		break;
 	case EVENT_TYPE_INV_PPR_REQ:
-		pasid = PPR_PASID(*((u64 *)__evt));
-		tag = event[1] & 0x03FF;
-		dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
-			iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
-			pasid, address, flags, tag);
+		amd_iommu_report_ppr_err(iommu, event, devid, address, flags);
 		break;
 	default:
 		dev_err(dev, "Event logged [UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/5] iommu/amd: Rate limit INVALID_PPR_REQUEST error logging
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
                   ` (2 preceding siblings ...)
  2026-07-27  5:39 ` [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests Vasant Hegde
@ 2026-07-27  5:39 ` Vasant Hegde
  2026-07-27  5:39 ` [PATCH 5/5] iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command Vasant Hegde
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde

The amd_iommu_report_ppr_err() function logs an error message for every
INVALID_PPR_REQUEST event. Under certain fault conditions, a misbehaving
or malicious device can flood the IOMMU event log with PPR faults, causing
the kernel log to be overwhelmed with repeated error messages.

Switch from dev_err() to dev_err_ratelimited() to suppress duplicate
messages when INVALID_PPR_REQUEST events occur at a high rate.

Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
 drivers/iommu/amd/iommu.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 4372d3908e67..17df9b28ebaf 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -913,9 +913,10 @@ static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *even
 	u32 pasid = PPR_PASID(*((u64 *)event));
 	int tag = event[1] & 0x03FF;
 
-	dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
-		iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
-		pasid, address, flags, tag);
+	dev_err_ratelimited(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x "
+			    "pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
+			    iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid),
+			    PCI_FUNC(devid), pasid, address, flags, tag);
 
 	/* Skip COMPLETE_PPR_REQUEST response if RX=1 */
 	if (flags & EVENT_FLAG_PPR_RX)
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/5] iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
                   ` (3 preceding siblings ...)
  2026-07-27  5:39 ` [PATCH 4/5] iommu/amd: Rate limit INVALID_PPR_REQUEST error logging Vasant Hegde
@ 2026-07-27  5:39 ` Vasant Hegde
  2026-07-30 14:44 ` [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Ankit Soni
  2026-08-10  7:55 ` Jörg Rödel
  6 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-27  5:39 UTC (permalink / raw)
  To: iommu, joro; +Cc: will, robin.murphy, suravee.suthikulpanit, Vasant Hegde

The GN bit in the COMPLETE_PPR_REQUEST command indicates whether the
device is operating under a guest (v2) page table. Currently,
dev_data->pri_tlp is incorrectly used to derive this bit. However,
pri_tlp indicates whether the device uses PRI TLP which is unrelated
to page table mode.

Fix this by refactoring amd_iommu_complete_ppr() into a static internal
helper __amd_iommu_complete_ppr() that accepts an explicit 'gn' argument.
The amd_iommu_complete_ppr() wrapper then derives the GN bit correctly
from the device's active protection domain via pdom_is_v2_pgtbl_mode().

In the INVALID_PPR_REQUEST error handling path, the device's protection
domain may not be accessible, so derive the GN bit directly from the
EVENT_FLAG_PPR_GN flag in the event log entry instead.

While at it, change the 'gn' parameter type in build_complete_ppr()
from u8 to bool to better reflect its semantics.

Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
---
 drivers/iommu/amd/amd_iommu_types.h |  1 +
 drivers/iommu/amd/iommu.c           | 26 +++++++++++++++++++++-----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
index 500952e752b4..36c0df418ce5 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -160,6 +160,7 @@
 #define EVENT_FLAG_RW		0x020
 #define EVENT_FLAG_I		0x008
 #define EVENT_FLAG_PPR_RX	0x001
+#define EVENT_FLAG_PPR_GN	0x200
 
 /* feature control bits */
 #define CONTROL_IOMMU_EN	0
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index 17df9b28ebaf..856948a5192c 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -92,6 +92,9 @@ static void clone_aliases(struct amd_iommu *iommu, struct device *dev);
 
 static int iommu_completion_wait(struct amd_iommu *iommu);
 
+static int __amd_iommu_complete_ppr(struct device *dev, u32 pasid,
+				    int status, int tag, bool gn);
+
 /****************************************************************************
  *
  * Helper functions
@@ -912,6 +915,7 @@ static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *even
 	struct device *dev = iommu->iommu.dev;
 	u32 pasid = PPR_PASID(*((u64 *)event));
 	int tag = event[1] & 0x03FF;
+	bool gn;
 
 	dev_err_ratelimited(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x "
 			    "pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
@@ -932,7 +936,9 @@ static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *even
 		return;
 	}
 
-	amd_iommu_complete_ppr(&pdev->dev, pasid, IOMMU_PAGE_RESP_FAILURE, tag);
+	gn = (flags & EVENT_FLAG_PPR_GN);
+
+	__amd_iommu_complete_ppr(&pdev->dev, pasid, IOMMU_PAGE_RESP_FAILURE, tag, gn);
 	pci_dev_put(pdev);
 }
 
@@ -1372,7 +1378,7 @@ static void build_inv_iotlb_pages(struct iommu_cmd *cmd, u16 devid, int qdep,
 }
 
 static void build_complete_ppr(struct iommu_cmd *cmd, u16 devid, u32 pasid,
-			       int status, int tag, u8 gn)
+			       int status, int tag, bool gn)
 {
 	memset(cmd, 0, sizeof(*cmd));
 
@@ -1867,7 +1873,8 @@ static void dev_flush_pasid_all(struct iommu_dev_data *dev_data,
 	amd_iommu_dev_flush_pasid_pages(dev_data, pasid, 0, U64_MAX);
 }
 
-int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
+static int __amd_iommu_complete_ppr(struct device *dev, u32 pasid,
+				    int status, int tag, bool gn)
 {
 	struct iommu_dev_data *dev_data;
 	struct amd_iommu *iommu;
@@ -1876,12 +1883,21 @@ int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
 	dev_data = dev_iommu_priv_get(dev);
 	iommu    = get_amd_iommu_from_dev(dev);
 
-	build_complete_ppr(&cmd, dev_data->devid, pasid, status,
-			   tag, dev_data->pri_tlp);
+	build_complete_ppr(&cmd, dev_data->devid, pasid, status, tag, gn);
 
 	return iommu_queue_command(iommu, &cmd);
 }
 
+int amd_iommu_complete_ppr(struct device *dev, u32 pasid, int status, int tag)
+{
+	struct iommu_dev_data *dev_data = dev_iommu_priv_get(dev);
+	bool gn;
+
+	gn = pdom_is_v2_pgtbl_mode(dev_data->domain);
+
+	return __amd_iommu_complete_ppr(dev, pasid, status, tag, gn);
+}
+
 /****************************************************************************
  *
  * The next functions belong to the domain allocation. A domain is
-- 
2.31.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
  2026-07-27  5:39 ` [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests Vasant Hegde
@ 2026-07-28  6:32   ` Ankit Soni
  2026-07-30 11:32     ` Vasant Hegde
  0 siblings, 1 reply; 11+ messages in thread
From: Ankit Soni @ 2026-07-28  6:32 UTC (permalink / raw)
  To: Vasant Hegde
  Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit,
	Gaultier Delbarre, Wei Huang

On Mon, Jul 27, 2026 at 05:39:05AM +0000, Vasant Hegde wrote:
> The AMD IOMMU spec, requires the host to respond with a CMD_COMPLETE_PPR
> command when an EVENT_TYPE_INV_PPR_REQ event is received with the RX bit
> cleared. This response was missing in the current implementation, leaving
> invalid PPR requests unacknowledged.
> 
> Introduce amd_iommu_report_ppr_err() to handle EVENT_TYPE_INV_PPR_REQ
> events. The new function logs the invalid PPR request and when the RX
> bit is cleared, sends CMD_COMPLETE_PPR response.
> 
> Reported-by: Gaultier Delbarre <Gaultier.Delbarre@amd.com>
> Co-developed-by: Wei Huang <wei.huang2@amd.com>
> Signed-off-by: Wei Huang <wei.huang2@amd.com>
> Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
> ---
>  drivers/iommu/amd/amd_iommu_types.h |  1 +
>  drivers/iommu/amd/iommu.c           | 38 ++++++++++++++++++++++++-----
>  2 files changed, 33 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/iommu/amd/amd_iommu_types.h b/drivers/iommu/amd/amd_iommu_types.h
> index a7aa9411b2e9..500952e752b4 100644
> --- a/drivers/iommu/amd/amd_iommu_types.h
> +++ b/drivers/iommu/amd/amd_iommu_types.h
> @@ -159,6 +159,7 @@
>  #define EVENT_FLAGS_SHIFT	0x10
>  #define EVENT_FLAG_RW		0x020
>  #define EVENT_FLAG_I		0x008
> +#define EVENT_FLAG_PPR_RX	0x001
>  
>  /* feature control bits */
>  #define CONTROL_IOMMU_EN	0
> diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
> index 563f9c2672d5..4372d3908e67 100644
> --- a/drivers/iommu/amd/iommu.c
> +++ b/drivers/iommu/amd/iommu.c
> @@ -905,10 +905,40 @@ static void amd_iommu_report_page_fault(struct amd_iommu *iommu,
>  		pci_dev_put(pdev);
>  }
>  
> +static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *event,
> +				     u16 devid, u64 address, int flags)
> +{
> +	struct pci_dev *pdev;
> +	struct device *dev = iommu->iommu.dev;
> +	u32 pasid = PPR_PASID(*((u64 *)event));
> +	int tag = event[1] & 0x03FF;
> +
> +	dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
> +		iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
> +		pasid, address, flags, tag);
> +
> +	/* Skip COMPLETE_PPR_REQUEST response if RX=1 */
> +	if (flags & EVENT_FLAG_PPR_RX)
> +		return;
> +
> +	pdev = pci_get_domain_bus_and_slot(iommu->pci_seg->id, PCI_BUS_NUM(devid),
> +					   devid & 0xff);
> +	if (!pdev)
> +		return;
> +
> +	if (!dev_iommu_priv_get(&pdev->dev)) {

Hi Vasant,
May be corener case, we return without sending COMPLETE_PPR. Since the 
goal of this patch is to always respond when RX=0, and the completion only
needs the devid (already available from the event) and iommu, should these
paths still issue the completion directly via 
build_complete_ppr()/iommu_queue_command() rather than just return?

-Ankit

> +		pci_dev_put(pdev);
> +		return;
> +	}
> +
> +	amd_iommu_complete_ppr(&pdev->dev, pasid, IOMMU_PAGE_RESP_FAILURE, tag);
> +	pci_dev_put(pdev);
> +}
> +
>  static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
>  {
>  	struct device *dev = iommu->iommu.dev;
> -	int type, devid, flags, tag;
> +	int type, devid, flags;
>  	volatile u32 *event = __evt;
>  	int count = 0;
>  	u64 address, ctrl;
> @@ -982,11 +1012,7 @@ static void iommu_print_event(struct amd_iommu *iommu, void *__evt)
>  		amd_iommu_report_rmp_hw_error(iommu, event);
>  		break;
>  	case EVENT_TYPE_INV_PPR_REQ:
> -		pasid = PPR_PASID(*((u64 *)__evt));
> -		tag = event[1] & 0x03FF;
> -		dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
> -			iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
> -			pasid, address, flags, tag);
> +		amd_iommu_report_ppr_err(iommu, event, devid, address, flags);
>  		break;
>  	default:
>  		dev_err(dev, "Event logged [UNKNOWN event[0]=0x%08x event[1]=0x%08x event[2]=0x%08x event[3]=0x%08x\n",
> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
  2026-07-28  6:32   ` Ankit Soni
@ 2026-07-30 11:32     ` Vasant Hegde
  0 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-07-30 11:32 UTC (permalink / raw)
  To: Ankit Soni
  Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit,
	Gaultier Delbarre, Wei Huang



On 7/28/2026 12:02 PM, Ankit Soni wrote:
> On Mon, Jul 27, 2026 at 05:39:05AM +0000, Vasant Hegde wrote:
>> The AMD IOMMU spec, requires the host to respond with a CMD_COMPLETE_PPR
>> command when an EVENT_TYPE_INV_PPR_REQ event is received with the RX bit
>> cleared. This response was missing in the current implementation, leaving
>> invalid PPR requests unacknowledged.
>>
>> Introduce amd_iommu_report_ppr_err() to handle EVENT_TYPE_INV_PPR_REQ
>> events. The new function logs the invalid PPR request and when the RX
>> bit is cleared, sends CMD_COMPLETE_PPR response.

.../...

>>  
>> +static void amd_iommu_report_ppr_err(struct amd_iommu *iommu, volatile u32 *event,
>> +				     u16 devid, u64 address, int flags)
>> +{
>> +	struct pci_dev *pdev;
>> +	struct device *dev = iommu->iommu.dev;
>> +	u32 pasid = PPR_PASID(*((u64 *)event));
>> +	int tag = event[1] & 0x03FF;
>> +
>> +	dev_err(dev, "Event logged [INVALID_PPR_REQUEST device=%04x:%02x:%02x.%x pasid=0x%05x address=0x%llx flags=0x%04x tag=0x%03x]\n",
>> +		iommu->pci_seg->id, PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),
>> +		pasid, address, flags, tag);
>> +
>> +	/* Skip COMPLETE_PPR_REQUEST response if RX=1 */
>> +	if (flags & EVENT_FLAG_PPR_RX)
>> +		return;
>> +
>> +	pdev = pci_get_domain_bus_and_slot(iommu->pci_seg->id, PCI_BUS_NUM(devid),
>> +					   devid & 0xff);
>> +	if (!pdev)
>> +		return;
>> +
>> +	if (!dev_iommu_priv_get(&pdev->dev)) {
> 
> Hi Vasant,
> May be corener case, we return without sending COMPLETE_PPR. Since the 
> goal of this patch is to always respond when RX=0, and the completion only
> needs the devid (already available from the event) and iommu, should these
> paths still issue the completion directly via 
> build_complete_ppr()/iommu_queue_command() rather than just return?

That's even before the probe is complete. At that point we don't get these event
as interrupts are not configured. So its fine to return here.

-Vasant


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/5] iommu/amd: PRI related cleanup and fixes
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
                   ` (4 preceding siblings ...)
  2026-07-27  5:39 ` [PATCH 5/5] iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command Vasant Hegde
@ 2026-07-30 14:44 ` Ankit Soni
  2026-08-10  7:55 ` Jörg Rödel
  6 siblings, 0 replies; 11+ messages in thread
From: Ankit Soni @ 2026-07-30 14:44 UTC (permalink / raw)
  To: Vasant Hegde; +Cc: iommu, joro, will, robin.murphy, suravee.suthikulpanit

On Mon, Jul 27, 2026 at 05:39:02AM +0000, Vasant Hegde wrote:
> This series does few cleanup and fixes to PRI related code.
> 
> I will have followup series to re-arrange PASID/PRI enablement code
> and then eventually enable PRI support without PASID.
> 
> 
> Vasant Hegde (5):
>   iommu/amd: Fix incorrect device ID in invalid PASID error message
>   iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
>   iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
>   iommu/amd: Rate limit INVALID_PPR_REQUEST error logging
>   iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command
> 
>  drivers/iommu/amd/amd_iommu_types.h |  5 ++-
>  drivers/iommu/amd/iommu.c           | 63 ++++++++++++++++++++++++-----
>  drivers/iommu/amd/ppr.c             |  9 ++---
>  3 files changed, 61 insertions(+), 16 deletions(-)
> 

Reviewed-by: Ankit Soni <Ankit.Soni@amd.com>

> -- 
> 2.31.1
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/5] iommu/amd: PRI related cleanup and fixes
  2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
                   ` (5 preceding siblings ...)
  2026-07-30 14:44 ` [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Ankit Soni
@ 2026-08-10  7:55 ` Jörg Rödel
  2026-08-11  4:13   ` Vasant Hegde
  6 siblings, 1 reply; 11+ messages in thread
From: Jörg Rödel @ 2026-08-10  7:55 UTC (permalink / raw)
  To: Vasant Hegde; +Cc: iommu, will, robin.murphy, suravee.suthikulpanit

On Mon, Jul 27, 2026 at 05:39:02AM +0000, Vasant Hegde wrote:
> Vasant Hegde (5):
>   iommu/amd: Fix incorrect device ID in invalid PASID error message
>   iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
>   iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
>   iommu/amd: Rate limit INVALID_PPR_REQUEST error logging
>   iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command

Does not apply to amd/amd-vi branch, please rebase and send for inclusion into
7.3.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/5] iommu/amd: PRI related cleanup and fixes
  2026-08-10  7:55 ` Jörg Rödel
@ 2026-08-11  4:13   ` Vasant Hegde
  0 siblings, 0 replies; 11+ messages in thread
From: Vasant Hegde @ 2026-08-11  4:13 UTC (permalink / raw)
  To: Jörg Rödel; +Cc: iommu, will, robin.murphy, suravee.suthikulpanit

Joerg,


On 8/10/2026 1:25 PM, Jörg Rödel wrote:
> On Mon, Jul 27, 2026 at 05:39:02AM +0000, Vasant Hegde wrote:
>> Vasant Hegde (5):
>>   iommu/amd: Fix incorrect device ID in invalid PASID error message
>>   iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
>>   iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests
>>   iommu/amd: Rate limit INVALID_PPR_REQUEST error logging
>>   iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command
> 
> Does not apply to amd/amd-vi branch, please rebase and send for inclusion into
> 7.3.

I have rebased it on top of amd-vi and sent v2.

Thanks
-Vasant


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2026-08-11  4:14 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-27  5:39 [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Vasant Hegde
2026-07-27  5:39 ` [PATCH 1/5] iommu/amd: Fix incorrect device ID in invalid PASID error message Vasant Hegde
2026-07-27  5:39 ` [PATCH 2/5] iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro Vasant Hegde
2026-07-27  5:39 ` [PATCH 3/5] iommu/amd: Fix missing CMD_COMPLETE_PPR response for invalid PPR requests Vasant Hegde
2026-07-28  6:32   ` Ankit Soni
2026-07-30 11:32     ` Vasant Hegde
2026-07-27  5:39 ` [PATCH 4/5] iommu/amd: Rate limit INVALID_PPR_REQUEST error logging Vasant Hegde
2026-07-27  5:39 ` [PATCH 5/5] iommu/amd: Fix GN bit setting in COMPLETE_PPR_REQUEST command Vasant Hegde
2026-07-30 14:44 ` [PATCH 0/5] iommu/amd: PRI related cleanup and fixes Ankit Soni
2026-08-10  7:55 ` Jörg Rödel
2026-08-11  4:13   ` Vasant Hegde

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.