diff options
author | Dirk Behme <dirk.behme@de.bosch.com> | 2013-04-26 04:13:56 -0400 |
---|---|---|
committer | Shawn Guo <shawn.guo@linaro.org> | 2013-06-17 03:45:09 -0400 |
commit | b3a9c315378ff811bf34393f2f0a6e8b9ffced3b (patch) | |
tree | efb7315aba99bd79aecf017f1e6786b9415e1480 /arch/arm/mach-imx/mach-imx6q.c | |
parent | 75f83d06c3305e0f0a00e7d141acf8ceef608fe9 (diff) |
ARM: i.MX6: add i.MX6 specific L2 cache configuration
To improve the performance and power consumption add an i.MX6
specific L2 cache initialization.
This configuration is taken from Freescale's kernel patch
"ENGR00153601 [MX6]Adjust L2 cache parameter" [1]
with two additional improvements:
a) The L2X0_POWER_CTRL has only the two bits we set. So no need
to read the register before. Remove the register read done
in Freescale's patch.
b) In the L2X0_PREFETCH_CTRL register, besides the double linefill (bit[30]),
additionally enable the instruction and data prefetch (bit[29-28]).
Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
[1] http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/commit/arch/arm/mach-mx6/mm.c?h=imx_3.0.35_12.09.01&id=814656410b40c67a10b25300e51b0477b2bb96d1
Diffstat (limited to 'arch/arm/mach-imx/mach-imx6q.c')
-rw-r--r-- | arch/arm/mach-imx/mach-imx6q.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 5536fd81379a..ec4b7fc61edb 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
@@ -253,10 +253,44 @@ static void __init imx6q_map_io(void) | |||
253 | imx_scu_map_io(); | 253 | imx_scu_map_io(); |
254 | } | 254 | } |
255 | 255 | ||
256 | #ifdef CONFIG_CACHE_L2X0 | ||
257 | static void __init imx6q_init_l2cache(void) | ||
258 | { | ||
259 | void __iomem *l2x0_base; | ||
260 | struct device_node *np; | ||
261 | unsigned int val; | ||
262 | |||
263 | np = of_find_compatible_node(NULL, NULL, "arm,pl310-cache"); | ||
264 | if (!np) | ||
265 | goto out; | ||
266 | |||
267 | l2x0_base = of_iomap(np, 0); | ||
268 | if (!l2x0_base) { | ||
269 | of_node_put(np); | ||
270 | goto out; | ||
271 | } | ||
272 | |||
273 | /* Configure the L2 PREFETCH and POWER registers */ | ||
274 | val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL); | ||
275 | val |= 0x70800000; | ||
276 | writel_relaxed(val, l2x0_base + L2X0_PREFETCH_CTRL); | ||
277 | val = L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN; | ||
278 | writel_relaxed(val, l2x0_base + L2X0_POWER_CTRL); | ||
279 | |||
280 | iounmap(l2x0_base); | ||
281 | of_node_put(np); | ||
282 | |||
283 | out: | ||
284 | l2x0_of_init(0, ~0UL); | ||
285 | } | ||
286 | #else | ||
287 | static inline void imx6q_init_l2cache(void) {} | ||
288 | #endif | ||
289 | |||
256 | static void __init imx6q_init_irq(void) | 290 | static void __init imx6q_init_irq(void) |
257 | { | 291 | { |
258 | imx6q_init_revision(); | 292 | imx6q_init_revision(); |
259 | l2x0_of_init(0, ~0UL); | 293 | imx6q_init_l2cache(); |
260 | imx_src_init(); | 294 | imx_src_init(); |
261 | imx_gpc_init(); | 295 | imx_gpc_init(); |
262 | irqchip_init(); | 296 | irqchip_init(); |