diff options
Diffstat (limited to 'arch/arm/mm/cache-l2x0.c')
| -rw-r--r-- | arch/arm/mm/cache-l2x0.c | 111 |
1 files changed, 38 insertions, 73 deletions
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 01de13809454..404c598da27d 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
| @@ -156,73 +156,6 @@ static void l2c_disable(void) | |||
| 156 | dsb(st); | 156 | dsb(st); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | #ifdef CONFIG_CACHE_PL310 | ||
| 160 | static inline void cache_wait(void __iomem *reg, unsigned long mask) | ||
| 161 | { | ||
| 162 | /* cache operations by line are atomic on PL310 */ | ||
| 163 | } | ||
| 164 | #else | ||
| 165 | #define cache_wait l2c_wait_mask | ||
| 166 | #endif | ||
| 167 | |||
| 168 | static inline void cache_sync(void) | ||
| 169 | { | ||
| 170 | void __iomem *base = l2x0_base; | ||
| 171 | |||
| 172 | writel_relaxed(0, base + sync_reg_offset); | ||
| 173 | cache_wait(base + L2X0_CACHE_SYNC, 1); | ||
| 174 | } | ||
| 175 | |||
| 176 | #if defined(CONFIG_PL310_ERRATA_588369) || defined(CONFIG_PL310_ERRATA_727915) | ||
| 177 | static inline void debug_writel(unsigned long val) | ||
| 178 | { | ||
| 179 | l2c_set_debug(l2x0_base, val); | ||
| 180 | } | ||
| 181 | #else | ||
| 182 | /* Optimised out for non-errata case */ | ||
| 183 | static inline void debug_writel(unsigned long val) | ||
| 184 | { | ||
| 185 | } | ||
| 186 | #endif | ||
| 187 | |||
| 188 | static void l2x0_cache_sync(void) | ||
| 189 | { | ||
| 190 | unsigned long flags; | ||
| 191 | |||
| 192 | raw_spin_lock_irqsave(&l2x0_lock, flags); | ||
| 193 | cache_sync(); | ||
| 194 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | ||
| 195 | } | ||
| 196 | |||
| 197 | static void __l2x0_flush_all(void) | ||
| 198 | { | ||
| 199 | debug_writel(0x03); | ||
| 200 | __l2c_op_way(l2x0_base + L2X0_CLEAN_INV_WAY); | ||
| 201 | cache_sync(); | ||
| 202 | debug_writel(0x00); | ||
| 203 | } | ||
| 204 | |||
| 205 | static void l2x0_flush_all(void) | ||
| 206 | { | ||
| 207 | unsigned long flags; | ||
| 208 | |||
| 209 | /* clean all ways */ | ||
| 210 | raw_spin_lock_irqsave(&l2x0_lock, flags); | ||
| 211 | __l2x0_flush_all(); | ||
| 212 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | ||
| 213 | } | ||
| 214 | |||
| 215 | static void l2x0_disable(void) | ||
| 216 | { | ||
| 217 | unsigned long flags; | ||
| 218 | |||
| 219 | raw_spin_lock_irqsave(&l2x0_lock, flags); | ||
| 220 | __l2x0_flush_all(); | ||
| 221 | l2c_write_sec(0, l2x0_base, L2X0_CTRL); | ||
| 222 | dsb(st); | ||
| 223 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | ||
| 224 | } | ||
| 225 | |||
| 226 | static void l2c_save(void __iomem *base) | 159 | static void l2c_save(void __iomem *base) |
| 227 | { | 160 | { |
| 228 | l2x0_saved_regs.aux_ctrl = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); | 161 | l2x0_saved_regs.aux_ctrl = readl_relaxed(l2x0_base + L2X0_AUX_CTRL); |
| @@ -1349,14 +1282,15 @@ static unsigned long calc_range_end(unsigned long start, unsigned long end) | |||
| 1349 | static void aurora_pa_range(unsigned long start, unsigned long end, | 1282 | static void aurora_pa_range(unsigned long start, unsigned long end, |
| 1350 | unsigned long offset) | 1283 | unsigned long offset) |
| 1351 | { | 1284 | { |
| 1285 | void __iomem *base = l2x0_base; | ||
| 1352 | unsigned long flags; | 1286 | unsigned long flags; |
| 1353 | 1287 | ||
| 1354 | raw_spin_lock_irqsave(&l2x0_lock, flags); | 1288 | raw_spin_lock_irqsave(&l2x0_lock, flags); |
| 1355 | writel_relaxed(start, l2x0_base + AURORA_RANGE_BASE_ADDR_REG); | 1289 | writel_relaxed(start, base + AURORA_RANGE_BASE_ADDR_REG); |
| 1356 | writel_relaxed(end, l2x0_base + offset); | 1290 | writel_relaxed(end, base + offset); |
| 1357 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | 1291 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); |
| 1358 | 1292 | ||
| 1359 | cache_sync(); | 1293 | writel_relaxed(0, base + AURORA_SYNC_REG); |
| 1360 | } | 1294 | } |
| 1361 | 1295 | ||
| 1362 | static void aurora_inv_range(unsigned long start, unsigned long end) | 1296 | static void aurora_inv_range(unsigned long start, unsigned long end) |
| @@ -1416,6 +1350,37 @@ static void aurora_flush_range(unsigned long start, unsigned long end) | |||
| 1416 | } | 1350 | } |
| 1417 | } | 1351 | } |
| 1418 | 1352 | ||
| 1353 | static void aurora_flush_all(void) | ||
| 1354 | { | ||
| 1355 | void __iomem *base = l2x0_base; | ||
| 1356 | unsigned long flags; | ||
| 1357 | |||
| 1358 | /* clean all ways */ | ||
| 1359 | raw_spin_lock_irqsave(&l2x0_lock, flags); | ||
| 1360 | __l2c_op_way(base + L2X0_CLEAN_INV_WAY); | ||
| 1361 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | ||
| 1362 | |||
| 1363 | writel_relaxed(0, base + AURORA_SYNC_REG); | ||
| 1364 | } | ||
| 1365 | |||
| 1366 | static void aurora_cache_sync(void) | ||
| 1367 | { | ||
| 1368 | writel_relaxed(0, l2x0_base + AURORA_SYNC_REG); | ||
| 1369 | } | ||
| 1370 | |||
| 1371 | static void aurora_disable(void) | ||
| 1372 | { | ||
| 1373 | void __iomem *base = l2x0_base; | ||
| 1374 | unsigned long flags; | ||
| 1375 | |||
| 1376 | raw_spin_lock_irqsave(&l2x0_lock, flags); | ||
| 1377 | __l2c_op_way(base + L2X0_CLEAN_INV_WAY); | ||
| 1378 | writel_relaxed(0, base + AURORA_SYNC_REG); | ||
| 1379 | l2c_write_sec(0, base, L2X0_CTRL); | ||
| 1380 | dsb(st); | ||
| 1381 | raw_spin_unlock_irqrestore(&l2x0_lock, flags); | ||
| 1382 | } | ||
| 1383 | |||
| 1419 | static void aurora_save(void __iomem *base) | 1384 | static void aurora_save(void __iomem *base) |
| 1420 | { | 1385 | { |
| 1421 | l2x0_saved_regs.ctrl = readl_relaxed(base + L2X0_CTRL); | 1386 | l2x0_saved_regs.ctrl = readl_relaxed(base + L2X0_CTRL); |
| @@ -1480,9 +1445,9 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = { | |||
| 1480 | .inv_range = aurora_inv_range, | 1445 | .inv_range = aurora_inv_range, |
| 1481 | .clean_range = aurora_clean_range, | 1446 | .clean_range = aurora_clean_range, |
| 1482 | .flush_range = aurora_flush_range, | 1447 | .flush_range = aurora_flush_range, |
| 1483 | .flush_all = l2x0_flush_all, | 1448 | .flush_all = aurora_flush_all, |
| 1484 | .disable = l2x0_disable, | 1449 | .disable = aurora_disable, |
| 1485 | .sync = l2x0_cache_sync, | 1450 | .sync = aurora_cache_sync, |
| 1486 | .resume = l2c_resume, | 1451 | .resume = l2c_resume, |
| 1487 | }, | 1452 | }, |
| 1488 | }; | 1453 | }; |
