2 * Copyright (c) 2009 Wind River Systems, Inc.
5 * This file is based on and replaces the existing cache.c file
6 * The copyrights for the cache.c file are:
8 * (C) Copyright 2008 Texas Insturments
11 * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
17 * See file CREDITS for list of people who contributed to this
20 * This program is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU General Public License as
22 * published by the Free Software Foundation; either version 2 of
23 * the License, or (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
36 #include <asm/arch/omap3.h>
43 .global invalidate_dcache
44 .global l2_cache_enable
45 .global l2_cache_disable
50 * Invalidate the whole D-cache.
52 * Corrupted registers: r0-r5, r7, r9-r11
54 * - mm - mm_struct describing address space
57 stmfd r13!, {r0 - r5, r7, r9 - r12, r14}
59 mov r7, r0 @ take a backup of device type
60 cmp r0, #0x3 @ check if the device type is
62 moveq r12, #0x1 @ set up to invalide L2
63 smi: .word 0x01600070 @ Call SMI monitor (smieq)
64 cmp r7, #0x3 @ compare again in case its
66 beq finished_inval @ if GP device, inval done
69 mrc p15, 1, r0, c0, c0, 1 @ read clidr
70 ands r3, r0, #0x7000000 @ extract loc from clidr
71 mov r3, r3, lsr #23 @ left align loc bit field
72 beq finished_inval @ if loc is 0, then no need to
74 mov r10, #0 @ start clean at cache level 0
76 add r2, r10, r10, lsr #1 @ work out 3x current cache
78 mov r1, r0, lsr r2 @ extract cache type bits from
80 and r1, r1, #7 @ mask of the bits for current
82 cmp r1, #2 @ see what cache we have at
84 blt skip_inval @ skip if no cache, or just
86 mcr p15, 2, r10, c0, c0, 0 @ select current cache level
88 mov r2, #0 @ operand for mcr SBZ
89 mcr p15, 0, r2, c7, c5, 4 @ flush prefetch buffer to
90 @ sych the new cssr&csidr,
91 @ with armv7 this is 'isb',
92 @ but we compile with armv5
93 mrc p15, 1, r1, c0, c0, 0 @ read the new csidr
94 and r2, r1, #7 @ extract the length of the
96 add r2, r2, #4 @ add 4 (line length offset)
98 ands r4, r4, r1, lsr #3 @ find maximum number on the
100 clz r5, r4 @ find bit position of way
103 ands r7, r7, r1, lsr #13 @ extract max number of the
106 mov r9, r4 @ create working copy of max
109 orr r11, r10, r9, lsl r5 @ factor way and cache number
111 orr r11, r11, r7, lsl r2 @ factor index number into r11
112 mcr p15, 0, r11, c7, c6, 2 @ invalidate by set/way
113 subs r9, r9, #1 @ decrement the way
115 subs r7, r7, #1 @ decrement the index
118 add r10, r10, #2 @ increment cache number
122 mov r10, #0 @ swith back to cache level 0
123 mcr p15, 2, r10, c0, c0, 0 @ select current cache level
125 mcr p15, 0, r10, c7, c5, 4 @ flush prefetch buffer,
126 @ with armv7 this is 'isb',
127 @ but we compile with armv5
129 ldmfd r13!, {r0 - r5, r7, r9 - r12, pc}
133 stmfd r13!, {r0, r1, r2, lr}
134 @ ES2 onwards we can disable/enable L2 ourselves
136 cmp r0, #CPU_3XX_ES20
137 blt l2_cache_disable_EARLIER_THAN_ES2
138 mrc 15, 0, r3, cr1, cr0, 1
140 mcr 15, 0, r3, cr1, cr0, 1
141 b l2_cache_enable_END
142 l2_cache_enable_EARLIER_THAN_ES2:
143 @ Save r0, r12 and restore them after usage
148 @ GP Device ROM code API usage here
149 @ r12 = AUXCR Write function and r0 value
152 mrc 15, 0, r0, cr1, cr0, 1
154 @ SMI instruction to call ROM Code API
160 ldmfd r13!, {r1, r2, r3, pc}
164 stmfd r13!, {r0, r1, r2, lr}
165 @ ES2 onwards we can disable/enable L2 ourselves
167 cmp r0, #CPU_3XX_ES20
168 blt l2_cache_disable_EARLIER_THAN_ES2
169 mrc 15, 0, r3, cr1, cr0, 1
171 mcr 15, 0, r3, cr1, cr0, 1
172 b l2_cache_disable_END
173 l2_cache_disable_EARLIER_THAN_ES2:
174 @ Save r0, r12 and restore them after usage
179 @ GP Device ROM code API usage here
180 @ r12 = AUXCR Write function and r0 value
183 mrc 15, 0, r0, cr1, cr0, 1
185 @ SMI instruction to call ROM Code API
190 l2_cache_disable_END:
191 ldmfd r13!, {r1, r2, r3, pc}