Commit 94a9921e authored by Sairaj Kodilkar's avatar Sairaj Kodilkar Committed by Joerg Roedel
Browse files

iommu/amd: Add support for HTRangeIgnore feature



AMD IOMMU reserves the address range 0xfd00000000-0xffffffffff for
the hypertransport protocol (HT) and has special meaning. Hence devices
cannot use this address range for the DMA. However on some AMD platforms
this HT range is shifted to the very top of the address space and new
feature bit `HTRangeIgnore` is introduced. When this feature bit is on,
IOMMU treats the GPA access to the legacy HT range as regular GPA access.

Signed-off-by: default avatarSairaj Kodilkar <sarunkod@amd.com>
Reviewed-by: default avatarVasant Hegde <vasant.hegde@amd.com>
Link: https://lore.kernel.org/r/20250317055020.25214-1-sarunkod@amd.com


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 94c721ea
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -147,6 +147,8 @@ static inline int get_pci_sbdf_id(struct pci_dev *pdev)
	return PCI_SEG_DEVID_TO_SBDF(seg, devid);
}

bool amd_iommu_ht_range_ignore(void);

/*
 * This must be called after device probe completes. During probe
 * use rlookup_amd_iommu() get the iommu.
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@
#define FEATURE_SNPAVICSUP	GENMASK_ULL(7, 5)
#define FEATURE_SNPAVICSUP_GAM(x) \
	(FIELD_GET(FEATURE_SNPAVICSUP, x) == 0x1)
#define FEATURE_HT_RANGE_IGNORE		BIT_ULL(11)

#define FEATURE_NUM_INT_REMAP_SUP	GENMASK_ULL(9, 8)
#define FEATURE_NUM_INT_REMAP_SUP_2K(x) \
+5 −0
Original line number Diff line number Diff line
@@ -256,6 +256,11 @@ int amd_iommu_get_num_iommus(void)
	return amd_iommus_present;
}

bool amd_iommu_ht_range_ignore(void)
{
	return check_feature2(FEATURE_HT_RANGE_IGNORE);
}

/*
 * Iterate through all the IOMMUs to get common EFR
 * masks among all IOMMUs and warn if found inconsistency.
+3 −0
Original line number Diff line number Diff line
@@ -2916,6 +2916,9 @@ static void amd_iommu_get_resv_regions(struct device *dev,
		return;
	list_add_tail(&region->list, head);

	if (amd_iommu_ht_range_ignore())
		return;

	region = iommu_alloc_resv_region(HT_RANGE_START,
					 HT_RANGE_END - HT_RANGE_START + 1,
					 0, IOMMU_RESV_RESERVED, GFP_KERNEL);