blob: 866dc1a98a57e3ce6b9c36d60977772ab887eb72 [file] [log] [blame]
Macpaul Lin30c39442012-07-15 11:54:13 +08001/*
2 * Copyright (C) 2012 Andes Technology Corporation
3 * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com>
4 * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
5 *
Wolfgang Denkd79de1d2013-07-08 09:37:19 +02006 * SPDX-License-Identifier: GPL-2.0+
Macpaul Lin30c39442012-07-15 11:54:13 +08007 */
8
9#include <common.h>
10
11static inline unsigned long CACHE_LINE_SIZE(enum cache_t cache)
12{
13 if (cache == ICACHE)
14 return 8 << (((GET_ICM_CFG() & ICM_CFG_MSK_ISZ) \
15 >> ICM_CFG_OFF_ISZ) - 1);
16 else
17 return 8 << (((GET_DCM_CFG() & DCM_CFG_MSK_DSZ) \
18 >> DCM_CFG_OFF_DSZ) - 1);
19}
20
21void flush_dcache_range(unsigned long start, unsigned long end)
22{
23 unsigned long line_size;
24
25 line_size = CACHE_LINE_SIZE(DCACHE);
26
27 while (end > start) {
28 asm volatile (
29 "\n\tcctl %0, L1D_VA_WB"
30 "\n\tcctl %0, L1D_VA_INVAL"
31 :
32 : "r" (start)
33 );
34 start += line_size;
35 }
36}
37
38void invalidate_icache_range(unsigned long start, unsigned long end)
39{
40 unsigned long line_size;
41
42 line_size = CACHE_LINE_SIZE(ICACHE);
43 while (end > start) {
44 asm volatile (
45 "\n\tcctl %0, L1I_VA_INVAL"
46 :
47 : "r"(start)
48 );
49 start += line_size;
50 }
51}
52
53void invalidate_dcache_range(unsigned long start, unsigned long end)
54{
55 unsigned long line_size;
56
57 line_size = CACHE_LINE_SIZE(DCACHE);
58 while (end > start) {
59 asm volatile (
60 "\n\tcctl %0, L1D_VA_INVAL"
61 :
62 : "r"(start)
63 );
64 start += line_size;
65 }
66}
67
68void flush_cache(unsigned long addr, unsigned long size)
69{
70 flush_dcache_range(addr, addr + size);
71 invalidate_icache_range(addr, addr + size);
72}
73
74void icache_enable(void)
75{
76 asm volatile (
77 "mfsr $p0, $mr8\n\t"
78 "ori $p0, $p0, 0x01\n\t"
79 "mtsr $p0, $mr8\n\t"
80 "isb\n\t"
81 );
82}
83
84void icache_disable(void)
85{
86 asm volatile (
87 "mfsr $p0, $mr8\n\t"
88 "li $p1, ~0x01\n\t"
89 "and $p0, $p0, $p1\n\t"
90 "mtsr $p0, $mr8\n\t"
91 "isb\n\t"
92 );
93}
94
95int icache_status(void)
96{
97 int ret;
98
99 asm volatile (
100 "mfsr $p0, $mr8\n\t"
101 "andi %0, $p0, 0x01\n\t"
102 : "=r" (ret)
103 :
104 : "memory"
105 );
106
107 return ret;
108}
109
110void dcache_enable(void)
111{
112 asm volatile (
113 "mfsr $p0, $mr8\n\t"
114 "ori $p0, $p0, 0x02\n\t"
115 "mtsr $p0, $mr8\n\t"
116 "isb\n\t"
117 );
118}
119
120void dcache_disable(void)
121{
122 asm volatile (
123 "mfsr $p0, $mr8\n\t"
124 "li $p1, ~0x02\n\t"
125 "and $p0, $p0, $p1\n\t"
126 "mtsr $p0, $mr8\n\t"
127 "isb\n\t"
128 );
129}
130
131int dcache_status(void)
132{
133 int ret;
134
135 asm volatile (
136 "mfsr $p0, $mr8\n\t"
137 "andi %0, $p0, 0x02\n\t"
138 : "=r" (ret)
139 :
140 : "memory"
141 );
142
143 return ret;
144}