1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2f86b9e03SGreg Ungerer /***************************************************************************/
3f86b9e03SGreg Ungerer
4f86b9e03SGreg Ungerer /*
5f86b9e03SGreg Ungerer * cache.c -- general ColdFire Cache maintenance code
6f86b9e03SGreg Ungerer *
7f86b9e03SGreg Ungerer * Copyright (C) 2010, Greg Ungerer (gerg@snapgear.com)
8f86b9e03SGreg Ungerer */
9f86b9e03SGreg Ungerer
10f86b9e03SGreg Ungerer /***************************************************************************/
11f86b9e03SGreg Ungerer
12f86b9e03SGreg Ungerer #include <linux/kernel.h>
13f86b9e03SGreg Ungerer #include <asm/coldfire.h>
14f86b9e03SGreg Ungerer #include <asm/mcfsim.h>
15f86b9e03SGreg Ungerer
16f86b9e03SGreg Ungerer /***************************************************************************/
17f86b9e03SGreg Ungerer #ifdef CACHE_PUSH
18f86b9e03SGreg Ungerer /***************************************************************************/
19f86b9e03SGreg Ungerer
20f86b9e03SGreg Ungerer /*
21f86b9e03SGreg Ungerer * Use cpushl to push all dirty cache lines back to memory.
22f86b9e03SGreg Ungerer * Older versions of GAS don't seem to know how to generate the
23f86b9e03SGreg Ungerer * ColdFire cpushl instruction... Oh well, bit stuff it for now.
24f86b9e03SGreg Ungerer */
25f86b9e03SGreg Ungerer
mcf_cache_push(void)26f86b9e03SGreg Ungerer void mcf_cache_push(void)
27f86b9e03SGreg Ungerer {
28f86b9e03SGreg Ungerer __asm__ __volatile__ (
29f86b9e03SGreg Ungerer "clrl %%d0\n\t"
30f86b9e03SGreg Ungerer "1:\n\t"
31f86b9e03SGreg Ungerer "movel %%d0,%%a0\n\t"
32f86b9e03SGreg Ungerer "2:\n\t"
33f86b9e03SGreg Ungerer ".word 0xf468\n\t"
34f86b9e03SGreg Ungerer "addl %0,%%a0\n\t"
35f86b9e03SGreg Ungerer "cmpl %1,%%a0\n\t"
36f86b9e03SGreg Ungerer "blt 2b\n\t"
37f86b9e03SGreg Ungerer "addql #1,%%d0\n\t"
38f86b9e03SGreg Ungerer "cmpil %2,%%d0\n\t"
39f86b9e03SGreg Ungerer "bne 1b\n\t"
40f86b9e03SGreg Ungerer : /* No output */
41f86b9e03SGreg Ungerer : "i" (CACHE_LINE_SIZE),
42f86b9e03SGreg Ungerer "i" (DCACHE_SIZE / CACHE_WAYS),
43f86b9e03SGreg Ungerer "i" (CACHE_WAYS)
44f86b9e03SGreg Ungerer : "d0", "a0" );
45f86b9e03SGreg Ungerer }
46f86b9e03SGreg Ungerer
47f86b9e03SGreg Ungerer /***************************************************************************/
48f86b9e03SGreg Ungerer #endif /* CACHE_PUSH */
49f86b9e03SGreg Ungerer /***************************************************************************/
50