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