diff options
author | Stepan Moskovchenko <stepanm@codeaurora.org> | 2010-11-12 22:29:54 -0500 |
---|---|---|
committer | Daniel Walker <dwalker@codeaurora.org> | 2010-11-30 17:04:21 -0500 |
commit | f6f41eb9ccc0e6fad0ccba4c5e0a97de935db734 (patch) | |
tree | 52d92f95253e017533c273d5514803aaefed9c78 /arch/arm/mach-msm | |
parent | 516cbc793eb4be5123289d067b54dfcdabeddb25 (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.c | 15 |
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) { |