[PATCH 2/5] iommu/amd: Introduce PPR_TAG_LAST_PAGE() macro
Vasant Hegde <[email protected]> Mon, 27 Jul 2026 05:39:04 +0000
| Newsgroups | dev.linux.lists.iommu |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> Signed-off-by: Vasant Hegde <[email protected]> --- 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