diff options
Diffstat (limited to 'arch/arm/mm/cache-l2x0.c')
-rw-r--r-- | arch/arm/mm/cache-l2x0.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 170c9bb95866..ef59099a5463 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c | |||
@@ -49,7 +49,13 @@ static inline void cache_wait(void __iomem *reg, unsigned long mask) | |||
49 | static inline void cache_sync(void) | 49 | static inline void cache_sync(void) |
50 | { | 50 | { |
51 | void __iomem *base = l2x0_base; | 51 | void __iomem *base = l2x0_base; |
52 | |||
53 | #ifdef CONFIG_ARM_ERRATA_753970 | ||
54 | /* write to an unmmapped register */ | ||
55 | writel_relaxed(0, base + L2X0_DUMMY_REG); | ||
56 | #else | ||
52 | writel_relaxed(0, base + L2X0_CACHE_SYNC); | 57 | writel_relaxed(0, base + L2X0_CACHE_SYNC); |
58 | #endif | ||
53 | cache_wait(base + L2X0_CACHE_SYNC, 1); | 59 | cache_wait(base + L2X0_CACHE_SYNC, 1); |
54 | } | 60 | } |
55 | 61 | ||
@@ -67,18 +73,24 @@ static inline void l2x0_inv_line(unsigned long addr) | |||
67 | writel_relaxed(addr, base + L2X0_INV_LINE_PA); | 73 | writel_relaxed(addr, base + L2X0_INV_LINE_PA); |
68 | } | 74 | } |
69 | 75 | ||
70 | #ifdef CONFIG_PL310_ERRATA_588369 | 76 | #if defined(CONFIG_PL310_ERRATA_588369) || defined(CONFIG_PL310_ERRATA_727915) |
71 | static void debug_writel(unsigned long val) | ||
72 | { | ||
73 | extern void omap_smc1(u32 fn, u32 arg); | ||
74 | 77 | ||
75 | /* | 78 | #define debug_writel(val) outer_cache.set_debug(val) |
76 | * Texas Instrument secure monitor api to modify the | 79 | |
77 | * PL310 Debug Control Register. | 80 | static void l2x0_set_debug(unsigned long val) |
78 | */ | 81 | { |
79 | omap_smc1(0x100, val); | 82 | writel_relaxed(val, l2x0_base + L2X0_DEBUG_CTRL); |
83 | } | ||
84 | #else | ||
85 | /* Optimised out for non-errata case */ | ||
86 | static inline void debug_writel(unsigned long val) | ||
87 | { | ||
80 | } | 88 | } |
81 | 89 | ||
90 | #define l2x0_set_debug NULL | ||
91 | #endif | ||
92 | |||
93 | #ifdef CONFIG_PL310_ERRATA_588369 | ||
82 | static inline void l2x0_flush_line(unsigned long addr) | 94 | static inline void l2x0_flush_line(unsigned long addr) |
83 | { | 95 | { |
84 | void __iomem *base = l2x0_base; | 96 | void __iomem *base = l2x0_base; |
@@ -91,11 +103,6 @@ static inline void l2x0_flush_line(unsigned long addr) | |||
91 | } | 103 | } |
92 | #else | 104 | #else |
93 | 105 | ||
94 | /* Optimised out for non-errata case */ | ||
95 | static inline void debug_writel(unsigned long val) | ||
96 | { | ||
97 | } | ||
98 | |||
99 | static inline void l2x0_flush_line(unsigned long addr) | 106 | static inline void l2x0_flush_line(unsigned long addr) |
100 | { | 107 | { |
101 | void __iomem *base = l2x0_base; | 108 | void __iomem *base = l2x0_base; |
@@ -119,9 +126,11 @@ static void l2x0_flush_all(void) | |||
119 | 126 | ||
120 | /* clean all ways */ | 127 | /* clean all ways */ |
121 | spin_lock_irqsave(&l2x0_lock, flags); | 128 | spin_lock_irqsave(&l2x0_lock, flags); |
129 | debug_writel(0x03); | ||
122 | writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY); | 130 | writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY); |
123 | cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask); | 131 | cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask); |
124 | cache_sync(); | 132 | cache_sync(); |
133 | debug_writel(0x00); | ||
125 | spin_unlock_irqrestore(&l2x0_lock, flags); | 134 | spin_unlock_irqrestore(&l2x0_lock, flags); |
126 | } | 135 | } |
127 | 136 | ||
@@ -329,6 +338,7 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask) | |||
329 | outer_cache.flush_all = l2x0_flush_all; | 338 | outer_cache.flush_all = l2x0_flush_all; |
330 | outer_cache.inv_all = l2x0_inv_all; | 339 | outer_cache.inv_all = l2x0_inv_all; |
331 | outer_cache.disable = l2x0_disable; | 340 | outer_cache.disable = l2x0_disable; |
341 | outer_cache.set_debug = l2x0_set_debug; | ||
332 | 342 | ||
333 | printk(KERN_INFO "%s cache controller enabled\n", type); | 343 | printk(KERN_INFO "%s cache controller enabled\n", type); |
334 | printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", | 344 | printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", |