diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2008-04-06 04:34:57 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2008-04-06 04:34:57 +0000 |
commit | 05099149f193cac0c81b0129c17feb78b1a9681a (patch) | |
tree | 3dd5494dd494bcb4490ddcedef99e9f3a895cd3f /firmware/target/arm/sandisk | |
parent | be698f086de4641a45dffd9289671588c2391a3c (diff) | |
download | rockbox-05099149f193cac0c81b0129c17feb78b1a9681a.tar.gz rockbox-05099149f193cac0c81b0129c17feb78b1a9681a.zip |
Enable nocache sections using the linker. PP5022/4 must use SW_CORELOCK now with shared variables in DRAM (it seems swp(b) is at least partially broken on all PP or I'm doing something very wrong here :\). For core-shared data use SHAREDBSS/DATA_ATTR. NOCACHEBSS/DATA_ATTR is available whether or not single core is forced for static peripheral-DMA buffer allocation without use of the UNCACHED_ADDR macro in code and is likely useful on a non-PP target with a data cache (although not actually enabled in config.h and the .lds's in this commit).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16981 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/sandisk')
-rw-r--r-- | firmware/target/arm/sandisk/app.lds | 56 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/ata-c200_e200.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/boot.lds | 2 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-c200/lcd-c200.c | 2 | ||||
-rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | 4 |
5 files changed, 52 insertions, 14 deletions
diff --git a/firmware/target/arm/sandisk/app.lds b/firmware/target/arm/sandisk/app.lds index 765a5f0389..54af494d72 100644 --- a/firmware/target/arm/sandisk/app.lds +++ b/firmware/target/arm/sandisk/app.lds | |||
@@ -21,6 +21,14 @@ INPUT(target/arm/crt0-pp.o) | |||
21 | #define IRAMORIG 0x40000000 | 21 | #define IRAMORIG 0x40000000 |
22 | #define IRAMSIZE 0xc000 | 22 | #define IRAMSIZE 0xc000 |
23 | 23 | ||
24 | #ifdef CPU_PP502x | ||
25 | #define NOCACHE_BASE 0x10000000 | ||
26 | #else | ||
27 | #define NOCACHE_BASE 0x28000000 | ||
28 | #endif | ||
29 | |||
30 | #define CACHEALIGN_SIZE 16 | ||
31 | |||
24 | /* End of the audio buffer, where the codec buffer starts */ | 32 | /* End of the audio buffer, where the codec buffer starts */ |
25 | #define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) | 33 | #define ENDAUDIOADDR (DRAMORIG + DRAMSIZE) |
26 | 34 | ||
@@ -70,6 +78,18 @@ SECTIONS | |||
70 | _dataend = .; | 78 | _dataend = .; |
71 | } > DRAM | 79 | } > DRAM |
72 | 80 | ||
81 | #if NOCACHE_BASE != 0 | ||
82 | /* .ncdata section is placed at uncached physical alias address and is | ||
83 | * loaded at the proper cached virtual address - no copying is | ||
84 | * performed in the init code */ | ||
85 | .ncdata . + NOCACHE_BASE : | ||
86 | { | ||
87 | . = ALIGN(CACHEALIGN_SIZE); | ||
88 | *(.ncdata*) | ||
89 | . = ALIGN(CACHEALIGN_SIZE); | ||
90 | } AT> DRAM | ||
91 | #endif | ||
92 | |||
73 | /DISCARD/ : | 93 | /DISCARD/ : |
74 | { | 94 | { |
75 | *(.eh_frame) | 95 | *(.eh_frame) |
@@ -103,7 +123,7 @@ SECTIONS | |||
103 | _iend = .; | 123 | _iend = .; |
104 | } > IRAM | 124 | } > IRAM |
105 | 125 | ||
106 | .idle_stacks : | 126 | .idle_stacks (NOLOAD) : |
107 | { | 127 | { |
108 | *(.idle_stacks) | 128 | *(.idle_stacks) |
109 | #if NUM_CORES > 1 | 129 | #if NUM_CORES > 1 |
@@ -116,7 +136,7 @@ SECTIONS | |||
116 | cop_idlestackend = .; | 136 | cop_idlestackend = .; |
117 | } > IRAM | 137 | } > IRAM |
118 | 138 | ||
119 | .stack : | 139 | .stack (NOLOAD) : |
120 | { | 140 | { |
121 | *(.stack) | 141 | *(.stack) |
122 | stackbegin = .; | 142 | stackbegin = .; |
@@ -124,37 +144,53 @@ SECTIONS | |||
124 | stackend = .; | 144 | stackend = .; |
125 | } > IRAM | 145 | } > IRAM |
126 | 146 | ||
127 | .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.iram) + SIZEOF(.vectors): | 147 | /* .bss and .ncbss are treated as a single section to use one init loop to |
148 | * zero it - note "_edata" and "_end" */ | ||
149 | .bss ADDR(.data) + SIZEOF(.data) + SIZEOF(.ncdata) +\ | ||
150 | SIZEOF(.iram) + SIZEOF(.vectors) (NOLOAD) : | ||
128 | { | 151 | { |
129 | _edata = .; | 152 | _edata = .; |
130 | *(.bss*) | 153 | *(.bss*) |
131 | *(COMMON) | 154 | *(COMMON) |
132 | . = ALIGN(0x4); | 155 | . = ALIGN(0x4); |
133 | _end = .; | ||
134 | } > DRAM | 156 | } > DRAM |
135 | 157 | ||
136 | .audiobuf ALIGN(4) : | 158 | #if NOCACHE_BASE != 0 |
159 | .ncbss . + NOCACHE_BASE (NOLOAD): | ||
160 | { | ||
161 | . = ALIGN(CACHEALIGN_SIZE); | ||
162 | *(.ncbss*) | ||
163 | . = ALIGN(CACHEALIGN_SIZE); | ||
164 | } AT> DRAM | ||
165 | #endif | ||
166 | |||
167 | /* This will be aligned by preceding alignments */ | ||
168 | .endaddr . - NOCACHE_BASE (NOLOAD) : | ||
169 | { | ||
170 | _end = .; | ||
171 | } > DRAM | ||
172 | |||
173 | .audiobuf (NOLOAD) : | ||
137 | { | 174 | { |
138 | _audiobuffer = .; | 175 | _audiobuffer = .; |
139 | audiobuffer = .; | 176 | audiobuffer = .; |
140 | } > DRAM | 177 | } > DRAM |
141 | 178 | ||
142 | .audiobufend ENDAUDIOADDR: | 179 | .audiobufend ENDAUDIOADDR (NOLOAD) : |
143 | { | 180 | { |
144 | audiobufend = .; | 181 | audiobufend = .; |
145 | _audiobufend = .; | 182 | _audiobufend = .; |
146 | } > DRAM | 183 | } > DRAM |
147 | 184 | ||
148 | .codec ENDAUDIOADDR: | 185 | .codec ENDAUDIOADDR (NOLOAD) : |
149 | { | 186 | { |
150 | codecbuf = .; | 187 | codecbuf = .; |
151 | _codecbuf = .; | 188 | _codecbuf = .; |
152 | } | 189 | } |
153 | 190 | ||
154 | .plugin ENDADDR: | 191 | .plugin ENDADDR (NOLOAD) : |
155 | { | 192 | { |
156 | _pluginbuf = .; | 193 | _pluginbuf = .; |
157 | pluginbuf = .; | 194 | pluginbuf = .; |
158 | } | 195 | } |
159 | } | 196 | } |
160 | |||
diff --git a/firmware/target/arm/sandisk/ata-c200_e200.c b/firmware/target/arm/sandisk/ata-c200_e200.c index 747cb17ca1..e4a5388978 100644 --- a/firmware/target/arm/sandisk/ata-c200_e200.c +++ b/firmware/target/arm/sandisk/ata-c200_e200.c | |||
@@ -165,7 +165,7 @@ static struct sd_card_status sd_status[NUM_VOLUMES] = | |||
165 | /* Shoot for around 75% usage */ | 165 | /* Shoot for around 75% usage */ |
166 | static long sd_stack [(DEFAULT_STACK_SIZE*2 + 0x1c0)/sizeof(long)]; | 166 | static long sd_stack [(DEFAULT_STACK_SIZE*2 + 0x1c0)/sizeof(long)]; |
167 | static const char sd_thread_name[] = "ata/sd"; | 167 | static const char sd_thread_name[] = "ata/sd"; |
168 | static struct mutex sd_mtx NOCACHEBSS_ATTR; | 168 | static struct mutex sd_mtx SHAREDBSS_ATTR; |
169 | static struct event_queue sd_queue; | 169 | static struct event_queue sd_queue; |
170 | 170 | ||
171 | /* Posted when card plugged status has changed */ | 171 | /* Posted when card plugged status has changed */ |
diff --git a/firmware/target/arm/sandisk/boot.lds b/firmware/target/arm/sandisk/boot.lds index a087a7250d..1c1066895f 100644 --- a/firmware/target/arm/sandisk/boot.lds +++ b/firmware/target/arm/sandisk/boot.lds | |||
@@ -30,6 +30,7 @@ SECTIONS | |||
30 | *(.irodata) | 30 | *(.irodata) |
31 | *(.idata) | 31 | *(.idata) |
32 | *(.data*) | 32 | *(.data*) |
33 | *(.ncdata*) | ||
33 | _dataend = . ; | 34 | _dataend = . ; |
34 | } | 35 | } |
35 | 36 | ||
@@ -51,6 +52,7 @@ SECTIONS | |||
51 | _edata = .; | 52 | _edata = .; |
52 | *(.bss*); | 53 | *(.bss*); |
53 | *(.ibss); | 54 | *(.ibss); |
55 | *(.ncbss*); | ||
54 | _end = .; | 56 | _end = .; |
55 | } | 57 | } |
56 | } | 58 | } |
diff --git a/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c index a629739d50..a2110f7e66 100644 --- a/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c +++ b/firmware/target/arm/sandisk/sansa-c200/lcd-c200.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include "system.h" | 23 | #include "system.h" |
24 | 24 | ||
25 | /* Display status */ | 25 | /* Display status */ |
26 | static unsigned lcd_yuv_options NOCACHEBSS_ATTR = 0; | 26 | static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; |
27 | 27 | ||
28 | /* LCD command set for Samsung S6B33B2 */ | 28 | /* LCD command set for Samsung S6B33B2 */ |
29 | 29 | ||
diff --git a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c index f2689eabbf..15263b5533 100644 --- a/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/lcd-e200.c | |||
@@ -28,8 +28,8 @@ | |||
28 | 28 | ||
29 | /* Power and display status */ | 29 | /* Power and display status */ |
30 | static bool power_on = false; /* Is the power turned on? */ | 30 | static bool power_on = false; /* Is the power turned on? */ |
31 | static bool display_on NOCACHEBSS_ATTR = false; /* Is the display turned on? */ | 31 | static bool display_on SHAREDBSS_ATTR = false; /* Is the display turned on? */ |
32 | static unsigned lcd_yuv_options NOCACHEBSS_ATTR = 0; | 32 | static unsigned lcd_yuv_options SHAREDBSS_ATTR = 0; |
33 | 33 | ||
34 | /* Reverse Flag */ | 34 | /* Reverse Flag */ |
35 | #define R_DISP_CONTROL_NORMAL 0x0004 | 35 | #define R_DISP_CONTROL_NORMAL 0x0004 |