2 * Copyright (C) 2015 Thomas Chou <thomas@wytron.com.tw>
3 * Copyright (C) 2009, Wind River Systems Inc
4 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com
6 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/cache.h>
12 DECLARE_GLOBAL_DATA_PTR;
14 static void __flush_dcache(unsigned long start, unsigned long end)
18 start &= ~(gd->arch.dcache_line_size - 1);
19 end += (gd->arch.dcache_line_size - 1);
20 end &= ~(gd->arch.dcache_line_size - 1);
22 for (addr = start; addr < end; addr += gd->arch.dcache_line_size) {
23 __asm__ __volatile__ (" flushda 0(%0)\n"
25 : /* Inputs */ "r"(addr)
30 static void __flush_dcache_all(unsigned long start, unsigned long end)
34 start &= ~(gd->arch.dcache_line_size - 1);
35 end += (gd->arch.dcache_line_size - 1);
36 end &= ~(gd->arch.dcache_line_size - 1);
38 if (end > start + gd->arch.dcache_size)
39 end = start + gd->arch.dcache_size;
41 for (addr = start; addr < end; addr += gd->arch.dcache_line_size) {
42 __asm__ __volatile__ (" flushd 0(%0)\n"
44 : /* Inputs */ "r"(addr)
49 static void __invalidate_dcache(unsigned long start, unsigned long end)
53 start &= ~(gd->arch.dcache_line_size - 1);
54 end += (gd->arch.dcache_line_size - 1);
55 end &= ~(gd->arch.dcache_line_size - 1);
57 for (addr = start; addr < end; addr += gd->arch.dcache_line_size) {
58 __asm__ __volatile__ (" initda 0(%0)\n"
60 : /* Inputs */ "r"(addr)
65 static void __flush_icache(unsigned long start, unsigned long end)
69 start &= ~(gd->arch.icache_line_size - 1);
70 end += (gd->arch.icache_line_size - 1);
71 end &= ~(gd->arch.icache_line_size - 1);
73 if (end > start + gd->arch.icache_size)
74 end = start + gd->arch.icache_size;
76 for (addr = start; addr < end; addr += gd->arch.icache_line_size) {
77 __asm__ __volatile__ (" flushi %0\n"
79 : /* Inputs */ "r"(addr)
82 __asm__ __volatile(" flushp\n");
85 void flush_dcache_all(void)
87 __flush_dcache_all(0, gd->arch.dcache_size);
88 __flush_icache(0, gd->arch.icache_size);
91 void flush_dcache_range(unsigned long start, unsigned long end)
93 if (gd->arch.has_initda)
94 __flush_dcache(start, end);
96 __flush_dcache_all(start, end);
99 void flush_cache(unsigned long start, unsigned long size)
101 if (gd->arch.has_initda)
102 __flush_dcache(start, start + size);
104 __flush_dcache_all(start, start + size);
105 __flush_icache(start, start + size);
108 void invalidate_dcache_range(unsigned long start, unsigned long end)
110 if (gd->arch.has_initda)
111 __invalidate_dcache(start, end);
113 __flush_dcache_all(start, end);
116 int dcache_status(void)
121 void dcache_enable(void)
126 void dcache_disable(void)