From f88b39a83ba13280ccef443533b43b53d8d464dd Mon Sep 17 00:00:00 2001 From: Yicong Yang Date: Thu, 29 Sep 2022 22:01:00 +0800 Subject: [PATCH 03/19] iommu/arm-smmu-v3: Make default domain type of HiSilicon PTT device to identity mainline inclusion from mainline-v6.1-rc1 commit 24b6c7798a0122012ca848ea0d25e973334266b0 category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I5RP8T CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git/commit/?id=24b6c7798a0122012ca848ea0d25e973334266b0 -------------------------------------------------------------------------- The DMA operations of HiSilicon PTT device can only work properly with identical mappings. So add a quirk for the device to force the domain as passthrough. Acked-by: Will Deacon Signed-off-by: Yicong Yang Reviewed-by: John Garry Link: https://lore.kernel.org/r/20220816114414.4092-2-yangyicong@huawei.com Signed-off-by: Mathieu Poirier Signed-off-by: Wangming Shao Reviewed-by: Hanjun Guo Reviewed-by: Jay Fang Acked-by: Xie XiuQi Signed-off-by: Zheng Zengkai Signed-off-by: YunYi Yang Conflicts: drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c --- drivers/iommu/arm-smmu-v3.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c index 5029d9af1100..a11f5f03fcd0 100644 --- a/drivers/iommu/arm-smmu-v3.c +++ b/drivers/iommu/arm-smmu-v3.c @@ -3067,9 +3067,16 @@ static void arm_smmu_put_resv_regions(struct device *dev, kfree(entry); } +/* + * HiSilicon PCIe tune and trace device can be used to trace TLP headers on the + * PCIe link and save the data to memory by DMA. The hardware is restricted to + * use identity mapping only. + */ +#define IS_HISI_PTT_DEVICE(pdev) ((pdev)->vendor == PCI_VENDOR_ID_HUAWEI && \ + (pdev)->device == 0xa12e) + static int arm_smmu_device_domain_type(struct device *dev, unsigned int *type) { -#ifdef CONFIG_SMMU_BYPASS_DEV int i; struct pci_dev *pdev; @@ -3077,6 +3084,13 @@ static int arm_smmu_device_domain_type(struct device *dev, unsigned int *type) return -ERANGE; pdev = to_pci_dev(dev); + + if (IS_HISI_PTT_DEVICE(pdev)) { + *type = IOMMU_DOMAIN_IDENTITY; + return 0; + } + +#ifdef CONFIG_SMMU_BYPASS_DEV for (i = 0; i < smmu_bypass_devices_num; i++) { if ((smmu_bypass_devices[i].vendor == pdev->vendor) && (smmu_bypass_devices[i].device == pdev->device)) { -- 2.27.0