diff options
Diffstat (limited to 'drivers/video/tegra/nvmap/nvmap_handle.c')
-rw-r--r-- | drivers/video/tegra/nvmap/nvmap_handle.c | 21 |
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; } |