summaryrefslogtreecommitdiff
path: root/sys/src/9/zynq
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-09-05 10:36:53 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-09-05 10:36:53 +0200
commitfdfd856d1d2ba158f25a18706571616aad472877 (patch)
treefcf826220939f0c49975e905a092683e08598a3d /sys/src/9/zynq
parent6fb9ae8f4356f6b17f15894491d6339245dcd8ec (diff)
zynq: clean cache unconditionally *before* dma, invalidate cache *after* dma for read case
processor might bring data speculatively into the cache, before the dma completes.
Diffstat (limited to 'sys/src/9/zynq')
-rw-r--r--sys/src/9/zynq/emmc.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/sys/src/9/zynq/emmc.c b/sys/src/9/zynq/emmc.c
index 8308d11f8..cdd1e5e8a 100644
--- a/sys/src/9/zynq/emmc.c
+++ b/sys/src/9/zynq/emmc.c
@@ -339,7 +339,7 @@ emmccmd(u32int cmd, u32int arg, u32int *resp)
}
static void
-emmciosetup(int write, void *buf, int bsize, int bcount)
+emmciosetup(int, void *buf, int bsize, int bcount)
{
u32int *r;
uintptr pa;
@@ -350,15 +350,8 @@ emmciosetup(int write, void *buf, int bsize, int bcount)
error(Etoobig);
pa = PADDR(buf);
- if(write){
- /* flush cache before write */
- cleandse((uchar*)buf, (uchar*)buf+len);
- clean2pa(pa, pa+len);
- } else {
- /* invalidate cache before read */
- invaldse((uchar*)buf, (uchar*)buf+len);
- inval2pa(pa, pa+len);
- }
+ cleandse((uchar*)buf, (uchar*)buf+len);
+ clean2pa(pa, pa+len);
r = emmc.regs;
r[Sysaddr] = pa;
@@ -367,7 +360,7 @@ emmciosetup(int write, void *buf, int bsize, int bcount)
}
static void
-emmcio(int write, uchar *, int)
+emmcio(int write, uchar *buf, int len)
{
u32int *r;
int i;
@@ -392,6 +385,12 @@ emmcio(int write, uchar *, int)
}
if(i)
r[Interrupt] = i;
+
+ if(!write){
+ uintptr pa = PADDR(buf);
+ invaldse((uchar*)buf, (uchar*)buf+len);
+ inval2pa(pa, pa+len);
+ }
}
SDio sdio = {