summaryrefslogtreecommitdiff
path: root/arch/arm/mm
diff options
context:
space:
mode:
authorKrishna Reddy <vdumpa@nvidia.com>2012-03-07 14:35:37 -0800
committerVarun Colbert <vcolbert@nvidia.com>2012-03-12 11:12:34 -0700
commit4d56808a99d76ff49cddecea987d5d46515d7bcd (patch)
tree08be4cb41c806fa6ebfeef74773be4f91ff33431 /arch/arm/mm
parent50d651b6cc7b3fdc31b49d81ad3684510e5a16a3 (diff)
ARM: mm: Use CONFIG_CPA
Use CONFIG_CPA flag to allow disabling CPA code. Change-Id: Ic6a4993dbabbef8d9847295f698887d73d81269a Signed-off-by: Krishna Reddy <vdumpa@nvidia.com> Reviewed-on: http://git-master/r/88464 Reviewed-by: Jon Mayo <jmayo@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Diffstat (limited to 'arch/arm/mm')
-rw-r--r--arch/arm/mm/pageattr.c65
1 files changed, 60 insertions, 5 deletions
diff --git a/arch/arm/mm/pageattr.c b/arch/arm/mm/pageattr.c
index 2026c5100473..5f8071110e88 100644
--- a/arch/arm/mm/pageattr.c
+++ b/arch/arm/mm/pageattr.c
@@ -33,6 +33,12 @@
extern void v7_flush_kern_cache_all(void *);
extern void __flush_dcache_page(struct address_space *, struct page *);
+static void inner_flush_cache_all(void)
+{
+ on_each_cpu(v7_flush_kern_cache_all, NULL, 1);
+}
+
+#if defined(CONFIG_CPA)
/*
* The current flushing context - we pass it instead of 5 arguments:
*/
@@ -129,11 +135,6 @@ static void cpa_flush_range(unsigned long start, int numpages, int cache)
}
}
-static void inner_flush_cache_all(void)
-{
- on_each_cpu(v7_flush_kern_cache_all, NULL, 1);
-}
-
static void cpa_flush_array(unsigned long *start, int numpages, int cache,
int in_flags, struct page **pages)
{
@@ -1019,3 +1020,57 @@ int set_pages_array_iwb(struct page **pages, int addrinarray)
L_PTE_MT_INNER_WB, L_PTE_MT_MASK);
}
EXPORT_SYMBOL(set_pages_array_iwb);
+
+#else /* CONFIG_CPA */
+
+void update_page_count(int level, unsigned long pages)
+{
+}
+
+static void flush_cache(struct page **pages, int numpages)
+{
+ unsigned int i;
+ bool flush_inner = true;
+ unsigned long base;
+
+ if (numpages >= FLUSH_CLEAN_BY_SET_WAY_PAGE_THRESHOLD) {
+ inner_flush_cache_all();
+ flush_inner = false;
+ }
+
+ for (i = 0; i < numpages; i++) {
+ if (flush_inner)
+ __flush_dcache_page(page_mapping(pages[i]), pages[i]);
+ base = page_to_phys(pages[i]);
+ outer_flush_range(base, base + PAGE_SIZE);
+ }
+}
+
+int set_pages_array_uc(struct page **pages, int addrinarray)
+{
+ flush_cache(pages, addrinarray);
+ return 0;
+}
+EXPORT_SYMBOL(set_pages_array_uc);
+
+int set_pages_array_wc(struct page **pages, int addrinarray)
+{
+ flush_cache(pages, addrinarray);
+ return 0;
+}
+EXPORT_SYMBOL(set_pages_array_wc);
+
+int set_pages_array_wb(struct page **pages, int addrinarray)
+{
+ return 0;
+}
+EXPORT_SYMBOL(set_pages_array_wb);
+
+int set_pages_array_iwb(struct page **pages, int addrinarray)
+{
+ flush_cache(pages, addrinarray);
+ return 0;
+}
+EXPORT_SYMBOL(set_pages_array_iwb);
+
+#endif