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