summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/nvmap/nvmap_handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra/nvmap/nvmap_handle.c')
-rw-r--r--drivers/video/tegra/nvmap/nvmap_handle.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/video/tegra/nvmap/nvmap_handle.c b/drivers/video/tegra/nvmap/nvmap_handle.c
index dc3be30ca2f5..a9150a36cf2a 100644
--- a/drivers/video/tegra/nvmap/nvmap_handle.c
+++ b/drivers/video/tegra/nvmap/nvmap_handle.c
@@ -37,6 +37,7 @@
#include "nvmap.h"
#include "nvmap_mru.h"
+#include "nvmap_common.h"
#define NVMAP_SECURE_HEAPS (NVMAP_HEAP_CARVEOUT_IRAM | NVMAP_HEAP_IOVMM)
#ifdef CONFIG_NVMAP_HIGHMEM_ONLY
@@ -107,7 +108,8 @@ out:
extern void __flush_dcache_page(struct address_space *, struct page *);
-static struct page *nvmap_alloc_pages_exact(gfp_t gfp, size_t size)
+static struct page *nvmap_alloc_pages_exact(gfp_t gfp,
+ size_t size, bool flush_inner)
{
struct page *page, *p, *e;
unsigned int order;
@@ -127,8 +129,10 @@ static struct page *nvmap_alloc_pages_exact(gfp_t gfp, size_t size)
__free_page(p);
e = page + (size >> PAGE_SHIFT);
- for (p = page; p < e; p++)
- __flush_dcache_page(page_mapping(p), p);
+ if (flush_inner) {
+ for (p = page; p < e; p++)
+ __flush_dcache_page(page_mapping(p), p);
+ }
base = page_to_phys(page);
outer_flush_range(base, base + size);
@@ -143,6 +147,7 @@ static int handle_page_alloc(struct nvmap_client *client,
pgprot_t prot;
unsigned int i = 0;
struct page **pages;
+ bool flush_inner = true;
pages = altalloc(nr_page * sizeof(*pages));
if (!pages)
@@ -155,10 +160,14 @@ static int handle_page_alloc(struct nvmap_client *client,
contiguous = true;
#endif
+ if (size >= FLUSH_CLEAN_BY_SET_WAY_THRESHOLD) {
+ inner_flush_cache_all();
+ flush_inner = false;
+ }
h->pgalloc.area = NULL;
if (contiguous) {
struct page *page;
- page = nvmap_alloc_pages_exact(GFP_NVMAP, size);
+ page = nvmap_alloc_pages_exact(GFP_NVMAP, size, flush_inner);
if (!page)
goto fail;
@@ -167,7 +176,8 @@ static int handle_page_alloc(struct nvmap_client *client,
} else {
for (i = 0; i < nr_page; i++) {
- pages[i] = nvmap_alloc_pages_exact(GFP_NVMAP, PAGE_SIZE);
+ pages[i] = nvmap_alloc_pages_exact(GFP_NVMAP, PAGE_SIZE,
+ flush_inner);
if (!pages[i])
goto fail;
}
@@ -193,6 +203,7 @@ fail:
while (i--)
__free_page(pages[i]);
altfree(pages, nr_page * sizeof(*pages));
+ wmb();
return -ENOMEM;
}