blob: ab0374e587b4ad478fc97d5ace0f426ad26c7745 [file] [log] [blame]
Wolfgang Denk72a087e2006-10-24 14:27:35 +02001/*
2 * Copyright (C) 2004-2006 Atmel Corporation
3 *
Wolfgang Denk1a459662013-07-08 09:37:19 +02004 * SPDX-License-Identifier: GPL-2.0+
Wolfgang Denk72a087e2006-10-24 14:27:35 +02005 */
6
7#include <common.h>
8
Olav Morkend8f2aa32009-01-23 12:56:27 +01009#include <asm/arch/cacheflush.h>
Wolfgang Denk72a087e2006-10-24 14:27:35 +020010
11void dcache_clean_range(volatile void *start, size_t size)
12{
13 unsigned long v, begin, end, linesz;
14
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020015 linesz = CONFIG_SYS_DCACHE_LINESZ;
Wolfgang Denk72a087e2006-10-24 14:27:35 +020016
17 /* You asked for it, you got it */
18 begin = (unsigned long)start & ~(linesz - 1);
19 end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
20
21 for (v = begin; v < end; v += linesz)
22 dcache_clean_line((void *)v);
23
24 sync_write_buffer();
25}
26
27void dcache_invalidate_range(volatile void *start, size_t size)
28{
29 unsigned long v, begin, end, linesz;
30
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020031 linesz = CONFIG_SYS_DCACHE_LINESZ;
Wolfgang Denk72a087e2006-10-24 14:27:35 +020032
33 /* You asked for it, you got it */
34 begin = (unsigned long)start & ~(linesz - 1);
35 end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
36
37 for (v = begin; v < end; v += linesz)
38 dcache_invalidate_line((void *)v);
39}
40
41void dcache_flush_range(volatile void *start, size_t size)
42{
43 unsigned long v, begin, end, linesz;
44
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020045 linesz = CONFIG_SYS_DCACHE_LINESZ;
Wolfgang Denk72a087e2006-10-24 14:27:35 +020046
47 /* You asked for it, you got it */
48 begin = (unsigned long)start & ~(linesz - 1);
49 end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
50
51 for (v = begin; v < end; v += linesz)
52 dcache_flush_line((void *)v);
53
54 sync_write_buffer();
55}
56
57void icache_invalidate_range(volatile void *start, size_t size)
58{
59 unsigned long v, begin, end, linesz;
60
Jean-Christophe PLAGNIOL-VILLARD6d0f6bc2008-10-16 15:01:15 +020061 linesz = CONFIG_SYS_ICACHE_LINESZ;
Wolfgang Denk72a087e2006-10-24 14:27:35 +020062
63 /* You asked for it, you got it */
64 begin = (unsigned long)start & ~(linesz - 1);
65 end = ((unsigned long)start + size + linesz - 1) & ~(linesz - 1);
66
67 for (v = begin; v < end; v += linesz)
68 icache_invalidate_line((void *)v);
69}
70
71/*
72 * This is called after loading something into memory. We need to
73 * make sure that everything that was loaded is actually written to
74 * RAM, and that the icache will look for it. Cleaning the dcache and
75 * invalidating the icache will do the trick.
76 */
77void flush_cache (unsigned long start_addr, unsigned long size)
78{
79 dcache_clean_range((void *)start_addr, size);
80 icache_invalidate_range((void *)start_addr, size);
81}