1 /* 2 * (C) Copyright 2010,2011 3 * Vladimir Khusainov, Emcraft Systems, vlad@emcraft.com 4 * 5 * (C) Copyright 2015 6 * Kamil Lulko, <kamil.lulko@gmail.com> 7 * 8 * SPDX-License-Identifier: GPL-2.0+ 9 */ 10 11 #include <common.h> 12 #include <asm/io.h> 13 #include <asm/armv7m.h> 14 15 /* 16 * This is called right before passing control to 17 * the Linux kernel point. 18 */ 19 int cleanup_before_linux(void) 20 { 21 /* 22 * this function is called just before we call linux 23 * it prepares the processor for linux 24 * 25 * disable interrupt and turn off caches etc ... 26 */ 27 disable_interrupts(); 28 /* 29 * turn off D-cache 30 * dcache_disable() in turn flushes the d-cache 31 * MPU is still enabled & can't be disabled as the u-boot 32 * code might be running in sdram which by default is not 33 * executable area. 34 */ 35 dcache_disable(); 36 /* invalidate to make sure no cache line gets dirty between 37 * dcache flushing and disabling dcache */ 38 invalidate_dcache_all(); 39 40 icache_disable(); 41 invalidate_icache_all(); 42 43 return 0; 44 } 45 46 /* 47 * Perform the low-level reset. 48 */ 49 void reset_cpu(ulong addr) 50 { 51 /* 52 * Perform reset but keep priority group unchanged. 53 */ 54 writel((V7M_AIRCR_VECTKEY << V7M_AIRCR_VECTKEY_SHIFT) 55 | (V7M_SCB->aircr & V7M_AIRCR_PRIGROUP_MSK) 56 | V7M_AIRCR_SYSRESET, &V7M_SCB->aircr); 57 } 58