diff options
| author | Yagya Sen <yagya@codeaurora.org> | 2015-09-10 10:18:36 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-22 11:04:40 -0700 |
| commit | 830561c2653df9d05d044776f8ce02857d39554a (patch) | |
| tree | bbadf1509b6a42723fc4fb48185c8f879c6e28e6 | |
| parent | 7c7828ace079c1b7d14a64dca93b8da96c903eee (diff) | |
Revert "msm: ion: fix ion cache maintenance issue"
This reverts commit afedf4f2f4c57d2("msm: ion: fix ion cache
maintenance issue") was causing device crash just after
launching camera or adrenotest app. revert the change
till original issue get fixed.
Change-Id: I32e9ff9610de7de8f24fae36ed14ff35a9806f0c
Signed-off-by: Fnu Yagyasen <yagya@codeaurora.org>
| -rw-r--r-- | drivers/staging/android/ion/msm/msm_ion.c | 105 |
1 files changed, 16 insertions, 89 deletions
diff --git a/drivers/staging/android/ion/msm/msm_ion.c b/drivers/staging/android/ion/msm/msm_ion.c index 6b8c08ec4cf4..14983c7f8910 100644 --- a/drivers/staging/android/ion/msm/msm_ion.c +++ b/drivers/staging/android/ion/msm/msm_ion.c @@ -12,7 +12,6 @@ */ #include <linux/err.h> -#include <linux/io.h> #include <linux/msm_ion.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -232,71 +231,6 @@ static int ion_no_pages_cache_ops(struct ion_client *client, return 0; } -static void __do_cache_ops(struct page *page, unsigned int offset, - unsigned int length, void (*op)(const void *, const void *)) -{ - unsigned int left = length; - unsigned long pfn; - unsigned long nr_pages; - void *vaddr; - - pfn = page_to_pfn(page) + offset / PAGE_SIZE; - page = pfn_to_page(pfn); - offset &= ~PAGE_MASK; - - if (!PageHighMem(page)) { - vaddr = page_address(page) + offset; - op(vaddr, vaddr + length); - goto out; - } - - nr_pages = DIV_ROUND_UP(length, PAGE_SIZE); - if (nr_pages > 1) { - struct vm_struct *area; - unsigned long addr; - - area = get_vm_area_caller((nr_pages << PAGE_SHIFT), VM_IOREMAP, - __builtin_return_address(0)); - if (!area) - goto perpage; - - addr = (unsigned long)area->addr; - area->phys_addr = __pfn_to_phys(pfn); - - if (ioremap_page_range(addr, addr + length, area->phys_addr, - PAGE_KERNEL)) { - vunmap(area->addr); - goto perpage; - } - - op(area->addr + offset, area->addr + offset + length); - unmap_kernel_range_noflush(addr, area->size); - vunmap(area->addr); - goto out; - } - -perpage: - do { - unsigned int len; - - len = left; - if (len + offset > PAGE_SIZE) - len = PAGE_SIZE - offset; - - page = pfn_to_page(pfn); - vaddr = kmap_atomic(page); - op(vaddr + offset, vaddr + offset + len); - kunmap_atomic(vaddr); - - offset = 0; - pfn++; - left -= len; - } while (left); - -out: - return; -} - static int ion_pages_cache_ops(struct ion_client *client, struct ion_handle *handle, void *vaddr, unsigned int offset, unsigned int length, @@ -304,43 +238,36 @@ static int ion_pages_cache_ops(struct ion_client *client, { struct sg_table *table = NULL; struct scatterlist *sg; + struct page *page; int i; - unsigned int len = 0; - void (*op)(const void *, const void *); - + void *ptr; table = ion_sg_table(client, handle); if (IS_ERR_OR_NULL(table)) return PTR_ERR(table); - switch (cmd) { + for_each_sg(table->sgl, sg, table->nents, i) { + page = sg_page(sg); + if (PageHighMem(page)) + ptr = kmap_atomic(page); + else + ptr = page_address(page); + + switch (cmd) { case ION_IOC_CLEAN_CACHES: - op = dmac_clean_range; + dmac_clean_range(ptr, ptr + sg->length); break; case ION_IOC_INV_CACHES: - op = dmac_inv_range; + dmac_inv_range(ptr, ptr + sg->length); break; case ION_IOC_CLEAN_INV_CACHES: - op = dmac_flush_range; + dmac_flush_range(ptr, ptr + sg->length); break; default: return -EINVAL; - }; - - if (vaddr) { - op(vaddr + offset, vaddr + offset + length); - return 0; - } - - for_each_sg(table->sgl, sg, table->nents, i) { - len += sg->length; - if (len < offset) - continue; - - __do_cache_ops(sg_page(sg), sg->offset, sg->length, op); - - if (len > length + offset) - break; + } + if (PageHighMem(page)) + kunmap_atomic(ptr); } return 0; } |
