xref: /openbmc/u-boot/arch/powerpc/lib/ppccache.S (revision 60570df1)
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	li	r5,L1_CACHE_BYTES-1
69	andc	r3,r3,r5
70	subf	r4,r3,r4
71	add	r4,r4,r5
72	srwi.	r4,r4,L1_CACHE_SHIFT
73	beqlr
74	mtctr	r4
75
761:	dcbf	0,r3
77	addi	r3,r3,L1_CACHE_BYTES
78	bdnz	1b
79	sync				/* wait for dcbst's to get to ram */
80	blr
81
82/*
83 * Like above, but invalidate the D-cache.  This is used by the 8xx
84 * to invalidate the cache so the PPC core doesn't get stale data
85 * from the CPM (no cache snooping here :-).
86 *
87 * invalidate_dcache_range(unsigned long start, unsigned long stop)
88 */
89_GLOBAL(invalidate_dcache_range)
90	li	r5,L1_CACHE_BYTES-1
91	andc	r3,r3,r5
92	subf	r4,r3,r4
93	add	r4,r4,r5
94	srwi.	r4,r4,L1_CACHE_SHIFT
95	beqlr
96	mtctr	r4
97
98	sync
991:	dcbi	0,r3
100	addi	r3,r3,L1_CACHE_BYTES
101	bdnz	1b
102	sync				/* wait for dcbi's to get to ram */
103	blr
104
105