Loading drivers/iommu/arm-smmu.c +9 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ #include <soc/qcom/secure_buffer.h> #include <linux/of_platform.h> #include <linux/msm-bus.h> #include <trace/events/iommu.h> #include <dt-bindings/msm/msm-bus-ids.h> #include <linux/amba/bus.h> Loading Loading @@ -1153,6 +1154,7 @@ static void arm_smmu_secure_pool_destroy(struct arm_smmu_domain *smmu_domain) list_for_each_entry_safe(it, i, &smmu_domain->secure_pool_list, list) { arm_smmu_unprepare_pgtable(smmu_domain, it->addr, it->size); /* pages will be freed later (after being unassigned) */ list_del(&it->list); kfree(it); } } Loading Loading @@ -2628,6 +2630,8 @@ static size_t arm_smmu_map_sg(struct iommu_domain *domain, unsigned long iova, if (ret) return ret; arm_smmu_secure_domain_lock(smmu_domain); __saved_iova_start = iova; idx_start = idx_end = 0; sg_start = sg_end = sg; Loading Loading @@ -2665,6 +2669,7 @@ static size_t arm_smmu_map_sg(struct iommu_domain *domain, unsigned long iova, arm_smmu_unmap(domain, __saved_iova_start, size_to_unmap); iova = __saved_iova_start; } arm_smmu_secure_domain_unlock(smmu_domain); arm_smmu_domain_power_off(domain, smmu_domain->smmu); return iova - __saved_iova_start; } Loading Loading @@ -4732,10 +4737,12 @@ static int __init arm_smmu_init(void) { static bool registered; int ret = 0; ktime_t cur; if (registered) return 0; cur = ktime_get(); ret = platform_driver_register(&qsmmuv500_tbu_driver); if (ret) return ret; Loading @@ -4745,6 +4752,8 @@ static int __init arm_smmu_init(void) ret = register_iommu_sec_ptbl(); #endif registered = !ret; trace_smmu_init(ktime_us_delta(ktime_get(), cur)); return ret; } Loading drivers/iommu/dma-mapping-fast.c +2 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,8 @@ static int fast_smmu_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir, unsigned long attrs) { return -EINVAL; /* 0 indicates error */ return 0; } static void fast_smmu_unmap_sg(struct device *dev, Loading drivers/iommu/io-pgtable-arm.c +0 −15 Original line number Diff line number Diff line Loading @@ -406,21 +406,6 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, BUG_ON(!suppress_map_failures); return -EEXIST; } if (iopte_leaf(pte, lvl)) { WARN_ON(!selftest_running); return -EEXIST; } else if (iopte_type(pte, lvl) == ARM_LPAE_PTE_TYPE_TABLE) { /* * We need to unmap and free the old table before * overwriting it with a block entry. */ arm_lpae_iopte *tblp; size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data); tblp = ptep - ARM_LPAE_LVL_IDX(iova, lvl, data); if (WARN_ON(__arm_lpae_unmap(data, iova, sz, lvl, tblp) != sz)) return -EINVAL; } __arm_lpae_init_pte(data, paddr, prot, lvl, ptep, flush); Loading drivers/iommu/iommu-debug.c +8 −4 Original line number Diff line number Diff line Loading @@ -102,20 +102,25 @@ void iommu_debug_attach_device(struct iommu_domain *domain, struct iommu_debug_attachment *attach; struct iommu_group *group; group = iommu_group_get(dev); group = dev->iommu_group; if (!group) return; mutex_lock(&iommu_debug_attachments_lock); list_for_each_entry(attach, &iommu_debug_attachments, list) if ((attach->domain == domain) && (attach->group == group)) goto out; attach = kzalloc(sizeof(*attach), GFP_KERNEL); if (!attach) return; goto out; attach->domain = domain; attach->group = group; INIT_LIST_HEAD(&attach->list); mutex_lock(&iommu_debug_attachments_lock); list_add(&attach->list, &iommu_debug_attachments); out: mutex_unlock(&iommu_debug_attachments_lock); } Loading @@ -128,7 +133,6 @@ void iommu_debug_domain_remove(struct iommu_domain *domain) if (it->domain != domain) continue; list_del(&it->list); iommu_group_put(it->group); kfree(it); } Loading include/trace/events/iommu.h +18 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,24 @@ DEFINE_EVENT(iommu_error, io_page_fault, TP_ARGS(dev, iova, flags) ); TRACE_EVENT(smmu_init, TP_PROTO(u64 time), TP_ARGS(time), TP_STRUCT__entry( __field(u64, time) ), TP_fast_assign( __entry->time = time; ), TP_printk("ARM SMMU init latency: %lld us", __entry->time) ); #endif /* _TRACE_IOMMU_H */ /* This part must be outside protection */ Loading Loading
drivers/iommu/arm-smmu.c +9 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ #include <soc/qcom/secure_buffer.h> #include <linux/of_platform.h> #include <linux/msm-bus.h> #include <trace/events/iommu.h> #include <dt-bindings/msm/msm-bus-ids.h> #include <linux/amba/bus.h> Loading Loading @@ -1153,6 +1154,7 @@ static void arm_smmu_secure_pool_destroy(struct arm_smmu_domain *smmu_domain) list_for_each_entry_safe(it, i, &smmu_domain->secure_pool_list, list) { arm_smmu_unprepare_pgtable(smmu_domain, it->addr, it->size); /* pages will be freed later (after being unassigned) */ list_del(&it->list); kfree(it); } } Loading Loading @@ -2628,6 +2630,8 @@ static size_t arm_smmu_map_sg(struct iommu_domain *domain, unsigned long iova, if (ret) return ret; arm_smmu_secure_domain_lock(smmu_domain); __saved_iova_start = iova; idx_start = idx_end = 0; sg_start = sg_end = sg; Loading Loading @@ -2665,6 +2669,7 @@ static size_t arm_smmu_map_sg(struct iommu_domain *domain, unsigned long iova, arm_smmu_unmap(domain, __saved_iova_start, size_to_unmap); iova = __saved_iova_start; } arm_smmu_secure_domain_unlock(smmu_domain); arm_smmu_domain_power_off(domain, smmu_domain->smmu); return iova - __saved_iova_start; } Loading Loading @@ -4732,10 +4737,12 @@ static int __init arm_smmu_init(void) { static bool registered; int ret = 0; ktime_t cur; if (registered) return 0; cur = ktime_get(); ret = platform_driver_register(&qsmmuv500_tbu_driver); if (ret) return ret; Loading @@ -4745,6 +4752,8 @@ static int __init arm_smmu_init(void) ret = register_iommu_sec_ptbl(); #endif registered = !ret; trace_smmu_init(ktime_us_delta(ktime_get(), cur)); return ret; } Loading
drivers/iommu/dma-mapping-fast.c +2 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,8 @@ static int fast_smmu_map_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir, unsigned long attrs) { return -EINVAL; /* 0 indicates error */ return 0; } static void fast_smmu_unmap_sg(struct device *dev, Loading
drivers/iommu/io-pgtable-arm.c +0 −15 Original line number Diff line number Diff line Loading @@ -406,21 +406,6 @@ static int arm_lpae_init_pte(struct arm_lpae_io_pgtable *data, BUG_ON(!suppress_map_failures); return -EEXIST; } if (iopte_leaf(pte, lvl)) { WARN_ON(!selftest_running); return -EEXIST; } else if (iopte_type(pte, lvl) == ARM_LPAE_PTE_TYPE_TABLE) { /* * We need to unmap and free the old table before * overwriting it with a block entry. */ arm_lpae_iopte *tblp; size_t sz = ARM_LPAE_BLOCK_SIZE(lvl, data); tblp = ptep - ARM_LPAE_LVL_IDX(iova, lvl, data); if (WARN_ON(__arm_lpae_unmap(data, iova, sz, lvl, tblp) != sz)) return -EINVAL; } __arm_lpae_init_pte(data, paddr, prot, lvl, ptep, flush); Loading
drivers/iommu/iommu-debug.c +8 −4 Original line number Diff line number Diff line Loading @@ -102,20 +102,25 @@ void iommu_debug_attach_device(struct iommu_domain *domain, struct iommu_debug_attachment *attach; struct iommu_group *group; group = iommu_group_get(dev); group = dev->iommu_group; if (!group) return; mutex_lock(&iommu_debug_attachments_lock); list_for_each_entry(attach, &iommu_debug_attachments, list) if ((attach->domain == domain) && (attach->group == group)) goto out; attach = kzalloc(sizeof(*attach), GFP_KERNEL); if (!attach) return; goto out; attach->domain = domain; attach->group = group; INIT_LIST_HEAD(&attach->list); mutex_lock(&iommu_debug_attachments_lock); list_add(&attach->list, &iommu_debug_attachments); out: mutex_unlock(&iommu_debug_attachments_lock); } Loading @@ -128,7 +133,6 @@ void iommu_debug_domain_remove(struct iommu_domain *domain) if (it->domain != domain) continue; list_del(&it->list); iommu_group_put(it->group); kfree(it); } Loading
include/trace/events/iommu.h +18 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,24 @@ DEFINE_EVENT(iommu_error, io_page_fault, TP_ARGS(dev, iova, flags) ); TRACE_EVENT(smmu_init, TP_PROTO(u64 time), TP_ARGS(time), TP_STRUCT__entry( __field(u64, time) ), TP_fast_assign( __entry->time = time; ), TP_printk("ARM SMMU init latency: %lld us", __entry->time) ); #endif /* _TRACE_IOMMU_H */ /* This part must be outside protection */ Loading