blob: d0f8e1e5b8b8948e5127a8a1ebb5acb319aef413 [file] [log] [blame]
wdenkf6f96f72003-07-15 20:04:06 +00001/*
2 * (C) Copyright 2002
3 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
4 * Marius Groeger <mgroeger@sysgo.de>
5 *
6 * (C) Copyright 2002
Detlev Zundelf1b3f2b2009-05-13 10:54:10 +02007 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
wdenkf6f96f72003-07-15 20:04:06 +00008 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02009 * SPDX-License-Identifier: GPL-2.0+
wdenkf6f96f72003-07-15 20:04:06 +000010 */
11
12/*
13 * CPU specific code
14 */
15
16#include <common.h>
17#include <command.h>
18#include <arm925t.h>
Jean-Christophe PLAGNIOL-VILLARD9053b5a2009-04-05 13:02:43 +020019#include <asm/system.h>
wdenkf6f96f72003-07-15 20:04:06 +000020
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020021static void cache_flush(void);
wdenkf6f96f72003-07-15 20:04:06 +000022
wdenkf6f96f72003-07-15 20:04:06 +000023int 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
wdenkf6f96f72003-07-15 20:04:06 +000032 disable_interrupts ();
33
wdenkf6f96f72003-07-15 20:04:06 +000034
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020035 /* turn off I/D-cache */
36 icache_disable();
37 dcache_disable();
wdenkf6f96f72003-07-15 20:04:06 +000038 /* flush I/D-cache */
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020039 cache_flush();
40
41 return 0;
wdenkf6f96f72003-07-15 20:04:06 +000042}
43
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020044/* flush I/D-cache */
45static void cache_flush (void)
wdenkf6f96f72003-07-15 20:04:06 +000046{
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020047 unsigned long i = 0;
wdenkf6f96f72003-07-15 20:04:06 +000048
Jean-Christophe PLAGNIOL-VILLARDe6b5f1b2009-04-05 13:06:31 +020049 asm ("mcr p15, 0, %0, c7, c7, 0": :"r" (i));
wdenkf6f96f72003-07-15 20:04:06 +000050}