summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCástor Muñoz <cmvidal@gmail.com>2017-01-13 20:51:07 +0100
committerFranklin Wei <git@fwei.tk>2018-07-30 18:50:27 -0400
commit744274220833e017f3cc3f1b61abd0fc7c3885ec (patch)
tree7b6fcdd7bc9e53bee6f62ed683ddf1db4c0c13ad
parent8f38f85fbde2ae78ba50cf9b9f54fbf9d25b4a45 (diff)
downloadrockbox-744274220833e017f3cc3f1b61abd0fc7c3885ec.tar.gz
rockbox-744274220833e017f3cc3f1b61abd0fc7c3885ec.zip
iPod Classic: disable IRAM1
On Classic, IRAM1 (second 128Kb of a total of 256KB available IRAM) is slower than DRAM. Codecs that actually are using regions of IRAM1 runs faster when DRAM is used, so IRAM1 is disabled and only IRAM0 remains enabled: 48KB for core and 80KB for codecs/plugins. The next test_codec results shows how decode time is decreased: file boosted unboosted *.ra ~1.5% ~0.5% *.mpc ~21% ~4.5% *.ogg ~0.5% ~0% nero_he*.m4a ~8% ~1% nero*.m4a ~25% ~7% wmapro*.wma ~4.5% ~0% wma*.wma ~25% ~7% In addition there is a small power save when IRAM1 HW is disabled. Change-Id: I102adee11458e82037f23076d5d5956e23235de8
-rw-r--r--apps/plugins/plugin.lds5
-rw-r--r--firmware/target/arm/s5l8702/app.lds2
-rw-r--r--firmware/target/arm/s5l8702/pcm-s5l8702.c2
-rw-r--r--firmware/target/arm/s5l8702/system-s5l8702.c3
-rw-r--r--lib/rbcodec/codecs/libcook/cook.h7
-rw-r--r--lib/rbcodec/codecs/libfaad/common.h4
-rw-r--r--lib/rbcodec/codecs/libffmpegFLAC/bitstream.h5
-rw-r--r--lib/rbcodec/codecs/libmusepack/mpcdec.h4
-rw-r--r--lib/rbcodec/codecs/libspc/spc_codec.h4
-rw-r--r--lib/rbcodec/codecs/libwma/wmadec.h5
-rw-r--r--lib/rbcodec/codecs/libwmapro/wmaprodec.h4
11 files changed, 25 insertions, 20 deletions
diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds
index aea44e7d40..7037496be4 100644
--- a/apps/plugins/plugin.lds
+++ b/apps/plugins/plugin.lds
@@ -159,9 +159,10 @@ OUTPUT_FORMAT(elf32-littlemips)
159 159
160#elif CONFIG_CPU==S5L8702 160#elif CONFIG_CPU==S5L8702
161/* S5L8702 have 256KB of IRAM */ 161/* S5L8702 have 256KB of IRAM */
162/* IRAM1 (2nd 128KB block) is not used because it is slower than DRAM */
162#define DRAMORIG 0x08000000 163#define DRAMORIG 0x08000000
163#define IRAMORIG (0x00000000 + (56*1024)) 164#define IRAMORIG (0x00000000 + (48*1024))
164#define IRAMSIZE (200*1024) 165#define IRAMSIZE (80*1024)
165 166
166#elif CONFIG_CPU == JZ4732 || CONFIG_CPU == JZ4760B 167#elif CONFIG_CPU == JZ4732 || CONFIG_CPU == JZ4760B
167#undef STUBOFFSET 168#undef STUBOFFSET
diff --git a/firmware/target/arm/s5l8702/app.lds b/firmware/target/arm/s5l8702/app.lds
index 60ecdc6738..fceb732e4f 100644
--- a/firmware/target/arm/s5l8702/app.lds
+++ b/firmware/target/arm/s5l8702/app.lds
@@ -19,7 +19,7 @@ STARTUP(target/arm/s5l8702/crt0.o)
19 19
20#define DRAMSIZE (DRAM_SIZE - PLUGINSIZE - CODECSIZE - TTB_SIZE) 20#define DRAMSIZE (DRAM_SIZE - PLUGINSIZE - CODECSIZE - TTB_SIZE)
21#define CODECORIG (ENDAUDIOADDR) 21#define CODECORIG (ENDAUDIOADDR)
22#define IRAMSIZE (56*1024) /* 256KB total - 56KB for core, 200KB for codecs */ 22#define IRAMSIZE (48*1024) /* 256KB total - 48KB for core, 200KB for codecs */
23 23
24/* Where the codec buffer ends, and the plugin buffer starts */ 24/* Where the codec buffer ends, and the plugin buffer starts */
25#define ENDADDR (ENDAUDIOADDR + CODECSIZE) 25#define ENDADDR (ENDAUDIOADDR + CODECSIZE)
diff --git a/firmware/target/arm/s5l8702/pcm-s5l8702.c b/firmware/target/arm/s5l8702/pcm-s5l8702.c
index e053b309b7..86a0edd54a 100644
--- a/firmware/target/arm/s5l8702/pcm-s5l8702.c
+++ b/firmware/target/arm/s5l8702/pcm-s5l8702.c
@@ -207,7 +207,6 @@ void pcm_dma_apply_settings(void)
207 207
208void pcm_play_dma_init(void) 208void pcm_play_dma_init(void)
209{ 209{
210 PWRCON(0) &= ~(1 << 4);
211 PWRCON(1) &= ~(1 << 7); 210 PWRCON(1) &= ~(1 << 7);
212 211
213 dmac_ch_init(&dma_play_ch, &dma_play_ch_cfg); 212 dmac_ch_init(&dma_play_ch, &dma_play_ch_cfg);
@@ -406,7 +405,6 @@ void pcm_rec_dma_init(void)
406 if (pcm_rec_initialized) 405 if (pcm_rec_initialized)
407 return; 406 return;
408 407
409 PWRCON(0) &= ~(1 << 4);
410 PWRCON(1) &= ~(1 << 7); 408 PWRCON(1) &= ~(1 << 7);
411 409
412 dmac_ch_init(&dma_rec_ch, &dma_rec_ch_cfg); 410 dmac_ch_init(&dma_rec_ch, &dma_rec_ch_cfg);
diff --git a/firmware/target/arm/s5l8702/system-s5l8702.c b/firmware/target/arm/s5l8702/system-s5l8702.c
index 459f4c36c6..9257aff85a 100644
--- a/firmware/target/arm/s5l8702/system-s5l8702.c
+++ b/firmware/target/arm/s5l8702/system-s5l8702.c
@@ -199,6 +199,9 @@ enum {
199 199
200void system_init(void) 200void system_init(void)
201{ 201{
202 /* disable IRAM1 (not used because it is slower than DRAM) */
203 clockgate_enable(CLOCKGATE_SM1, false);
204
202 clocking_init(clk_modes, 0); 205 clocking_init(clk_modes, 0);
203#ifndef BOOTLOADER 206#ifndef BOOTLOADER
204 gpio_preinit(); 207 gpio_preinit();
diff --git a/lib/rbcodec/codecs/libcook/cook.h b/lib/rbcodec/codecs/libcook/cook.h
index fcb437a0e1..c2a5357c98 100644
--- a/lib/rbcodec/codecs/libcook/cook.h
+++ b/lib/rbcodec/codecs/libcook/cook.h
@@ -29,15 +29,16 @@
29 29
30#include "codeclib.h" 30#include "codeclib.h"
31 31
32#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250) 32#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || \
33/* PP5022/24, MCF5250 have large IRAM */ 33 (CONFIG_CPU == MCF5250) || (CONFIG_CPU == S5L8702)
34/* PP5022/24, S5L8702, MCF5250 have large IRAM */
34#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR 35#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR
35#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR 36#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR
36#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR 37#define ICONST_ATTR_COOK_LARGE_IRAM ICONST_ATTR
37#define IBSS_ATTR_COOK_VLCBUF 38#define IBSS_ATTR_COOK_VLCBUF
38#define ICODE_ATTR_COOK_DECODE 39#define ICODE_ATTR_COOK_DECODE
39 40
40#elif defined(CPU_S5L870X) 41#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
41/* S5L870X have even larger IRAM and it is faster to use ICODE_ATTR. */ 42/* S5L870X have even larger IRAM and it is faster to use ICODE_ATTR. */
42#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR 43#define IBSS_ATTR_COOK_LARGE_IRAM IBSS_ATTR
43#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR 44#define ICODE_ATTR_COOK_LARGE_IRAM ICODE_ATTR
diff --git a/lib/rbcodec/codecs/libfaad/common.h b/lib/rbcodec/codecs/libfaad/common.h
index 720042b4aa..c5eaa0aa51 100644
--- a/lib/rbcodec/codecs/libfaad/common.h
+++ b/lib/rbcodec/codecs/libfaad/common.h
@@ -58,14 +58,14 @@ extern struct codec_api* ci;
58#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR 58#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR
59#define IBSS_ATTR_FAAD_XLR 59#define IBSS_ATTR_FAAD_XLR
60 60
61#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) 61#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == S5L8702)
62/* Enough IRAM to move additional data and code to it. */ 62/* Enough IRAM to move additional data and code to it. */
63#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR 63#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR
64#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR 64#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR
65#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR 65#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR
66#define IBSS_ATTR_FAAD_XLR 66#define IBSS_ATTR_FAAD_XLR
67 67
68#elif defined(CPU_S5L870X) 68#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
69/* Very large IRAM. Move even more data to it. */ 69/* Very large IRAM. Move even more data to it. */
70#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR 70#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR
71#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR 71#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR
diff --git a/lib/rbcodec/codecs/libffmpegFLAC/bitstream.h b/lib/rbcodec/codecs/libffmpegFLAC/bitstream.h
index 2ec54c42fa..cd9589de40 100644
--- a/lib/rbcodec/codecs/libffmpegFLAC/bitstream.h
+++ b/lib/rbcodec/codecs/libffmpegFLAC/bitstream.h
@@ -18,14 +18,15 @@
18 #define ICODE_ATTR 18 #define ICODE_ATTR
19#endif 19#endif
20 20
21#if (CONFIG_CPU == MCF5250) || (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) 21#if (CONFIG_CPU == MCF5250) || (CONFIG_CPU == PP5022) || \
22 (CONFIG_CPU == PP5024) || (CONFIG_CPU == S5L8702)
22#define ICODE_ATTR_FLAC ICODE_ATTR 23#define ICODE_ATTR_FLAC ICODE_ATTR
23#define IBSS_ATTR_FLAC IBSS_ATTR 24#define IBSS_ATTR_FLAC IBSS_ATTR
24/* Enough IRAM to move additional data to it. */ 25/* Enough IRAM to move additional data to it. */
25#define IBSS_ATTR_FLAC_LARGE_IRAM IBSS_ATTR 26#define IBSS_ATTR_FLAC_LARGE_IRAM IBSS_ATTR
26#define IBSS_ATTR_FLAC_XLARGE_IRAM 27#define IBSS_ATTR_FLAC_XLARGE_IRAM
27 28
28#elif defined(CPU_S5L870X) 29#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
29#define ICODE_ATTR_FLAC ICODE_ATTR 30#define ICODE_ATTR_FLAC ICODE_ATTR
30#define IBSS_ATTR_FLAC IBSS_ATTR 31#define IBSS_ATTR_FLAC IBSS_ATTR
31/* Enough IRAM to move even more additional data to it. */ 32/* Enough IRAM to move even more additional data to it. */
diff --git a/lib/rbcodec/codecs/libmusepack/mpcdec.h b/lib/rbcodec/codecs/libmusepack/mpcdec.h
index 02003cb01b..24c06bc4a0 100644
--- a/lib/rbcodec/codecs/libmusepack/mpcdec.h
+++ b/lib/rbcodec/codecs/libmusepack/mpcdec.h
@@ -58,7 +58,7 @@ extern "C" {
58/* Keep the data arrays of bitsreadr.c in IRAM. */ 58/* Keep the data arrays of bitsreadr.c in IRAM. */
59#define ICONST_ATTR_MPC_BITSREADER ICONST_ATTR 59#define ICONST_ATTR_MPC_BITSREADER ICONST_ATTR
60 60
61#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) 61#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == S5L8702)
62/* Enough IRAM to move additional data and code to it. */ 62/* Enough IRAM to move additional data and code to it. */
63#define IBSS_ATTR_MPC_LARGE_IRAM IBSS_ATTR 63#define IBSS_ATTR_MPC_LARGE_IRAM IBSS_ATTR
64#define ICODE_ATTR_MPC_LARGE_IRAM ICODE_ATTR 64#define ICODE_ATTR_MPC_LARGE_IRAM ICODE_ATTR
@@ -70,7 +70,7 @@ extern "C" {
70 * sv7/sv8 bitstream demuxing into IRAM. This config is faster. */ 70 * sv7/sv8 bitstream demuxing into IRAM. This config is faster. */
71#define ICONST_ATTR_MPC_BITSREADER 71#define ICONST_ATTR_MPC_BITSREADER
72 72
73#elif defined(CPU_S5L870X) 73#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
74/* Enough IRAM to move additional data and code to it. */ 74/* Enough IRAM to move additional data and code to it. */
75#define IBSS_ATTR_MPC_LARGE_IRAM IBSS_ATTR 75#define IBSS_ATTR_MPC_LARGE_IRAM IBSS_ATTR
76#define ICODE_ATTR_MPC_LARGE_IRAM ICODE_ATTR 76#define ICODE_ATTR_MPC_LARGE_IRAM ICODE_ATTR
diff --git a/lib/rbcodec/codecs/libspc/spc_codec.h b/lib/rbcodec/codecs/libspc/spc_codec.h
index 446690f726..75c344474e 100644
--- a/lib/rbcodec/codecs/libspc/spc_codec.h
+++ b/lib/rbcodec/codecs/libspc/spc_codec.h
@@ -95,7 +95,7 @@
95/* Not enough IRAM available to move further data to it. */ 95/* Not enough IRAM available to move further data to it. */
96#define IBSS_ATTR_SPC_LARGE_IRAM 96#define IBSS_ATTR_SPC_LARGE_IRAM
97 97
98#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) 98#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == S5L8702)
99#define IBSS_ATTR_SPC IBSS_ATTR 99#define IBSS_ATTR_SPC IBSS_ATTR
100#define ICODE_ATTR_SPC ICODE_ATTR 100#define ICODE_ATTR_SPC ICODE_ATTR
101#define ICONST_ATTR_SPC ICONST_ATTR 101#define ICONST_ATTR_SPC ICONST_ATTR
@@ -103,7 +103,7 @@
103/* Not enough IRAM available to move further data to it. */ 103/* Not enough IRAM available to move further data to it. */
104#define IBSS_ATTR_SPC_LARGE_IRAM 104#define IBSS_ATTR_SPC_LARGE_IRAM
105 105
106#elif defined(CPU_S5L870X) 106#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
107#define IBSS_ATTR_SPC IBSS_ATTR 107#define IBSS_ATTR_SPC IBSS_ATTR
108#define ICODE_ATTR_SPC ICODE_ATTR 108#define ICODE_ATTR_SPC ICODE_ATTR
109#define ICONST_ATTR_SPC ICONST_ATTR 109#define ICONST_ATTR_SPC ICONST_ATTR
diff --git a/lib/rbcodec/codecs/libwma/wmadec.h b/lib/rbcodec/codecs/libwma/wmadec.h
index 76429dede1..b3bca4f452 100644
--- a/lib/rbcodec/codecs/libwma/wmadec.h
+++ b/lib/rbcodec/codecs/libwma/wmadec.h
@@ -52,13 +52,14 @@
52#define LSP_POW_BITS 7 52#define LSP_POW_BITS 7
53 53
54 54
55#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == MCF5250) 55#if (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || \
56 (CONFIG_CPU == MCF5250) || (CONFIG_CPU == S5L8702)
56/* PP5022/24 and MCF5250 have 128KB of IRAM. 80KB are allocated for codecs */ 57/* PP5022/24 and MCF5250 have 128KB of IRAM. 80KB are allocated for codecs */
57#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR 58#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR
58#define IBSS_ATTR_WMA_XL_IRAM 59#define IBSS_ATTR_WMA_XL_IRAM
59#define ICONST_ATTR_WMA_XL_IRAM 60#define ICONST_ATTR_WMA_XL_IRAM
60 61
61#elif defined(CPU_S5L870X) 62#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
62/* S5L870x has even more IRAM. Use it. */ 63/* S5L870x has even more IRAM. Use it. */
63#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR 64#define IBSS_ATTR_WMA_LARGE_IRAM IBSS_ATTR
64#define IBSS_ATTR_WMA_XL_IRAM IBSS_ATTR 65#define IBSS_ATTR_WMA_XL_IRAM IBSS_ATTR
diff --git a/lib/rbcodec/codecs/libwmapro/wmaprodec.h b/lib/rbcodec/codecs/libwmapro/wmaprodec.h
index d8398fc9f1..46b4770f46 100644
--- a/lib/rbcodec/codecs/libwmapro/wmaprodec.h
+++ b/lib/rbcodec/codecs/libwmapro/wmaprodec.h
@@ -10,7 +10,7 @@
10#define IBSS_ATTR_WMAPRO_VLC_TABLES 10#define IBSS_ATTR_WMAPRO_VLC_TABLES
11#define ICONST_ATTR_WMAPRO_WIN_VS_TMP 11#define ICONST_ATTR_WMAPRO_WIN_VS_TMP
12 12
13#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) 13#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024) || (CONFIG_CPU == S5L8702)
14/* Enough IRAM to move additional data and code to it. */ 14/* Enough IRAM to move additional data and code to it. */
15#define IBSS_ATTR_WMAPRO_LARGE_IRAM IBSS_ATTR 15#define IBSS_ATTR_WMAPRO_LARGE_IRAM IBSS_ATTR
16#define ICODE_ATTR_WMAPRO_LARGE_IRAM ICODE_ATTR 16#define ICODE_ATTR_WMAPRO_LARGE_IRAM ICODE_ATTR
@@ -18,7 +18,7 @@
18#define IBSS_ATTR_WMAPRO_VLC_TABLES 18#define IBSS_ATTR_WMAPRO_VLC_TABLES
19#define ICONST_ATTR_WMAPRO_WIN_VS_TMP 19#define ICONST_ATTR_WMAPRO_WIN_VS_TMP
20 20
21#elif defined(CPU_S5L870X) 21#elif (CONFIG_CPU == S5L8700) || (CONFIG_CPU == S5L8701)
22/* Enough IRAM to move additional data and code to it. */ 22/* Enough IRAM to move additional data and code to it. */
23#define IBSS_ATTR_WMAPRO_LARGE_IRAM IBSS_ATTR 23#define IBSS_ATTR_WMAPRO_LARGE_IRAM IBSS_ATTR
24#define ICODE_ATTR_WMAPRO_LARGE_IRAM ICODE_ATTR 24#define ICODE_ATTR_WMAPRO_LARGE_IRAM ICODE_ATTR