| /***************************************************************************/ | |
| /* | |
| * cache.c -- general ColdFire Cache maintenance code | |
| * | |
| * Copyright (C) 2010, Greg Ungerer (gerg@snapgear.com) | |
| */ | |
| /***************************************************************************/ | |
| #include <linux/kernel.h> | |
| #include <asm/coldfire.h> | |
| #include <asm/mcfsim.h> | |
| /***************************************************************************/ | |
| #ifdef CACHE_PUSH | |
| /***************************************************************************/ | |
| /* | |
| * Use cpushl to push all dirty cache lines back to memory. | |
| * Older versions of GAS don't seem to know how to generate the | |
| * ColdFire cpushl instruction... Oh well, bit stuff it for now. | |
| */ | |
| void mcf_cache_push(void) | |
| { | |
| __asm__ __volatile__ ( | |
| "clrl %%d0\n\t" | |
| "1:\n\t" | |
| "movel %%d0,%%a0\n\t" | |
| "2:\n\t" | |
| ".word 0xf468\n\t" | |
| "addl %0,%%a0\n\t" | |
| "cmpl %1,%%a0\n\t" | |
| "blt 2b\n\t" | |
| "addql #1,%%d0\n\t" | |
| "cmpil %2,%%d0\n\t" | |
| "bne 1b\n\t" | |
| : /* No output */ | |
| : "i" (CACHE_LINE_SIZE), | |
| "i" (DCACHE_SIZE / CACHE_WAYS), | |
| "i" (CACHE_WAYS) | |
| : "d0", "a0" ); | |
| } | |
| /***************************************************************************/ | |
| #endif /* CACHE_PUSH */ | |
| /***************************************************************************/ |