xref: /openbmc/u-boot/arch/powerpc/lib/ppccache.S (revision d9b88d25)
1/*
2 * Copyright (C) 1998  Dan Malek <dmalek@jlc.net>
3 * Copyright (C) 1999  Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
4 * Copyright (C) 2000, 2001,2002 Wolfgang Denk <wd@denx.de>
5 * Copyright Freescale Semiconductor, Inc. 2004, 2006.
6 *
7 * SPDX-License-Identifier:	GPL-2.0+
8 */
9
10#include <config.h>
11#include <ppc_asm.tmpl>
12#include <ppc_defs.h>
13
14#include <asm/cache.h>
15
16/*------------------------------------------------------------------------------- */
17/* Function:	 ppcDcbf */
18/* Description:	 Data Cache block flush */
19/* Input:	 r3 = effective address */
20/* Output:	 none. */
21/*------------------------------------------------------------------------------- */
22	.globl	ppcDcbf
23ppcDcbf:
24	dcbf	r0,r3
25	blr
26
27/*------------------------------------------------------------------------------- */
28/* Function:	 ppcDcbi */
29/* Description:	 Data Cache block Invalidate */
30/* Input:	 r3 = effective address */
31/* Output:	 none. */
32/*------------------------------------------------------------------------------- */
33	.globl	ppcDcbi
34ppcDcbi:
35	dcbi	r0,r3
36	blr
37
38/*--------------------------------------------------------------------------
39 * Function:	 ppcDcbz
40 * Description:	 Data Cache block zero.
41 * Input:	 r3 = effective address
42 * Output:	 none.
43 *-------------------------------------------------------------------------- */
44
45	.globl	ppcDcbz
46ppcDcbz:
47	dcbz	r0,r3
48	blr
49
50/*------------------------------------------------------------------------------- */
51/* Function:	 ppcSync */
52/* Description:	 Processor Synchronize */
53/* Input:	 none. */
54/* Output:	 none. */
55/*------------------------------------------------------------------------------- */
56	.globl	ppcSync
57ppcSync:
58	sync
59	blr
60
61/*
62 * Write any modified data cache blocks out to memory and invalidate them.
63 * Does not invalidate the corresponding instruction cache blocks.
64 *
65 * flush_dcache_range(unsigned long start, unsigned long stop)
66 */
67_GLOBAL(flush_dcache_range)
68#if defined(CONFIG_4xx) || defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
69	li	r5,L1_CACHE_BYTES-1
70	andc	r3,r3,r5
71	subf	r4,r3,r4
72	add	r4,r4,r5
73	srwi.	r4,r4,L1_CACHE_SHIFT
74	beqlr
75	mtctr	r4
76
771:	dcbf	0,r3
78	addi	r3,r3,L1_CACHE_BYTES
79	bdnz	1b
80	sync				/* wait for dcbst's to get to ram */
81#endif
82	blr
83
84/*
85 * Like above, but invalidate the D-cache.  This is used by the 8xx
86 * to invalidate the cache so the PPC core doesn't get stale data
87 * from the CPM (no cache snooping here :-).
88 *
89 * invalidate_dcache_range(unsigned long start, unsigned long stop)
90 */
91_GLOBAL(invalidate_dcache_range)
92#if defined(CONFIG_4xx) || defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
93	li	r5,L1_CACHE_BYTES-1
94	andc	r3,r3,r5
95	subf	r4,r3,r4
96	add	r4,r4,r5
97	srwi.	r4,r4,L1_CACHE_SHIFT
98	beqlr
99	mtctr	r4
100
101	sync
1021:	dcbi	0,r3
103	addi	r3,r3,L1_CACHE_BYTES
104	bdnz	1b
105	sync				/* wait for dcbi's to get to ram */
106#endif
107	blr
108
109