aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-msm
diff options
context:
space:
mode:
authorStepan Moskovchenko <stepanm@codeaurora.org>2010-11-12 22:29:54 -0500
committerDaniel Walker <dwalker@codeaurora.org>2010-11-30 17:04:21 -0500
commitf6f41eb9ccc0e6fad0ccba4c5e0a97de935db734 (patch)
tree52d92f95253e017533c273d5514803aaefed9c78 /arch/arm/mach-msm
parent516cbc793eb4be5123289d067b54dfcdabeddb25 (diff)
msm: iommu: Don't flush page tables if no devices attached
Don't flush the page tables on an IOMMU domain if there are no IOMMU devices attached to the domain. The act of attaching to the domain will cause an implicit flush of those areas if the page tables are configured to not be L2 cacheable. Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org> Signed-off-by: Daniel Walker <dwalker@codeaurora.org>
Diffstat (limited to 'arch/arm/mach-msm')
-rw-r--r--arch/arm/mach-msm/iommu.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/arm/mach-msm/iommu.c b/arch/arm/mach-msm/iommu.c
index 134add789187..74f2157eba4e 100644
--- a/arch/arm/mach-msm/iommu.c
+++ b/arch/arm/mach-msm/iommu.c
@@ -50,13 +50,16 @@ static void __flush_iotlb(struct iommu_domain *domain)
50 unsigned long *fl_table = priv->pgtable; 50 unsigned long *fl_table = priv->pgtable;
51 int i; 51 int i;
52 52
53 dmac_flush_range(fl_table, fl_table + SZ_16K); 53 if (!list_empty(&priv->list_attached)) {
54 dmac_flush_range(fl_table, fl_table + SZ_16K);
54 55
55 for (i = 0; i < NUM_FL_PTE; i++) 56 for (i = 0; i < NUM_FL_PTE; i++)
56 if ((fl_table[i] & 0x03) == FL_TYPE_TABLE) { 57 if ((fl_table[i] & 0x03) == FL_TYPE_TABLE) {
57 void *sl_table = __va(fl_table[i] & FL_BASE_MASK); 58 void *sl_table = __va(fl_table[i] &
58 dmac_flush_range(sl_table, sl_table + SZ_4K); 59 FL_BASE_MASK);
59 } 60 dmac_flush_range(sl_table, sl_table + SZ_4K);
61 }
62 }
60#endif 63#endif
61 64
62 list_for_each_entry(ctx_drvdata, &priv->list_attached, attached_elm) { 65 list_for_each_entry(ctx_drvdata, &priv->list_attached, attached_elm) {