Lines Matching full:iommu

3  * Support Intel IOMMU PerfMon
10 #include "iommu.h"
327 struct intel_iommu *iommu = iommu_pmu->iommu; in iommu_pmu_start() local
349 * Only IOMMU PMU returns runtime HW error. We don't want to in iommu_pmu_start()
356 ecmd_submit_sync(iommu, DMA_ECMD_ENABLE, hwc->idx, 0); in iommu_pmu_start()
364 struct intel_iommu *iommu = iommu_pmu->iommu; in iommu_pmu_stop() local
368 ecmd_submit_sync(iommu, DMA_ECMD_DISABLE, hwc->idx, 0); in iommu_pmu_stop()
476 struct intel_iommu *iommu = iommu_pmu->iommu; in iommu_pmu_enable() local
478 ecmd_submit_sync(iommu, DMA_ECMD_UNFREEZE, 0, 0); in iommu_pmu_enable()
484 struct intel_iommu *iommu = iommu_pmu->iommu; in iommu_pmu_disable() local
486 ecmd_submit_sync(iommu, DMA_ECMD_FREEZE, 0, 0); in iommu_pmu_disable()
519 struct intel_iommu *iommu = dev_id; in iommu_pmu_irq_handler() local
521 if (!dmar_readl(iommu->reg + DMAR_PERFINTRSTS_REG)) in iommu_pmu_irq_handler()
524 iommu_pmu_counter_overflow(iommu->pmu); in iommu_pmu_irq_handler()
527 dmar_writel(iommu->reg + DMAR_PERFINTRSTS_REG, DMA_PERFINTRSTS_PIS); in iommu_pmu_irq_handler()
532 static int __iommu_pmu_register(struct intel_iommu *iommu) in __iommu_pmu_register() argument
534 struct iommu_pmu *iommu_pmu = iommu->pmu; in __iommu_pmu_register()
536 iommu_pmu->pmu.name = iommu->name; in __iommu_pmu_register()
556 get_perf_reg_address(struct intel_iommu *iommu, u32 offset) in get_perf_reg_address() argument
558 u32 off = dmar_readl(iommu->reg + offset); in get_perf_reg_address()
560 return iommu->reg + off; in get_perf_reg_address()
563 int alloc_iommu_pmu(struct intel_iommu *iommu) in alloc_iommu_pmu() argument
570 if (!ecap_pms(iommu->ecap)) in alloc_iommu_pmu()
573 /* The IOMMU PMU requires the ECMD support as well */ in alloc_iommu_pmu()
574 if (!cap_ecmds(iommu->cap)) in alloc_iommu_pmu()
577 perfcap = dmar_readq(iommu->reg + DMAR_PERFCAP_REG); in alloc_iommu_pmu()
591 if (!ecmd_has_pmu_essential(iommu)) in alloc_iommu_pmu()
600 pr_warn_once("The number of IOMMU counters %d > max(%d), clipping!", in alloc_iommu_pmu()
620 pcap = dmar_readq(iommu->reg + DMAR_PERFEVNTCAP_REG + in alloc_iommu_pmu()
644 iommu_pmu->cfg_reg = get_perf_reg_address(iommu, DMAR_PERFCFGOFF_REG); in alloc_iommu_pmu()
645 iommu_pmu->cntr_reg = get_perf_reg_address(iommu, DMAR_PERFCNTROFF_REG); in alloc_iommu_pmu()
646 iommu_pmu->overflow = get_perf_reg_address(iommu, DMAR_PERFOVFOFF_REG); in alloc_iommu_pmu()
690 iommu_pmu->iommu = iommu; in alloc_iommu_pmu()
691 iommu->pmu = iommu_pmu; in alloc_iommu_pmu()
707 void free_iommu_pmu(struct intel_iommu *iommu) in free_iommu_pmu() argument
709 struct iommu_pmu *iommu_pmu = iommu->pmu; in free_iommu_pmu()
723 iommu->pmu = NULL; in free_iommu_pmu()
726 static int iommu_pmu_set_interrupt(struct intel_iommu *iommu) in iommu_pmu_set_interrupt() argument
728 struct iommu_pmu *iommu_pmu = iommu->pmu; in iommu_pmu_set_interrupt()
731 irq = dmar_alloc_hwirq(IOMMU_IRQ_ID_OFFSET_PERF + iommu->seq_id, iommu->node, iommu); in iommu_pmu_set_interrupt()
735 snprintf(iommu_pmu->irq_name, sizeof(iommu_pmu->irq_name), "dmar%d-perf", iommu->seq_id); in iommu_pmu_set_interrupt()
737 iommu->perf_irq = irq; in iommu_pmu_set_interrupt()
739 IRQF_ONESHOT, iommu_pmu->irq_name, iommu); in iommu_pmu_set_interrupt()
742 iommu->perf_irq = 0; in iommu_pmu_set_interrupt()
748 static void iommu_pmu_unset_interrupt(struct intel_iommu *iommu) in iommu_pmu_unset_interrupt() argument
750 if (!iommu->perf_irq) in iommu_pmu_unset_interrupt()
753 free_irq(iommu->perf_irq, iommu); in iommu_pmu_unset_interrupt()
754 dmar_free_hwirq(iommu->perf_irq); in iommu_pmu_unset_interrupt()
755 iommu->perf_irq = 0; in iommu_pmu_unset_interrupt()
758 void iommu_pmu_register(struct intel_iommu *iommu) in iommu_pmu_register() argument
760 struct iommu_pmu *iommu_pmu = iommu->pmu; in iommu_pmu_register()
765 if (__iommu_pmu_register(iommu)) in iommu_pmu_register()
769 if (iommu_pmu_set_interrupt(iommu)) in iommu_pmu_register()
777 pr_err("Failed to register PMU for iommu (seq_id = %d)\n", iommu->seq_id); in iommu_pmu_register()
778 free_iommu_pmu(iommu); in iommu_pmu_register()
781 void iommu_pmu_unregister(struct intel_iommu *iommu) in iommu_pmu_unregister() argument
783 struct iommu_pmu *iommu_pmu = iommu->pmu; in iommu_pmu_unregister()
788 iommu_pmu_unset_interrupt(iommu); in iommu_pmu_unregister()