hc
2023-08-30 862c27fc9920c83318c784bfdadf43a65df1ec8f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * (C) Copyright 2008 Texas Insturments
 *
 * (C) Copyright 2002
 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
 * Marius Groeger <mgroeger@sysgo.de>
 *
 * (C) Copyright 2002
 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de>
 *
 * SPDX-License-Identifier:    GPL-2.0+
 */
 
/*
 * CPU specific code
 */
 
#include <common.h>
#include <command.h>
#include <asm/system.h>
#include <asm/cache.h>
#include <asm/armv7.h>
#include <linux/compiler.h>
 
void __weak cpu_cache_initialization(void){}
 
int cleanup_before_linux_select(int flags)
{
   /*
    * this function is called just before we call linux
    * it prepares the processor for linux
    *
    * we turn off caches etc ...
    */
#ifndef CONFIG_SPL_BUILD
   disable_interrupts();
#endif
   disable_async_abort();
 
   if (flags & CBL_DISABLE_CACHES) {
       /*
       * turn off D-cache
       * dcache_disable() in turn flushes the d-cache and disables MMU
       */
       dcache_disable();
       v7_outer_cache_disable();
 
       /*
       * After D-cache is flushed and before it is disabled there may
       * be some new valid entries brought into the cache. We are
       * sure that these lines are not dirty and will not affect our
       * execution. (because unwinding the call-stack and setting a
       * bit in CP15 SCTRL is all we did during this. We have not
       * pushed anything on to the stack. Neither have we affected
       * any static data) So just invalidate the entire d-cache again
       * to avoid coherency problems for kernel
       */
       invalidate_dcache_all();
 
       icache_disable();
       invalidate_icache_all();
   } else {
       /*
        * Turn off I-cache and invalidate it
        */
       icache_disable();
       invalidate_icache_all();
 
       flush_dcache_all();
       invalidate_icache_all();
       icache_enable();
   }
 
   /*
    * Some CPU need more cache attention before starting the kernel.
    */
   cpu_cache_initialization();
 
   return 0;
}
 
int cleanup_before_linux(void)
{
   return cleanup_before_linux_select(CBL_ALL);
}