aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/tcm.c
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2011-07-01 03:23:36 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-07-06 15:49:45 -0400
commit201043f227576d42529ddb340746a060a00f57f6 (patch)
tree1380607e723339f4b75936c230813874e2fa338d /arch/arm/kernel/tcm.c
parent9715efb8dc9ffa629bf5a1215b11bf2f2f29908b (diff)
ARM: 6985/1: export functions to determine the presence of I/DTCM
By allowing code to detect whether DTCM or ITCM is present, code paths involving TCM can be avoided when running on platforms that lack it. This is good for creating single kernels across several archs, if some of them utilize TCM but others don't. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm/kernel/tcm.c')
-rw-r--r--arch/arm/kernel/tcm.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/arch/arm/kernel/tcm.c b/arch/arm/kernel/tcm.c
index d402d4829524..30e302d33e0a 100644
--- a/arch/arm/kernel/tcm.c
+++ b/arch/arm/kernel/tcm.c
@@ -19,6 +19,8 @@
19#include "tcm.h" 19#include "tcm.h"
20 20
21static struct gen_pool *tcm_pool; 21static struct gen_pool *tcm_pool;
22static bool dtcm_present;
23static bool itcm_present;
22 24
23/* TCM section definitions from the linker */ 25/* TCM section definitions from the linker */
24extern char __itcm_start, __sitcm_text, __eitcm_text; 26extern char __itcm_start, __sitcm_text, __eitcm_text;
@@ -90,6 +92,18 @@ void tcm_free(void *addr, size_t len)
90} 92}
91EXPORT_SYMBOL(tcm_free); 93EXPORT_SYMBOL(tcm_free);
92 94
95bool tcm_dtcm_present(void)
96{
97 return dtcm_present;
98}
99EXPORT_SYMBOL(tcm_dtcm_present);
100
101bool tcm_itcm_present(void)
102{
103 return itcm_present;
104}
105EXPORT_SYMBOL(tcm_itcm_present);
106
93static int __init setup_tcm_bank(u8 type, u8 bank, u8 banks, 107static int __init setup_tcm_bank(u8 type, u8 bank, u8 banks,
94 u32 *offset) 108 u32 *offset)
95{ 109{
@@ -208,6 +222,7 @@ void __init tcm_init(void)
208 memcpy(start, ram, dtcm_code_sz); 222 memcpy(start, ram, dtcm_code_sz);
209 pr_debug("CPU DTCM: copied data from %p - %p\n", 223 pr_debug("CPU DTCM: copied data from %p - %p\n",
210 start, end); 224 start, end);
225 dtcm_present = true;
211 } else if (dtcm_code_sz) { 226 } else if (dtcm_code_sz) {
212 pr_info("CPU DTCM: %u bytes of code compiled to DTCM but no " 227 pr_info("CPU DTCM: %u bytes of code compiled to DTCM but no "
213 "DTCM banks present in CPU\n", dtcm_code_sz); 228 "DTCM banks present in CPU\n", dtcm_code_sz);
@@ -239,6 +254,7 @@ no_dtcm:
239 memcpy(start, ram, itcm_code_sz); 254 memcpy(start, ram, itcm_code_sz);
240 pr_debug("CPU ITCM: copied code from %p - %p\n", 255 pr_debug("CPU ITCM: copied code from %p - %p\n",
241 start, end); 256 start, end);
257 itcm_present = true;
242 } else if (itcm_code_sz) { 258 } else if (itcm_code_sz) {
243 pr_info("CPU ITCM: %u bytes of code compiled to ITCM but no " 259 pr_info("CPU ITCM: %u bytes of code compiled to ITCM but no "
244 "ITCM banks present in CPU\n", itcm_code_sz); 260 "ITCM banks present in CPU\n", itcm_code_sz);
@@ -252,7 +268,6 @@ no_dtcm:
252 */ 268 */
253static int __init setup_tcm_pool(void) 269static int __init setup_tcm_pool(void)
254{ 270{
255 u32 tcm_status = read_cpuid_tcmstatus();
256 u32 dtcm_pool_start = (u32) &__edtcm_data; 271 u32 dtcm_pool_start = (u32) &__edtcm_data;
257 u32 itcm_pool_start = (u32) &__eitcm_text; 272 u32 itcm_pool_start = (u32) &__eitcm_text;
258 int ret; 273 int ret;
@@ -267,7 +282,7 @@ static int __init setup_tcm_pool(void)
267 pr_debug("Setting up TCM memory pool\n"); 282 pr_debug("Setting up TCM memory pool\n");
268 283
269 /* Add the rest of DTCM to the TCM pool */ 284 /* Add the rest of DTCM to the TCM pool */
270 if (tcm_status & (0x03 << 16)) { 285 if (dtcm_present) {
271 if (dtcm_pool_start < dtcm_end) { 286 if (dtcm_pool_start < dtcm_end) {
272 ret = gen_pool_add(tcm_pool, dtcm_pool_start, 287 ret = gen_pool_add(tcm_pool, dtcm_pool_start,
273 dtcm_end - dtcm_pool_start, -1); 288 dtcm_end - dtcm_pool_start, -1);
@@ -284,7 +299,7 @@ static int __init setup_tcm_pool(void)
284 } 299 }
285 300
286 /* Add the rest of ITCM to the TCM pool */ 301 /* Add the rest of ITCM to the TCM pool */
287 if (tcm_status & 0x03) { 302 if (itcm_present) {
288 if (itcm_pool_start < itcm_end) { 303 if (itcm_pool_start < itcm_end) {
289 ret = gen_pool_add(tcm_pool, itcm_pool_start, 304 ret = gen_pool_add(tcm_pool, itcm_pool_start,
290 itcm_end - itcm_pool_start, -1); 305 itcm_end - itcm_pool_start, -1);