1 /* 2 * (C) Copyright 2002 3 * Sysgo Real-Time Solutions, GmbH <www.elinos.com> 4 * Marius Groeger <mgroeger@sysgo.de> 5 * 6 * (C) Copyright 2002 7 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> 8 * 9 * SPDX-License-Identifier: GPL-2.0+ 10 */ 11 12 /* 13 * CPU specific code 14 */ 15 16 #include <common.h> 17 #include <command.h> 18 #include <asm/system.h> 19 #include <asm/io.h> 20 21 static void cache_flush(void); 22 23 int cleanup_before_linux (void) 24 { 25 /* 26 * this function is called just before we call linux 27 * it prepares the processor for linux 28 * 29 * we turn off caches etc ... 30 */ 31 32 disable_interrupts (); 33 34 /* ARM926E-S needs the protection unit enabled for the icache to have 35 * been enabled - left for possible later use 36 * should turn off the protection unit as well.... 37 */ 38 /* turn off I/D-cache */ 39 icache_disable(); 40 dcache_disable(); 41 /* flush I/D-cache */ 42 cache_flush(); 43 44 return 0; 45 } 46 47 /* flush I/D-cache */ 48 static void cache_flush (void) 49 { 50 unsigned long i = 0; 51 52 asm ("mcr p15, 0, %0, c7, c5, 0": :"r" (i)); 53 asm ("mcr p15, 0, %0, c7, c6, 0": :"r" (i)); 54 } 55 56 #ifndef CONFIG_INTEGRATOR 57 58 __attribute__((noreturn)) void reset_cpu(ulong addr __attribute__((unused))) 59 { 60 writew(0x0, 0xfffece10); 61 writew(0x8, 0xfffece10); 62 for (;;) 63 ; 64 } 65 66 #endif /* #ifdef CONFIG_INTEGRATOR */ 67