diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-05 10:36:53 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-09-05 10:36:53 +0200 |
commit | fdfd856d1d2ba158f25a18706571616aad472877 (patch) | |
tree | fcf826220939f0c49975e905a092683e08598a3d /sys/src/9 | |
parent | 6fb9ae8f4356f6b17f15894491d6339245dcd8ec (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')
-rw-r--r-- | sys/src/9/zynq/emmc.c | 21 |
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 = { |