Commit 3c692f9706a1d85dc5fc518fa8503c1862f15088

Authored by Wolfgang Denk

Merge branch 'master' of git://git.denx.de/u-boot-nds32

* 'master' of git://git.denx.de/u-boot-nds32:
  nds32: split common cache access from cpu into lib

Signed-off-by: Wolfgang Denk <wd@denx.de>

Showing 4 changed files Side-by-side Diff

arch/nds32/cpu/n1213/ag101/cpu.c
... ... @@ -82,116 +82,4 @@
82 82  
83 83 /*NOTREACHED*/
84 84 }
85   -
86   -static inline unsigned long CACHE_LINE_SIZE(enum cache_t cache)
87   -{
88   - if (cache == ICACHE)
89   - return 8 << (((GET_ICM_CFG() & ICM_CFG_MSK_ISZ) \
90   - >> ICM_CFG_OFF_ISZ) - 1);
91   - else
92   - return 8 << (((GET_DCM_CFG() & DCM_CFG_MSK_DSZ) \
93   - >> DCM_CFG_OFF_DSZ) - 1);
94   -}
95   -
96   -void dcache_flush_range(unsigned long start, unsigned long end)
97   -{
98   - unsigned long line_size;
99   -
100   - line_size = CACHE_LINE_SIZE(DCACHE);
101   -
102   - while (end > start) {
103   - __asm__ volatile ("\n\tcctl %0, L1D_VA_WB" : : "r"(start));
104   - __asm__ volatile ("\n\tcctl %0, L1D_VA_INVAL" : : "r"(start));
105   - start += line_size;
106   - }
107   -}
108   -
109   -void icache_inval_range(unsigned long start, unsigned long end)
110   -{
111   - unsigned long line_size;
112   -
113   - line_size = CACHE_LINE_SIZE(ICACHE);
114   - while (end > start) {
115   - __asm__ volatile ("\n\tcctl %0, L1I_VA_INVAL" : : "r"(start));
116   - start += line_size;
117   - }
118   -}
119   -
120   -void flush_cache(unsigned long addr, unsigned long size)
121   -{
122   - dcache_flush_range(addr, addr + size);
123   - icache_inval_range(addr, addr + size);
124   -}
125   -
126   -void icache_enable(void)
127   -{
128   - __asm__ __volatile__ (
129   - "mfsr $p0, $mr8\n\t"
130   - "ori $p0, $p0, 0x01\n\t"
131   - "mtsr $p0, $mr8\n\t"
132   - "isb\n\t"
133   - );
134   -}
135   -
136   -void icache_disable(void)
137   -{
138   - __asm__ __volatile__ (
139   - "mfsr $p0, $mr8\n\t"
140   - "li $p1, ~0x01\n\t"
141   - "and $p0, $p0, $p1\n\t"
142   - "mtsr $p0, $mr8\n\t"
143   - "isb\n\t"
144   - );
145   -}
146   -
147   -int icache_status(void)
148   -{
149   - int ret;
150   -
151   - __asm__ __volatile__ (
152   - "mfsr $p0, $mr8\n\t"
153   - "andi %0, $p0, 0x01\n\t"
154   - : "=r" (ret)
155   - :
156   - : "memory"
157   - );
158   -
159   - return ret;
160   -}
161   -
162   -void dcache_enable(void)
163   -{
164   - __asm__ __volatile__ (
165   - "mfsr $p0, $mr8\n\t"
166   - "ori $p0, $p0, 0x02\n\t"
167   - "mtsr $p0, $mr8\n\t"
168   - "isb\n\t"
169   - );
170   -}
171   -
172   -void dcache_disable(void)
173   -{
174   - __asm__ __volatile__ (
175   - "mfsr $p0, $mr8\n\t"
176   - "li $p1, ~0x02\n\t"
177   - "and $p0, $p0, $p1\n\t"
178   - "mtsr $p0, $mr8\n\t"
179   - "isb\n\t"
180   - );
181   -}
182   -
183   -int dcache_status(void)
184   -{
185   - int ret;
186   -
187   - __asm__ __volatile__ (
188   - "mfsr $p0, $mr8\n\t"
189   - "andi %0, $p0, 0x02\n\t"
190   - : "=r" (ret)
191   - :
192   - : "memory"
193   - );
194   -
195   - return ret;
196   -}
arch/nds32/cpu/n1213/ag102/cpu.c
... ... @@ -81,116 +81,4 @@
81 81  
82 82 /*NOTREACHED*/
83 83 }
84   -
85   -static inline unsigned long CACHE_LINE_SIZE(enum cache_t cache)
86   -{
87   - if (cache == ICACHE)
88   - return 8 << (((GET_ICM_CFG() & ICM_CFG_MSK_ISZ) \
89   - >> ICM_CFG_OFF_ISZ) - 1);
90   - else
91   - return 8 << (((GET_DCM_CFG() & DCM_CFG_MSK_DSZ) \
92   - >> DCM_CFG_OFF_DSZ) - 1);
93   -}
94   -
95   -void dcache_flush_range(unsigned long start, unsigned long end)
96   -{
97   - unsigned long line_size;
98   -
99   - line_size = CACHE_LINE_SIZE(DCACHE);
100   -
101   - while (end > start) {
102   - __asm__ volatile ("\n\tcctl %0, L1D_VA_WB" : : "r"(start));
103   - __asm__ volatile ("\n\tcctl %0, L1D_VA_INVAL" : : "r"(start));
104   - start += line_size;
105   - }
106   -}
107   -
108   -void icache_inval_range(unsigned long start, unsigned long end)
109   -{
110   - unsigned long line_size;
111   -
112   - line_size = CACHE_LINE_SIZE(ICACHE);
113   - while (end > start) {
114   - __asm__ volatile ("\n\tcctl %0, L1I_VA_INVAL" : : "r"(start));
115   - start += line_size;
116   - }
117   -}
118   -
119   -void flush_cache(unsigned long addr, unsigned long size)
120   -{
121   - dcache_flush_range(addr, addr + size);
122   - icache_inval_range(addr, addr + size);
123   -}
124   -
125   -void icache_enable(void)
126   -{
127   - __asm__ __volatile__ (
128   - "mfsr $p0, $mr8\n\t"
129   - "ori $p0, $p0, 0x01\n\t"
130   - "mtsr $p0, $mr8\n\t"
131   - "isb\n\t"
132   - );
133   -}
134   -
135   -void icache_disable(void)
136   -{
137   - __asm__ __volatile__ (
138   - "mfsr $p0, $mr8\n\t"
139   - "li $p1, ~0x01\n\t"
140   - "and $p0, $p0, $p1\n\t"
141   - "mtsr $p0, $mr8\n\t"
142   - "isb\n\t"
143   - );
144   -}
145   -
146   -int icache_status(void)
147   -{
148   - int ret;
149   -
150   - __asm__ __volatile__ (
151   - "mfsr $p0, $mr8\n\t"
152   - "andi %0, $p0, 0x01\n\t"
153   - : "=r" (ret)
154   - :
155   - : "memory"
156   - );
157   -
158   - return ret;
159   -}
160   -
161   -void dcache_enable(void)
162   -{
163   - __asm__ __volatile__ (
164   - "mfsr $p0, $mr8\n\t"
165   - "ori $p0, $p0, 0x02\n\t"
166   - "mtsr $p0, $mr8\n\t"
167   - "isb\n\t"
168   - );
169   -}
170   -
171   -void dcache_disable(void)
172   -{
173   - __asm__ __volatile__ (
174   - "mfsr $p0, $mr8\n\t"
175   - "li $p1, ~0x02\n\t"
176   - "and $p0, $p0, $p1\n\t"
177   - "mtsr $p0, $mr8\n\t"
178   - "isb\n\t"
179   - );
180   -}
181   -
182   -int dcache_status(void)
183   -{
184   - int ret;
185   -
186   - __asm__ __volatile__ (
187   - "mfsr $p0, $mr8\n\t"
188   - "andi %0, $p0, 0x02\n\t"
189   - : "=r" (ret)
190   - :
191   - : "memory"
192   - );
193   -
194   - return ret;
195   -}
arch/nds32/lib/Makefile
... ... @@ -29,7 +29,7 @@
29 29  
30 30 LIB = $(obj)lib$(ARCH).o
31 31  
32   -OBJS := board.o bootm.o interrupts.o
  32 +OBJS := board.o bootm.o cache.o interrupts.o
33 33  
34 34 all: $(LIB)
35 35  
arch/nds32/lib/cache.c
  1 +/*
  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 + *
  6 + * This program is free software; you can redistribute it and/or modify
  7 + * it under the terms of the GNU General Public License as published by
  8 + * the Free Software Foundation; either version 2 of the License, or
  9 + * (at your option) any later version.
  10 + *
  11 + * This program is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 + * GNU General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU General Public License
  17 + * along with this program; if not, write to the Free Software
  18 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19 + *
  20 + */
  21 +
  22 +#include <common.h>
  23 +
  24 +static inline unsigned long CACHE_LINE_SIZE(enum cache_t cache)
  25 +{
  26 + if (cache == ICACHE)
  27 + return 8 << (((GET_ICM_CFG() & ICM_CFG_MSK_ISZ) \
  28 + >> ICM_CFG_OFF_ISZ) - 1);
  29 + else
  30 + return 8 << (((GET_DCM_CFG() & DCM_CFG_MSK_DSZ) \
  31 + >> DCM_CFG_OFF_DSZ) - 1);
  32 +}
  33 +
  34 +void flush_dcache_range(unsigned long start, unsigned long end)
  35 +{
  36 + unsigned long line_size;
  37 +
  38 + line_size = CACHE_LINE_SIZE(DCACHE);
  39 +
  40 + while (end > start) {
  41 + asm volatile (
  42 + "\n\tcctl %0, L1D_VA_WB"
  43 + "\n\tcctl %0, L1D_VA_INVAL"
  44 + :
  45 + : "r" (start)
  46 + );
  47 + start += line_size;
  48 + }
  49 +}
  50 +
  51 +void invalidate_icache_range(unsigned long start, unsigned long end)
  52 +{
  53 + unsigned long line_size;
  54 +
  55 + line_size = CACHE_LINE_SIZE(ICACHE);
  56 + while (end > start) {
  57 + asm volatile (
  58 + "\n\tcctl %0, L1I_VA_INVAL"
  59 + :
  60 + : "r"(start)
  61 + );
  62 + start += line_size;
  63 + }
  64 +}
  65 +
  66 +void invalidate_dcache_range(unsigned long start, unsigned long end)
  67 +{
  68 + unsigned long line_size;
  69 +
  70 + line_size = CACHE_LINE_SIZE(DCACHE);
  71 + while (end > start) {
  72 + asm volatile (
  73 + "\n\tcctl %0, L1D_VA_INVAL"
  74 + :
  75 + : "r"(start)
  76 + );
  77 + start += line_size;
  78 + }
  79 +}
  80 +
  81 +void flush_cache(unsigned long addr, unsigned long size)
  82 +{
  83 + flush_dcache_range(addr, addr + size);
  84 + invalidate_icache_range(addr, addr + size);
  85 +}
  86 +
  87 +void icache_enable(void)
  88 +{
  89 + asm volatile (
  90 + "mfsr $p0, $mr8\n\t"
  91 + "ori $p0, $p0, 0x01\n\t"
  92 + "mtsr $p0, $mr8\n\t"
  93 + "isb\n\t"
  94 + );
  95 +}
  96 +
  97 +void icache_disable(void)
  98 +{
  99 + asm volatile (
  100 + "mfsr $p0, $mr8\n\t"
  101 + "li $p1, ~0x01\n\t"
  102 + "and $p0, $p0, $p1\n\t"
  103 + "mtsr $p0, $mr8\n\t"
  104 + "isb\n\t"
  105 + );
  106 +}
  107 +
  108 +int icache_status(void)
  109 +{
  110 + int ret;
  111 +
  112 + asm volatile (
  113 + "mfsr $p0, $mr8\n\t"
  114 + "andi %0, $p0, 0x01\n\t"
  115 + : "=r" (ret)
  116 + :
  117 + : "memory"
  118 + );
  119 +
  120 + return ret;
  121 +}
  122 +
  123 +void dcache_enable(void)
  124 +{
  125 + asm volatile (
  126 + "mfsr $p0, $mr8\n\t"
  127 + "ori $p0, $p0, 0x02\n\t"
  128 + "mtsr $p0, $mr8\n\t"
  129 + "isb\n\t"
  130 + );
  131 +}
  132 +
  133 +void dcache_disable(void)
  134 +{
  135 + asm volatile (
  136 + "mfsr $p0, $mr8\n\t"
  137 + "li $p1, ~0x02\n\t"
  138 + "and $p0, $p0, $p1\n\t"
  139 + "mtsr $p0, $mr8\n\t"
  140 + "isb\n\t"
  141 + );
  142 +}
  143 +
  144 +int dcache_status(void)
  145 +{
  146 + int ret;
  147 +
  148 + asm volatile (
  149 + "mfsr $p0, $mr8\n\t"
  150 + "andi %0, $p0, 0x02\n\t"
  151 + : "=r" (ret)
  152 + :
  153 + : "memory"
  154 + );
  155 +
  156 + return ret;
  157 +}