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 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 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 326260fb04SPeter Tyser void icache_enable (void) { 336260fb04SPeter Tyser MSRSET(0x20); 346260fb04SPeter Tyser } 356260fb04SPeter Tyser 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 426260fb04SPeter Tyser void dcache_enable (void) { 436260fb04SPeter Tyser MSRSET(0x80); 446260fb04SPeter Tyser } 456260fb04SPeter Tyser 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 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