diff options
author | Thomas Martitz <kugel@rockbox.org> | 2012-01-04 18:07:21 +0100 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2012-01-22 18:46:44 +0100 |
commit | 991ae1e39553172a7dd6cd8c634aebfce892e261 (patch) | |
tree | 672a4583af663def399c4fefdbad060605397fbc /firmware/target/arm | |
parent | eaa83bd64775b87e943d345e2810deed44408776 (diff) | |
download | rockbox-991ae1e39553172a7dd6cd8c634aebfce892e261.tar.gz rockbox-991ae1e39553172a7dd6cd8c634aebfce892e261.zip |
Create fimrware/asm directory for assembly optimized stuff.
This dir is suitable for stuff that doesn't fit the target tree, e.g. because
it also builds on hosted or otherwise. It also has a generic subfolder for
fallback C implementations so that not all archs need to provide asm files.
SOURCES should only contain "foo.c" where foo.c includes the specific
<arch>/foo.c files from the subdirs using the preprocessor. This way automatic
selection of asm versions or generic C verion is possible.
For the start, the thread support files are moved, since ASM threads can
be used on hosted platforms as well. Since core_sleep() remains platform
specific it's moved to the corresponding system.h headers.
Change-Id: Iebff272f3407a6eaafeb7656ceb0ae9eca3f7cb9
Diffstat (limited to 'firmware/target/arm')
-rw-r--r-- | firmware/target/arm/system-arm.h | 27 | ||||
-rw-r--r-- | firmware/target/arm/thread-arm.c | 121 |
2 files changed, 27 insertions, 121 deletions
diff --git a/firmware/target/arm/system-arm.h b/firmware/target/arm/system-arm.h index ffce77a176..719ec82f1b 100644 --- a/firmware/target/arm/system-arm.h +++ b/firmware/target/arm/system-arm.h | |||
@@ -347,4 +347,31 @@ static inline uint32_t swaw32_hw(uint32_t value) | |||
347 | 347 | ||
348 | } | 348 | } |
349 | 349 | ||
350 | #if defined(CPU_TCC780X) || defined(CPU_TCC77X) /* Single core only for now */ \ | ||
351 | || CONFIG_CPU == IMX31L || CONFIG_CPU == DM320 || CONFIG_CPU == AS3525 \ | ||
352 | || CONFIG_CPU == S3C2440 || CONFIG_CPU == S5L8701 || CONFIG_CPU == AS3525v2 \ | ||
353 | || CONFIG_CPU == S5L8702 | ||
354 | /* Use the generic ARMv4/v5/v6 wait for IRQ */ | ||
355 | static inline void core_sleep(void) | ||
356 | { | ||
357 | asm volatile ( | ||
358 | "mcr p15, 0, %0, c7, c0, 4 \n" /* Wait for interrupt */ | ||
359 | #if CONFIG_CPU == IMX31L | ||
360 | "nop\n nop\n nop\n nop\n nop\n" /* Clean out the pipes */ | ||
361 | #endif | ||
362 | : : "r"(0) | ||
363 | ); | ||
364 | enable_irq(); | ||
365 | } | ||
366 | #else | ||
367 | /* Skip this if special code is required and implemented */ | ||
368 | #if !(defined(CPU_PP)) && CONFIG_CPU != RK27XX && CONFIG_CPU != IMX233 | ||
369 | static inline void core_sleep(void) | ||
370 | { | ||
371 | /* TODO: core_sleep not implemented, battery life will be decreased */ | ||
372 | enable_irq(); | ||
373 | } | ||
374 | #endif /* CPU_PP */ | ||
375 | #endif | ||
376 | |||
350 | #endif /* SYSTEM_ARM_H */ | 377 | #endif /* SYSTEM_ARM_H */ |
diff --git a/firmware/target/arm/thread-arm.c b/firmware/target/arm/thread-arm.c deleted file mode 100644 index 88dac2542a..0000000000 --- a/firmware/target/arm/thread-arm.c +++ /dev/null | |||
@@ -1,121 +0,0 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2005 by Thom Johansen | ||
11 | * | ||
12 | * Generic ARM threading support | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or | ||
15 | * modify it under the terms of the GNU General Public License | ||
16 | * as published by the Free Software Foundation; either version 2 | ||
17 | * of the License, or (at your option) any later version. | ||
18 | * | ||
19 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
20 | * KIND, either express or implied. | ||
21 | * | ||
22 | ****************************************************************************/ | ||
23 | |||
24 | /*--------------------------------------------------------------------------- | ||
25 | * Start the thread running and terminate it if it returns | ||
26 | *--------------------------------------------------------------------------- | ||
27 | */ | ||
28 | static void __attribute__((naked)) USED_ATTR start_thread(void) | ||
29 | { | ||
30 | /* r0 = context */ | ||
31 | asm volatile ( | ||
32 | "ldr sp, [r0, #32] \n" /* Load initial sp */ | ||
33 | "ldr r4, [r0, #40] \n" /* start in r4 since it's non-volatile */ | ||
34 | "mov r1, #0 \n" /* Mark thread as running */ | ||
35 | "str r1, [r0, #40] \n" | ||
36 | #if NUM_CORES > 1 | ||
37 | "ldr r0, =commit_discard_idcache \n" /* Invalidate this core's cache. */ | ||
38 | "mov lr, pc \n" /* This could be the first entry into */ | ||
39 | "bx r0 \n" /* plugin or codec code for this core. */ | ||
40 | #endif | ||
41 | "mov lr, pc \n" /* Call thread function */ | ||
42 | "bx r4 \n" | ||
43 | ); /* No clobber list - new thread doesn't care */ | ||
44 | thread_exit(); | ||
45 | #if 0 | ||
46 | asm volatile (".ltorg"); /* Dump constant pool */ | ||
47 | #endif | ||
48 | } | ||
49 | |||
50 | /* For startup, place context pointer in r4 slot, start_thread pointer in r5 | ||
51 | * slot, and thread function pointer in context.start. See load_context for | ||
52 | * what happens when thread is initially going to run. */ | ||
53 | #define THREAD_STARTUP_INIT(core, thread, function) \ | ||
54 | ({ (thread)->context.r[0] = (uint32_t)&(thread)->context, \ | ||
55 | (thread)->context.r[1] = (uint32_t)start_thread, \ | ||
56 | (thread)->context.start = (uint32_t)function; }) | ||
57 | |||
58 | |||
59 | /*--------------------------------------------------------------------------- | ||
60 | * Store non-volatile context. | ||
61 | *--------------------------------------------------------------------------- | ||
62 | */ | ||
63 | static inline void store_context(void* addr) | ||
64 | { | ||
65 | asm volatile( | ||
66 | "stmia %0, { r4-r11, sp, lr } \n" | ||
67 | : : "r" (addr) | ||
68 | ); | ||
69 | } | ||
70 | |||
71 | /*--------------------------------------------------------------------------- | ||
72 | * Load non-volatile context. | ||
73 | *--------------------------------------------------------------------------- | ||
74 | */ | ||
75 | static inline void load_context(const void* addr) | ||
76 | { | ||
77 | asm volatile( | ||
78 | "ldr r0, [%0, #40] \n" /* Load start pointer */ | ||
79 | "cmp r0, #0 \n" /* Check for NULL */ | ||
80 | |||
81 | /* If not already running, jump to start */ | ||
82 | #if ARM_ARCH == 4 && defined(USE_THUMB) | ||
83 | "ldmneia %0, { r0, r12 } \n" | ||
84 | "bxne r12 \n" | ||
85 | #else | ||
86 | "ldmneia %0, { r0, pc } \n" | ||
87 | #endif | ||
88 | |||
89 | "ldmia %0, { r4-r11, sp, lr } \n" /* Load regs r4 to r14 from context */ | ||
90 | : : "r" (addr) : "r0" /* only! */ | ||
91 | ); | ||
92 | } | ||
93 | |||
94 | #if defined(CPU_TCC780X) || defined(CPU_TCC77X) /* Single core only for now */ \ | ||
95 | || CONFIG_CPU == IMX31L || CONFIG_CPU == DM320 || CONFIG_CPU == AS3525 \ | ||
96 | || CONFIG_CPU == S3C2440 || CONFIG_CPU == S5L8701 || CONFIG_CPU == AS3525v2 \ | ||
97 | || CONFIG_CPU == S5L8702 | ||
98 | /* Use the generic ARMv4/v5/v6 wait for IRQ */ | ||
99 | static inline void core_sleep(void) | ||
100 | { | ||
101 | asm volatile ( | ||
102 | "mcr p15, 0, %0, c7, c0, 4 \n" /* Wait for interrupt */ | ||
103 | #if CONFIG_CPU == IMX31L | ||
104 | "nop\n nop\n nop\n nop\n nop\n" /* Clean out the pipes */ | ||
105 | #endif | ||
106 | : : "r"(0) | ||
107 | ); | ||
108 | enable_irq(); | ||
109 | } | ||
110 | #else | ||
111 | /* Skip this if special code is required and implemented */ | ||
112 | #if !(defined(CPU_PP)) && CONFIG_CPU != RK27XX && CONFIG_CPU != IMX233 | ||
113 | static inline void core_sleep(void) | ||
114 | { | ||
115 | /* TODO: core_sleep not implemented, battery life will be decreased */ | ||
116 | enable_irq(); | ||
117 | } | ||
118 | #endif /* CPU_PP */ | ||
119 | #endif | ||
120 | |||
121 | |||