diff options
author | Krishna Reddy <vdumpa@nvidia.com> | 2011-07-25 11:49:54 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:47:56 -0800 |
commit | fa50e4a7c25c990d96dd3e91d302382fdf6b2d6d (patch) | |
tree | 8ab797b8bc6ac1d40af40680e3ff72a580baab9f /drivers/video/tegra/nvmap | |
parent | 2a0e401479e4d422305f17123096d02f29d531ac (diff) |
video: tegra: nvmap: Allow cache maint for write combine memory.
Map uncahced memory as uncached, inner cached as inner cached and
cached as cached.
Bug 841109
Original-Change-Id: Id92532828ab2e69bac80b20f2be2fc243e4db888
Reviewed-on: http://git-master/r/43078
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Tested-by: Krishna Reddy <vdumpa@nvidia.com>
Reviewed-by: Kaz Fukuoka <kfukuoka@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
Rebase-Id: R75168ffeab3c91d3080b53d4d66c4e550d6f9e12
Diffstat (limited to 'drivers/video/tegra/nvmap')
-rw-r--r-- | drivers/video/tegra/nvmap/nvmap.h | 2 | ||||
-rw-r--r-- | drivers/video/tegra/nvmap/nvmap_ioctl.c | 19 |
2 files changed, 13 insertions, 8 deletions
diff --git a/drivers/video/tegra/nvmap/nvmap.h b/drivers/video/tegra/nvmap/nvmap.h index 488e8fb18048..b0fd163c289d 100644 --- a/drivers/video/tegra/nvmap/nvmap.h +++ b/drivers/video/tegra/nvmap/nvmap.h @@ -230,7 +230,7 @@ static inline void nvmap_handle_put(struct nvmap_handle *h) static inline pgprot_t nvmap_pgprot(struct nvmap_handle *h, pgprot_t prot) { if (h->flags == NVMAP_HANDLE_UNCACHEABLE) - return pgprot_dmacoherent(prot); + return pgprot_noncached(prot); else if (h->flags == NVMAP_HANDLE_WRITE_COMBINE) return pgprot_writecombine(prot); else if (h->flags == NVMAP_HANDLE_INNER_CACHEABLE) diff --git a/drivers/video/tegra/nvmap/nvmap_ioctl.c b/drivers/video/tegra/nvmap/nvmap_ioctl.c index d5fce51190dd..4b4d7c35aa20 100644 --- a/drivers/video/tegra/nvmap/nvmap_ioctl.c +++ b/drivers/video/tegra/nvmap/nvmap_ioctl.c @@ -220,6 +220,7 @@ int nvmap_map_into_caller_ptr(struct file *filp, void __user *arg) struct nvmap_vma_priv *vpriv; struct vm_area_struct *vma; struct nvmap_handle *h = NULL; + unsigned int cache_flags; int err = 0; if (copy_from_user(&op, arg, sizeof(op))) @@ -283,7 +284,9 @@ int nvmap_map_into_caller_ptr(struct file *filp, void __user *arg) vpriv->handle = h; vpriv->offs = op.offset; - if (op.flags == NVMAP_HANDLE_INNER_CACHEABLE) { + cache_flags = op.flags & NVMAP_HANDLE_CACHE_FLAG; + if (cache_flags == NVMAP_HANDLE_INNER_CACHEABLE || + cache_flags == NVMAP_HANDLE_CACHEABLE) { if (h->orig_size & ~PAGE_MASK) { pr_err("\n%s:attempt to convert a buffer from uc/wc to" " wb, whose size is not a multiple of page size." @@ -291,8 +294,8 @@ int nvmap_map_into_caller_ptr(struct file *filp, void __user *arg) } else { wmb(); /* override allocation time cache coherency attributes. */ - h->flags &= (~NVMAP_HANDLE_CACHEABLE); - h->flags |= NVMAP_HANDLE_INNER_CACHEABLE; + h->flags &= ~NVMAP_HANDLE_CACHE_FLAG; + h->flags |= cache_flags; } } vma->vm_page_prot = nvmap_pgprot(h, vma->vm_page_prot); @@ -568,9 +571,12 @@ static int cache_maint(struct nvmap_client *client, struct nvmap_handle *h, goto out; } - if (h->flags == NVMAP_HANDLE_UNCACHEABLE || - h->flags == NVMAP_HANDLE_WRITE_COMBINE || - start == end) + wmb(); +#if defined(CONFIG_ARCH_TEGRA_2x_SOC) + if (h->flags == NVMAP_HANDLE_WRITE_COMBINE) + goto out; +#endif + if (h->flags == NVMAP_HANDLE_UNCACHEABLE || start == end) goto out; if (fast_cache_maint(client, h, start, end, op)) @@ -627,7 +633,6 @@ out: if (pte) nvmap_free_pte(client->dev, pte); nvmap_handle_put(h); - wmb(); return err; } |