Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 47017
b: refs/heads/master
c: 212868d
h: refs/heads/master
i:
  47015: f512f88
v: v3
  • Loading branch information
David Brownell authored and Haavard Skinnemoen committed Feb 9, 2007
1 parent e38e16e commit 3c58106
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 58febc0b1374de7506277d3aa9e9cddaea62ba65
refs/heads/master: 212868d387d0033b7e0029326a900126fe5e3d52
32 changes: 24 additions & 8 deletions trunk/arch/avr32/mm/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,34 @@

void invalidate_dcache_region(void *start, size_t size)
{
unsigned long v, begin, end, linesz;
unsigned long v, begin, end, linesz, mask;
int flush = 0;

linesz = boot_cpu_data.dcache.linesz;
mask = linesz - 1;

/* when first and/or last cachelines are shared, flush them
* instead of invalidating ... never discard valid data!
*/
begin = (unsigned long)start;
end = begin + size - 1;

if (begin & mask) {
flush_dcache_line(start);
begin += linesz;
flush = 1;
}
if ((end & mask) != mask) {
flush_dcache_line((void *)end);
end -= linesz;
flush = 1;
}

//printk("invalidate dcache: %p + %u\n", start, size);

/* You asked for it, you got it */
begin = (unsigned long)start & ~(linesz - 1);
end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);

for (v = begin; v < end; v += linesz)
/* remaining cachelines only need invalidation */
for (v = begin; v <= end; v += linesz)
invalidate_dcache_line((void *)v);
if (flush)
flush_write_buffer();
}

void clean_dcache_region(void *start, size_t size)
Expand Down

0 comments on commit 3c58106

Please sign in to comment.