summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/nvmap
diff options
context:
space:
mode:
authorKrishna Reddy <vdumpa@nvidia.com>2011-07-25 11:49:54 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:56 -0800
commitfa50e4a7c25c990d96dd3e91d302382fdf6b2d6d (patch)
tree8ab797b8bc6ac1d40af40680e3ff72a580baab9f /drivers/video/tegra/nvmap
parent2a0e401479e4d422305f17123096d02f29d531ac (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.h2
-rw-r--r--drivers/video/tegra/nvmap/nvmap_ioctl.c19
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;
}