diff options
author | Craig Stout <craig.stout@ti.com> | 2012-08-16 16:32:25 -0700 |
---|---|---|
committer | Jack Yen <jyen@ti.com> | 2012-08-30 16:53:17 -0500 |
commit | 385ad66a6347e1611b074086860b0df88da08fb8 (patch) | |
tree | aaa75633a45d9c620327ca7e7bd49761053599ef /drivers/misc | |
parent | 6939738bcae49f8077ba4a0069578042755aacf0 (diff) | |
download | kernel_samsung_espresso10-385ad66a6347e1611b074086860b0df88da08fb8.zip kernel_samsung_espresso10-385ad66a6347e1611b074086860b0df88da08fb8.tar.gz kernel_samsung_espresso10-385ad66a6347e1611b074086860b0df88da08fb8.tar.bz2 |
cache-2dmanager: handle case where physical page not found.
This can happen if a userspace app allocates a buffer but doesn't
initialize it, and does not explicitly map the buffer.
Change-Id: Ia431bb8bd713c3eb8ac937b274e8422bc23651f0
Signed-off-by: Craig Stout <craig.stout@ti.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/cache-2dmanager/cache-2dmanager.c | 103 |
1 files changed, 52 insertions, 51 deletions
diff --git a/drivers/misc/cache-2dmanager/cache-2dmanager.c b/drivers/misc/cache-2dmanager/cache-2dmanager.c index 5b58621..ef5e351 100644 --- a/drivers/misc/cache-2dmanager/cache-2dmanager.c +++ b/drivers/misc/cache-2dmanager/cache-2dmanager.c @@ -121,84 +121,85 @@ void c2dm_l2cache(int count, /* number of regions */ outer_flush_all(); break; } - } else { - int rgn; - for (rgn = 0; rgn < count; rgn++) { + return; + } - int i, j; - unsigned long linestart, start; - unsigned long page_begin, end, offset, - pageremain, lineremain; - unsigned long phys, opsize; - int page_num; + for (rgn = 0; rgn < count; rgn++) { + int i, j; + unsigned long linestart, start; + unsigned long page_begin, end, offset, + pageremain, lineremain; + unsigned long phys, opsize; + int page_num; - /* beginning virtual address of each line */ - start = (unsigned long)rgns[rgn].start; + /* beginning virtual address of each line */ + start = (unsigned long)rgns[rgn].start; - for (i = 0; i < rgns[rgn].lines; i++) { + for (i = 0; i < rgns[rgn].lines; i++) { - linestart = start + (i * rgns[rgn].stride); + linestart = start + (i * rgns[rgn].stride); - /* beginning of the page for the new line */ - page_begin = linestart & PAGE_MASK; + /* beginning of the page for the new line */ + page_begin = linestart & PAGE_MASK; - /* end of the new line */ - end = (unsigned long)linestart + - rgns[rgn].span; + /* end of the new line */ + end = (unsigned long)linestart + + rgns[rgn].span; - page_num = DIV_ROUND_UP(end-page_begin, - PAGE_SIZE); + page_num = DIV_ROUND_UP( + end-page_begin, PAGE_SIZE); - /* offset of the new line from page begin */ - offset = linestart - page_begin; + /* offset of the new line from page begin */ + offset = linestart - page_begin; - /* track how long it is to the end of - the current page */ - pageremain = PAGE_SIZE - offset; + /* track how long it is to the end of + the current page */ + pageremain = PAGE_SIZE - offset; - /* keep track of how much of the line remains - to be copied */ - lineremain = rgns[rgn].span; + /* keep track of how much of the line remains + to be copied */ + lineremain = rgns[rgn].span; - for (j = 0; j < page_num; j++) { + for (j = 0; j < page_num; j++) { - opsize = (lineremain < pageremain) ? - lineremain : pageremain; + opsize = (lineremain < pageremain) ? + lineremain : pageremain; - phys = virt2phys(page_begin); + phys = virt2phys(page_begin); + if (phys) { phys = phys + offset; switch (dir) { case DMA_TO_DEVICE: - outer_clean_range(phys, - phys + opsize); + outer_clean_range( + phys, phys + opsize); break; case DMA_FROM_DEVICE: - outer_inv_range(phys, - phys + opsize); + outer_inv_range( + phys, phys + opsize); break; case DMA_BIDIRECTIONAL: - outer_flush_range(phys, - phys + opsize); + outer_flush_range( + phys, phys + opsize); break; } + } - lineremain -= opsize; - /* Move to next page */ - page_begin += PAGE_SIZE; + lineremain -= opsize; + /* Move to next page */ + page_begin += PAGE_SIZE; - /* After first page, start address - * will be page aligned so offset - * is 0 */ - offset = 0; + /* After first page, start address + * will be page aligned so offset + * is 0 */ + offset = 0; - if (!lineremain) - break; + if (!lineremain) + break; - pageremain -= opsize; - if (!pageremain) - pageremain = PAGE_SIZE; + pageremain -= opsize; + if (!pageremain) + pageremain = PAGE_SIZE; - } } } } |