diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2009-02-10 11:34:15 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2009-02-10 11:34:15 +0000 |
commit | e1e810183701218be753ce70d131b48255478acf (patch) | |
tree | c44f9de4f7f4c031a4cf6454e841b54993323cf9 | |
parent | ca07873607bbba7c8adff6d786b6b88f14ef7650 (diff) | |
download | rockbox-e1e810183701218be753ce70d131b48255478acf.tar.gz rockbox-e1e810183701218be753ce70d131b48255478acf.zip |
Gigabeat S: Place SDMA code load address starting in uninitialized section address and copy it to the plugin buffer since it only needed very early in initialization. Will save about 6K in RAM.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19963 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | firmware/target/arm/imx31/app.lds | 24 | ||||
-rw-r--r-- | firmware/target/arm/imx31/crt0.S | 20 | ||||
-rw-r--r-- | firmware/target/arm/imx31/sdma_script_code.h | 6 |
3 files changed, 41 insertions, 9 deletions
diff --git a/firmware/target/arm/imx31/app.lds b/firmware/target/arm/imx31/app.lds index 4ab4665062..4ee7ac45d4 100644 --- a/firmware/target/arm/imx31/app.lds +++ b/firmware/target/arm/imx31/app.lds | |||
@@ -91,16 +91,18 @@ SECTIONS | |||
91 | } AT> DRAM | 91 | } AT> DRAM |
92 | 92 | ||
93 | _vectorscopy = LOADADDR(.vectors); | 93 | _vectorscopy = LOADADDR(.vectors); |
94 | 94 | ||
95 | .stack : | 95 | .stack (NOLOAD) : |
96 | { | 96 | { |
97 | *(.stack) | 97 | *(.stack) |
98 | stackbegin = .; | 98 | stackbegin = .; |
99 | . += 0x2000; | 99 | . += 0x2000; |
100 | stackend = .; | 100 | stackend = .; |
101 | } > DRAM | 101 | } > DRAM |
102 | |||
103 | _sdmacodecopy = stackbegin; | ||
102 | 104 | ||
103 | .bss : | 105 | .bss (NOLOAD) : |
104 | { | 106 | { |
105 | _edata = .; | 107 | _edata = .; |
106 | *(.bss*) | 108 | *(.bss*) |
@@ -110,30 +112,38 @@ SECTIONS | |||
110 | _end = .; | 112 | _end = .; |
111 | } > DRAM | 113 | } > DRAM |
112 | 114 | ||
113 | .audiobuf ALIGN(4) : | 115 | .audiobuf (NOLOAD) : |
114 | { | 116 | { |
117 | . = ALIGN(0x4); | ||
115 | _audiobuffer = .; | 118 | _audiobuffer = .; |
116 | audiobuffer = .; | 119 | audiobuffer = .; |
117 | } > DRAM | 120 | } > DRAM |
118 | 121 | ||
119 | .audiobufend ENDAUDIOADDR: | 122 | .audiobufend ENDAUDIOADDR (NOLOAD) : |
120 | { | 123 | { |
121 | audiobufend = .; | 124 | audiobufend = .; |
122 | _audiobufend = .; | 125 | _audiobufend = .; |
123 | } > DRAM | 126 | } > DRAM |
124 | 127 | ||
125 | .codec ENDAUDIOADDR: | 128 | .codec ENDAUDIOADDR (NOLOAD) : |
126 | { | 129 | { |
127 | codecbuf = .; | 130 | codecbuf = .; |
128 | _codecbuf = .; | 131 | _codecbuf = .; |
129 | } | 132 | } |
130 | 133 | ||
131 | .plugin ENDADDR: | 134 | .plugin ENDADDR (NOLOAD) : |
132 | { | 135 | { |
133 | _pluginbuf = .; | 136 | _pluginbuf = .; |
134 | pluginbuf = .; | 137 | pluginbuf = .; |
135 | } | 138 | } |
136 | 139 | ||
140 | .sdma _pluginbuf : AT( _sdmacodecopy ) | ||
141 | { | ||
142 | _sdmacodestart = .; | ||
143 | *(.sdmacode); | ||
144 | _sdmacodeend = .; | ||
145 | } | ||
146 | |||
137 | .devbss (NOLOAD) : | 147 | .devbss (NOLOAD) : |
138 | { | 148 | { |
139 | _devbssdata = .; | 149 | _devbssdata = .; |
diff --git a/firmware/target/arm/imx31/crt0.S b/firmware/target/arm/imx31/crt0.S index 8459753f87..d51de7215a 100644 --- a/firmware/target/arm/imx31/crt0.S +++ b/firmware/target/arm/imx31/crt0.S | |||
@@ -231,6 +231,26 @@ remap_end: | |||
231 | bhi 1b | 231 | bhi 1b |
232 | #endif /* BOOTLOADER */ | 232 | #endif /* BOOTLOADER */ |
233 | 233 | ||
234 | #ifndef BOOTLOADER | ||
235 | /* Copy discardable SDMA code - loaded in the stack section | ||
236 | * and so must be done first. Destination is the plugin buffer | ||
237 | * which is safe when SDMA init takes place just after kernel | ||
238 | * init. */ | ||
239 | ldr r4, =_sdmacodecopy | ||
240 | ldr r3, =_sdmacodeend | ||
241 | ldr r2, =_sdmacodestart | ||
242 | 1: | ||
243 | cmp r3, r2 | ||
244 | ldrhi r5, [r4], #4 | ||
245 | strhi r5, [r2], #4 | ||
246 | bhi 1b | ||
247 | |||
248 | /* Make buffer coherent */ | ||
249 | ldr r0, =_sdmacodestart | ||
250 | sub r1, r3, r0 | ||
251 | bl clean_dcache_range | ||
252 | #endif /* BOOTLOADER */ | ||
253 | |||
234 | /* Initialise bss section to zero */ | 254 | /* Initialise bss section to zero */ |
235 | ldr r2, =_edata | 255 | ldr r2, =_edata |
236 | ldr r3, =_end | 256 | ldr r3, =_end |
diff --git a/firmware/target/arm/imx31/sdma_script_code.h b/firmware/target/arm/imx31/sdma_script_code.h index b80c39534b..1e75267a76 100644 --- a/firmware/target/arm/imx31/sdma_script_code.h +++ b/firmware/target/arm/imx31/sdma_script_code.h | |||
@@ -356,7 +356,8 @@ | |||
356 | /*! | 356 | /*! |
357 | * Code download for i.MX system revision = 1.0 | 357 | * Code download for i.MX system revision = 1.0 |
358 | */ | 358 | */ |
359 | static __attribute__((aligned(4))) const short sdma_code_1[RAM_CODE_SIZE_1] = | 359 | static __attribute__((aligned(4), section(".sdmacode"))) |
360 | const short sdma_code_1[RAM_CODE_SIZE_1] = | ||
360 | { | 361 | { |
361 | 0xc0ec, 0x7d59, 0x0970, 0x0111, 0x5111, 0x5ad1, 0x5bd9, 0xc0fe, | 362 | 0xc0ec, 0x7d59, 0x0970, 0x0111, 0x5111, 0x5ad1, 0x5bd9, 0xc0fe, |
362 | 0x5ce1, 0x7d02, 0x0200, 0x9806, 0x08ff, 0x0011, 0x28ff, 0x00bc, | 363 | 0x5ce1, 0x7d02, 0x0200, 0x9806, 0x08ff, 0x0011, 0x28ff, 0x00bc, |
@@ -851,7 +852,8 @@ static __attribute__((aligned(4))) const short sdma_code_1[RAM_CODE_SIZE_1] = | |||
851 | /*! | 852 | /*! |
852 | * Code download for i.MX system revision > 1.0 | 853 | * Code download for i.MX system revision > 1.0 |
853 | */ | 854 | */ |
854 | static __attribute__((aligned(4))) const short sdma_code_2[RAM_CODE_SIZE_2] = | 855 | static __attribute__((aligned(4), section(".sdmacode"))) |
856 | const short sdma_code_2[RAM_CODE_SIZE_2] = | ||
855 | { | 857 | { |
856 | 0x0870, 0x0011, 0x5010, 0xc0ec, 0x7d61, 0x5ac0, 0x5bc8, 0x5ef8, | 858 | 0x0870, 0x0011, 0x5010, 0xc0ec, 0x7d61, 0x5ac0, 0x5bc8, 0x5ef8, |
857 | 0xc0fe, 0x56f8, 0x7d02, 0x0200, 0x9806, 0x6ec3, 0x6d07, 0x5df0, | 859 | 0xc0fe, 0x56f8, 0x7d02, 0x0200, 0x9806, 0x6ec3, 0x6d07, 0x5df0, |