blob: 215df435bfb9881f347d59f90aa0a98765d304b4 [file] [log] [blame]
Catalin Marinasbbe88882007-05-08 22:27:46 +01001/*
2 * linux/arch/arm/mm/cache-v7.S
3 *
4 * Copyright (C) 2001 Deep Blue Solutions Ltd.
5 * Copyright (C) 2005 ARM Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * This is the "shell" of the ARMv7 processor support.
12 */
13#include <linux/linkage.h>
14#include <linux/init.h>
15#include <asm/assembler.h>
Will Deaconc5102f52012-04-27 13:08:53 +010016#include <asm/errno.h>
Catalin Marinas32cfb1b2009-10-06 17:57:09 +010017#include <asm/unwind.h>
Florian Fainelli1238c4f2017-12-01 01:10:10 +010018#include <asm/hardware/cache-b15-rac.h>
Catalin Marinasbbe88882007-05-08 22:27:46 +010019
20#include "proc-macros.S"
21
22/*
Dinh Nguyenc08e20d2013-02-11 17:30:32 -060023 * The secondary kernel init calls v7_flush_dcache_all before it enables
24 * the L1; however, the L1 comes out of reset in an undefined state, so
25 * the clean + invalidate performed by v7_flush_dcache_all causes a bunch
26 * of cache lines with uninitialized data and uninitialized tags to get
27 * written out to memory, which does really unpleasant things to the main
28 * processor. We fix this by performing an invalidate, rather than a
29 * clean + invalidate, before jumping into the kernel.
30 *
31 * This function is cloned from arch/arm/mach-tegra/headsmp.S, and needs
32 * to be called for both secondary cores startup and primary core resume
33 * procedures.
34 */
35ENTRY(v7_invalidate_l1)
36 mov r0, #0
37 mcr p15, 2, r0, c0, c0, 0
38 mrc p15, 1, r0, c0, c0, 0
39
Russell King5aca37082015-04-03 11:10:46 +010040 movw r1, #0x7fff
Dinh Nguyenc08e20d2013-02-11 17:30:32 -060041 and r2, r1, r0, lsr #13
42
Russell King5aca37082015-04-03 11:10:46 +010043 movw r1, #0x3ff
Dinh Nguyenc08e20d2013-02-11 17:30:32 -060044
45 and r3, r1, r0, lsr #3 @ NumWays - 1
46 add r2, r2, #1 @ NumSets
47
48 and r0, r0, #0x7
49 add r0, r0, #4 @ SetShift
50
51 clz r1, r3 @ WayShift
52 add r4, r3, #1 @ NumWays
531: sub r2, r2, #1 @ NumSets--
54 mov r3, r4 @ Temp = NumWays
552: subs r3, r3, #1 @ Temp--
56 mov r5, r3, lsl r1
57 mov r6, r2, lsl r0
58 orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
59 mcr p15, 0, r5, c7, c6, 2
60 bgt 2b
61 cmp r2, #0
62 bgt 1b
Will Deacon95819602014-05-09 18:36:27 +010063 dsb st
Dinh Nguyenc08e20d2013-02-11 17:30:32 -060064 isb
Russell King6ebbf2c2014-06-30 16:29:12 +010065 ret lr
Dinh Nguyenc08e20d2013-02-11 17:30:32 -060066ENDPROC(v7_invalidate_l1)
67
68/*
Tony Lindgren81d11952010-09-21 17:16:40 +010069 * v7_flush_icache_all()
70 *
71 * Flush the whole I-cache.
72 *
73 * Registers:
74 * r0 - set to 0
75 */
76ENTRY(v7_flush_icache_all)
77 mov r0, #0
78 ALT_SMP(mcr p15, 0, r0, c7, c1, 0) @ invalidate I-cache inner shareable
79 ALT_UP(mcr p15, 0, r0, c7, c5, 0) @ I+BTB cache invalidate
Russell King6ebbf2c2014-06-30 16:29:12 +010080 ret lr
Tony Lindgren81d11952010-09-21 17:16:40 +010081ENDPROC(v7_flush_icache_all)
82
Lorenzo Pieralisi031bd872012-09-06 18:35:13 +053083 /*
84 * v7_flush_dcache_louis()
85 *
86 * Flush the D-cache up to the Level of Unification Inner Shareable
87 *
88 * Corrupted registers: r0-r7, r9-r11 (r6 only in Thumb mode)
89 */
90
91ENTRY(v7_flush_dcache_louis)
92 dmb @ ensure ordering with previous memory accesses
93 mrc p15, 1, r0, c0, c0, 1 @ read clidr, r0 = clidr
Russell King47b84842015-04-03 11:15:53 +010094ALT_SMP(mov r3, r0, lsr #20) @ move LoUIS into position
95ALT_UP( mov r3, r0, lsr #26) @ move LoUU into position
96 ands r3, r3, #7 << 1 @ extract LoU*2 field from clidr
Russell Kingd3cd4512015-04-03 11:25:39 +010097 bne start_flush_levels @ LoU != 0, start flushing
Jon Medhurst69155792013-06-07 10:35:35 +010098#ifdef CONFIG_ARM_ERRATA_643719
Russell Kingd3cd4512015-04-03 11:25:39 +010099ALT_SMP(mrc p15, 0, r2, c0, c0, 0) @ read main ID register
100ALT_UP( ret lr) @ LoUU is zero, so nothing to do
Russell Kingaaf4b5d2015-04-03 11:32:34 +0100101 movw r1, #:lower16:(0x410fc090 >> 4) @ ID of ARM Cortex A9 r0p?
102 movt r1, #:upper16:(0x410fc090 >> 4)
103 teq r1, r2, lsr #4 @ test for errata affected core and if so...
Russell Kingd3cd4512015-04-03 11:25:39 +0100104 moveq r3, #1 << 1 @ fix LoUIS value
105 beq start_flush_levels @ start flushing cache levels
Jon Medhurst69155792013-06-07 10:35:35 +0100106#endif
Russell Kingd3cd4512015-04-03 11:25:39 +0100107 ret lr
Lorenzo Pieralisi031bd872012-09-06 18:35:13 +0530108ENDPROC(v7_flush_dcache_louis)
109
Tony Lindgren81d11952010-09-21 17:16:40 +0100110/*
Catalin Marinasbbe88882007-05-08 22:27:46 +0100111 * v7_flush_dcache_all()
112 *
113 * Flush the whole D-cache.
114 *
Catalin Marinas347c8b72009-07-24 12:32:56 +0100115 * Corrupted registers: r0-r7, r9-r11 (r6 only in Thumb mode)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100116 *
117 * - mm - mm_struct describing address space
118 */
119ENTRY(v7_flush_dcache_all)
Catalin Marinasc30c2f92008-11-06 13:23:07 +0000120 dmb @ ensure ordering with previous memory accesses
Catalin Marinasbbe88882007-05-08 22:27:46 +0100121 mrc p15, 1, r0, c0, c0, 1 @ read clidr
Russell King47b84842015-04-03 11:15:53 +0100122 mov r3, r0, lsr #23 @ move LoC into position
123 ands r3, r3, #7 << 1 @ extract LoC*2 from clidr
Catalin Marinasbbe88882007-05-08 22:27:46 +0100124 beq finished @ if loc is 0, then no need to clean
Russell Kingcd8b24d2015-04-03 11:21:42 +0100125start_flush_levels:
Catalin Marinasbbe88882007-05-08 22:27:46 +0100126 mov r10, #0 @ start clean at cache level 0
Lorenzo Pieralisi3287be82012-09-18 16:29:44 +0100127flush_levels:
Catalin Marinasbbe88882007-05-08 22:27:46 +0100128 add r2, r10, r10, lsr #1 @ work out 3x current cache level
129 mov r1, r0, lsr r2 @ extract cache type bits from clidr
130 and r1, r1, #7 @ mask of the bits for current cache only
131 cmp r1, #2 @ see what cache we have at this level
132 blt skip @ skip if no cache, or just i-cache
Stephen Boydb46c0f72012-02-07 19:42:07 +0100133#ifdef CONFIG_PREEMPT
Rabin Vincent8e43a902012-02-15 16:01:42 +0100134 save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic
Stephen Boydb46c0f72012-02-07 19:42:07 +0100135#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +0100136 mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
137 isb @ isb to sych the new cssr&csidr
138 mrc p15, 1, r1, c0, c0, 0 @ read the new csidr
Stephen Boydb46c0f72012-02-07 19:42:07 +0100139#ifdef CONFIG_PREEMPT
140 restore_irqs_notrace r9
141#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +0100142 and r2, r1, #7 @ extract the length of the cache lines
143 add r2, r2, #4 @ add 4 (line length offset)
Russell King5aca37082015-04-03 11:10:46 +0100144 movw r4, #0x3ff
Catalin Marinasbbe88882007-05-08 22:27:46 +0100145 ands r4, r4, r1, lsr #3 @ find maximum number on the way size
146 clz r5, r4 @ find bit position of way size increment
Russell King5aca37082015-04-03 11:10:46 +0100147 movw r7, #0x7fff
Catalin Marinasbbe88882007-05-08 22:27:46 +0100148 ands r7, r7, r1, lsr #13 @ extract max number of the index size
Lorenzo Pieralisi3287be82012-09-18 16:29:44 +0100149loop1:
Lorenzo Pieralisi70f665f2013-12-09 18:06:53 +0100150 mov r9, r7 @ create working copy of max index
Lorenzo Pieralisi3287be82012-09-18 16:29:44 +0100151loop2:
Lorenzo Pieralisi70f665f2013-12-09 18:06:53 +0100152 ARM( orr r11, r10, r4, lsl r5 ) @ factor way and cache number into r11
153 THUMB( lsl r6, r4, r5 )
Catalin Marinas347c8b72009-07-24 12:32:56 +0100154 THUMB( orr r11, r10, r6 ) @ factor way and cache number into r11
Lorenzo Pieralisi70f665f2013-12-09 18:06:53 +0100155 ARM( orr r11, r11, r9, lsl r2 ) @ factor index number into r11
156 THUMB( lsl r6, r9, r2 )
Catalin Marinas347c8b72009-07-24 12:32:56 +0100157 THUMB( orr r11, r11, r6 ) @ factor index number into r11
Catalin Marinasbbe88882007-05-08 22:27:46 +0100158 mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way
Lorenzo Pieralisi70f665f2013-12-09 18:06:53 +0100159 subs r9, r9, #1 @ decrement the index
Catalin Marinasbbe88882007-05-08 22:27:46 +0100160 bge loop2
Lorenzo Pieralisi70f665f2013-12-09 18:06:53 +0100161 subs r4, r4, #1 @ decrement the way
Lorenzo Pieralisi3287be82012-09-18 16:29:44 +0100162 bge loop1
Catalin Marinasbbe88882007-05-08 22:27:46 +0100163skip:
164 add r10, r10, #2 @ increment cache number
165 cmp r3, r10
Lorenzo Pieralisi3287be82012-09-18 16:29:44 +0100166 bgt flush_levels
Catalin Marinasbbe88882007-05-08 22:27:46 +0100167finished:
Masahiro Yamada08a7e622017-02-27 14:28:41 -0800168 mov r10, #0 @ switch back to cache level 0
Catalin Marinasbbe88882007-05-08 22:27:46 +0100169 mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
Will Deacon95819602014-05-09 18:36:27 +0100170 dsb st
Catalin Marinasbbe88882007-05-08 22:27:46 +0100171 isb
Russell King6ebbf2c2014-06-30 16:29:12 +0100172 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100173ENDPROC(v7_flush_dcache_all)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100174
175/*
176 * v7_flush_cache_all()
177 *
178 * Flush the entire cache system.
179 * The data cache flush is now achieved using atomic clean / invalidates
180 * working outwards from L1 cache. This is done using Set/Way based cache
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300181 * maintenance instructions.
Catalin Marinasbbe88882007-05-08 22:27:46 +0100182 * The instruction cache can still be invalidated back to the point of
183 * unification in a single instruction.
184 *
185 */
186ENTRY(v7_flush_kern_cache_all)
Catalin Marinas347c8b72009-07-24 12:32:56 +0100187 ARM( stmfd sp!, {r4-r5, r7, r9-r11, lr} )
188 THUMB( stmfd sp!, {r4-r7, r9-r11, lr} )
Catalin Marinasbbe88882007-05-08 22:27:46 +0100189 bl v7_flush_dcache_all
190 mov r0, #0
Russell Kingf00ec482010-09-04 10:47:48 +0100191 ALT_SMP(mcr p15, 0, r0, c7, c1, 0) @ invalidate I-cache inner shareable
192 ALT_UP(mcr p15, 0, r0, c7, c5, 0) @ I+BTB cache invalidate
Catalin Marinas347c8b72009-07-24 12:32:56 +0100193 ARM( ldmfd sp!, {r4-r5, r7, r9-r11, lr} )
194 THUMB( ldmfd sp!, {r4-r7, r9-r11, lr} )
Russell King6ebbf2c2014-06-30 16:29:12 +0100195 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100196ENDPROC(v7_flush_kern_cache_all)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100197
Lorenzo Pieralisi031bd872012-09-06 18:35:13 +0530198 /*
199 * v7_flush_kern_cache_louis(void)
200 *
201 * Flush the data cache up to Level of Unification Inner Shareable.
202 * Invalidate the I-cache to the point of unification.
203 */
204ENTRY(v7_flush_kern_cache_louis)
205 ARM( stmfd sp!, {r4-r5, r7, r9-r11, lr} )
206 THUMB( stmfd sp!, {r4-r7, r9-r11, lr} )
207 bl v7_flush_dcache_louis
208 mov r0, #0
209 ALT_SMP(mcr p15, 0, r0, c7, c1, 0) @ invalidate I-cache inner shareable
210 ALT_UP(mcr p15, 0, r0, c7, c5, 0) @ I+BTB cache invalidate
211 ARM( ldmfd sp!, {r4-r5, r7, r9-r11, lr} )
212 THUMB( ldmfd sp!, {r4-r7, r9-r11, lr} )
Russell King6ebbf2c2014-06-30 16:29:12 +0100213 ret lr
Lorenzo Pieralisi031bd872012-09-06 18:35:13 +0530214ENDPROC(v7_flush_kern_cache_louis)
215
Catalin Marinasbbe88882007-05-08 22:27:46 +0100216/*
217 * v7_flush_cache_all()
218 *
219 * Flush all TLB entries in a particular address space
220 *
221 * - mm - mm_struct describing address space
222 */
223ENTRY(v7_flush_user_cache_all)
224 /*FALLTHROUGH*/
225
226/*
227 * v7_flush_cache_range(start, end, flags)
228 *
229 * Flush a range of TLB entries in the specified address space.
230 *
231 * - start - start address (may not be aligned)
232 * - end - end address (exclusive, may not be aligned)
233 * - flags - vm_area_struct flags describing address space
234 *
235 * It is assumed that:
236 * - we have a VIPT cache.
237 */
238ENTRY(v7_flush_user_cache_range)
Russell King6ebbf2c2014-06-30 16:29:12 +0100239 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100240ENDPROC(v7_flush_user_cache_all)
241ENDPROC(v7_flush_user_cache_range)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100242
243/*
244 * v7_coherent_kern_range(start,end)
245 *
246 * Ensure that the I and D caches are coherent within specified
247 * region. This is typically used when code has been written to
248 * a memory region, and will be executed.
249 *
250 * - start - virtual start address of region
251 * - end - virtual end address of region
252 *
253 * It is assumed that:
254 * - the Icache does not read data from the write buffer
255 */
256ENTRY(v7_coherent_kern_range)
257 /* FALLTHROUGH */
258
259/*
260 * v7_coherent_user_range(start,end)
261 *
262 * Ensure that the I and D caches are coherent within specified
263 * region. This is typically used when code has been written to
264 * a memory region, and will be executed.
265 *
266 * - start - virtual start address of region
267 * - end - virtual end address of region
268 *
269 * It is assumed that:
270 * - the Icache does not read data from the write buffer
271 */
272ENTRY(v7_coherent_user_range)
Catalin Marinas32cfb1b2009-10-06 17:57:09 +0100273 UNWIND(.fnstart )
Catalin Marinasbbe88882007-05-08 22:27:46 +0100274 dcache_line_size r2, r3
275 sub r3, r2, #1
Catalin Marinasda30e0a2010-12-07 16:56:29 +0100276 bic r12, r0, r3
Will Deaconf630c1b2011-09-15 11:45:15 +0100277#ifdef CONFIG_ARM_ERRATA_764369
278 ALT_SMP(W(dsb))
279 ALT_UP(W(nop))
280#endif
Catalin Marinas32cfb1b2009-10-06 17:57:09 +01002811:
Catalin Marinasda30e0a2010-12-07 16:56:29 +0100282 USER( mcr p15, 0, r12, c7, c11, 1 ) @ clean D line to the point of unification
283 add r12, r12, r2
284 cmp r12, r1
Catalin Marinasbbe88882007-05-08 22:27:46 +0100285 blo 1b
Will Deacon6abdd492013-05-13 12:01:12 +0100286 dsb ishst
Catalin Marinasda30e0a2010-12-07 16:56:29 +0100287 icache_line_size r2, r3
288 sub r3, r2, #1
289 bic r12, r0, r3
2902:
291 USER( mcr p15, 0, r12, c7, c5, 1 ) @ invalidate I line
292 add r12, r12, r2
293 cmp r12, r1
294 blo 2b
Catalin Marinasbbe88882007-05-08 22:27:46 +0100295 mov r0, #0
Russell Kingf00ec482010-09-04 10:47:48 +0100296 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable
297 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB
Will Deacon6abdd492013-05-13 12:01:12 +0100298 dsb ishst
Catalin Marinasbbe88882007-05-08 22:27:46 +0100299 isb
Russell King6ebbf2c2014-06-30 16:29:12 +0100300 ret lr
Catalin Marinas32cfb1b2009-10-06 17:57:09 +0100301
302/*
303 * Fault handling for the cache operation above. If the virtual address in r0
Will Deaconc5102f52012-04-27 13:08:53 +0100304 * isn't mapped, fail with -EFAULT.
Catalin Marinas32cfb1b2009-10-06 17:57:09 +0100305 */
3069001:
Simon Horman7253b852012-09-28 02:12:45 +0100307#ifdef CONFIG_ARM_ERRATA_775420
308 dsb
309#endif
Will Deaconc5102f52012-04-27 13:08:53 +0100310 mov r0, #-EFAULT
Russell King6ebbf2c2014-06-30 16:29:12 +0100311 ret lr
Catalin Marinas32cfb1b2009-10-06 17:57:09 +0100312 UNWIND(.fnend )
Catalin Marinas93ed3972008-08-28 11:22:32 +0100313ENDPROC(v7_coherent_kern_range)
314ENDPROC(v7_coherent_user_range)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100315
316/*
Russell King2c9b9c82009-11-26 12:56:21 +0000317 * v7_flush_kern_dcache_area(void *addr, size_t size)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100318 *
319 * Ensure that the data held in the page kaddr is written back
320 * to the page in question.
321 *
Russell King2c9b9c82009-11-26 12:56:21 +0000322 * - addr - kernel address
323 * - size - region size
Catalin Marinasbbe88882007-05-08 22:27:46 +0100324 */
Russell King2c9b9c82009-11-26 12:56:21 +0000325ENTRY(v7_flush_kern_dcache_area)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100326 dcache_line_size r2, r3
Russell King2c9b9c82009-11-26 12:56:21 +0000327 add r1, r0, r1
Will Deacona248b132011-05-26 11:20:19 +0100328 sub r3, r2, #1
329 bic r0, r0, r3
Will Deaconf630c1b2011-09-15 11:45:15 +0100330#ifdef CONFIG_ARM_ERRATA_764369
331 ALT_SMP(W(dsb))
332 ALT_UP(W(nop))
333#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +01003341:
335 mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line / unified line
336 add r0, r0, r2
337 cmp r0, r1
338 blo 1b
Will Deacon95819602014-05-09 18:36:27 +0100339 dsb st
Russell King6ebbf2c2014-06-30 16:29:12 +0100340 ret lr
Russell King2c9b9c82009-11-26 12:56:21 +0000341ENDPROC(v7_flush_kern_dcache_area)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100342
343/*
344 * v7_dma_inv_range(start,end)
345 *
346 * Invalidate the data cache within the specified region; we will
347 * be performing a DMA operation in this region and we want to
348 * purge old data in the cache.
349 *
350 * - start - virtual start address of region
351 * - end - virtual end address of region
352 */
Russell King702b94b2009-11-26 16:24:19 +0000353v7_dma_inv_range:
Catalin Marinasbbe88882007-05-08 22:27:46 +0100354 dcache_line_size r2, r3
355 sub r3, r2, #1
356 tst r0, r3
357 bic r0, r0, r3
Will Deaconf630c1b2011-09-15 11:45:15 +0100358#ifdef CONFIG_ARM_ERRATA_764369
359 ALT_SMP(W(dsb))
360 ALT_UP(W(nop))
361#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +0100362 mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line
363
364 tst r1, r3
365 bic r1, r1, r3
366 mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D / U line
3671:
368 mcr p15, 0, r0, c7, c6, 1 @ invalidate D / U line
369 add r0, r0, r2
370 cmp r0, r1
371 blo 1b
Will Deacon95819602014-05-09 18:36:27 +0100372 dsb st
Russell King6ebbf2c2014-06-30 16:29:12 +0100373 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100374ENDPROC(v7_dma_inv_range)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100375
376/*
377 * v7_dma_clean_range(start,end)
378 * - start - virtual start address of region
379 * - end - virtual end address of region
380 */
Russell King702b94b2009-11-26 16:24:19 +0000381v7_dma_clean_range:
Catalin Marinasbbe88882007-05-08 22:27:46 +0100382 dcache_line_size r2, r3
383 sub r3, r2, #1
384 bic r0, r0, r3
Will Deaconf630c1b2011-09-15 11:45:15 +0100385#ifdef CONFIG_ARM_ERRATA_764369
386 ALT_SMP(W(dsb))
387 ALT_UP(W(nop))
388#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +01003891:
390 mcr p15, 0, r0, c7, c10, 1 @ clean D / U line
391 add r0, r0, r2
392 cmp r0, r1
393 blo 1b
Will Deacon95819602014-05-09 18:36:27 +0100394 dsb st
Russell King6ebbf2c2014-06-30 16:29:12 +0100395 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100396ENDPROC(v7_dma_clean_range)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100397
398/*
399 * v7_dma_flush_range(start,end)
400 * - start - virtual start address of region
401 * - end - virtual end address of region
402 */
403ENTRY(v7_dma_flush_range)
404 dcache_line_size r2, r3
405 sub r3, r2, #1
406 bic r0, r0, r3
Will Deaconf630c1b2011-09-15 11:45:15 +0100407#ifdef CONFIG_ARM_ERRATA_764369
408 ALT_SMP(W(dsb))
409 ALT_UP(W(nop))
410#endif
Catalin Marinasbbe88882007-05-08 22:27:46 +01004111:
412 mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line
413 add r0, r0, r2
414 cmp r0, r1
415 blo 1b
Will Deacon95819602014-05-09 18:36:27 +0100416 dsb st
Russell King6ebbf2c2014-06-30 16:29:12 +0100417 ret lr
Catalin Marinas93ed3972008-08-28 11:22:32 +0100418ENDPROC(v7_dma_flush_range)
Catalin Marinasbbe88882007-05-08 22:27:46 +0100419
Russell Kinga9c91472009-11-26 16:19:58 +0000420/*
421 * dma_map_area(start, size, dir)
422 * - start - kernel virtual start address
423 * - size - size of region
424 * - dir - DMA direction
425 */
426ENTRY(v7_dma_map_area)
427 add r1, r1, r0
Russell King2ffe2da2009-10-31 16:52:16 +0000428 teq r2, #DMA_FROM_DEVICE
429 beq v7_dma_inv_range
430 b v7_dma_clean_range
Russell Kinga9c91472009-11-26 16:19:58 +0000431ENDPROC(v7_dma_map_area)
432
433/*
434 * dma_unmap_area(start, size, dir)
435 * - start - kernel virtual start address
436 * - size - size of region
437 * - dir - DMA direction
438 */
439ENTRY(v7_dma_unmap_area)
Russell King2ffe2da2009-10-31 16:52:16 +0000440 add r1, r1, r0
441 teq r2, #DMA_TO_DEVICE
442 bne v7_dma_inv_range
Russell King6ebbf2c2014-06-30 16:29:12 +0100443 ret lr
Russell Kinga9c91472009-11-26 16:19:58 +0000444ENDPROC(v7_dma_unmap_area)
445
Catalin Marinasbbe88882007-05-08 22:27:46 +0100446 __INITDATA
447
Dave Martin455a01e2011-06-23 17:16:25 +0100448 @ define struct cpu_cache_fns (see <asm/cacheflush.h> and proc-macros.S)
449 define_cache_functions v7
Florian Fainelli1238c4f2017-12-01 01:10:10 +0100450
451 /* The Broadcom Brahma-B15 read-ahead cache requires some modifications
452 * to the v7_cache_fns, we only override the ones we need
453 */
454#ifndef CONFIG_CACHE_B15_RAC
455 globl_equ b15_flush_kern_cache_all, v7_flush_kern_cache_all
456#endif
457 globl_equ b15_flush_icache_all, v7_flush_icache_all
458 globl_equ b15_flush_kern_cache_louis, v7_flush_kern_cache_louis
459 globl_equ b15_flush_user_cache_all, v7_flush_user_cache_all
460 globl_equ b15_flush_user_cache_range, v7_flush_user_cache_range
461 globl_equ b15_coherent_kern_range, v7_coherent_kern_range
462 globl_equ b15_coherent_user_range, v7_coherent_user_range
463 globl_equ b15_flush_kern_dcache_area, v7_flush_kern_dcache_area
464
465 globl_equ b15_dma_map_area, v7_dma_map_area
466 globl_equ b15_dma_unmap_area, v7_dma_unmap_area
467 globl_equ b15_dma_flush_range, v7_dma_flush_range
468
469 define_cache_functions b15