Message ID | 20211122104400.4160-3-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | iommu/mediatek: fix tlb flush logic | expand |
On Mon, 2021-11-22 at 12:44 +0200, Dafna Hirschfeld wrote: > From: Sebastian Reichel <sebastian.reichel@collabora.com> > > In case of v4l2_reqbufs() it is possible, that a TLB flush is done > without runtime PM being enabled. In that case the "Partial TLB flush > timed out, falling back to full flush" warning is printed. > > Commit c0b57581b73b ("iommu/mediatek: Add power-domain operation") > introduced has_pm as optimization to avoid checking runtime PM > when there is no power domain attached. But without the PM domain > there is still the device driver's runtime PM suspend handler, which > disables the clock. Thus flushing should also be avoided when there > is no PM domain involved. > > Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> > Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> Reviewed-by: Yong Wu <yong.wu@mediatek.com> > --- > drivers/iommu/mtk_iommu.c | 10 +++------- > 1 file changed, 3 insertions(+), 7 deletions(-) > > diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c > index 28dc4b95b6d9..b0535fcfd1d7 100644 > --- a/drivers/iommu/mtk_iommu.c > +++ b/drivers/iommu/mtk_iommu.c > @@ -227,16 +227,13 @@ static void > mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, > size_t granule, > struct mtk_iommu_data *data) > { > - bool has_pm = !!data->dev->pm_domain; > unsigned long flags; > int ret; > u32 tmp; > > for_each_m4u(data) { > - if (has_pm) { > - if (pm_runtime_get_if_in_use(data->dev) <= 0) > - continue; > - } > + if (pm_runtime_get_if_in_use(data->dev) <= 0) > + continue; > > spin_lock_irqsave(&data->tlb_lock, flags); > writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, > @@ -261,8 +258,7 @@ static void > mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, > writel_relaxed(0, data->base + REG_MMU_CPE_DONE); > spin_unlock_irqrestore(&data->tlb_lock, flags); > > - if (has_pm) > - pm_runtime_put(data->dev); > + pm_runtime_put(data->dev); > } > } >
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c index 28dc4b95b6d9..b0535fcfd1d7 100644 --- a/drivers/iommu/mtk_iommu.c +++ b/drivers/iommu/mtk_iommu.c @@ -227,16 +227,13 @@ static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, size_t granule, struct mtk_iommu_data *data) { - bool has_pm = !!data->dev->pm_domain; unsigned long flags; int ret; u32 tmp; for_each_m4u(data) { - if (has_pm) { - if (pm_runtime_get_if_in_use(data->dev) <= 0) - continue; - } + if (pm_runtime_get_if_in_use(data->dev) <= 0) + continue; spin_lock_irqsave(&data->tlb_lock, flags); writel_relaxed(F_INVLD_EN1 | F_INVLD_EN0, @@ -261,8 +258,7 @@ static void mtk_iommu_tlb_flush_range_sync(unsigned long iova, size_t size, writel_relaxed(0, data->base + REG_MMU_CPE_DONE); spin_unlock_irqrestore(&data->tlb_lock, flags); - if (has_pm) - pm_runtime_put(data->dev); + pm_runtime_put(data->dev); } }