diff options
Diffstat (limited to 'drivers/video/tegra/nvmap/nvmap_ioctl.c')
-rw-r--r-- | drivers/video/tegra/nvmap/nvmap_ioctl.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/video/tegra/nvmap/nvmap_ioctl.c b/drivers/video/tegra/nvmap/nvmap_ioctl.c index e3adc0abc174..da974b2c6846 100644 --- a/drivers/video/tegra/nvmap/nvmap_ioctl.c +++ b/drivers/video/tegra/nvmap/nvmap_ioctl.c @@ -550,14 +550,32 @@ static void heap_page_cache_maint(struct nvmap_client *client, } } +static bool fast_cache_maint_outer(unsigned long start, + unsigned long end, unsigned int op) +{ + bool result = false; +#if defined(CONFIG_NVMAP_OUTER_CACHE_MAINT_BY_SET_WAYS) + if (end - start >= FLUSH_CLEAN_BY_SET_WAY_THRESHOLD_OUTER) { + if (op == NVMAP_CACHE_OP_WB_INV) { + outer_flush_all(); + result = true; + } + if (op == NVMAP_CACHE_OP_WB) { + outer_clean_all(); + result = true; + } + } +#endif + return result; +} + static bool fast_cache_maint(struct nvmap_client *client, struct nvmap_handle *h, unsigned long start, unsigned long end, unsigned int op) { int ret = false; - #if defined(CONFIG_NVMAP_CACHE_MAINT_BY_SET_WAYS) if ((op == NVMAP_CACHE_OP_INV) || - ((end - start) < FLUSH_CLEAN_BY_SET_WAY_THRESHOLD)) + ((end - start) < FLUSH_CLEAN_BY_SET_WAY_THRESHOLD_INNER)) goto out; if (op == NVMAP_CACHE_OP_WB_INV) @@ -565,13 +583,19 @@ static bool fast_cache_maint(struct nvmap_client *client, struct nvmap_handle *h else if (op == NVMAP_CACHE_OP_WB) inner_clean_cache_all(); - if (h->heap_pgalloc && (h->flags != NVMAP_HANDLE_INNER_CACHEABLE)) { - heap_page_cache_maint(client, h, start, end, op, - false, true, NULL, 0, 0); - } else if (h->flags != NVMAP_HANDLE_INNER_CACHEABLE) { - start += h->carveout->base; - end += h->carveout->base; - outer_cache_maint(op, start, end - start); + /* outer maintenance */ + if (h->flags != NVMAP_HANDLE_INNER_CACHEABLE ) { + if(!fast_cache_maint_outer(start, end, op)) + { + if (h->heap_pgalloc) { + heap_page_cache_maint(client, h, start, + end, op, false, true, NULL, 0, 0); + } else { + start += h->carveout->base; + end += h->carveout->base; + outer_cache_maint(op, start, end - start); + } + } } ret = true; out: |