108 lines
2.7 KiB
ArmAsm
108 lines
2.7 KiB
ArmAsm
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||
|
/*
|
||
|
* Copyright (C) 1998 Dan Malek <dmalek@jlc.net>
|
||
|
* Copyright (C) 1999 Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
|
||
|
* Copyright (C) 2000, 2001,2002 Wolfgang Denk <wd@denx.de>
|
||
|
* Copyright Freescale Semiconductor, Inc. 2004, 2006.
|
||
|
*/
|
||
|
|
||
|
#include <config.h>
|
||
|
#include <ppc_asm.tmpl>
|
||
|
#include <ppc_defs.h>
|
||
|
|
||
|
#include <asm/cache.h>
|
||
|
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
/* Function: ppcDcbf */
|
||
|
/* Description: Data Cache block flush */
|
||
|
/* Input: r3 = effective address */
|
||
|
/* Output: none. */
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
.globl ppcDcbf
|
||
|
ppcDcbf:
|
||
|
dcbf r0,r3
|
||
|
blr
|
||
|
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
/* Function: ppcDcbi */
|
||
|
/* Description: Data Cache block Invalidate */
|
||
|
/* Input: r3 = effective address */
|
||
|
/* Output: none. */
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
.globl ppcDcbi
|
||
|
ppcDcbi:
|
||
|
dcbi r0,r3
|
||
|
blr
|
||
|
|
||
|
/*--------------------------------------------------------------------------
|
||
|
* Function: ppcDcbz
|
||
|
* Description: Data Cache block zero.
|
||
|
* Input: r3 = effective address
|
||
|
* Output: none.
|
||
|
*-------------------------------------------------------------------------- */
|
||
|
|
||
|
.globl ppcDcbz
|
||
|
ppcDcbz:
|
||
|
dcbz r0,r3
|
||
|
blr
|
||
|
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
/* Function: ppcSync */
|
||
|
/* Description: Processor Synchronize */
|
||
|
/* Input: none. */
|
||
|
/* Output: none. */
|
||
|
/*------------------------------------------------------------------------------- */
|
||
|
.globl ppcSync
|
||
|
ppcSync:
|
||
|
sync
|
||
|
blr
|
||
|
|
||
|
/*
|
||
|
* Write any modified data cache blocks out to memory and invalidate them.
|
||
|
* Does not invalidate the corresponding instruction cache blocks.
|
||
|
*
|
||
|
* flush_dcache_range(unsigned long start, unsigned long stop)
|
||
|
*/
|
||
|
_GLOBAL(flush_dcache_range)
|
||
|
#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
|
||
|
li r5,L1_CACHE_BYTES-1
|
||
|
andc r3,r3,r5
|
||
|
subf r4,r3,r4
|
||
|
add r4,r4,r5
|
||
|
srwi. r4,r4,L1_CACHE_SHIFT
|
||
|
beqlr
|
||
|
mtctr r4
|
||
|
|
||
|
1: dcbf 0,r3
|
||
|
addi r3,r3,L1_CACHE_BYTES
|
||
|
bdnz 1b
|
||
|
sync /* wait for dcbst's to get to ram */
|
||
|
#endif
|
||
|
blr
|
||
|
|
||
|
/*
|
||
|
* Like above, but invalidate the D-cache. This is used by the 8xx
|
||
|
* to invalidate the cache so the PPC core doesn't get stale data
|
||
|
* from the CPM (no cache snooping here :-).
|
||
|
*
|
||
|
* invalidate_dcache_range(unsigned long start, unsigned long stop)
|
||
|
*/
|
||
|
_GLOBAL(invalidate_dcache_range)
|
||
|
#if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx)
|
||
|
li r5,L1_CACHE_BYTES-1
|
||
|
andc r3,r3,r5
|
||
|
subf r4,r3,r4
|
||
|
add r4,r4,r5
|
||
|
srwi. r4,r4,L1_CACHE_SHIFT
|
||
|
beqlr
|
||
|
mtctr r4
|
||
|
|
||
|
sync
|
||
|
1: dcbi 0,r3
|
||
|
addi r3,r3,L1_CACHE_BYTES
|
||
|
bdnz 1b
|
||
|
sync /* wait for dcbi's to get to ram */
|
||
|
#endif
|
||
|
blr
|
||
|
|