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.
This commit is contained in:
parent
6fb9ae8f43
commit
fdfd856d1d
1 changed files with 10 additions and 11 deletions
|
@ -339,7 +339,7 @@ emmccmd(u32int cmd, u32int arg, u32int *resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emmciosetup(int write, void *buf, int bsize, int bcount)
|
emmciosetup(int, void *buf, int bsize, int bcount)
|
||||||
{
|
{
|
||||||
u32int *r;
|
u32int *r;
|
||||||
uintptr pa;
|
uintptr pa;
|
||||||
|
@ -350,15 +350,8 @@ emmciosetup(int write, void *buf, int bsize, int bcount)
|
||||||
error(Etoobig);
|
error(Etoobig);
|
||||||
|
|
||||||
pa = PADDR(buf);
|
pa = PADDR(buf);
|
||||||
if(write){
|
cleandse((uchar*)buf, (uchar*)buf+len);
|
||||||
/* flush cache before write */
|
clean2pa(pa, pa+len);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = emmc.regs;
|
r = emmc.regs;
|
||||||
r[Sysaddr] = pa;
|
r[Sysaddr] = pa;
|
||||||
|
@ -367,7 +360,7 @@ emmciosetup(int write, void *buf, int bsize, int bcount)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
emmcio(int write, uchar *, int)
|
emmcio(int write, uchar *buf, int len)
|
||||||
{
|
{
|
||||||
u32int *r;
|
u32int *r;
|
||||||
int i;
|
int i;
|
||||||
|
@ -392,6 +385,12 @@ emmcio(int write, uchar *, int)
|
||||||
}
|
}
|
||||||
if(i)
|
if(i)
|
||||||
r[Interrupt] = i;
|
r[Interrupt] = i;
|
||||||
|
|
||||||
|
if(!write){
|
||||||
|
uintptr pa = PADDR(buf);
|
||||||
|
invaldse((uchar*)buf, (uchar*)buf+len);
|
||||||
|
inval2pa(pa, pa+len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDio sdio = {
|
SDio sdio = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue