xref: /rk3399_rockchip-uboot/arch/microblaze/cpu/cache.c (revision 326ea986ac150acdc7656d57fca647db80b50158)
16260fb04SPeter Tyser /*
26260fb04SPeter Tyser  * (C) Copyright 2007 Michal Simek
36260fb04SPeter Tyser  *
46260fb04SPeter Tyser  * Michal SIMEK <monstr@monstr.eu>
56260fb04SPeter Tyser  *
6*1a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
76260fb04SPeter Tyser  */
86260fb04SPeter Tyser 
96260fb04SPeter Tyser #include <common.h>
106260fb04SPeter Tyser #include <asm/asm.h>
116260fb04SPeter Tyser 
dcache_status(void)126260fb04SPeter Tyser int dcache_status (void)
136260fb04SPeter Tyser {
146260fb04SPeter Tyser 	int i = 0;
156260fb04SPeter Tyser 	int mask = 0x80;
166260fb04SPeter Tyser 	__asm__ __volatile__ ("mfs %0,rmsr"::"r" (i):"memory");
176260fb04SPeter Tyser 	/* i&=0x80 */
186260fb04SPeter Tyser 	__asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");
196260fb04SPeter Tyser 	return i;
206260fb04SPeter Tyser }
216260fb04SPeter Tyser 
icache_status(void)226260fb04SPeter Tyser int icache_status (void)
236260fb04SPeter Tyser {
246260fb04SPeter Tyser 	int i = 0;
256260fb04SPeter Tyser 	int mask = 0x20;
266260fb04SPeter Tyser 	__asm__ __volatile__ ("mfs %0,rmsr"::"r" (i):"memory");
276260fb04SPeter Tyser 	/* i&=0x20 */
286260fb04SPeter Tyser 	__asm__ __volatile__ ("and %0,%0,%1"::"r" (i), "r" (mask):"memory");
296260fb04SPeter Tyser 	return i;
306260fb04SPeter Tyser }
316260fb04SPeter Tyser 
icache_enable(void)326260fb04SPeter Tyser void	icache_enable (void) {
336260fb04SPeter Tyser 	MSRSET(0x20);
346260fb04SPeter Tyser }
356260fb04SPeter Tyser 
icache_disable(void)366260fb04SPeter Tyser void	icache_disable(void) {
378ff972c6SMichal Simek 	/* we are not generate ICACHE size -> flush whole cache */
388ff972c6SMichal Simek 	flush_cache(0, 32768);
396260fb04SPeter Tyser 	MSRCLR(0x20);
406260fb04SPeter Tyser }
416260fb04SPeter Tyser 
dcache_enable(void)426260fb04SPeter Tyser void	dcache_enable (void) {
436260fb04SPeter Tyser 	MSRSET(0x80);
446260fb04SPeter Tyser }
456260fb04SPeter Tyser 
dcache_disable(void)466260fb04SPeter Tyser void	dcache_disable(void) {
478ff972c6SMichal Simek #ifdef XILINX_USE_DCACHE
488ff972c6SMichal Simek 	flush_cache(0, XILINX_DCACHE_BYTE_SIZE);
498ff972c6SMichal Simek #endif
506260fb04SPeter Tyser 	MSRCLR(0x80);
516260fb04SPeter Tyser }
528ff972c6SMichal Simek 
flush_cache(ulong addr,ulong size)538ff972c6SMichal Simek void flush_cache (ulong addr, ulong size)
548ff972c6SMichal Simek {
558ff972c6SMichal Simek 	int i;
568ff972c6SMichal Simek 	for (i = 0; i < size; i += 4)
578ff972c6SMichal Simek 		asm volatile (
588ff972c6SMichal Simek #ifdef CONFIG_ICACHE
598ff972c6SMichal Simek 				"wic	%0, r0;"
608ff972c6SMichal Simek #endif
618ff972c6SMichal Simek 				"nop;"
628ff972c6SMichal Simek #ifdef CONFIG_DCACHE
638ff972c6SMichal Simek 				"wdc.flush	%0, r0;"
648ff972c6SMichal Simek #endif
658ff972c6SMichal Simek 				"nop;"
668ff972c6SMichal Simek 				:
678ff972c6SMichal Simek 				: "r" (addr + i)
688ff972c6SMichal Simek 				: "memory");
698ff972c6SMichal Simek }
70