diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/iommu/Makefile | 1 | ||||
-rw-r--r-- | drivers/iommu/intel-iommu.c | 13 | ||||
-rw-r--r-- | drivers/iommu/intel-trace.c | 14 |
3 files changed, 25 insertions, 3 deletions
diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index f13f36ae1af6..bfe27b2755bd 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile | |||
@@ -17,6 +17,7 @@ obj-$(CONFIG_ARM_SMMU) += arm-smmu.o | |||
17 | obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o | 17 | obj-$(CONFIG_ARM_SMMU_V3) += arm-smmu-v3.o |
18 | obj-$(CONFIG_DMAR_TABLE) += dmar.o | 18 | obj-$(CONFIG_DMAR_TABLE) += dmar.o |
19 | obj-$(CONFIG_INTEL_IOMMU) += intel-iommu.o intel-pasid.o | 19 | obj-$(CONFIG_INTEL_IOMMU) += intel-iommu.o intel-pasid.o |
20 | obj-$(CONFIG_INTEL_IOMMU) += intel-trace.o | ||
20 | obj-$(CONFIG_INTEL_IOMMU_DEBUGFS) += intel-iommu-debugfs.o | 21 | obj-$(CONFIG_INTEL_IOMMU_DEBUGFS) += intel-iommu-debugfs.o |
21 | obj-$(CONFIG_INTEL_IOMMU_SVM) += intel-svm.o | 22 | obj-$(CONFIG_INTEL_IOMMU_SVM) += intel-svm.o |
22 | obj-$(CONFIG_IPMMU_VMSA) += ipmmu-vmsa.o | 23 | obj-$(CONFIG_IPMMU_VMSA) += ipmmu-vmsa.o |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 0af7b4669264..12831beead02 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -3512,6 +3512,9 @@ static dma_addr_t __intel_map_single(struct device *dev, phys_addr_t paddr, | |||
3512 | 3512 | ||
3513 | start_paddr = (phys_addr_t)iova_pfn << PAGE_SHIFT; | 3513 | start_paddr = (phys_addr_t)iova_pfn << PAGE_SHIFT; |
3514 | start_paddr += paddr & ~PAGE_MASK; | 3514 | start_paddr += paddr & ~PAGE_MASK; |
3515 | |||
3516 | trace_map_single(dev, start_paddr, paddr, size << VTD_PAGE_SHIFT); | ||
3517 | |||
3515 | return start_paddr; | 3518 | return start_paddr; |
3516 | 3519 | ||
3517 | error: | 3520 | error: |
@@ -3567,10 +3570,7 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size) | |||
3567 | if (dev_is_pci(dev)) | 3570 | if (dev_is_pci(dev)) |
3568 | pdev = to_pci_dev(dev); | 3571 | pdev = to_pci_dev(dev); |
3569 | 3572 | ||
3570 | dev_dbg(dev, "Device unmapping: pfn %lx-%lx\n", start_pfn, last_pfn); | ||
3571 | |||
3572 | freelist = domain_unmap(domain, start_pfn, last_pfn); | 3573 | freelist = domain_unmap(domain, start_pfn, last_pfn); |
3573 | |||
3574 | if (intel_iommu_strict || (pdev && pdev->untrusted) || | 3574 | if (intel_iommu_strict || (pdev && pdev->untrusted) || |
3575 | !has_iova_flush_queue(&domain->iovad)) { | 3575 | !has_iova_flush_queue(&domain->iovad)) { |
3576 | iommu_flush_iotlb_psi(iommu, domain, start_pfn, | 3576 | iommu_flush_iotlb_psi(iommu, domain, start_pfn, |
@@ -3586,6 +3586,8 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size) | |||
3586 | * cpu used up by the iotlb flush operation... | 3586 | * cpu used up by the iotlb flush operation... |
3587 | */ | 3587 | */ |
3588 | } | 3588 | } |
3589 | |||
3590 | trace_unmap_single(dev, dev_addr, size); | ||
3589 | } | 3591 | } |
3590 | 3592 | ||
3591 | static void intel_unmap_page(struct device *dev, dma_addr_t dev_addr, | 3593 | static void intel_unmap_page(struct device *dev, dma_addr_t dev_addr, |
@@ -3676,6 +3678,8 @@ static void intel_unmap_sg(struct device *dev, struct scatterlist *sglist, | |||
3676 | } | 3678 | } |
3677 | 3679 | ||
3678 | intel_unmap(dev, startaddr, nrpages << VTD_PAGE_SHIFT); | 3680 | intel_unmap(dev, startaddr, nrpages << VTD_PAGE_SHIFT); |
3681 | |||
3682 | trace_unmap_sg(dev, startaddr, nrpages << VTD_PAGE_SHIFT); | ||
3679 | } | 3683 | } |
3680 | 3684 | ||
3681 | static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nelems, | 3685 | static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nelems, |
@@ -3732,6 +3736,9 @@ static int intel_map_sg(struct device *dev, struct scatterlist *sglist, int nele | |||
3732 | return 0; | 3736 | return 0; |
3733 | } | 3737 | } |
3734 | 3738 | ||
3739 | trace_map_sg(dev, iova_pfn << PAGE_SHIFT, | ||
3740 | sg_phys(sglist), size << VTD_PAGE_SHIFT); | ||
3741 | |||
3735 | return nelems; | 3742 | return nelems; |
3736 | } | 3743 | } |
3737 | 3744 | ||
diff --git a/drivers/iommu/intel-trace.c b/drivers/iommu/intel-trace.c new file mode 100644 index 000000000000..bfb6a6e37a88 --- /dev/null +++ b/drivers/iommu/intel-trace.c | |||
@@ -0,0 +1,14 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* | ||
3 | * Intel IOMMU trace support | ||
4 | * | ||
5 | * Copyright (C) 2019 Intel Corporation | ||
6 | * | ||
7 | * Author: Lu Baolu <baolu.lu@linux.intel.com> | ||
8 | */ | ||
9 | |||
10 | #include <linux/string.h> | ||
11 | #include <linux/types.h> | ||
12 | |||
13 | #define CREATE_TRACE_POINTS | ||
14 | #include <trace/events/intel_iommu.h> | ||