aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCooper Jr., Franklin <fcooper@ti.com>2016-04-15 16:28:59 -0400
committerBoris Brezillon <boris.brezillon@free-electrons.com>2016-05-05 17:52:01 -0400
commit8c6f0fc4d2d505b17fc67675f0797fe3fc6e6c26 (patch)
tree3a337a1de2334eedb494501aeaf264aaa2892ef2
parent03d3a1df6da660999d8f14552ac4d875e94090a3 (diff)
mtd: nand: omap2: Fix high memory dma prefetch transfer
Based on DMA documentation and testing using high memory buffer when doing dma transfers can lead to various issues including kernel panics. To workaround this simply use cpu copy. Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
-rw-r--r--drivers/mtd/nand/omap2.c13
1 files changed, 2 insertions, 11 deletions
diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c
index d1496b1276df..08e158895635 100644
--- a/drivers/mtd/nand/omap2.c
+++ b/drivers/mtd/nand/omap2.c
@@ -473,17 +473,8 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
473 int ret; 473 int ret;
474 u32 val; 474 u32 val;
475 475
476 if (addr >= high_memory) { 476 if (!virt_addr_valid(addr))
477 struct page *p1; 477 goto out_copy;
478
479 if (((size_t)addr & PAGE_MASK) !=
480 ((size_t)(addr + len - 1) & PAGE_MASK))
481 goto out_copy;
482 p1 = vmalloc_to_page(addr);
483 if (!p1)
484 goto out_copy;
485 addr = page_address(p1) + ((size_t)addr & ~PAGE_MASK);
486 }
487 478
488 sg_init_one(&sg, addr, len); 479 sg_init_one(&sg, addr, len);
489 n = dma_map_sg(info->dma->device->dev, &sg, 1, dir); 480 n = dma_map_sg(info->dma->device->dev, &sg, 1, dir);