xref: /linux/arch/m68k/coldfire/cache.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
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