diff options
author | Krishna Reddy <vdumpa@nvidia.com> | 2012-03-07 14:35:37 -0800 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2012-03-12 11:12:34 -0700 |
commit | 4d56808a99d76ff49cddecea987d5d46515d7bcd (patch) | |
tree | 08be4cb41c806fa6ebfeef74773be4f91ff33431 /arch/arm/mm | |
parent | 50d651b6cc7b3fdc31b49d81ad3684510e5a16a3 (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.c | 65 |
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 |