summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Tivy <rtivy@ti.com>2015-01-06 18:07:47 -0800
committerRobert Tivy <rtivy@ti.com>2015-01-06 18:07:47 -0800
commit55e1fad1d8afca1b26f1da3499aa99814452a92d (patch)
tree8c53632fed6c19edc4dbe628ffadb33afc55f678
parent4f3e5fab22012d4326b31754aa8ee430d31ad250 (diff)
downloadlinuxutils-55e1fad1d8afca1b26f1da3499aa99814452a92d.tar.gz
Fix cache handling code
Cache handling code was using the wrong physical address. Cache invalidations need to use outer/inner operation ordering (was reversed).
-rw-r--r--src/cmem/module/cmemk.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/cmem/module/cmemk.c b/src/cmem/module/cmemk.c
index 53e7a92..03e8eeb 100644
--- a/src/cmem/module/cmemk.c
+++ b/src/cmem/module/cmemk.c
@@ -1474,9 +1474,8 @@ alloc:
*/
virtp_end = virtp + size;
#if 1
+ outer_inv_range(physp, physp + size);
dmac_map_area(virtp, size, DMA_FROM_DEVICE);
- outer_inv_range(__pa((u32)virtp),
- __pa((u32)virtp_end));
#else
dma_sync_single_for_device(NULL, (dma_addr_t)physp, size, DMA_FROM_DEVICE);
#endif
@@ -1750,8 +1749,7 @@ alloc:
case CMEM_IOCCACHEWB:
#if 1
dmac_map_area(virtp, block.size, DMA_TO_DEVICE);
- outer_clean_range(__pa((u32)virtp),
- __pa((u32)virtp + block.size));
+ outer_clean_range(physp, physp + block.size);
#else
dma_sync_single_for_device(NULL, (dma_addr_t)physp, block.size, DMA_TO_DEVICE);
#endif
@@ -1762,9 +1760,8 @@ alloc:
case CMEM_IOCCACHEINV:
#if 1
+ outer_inv_range(physp, physp + block.size);
dmac_map_area(virtp, block.size, DMA_FROM_DEVICE);
- outer_inv_range(__pa((u32)virtp),
- __pa((u32)virtp + block.size));
#else
dma_sync_single_for_device(NULL, (dma_addr_t)physp, block.size, DMA_FROM_DEVICE);
#endif
@@ -1776,8 +1773,7 @@ alloc:
case CMEM_IOCCACHEWBINV:
#if 1
dmac_map_area(virtp, block.size, DMA_BIDIRECTIONAL);
- outer_flush_range(__pa((u32)virtp),
- __pa((u32)virtp + block.size));
+ outer_flush_range(physp, physp + block.size);
#else
dma_sync_single_for_device(NULL, (dma_addr_t)physp, block.size, DMA_TO_DEVICE);
dma_sync_single_for_device(NULL, (dma_addr_t)physp, block.size, DMA_FROM_DEVICE);