]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iommu/amd: Expicitly enable CNTRL.EPHEn bit in resume path
authorVasant Hegde <vasant.hegde@amd.com>
Mon, 27 Jan 2025 09:44:11 +0000 (09:44 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Feb 2025 13:01:22 +0000 (14:01 +0100)
[ Upstream commit ef75966abf950c0539534effa4960caa29fb7167 ]

With recent kernel, AMDGPU failed to resume after suspend on certain laptop.

Sample log:
-----------
Nov 14 11:52:19 Thinkbook kernel: iommu ivhd0: AMD-Vi: Event logged [ILLEGAL_DEV_TABLE_ENTRY device=0000:06:00.0 pasid=0x00000 address=0x135300000 flags=0x0080]
Nov 14 11:52:19 Thinkbook kernel: AMD-Vi: DTE[0]: 7d90000000000003
Nov 14 11:52:19 Thinkbook kernel: AMD-Vi: DTE[1]: 0000100103fc0009
Nov 14 11:52:19 Thinkbook kernel: AMD-Vi: DTE[2]: 2000000117840013
Nov 14 11:52:19 Thinkbook kernel: AMD-Vi: DTE[3]: 0000000000000000

This is because in resume path, CNTRL[EPHEn] is not set. Fix this by
setting CNTRL[EPHEn] to 1 in resume path if EFR[EPHSUP] is set.

Note
  May be better approach is to save the control register in suspend path
  and restore it in resume path instead of trying to set indivisual
  bits. We will have separate patch for that.

Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219499
Fixes: c4cb23111103 ("iommu/amd: Add support for enable/disable IOPF")
Tested-by: Hamish McIntyre-Bhatty <kernel-bugzilla@regd.hamishmb.com>
Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Link: https://lore.kernel.org/r/20250127094411.5931-1-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iommu/amd/amd_iommu_types.h
drivers/iommu/amd/init.c

index 601fb4ee69009ee2c3fc394161043b00d2b6a613..6fb2f2919ab1ff1e3847c7b33a3ffdae4cdfd3f2 100644 (file)
 #define CONTROL_GAM_EN         25
 #define CONTROL_GALOG_EN       28
 #define CONTROL_GAINT_EN       29
+#define CONTROL_EPH_EN         45
 #define CONTROL_XT_EN          50
 #define CONTROL_INTCAPXT_EN    51
 #define CONTROL_IRTCACHEDIS    59
index 43131c3a21726f3360de6ba843ed30048343cbbf..dbe2d13972feffdeac3b2655767e6b639a2cfe46 100644 (file)
@@ -2647,6 +2647,10 @@ static void iommu_init_flags(struct amd_iommu *iommu)
 
        /* Set IOTLB invalidation timeout to 1s */
        iommu_set_inv_tlb_timeout(iommu, CTRL_INV_TO_1S);
+
+       /* Enable Enhanced Peripheral Page Request Handling */
+       if (check_feature(FEATURE_EPHSUP))
+               iommu_feature_enable(iommu, CONTROL_EPH_EN);
 }
 
 static void iommu_apply_resume_quirks(struct amd_iommu *iommu)