Full L2C patch series
Subsystems (22)
cover Full L2C patch series
Not much to say which hasn't already been said... except I'm reaching the end of my teather with this series.
I'll push it out shortly as my "to-build" branch - which is a branch which gets automatic separate build testing by Olof's system.
arch/arm/Kconfig | 51 - arch/arm/boot/dts/marco.dtsi | 2 +- arch/arm/boot/dts/prima2.dtsi | 2 +- arch/arm/include/asm/hardware/cache-l2x0.h | 104 +- arch/arm/include/asm/mach/arch.h | 3 + arch/arm/include/asm/outercache.h | 67 +- arch/arm/kernel/irq.c | 12 + arch/arm/mach-bcm/bcm_5301x.c | 9 +- arch/arm/mach-berlin/berlin.c | 17 +- arch/arm/mach-cns3xxx/core.c | 10 +- arch/arm/mach-exynos/common.h | 1 - arch/arm/mach-exynos/exynos.c | 21 +- arch/arm/mach-exynos/sleep.S | 30 +- arch/arm/mach-highbank/highbank.c | 21 +- arch/arm/mach-imx/mach-vf610.c | 9 +- arch/arm/mach-imx/suspend-imx6.S | 24 +- arch/arm/mach-imx/system.c | 8 +- arch/arm/mach-mvebu/board-v7.c | 9 +- arch/arm/mach-nomadik/cpu-8815.c | 13 +- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/common.h | 1 + arch/arm/mach-omap2/io.c | 2 + arch/arm/mach-omap2/omap-mpuss-lowpower.c | 16 +- arch/arm/mach-omap2/omap4-common.c | 86 +- arch/arm/mach-prima2/Makefile | 1 - arch/arm/mach-prima2/common.c | 6 + arch/arm/mach-prima2/l2x0.c | 49 - arch/arm/mach-prima2/pm.c | 1 - arch/arm/mach-realview/realview_eb.c | 9 +- arch/arm/mach-realview/realview_pb1176.c | 8 +- arch/arm/mach-realview/realview_pb11mp.c | 9 +- arch/arm/mach-realview/realview_pbx.c | 4 +- arch/arm/mach-rockchip/rockchip.c | 9 +- .../board-armadillo800eva-reference.c | 4 +- arch/arm/mach-shmobile/board-armadillo800eva.c | 4 +- arch/arm/mach-shmobile/board-kzm9g-reference.c | 4 +- arch/arm/mach-shmobile/board-kzm9g.c | 4 +- arch/arm/mach-shmobile/setup-r8a7778.c | 4 +- arch/arm/mach-shmobile/setup-r8a7779.c | 4 +- arch/arm/mach-socfpga/socfpga.c | 9 +- arch/arm/mach-spear/platsmp.c | 19 +- arch/arm/mach-spear/spear13xx.c | 8 +- arch/arm/mach-sti/board-dt.c | 26 +- arch/arm/mach-tegra/pm.h | 2 - arch/arm/mach-tegra/reset-handler.S | 11 +- arch/arm/mach-tegra/sleep.h | 31 - arch/arm/mach-tegra/tegra.c | 32 +- arch/arm/mach-ux500/cache-l2x0.c | 32 +- arch/arm/mach-vexpress/ct-ca9x4.c | 28 +- arch/arm/mach-vexpress/v2m.c | 3 +- arch/arm/mach-zynq/common.c | 8 +- arch/arm/mm/Kconfig | 51 + arch/arm/mm/Makefile | 3 +- arch/arm/mm/cache-feroceon-l2.c | 1 - arch/arm/mm/cache-l2x0.c | 1504 +++++++++++++------- arch/arm/mm/l2c-common.c | 20 + arch/arm/mm/l2c-l2x0-resume.S | 58 + arch/arm/plat-samsung/s5p-sleep.S | 1 - 58 files changed, 1470 insertions(+), 1016 deletions(-)
Signature · 2 lines
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it.
PATCH 1/97 ARM: l2c: remove outer_inv_all() method
No one ever calls this function anywhere in the kernel, so let's completely remove it from the outer cache API and turn it into an internal-only thing.
--- arch/arm/include/asm/outercache.h | 8 -------- arch/arm/mm/cache-feroceon-l2.c | 1 - arch/arm/mm/cache-l2x0.c | 5 ----- 3 files changed, 14 deletions(-)
arch/arm/include/asm/outercache.h +0 -8
@@ -28,7 +28,6 @@ struct outer_cache_fns {void (*clean_range)(unsigned long ,unsigned long );void (*flush_range)(unsigned long ,unsigned long );void (*flush_all)(void ); -void (*inv_all)(void );void (*disable)(void );#ifdef CONFIG_OUTER_CACHE_SYNC void (*sync)(void );
@@ -63,12 +62,6 @@ static inline void outer_flush_all(void) outer_cache.flush_all (); } -static inline void outer_inv_all (void ) -{ -if (outer_cache.inv_all) - outer_cache.inv_all (); -} -static inline void outer_disable (void ) {if (outer_cache.disable)
@@ -90,7 +83,6 @@ static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)static inline void outer_flush_range (phys_addr_t start,phys_addr_t end) { }static inline void outer_flush_all (void ) { } -static inline void outer_inv_all (void ) { }static inline void outer_disable (void ) { }static inline void outer_resume (void ) { }
arch/arm/mm/cache-feroceon-l2.c +0 -1
@@ -350,7 +350,6 @@ void __init feroceon_l2_init(int __l2_wt_override) outer_cache.inv_range = feroceon_l2_inv_range; outer_cache.clean_range = feroceon_l2_clean_range; outer_cache.flush_range = feroceon_l2_flush_range; - outer_cache.inv_all = l2_inv_all;enable_l2 ();
arch/arm/mm/cache-l2x0.c +0 -5
@@ -414,7 +414,6 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) outer_cache.flush_range = l2x0_flush_range; outer_cache.sync = l2x0_cache_sync; outer_cache.flush_all = l2x0_flush_all; - outer_cache.inv_all = l2x0_inv_all; outer_cache.disable = l2x0_disable; }
@@ -884,7 +883,6 @@ static const struct l2x0_of_data pl310_data = { .flush_range = l2x0_flush_range, .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, - .inv_all = l2x0_inv_all, .disable = l2x0_disable, }, };
@@ -899,7 +897,6 @@ static const struct l2x0_of_data l2x0_data = { .flush_range = l2x0_flush_range, .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, - .inv_all = l2x0_inv_all, .disable = l2x0_disable, }, };
@@ -914,7 +911,6 @@ static const struct l2x0_of_data aurora_with_outer_data = { .flush_range = aurora_flush_range, .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, - .inv_all = l2x0_inv_all, .disable = l2x0_disable, }, };
@@ -946,7 +942,6 @@ static const struct l2x0_of_data bcm_l2x0_data = { .flush_range = bcm_flush_range, .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, - .inv_all = l2x0_inv_all, .disable = l2x0_disable, }, };
Signature · 1 line
1.8.3.1
PATCH 2/97 ARM: l2c: remove unnecessary call to outer_flush_all()
In reply to Russell King - ARM Linuxouter_disable() is defined to safely turn the L2 cache off without data
loss: this means that outer_flush_all() should never be called unless you need to implement some special L2 cache disabling, and even then only from your replacement L2 cache disable function.
--- arch/arm/mach-prima2/pm.c | 1 - 1 file changed, 1 deletion(-)
arch/arm/mach-prima2/pm.c +0 -1
@@ -71,7 +71,6 @@ static int sirfsoc_pm_enter(suspend_state_t state)case PM_SUSPEND_MEM :sirfsoc_pre_suspend_power_off (); -outer_flush_all ();outer_disable ();/* go zzz */ cpu_suspend (0 , sirfsoc_finish_suspend);
Signature · 1 line
1.8.3.1
PATCH 2/97 ARM: l2c: remove unnecessary call to outer_flush_all()
2014-04-29 3:26 GMT+08:00, Russell King <[email protected]>:
Quoted 7 lines
outer_disable()is defined to safely turn the L2 cache off without data
loss: this means thatouter_flush_all()should never be called unless you need to implement some special L2 cache disabling, and even then only from your replacement L2 cache disable function.Acked-by Shawn Guo <[email protected]>Signed-off-by Russell King <[email protected]>
Quoted 20 lines
--- arch/arm/mach-prima2/pm.c | 1 - 1 file changed, 1 deletion(-)arch/arm/mach-prima2/pm.c +0
-2@@ -71,7 +71,6 @@ static int sirfsoc_pm_enter(suspend_state_t state)case PM_SUSPEND_MEM :sirfsoc_pre_suspend_power_off (); -outer_flush_all ();outer_disable ();/* go zzz */ cpu_suspend (0 , sirfsoc_finish_suspend); --1.8.3.1
PATCH 3/97 ARM: l2c: avoid calling outer_flush_all() unnecessarily (Spear)
In reply to Russell King - ARM LinuxSpear calls outer_flush_all() from it's SMP bringup function. This is potentially dangerous as the L2C set/way operations which implement this don't take kindly to concurrent operations. Besides, there's better solutions to this, as implemented on other platforms.
--- arch/arm/mach-spear/platsmp.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-)
arch/arm/mach-spear/platsmp.c +14 -5
@@ -20,6 +20,18 @@#include <mach/spear.h> #include "generic.h" +/* +* Write pen_release in a way that is guaranteed to be visible to all +* observers, irrespective of whether they're taking part in coherency +* or not. This is necessary for the hotplug code to work reliably. +*/ +static void write_pen_release (int val) +{ + pen_release = val; +smp_wmb (); +sync_cache_w (&pen_release); +} +static DEFINE_SPINLOCK (boot_lock);static void __iomem *scu_base =IOMEM (VA_SCU_BASE );
@@ -30,8 +42,7 @@ static void spear13xx_secondary_init(unsigned int cpu)* let the primary processor know we're out of the * pen, then head off into the C entry point */ - pen_release =-1 ; -smp_wmb (); +write_pen_release (-1 );/* * Synchronise with the boot thread.
@@ -58,9 +69,7 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)* Note that "pen_release" is the hardware CPU ID, whereas * "cpu" is Linux's internal ID. */ - pen_release = cpu; -flush_cache_all (); -outer_flush_all (); +write_pen_release (cpu); timeout = jiffies + (1 *HZ );while (time_before (jiffies, timeout)) {
Signature · 1 line
1.8.3.1
PATCH 4/97 ARM: l2c: omap2: remove ES1.0 support
In reply to Russell King - ARM LinuxSantosh says:
Quoted 4 lines
But we should kill all of that since we long back decided to remove ES1.0 related code. The mach-omap code alreasy has removed the ES1.0 compatibility so feel free to remove any specific ES1.0 related stuff. That silicon is long dead.
--- arch/arm/mach-omap2/omap4-common.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-)
arch/arm/mach-omap2/omap4-common.c +8 -17
@@ -182,7 +182,7 @@ static void omap4_l2x0_set_debug(unsigned long val)static int __init omap_l2_cache_init (void ) { -u32 aux_ctrl =0 ; +u32 aux_ctrl;/* * To avoid code running on other OMAPs in
@@ -196,27 +196,18 @@ static int __init omap_l2_cache_init(void)if (WARN_ON (!l2cache_base))return -ENOMEM ; -/* -* 16-way associativity, parity disabled -* Way size - 32KB (es1.0) -* Way size - 64KB (es2.0 +) -*/ - aux_ctrl = ((1 <<L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT ) | +/* 16-way associativity, parity disabled, way size - 64KB (es2.0 +) */ + aux_ctrl = (1 <<L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT ) | (0x1 <<25 ) | (0x1 <<L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT ) | - (0x1 <<L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT )); - -if (omap_rev () ==OMAP4430_REV_ES1_0 ) { - aux_ctrl |=0x2 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ; - }else { - aux_ctrl |= ((0x3 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ) | + (0x1 << L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT)) | + (0x3 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ) | (1 <<L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT ) | (1 <<L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT ) | (1 <<L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT ) | - (1 <<L2X0_AUX_CTRL_EARLY_BRESP_SHIFT )); - } -if (omap_rev () !=OMAP4430_REV_ES1_0 ) -omap_smc1 (0x109 , aux_ctrl); + (1 <<L2X0_AUX_CTRL_EARLY_BRESP_SHIFT ); + +omap_smc1 (0x109 , aux_ctrl);/* Enable PL310 L2 Cache controller */ omap_smc1 (0x102 ,0x1 );
Signature · 1 line
1.8.3.1
PATCH 5/97 ARM: l2c: remove unnecessary UL-suffix to mask values
In reply to Russell King - ARM LinuxThey're u32, they're not unsigned long. The UL suffix is not required here.
--- arch/arm/mach-bcm/bcm_5301x.c | 2 +- arch/arm/mach-highbank/highbank.c | 2 +- arch/arm/mach-imx/mach-vf610.c | 2 +- arch/arm/mach-imx/system.c | 2 +- arch/arm/mach-mvebu/board-v7.c | 2 +- arch/arm/mach-rockchip/rockchip.c | 2 +- arch/arm/mach-socfpga/socfpga.c | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-)
arch/arm/mach-bcm/bcm_5301x.c +1 -1
@@ -45,7 +45,7 @@ static void __init bcm5301x_init_early(void)static void __init bcm5301x_dt_init (void ) { -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }
arch/arm/mach-highbank/highbank.c +1 -1
@@ -69,7 +69,7 @@ static void __init highbank_init_irq(void)if (IS_ENABLED (CONFIG_CACHE_L2X0 ) &&of_find_compatible_node (NULL ,NULL ,"arm,pl310-cache" )) {highbank_smc1 (0x102 ,0x1 ); -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 ); outer_cache.disable = highbank_l2x0_disable; } }
arch/arm/mach-imx/mach-vf610.c +1 -1
@@ -22,7 +22,7 @@ static void __init vf610_init_machine(void)static void __init vf610_init_irq (void ) { -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 );irqchip_init (); }
arch/arm/mach-imx/system.c +1 -1
@@ -145,6 +145,6 @@ void __init imx_init_l2cache(void)of_node_put (np); out: - l2x0_of_init(0, ~0UL); + l2x0_of_init(0, ~0); }#endif
arch/arm/mach-mvebu/board-v7.c +1 -1
@@ -60,7 +60,7 @@ static void __init mvebu_timer_and_clk_init(void)coherency_init ();BUG_ON (mvebu_mbus_dt_init ());#ifdef CONFIG_CACHE_L2X0 -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 );#endif if (of_machine_is_compatible ("marvell,armada375" ))
arch/arm/mach-rockchip/rockchip.c +1 -1
@@ -26,7 +26,7 @@static void __init rockchip_dt_init (void ) { -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }
arch/arm/mach-socfpga/socfpga.c +1 -1
@@ -100,7 +100,7 @@ static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd)static void __init socfpga_cyclone5_init (void ) { -l2x0_of_init (0 , ~0UL ); +l2x0_of_init (0 , ~0 );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }
Signature · 1 line
1.8.3.1
PATCH 6/97 ARM: outer cache: add documentation of outer cache functions
In reply to Russell King - ARM LinuxAdd some documentation to cover the outer cache functions so that their requirements can be better understood. Of particular note are the flush_all() and disable() methods which must not be called except in very specific circumstances.
--- arch/arm/include/asm/outercache.h | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-)
arch/arm/include/asm/outercache.h +47 -1
@@ -39,35 +39,75 @@ struct outer_cache_fns {extern struct outer_cache_fns outer_cache;#ifdef CONFIG_OUTER_CACHE - +/** +* outer_inv_range - invalidate range of outer cache lines +* @start: starting physical address, inclusive +* @end: end physical address, exclusive +*/ static inline void outer_inv_range (phys_addr_t start,phys_addr_t end) {if (outer_cache.inv_range) outer_cache.inv_range (start, end); } + +/** +* outer_clean_range - clean dirty outer cache lines +* @start: starting physical address, inclusive +* @end: end physical address, exclusive +*/ static inline void outer_clean_range (phys_addr_t start,phys_addr_t end) {if (outer_cache.clean_range) outer_cache.clean_range (start, end); } + +/** +* outer_flush_range - clean and invalidate outer cache lines +* @start: starting physical address, inclusive +* @end: end physical address, exclusive +*/ static inline void outer_flush_range (phys_addr_t start,phys_addr_t end) {if (outer_cache.flush_range) outer_cache.flush_range (start, end); } +/** +* outer_flush_all - clean and invalidate all cache lines in the outer cache +* +* Note: depending on implementation, this may not be atomic - it must +* only be called with interrupts disabled and no other active outer +* cache masters. +* +* It is intended that this function is only used by implementations +* needing to override the outer_cache.disable() method due to security. +* (Some implementations perform this as a clean followed by an invalidate.) +*/ static inline void outer_flush_all (void ) {if (outer_cache.flush_all) outer_cache.flush_all (); } +/** +* outer_disable - clean, invalidate and disable the outer cache +* +* Disable the outer cache, ensuring that any data contained in the outer +* cache is pushed out to lower levels of system memory. The note and +* conditions above concerning outer_flush_all() applies here. +*/ static inline void outer_disable (void ) {if (outer_cache.disable) outer_cache.disable (); } +/** +* outer_resume - restore the cache configuration and re-enable outer cache +* +* Restore any configuration that the cache had when previously enabled, +* and re-enable the outer cache. +*/ static inline void outer_resume (void ) {if (outer_cache.resume)
@@ -89,6 +129,12 @@ static inline void outer_resume(void) { }#endif #ifdef CONFIG_OUTER_CACHE_SYNC +/** +* outer_sync - perform a sync point for outer cache +* +* Ensure that all outer cache operations are complete and any store +* buffers are drained. +*/ static inline void outer_sync (void ) {if (outer_cache.sync)
Signature · 1 line
1.8.3.1
PATCH 7/97 ARM: outer cache: add WARN_ON() to outer_disable()
In reply to Russell King - ARM LinuxAdd WARN_ON() conditions to outer_disable() to ensure that its requirements aren't violated.
--- arch/arm/include/asm/outercache.h | 7 ++----- arch/arm/mm/Makefile | 1 + arch/arm/mm/l2c-common.c | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 arch/arm/mm/l2c-common.c
arch/arm/include/asm/outercache.h +2 -5
@@ -21,6 +21,7 @@#ifndef __ASM_OUTERCACHE_H#define __ASM_OUTERCACHE_H +#include <linux/bug.h> #include <linux/types.h> struct outer_cache_fns {
@@ -96,11 +97,7 @@ static inline void outer_flush_all(void)* cache is pushed out to lower levels of system memory. The note and * conditions above concerning outer_flush_all() applies here. */ -static inline void outer_disable (void ) -{ -if (outer_cache.disable) - outer_cache.disable (); -} +extern void outer_disable (void );/** * outer_resume - restore the cache configuration and re-enable outer cache
arch/arm/mm/Makefile +1 -0
@@ -95,6 +95,7 @@ obj-$(CONFIG_CPU_V7M) += proc-v7m.o AFLAGS_proc-v6.o :=-Wa,-march=armv6 AFLAGS_proc-v7.o :=-Wa,-march=armv7-a +obj-$(CONFIG_OUTER_CACHE) += l2c-common.o obj-$(CONFIG_CACHE_FEROCEON_L2) += cache-feroceon-l2.o obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o obj-$(CONFIG_CACHE_XSC3L2) += cache-xsc3l2.o
arch/arm/mm/l2c-common.c new file +20 -0
@@ -0,0 +1,20 @@ +/* +* Copyright (C) 2010 ARM Ltd. +* Written by Catalin Marinas <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +*/ +#include <linux/bug.h> +#include <linux/smp.h> +#include <asm/outercache.h> + +void outer_disable (void ) +{ +WARN_ON (!irqs_disabled ()); +WARN_ON (num_online_cpus () >1 ); + +if (outer_cache.disable) + outer_cache.disable (); +}
Signature · 1 line
1.8.3.1
PATCH 8/97 ARM: l2c: add helper for L2 cache controller DT IDs
In reply to Russell King - ARM LinuxMake it easier to declare L2 cache controller DT IDs by using a macro.
--- arch/arm/mm/cache-l2x0.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
arch/arm/mm/cache-l2x0.c +10 -13
@@ -946,20 +946,17 @@ static const struct l2x0_of_data bcm_l2x0_data = { }, }; +#define L2C_ID (name, fns) { .compatible = name, .data = (void *)&fns }static const struct of_device_id l2x0_ids[]__initconst = { - { .compatible ="arm,l210-cache" , .data = (void *)&l2x0_data }, - { .compatible ="arm,l220-cache" , .data = (void *)&l2x0_data }, - { .compatible ="arm,pl310-cache" , .data = (void *)&pl310_data }, - { .compatible ="bcm,bcm11351-a2-pl310-cache" ,/* deprecated name */ - .data = (void *)&bcm_l2x0_data}, - { .compatible ="brcm,bcm11351-a2-pl310-cache" , - .data = (void *)&bcm_l2x0_data}, - { .compatible ="marvell,aurora-outer-cache" , - .data = (void *)&aurora_with_outer_data}, - { .compatible ="marvell,aurora-system-cache" , - .data = (void *)&aurora_no_outer_data}, - { .compatible ="marvell,tauros3-cache" , - .data = (void *)&tauros3_data }, +L2C_ID ("arm,l210-cache" , l2x0_data), +L2C_ID ("arm,l220-cache" , l2x0_data), +L2C_ID ("arm,pl310-cache" , pl310_data), +L2C_ID ("brcm,bcm11351-a2-pl310-cache" , bcm_l2x0_data), +L2C_ID ("marvell,aurora-outer-cache" , aurora_with_outer_data), +L2C_ID ("marvell,aurora-system-cache" , aurora_no_outer_data), +L2C_ID ("marvell,tauros3-cache" , tauros3_data), +/* Deprecated IDs */ +L2C_ID ("bcm,bcm11351-a2-pl310-cache" , bcm_l2x0_data), {} };
Signature · 1 line
1.8.3.1
PATCH 9/97 ARM: l2c: tidy up l2x0_of_data declarations
In reply to Russell King - ARM LinuxRemove NULL initialisers, make these all __initconst structures, and order their members in the same order as the structure declaration.
--- arch/arm/mm/cache-l2x0.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-)
arch/arm/mm/cache-l2x0.c +14 -16
@@ -873,49 +873,48 @@ static void __init aurora_of_setup(const struct device_node *np, *aux_mask &= ~mask; } -static const struct l2x0_of_data pl310_data = { +static const struct l2x0_of_data pl310_data__initconst = { .setup = pl310_of_setup, .save = pl310_save, .outer_cache = { - .resume = pl310_resume, .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range, .flush_range = l2x0_flush_range, - .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = pl310_resume, }, }; -static const struct l2x0_of_data l2x0_data = { +static const struct l2x0_of_data l2x0_data__initconst = { .setup = l2x0_of_setup, - .save =NULL , .outer_cache = { - .resume = l2x0_resume, .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range, .flush_range = l2x0_flush_range, - .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = l2x0_resume, }, }; -static const struct l2x0_of_data aurora_with_outer_data = { +static const struct l2x0_of_data aurora_with_outer_data__initconst = { .setup = aurora_of_setup, .save = aurora_save, .outer_cache = { - .resume = aurora_resume, .inv_range = aurora_inv_range, .clean_range = aurora_clean_range, .flush_range = aurora_flush_range, - .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = aurora_resume, }, }; -static const struct l2x0_of_data aurora_no_outer_data = { +static const struct l2x0_of_data aurora_no_outer_data__initconst = { .setup = aurora_of_setup, .save = aurora_save, .outer_cache = {
@@ -923,8 +922,7 @@ static const struct l2x0_of_data aurora_no_outer_data = { }, }; -static const struct l2x0_of_data tauros3_data = { - .setup =NULL , +static const struct l2x0_of_data tauros3_data__initconst = { .save = tauros3_save,/* Tauros3 broadcasts L1 cache operations to L2 */ .outer_cache = {
@@ -932,17 +930,17 @@ static const struct l2x0_of_data tauros3_data = { }, }; -static const struct l2x0_of_data bcm_l2x0_data = { +static const struct l2x0_of_data bcm_l2x0_data__initconst = { .setup = pl310_of_setup, .save = pl310_save, .outer_cache = { - .resume = pl310_resume, .inv_range = bcm_inv_range, .clean_range = bcm_clean_range, .flush_range = bcm_flush_range, - .sync = l2x0_cache_sync, .flush_all = l2x0_flush_all, .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = pl310_resume, }, };
Signature · 1 line
1.8.3.1
PATCH 10/97 ARM: l2c: rename OF specific things, making l2x0_of_data available to all
In reply to Russell King - ARM LinuxRename a few things to help distinguish their function(s):
l2x0_of_data -> l2c_init_data
setup -> of_parse
add of_ prefix to OF specific data
--- arch/arm/mm/cache-l2x0.c | 64 ++++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-)
arch/arm/mm/cache-l2x0.c +32 -32
@@ -28,6 +28,12 @@#include "cache-tauros3.h" #include "cache-aurora-l2.h" +struct l2c_init_data { +void (*of_parse)(const struct device_node *,u32 *,u32 *); +void (*save)(void ); +struct outer_cache_fns outer_cache; +}; +#define CACHE_LINE_SIZE 32static void __iomem *l2x0_base;
@@ -42,12 +48,6 @@ static u32 cache_id_part_number_from_dt;struct l2x0_regs l2x0_saved_regs; -struct l2x0_of_data { -void (*setup)(const struct device_node *,u32 *,u32 *); -void (*save)(void ); -struct outer_cache_fns outer_cache; -}; -static bool of_init = false;static inline void cache_wait_way (void __iomem *reg,unsigned long mask)
@@ -664,7 +664,7 @@ static void bcm_flush_range(unsigned long start, unsigned long end) new_end); } -static void __init l2x0_of_setup (const struct device_node *np, +static void __init l2x0_of_parse (const struct device_node *np,u32 *aux_val,u32 *aux_mask) {u32 data[2 ] = {0 ,0 };
@@ -698,7 +698,7 @@ static void __init l2x0_of_setup(const struct device_node *np, *aux_mask &= ~mask; } -static void __init pl310_of_setup (const struct device_node *np, +static void __init pl310_of_parse (const struct device_node *np,u32 *aux_val,u32 *aux_mask) {u32 data[3 ] = {0 ,0 ,0 };
@@ -851,7 +851,7 @@ static void __init aurora_broadcast_l2_commands(void)isb (); } -static void __init aurora_of_setup (const struct device_node *np, +static void __init aurora_of_parse (const struct device_node *np,u32 *aux_val,u32 *aux_mask) {u32 val =AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU ;
@@ -873,8 +873,8 @@ static void __init aurora_of_setup(const struct device_node *np, *aux_mask &= ~mask; } -static const struct l2x0_of_data pl310_data__initconst = { - .setup = pl310_of_setup, +static const struct l2c_init_data of_pl310_data__initconst = { + .of_parse = pl310_of_parse, .save = pl310_save, .outer_cache = { .inv_range = l2x0_inv_range,
@@ -887,8 +887,8 @@ static const struct l2x0_of_data pl310_data __initconst = { }, }; -static const struct l2x0_of_data l2x0_data__initconst = { - .setup = l2x0_of_setup, +static const struct l2c_init_data of_l2x0_data__initconst = { + .of_parse = l2x0_of_parse, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -900,8 +900,8 @@ static const struct l2x0_of_data l2x0_data __initconst = { }, }; -static const struct l2x0_of_data aurora_with_outer_data__initconst = { - .setup = aurora_of_setup, +static const struct l2c_init_data of_aurora_with_outer_data__initconst = { + .of_parse = aurora_of_parse, .save = aurora_save, .outer_cache = { .inv_range = aurora_inv_range,
@@ -914,15 +914,15 @@ static const struct l2x0_of_data aurora_with_outer_data __initconst = { }, }; -static const struct l2x0_of_data aurora_no_outer_data__initconst = { - .setup = aurora_of_setup, +static const struct l2c_init_data of_aurora_no_outer_data__initconst = { + .of_parse = aurora_of_parse, .save = aurora_save, .outer_cache = { .resume = aurora_resume, }, }; -static const struct l2x0_of_data tauros3_data__initconst = { +static const struct l2c_init_data of_tauros3_data__initconst = { .save = tauros3_save,/* Tauros3 broadcasts L1 cache operations to L2 */ .outer_cache = {
@@ -930,8 +930,8 @@ static const struct l2x0_of_data tauros3_data __initconst = { }, }; -static const struct l2x0_of_data bcm_l2x0_data__initconst = { - .setup = pl310_of_setup, +static const struct l2c_init_data of_bcm_l2x0_data__initconst = { + .of_parse = pl310_of_parse, .save = pl310_save, .outer_cache = { .inv_range = bcm_inv_range,
@@ -946,22 +946,22 @@ static const struct l2x0_of_data bcm_l2x0_data __initconst = {#define L2C_ID (name, fns) { .compatible = name, .data = (void *)&fns }static const struct of_device_id l2x0_ids[]__initconst = { -L2C_ID ("arm,l210-cache" , l2x0_data), -L2C_ID ("arm,l220-cache" , l2x0_data), -L2C_ID ("arm,pl310-cache" , pl310_data), -L2C_ID ("brcm,bcm11351-a2-pl310-cache" , bcm_l2x0_data), -L2C_ID ("marvell,aurora-outer-cache" , aurora_with_outer_data), -L2C_ID ("marvell,aurora-system-cache" , aurora_no_outer_data), -L2C_ID ("marvell,tauros3-cache" , tauros3_data), +L2C_ID ("arm,l210-cache" , of_l2x0_data), +L2C_ID ("arm,l220-cache" , of_l2x0_data), +L2C_ID ("arm,pl310-cache" , of_pl310_data), +L2C_ID ("brcm,bcm11351-a2-pl310-cache" , of_bcm_l2x0_data), +L2C_ID ("marvell,aurora-outer-cache" , of_aurora_with_outer_data), +L2C_ID ("marvell,aurora-system-cache" , of_aurora_no_outer_data), +L2C_ID ("marvell,tauros3-cache" , of_tauros3_data),/* Deprecated IDs */ -L2C_ID ("bcm,bcm11351-a2-pl310-cache" , bcm_l2x0_data), +L2C_ID ("bcm,bcm11351-a2-pl310-cache" , of_bcm_l2x0_data), {} };int __init l2x0_of_init (u32 aux_val,u32 aux_mask) { +const struct l2c_init_data *data;struct device_node *np; -const struct l2x0_of_data *data;struct resource res; np =of_find_matching_node (NULL , l2x0_ids);
@@ -981,12 +981,12 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)/* L2 configuration can only be changed if the cache is disabled */ if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -if (data->setup) - data->setup (np, &aux_val, &aux_mask); +if (data->of_parse) + data->of_parse (np, &aux_val, &aux_mask);/* For aurora cache in no outer mode select the * correct mode using the coprocessor*/ -if (data == &aurora_no_outer_data) +if (data == &of_aurora_no_outer_data)aurora_broadcast_l2_commands (); }
Signature · 1 line
1.8.3.1
PATCH 11/97 ARM: l2c: provide generic function for calling set_debug method
In reply to Russell King - ARM LinuxProvide a generic function which always calls the set_debug method. This will be used later in the series as some work-arounds require that the debug register be written.
--- arch/arm/mm/cache-l2x0.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
arch/arm/mm/cache-l2x0.c +11 -1
@@ -57,6 +57,16 @@ static inline void cache_wait_way(void __iomem *reg, unsigned long mask)cpu_relax (); } +/* +* This should only be called when we have a requirement that the +* register be written due to a work-around, as platforms running +* in non-secure mode may not be able to access this register. +*/ +static inline void l2c_set_debug (void __iomem *base,unsigned long val) +{ + outer_cache.set_debug (val); +} +#ifdef CONFIG_CACHE_PL310 static inline void cache_wait (void __iomem *reg,unsigned long mask) {
@@ -92,7 +102,7 @@ static inline void l2x0_inv_line(unsigned long addr)static inline void debug_writel (unsigned long val) {if (outer_cache.set_debug) - outer_cache.set_debug (val); +l2c_set_debug (l2x0_base, val); }static void pl310_set_debug (unsigned long val)
Signature · 1 line
1.8.3.1
PATCH 12/97 ARM: l2c: split out cache unlock code
In reply to Russell King - ARM LinuxSplit the cache unlock code out of l2x0_unlock(). We want to be able to re-use this functionality later.
--- arch/arm/mm/cache-l2x0.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
arch/arm/mm/cache-l2x0.c +16 -7
@@ -50,6 +50,9 @@ struct l2x0_regs l2x0_saved_regs;static bool of_init = false; +/* +* Common code for all cache controllers. +*/ static inline void cache_wait_way (void __iomem *reg,unsigned long mask) {/* wait for cache operation by line or way to complete */
@@ -67,6 +70,18 @@ static inline void l2c_set_debug(void __iomem *base, unsigned long val) outer_cache.set_debug (val); } +static inline void l2c_unlock (void __iomem *base,unsigned num) +{ +unsigned i; + +for (i =0 ; i < num; i++) { +writel_relaxed (0 , base +L2X0_LOCKDOWN_WAY_D_BASE + + i *L2X0_LOCKDOWN_STRIDE ); +writel_relaxed (0 , base +L2X0_LOCKDOWN_WAY_I_BASE + + i *L2X0_LOCKDOWN_STRIDE ); + } +} +#ifdef CONFIG_CACHE_PL310 static inline void cache_wait (void __iomem *reg,unsigned long mask) {
@@ -308,7 +323,6 @@ static void l2x0_disable(void)static void l2x0_unlock (u32 cache_id) {int lockregs; -int i;switch (cache_id &L2X0_CACHE_ID_PART_MASK ) {case L2X0_CACHE_ID_PART_L310 :
@@ -323,12 +337,7 @@ static void l2x0_unlock(u32 cache_id)break ; } -for (i =0 ; i < lockregs; i++) { -writel_relaxed (0x0 , l2x0_base +L2X0_LOCKDOWN_WAY_D_BASE + - i *L2X0_LOCKDOWN_STRIDE ); -writel_relaxed (0x0 , l2x0_base +L2X0_LOCKDOWN_WAY_I_BASE + - i *L2X0_LOCKDOWN_STRIDE ); - } +l2c_unlock (l2x0_base, lockregs); }void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask)
Signature · 1 line
1.8.3.1
PATCH 13/97 ARM: l2c: provide generic helper for way-based operations
In reply to Russell King - ARM LinuxProvide a generic helper function for way based operations. These are always background operations, and thus have to be waited for before a new operation is commenced. This helper extracts that requirement from several locations in the code.
--- arch/arm/mm/cache-l2x0.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
arch/arm/mm/cache-l2x0.c +9 -6
@@ -70,6 +70,12 @@ static inline void l2c_set_debug(void __iomem *base, unsigned long val) outer_cache.set_debug (val); } +static void __l2c_op_way (void __iomem *reg) +{ +writel_relaxed (l2x0_way_mask, reg); +cache_wait_way (reg, l2x0_way_mask); +} +static inline void l2c_unlock (void __iomem *base,unsigned num) {unsigned i;
@@ -166,8 +172,7 @@ static void l2x0_cache_sync(void)static void __l2x0_flush_all (void ) {debug_writel (0x03 ); -writel_relaxed (l2x0_way_mask, l2x0_base +L2X0_CLEAN_INV_WAY ); -cache_wait_way (l2x0_base +L2X0_CLEAN_INV_WAY , l2x0_way_mask); +__l2c_op_way (l2x0_base +L2X0_CLEAN_INV_WAY );cache_sync ();debug_writel (0x00 ); }
@@ -188,8 +193,7 @@ static void l2x0_clean_all(void)/* clean all ways */ raw_spin_lock_irqsave (&l2x0_lock, flags); -writel_relaxed (l2x0_way_mask, l2x0_base +L2X0_CLEAN_WAY ); -cache_wait_way (l2x0_base +L2X0_CLEAN_WAY , l2x0_way_mask); +__l2c_op_way (l2x0_base +L2X0_CLEAN_WAY );cache_sync ();raw_spin_unlock_irqrestore (&l2x0_lock, flags); }
@@ -202,8 +206,7 @@ static void l2x0_inv_all(void)raw_spin_lock_irqsave (&l2x0_lock, flags);/* Invalidating when L2 is enabled is a nono */ BUG_ON (readl (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN ); -writel_relaxed (l2x0_way_mask, l2x0_base +L2X0_INV_WAY ); -cache_wait_way (l2x0_base +L2X0_INV_WAY , l2x0_way_mask); +__l2c_op_way (l2x0_base +L2X0_INV_WAY );cache_sync ();raw_spin_unlock_irqrestore (&l2x0_lock, flags); }
Signature · 1 line
1.8.3.1
PATCH 14/97 ARM: l2c: rename cache_wait_way()
In reply to Russell King - ARM Linuxcache_wait_way() is actually used to wait for a particular mask to report clear; it's not really got much to do with cache ways at all. Indeed, it gets used to wait for the C bit to clear on older caches. Rename this with a more generic function name which better reflects its purpose: l2c_wait_mask().
--- arch/arm/mm/cache-l2x0.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm/mm/cache-l2x0.c +3 -3
@@ -53,7 +53,7 @@ static bool of_init = false;/* * Common code for all cache controllers. */ -static inline void cache_wait_way (void __iomem *reg,unsigned long mask) +static inline void l2c_wait_mask (void __iomem *reg,unsigned long mask) {/* wait for cache operation by line or way to complete */ while (readl_relaxed (reg) & mask)
@@ -73,7 +73,7 @@ static inline void l2c_set_debug(void __iomem *base, unsigned long val)static void __l2c_op_way (void __iomem *reg) {writel_relaxed (l2x0_way_mask, reg); -cache_wait_way (reg, l2x0_way_mask); +l2c_wait_mask (reg, l2x0_way_mask); }static inline void l2c_unlock (void __iomem *base,unsigned num)
@@ -94,7 +94,7 @@ static inline void cache_wait(void __iomem *reg, unsigned long mask) /* cache operations by line are atomic on PL310 */ }#else -#define cache_wait cache_wait_way +#define cache_wait l2c_wait_mask#endif static inline void cache_sync (void )
Signature · 1 line
1.8.3.1
PATCH 15/97 ARM: l2c: add and use L2C revision constants
In reply to Russell King - ARM LinuxThe revision namespace is specific to the L2 cache part, so don't name these with generic identifiers, use a part specific identifier.
--- arch/arm/include/asm/hardware/cache-l2x0.h | 22 ++++++++++++++++------ arch/arm/mm/cache-l2x0.c | 10 +++++----- 2 files changed, 21 insertions(+), 11 deletions(-)
arch/arm/include/asm/hardware/cache-l2x0.h +16 -6
@@ -68,14 +68,24 @@/* Registers shifts and masks */ #define L2X0_CACHE_ID_PART_MASK (0xf << 6)#define L2X0_CACHE_ID_PART_L210 (1 << 6) +#define L2X0_CACHE_ID_PART_L220 (2 << 6)#define L2X0_CACHE_ID_PART_L310 (3 << 6)#define L2X0_CACHE_ID_RTL_MASK 0x3f -#define L2X0_CACHE_ID_RTL_R0P0 0x0 -#define L2X0_CACHE_ID_RTL_R1P0 0x2 -#define L2X0_CACHE_ID_RTL_R2P0 0x4 -#define L2X0_CACHE_ID_RTL_R3P0 0x5 -#define L2X0_CACHE_ID_RTL_R3P1 0x6 -#define L2X0_CACHE_ID_RTL_R3P2 0x8 +#define L210_CACHE_ID_RTL_R0P2_02 0x00 +#define L210_CACHE_ID_RTL_R0P1 0x01 +#define L210_CACHE_ID_RTL_R0P2_01 0x02 +#define L210_CACHE_ID_RTL_R0P3 0x03 +#define L210_CACHE_ID_RTL_R0P4 0x0b +#define L210_CACHE_ID_RTL_R0P5 0x0f +#define L220_CACHE_ID_RTL_R1P7_01REL0 0x06 +#define L310_CACHE_ID_RTL_R0P0 0x00 +#define L310_CACHE_ID_RTL_R1P0 0x02 +#define L310_CACHE_ID_RTL_R2P0 0x04 +#define L310_CACHE_ID_RTL_R3P0 0x05 +#define L310_CACHE_ID_RTL_R3P1 0x06 +#define L310_CACHE_ID_RTL_R3P1_50REL0 0x07 +#define L310_CACHE_ID_RTL_R3P2 0x08 +#define L310_CACHE_ID_RTL_R3P3 0x09#define L2X0_AUX_CTRL_MASK 0xc0000fff#define L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT 0
arch/arm/mm/cache-l2x0.c +5 -5
@@ -374,7 +374,7 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)/* Unmapped register. */ sync_reg_offset =L2X0_DUMMY_REG ;#endif -if ((cache_id &L2X0_CACHE_ID_RTL_MASK ) <=L2X0_CACHE_ID_RTL_R3P0 ) +if ((cache_id &L2X0_CACHE_ID_RTL_MASK ) <=L310_CACHE_ID_RTL_R3P0 ) outer_cache.set_debug = pl310_set_debug;break ;case L2X0_CACHE_ID_PART_L210 :
@@ -768,7 +768,7 @@ static void __init pl310_save(void) l2x0_saved_regs.filter_start =readl_relaxed (l2x0_base +L2X0_ADDR_FILTER_START ); -if (l2x0_revision >=L2X0_CACHE_ID_RTL_R2P0 ) { +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) {/* * From r2p0, there is Prefetch offset/control register */
@@ -777,7 +777,7 @@ static void __init pl310_save(void)/* * From r3p0, there is Power control register */ -if (l2x0_revision >=L2X0_CACHE_ID_RTL_R3P0 ) +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) l2x0_saved_regs.pwr_ctrl =readl_relaxed (l2x0_base +L2X0_POWER_CTRL ); }
@@ -830,10 +830,10 @@ static void pl310_resume(void) l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) &L2X0_CACHE_ID_RTL_MASK ; -if (l2x0_revision >=L2X0_CACHE_ID_RTL_R2P0 ) { +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) {writel_relaxed (l2x0_saved_regs.prefetch_ctrl, l2x0_base +L2X0_PREFETCH_CTRL ); -if (l2x0_revision >=L2X0_CACHE_ID_RTL_R3P0 ) +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 )writel_relaxed (l2x0_saved_regs.pwr_ctrl, l2x0_base +L2X0_POWER_CTRL ); }
Signature · 1 line
1.8.3.1
PATCH 16/97 ARM: l2c: clean up OF initialisation a bit
In reply to Russell King - ARM LinuxRather than having a boolean and other tricks to disable some bits of l2x0_init(), split this function into two parts: a common part shared between OF and non-OF, and the non-OF part.
The common part can take a block of function pointers, and the cache ID (to cope with Aurora's DT specified ID.) Eliminate the redundant setting of l2x0_base in the OF case, moving it to the non-OF init function.
This allows us to localise the OF-specific initialisation handling from the non-OF handling.
--- arch/arm/mm/cache-l2x0.c | 66 +++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 26 deletions(-)
arch/arm/mm/cache-l2x0.c +40 -26
@@ -42,14 +42,8 @@ static u32 l2x0_way_mask; /* Bitmask of active ways */static u32 l2x0_size;static unsigned long sync_reg_offset =L2X0_CACHE_SYNC ; -/* Aurora don't have the cache ID register available, so we have to -* pass it though the device tree */ -static u32 cache_id_part_number_from_dt; -struct l2x0_regs l2x0_saved_regs; -static bool of_init = false; -/* * Common code for all cache controllers. */
@@ -343,20 +337,26 @@ static void l2x0_unlock(u32 cache_id)l2c_unlock (l2x0_base, lockregs); } -void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask) +static const struct l2c_init_data l2x0_init_fns__initconst = { + .outer_cache = { + .inv_range = l2x0_inv_range, + .clean_range = l2x0_clean_range, + .flush_range = l2x0_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + }, +}; + +static void __init __l2c_init (const struct l2c_init_data *data, +u32 aux_val,u32 aux_mask,u32 cache_id) {u32 aux; -u32 cache_id;u32 way_size =0 ;int ways;int way_size_shift =L2X0_WAY_SIZE_SHIFT ;const char *type; - l2x0_base = base; -if (cache_id_part_number_from_dt) - cache_id = cache_id_part_number_from_dt; -else - cache_id =readl_relaxed (l2x0_base +L2X0_CACHE_ID ); aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); aux &= aux_mask;
@@ -374,8 +374,6 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)/* Unmapped register. */ sync_reg_offset =L2X0_DUMMY_REG ;#endif -if ((cache_id &L2X0_CACHE_ID_RTL_MASK ) <=L310_CACHE_ID_RTL_R3P0 ) - outer_cache.set_debug = pl310_set_debug;break ;case L2X0_CACHE_ID_PART_L210 : ways = (aux >>13 ) &0xf ;
@@ -430,23 +428,35 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)/* Save the value for resuming. */ l2x0_saved_regs.aux_ctrl = aux; -if (!of_init) { - outer_cache.inv_range = l2x0_inv_range; - outer_cache.clean_range = l2x0_clean_range; - outer_cache.flush_range = l2x0_flush_range; - outer_cache.sync = l2x0_cache_sync; - outer_cache.flush_all = l2x0_flush_all; - outer_cache.disable = l2x0_disable; - } + outer_cache = data->outer_cache; + +if ((cache_id &L2X0_CACHE_ID_PART_MASK ) ==L2X0_CACHE_ID_PART_L310 && + (cache_id &L2X0_CACHE_ID_RTL_MASK ) <=L310_CACHE_ID_RTL_R3P0 ) + outer_cache.set_debug = pl310_set_debug;pr_info ("%s cache controller enabled\n" , type);pr_info ("l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d kB\n" , ways, cache_id, aux, l2x0_size >>10 ); } +void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask) +{ +u32 cache_id; + + l2x0_base = base; + + cache_id =readl_relaxed (base +L2X0_CACHE_ID ); + +__l2c_init (&l2x0_init_fns, aux_val, aux_mask, cache_id); +} +#ifdef CONFIG_OF static int l2_wt_override; +/* Aurora don't have the cache ID register available, so we have to +* pass it though the device tree */ +static u32 cache_id_part_number_from_dt; +/* * Note that the end addresses passed to Linux primitives are * noninclusive, while the hardware cache range operations use
@@ -985,6 +995,7 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)const struct l2c_init_data *data;struct device_node *np;struct resource res; +u32 cache_id; np =of_find_matching_node (NULL , l2x0_ids);if (!np)
@@ -1015,9 +1026,12 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)if (data->save) data->save (); - of_init = true; -memcpy (&outer_cache, &data->outer_cache,sizeof (outer_cache)); -l2x0_init (l2x0_base, aux_val, aux_mask); +if (cache_id_part_number_from_dt) + cache_id = cache_id_part_number_from_dt; +else + cache_id =readl_relaxed (l2x0_base +L2X0_CACHE_ID ); + +__l2c_init (data, aux_val, aux_mask, cache_id);return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 17/97 ARM: l2c: pass iomem address into data->save function
In reply to Russell King - ARM LinuxPass the iomem address into this function so we don't have to keep accessing it from a global.
--- arch/arm/mm/cache-l2x0.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
arch/arm/mm/cache-l2x0.c +16 -16
@@ -30,7 +30,7 @@struct l2c_init_data {void (*of_parse)(const struct device_node *,u32 *,u32 *); -void (*save)(void ); +void (*save)(void __iomem *);struct outer_cache_fns outer_cache; };
@@ -764,47 +764,47 @@ static void __init pl310_of_parse(const struct device_node *np, } } -static void __init pl310_save (void ) +static void __init pl310_save (void __iomem *base) { -u32 l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & +u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) &L2X0_CACHE_ID_RTL_MASK ; - l2x0_saved_regs.tag_latency =readl_relaxed (l2x0_base + + l2x0_saved_regs.tag_latency =readl_relaxed (base +L2X0_TAG_LATENCY_CTRL ); - l2x0_saved_regs.data_latency =readl_relaxed (l2x0_base + + l2x0_saved_regs.data_latency =readl_relaxed (base +L2X0_DATA_LATENCY_CTRL ); - l2x0_saved_regs.filter_end =readl_relaxed (l2x0_base + + l2x0_saved_regs.filter_end =readl_relaxed (base +L2X0_ADDR_FILTER_END ); - l2x0_saved_regs.filter_start =readl_relaxed (l2x0_base + + l2x0_saved_regs.filter_start =readl_relaxed (base +L2X0_ADDR_FILTER_START );if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) {/* * From r2p0, there is Prefetch offset/control register */ - l2x0_saved_regs.prefetch_ctrl =readl_relaxed (l2x0_base + + l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base +L2X0_PREFETCH_CTRL );/* * From r3p0, there is Power control register */ if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) - l2x0_saved_regs.pwr_ctrl =readl_relaxed (l2x0_base + + l2x0_saved_regs.pwr_ctrl =readl_relaxed (base +L2X0_POWER_CTRL ); } } -static void aurora_save (void ) +static void aurora_save (void __iomem *base) { - l2x0_saved_regs.ctrl =readl_relaxed (l2x0_base +L2X0_CTRL ); - l2x0_saved_regs.aux_ctrl =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); + l2x0_saved_regs.ctrl =readl_relaxed (base +L2X0_CTRL ); + l2x0_saved_regs.aux_ctrl =readl_relaxed (base +L2X0_AUX_CTRL ); } -static void __init tauros3_save (void ) +static void __init tauros3_save (void __iomem *base) { l2x0_saved_regs.aux2_ctrl = -readl_relaxed (l2x0_base +TAUROS3_AUX2_CTRL ); +readl_relaxed (base +TAUROS3_AUX2_CTRL ); l2x0_saved_regs.prefetch_ctrl = -readl_relaxed (l2x0_base +L2X0_PREFETCH_CTRL ); +readl_relaxed (base +L2X0_PREFETCH_CTRL ); }static void l2x0_resume (void )
@@ -1024,7 +1024,7 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) }if (data->save) - data->save (); + data->save (l2x0_base);if (cache_id_part_number_from_dt) cache_id = cache_id_part_number_from_dt;
Signature · 1 line
1.8.3.1
PATCH 18/97 ARM: l2c: move l2c save function to __l2c_init()
In reply to Russell King - ARM LinuxThere's no reason this functionality should be specific to DT, so move it into the common initialisation function.
--- arch/arm/mm/cache-l2x0.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/arm/mm/cache-l2x0.c +7 -3
@@ -357,6 +357,13 @@ static void __init __l2c_init(const struct l2c_init_data *data,int way_size_shift =L2X0_WAY_SIZE_SHIFT ;const char *type; +/* +* It is strange to save the register state before initialisation, +* but hey, this is what the DT implementations decided to do. +*/ +if (data->save) + data->save (l2x0_base); + aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); aux &= aux_mask;
@@ -1023,9 +1030,6 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)aurora_broadcast_l2_commands (); } -if (data->save) - data->save (l2x0_base); -if (cache_id_part_number_from_dt) cache_id = cache_id_part_number_from_dt;else
Signature · 1 line
1.8.3.1
PATCH 19/97 ARM: l2c: group implementation specific code together
In reply to Russell King - ARM LinuxBack in the mists of time, someone decided that it would be a good idea to group like functions together - so all the save functions in one place, all the resume functions in another, all the OF parsing functions some place else.
This makes it difficult to get an overview on what a particular implementation is doing - grouping an implementations specific functions together makes more sense, because you can see what it's doing without the clutter of other implementations.
Organise it according to implementation.
--- arch/arm/mm/cache-l2x0.c | 502 +++++++++++++++++++++++------------------------ 1 file changed, 251 insertions(+), 251 deletions(-)
arch/arm/mm/cache-l2x0.c +251 -251
@@ -464,6 +464,175 @@ static int l2_wt_override;* pass it though the device tree */ static u32 cache_id_part_number_from_dt; +static void __init l2x0_of_parse (const struct device_node *np, +u32 *aux_val,u32 *aux_mask) +{ +u32 data[2 ] = {0 ,0 }; +u32 tag =0 ; +u32 dirty =0 ; +u32 val =0 , mask =0 ; + +of_property_read_u32 (np,"arm,tag-latency" , &tag); +if (tag) { + mask |=L2X0_AUX_CTRL_TAG_LATENCY_MASK ; + val |= (tag -1 ) <<L2X0_AUX_CTRL_TAG_LATENCY_SHIFT ; + } + +of_property_read_u32_array (np,"arm,data-latency" , + data,ARRAY_SIZE (data)); +if (data[0 ] && data[1 ]) { + mask |=L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK | +L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK ; + val |= ((data[0 ] -1 ) <<L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT ) | + ((data[1 ] -1 ) <<L2X0_AUX_CTRL_DATA_WR_LATENCY_SHIFT ); + } + +of_property_read_u32 (np,"arm,dirty-latency" , &dirty); +if (dirty) { + mask |=L2X0_AUX_CTRL_DIRTY_LATENCY_MASK ; + val |= (dirty -1 ) <<L2X0_AUX_CTRL_DIRTY_LATENCY_SHIFT ; + } + + *aux_val &= ~mask; + *aux_val |= val; + *aux_mask &= ~mask; +} + +static void l2x0_resume (void ) +{ +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +/* restore aux ctrl and enable l2 */ +l2x0_unlock (readl_relaxed (l2x0_base +L2X0_CACHE_ID )); + +writel_relaxed (l2x0_saved_regs.aux_ctrl, l2x0_base + +L2X0_AUX_CTRL ); + +l2x0_inv_all (); + +writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); + } +} + +static const struct l2c_init_data of_l2x0_data__initconst = { + .of_parse = l2x0_of_parse, + .outer_cache = { + .inv_range = l2x0_inv_range, + .clean_range = l2x0_clean_range, + .flush_range = l2x0_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = l2x0_resume, + }, +}; + +static void __init pl310_of_parse (const struct device_node *np, +u32 *aux_val,u32 *aux_mask) +{ +u32 data[3 ] = {0 ,0 ,0 }; +u32 tag[3 ] = {0 ,0 ,0 }; +u32 filter[2 ] = {0 ,0 }; + +of_property_read_u32_array (np,"arm,tag-latency" , tag,ARRAY_SIZE (tag)); +if (tag[0 ] && tag[1 ] && tag[2 ]) +writel_relaxed ( + ((tag[0 ] -1 ) <<L2X0_LATENCY_CTRL_RD_SHIFT ) | + ((tag[1 ] -1 ) <<L2X0_LATENCY_CTRL_WR_SHIFT ) | + ((tag[2 ] -1 ) <<L2X0_LATENCY_CTRL_SETUP_SHIFT ), + l2x0_base +L2X0_TAG_LATENCY_CTRL ); + +of_property_read_u32_array (np,"arm,data-latency" , + data,ARRAY_SIZE (data)); +if (data[0 ] && data[1 ] && data[2 ]) +writel_relaxed ( + ((data[0 ] -1 ) <<L2X0_LATENCY_CTRL_RD_SHIFT ) | + ((data[1 ] -1 ) <<L2X0_LATENCY_CTRL_WR_SHIFT ) | + ((data[2 ] -1 ) <<L2X0_LATENCY_CTRL_SETUP_SHIFT ), + l2x0_base +L2X0_DATA_LATENCY_CTRL ); + +of_property_read_u32_array (np,"arm,filter-ranges" , + filter,ARRAY_SIZE (filter)); +if (filter[1 ]) { +writel_relaxed (ALIGN (filter[0 ] + filter[1 ],SZ_1M ), + l2x0_base +L2X0_ADDR_FILTER_END ); +writel_relaxed ((filter[0 ] & ~(SZ_1M -1 )) |L2X0_ADDR_FILTER_EN , + l2x0_base +L2X0_ADDR_FILTER_START ); + } +} + +static void __init pl310_save (void __iomem *base) +{ +u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; + + l2x0_saved_regs.tag_latency =readl_relaxed (base + +L2X0_TAG_LATENCY_CTRL ); + l2x0_saved_regs.data_latency =readl_relaxed (base + +L2X0_DATA_LATENCY_CTRL ); + l2x0_saved_regs.filter_end =readl_relaxed (base + +L2X0_ADDR_FILTER_END ); + l2x0_saved_regs.filter_start =readl_relaxed (base + +L2X0_ADDR_FILTER_START ); + +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { +/* +* From r2p0, there is Prefetch offset/control register +*/ + l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base + +L2X0_PREFETCH_CTRL ); +/* +* From r3p0, there is Power control register +*/ +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) + l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + +L2X0_POWER_CTRL ); + } +} + +static void pl310_resume (void ) +{ +u32 l2x0_revision; + +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +/* restore pl310 setup */ +writel_relaxed (l2x0_saved_regs.tag_latency, + l2x0_base +L2X0_TAG_LATENCY_CTRL ); +writel_relaxed (l2x0_saved_regs.data_latency, + l2x0_base +L2X0_DATA_LATENCY_CTRL ); +writel_relaxed (l2x0_saved_regs.filter_end, + l2x0_base +L2X0_ADDR_FILTER_END ); +writel_relaxed (l2x0_saved_regs.filter_start, + l2x0_base +L2X0_ADDR_FILTER_START ); + + l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; + +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { +writel_relaxed (l2x0_saved_regs.prefetch_ctrl, + l2x0_base +L2X0_PREFETCH_CTRL ); +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) +writel_relaxed (l2x0_saved_regs.pwr_ctrl, + l2x0_base +L2X0_POWER_CTRL ); + } + } + +l2x0_resume (); +} + +static const struct l2c_init_data of_pl310_data__initconst = { + .of_parse = pl310_of_parse, + .save = pl310_save, + .outer_cache = { + .inv_range = l2x0_inv_range, + .clean_range = l2x0_clean_range, + .flush_range = l2x0_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = pl310_resume, + }, +}; +/* * Note that the end addresses passed to Linux primitives are * noninclusive, while the hardware cache range operations use
@@ -562,6 +731,75 @@ static void aurora_flush_range(unsigned long start, unsigned long end) } } +static void aurora_save (void __iomem *base) +{ + l2x0_saved_regs.ctrl =readl_relaxed (base +L2X0_CTRL ); + l2x0_saved_regs.aux_ctrl =readl_relaxed (base +L2X0_AUX_CTRL ); +} + +static void aurora_resume (void ) +{ +if (!(readl (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +writel_relaxed (l2x0_saved_regs.aux_ctrl, + l2x0_base +L2X0_AUX_CTRL ); +writel_relaxed (l2x0_saved_regs.ctrl, l2x0_base +L2X0_CTRL ); + } +} + +static void __init aurora_broadcast_l2_commands (void ) +{ +__u32 u; +/* Enable Broadcasting of cache commands to L2*/ + __asm__ __volatile__("mrc p15, 1, %0, c15, c2, 0" :"=r" (u)); + u |=AURORA_CTRL_FW ;/* Set the FW bit */ + __asm__ __volatile__("mcr p15, 1, %0, c15, c2, 0\n" : :"r" (u)); +isb (); +} + +static void __init aurora_of_parse (const struct device_node *np, +u32 *aux_val,u32 *aux_mask) +{ +u32 val =AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU ; +u32 mask =AURORA_ACR_REPLACEMENT_MASK ; + +of_property_read_u32 (np,"cache-id-part" , + &cache_id_part_number_from_dt); + +/* Determine and save the write policy */ + l2_wt_override =of_property_read_bool (np,"wt-override" ); + +if (l2_wt_override) { + val |=AURORA_ACR_FORCE_WRITE_THRO_POLICY ; + mask |=AURORA_ACR_FORCE_WRITE_POLICY_MASK ; + } + + *aux_val &= ~mask; + *aux_val |= val; + *aux_mask &= ~mask; +} + +static const struct l2c_init_data of_aurora_with_outer_data__initconst = { + .of_parse = aurora_of_parse, + .save = aurora_save, + .outer_cache = { + .inv_range = aurora_inv_range, + .clean_range = aurora_clean_range, + .flush_range = aurora_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = aurora_resume, + }, +}; + +static const struct l2c_init_data of_aurora_no_outer_data__initconst = { + .of_parse = aurora_of_parse, + .save = aurora_save, + .outer_cache = { + .resume = aurora_resume, + }, +}; +/* * For certain Broadcom SoCs, depending on the address range, different offsets * need to be added to the address before passing it to L2 for
@@ -703,108 +941,19 @@ static void bcm_flush_range(unsigned long start, unsigned long end) new_end); } -static void __init l2x0_of_parse (const struct device_node *np, -u32 *aux_val,u32 *aux_mask) -{ -u32 data[2 ] = {0 ,0 }; -u32 tag =0 ; -u32 dirty =0 ; -u32 val =0 , mask =0 ; - -of_property_read_u32 (np,"arm,tag-latency" , &tag); -if (tag) { - mask |=L2X0_AUX_CTRL_TAG_LATENCY_MASK ; - val |= (tag -1 ) <<L2X0_AUX_CTRL_TAG_LATENCY_SHIFT ; - } - -of_property_read_u32_array (np,"arm,data-latency" , - data,ARRAY_SIZE (data)); -if (data[0 ] && data[1 ]) { - mask |=L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK | -L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK ; - val |= ((data[0 ] -1 ) <<L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT ) | - ((data[1 ] -1 ) <<L2X0_AUX_CTRL_DATA_WR_LATENCY_SHIFT ); - } - -of_property_read_u32 (np,"arm,dirty-latency" , &dirty); -if (dirty) { - mask |=L2X0_AUX_CTRL_DIRTY_LATENCY_MASK ; - val |= (dirty -1 ) <<L2X0_AUX_CTRL_DIRTY_LATENCY_SHIFT ; - } - - *aux_val &= ~mask; - *aux_val |= val; - *aux_mask &= ~mask; -} - -static void __init pl310_of_parse (const struct device_node *np, -u32 *aux_val,u32 *aux_mask) -{ -u32 data[3 ] = {0 ,0 ,0 }; -u32 tag[3 ] = {0 ,0 ,0 }; -u32 filter[2 ] = {0 ,0 }; - -of_property_read_u32_array (np,"arm,tag-latency" , tag,ARRAY_SIZE (tag)); -if (tag[0 ] && tag[1 ] && tag[2 ]) -writel_relaxed ( - ((tag[0 ] -1 ) <<L2X0_LATENCY_CTRL_RD_SHIFT ) | - ((tag[1 ] -1 ) <<L2X0_LATENCY_CTRL_WR_SHIFT ) | - ((tag[2 ] -1 ) <<L2X0_LATENCY_CTRL_SETUP_SHIFT ), - l2x0_base +L2X0_TAG_LATENCY_CTRL ); - -of_property_read_u32_array (np,"arm,data-latency" , - data,ARRAY_SIZE (data)); -if (data[0 ] && data[1 ] && data[2 ]) -writel_relaxed ( - ((data[0 ] -1 ) <<L2X0_LATENCY_CTRL_RD_SHIFT ) | - ((data[1 ] -1 ) <<L2X0_LATENCY_CTRL_WR_SHIFT ) | - ((data[2 ] -1 ) <<L2X0_LATENCY_CTRL_SETUP_SHIFT ), - l2x0_base +L2X0_DATA_LATENCY_CTRL ); - -of_property_read_u32_array (np,"arm,filter-ranges" , - filter,ARRAY_SIZE (filter)); -if (filter[1 ]) { -writel_relaxed (ALIGN (filter[0 ] + filter[1 ],SZ_1M ), - l2x0_base +L2X0_ADDR_FILTER_END ); -writel_relaxed ((filter[0 ] & ~(SZ_1M -1 )) |L2X0_ADDR_FILTER_EN , - l2x0_base +L2X0_ADDR_FILTER_START ); - } -} - -static void __init pl310_save (void __iomem *base) -{ -u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; - - l2x0_saved_regs.tag_latency =readl_relaxed (base + -L2X0_TAG_LATENCY_CTRL ); - l2x0_saved_regs.data_latency =readl_relaxed (base + -L2X0_DATA_LATENCY_CTRL ); - l2x0_saved_regs.filter_end =readl_relaxed (base + -L2X0_ADDR_FILTER_END ); - l2x0_saved_regs.filter_start =readl_relaxed (base + -L2X0_ADDR_FILTER_START ); - -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { -/* -* From r2p0, there is Prefetch offset/control register -*/ - l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base + -L2X0_PREFETCH_CTRL ); -/* -* From r3p0, there is Power control register -*/ -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) - l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + -L2X0_POWER_CTRL ); - } -} - -static void aurora_save (void __iomem *base) -{ - l2x0_saved_regs.ctrl =readl_relaxed (base +L2X0_CTRL ); - l2x0_saved_regs.aux_ctrl =readl_relaxed (base +L2X0_AUX_CTRL ); -} +static const struct l2c_init_data of_bcm_l2x0_data__initconst = { + .of_parse = pl310_of_parse, + .save = pl310_save, + .outer_cache = { + .inv_range = bcm_inv_range, + .clean_range = bcm_clean_range, + .flush_range = bcm_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + .resume = pl310_resume, + }, +};static void __init tauros3_save (void __iomem *base) {
@@ -814,60 +963,6 @@ static void __init tauros3_save(void __iomem *base)readl_relaxed (base +L2X0_PREFETCH_CTRL ); } -static void l2x0_resume (void ) -{ -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* restore aux ctrl and enable l2 */ -l2x0_unlock (readl_relaxed (l2x0_base +L2X0_CACHE_ID )); - -writel_relaxed (l2x0_saved_regs.aux_ctrl, l2x0_base + -L2X0_AUX_CTRL ); - -l2x0_inv_all (); - -writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); - } -} - -static void pl310_resume (void ) -{ -u32 l2x0_revision; - -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* restore pl310 setup */ -writel_relaxed (l2x0_saved_regs.tag_latency, - l2x0_base +L2X0_TAG_LATENCY_CTRL ); -writel_relaxed (l2x0_saved_regs.data_latency, - l2x0_base +L2X0_DATA_LATENCY_CTRL ); -writel_relaxed (l2x0_saved_regs.filter_end, - l2x0_base +L2X0_ADDR_FILTER_END ); -writel_relaxed (l2x0_saved_regs.filter_start, - l2x0_base +L2X0_ADDR_FILTER_START ); - - l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; - -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { -writel_relaxed (l2x0_saved_regs.prefetch_ctrl, - l2x0_base +L2X0_PREFETCH_CTRL ); -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) -writel_relaxed (l2x0_saved_regs.pwr_ctrl, - l2x0_base +L2X0_POWER_CTRL ); - } - } - -l2x0_resume (); -} - -static void aurora_resume (void ) -{ -if (!(readl (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -writel_relaxed (l2x0_saved_regs.aux_ctrl, - l2x0_base +L2X0_AUX_CTRL ); -writel_relaxed (l2x0_saved_regs.ctrl, l2x0_base +L2X0_CTRL ); - } -} -static void tauros3_resume (void ) {if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) {
@@ -880,87 +975,6 @@ static void tauros3_resume(void)l2x0_resume (); } -static void __init aurora_broadcast_l2_commands (void ) -{ -__u32 u; -/* Enable Broadcasting of cache commands to L2*/ - __asm__ __volatile__("mrc p15, 1, %0, c15, c2, 0" :"=r" (u)); - u |=AURORA_CTRL_FW ;/* Set the FW bit */ - __asm__ __volatile__("mcr p15, 1, %0, c15, c2, 0\n" : :"r" (u)); -isb (); -} - -static void __init aurora_of_parse (const struct device_node *np, -u32 *aux_val,u32 *aux_mask) -{ -u32 val =AURORA_ACR_REPLACEMENT_TYPE_SEMIPLRU ; -u32 mask =AURORA_ACR_REPLACEMENT_MASK ; - -of_property_read_u32 (np,"cache-id-part" , - &cache_id_part_number_from_dt); - -/* Determine and save the write policy */ - l2_wt_override =of_property_read_bool (np,"wt-override" ); - -if (l2_wt_override) { - val |=AURORA_ACR_FORCE_WRITE_THRO_POLICY ; - mask |=AURORA_ACR_FORCE_WRITE_POLICY_MASK ; - } - - *aux_val &= ~mask; - *aux_val |= val; - *aux_mask &= ~mask; -} - -static const struct l2c_init_data of_pl310_data__initconst = { - .of_parse = pl310_of_parse, - .save = pl310_save, - .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = pl310_resume, - }, -}; - -static const struct l2c_init_data of_l2x0_data__initconst = { - .of_parse = l2x0_of_parse, - .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = l2x0_resume, - }, -}; - -static const struct l2c_init_data of_aurora_with_outer_data__initconst = { - .of_parse = aurora_of_parse, - .save = aurora_save, - .outer_cache = { - .inv_range = aurora_inv_range, - .clean_range = aurora_clean_range, - .flush_range = aurora_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = aurora_resume, - }, -}; - -static const struct l2c_init_data of_aurora_no_outer_data__initconst = { - .of_parse = aurora_of_parse, - .save = aurora_save, - .outer_cache = { - .resume = aurora_resume, - }, -}; -static const struct l2c_init_data of_tauros3_data__initconst = { .save = tauros3_save,/* Tauros3 broadcasts L1 cache operations to L2 */
@@ -969,20 +983,6 @@ static const struct l2c_init_data of_tauros3_data __initconst = { }, }; -static const struct l2c_init_data of_bcm_l2x0_data__initconst = { - .of_parse = pl310_of_parse, - .save = pl310_save, - .outer_cache = { - .inv_range = bcm_inv_range, - .clean_range = bcm_clean_range, - .flush_range = bcm_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = pl310_resume, - }, -}; -#define L2C_ID (name, fns) { .compatible = name, .data = (void *)&fns }static const struct of_device_id l2x0_ids[]__initconst = {L2C_ID ("arm,l210-cache" , of_l2x0_data),
Signature · 1 line
1.8.3.1
PATCH 20/97 ARM: l2c: provide enable method
In reply to Russell King - ARM LinuxProviding an enable method gives L2 cache controllers a chance to do special handling at enable time. This allows us to remove a hack in l2x0_unlock() for Marvell Aurora L2 caches.
--- arch/arm/mm/cache-l2x0.c | 80 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 18 deletions(-)
arch/arm/mm/cache-l2x0.c +62 -18
@@ -29,7 +29,9 @@#include "cache-aurora-l2.h" struct l2c_init_data { +unsigned num_lock;void (*of_parse)(const struct device_node *,u32 *,u32 *); +void (*enable)(void __iomem *,u32 ,unsigned );void (*save)(void __iomem *);struct outer_cache_fns outer_cache; };
@@ -82,6 +84,36 @@ static inline void l2c_unlock(void __iomem *base, unsigned num) } } +/* +* Enable the L2 cache controller. This function must only be +* called when the cache controller is known to be disabled. +*/ +static void l2c_enable (void __iomem *base,u32 aux,unsigned num_lock) +{ +unsigned long flags; + +l2c_unlock (base, num_lock); + +writel_relaxed (aux, base +L2X0_AUX_CTRL ); + +local_irq_save (flags); +__l2c_op_way (base +L2X0_INV_WAY ); +writel_relaxed (0 , base + sync_reg_offset); +l2c_wait_mask (base + sync_reg_offset,1 ); +local_irq_restore (flags); + +writel_relaxed (L2X0_CTRL_EN , base +L2X0_CTRL ); +} + +static void l2c_disable (void ) +{ +void __iomem *base = l2x0_base; + + outer_cache.flush_all (); +writel_relaxed (0 , base +L2X0_CTRL ); +dsb (st); +} +#ifdef CONFIG_CACHE_PL310 static inline void cache_wait (void __iomem *reg,unsigned long mask) {
@@ -325,9 +357,6 @@ static void l2x0_unlock(u32 cache_id)case L2X0_CACHE_ID_PART_L310 : lockregs =8 ;break ; -case AURORA_CACHE_ID : - lockregs =4 ; -break ;default :/* L210 and unknown types */ lockregs =1 ;
@@ -337,7 +366,22 @@ static void l2x0_unlock(u32 cache_id)l2c_unlock (l2x0_base, lockregs); } +static void l2x0_enable (void __iomem *base,u32 aux,unsigned num_lock) +{ +/* Make sure that I&D is not locked down when starting */ +l2x0_unlock (readl_relaxed (base +L2X0_CACHE_ID )); + +/* l2x0 controller is disabled */ +writel_relaxed (aux, base +L2X0_AUX_CTRL ); + +l2x0_inv_all (); + +/* enable L2X0 */ +writel_relaxed (L2X0_CTRL_EN , base +L2X0_CTRL ); +} +static const struct l2c_init_data l2x0_init_fns__initconst = { + .enable = l2x0_enable, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -412,22 +456,11 @@ static void __init __l2c_init(const struct l2c_init_data *data, l2x0_size = ways * way_size *SZ_1K ;/* -* Check if l2x0 controller is already enabled. -* If you are booting from non-secure mode -* accessing the below registers will fault. +* Check if l2x0 controller is already enabled. If we are booting +* in non-secure mode accessing the below registers will fault. */ -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* Make sure that I&D is not locked down when starting */ -l2x0_unlock (cache_id); - -/* l2x0 controller is disabled */ -writel_relaxed (aux, l2x0_base +L2X0_AUX_CTRL ); - -l2x0_inv_all (); - -/* enable L2X0 */ -writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); - } +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) + data->enable (l2x0_base, aux, data->num_lock);/* Re-read it in case some bits are reserved. */ aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL );
@@ -515,6 +548,7 @@ static void l2x0_resume(void)static const struct l2c_init_data of_l2x0_data__initconst = { .of_parse = l2x0_of_parse, + .enable = l2x0_enable, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -620,7 +654,9 @@ static void pl310_resume(void) }static const struct l2c_init_data of_pl310_data__initconst = { + .num_lock =8 , .of_parse = pl310_of_parse, + .enable = l2c_enable, .save = pl310_save, .outer_cache = { .inv_range = l2x0_inv_range,
@@ -779,7 +815,9 @@ static void __init aurora_of_parse(const struct device_node *np, }static const struct l2c_init_data of_aurora_with_outer_data__initconst = { + .num_lock =4 , .of_parse = aurora_of_parse, + .enable = l2c_enable, .save = aurora_save, .outer_cache = { .inv_range = aurora_inv_range,
@@ -793,7 +831,9 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = { };static const struct l2c_init_data of_aurora_no_outer_data__initconst = { + .num_lock =4 , .of_parse = aurora_of_parse, + .enable = l2c_enable, .save = aurora_save, .outer_cache = { .resume = aurora_resume,
@@ -942,7 +982,9 @@ static void bcm_flush_range(unsigned long start, unsigned long end) }static const struct l2c_init_data of_bcm_l2x0_data__initconst = { + .num_lock =8 , .of_parse = pl310_of_parse, + .enable = l2c_enable, .save = pl310_save, .outer_cache = { .inv_range = bcm_inv_range,
@@ -976,6 +1018,8 @@ static void tauros3_resume(void) }static const struct l2c_init_data of_tauros3_data__initconst = { + .num_lock =8 , + .enable = l2c_enable, .save = tauros3_save,/* Tauros3 broadcasts L1 cache operations to L2 */ .outer_cache = {
Signature · 1 line
1.8.3.1
PATCH 21/97 ARM: l2c: write auxctrl register before unlocking
In reply to Russell King - ARM LinuxWe should write the auxillary control register before unlocking: the write may be necessary to enable non-secure access to the lock registers.
--- arch/arm/mm/cache-l2x0.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/mm/cache-l2x0.c +5 -5
@@ -92,10 +92,10 @@ static void l2c_enable(void __iomem *base, u32 aux, unsigned num_lock) {unsigned long flags; -l2c_unlock (base, num_lock); -writel_relaxed (aux, base +L2X0_AUX_CTRL ); +l2c_unlock (base, num_lock); +local_irq_save (flags);__l2c_op_way (base +L2X0_INV_WAY );writel_relaxed (0 , base + sync_reg_offset);
@@ -368,12 +368,12 @@ static void l2x0_unlock(u32 cache_id)static void l2x0_enable (void __iomem *base,u32 aux,unsigned num_lock) { -/* Make sure that I&D is not locked down when starting */ -l2x0_unlock (readl_relaxed (base +L2X0_CACHE_ID )); -/* l2x0 controller is disabled */ writel_relaxed (aux, base +L2X0_AUX_CTRL ); +/* Make sure that I&D is not locked down when starting */ +l2x0_unlock (readl_relaxed (base +L2X0_CACHE_ID )); +l2x0_inv_all ();/* enable L2X0 */
Signature · 1 line
1.8.3.1
PATCH 22/97 ARM: l2c: only write the auxiliary control register if required
In reply to Russell King - ARM LinuxAvoid unnecessary writes to the auxiliary control register if the register already contains the required value. This allows us to avoid invoking the platforms secure monitor code unnecessarily.
--- arch/arm/mm/cache-l2x0.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/mm/cache-l2x0.c +3 -1
@@ -92,7 +92,9 @@ static void l2c_enable(void __iomem *base, u32 aux, unsigned num_lock) {unsigned long flags; -writel_relaxed (aux, base +L2X0_AUX_CTRL ); +/* Only write the aux register if it needs changing */ +if (readl_relaxed (base +L2X0_AUX_CTRL ) != aux) +writel_relaxed (aux, base +L2X0_AUX_CTRL );l2c_unlock (base, num_lock);
Signature · 1 line
1.8.3.1
PATCH 23/97 ARM: l2c: move aurora broadcast setup to enable function
In reply to Russell King - ARM LinuxRather than having this hacked into the OF initialiation function, we can handle this via the enable function instead. While here, clean up that code and comments a little.
--- arch/arm/mm/cache-l2x0.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-)
arch/arm/mm/cache-l2x0.c +15 -13
@@ -784,14 +784,22 @@ static void aurora_resume(void) } } -static void __init aurora_broadcast_l2_commands (void ) +/* +* For Aurora cache in no outer mode, enable via the CP15 coprocessor +* broadcasting of cache commands to L2. +*/ +static void __init aurora_enable_no_outer (void __iomem *base,u32 aux, +unsigned num_lock) { -__u32 u; -/* Enable Broadcasting of cache commands to L2*/ - __asm__ __volatile__("mrc p15, 1, %0, c15, c2, 0" :"=r" (u)); +u32 u; + + asmvolatile ("mrc p15, 1, %0, c15, c2, 0" :"=r" (u)); u |=AURORA_CTRL_FW ;/* Set the FW bit */ - __asm__ __volatile__("mcr p15, 1, %0, c15, c2, 0\n" : :"r" (u)); + asmvolatile ("mcr p15, 1, %0, c15, c2, 0" : :"r" (u)); +isb (); + +l2c_enable (base, aux, num_lock); } static void __init aurora_of_parse(const struct device_node *np,
@@ -835,7 +843,7 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = {static const struct l2c_init_data of_aurora_no_outer_data__initconst = { .num_lock =4 , .of_parse = aurora_of_parse, - .enable = l2c_enable, + .enable = aurora_enable_no_outer, .save = aurora_save, .outer_cache = { .resume = aurora_resume,
@@ -1066,16 +1074,10 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) data =of_match_node (l2x0_ids, np)->data;/* L2 configuration can only be changed if the cache is disabled */ -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN ))if (data->of_parse) data->of_parse (np, &aux_val, &aux_mask); -/* For aurora cache in no outer mode select the -* correct mode using the coprocessor*/ -if (data == &of_aurora_no_outer_data) -aurora_broadcast_l2_commands (); - } -if (cache_id_part_number_from_dt) cache_id = cache_id_part_number_from_dt;else
Signature · 1 line
1.8.3.1
PATCH 24/97 ARM: l2c: implement fixups for L2 cache controller quirks/errata
In reply to Russell King - ARM LinuxRather than putting quirk handling in __l2c_init(), move it out to a separate function which individual implementations can specify. This helps to localise the quirks to those implementations which require them.
--- arch/arm/mm/cache-l2x0.c | 112 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 101 insertions(+), 11 deletions(-)
arch/arm/mm/cache-l2x0.c +101 -11
@@ -32,6 +32,7 @@ struct l2c_init_data {unsigned num_lock;void (*of_parse)(const struct device_node *,u32 *,u32 *);void (*enable)(void __iomem *,u32 ,unsigned ); +void (*fixup)(void __iomem *,u32 ,struct outer_cache_fns *);void (*save)(void __iomem *);struct outer_cache_fns outer_cache; };
@@ -394,9 +395,80 @@ static const struct l2c_init_data l2x0_init_fns __initconst = { }, }; +/* +* L2C-310 specific code. +* +* Errata: +* 588369: PL310 R0P0->R1P0, fixed R2P0. +* Affects: all clean+invalidate operations +* clean and invalidate skips the invalidate step, so we need to issue +* separate operations. We also require the above debug workaround +* enclosing this code fragment on affected parts. On unaffected parts, +* we must not use this workaround without the debug register writes +* to avoid exposing a problem similar to 727915. +* +* 727915: PL310 R2P0->R3P0, fixed R3P1. +* Affects: clean+invalidate by way +* clean and invalidate by way runs in the background, and a store can +* hit the line between the clean operation and invalidate operation, +* resulting in the store being lost. +* +* 753970: PL310 R3P0, fixed R3P1. +* Affects: sync +* prevents merging writes after the sync operation, until another L2C +* operation is performed (or a number of other conditions.) +* +* 769419: PL310 R0P0->R3P1, fixed R3P2. +* Affects: store buffer +* store buffer is not automatically drained. +*/ +static void __init l2c310_fixup (void __iomem *base,u32 cache_id, +struct outer_cache_fns *fns) +{ +unsigned revision = cache_id &L2X0_CACHE_ID_RTL_MASK ; +const char *errata[4 ]; +unsigned n =0 ; + +if (revision <=L310_CACHE_ID_RTL_R3P0 ) + fns->set_debug = pl310_set_debug; + +if (IS_ENABLED (CONFIG_PL310_ERRATA_753970 ) && + revision ==L310_CACHE_ID_RTL_R3P0 ) { + sync_reg_offset =L2X0_DUMMY_REG ; + errata[n++] ="753970" ; + } + +if (IS_ENABLED (CONFIG_PL310_ERRATA_769419 )) + errata[n++] ="769419" ; + +if (n) { +unsigned i; + +pr_info ("L2C-310 errat%s" , n >1 ?"a" :"um" ); +for (i =0 ; i < n; i++) +pr_cont (" %s" , errata[i]); +pr_cont (" enabled\n" ); + } +} + +static const struct l2c_init_data l2c310_init_fns__initconst = { + .num_lock =8 , + .enable = l2c_enable, + .fixup = l2c310_fixup, + .outer_cache = { + .inv_range = l2x0_inv_range, + .clean_range = l2x0_clean_range, + .flush_range = l2x0_flush_range, + .flush_all = l2x0_flush_all, + .disable = l2x0_disable, + .sync = l2x0_cache_sync, + }, +}; +static void __init __l2c_init (const struct l2c_init_data *data,u32 aux_val,u32 aux_mask,u32 cache_id) { +struct outer_cache_fns fns;u32 aux;u32 way_size =0 ;int ways;
@@ -423,23 +495,20 @@ static void __init __l2c_init(const struct l2c_init_data *data,else ways =8 ; type ="L310" ; -#ifdef CONFIG_PL310_ERRATA_753970 -/* Unmapped register. */ - sync_reg_offset =L2X0_DUMMY_REG ; -#endif break ; +case L2X0_CACHE_ID_PART_L210 : ways = (aux >>13 ) &0xf ; type ="L210" ;break ;case AURORA_CACHE_ID : - sync_reg_offset =AURORA_SYNC_REG ; ways = (aux >>13 ) &0xf ; ways =2 << ((ways +1 ) >>2 ); way_size_shift =AURORA_WAY_SIZE_SHIFT ; type ="Aurora" ;break ; +default :/* Assume unknown chips have 8 ways */ ways =8 ;
@@ -457,6 +526,10 @@ static void __init __l2c_init(const struct l2c_init_data *data, l2x0_size = ways * way_size *SZ_1K ; + fns = data->outer_cache; +if (data->fixup) + data->fixup (l2x0_base, cache_id, &fns); +/* * Check if l2x0 controller is already enabled. If we are booting * in non-secure mode accessing the below registers will fault.
@@ -470,11 +543,7 @@ static void __init __l2c_init(const struct l2c_init_data *data,/* Save the value for resuming. */ l2x0_saved_regs.aux_ctrl = aux; - outer_cache = data->outer_cache; - -if ((cache_id &L2X0_CACHE_ID_PART_MASK ) ==L2X0_CACHE_ID_PART_L310 && - (cache_id &L2X0_CACHE_ID_RTL_MASK ) <=L310_CACHE_ID_RTL_R3P0 ) - outer_cache.set_debug = pl310_set_debug; + outer_cache = fns;pr_info ("%s cache controller enabled\n" , type); pr_info("l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d kB\n",
@@ -483,13 +552,24 @@ static void __init __l2c_init(const struct l2c_init_data *data,void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask) { +const struct l2c_init_data *data;u32 cache_id; l2x0_base = base; cache_id =readl_relaxed (base +L2X0_CACHE_ID ); -__l2c_init (&l2x0_init_fns, aux_val, aux_mask, cache_id); +switch (cache_id &L2X0_CACHE_ID_PART_MASK ) { +default : + data = &l2x0_init_fns; +break ; + +case L2X0_CACHE_ID_PART_L310 : + data = &l2c310_init_fns; +break ; + } + +__l2c_init (data, aux_val, aux_mask, cache_id); }#ifdef CONFIG_OF
@@ -659,6 +739,7 @@ static const struct l2c_init_data of_pl310_data __initconst = { .num_lock = 8, .of_parse = pl310_of_parse, .enable = l2c_enable, + .fixup = l2c310_fixup, .save = pl310_save, .outer_cache = { .inv_range = l2x0_inv_range,
@@ -802,6 +883,12 @@ static void __init aurora_enable_no_outer(void __iomem *base, u32 aux,l2c_enable (base, aux, num_lock); } +static void __init aurora_fixup (void __iomem *base,u32 cache_id, +struct outer_cache_fns *fns) +{ + sync_reg_offset =AURORA_SYNC_REG ; +} +static void __init aurora_of_parse (const struct device_node *np,u32 *aux_val,u32 *aux_mask) {
@@ -828,6 +915,7 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = { .num_lock = 4, .of_parse = aurora_of_parse, .enable = l2c_enable, + .fixup = aurora_fixup, .save = aurora_save, .outer_cache = { .inv_range = aurora_inv_range,
@@ -844,6 +932,7 @@ static const struct l2c_init_data of_aurora_no_outer_data __initconst = { .num_lock = 4, .of_parse = aurora_of_parse, .enable = aurora_enable_no_outer, + .fixup = aurora_fixup, .save = aurora_save, .outer_cache = { .resume = aurora_resume,
@@ -995,6 +1084,7 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = { .num_lock = 8, .of_parse = pl310_of_parse, .enable = l2c_enable, + .fixup = l2c310_fixup, .save = pl310_save, .outer_cache = { .inv_range = bcm_inv_range,
Signature · 1 line
1.8.3.1
PATCH 25/97 ARM: l2c: clean up L2 cache initialisation messages
In reply to Russell King - ARM LinuxMake one of them purely "English", and the other purely technical.
--- arch/arm/mm/cache-l2x0.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
arch/arm/mm/cache-l2x0.c +4 -3
@@ -545,9 +545,10 @@ static void __init __l2c_init(const struct l2c_init_data *data, outer_cache = fns; -pr_info ("%s cache controller enabled\n" , type); -pr_info ("l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d kB\n" , - ways, cache_id, aux, l2x0_size >>10 ); +pr_info ("%s cache controller enabled, %d ways, %d kB\n" , + type, ways, l2x0_size >>10 ); +pr_info ("%s: CACHE_ID 0x%08x, AUX_CTRL 0x%08x\n" , + type, cache_id, aux); }void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask)
Signature · 1 line
1.8.3.1
PATCH 26/97 ARM: l2c: move and add ARM L2C-2x0/L2C-310 save/resume code to non-OF
In reply to Russell King - ARM LinuxAdd the save/resume code hooks to the non-OF implementations as well. There's no reason for the non-OF implementations to be any different from the OF implementations.
--- arch/arm/mm/cache-l2x0.c | 151 ++++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 74 deletions(-)
arch/arm/mm/cache-l2x0.c +77 -74
@@ -383,6 +383,21 @@ static void l2x0_enable(void __iomem *base, u32 aux, unsigned num_lock)writel_relaxed (L2X0_CTRL_EN , base +L2X0_CTRL ); } +static void l2x0_resume (void ) +{ +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +/* restore aux ctrl and enable l2 */ +l2x0_unlock (readl_relaxed (l2x0_base +L2X0_CACHE_ID )); + +writel_relaxed (l2x0_saved_regs.aux_ctrl, l2x0_base + +L2X0_AUX_CTRL ); + +l2x0_inv_all (); + +writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); + } +} +static const struct l2c_init_data l2x0_init_fns__initconst = { .enable = l2x0_enable, .outer_cache = {
@@ -392,6 +407,7 @@ static const struct l2c_init_data l2x0_init_fns __initconst = { .flush_all = l2x0_flush_all, .disable = l2x0_disable, .sync = l2x0_cache_sync, + .resume = l2x0_resume, }, };
@@ -422,6 +438,65 @@ static const struct l2c_init_data l2x0_init_fns __initconst = {* Affects: store buffer * store buffer is not automatically drained. */ +static void __init pl310_save (void __iomem *base) +{ +u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; + + l2x0_saved_regs.tag_latency =readl_relaxed (base + +L2X0_TAG_LATENCY_CTRL ); + l2x0_saved_regs.data_latency =readl_relaxed (base + +L2X0_DATA_LATENCY_CTRL ); + l2x0_saved_regs.filter_end =readl_relaxed (base + +L2X0_ADDR_FILTER_END ); + l2x0_saved_regs.filter_start =readl_relaxed (base + +L2X0_ADDR_FILTER_START ); + +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { +/* +* From r2p0, there is Prefetch offset/control register +*/ + l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base + +L2X0_PREFETCH_CTRL ); +/* +* From r3p0, there is Power control register +*/ +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) + l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + +L2X0_POWER_CTRL ); + } +} + +static void pl310_resume (void ) +{ +u32 l2x0_revision; + +if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +/* restore pl310 setup */ +writel_relaxed (l2x0_saved_regs.tag_latency, + l2x0_base +L2X0_TAG_LATENCY_CTRL ); +writel_relaxed (l2x0_saved_regs.data_latency, + l2x0_base +L2X0_DATA_LATENCY_CTRL ); +writel_relaxed (l2x0_saved_regs.filter_end, + l2x0_base +L2X0_ADDR_FILTER_END ); +writel_relaxed (l2x0_saved_regs.filter_start, + l2x0_base +L2X0_ADDR_FILTER_START ); + + l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; + +if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { +writel_relaxed (l2x0_saved_regs.prefetch_ctrl, + l2x0_base +L2X0_PREFETCH_CTRL ); +if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) +writel_relaxed (l2x0_saved_regs.pwr_ctrl, + l2x0_base +L2X0_POWER_CTRL ); + } + } + +l2x0_resume (); +} +static void __init l2c310_fixup (void __iomem *base,u32 cache_id,struct outer_cache_fns *fns) {
@@ -455,6 +530,7 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .num_lock = 8, .enable = l2c_enable, .fixup = l2c310_fixup, + .save = pl310_save, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -462,6 +538,7 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .flush_all = l2x0_flush_all, .disable = l2x0_disable, .sync = l2x0_cache_sync, + .resume = pl310_resume, }, };
@@ -614,21 +691,6 @@ static void __init l2x0_of_parse(const struct device_node *np, *aux_mask &= ~mask; } -static void l2x0_resume (void ) -{ -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* restore aux ctrl and enable l2 */ -l2x0_unlock (readl_relaxed (l2x0_base +L2X0_CACHE_ID )); - -writel_relaxed (l2x0_saved_regs.aux_ctrl, l2x0_base + -L2X0_AUX_CTRL ); - -l2x0_inv_all (); - -writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); - } -} -static const struct l2c_init_data of_l2x0_data__initconst = { .of_parse = l2x0_of_parse, .enable = l2x0_enable,
@@ -677,65 +739,6 @@ static void __init pl310_of_parse(const struct device_node *np, } } -static void __init pl310_save (void __iomem *base) -{ -u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; - - l2x0_saved_regs.tag_latency =readl_relaxed (base + -L2X0_TAG_LATENCY_CTRL ); - l2x0_saved_regs.data_latency =readl_relaxed (base + -L2X0_DATA_LATENCY_CTRL ); - l2x0_saved_regs.filter_end =readl_relaxed (base + -L2X0_ADDR_FILTER_END ); - l2x0_saved_regs.filter_start =readl_relaxed (base + -L2X0_ADDR_FILTER_START ); - -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { -/* -* From r2p0, there is Prefetch offset/control register -*/ - l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base + -L2X0_PREFETCH_CTRL ); -/* -* From r3p0, there is Power control register -*/ -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) - l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + -L2X0_POWER_CTRL ); - } -} - -static void pl310_resume (void ) -{ -u32 l2x0_revision; - -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* restore pl310 setup */ -writel_relaxed (l2x0_saved_regs.tag_latency, - l2x0_base +L2X0_TAG_LATENCY_CTRL ); -writel_relaxed (l2x0_saved_regs.data_latency, - l2x0_base +L2X0_DATA_LATENCY_CTRL ); -writel_relaxed (l2x0_saved_regs.filter_end, - l2x0_base +L2X0_ADDR_FILTER_END ); -writel_relaxed (l2x0_saved_regs.filter_start, - l2x0_base +L2X0_ADDR_FILTER_START ); - - l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; - -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { -writel_relaxed (l2x0_saved_regs.prefetch_ctrl, - l2x0_base +L2X0_PREFETCH_CTRL ); -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) -writel_relaxed (l2x0_saved_regs.pwr_ctrl, - l2x0_base +L2X0_POWER_CTRL ); - } - } - -l2x0_resume (); -} -static const struct l2c_init_data of_pl310_data__initconst = { .num_lock =8 , .of_parse = pl310_of_parse,
Signature · 1 line
1.8.3.1
PATCH 27/97 ARM: l2c: clean up save/resume functions
In reply to Russell King - ARM LinuxRename the pl310 save/resume functions to have a l2c310 prefix - this is it's official name. Use a local cached copy of the l2x0_base virtual address, and also realise that many of the resume function tails are the same as the enable functions, so make a call to the enable function instead of duplicating that code.
--- arch/arm/mm/cache-l2x0.c | 109 ++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 57 deletions(-)
arch/arm/mm/cache-l2x0.c +52 -57
@@ -385,17 +385,10 @@ static void l2x0_enable(void __iomem *base, u32 aux, unsigned num_lock)static void l2x0_resume (void ) { -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -/* restore aux ctrl and enable l2 */ -l2x0_unlock (readl_relaxed (l2x0_base +L2X0_CACHE_ID )); - -writel_relaxed (l2x0_saved_regs.aux_ctrl, l2x0_base + -L2X0_AUX_CTRL ); - -l2x0_inv_all (); +void __iomem *base = l2x0_base; -writel_relaxed (L2X0_CTRL_EN , l2x0_base +L2X0_CTRL ); - } +if (!(readl_relaxed (base +L2X0_CTRL ) &L2X0_CTRL_EN )) +l2x0_enable (base, l2x0_saved_regs.aux_ctrl,0 ); }static const struct l2c_init_data l2x0_init_fns__initconst = {
@@ -438,10 +431,9 @@ static const struct l2c_init_data l2x0_init_fns __initconst = {* Affects: store buffer * store buffer is not automatically drained. */ -static void __init pl310_save (void __iomem *base) +static void __init l2c310_save (void __iomem *base) { -u32 l2x0_revision =readl_relaxed (base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; +unsigned revision; l2x0_saved_regs.tag_latency =readl_relaxed (base +L2X0_TAG_LATENCY_CTRL );
@@ -452,49 +444,49 @@ static void __init pl310_save(void __iomem *base) l2x0_saved_regs.filter_start =readl_relaxed (base +L2X0_ADDR_FILTER_START ); -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { -/* -* From r2p0, there is Prefetch offset/control register -*/ + revision =readl_relaxed (base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; + +/* From r2p0, there is Prefetch offset/control register */ +if (revision >=L310_CACHE_ID_RTL_R2P0 ) l2x0_saved_regs.prefetch_ctrl =readl_relaxed (base + -L2X0_PREFETCH_CTRL ); -/* -* From r3p0, there is Power control register -*/ -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) - l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + -L2X0_POWER_CTRL ); - } +L2X0_PREFETCH_CTRL ); + +/* From r3p0, there is Power control register */ +if (revision >=L310_CACHE_ID_RTL_R3P0 ) + l2x0_saved_regs.pwr_ctrl =readl_relaxed (base + +L2X0_POWER_CTRL ); } -static void pl310_resume (void ) +static void l2c310_resume (void ) { -u32 l2x0_revision; +void __iomem *base = l2x0_base; + +if (!(readl_relaxed (base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +unsigned revision; -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) {/* restore pl310 setup */ writel_relaxed (l2x0_saved_regs.tag_latency, - l2x0_base +L2X0_TAG_LATENCY_CTRL ); + base +L2X0_TAG_LATENCY_CTRL );writel_relaxed (l2x0_saved_regs.data_latency, - l2x0_base +L2X0_DATA_LATENCY_CTRL ); + base +L2X0_DATA_LATENCY_CTRL );writel_relaxed (l2x0_saved_regs.filter_end, - l2x0_base +L2X0_ADDR_FILTER_END ); + base +L2X0_ADDR_FILTER_END );writel_relaxed (l2x0_saved_regs.filter_start, - l2x0_base +L2X0_ADDR_FILTER_START ); + base +L2X0_ADDR_FILTER_START ); - l2x0_revision =readl_relaxed (l2x0_base +L2X0_CACHE_ID ) & -L2X0_CACHE_ID_RTL_MASK ; + revision =readl_relaxed (base +L2X0_CACHE_ID ) & +L2X0_CACHE_ID_RTL_MASK ; -if (l2x0_revision >=L310_CACHE_ID_RTL_R2P0 ) { +if (revision >=L310_CACHE_ID_RTL_R2P0 )writel_relaxed (l2x0_saved_regs.prefetch_ctrl, - l2x0_base +L2X0_PREFETCH_CTRL ); -if (l2x0_revision >=L310_CACHE_ID_RTL_R3P0 ) -writel_relaxed (l2x0_saved_regs.pwr_ctrl, - l2x0_base +L2X0_POWER_CTRL ); - } - } + base +L2X0_PREFETCH_CTRL ); +if (revision >=L310_CACHE_ID_RTL_R3P0 ) +writel_relaxed (l2x0_saved_regs.pwr_ctrl, + base +L2X0_POWER_CTRL ); -l2x0_resume (); +l2c_enable (base, l2x0_saved_regs.aux_ctrl,8 ); + } } static void __init l2c310_fixup(void __iomem *base, u32 cache_id,
@@ -530,7 +522,7 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .num_lock = 8, .enable = l2c_enable, .fixup = l2c310_fixup, - .save = pl310_save, + .save = l2c310_save, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -538,7 +530,7 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .flush_all = l2x0_flush_all, .disable = l2x0_disable, .sync = l2x0_cache_sync, - .resume = pl310_resume, + .resume = l2c310_resume, }, };
@@ -744,7 +736,7 @@ static const struct l2c_init_data of_pl310_data __initconst = { .of_parse = pl310_of_parse, .enable = l2c_enable, .fixup = l2c310_fixup, - .save = pl310_save, + .save = l2c310_save, .outer_cache = { .inv_range = l2x0_inv_range, .clean_range = l2x0_clean_range,
@@ -752,7 +744,7 @@ static const struct l2c_init_data of_pl310_data __initconst = { .flush_all = l2x0_flush_all, .disable = l2x0_disable, .sync = l2x0_cache_sync, - .resume = pl310_resume, + .resume = l2c310_resume, }, };
@@ -862,10 +854,11 @@ static void aurora_save(void __iomem *base)static void aurora_resume (void ) { -if (!(readl (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { -writel_relaxed (l2x0_saved_regs.aux_ctrl, - l2x0_base +L2X0_AUX_CTRL ); -writel_relaxed (l2x0_saved_regs.ctrl, l2x0_base +L2X0_CTRL ); +void __iomem *base = l2x0_base; + +if (!(readl (base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +writel_relaxed (l2x0_saved_regs.aux_ctrl, base +L2X0_AUX_CTRL ); +writel_relaxed (l2x0_saved_regs.ctrl, base +L2X0_CTRL ); } }
@@ -1089,7 +1082,7 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = { .of_parse = pl310_of_parse, .enable = l2c_enable, .fixup = l2c310_fixup, - .save = pl310_save, + .save = l2c310_save, .outer_cache = { .inv_range = bcm_inv_range, .clean_range = bcm_clean_range,
@@ -1097,7 +1090,7 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = { .flush_all = l2x0_flush_all, .disable = l2x0_disable, .sync = l2x0_cache_sync, - .resume = pl310_resume, + .resume = l2c310_resume, }, };
@@ -1111,14 +1104,16 @@ static void __init tauros3_save(void __iomem *base)static void tauros3_resume (void ) { -if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) { +void __iomem *base = l2x0_base; + +if (!(readl_relaxed (base +L2X0_CTRL ) &L2X0_CTRL_EN )) {writel_relaxed (l2x0_saved_regs.aux2_ctrl, - l2x0_base +TAUROS3_AUX2_CTRL ); + base +TAUROS3_AUX2_CTRL );writel_relaxed (l2x0_saved_regs.prefetch_ctrl, - l2x0_base +L2X0_PREFETCH_CTRL ); - } + base +L2X0_PREFETCH_CTRL ); -l2x0_resume (); +l2c_enable (base, l2x0_saved_regs.aux_ctrl,8 ); + } }static const struct l2c_init_data of_tauros3_data__initconst = {
Signature · 1 line
1.8.3.1
PATCH 28/97 ARM: l2c: simplify l2x0 unlocking code
In reply to Russell King - ARM LinuxThe l2x0 unlocking code is only called from l2x0_enable() now, so move the logic entirely into that function and simplify it.
--- arch/arm/mm/cache-l2x0.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-)
arch/arm/mm/cache-l2x0.c +8 -17
@@ -352,30 +352,21 @@ static void l2x0_disable(void)raw_spin_unlock_irqrestore (&l2x0_lock, flags); } -static void l2x0_unlock (u32 cache_id) +static void l2x0_enable (void __iomem *base,u32 aux,unsigned num_lock) { -int lockregs; +unsigned id; -switch (cache_id &L2X0_CACHE_ID_PART_MASK ) { -case L2X0_CACHE_ID_PART_L310 : - lockregs =8 ; -break ; -default : -/* L210 and unknown types */ - lockregs =1 ; -break ; - } - -l2c_unlock (l2x0_base, lockregs); -} + id =readl_relaxed (base +L2X0_CACHE_ID ) &L2X0_CACHE_ID_PART_MASK ; +if (id ==L2X0_CACHE_ID_PART_L310 ) + num_lock =8 ; +else + num_lock =1 ; -static void l2x0_enable (void __iomem *base,u32 aux,unsigned num_lock) -{/* l2x0 controller is disabled */ writel_relaxed (aux, base +L2X0_AUX_CTRL );/* Make sure that I&D is not locked down when starting */ -l2x0_unlock (readl_relaxed (base +L2X0_CACHE_ID )); +l2c_unlock (base, num_lock);l2x0_inv_all ();
Signature · 1 line
1.8.3.1
PATCH 29/97 ARM: l2c: move pl310_set_debug() into l2c-310 code
In reply to Russell King - ARM LinuxMove the pl310_set_debug() into the l2c-310 code area, and don't hide it with ifdefs. Rename it to l2c310_set_debug().
--- arch/arm/mm/cache-l2x0.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
arch/arm/mm/cache-l2x0.c +6 -8
@@ -154,18 +154,11 @@ static inline void debug_writel(unsigned long val)if (outer_cache.set_debug) l2c_set_debug(l2x0_base, val); } - -static void pl310_set_debug (unsigned long val) -{ -writel_relaxed (val, l2x0_base +L2X0_DEBUG_CTRL ); -}#else /* Optimised out for non-errata case */ static inline void debug_writel (unsigned long val) { } - -#define pl310_set_debug NULL#endif #ifdef CONFIG_PL310_ERRATA_588369
@@ -422,6 +415,11 @@ static const struct l2c_init_data l2x0_init_fns __initconst = {* Affects: store buffer * store buffer is not automatically drained. */ +static void l2c310_set_debug (unsigned long val) +{ +writel_relaxed (val, l2x0_base +L2X0_DEBUG_CTRL ); +} +static void __init l2c310_save (void __iomem *base) {unsigned revision;
@@ -488,7 +486,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,unsigned n =0 ;if (revision <=L310_CACHE_ID_RTL_R3P0 ) - fns->set_debug = pl310_set_debug; + fns->set_debug = l2c310_set_debug;if (IS_ENABLED (CONFIG_PL310_ERRATA_753970 ) && revision ==L310_CACHE_ID_RTL_R3P0 ) {
Signature · 1 line
1.8.3.1
PATCH 30/97 ARM: l2c: add L2C-210 specific handlers
In reply to Russell King - ARM LinuxAdd L2C-210 specific cache operation handlers. These are tailored to the requirements of the L2C-210 cache controller, which doesn't require any workarounds. We avoid using the way operations during normal operation, which means we can avoid locking: the only time we use the way operations are during initialisation, and when disabling the cache.
--- arch/arm/mm/cache-l2x0.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-)
arch/arm/mm/cache-l2x0.c +122 -1
@@ -389,6 +389,108 @@ static const struct l2c_init_data l2x0_init_fns __initconst = { };/* +* L2C-210 specific code. +* +* The L2C-2x0 PA, set/way and sync operations are atomic, but we must +* ensure that no background operation is running. The way operations +* are all background tasks. +* +* While a background operation is in progress, any new operation is +* ignored (unspecified whether this causes an error.) Thankfully, not +* used on SMP. +* +* Never has a different sync register other than L2X0_CACHE_SYNC, but +* we use sync_reg_offset here so we can share some of this with L2C-310. +*/ +static void __l2c210_cache_sync (void __iomem *base) +{ +writel_relaxed (0 , base + sync_reg_offset); +} + +static void __l2c210_op_pa_range (void __iomem *reg,unsigned long start, +unsigned long end) +{ +while (start < end) { +writel_relaxed (start, reg); + start +=CACHE_LINE_SIZE ; + } +} + +static void l2c210_inv_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; + +if (start & (CACHE_LINE_SIZE -1 )) { + start &= ~(CACHE_LINE_SIZE -1 ); +writel_relaxed (start, base +L2X0_CLEAN_INV_LINE_PA ); + start +=CACHE_LINE_SIZE ; + } + +if (end & (CACHE_LINE_SIZE -1 )) { + end &= ~(CACHE_LINE_SIZE -1 ); +writel_relaxed (end, base +L2X0_CLEAN_INV_LINE_PA ); + } + +__l2c210_op_pa_range (base +L2X0_INV_LINE_PA , start, end); +__l2c210_cache_sync (base); +} + +static void l2c210_clean_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; + + start &= ~(CACHE_LINE_SIZE -1 ); +__l2c210_op_pa_range (base +L2X0_CLEAN_LINE_PA , start, end); +__l2c210_cache_sync (base); +} + +static void l2c210_flush_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; + + start &= ~(CACHE_LINE_SIZE -1 ); +__l2c210_op_pa_range (base +L2X0_CLEAN_INV_LINE_PA , start, end); +__l2c210_cache_sync (base); +} + +static void l2c210_flush_all (void ) +{ +void __iomem *base = l2x0_base; + +BUG_ON (!irqs_disabled ()); + +__l2c_op_way (base +L2X0_CLEAN_INV_WAY ); +__l2c210_cache_sync (base); +} + +static void l2c210_sync (void ) +{ +__l2c210_cache_sync (l2x0_base); +} + +static void l2c210_resume (void ) +{ +void __iomem *base = l2x0_base; + +if (!(readl_relaxed (base +L2X0_CTRL ) &L2X0_CTRL_EN )) +l2c_enable (base, l2x0_saved_regs.aux_ctrl,1 ); +} + +static const struct l2c_init_data l2c210_data__initconst = { + .num_lock =1 , + .enable = l2c_enable, + .outer_cache = { + .inv_range = l2c210_inv_range, + .clean_range = l2c210_clean_range, + .flush_range = l2c210_flush_range, + .flush_all = l2c210_flush_all, + .disable = l2c_disable, + .sync = l2c210_sync, + .resume = l2c210_resume, + }, +}; + +/* * L2C-310 specific code. * * Errata:
@@ -623,6 +725,10 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) data = &l2x0_init_fns;break ; +case L2X0_CACHE_ID_PART_L210 : + data = &l2c210_data; +break ; +case L2X0_CACHE_ID_PART_L310 : data = &l2c310_init_fns;break ;
@@ -672,6 +778,21 @@ static void __init l2x0_of_parse(const struct device_node *np, *aux_mask &= ~mask; } +static const struct l2c_init_data of_l2c210_data__initconst = { + .num_lock =1 , + .of_parse = l2x0_of_parse, + .enable = l2c_enable, + .outer_cache = { + .inv_range = l2c210_inv_range, + .clean_range = l2c210_clean_range, + .flush_range = l2c210_flush_range, + .flush_all = l2c210_flush_all, + .disable = l2c_disable, + .sync = l2c210_sync, + .resume = l2c210_resume, + }, +}; +static const struct l2c_init_data of_l2x0_data__initconst = { .of_parse = l2x0_of_parse, .enable = l2x0_enable,
@@ -1117,7 +1238,7 @@ static const struct l2c_init_data of_tauros3_data __initconst = {#define L2C_ID (name, fns) { .compatible = name, .data = (void *)&fns }static const struct of_device_id l2x0_ids[]__initconst = { -L2C_ID ("arm,l210-cache" , of_l2x0_data), +L2C_ID ("arm,l210-cache" , of_l2c210_data),L2C_ID ("arm,l220-cache" , of_l2x0_data),L2C_ID ("arm,pl310-cache" , of_pl310_data),L2C_ID ("brcm,bcm11351-a2-pl310-cache" , of_bcm_l2x0_data),
Signature · 1 line
1.8.3.1
PATCH 31/97 ARM: l2c: implement L2C-310 erratum 727915 as a method override
In reply to Russell King - ARM LinuxImplement L2C-310 erratum 727915 by overriding the flush_all method in the outer_cache operations structure. This allows us to sensibly contain the erratum code in one place without affecting other locations or implementations.
--- arch/arm/mm/cache-l2x0.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
arch/arm/mm/cache-l2x0.c +20 -0
@@ -522,6 +522,19 @@ static void l2c310_set_debug(unsigned long val)writel_relaxed (val, l2x0_base +L2X0_DEBUG_CTRL ); } +static void l2c310_flush_all_erratum (void ) +{ +void __iomem *base = l2x0_base; +unsigned long flags; + +raw_spin_lock_irqsave (&l2x0_lock, flags); +l2c_set_debug (base,0x03 ); +__l2c_op_way (base +L2X0_CLEAN_INV_WAY ); +l2c_set_debug (base,0x00 ); +__l2c210_cache_sync (base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} +static void __init l2c310_save (void __iomem *base) {unsigned revision;
@@ -590,6 +603,13 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,if (revision <=L310_CACHE_ID_RTL_R3P0 ) fns->set_debug = l2c310_set_debug; +if (IS_ENABLED (CONFIG_PL310_ERRATA_727915 ) && + revision >=L310_CACHE_ID_RTL_R2P0 && + revision <L310_CACHE_ID_RTL_R3P1 ) { + fns->flush_all = l2c310_flush_all_erratum; + errata[n++] ="727915" ; + } +if (IS_ENABLED (CONFIG_PL310_ERRATA_753970 ) && revision ==L310_CACHE_ID_RTL_R3P0 ) { sync_reg_offset =L2X0_DUMMY_REG ;
Signature · 1 line
1.8.3.1
PATCH 32/97 ARM: l2c: implement L2C-310 erratum 588369 as a method override
In reply to Russell King - ARM LinuxImplement L2C-310 erratum 588369 by overriding the invalidate range and flush range methods in the outer_cache operations structure. This allows us to sensibly contain the erratum code in one place without affecting other locations/implemetations.
--- arch/arm/mm/cache-l2x0.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+)
arch/arm/mm/cache-l2x0.c +69 -0
@@ -522,6 +522,65 @@ static void l2c310_set_debug(unsigned long val)writel_relaxed (val, l2x0_base +L2X0_DEBUG_CTRL ); } +static void l2c310_inv_range_erratum (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; + +if ((start | end) & (CACHE_LINE_SIZE -1 )) { +unsigned long flags; + +/* Erratum 588369 for both clean+invalidate operations */ +raw_spin_lock_irqsave (&l2x0_lock, flags); +l2c_set_debug (base,0x03 ); + +if (start & (CACHE_LINE_SIZE -1 )) { + start &= ~(CACHE_LINE_SIZE -1 ); +writel_relaxed (start, base +L2X0_CLEAN_LINE_PA ); +writel_relaxed (start, base +L2X0_INV_LINE_PA ); + start +=CACHE_LINE_SIZE ; + } + +if (end & (CACHE_LINE_SIZE -1 )) { + end &= ~(CACHE_LINE_SIZE -1 ); +writel_relaxed (end, base +L2X0_CLEAN_LINE_PA ); +writel_relaxed (end, base +L2X0_INV_LINE_PA ); + } + +l2c_set_debug (base,0x00 ); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); + } + +__l2c210_op_pa_range (base +L2X0_INV_LINE_PA , start, end); +__l2c210_cache_sync (base); +} + +static void l2c310_flush_range_erratum (unsigned long start,unsigned long end) +{ +raw_spinlock_t *lock = &l2x0_lock; +unsigned long flags; +void __iomem *base = l2x0_base; + +raw_spin_lock_irqsave (lock, flags); +while (start < end) { +unsigned long blk_end = start +min (end - start,4096UL ); + +l2c_set_debug (base,0x03 ); +while (start < blk_end) { +writel_relaxed (start, base +L2X0_CLEAN_LINE_PA ); +writel_relaxed (start, base +L2X0_INV_LINE_PA ); + start +=CACHE_LINE_SIZE ; + } +l2c_set_debug (base,0x00 ); + +if (blk_end < end) { +raw_spin_unlock_irqrestore (lock, flags); +raw_spin_lock_irqsave (lock, flags); + } + } +raw_spin_unlock_irqrestore (lock, flags); +__l2c210_cache_sync (base); +} +static void l2c310_flush_all_erratum (void ) {void __iomem *base = l2x0_base;
@@ -600,9 +659,19 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,const char *errata[4 ];unsigned n =0 ; +/* For compatibility */ if (revision <=L310_CACHE_ID_RTL_R3P0 ) fns->set_debug = l2c310_set_debug; +if (IS_ENABLED (CONFIG_PL310_ERRATA_588369 ) && + revision <L310_CACHE_ID_RTL_R2P0 && +/* For bcm compatibility */ + fns->inv_range == l2x0_inv_range) { + fns->inv_range = l2c310_inv_range_erratum; + fns->flush_range = l2c310_flush_range_erratum; + errata[n++] ="588369" ; + } +if (IS_ENABLED (CONFIG_PL310_ERRATA_727915 ) && revision >=L310_CACHE_ID_RTL_R2P0 && revision <L310_CACHE_ID_RTL_R3P1 ) {
Signature · 1 line
1.8.3.1
PATCH 33/97 ARM: l2c: use L2C-210 handlers for L2C-310 errata-less implementations
In reply to Russell King - ARM LinuxWhere no errata affect the L2C-310 handlers, they are functionally equivalent to L2C-210. Re-use the L2C-210 handlers for the L2C-310 part.
--- arch/arm/mm/cache-l2x0.c | 58 ++++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 22 deletions(-)
arch/arm/mm/cache-l2x0.c +36 -22
@@ -493,6 +493,18 @@ static const struct l2c_init_data l2c210_data __initconst = {/* * L2C-310 specific code. * +* Very similar to L2C-210, the PA, set/way and sync operations are atomic, +* and the way operations are all background tasks. However, issuing an +* operation while a background operation is in progress results in a +* SLVERR response. We can reuse: +* +* __l2c210_cache_sync (using sync_reg_offset) +* l2c210_sync +* l2c210_inv_range (if 588369 is not applicable) +* l2c210_clean_range +* l2c210_flush_range (if 588369 is not applicable) +* l2c210_flush_all (if 727915 is not applicable) +* * Errata: * 588369: PL310 R0P0->R1P0, fixed R2P0. * Affects: all clean+invalidate operations
@@ -666,7 +678,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,if (IS_ENABLED (CONFIG_PL310_ERRATA_588369 ) && revision <L310_CACHE_ID_RTL_R2P0 &&/* For bcm compatibility */ - fns->inv_range == l2x0_inv_range) { + fns->inv_range == l2c210_inv_range) { fns->inv_range = l2c310_inv_range_erratum; fns->flush_range = l2c310_flush_range_erratum; errata[n++] ="588369" ;
@@ -704,12 +716,13 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .fixup = l2c310_fixup, .save = l2c310_save, .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, + .inv_range = l2c210_inv_range, + .clean_range = l2c210_clean_range, + .flush_range = l2c210_flush_range, + .flush_all = l2c210_flush_all, + .disable = l2c_disable, + .sync = l2c210_sync, + .set_debug = l2c310_set_debug, .resume = l2c310_resume, }, };
@@ -896,8 +909,8 @@ static const struct l2c_init_data of_l2x0_data __initconst = { }, }; -static void __init pl310_of_parse (const struct device_node *np, -u32 *aux_val,u32 *aux_mask) +static void __init l2c310_of_parse (const struct device_node *np, +u32 *aux_val,u32 *aux_mask) {u32 data[3 ] = {0 ,0 ,0 };u32 tag[3 ] = {0 ,0 ,0 };
@@ -930,19 +943,20 @@ static void __init pl310_of_parse(const struct device_node *np, } } -static const struct l2c_init_data of_pl310_data__initconst = { +static const struct l2c_init_data of_l2c310_data__initconst = { .num_lock =8 , - .of_parse = pl310_of_parse, + .of_parse = l2c310_of_parse, .enable = l2c_enable, .fixup = l2c310_fixup, .save = l2c310_save, .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, + .inv_range = l2c210_inv_range, + .clean_range = l2c210_clean_range, + .flush_range = l2c210_flush_range, + .flush_all = l2c210_flush_all, + .disable = l2c_disable, + .sync = l2c210_sync, + .set_debug = l2c310_set_debug, .resume = l2c310_resume, }, };
@@ -1278,7 +1292,7 @@ static void bcm_flush_range(unsigned long start, unsigned long end)static const struct l2c_init_data of_bcm_l2x0_data__initconst = { .num_lock =8 , - .of_parse = pl310_of_parse, + .of_parse = l2c310_of_parse, .enable = l2c_enable, .fixup = l2c310_fixup, .save = l2c310_save,
@@ -1286,9 +1300,9 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = { .inv_range = bcm_inv_range, .clean_range = bcm_clean_range, .flush_range = bcm_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, + .flush_all = l2c210_flush_all, + .disable = l2c_disable, + .sync = l2c210_sync, .resume = l2c310_resume, }, };
@@ -1329,7 +1343,7 @@ static const struct l2c_init_data of_tauros3_data __initconst = {static const struct of_device_id l2x0_ids[]__initconst = {L2C_ID ("arm,l210-cache" , of_l2c210_data),L2C_ID ("arm,l220-cache" , of_l2x0_data), -L2C_ID ("arm,pl310-cache" , of_pl310_data), +L2C_ID ("arm,pl310-cache" , of_l2c310_data),L2C_ID ("brcm,bcm11351-a2-pl310-cache" , of_bcm_l2x0_data),L2C_ID ("marvell,aurora-outer-cache" , of_aurora_with_outer_data),L2C_ID ("marvell,aurora-system-cache" , of_aurora_no_outer_data),
Signature · 1 line
1.8.3.1
PATCH 34/97 ARM: l2c: add L2C-220 specific handlers
In reply to Russell King - ARM LinuxThe L2C-220 is different from the L2C-210 and L2C-310 in that every operation is a background operation: this means we have to use spinlocks to protect all operations, and we have to wait for every operation to complete.
Should a second operation be attempted while a previous operation is in progress, the response will be an imprecise abort.
--- arch/arm/mm/cache-l2x0.c | 167 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 157 insertions(+), 10 deletions(-)
arch/arm/mm/cache-l2x0.c +157 -10
@@ -491,6 +491,148 @@ static const struct l2c_init_data l2c210_data __initconst = { };/* +* L2C-220 specific code. +* +* All operations are background operations: they have to be waited for. +* Conflicting requests generate a slave error (which will cause an +* imprecise abort.) Never uses sync_reg_offset, so we hard-code the +* sync register here. +* +* However, we can re-use the l2c210_resume call. +*/ +static inline void __l2c220_cache_sync (void __iomem *base) +{ +writel_relaxed (0 , base +L2X0_CACHE_SYNC ); +l2c_wait_mask (base +L2X0_CACHE_SYNC ,1 ); +} + +static void l2c220_op_way (void __iomem *base,unsigned reg) +{ +unsigned long flags; + +raw_spin_lock_irqsave (&l2x0_lock, flags); +__l2c_op_way (base + reg); +__l2c220_cache_sync (base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} + +static unsigned long l2c220_op_pa_range (void __iomem *reg,unsigned long start, +unsigned long end,unsigned long flags) +{ +raw_spinlock_t *lock = &l2x0_lock; + +while (start < end) { +unsigned long blk_end = start +min (end - start,4096UL ); + +while (start < blk_end) { +l2c_wait_mask (reg,1 ); +writel_relaxed (start, reg); + start +=CACHE_LINE_SIZE ; + } + +if (blk_end < end) { +raw_spin_unlock_irqrestore (lock, flags); +raw_spin_lock_irqsave (lock, flags); + } + } + +return flags; +} + +static void l2c220_inv_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; +unsigned long flags; + +raw_spin_lock_irqsave (&l2x0_lock, flags); +if ((start | end) & (CACHE_LINE_SIZE -1 )) { +if (start & (CACHE_LINE_SIZE -1 )) { + start &= ~(CACHE_LINE_SIZE -1 ); +writel_relaxed (start, base +L2X0_CLEAN_INV_LINE_PA ); + start +=CACHE_LINE_SIZE ; + } + +if (end & (CACHE_LINE_SIZE -1 )) { + end &= ~(CACHE_LINE_SIZE -1 ); +l2c_wait_mask (base +L2X0_CLEAN_INV_LINE_PA ,1 ); +writel_relaxed (end, base +L2X0_CLEAN_INV_LINE_PA ); + } + } + + flags =l2c220_op_pa_range (base +L2X0_INV_LINE_PA , + start, end, flags); +l2c_wait_mask (base +L2X0_INV_LINE_PA ,1 ); +__l2c220_cache_sync (base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} + +static void l2c220_clean_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; +unsigned long flags; + + start &= ~(CACHE_LINE_SIZE -1 ); +if ((end - start) >= l2x0_size) { +l2c220_op_way (base,L2X0_CLEAN_WAY ); +return ; + } + +raw_spin_lock_irqsave (&l2x0_lock, flags); + flags =l2c220_op_pa_range (base +L2X0_CLEAN_LINE_PA , + start, end, flags); +l2c_wait_mask (base +L2X0_CLEAN_INV_LINE_PA ,1 ); +__l2c220_cache_sync (base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} + +static void l2c220_flush_range (unsigned long start,unsigned long end) +{ +void __iomem *base = l2x0_base; +unsigned long flags; + + start &= ~(CACHE_LINE_SIZE -1 ); +if ((end - start) >= l2x0_size) { +l2c220_op_way (base,L2X0_CLEAN_INV_WAY ); +return ; + } + +raw_spin_lock_irqsave (&l2x0_lock, flags); + flags =l2c220_op_pa_range (base +L2X0_CLEAN_INV_LINE_PA , + start, end, flags); +l2c_wait_mask (base +L2X0_CLEAN_INV_LINE_PA ,1 ); +__l2c220_cache_sync (base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} + +static void l2c220_flush_all (void ) +{ +l2c220_op_way (l2x0_base,L2X0_CLEAN_INV_WAY ); +} + +static void l2c220_sync (void ) +{ +unsigned long flags; + +raw_spin_lock_irqsave (&l2x0_lock, flags); +__l2c220_cache_sync (l2x0_base); +raw_spin_unlock_irqrestore (&l2x0_lock, flags); +} + +static const struct l2c_init_data l2c220_data = { + .num_lock =1 , + .enable = l2c_enable, + .outer_cache = { + .inv_range = l2c220_inv_range, + .clean_range = l2c220_clean_range, + .flush_range = l2c220_flush_range, + .flush_all = l2c220_flush_all, + .disable = l2c_disable, + .sync = l2c220_sync, + .resume = l2c210_resume, + }, +}; + +/* * L2C-310 specific code. * * Very similar to L2C-210, the PA, set/way and sync operations are atomic,
@@ -831,6 +973,10 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask) data = &l2c210_data;break ; +case L2X0_CACHE_ID_PART_L220 : + data = &l2c220_data; +break ; +case L2X0_CACHE_ID_PART_L310 : data = &l2c310_init_fns;break ;
@@ -895,17 +1041,18 @@ static const struct l2c_init_data of_l2c210_data __initconst = { }, }; -static const struct l2c_init_data of_l2x0_data__initconst = { +static const struct l2c_init_data of_l2c220_data__initconst = { + .num_lock =1 , .of_parse = l2x0_of_parse, - .enable = l2x0_enable, + .enable = l2c_enable, .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = l2x0_resume, + .inv_range = l2c220_inv_range, + .clean_range = l2c220_clean_range, + .flush_range = l2c220_flush_range, + .flush_all = l2c220_flush_all, + .disable = l2c_disable, + .sync = l2c220_sync, + .resume = l2c210_resume, }, };
@@ -1342,7 +1489,7 @@ static const struct l2c_init_data of_tauros3_data __initconst = {#define L2C_ID (name, fns) { .compatible = name, .data = (void *)&fns }static const struct of_device_id l2x0_ids[]__initconst = {L2C_ID ("arm,l210-cache" , of_l2c210_data), -L2C_ID ("arm,l220-cache" , of_l2x0_data), +L2C_ID ("arm,l220-cache" , of_l2c220_data),L2C_ID ("arm,pl310-cache" , of_l2c310_data),L2C_ID ("brcm,bcm11351-a2-pl310-cache" , of_bcm_l2x0_data),L2C_ID ("marvell,aurora-outer-cache" , of_aurora_with_outer_data),
Signature · 1 line
1.8.3.1
PATCH 35/97 ARM: l2c: convert Broadcom L2C-310 to new code
In reply to Russell King - ARM LinuxThe Broadcom L2C-310 devices use ARMs L2C-310 R2P3 or later. These require no errata workarounds, and so we can directly call the l2c210 functions from their methods.
--- arch/arm/mm/cache-l2x0.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-)
arch/arm/mm/cache-l2x0.c +11 -16
@@ -1360,16 +1360,16 @@ static void bcm_inv_range(unsigned long start, unsigned long end)/* normal case, no cross section between start and end */ if (likely (bcm_addr_is_sys_emi (end) || !bcm_addr_is_sys_emi (start))) { -l2x0_inv_range (new_start, new_end); +l2c210_inv_range (new_start, new_end);return ; }/* They cross sections, so it can only be a cross from section * 2 to section 3 */ -l2x0_inv_range (new_start, +l2c210_inv_range (new_start,bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR -1 )); -l2x0_inv_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), +l2c210_inv_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), new_end); }
@@ -1382,26 +1382,21 @@ static void bcm_clean_range(unsigned long start, unsigned long end)if (unlikely (end <= start))return ; -if ((end - start) >= l2x0_size) { -l2x0_clean_all (); -return ; - } - new_start =bcm_l2_phys_addr (start); new_end =bcm_l2_phys_addr (end);/* normal case, no cross section between start and end */ if (likely (bcm_addr_is_sys_emi (end) || !bcm_addr_is_sys_emi (start))) { -l2x0_clean_range (new_start, new_end); +l2c210_clean_range (new_start, new_end);return ; }/* They cross sections, so it can only be a cross from section * 2 to section 3 */ -l2x0_clean_range (new_start, +l2c210_clean_range (new_start,bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR -1 )); -l2x0_clean_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), +l2c210_clean_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), new_end); }
@@ -1415,7 +1410,7 @@ static void bcm_flush_range(unsigned long start, unsigned long end)return ;if ((end - start) >= l2x0_size) { -l2x0_flush_all (); + outer_cache.flush_all ();return ; }
@@ -1424,24 +1419,24 @@ static void bcm_flush_range(unsigned long start, unsigned long end)/* normal case, no cross section between start and end */ if (likely (bcm_addr_is_sys_emi (end) || !bcm_addr_is_sys_emi (start))) { -l2x0_flush_range (new_start, new_end); +l2c210_flush_range (new_start, new_end);return ; }/* They cross sections, so it can only be a cross from section * 2 to section 3 */ -l2x0_flush_range (new_start, +l2c210_flush_range (new_start,bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR -1 )); -l2x0_flush_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), +l2c210_flush_range (bcm_l2_phys_addr (BCM_VC_EMI_SEC3_START_ADDR ), new_end); } +/* Broadcom L2C-310 start from ARMs R3P2 or later, and require no fixups */ static const struct l2c_init_data of_bcm_l2x0_data__initconst = { .num_lock =8 , .of_parse = l2c310_of_parse, .enable = l2c_enable, - .fixup = l2c310_fixup, .save = l2c310_save, .outer_cache = { .inv_range = bcm_inv_range,
Signature · 1 line
1.8.3.1
PATCH 36/97 ARM: l2c: remove obsolete l2x0 ops for non-OF init
In reply to Russell King - ARM Linuxnon-OF initialisation has never been used with any cache controller which isn't an ARM cache controller, so we can safely get rid of the old (and buggy) l2x0_*-based operations structure.
This is also the last reference to:
- l2x0_clean_line()
- l2x0_inv_line()
- l2x0_flush_line()
- l2x0_flush_all()
- l2x0_clean_all()
- l2x0_inv_all()
- l2x0_inv_range()
- l2x0_clean_range()
- l2x0_flush_range()
- l2x0_enable()
- l2x0_resume()
so kill those functions too.
--- arch/arm/mm/cache-l2x0.c | 206 ----------------------------------------------- 1 file changed, 206 deletions(-)
arch/arm/mm/cache-l2x0.c +0 -206
@@ -134,20 +134,6 @@ static inline void cache_sync(void)cache_wait (base +L2X0_CACHE_SYNC ,1 ); } -static inline void l2x0_clean_line (unsigned long addr) -{ -void __iomem *base = l2x0_base; -cache_wait (base +L2X0_CLEAN_LINE_PA ,1 ); -writel_relaxed (addr, base +L2X0_CLEAN_LINE_PA ); -} - -static inline void l2x0_inv_line (unsigned long addr) -{ -void __iomem *base = l2x0_base; -cache_wait (base +L2X0_INV_LINE_PA ,1 ); -writel_relaxed (addr, base +L2X0_INV_LINE_PA ); -} -#if defined(CONFIG_PL310_ERRATA_588369 ) || defined(CONFIG_PL310_ERRATA_727915 )static inline void debug_writel (unsigned long val) {
@@ -161,27 +147,6 @@ static inline void debug_writel(unsigned long val) }#endif -#ifdef CONFIG_PL310_ERRATA_588369 -static inline void l2x0_flush_line (unsigned long addr) -{ -void __iomem *base = l2x0_base; - -/* Clean by PA followed by Invalidate by PA */ -cache_wait (base +L2X0_CLEAN_LINE_PA ,1 ); -writel_relaxed (addr, base +L2X0_CLEAN_LINE_PA ); -cache_wait (base +L2X0_INV_LINE_PA ,1 ); -writel_relaxed (addr, base +L2X0_INV_LINE_PA ); -} -#else - -static inline void l2x0_flush_line (unsigned long addr) -{ -void __iomem *base = l2x0_base; -cache_wait (base +L2X0_CLEAN_INV_LINE_PA ,1 ); -writel_relaxed (addr, base +L2X0_CLEAN_INV_LINE_PA ); -} -#endif -static void l2x0_cache_sync (void ) {unsigned long flags;
@@ -209,131 +174,6 @@ static void l2x0_flush_all(void)raw_spin_unlock_irqrestore (&l2x0_lock, flags); } -static void l2x0_clean_all (void ) -{ -unsigned long flags; - -/* clean all ways */ -raw_spin_lock_irqsave (&l2x0_lock, flags); -__l2c_op_way (l2x0_base +L2X0_CLEAN_WAY ); -cache_sync (); -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -} - -static void l2x0_inv_all (void ) -{ -unsigned long flags; - -/* invalidate all ways */ -raw_spin_lock_irqsave (&l2x0_lock, flags); -/* Invalidating when L2 is enabled is a nono */ -BUG_ON (readl (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN ); -__l2c_op_way (l2x0_base +L2X0_INV_WAY ); -cache_sync (); -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -} - -static void l2x0_inv_range (unsigned long start,unsigned long end) -{ -void __iomem *base = l2x0_base; -unsigned long flags; - -raw_spin_lock_irqsave (&l2x0_lock, flags); -if (start & (CACHE_LINE_SIZE -1 )) { - start &= ~(CACHE_LINE_SIZE -1 ); -debug_writel (0x03 ); -l2x0_flush_line (start); -debug_writel (0x00 ); - start +=CACHE_LINE_SIZE ; - } - -if (end & (CACHE_LINE_SIZE -1 )) { - end &= ~(CACHE_LINE_SIZE -1 ); -debug_writel (0x03 ); -l2x0_flush_line (end); -debug_writel (0x00 ); - } - -while (start < end) { -unsigned long blk_end = start +min (end - start,4096UL ); - -while (start < blk_end) { -l2x0_inv_line (start); - start +=CACHE_LINE_SIZE ; - } - -if (blk_end < end) { -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -raw_spin_lock_irqsave (&l2x0_lock, flags); - } - } -cache_wait (base +L2X0_INV_LINE_PA ,1 ); -cache_sync (); -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -} - -static void l2x0_clean_range (unsigned long start,unsigned long end) -{ -void __iomem *base = l2x0_base; -unsigned long flags; - -if ((end - start) >= l2x0_size) { -l2x0_clean_all (); -return ; - } - -raw_spin_lock_irqsave (&l2x0_lock, flags); - start &= ~(CACHE_LINE_SIZE -1 ); -while (start < end) { -unsigned long blk_end = start +min (end - start,4096UL ); - -while (start < blk_end) { -l2x0_clean_line (start); - start +=CACHE_LINE_SIZE ; - } - -if (blk_end < end) { -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -raw_spin_lock_irqsave (&l2x0_lock, flags); - } - } -cache_wait (base +L2X0_CLEAN_LINE_PA ,1 ); -cache_sync (); -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -} - -static void l2x0_flush_range (unsigned long start,unsigned long end) -{ -void __iomem *base = l2x0_base; -unsigned long flags; - -if ((end - start) >= l2x0_size) { -l2x0_flush_all (); -return ; - } - -raw_spin_lock_irqsave (&l2x0_lock, flags); - start &= ~(CACHE_LINE_SIZE -1 ); -while (start < end) { -unsigned long blk_end = start +min (end - start,4096UL ); - -debug_writel (0x03 ); -while (start < blk_end) { -l2x0_flush_line (start); - start +=CACHE_LINE_SIZE ; - } -debug_writel (0x00 ); - -if (blk_end < end) { -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -raw_spin_lock_irqsave (&l2x0_lock, flags); - } - } -cache_wait (base +L2X0_CLEAN_INV_LINE_PA ,1 ); -cache_sync (); -raw_spin_unlock_irqrestore (&l2x0_lock, flags); -} -static void l2x0_disable (void ) {unsigned long flags;
@@ -345,49 +185,6 @@ static void l2x0_disable(void)raw_spin_unlock_irqrestore (&l2x0_lock, flags); } -static void l2x0_enable (void __iomem *base,u32 aux,unsigned num_lock) -{ -unsigned id; - - id =readl_relaxed (base +L2X0_CACHE_ID ) &L2X0_CACHE_ID_PART_MASK ; -if (id ==L2X0_CACHE_ID_PART_L310 ) - num_lock =8 ; -else - num_lock =1 ; - -/* l2x0 controller is disabled */ -writel_relaxed (aux, base +L2X0_AUX_CTRL ); - -/* Make sure that I&D is not locked down when starting */ -l2c_unlock (base, num_lock); - -l2x0_inv_all (); - -/* enable L2X0 */ -writel_relaxed (L2X0_CTRL_EN , base +L2X0_CTRL ); -} - -static void l2x0_resume (void ) -{ -void __iomem *base = l2x0_base; - -if (!(readl_relaxed (base +L2X0_CTRL ) &L2X0_CTRL_EN )) -l2x0_enable (base, l2x0_saved_regs.aux_ctrl,0 ); -} - -static const struct l2c_init_data l2x0_init_fns__initconst = { - .enable = l2x0_enable, - .outer_cache = { - .inv_range = l2x0_inv_range, - .clean_range = l2x0_clean_range, - .flush_range = l2x0_flush_range, - .flush_all = l2x0_flush_all, - .disable = l2x0_disable, - .sync = l2x0_cache_sync, - .resume = l2x0_resume, - }, -}; -/* * L2C-210 specific code. *
@@ -966,9 +763,6 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)switch (cache_id &L2X0_CACHE_ID_PART_MASK ) {default : - data = &l2x0_init_fns; -break ; -case L2X0_CACHE_ID_PART_L210 : data = &l2c210_data;break ;
Signature · 1 line
1.8.3.1
PATCH 37/97 ARM: l2c: move type string into l2c_init_data structure
In reply to Russell King - ARM LinuxRather than decoding this from the ID register, store it in the l2c_init_data structure. This simplifies things some more, and allows us to better provide further details as to how we're driving the cache. We print the cache ID value anyway should we need to precisely identify the cache hardware.
--- arch/arm/mm/cache-l2x0.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
arch/arm/mm/cache-l2x0.c +13 -7
@@ -29,6 +29,7 @@#include "cache-aurora-l2.h" struct l2c_init_data { +const char *type;unsigned num_lock;void (*of_parse)(const struct device_node *,u32 *,u32 *);void (*enable)(void __iomem *,u32 ,unsigned );
@@ -274,6 +275,7 @@ static void l2c210_resume(void) }static const struct l2c_init_data l2c210_data__initconst = { + .type ="L2C-210" , .num_lock =1 , .enable = l2c_enable, .outer_cache = {
@@ -416,6 +418,7 @@ static void l2c220_sync(void) }static const struct l2c_init_data l2c220_data = { + .type ="L2C-220" , .num_lock =1 , .enable = l2c_enable, .outer_cache = {
@@ -650,6 +653,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id, }static const struct l2c_init_data l2c310_init_fns__initconst = { + .type ="L2C-310" , .num_lock =8 , .enable = l2c_enable, .fixup = l2c310_fixup,
@@ -674,7 +678,6 @@ static void __init __l2c_init(const struct l2c_init_data *data,u32 way_size =0 ;int ways;int way_size_shift =L2X0_WAY_SIZE_SHIFT ; -const char *type;/* * It is strange to save the register state before initialisation,
@@ -695,25 +698,21 @@ static void __init __l2c_init(const struct l2c_init_data *data, ways =16 ; else ways =8 ; - type ="L310" ;break ;case L2X0_CACHE_ID_PART_L210 : ways = (aux >>13 ) &0xf ; - type ="L210" ;break ;case AURORA_CACHE_ID : ways = (aux >>13 ) &0xf ; ways =2 << ((ways +1 ) >>2 ); way_size_shift =AURORA_WAY_SIZE_SHIFT ; - type ="Aurora" ;break ;default :/* Assume unknown chips have 8 ways */ ways =8 ; - type ="L2x0 series" ;break ; }
@@ -747,9 +746,9 @@ static void __init __l2c_init(const struct l2c_init_data *data, outer_cache = fns;pr_info ("%s cache controller enabled, %d ways, %d kB\n" , - type, ways, l2x0_size >>10 ); + data->type, ways, l2x0_size >>10 );pr_info ("%s: CACHE_ID 0x%08x, AUX_CTRL 0x%08x\n" , - type, cache_id, aux); + data->type, cache_id, aux); }void __init l2x0_init (void __iomem *base,u32 aux_val,u32 aux_mask)
@@ -821,6 +820,7 @@ static void __init l2x0_of_parse(const struct device_node *np, }static const struct l2c_init_data of_l2c210_data__initconst = { + .type ="L2C-210" , .num_lock =1 , .of_parse = l2x0_of_parse, .enable = l2c_enable,
@@ -836,6 +836,7 @@ static const struct l2c_init_data of_l2c210_data __initconst = { };static const struct l2c_init_data of_l2c220_data__initconst = { + .type ="L2C-220" , .num_lock =1 , .of_parse = l2x0_of_parse, .enable = l2c_enable,
@@ -885,6 +886,7 @@ static void __init l2c310_of_parse(const struct device_node *np, }static const struct l2c_init_data of_l2c310_data__initconst = { + .type ="L2C-310" , .num_lock =8 , .of_parse = l2c310_of_parse, .enable = l2c_enable,
@@ -1063,6 +1065,7 @@ static void __init aurora_of_parse(const struct device_node *np, }static const struct l2c_init_data of_aurora_with_outer_data__initconst = { + .type ="Aurora" , .num_lock =4 , .of_parse = aurora_of_parse, .enable = l2c_enable,
@@ -1080,6 +1083,7 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = { };static const struct l2c_init_data of_aurora_no_outer_data__initconst = { + .type ="Aurora" , .num_lock =4 , .of_parse = aurora_of_parse, .enable = aurora_enable_no_outer,
@@ -1228,6 +1232,7 @@ static void bcm_flush_range(unsigned long start, unsigned long end)/* Broadcom L2C-310 start from ARMs R3P2 or later, and require no fixups */ static const struct l2c_init_data of_bcm_l2x0_data__initconst = { + .type ="BCM-L2C-310" , .num_lock =8 , .of_parse = l2c310_of_parse, .enable = l2c_enable,
@@ -1266,6 +1271,7 @@ static void tauros3_resume(void) }static const struct l2c_init_data of_tauros3_data__initconst = { + .type ="Tauros3" , .num_lock =8 , .enable = l2c_enable, .save = tauros3_save,
Signature · 1 line
1.8.3.1
PATCH 38/97 ARM: l2c: add decode for L2C-220 cache ways
In reply to Russell King - ARM LinuxRather than assuming these are always 8-way, it can be decoded from the auxillary register in the same manner as L2C-210.
--- arch/arm/mm/cache-l2x0.c | 1 + 1 file changed, 1 insertion(+)
arch/arm/mm/cache-l2x0.c +1 -0
@@ -701,6 +701,7 @@ static void __init __l2c_init(const struct l2c_init_data *data,break ;case L2X0_CACHE_ID_PART_L210 : +case L2X0_CACHE_ID_PART_L220 : ways = (aux >>13 ) &0xf ;break ;
Signature · 1 line
1.8.3.1
PATCH 39/97 ARM: l2c: move way size calculation data into l2c_init_data
In reply to Russell King - ARM LinuxMove the way size calculation data (base of way size) out of the switch statement into the provided initialisation data.
--- arch/arm/mm/cache-l2x0.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-)
arch/arm/mm/cache-l2x0.c +20 -9
@@ -30,6 +30,7 @@struct l2c_init_data {const char *type; +unsigned way_size_0;unsigned num_lock;void (*of_parse)(const struct device_node *,u32 *,u32 *);void (*enable)(void __iomem *,u32 ,unsigned );
@@ -276,6 +277,7 @@ static void l2c210_resume(void)static const struct l2c_init_data l2c210_data__initconst = { .type ="L2C-210" , + .way_size_0 =SZ_8K , .num_lock =1 , .enable = l2c_enable, .outer_cache = {
@@ -419,6 +421,7 @@ static void l2c220_sync(void)static const struct l2c_init_data l2c220_data = { .type ="L2C-220" , + .way_size_0 =SZ_8K , .num_lock =1 , .enable = l2c_enable, .outer_cache = {
@@ -654,6 +657,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,static const struct l2c_init_data l2c310_init_fns__initconst = { .type ="L2C-310" , + .way_size_0 =SZ_8K , .num_lock =8 , .enable = l2c_enable, .fixup = l2c310_fixup,
@@ -674,10 +678,8 @@ static void __init __l2c_init(const struct l2c_init_data *data, u32 aux_val, u32 aux_mask, u32 cache_id) { struct outer_cache_fns fns; +unsigned way_size_bits, ways;u32 aux; -u32 way_size =0 ; -int ways; -int way_size_shift =L2X0_WAY_SIZE_SHIFT ;/* * It is strange to save the register state before initialisation,
@@ -708,7 +710,6 @@ static void __init __l2c_init(const struct l2c_init_data *data,case AURORA_CACHE_ID : ways = (aux >>13 ) &0xf ; ways =2 << ((ways +1 ) >>2 ); - way_size_shift =AURORA_WAY_SIZE_SHIFT ;break ;default :
@@ -720,12 +721,15 @@ static void __init __l2c_init(const struct l2c_init_data *data, l2x0_way_mask = (1 << ways) -1 ;/* -* L2 cache Size = Way size * Number of ways +* way_size_0 is the size that a way_size value of zero would be +* given the calculation: way_size = way_size_0 << way_size_bits. +* So, if way_size_bits=0 is reserved, but way_size_bits=1 is 16k, +* then way_size_0 would be 8k. +* +* L2 cache size = number of ways * way size. */ - way_size = (aux &L2X0_AUX_CTRL_WAY_SIZE_MASK ) >>17 ; - way_size =1 << (way_size + way_size_shift); - - l2x0_size = ways * way_size *SZ_1K ; + way_size_bits = (aux &L2X0_AUX_CTRL_WAY_SIZE_MASK ) >>17 ; + l2x0_size = ways * (data->way_size_0 << way_size_bits); fns = data->outer_cache;if (data->fixup)
@@ -822,6 +826,7 @@ static void __init l2x0_of_parse(const struct device_node *np,static const struct l2c_init_data of_l2c210_data__initconst = { .type ="L2C-210" , + .way_size_0 =SZ_8K , .num_lock =1 , .of_parse = l2x0_of_parse, .enable = l2c_enable,
@@ -838,6 +843,7 @@ static const struct l2c_init_data of_l2c210_data __initconst = {static const struct l2c_init_data of_l2c220_data__initconst = { .type ="L2C-220" , + .way_size_0 =SZ_8K , .num_lock =1 , .of_parse = l2x0_of_parse, .enable = l2c_enable,
@@ -888,6 +894,7 @@ static void __init l2c310_of_parse(const struct device_node *np,static const struct l2c_init_data of_l2c310_data__initconst = { .type ="L2C-310" , + .way_size_0 =SZ_8K , .num_lock =8 , .of_parse = l2c310_of_parse, .enable = l2c_enable,
@@ -1067,6 +1074,7 @@ static void __init aurora_of_parse(const struct device_node *np,static const struct l2c_init_data of_aurora_with_outer_data__initconst = { .type ="Aurora" , + .way_size_0 =SZ_4K , .num_lock =4 , .of_parse = aurora_of_parse, .enable = l2c_enable,
@@ -1085,6 +1093,7 @@ static const struct l2c_init_data of_aurora_with_outer_data __initconst = {static const struct l2c_init_data of_aurora_no_outer_data__initconst = { .type ="Aurora" , + .way_size_0 =SZ_4K , .num_lock =4 , .of_parse = aurora_of_parse, .enable = aurora_enable_no_outer,
@@ -1234,6 +1243,7 @@ static void bcm_flush_range(unsigned long start, unsigned long end)/* Broadcom L2C-310 start from ARMs R3P2 or later, and require no fixups */ static const struct l2c_init_data of_bcm_l2x0_data__initconst = { .type ="BCM-L2C-310" , + .way_size_0 =SZ_8K , .num_lock =8 , .of_parse = l2c310_of_parse, .enable = l2c_enable,
@@ -1273,6 +1283,7 @@ static void tauros3_resume(void)static const struct l2c_init_data of_tauros3_data__initconst = { .type ="Tauros3" , + .way_size_0 =SZ_8K , .num_lock =8 , .enable = l2c_enable, .save = tauros3_save,
Signature · 1 line
1.8.3.1
PATCH 40/97 ARM: l2c: move errata configuration options to arch/arm/mm/Kconfig
In reply to Russell King - ARM LinuxMove the L2C-310 errata configuration options to arch/arm/mm/Kconfig along side the option which enables support for this device.
--- arch/arm/Kconfig | 51 --------------------------------------------------- arch/arm/mm/Kconfig | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 51 deletions(-)
arch/arm/Kconfig +0 -51
@@ -1229,19 +1229,6 @@ config ARM_ERRATA_742231 register of the Cortex-A9 which reduces the linefill issuing capabilities of the processor. -config PL310_ERRATA_588369 - bool "PL310 errata: Clean & Invalidate maintenance operations do not invalidate clean lines" - depends on CACHE_L2X0 - help - The PL310 L2 cache controller implements three types of Clean & - Invalidate maintenance operations: by Physical Address - (offset 0x7F0), by Index/Way (0x7F8) and by Way (0x7FC). - They are architecturally defined to behave as the execution of a - clean operation followed immediately by an invalidate operation, - both performing to the same memory location. This functionality - is not correctly implemented in PL310 as clean lines are not - invalidated as a result of these operations. - config ARM_ERRATA_643719 bool "ARM errata: LoUIS bit field in CLIDR register is incorrect" depends on CPU_V7 && SMP
@@ -1264,17 +1251,6 @@ config ARM_ERRATA_720789 tables. The workaround changes the TLB flushing routines to invalidate entries regardless of the ASID. -config PL310_ERRATA_727915 - bool "PL310 errata: Background Clean & Invalidate by Way operation can cause data corruption" - depends on CACHE_L2X0 - help - PL310 implements the Clean & Invalidate by Way L2 cache maintenance - operation (offset 0x7FC). This operation runs in background so that - PL310 can handle normal accesses while it is in progress. Under very - rare circumstances, due to this erratum, write data can be lost when - PL310 treats a cacheable write transaction during a Clean & - Invalidate by Way operation. - config ARM_ERRATA_743622 bool "ARM errata: Faulty hazard checking in the Store Buffer may lead to data corruption" depends on CPU_V7
@@ -1300,21 +1276,6 @@ config ARM_ERRATA_751472 operation is received by a CPU before the ICIALLUIS has completed, potentially leading to corrupted entries in the cache or TLB. -config PL310_ERRATA_753970 - bool "PL310 errata: cache sync operation may be faulty" - depends on CACHE_PL310 - help - This option enables the workaround for the 753970 PL310 (r3p0) erratum. - - Under some condition the effect of cache sync operation on - the store buffer still remains when the operation completes. - This means that the store buffer is always asked to drain and - this prevents it from merging any further writes. The workaround - is to replace the normal offset of cache sync operation (0x730) - by another offset targeting an unmapped PL310 register 0x740. - This has the same effect as the cache sync operation: store buffer - drain and waiting for all buffers empty. - config ARM_ERRATA_754322 bool "ARM errata: possible faulty MMU translations following an ASID switch" depends on CPU_V7
@@ -1363,18 +1324,6 @@ config ARM_ERRATA_764369 relevant cache maintenance functions and sets a specific bit in the diagnostic control register of the SCU. -config PL310_ERRATA_769419 - bool "PL310 errata: no automatic Store Buffer drain" - depends on CACHE_L2X0 - help - On revisions of the PL310 prior to r3p2, the Store Buffer does - not automatically drain. This can cause normal, non-cacheable - writes to be retained when the memory system is idle, leading - to suboptimal I/O performance for drivers using coherent DMA. - This option adds a write barrier to the cpu_idle loop so that, - on systems with an outer cache, the store buffer is drained - explicitly. - config ARM_ERRATA_775420 bool "ARM errata: A data cache maintenance operation which aborts, might lead to deadlock" depends on CPU_V7
arch/arm/mm/Kconfig +51 -0
57 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 41/97 ARM: l2c: provide generic hook to intercept writes to secure registers
In reply to Russell King - ARM LinuxWhen Linux is running in the non-secure world, any write to a secure L2C register will generate an abort. Platforms normally have to call firmware to work around this. Provide a hook for them to intercept any L2C secure register write.
l2c_write_sec() avoids writes to secure registers which are already set to the appropriate value, thus avoiding the overhead of needlessly calling into the secure monitor.
--- arch/arm/include/asm/outercache.h | 5 ++++- arch/arm/mm/cache-l2x0.c | 42 ++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 13 deletions(-)
arch/arm/include/asm/outercache.h +4 -1
@@ -33,8 +33,11 @@ struct outer_cache_fns {#ifdef CONFIG_OUTER_CACHE_SYNC void (*sync)(void );#endif -void (*set_debug)(unsigned long );void (*resume)(void ); + +/* This is an ARM L2C thing */ +void (*set_debug)(unsigned long ); +void (*write_sec)(unsigned long ,unsigned ); };extern struct outer_cache_fns outer_cache;
arch/arm/mm/cache-l2x0.c +30 -12
99 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 42/97 ARM: l2c: omap2: implement new write_sec method
In reply to Russell King - ARM LinuxWith the write_sec method, we no longer need to override the default L2C disable method, and we no longer need the L2C set_debug method. Both of these can be handled via the write_sec method.
--- arch/arm/mach-omap2/omap4-common.c | 42 +++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 16 deletions(-)
arch/arm/mach-omap2/omap4-common.c +26 -16
@@ -167,17 +167,33 @@ void __iomem *omap4_get_l2cache_base(void)return l2cache_base; } -static void omap4_l2x0_disable (void ) +static void omap4_l2c310_write_sec (unsigned long val,unsigned reg) { -outer_flush_all (); -/* Disable PL310 L2 Cache controller */ -omap_smc1 (0x102 ,0x0 ); -} +unsigned smc_op; -static void omap4_l2x0_set_debug (unsigned long val) -{ -/* Program PL310 L2 Cache controller debug register */ -omap_smc1 (0x100 , val); +switch (reg) { +case L2X0_CTRL : + smc_op =OMAP4_MON_L2X0_CTRL_INDEX ; +break ; + +case L2X0_AUX_CTRL : + smc_op =OMAP4_MON_L2X0_AUXCTRL_INDEX ; +break ; + +case L2X0_DEBUG_CTRL : + smc_op =OMAP4_MON_L2X0_DBG_CTRL_INDEX ; +break ; + +case L310_PREFETCH_CTRL : + smc_op =OMAP4_MON_L2X0_PREFETCH_INDEX ; +break ; + +default : +WARN_ONCE (1 ,"OMAP L2C310: ignoring write to reg 0x%x\n" , reg); +return ; + } + +omap_smc1 (smc_op, val); }static int __init omap_l2_cache_init (void )
@@ -212,18 +228,12 @@ static int __init omap_l2_cache_init(void)/* Enable PL310 L2 Cache controller */ omap_smc1 (0x102 ,0x1 ); + outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ())l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK );else l2x0_init (l2cache_base, aux_ctrl,L2X0_AUX_CTRL_MASK ); -/* -* Override default outer_cache.disable with a OMAP4 -* specific one -*/ - outer_cache.disable = omap4_l2x0_disable; - outer_cache.set_debug = omap4_l2x0_set_debug; -return 0 ; }omap_early_initcall (omap_l2_cache_init);
Signature · 1 line
1.8.3.1
PATCH 43/97 ARM: l2c: omap2: remove explicit SMI calls to enable L2 cache
In reply to Russell King - ARM LinuxNow that OMAP2 uses the write_sec method, we don't need to enable the L2 cache in OMAP2 specific code; this can be done via the normal mechanisms in the L2C code. Remove the OMAP2 specific code.
--- arch/arm/mach-omap2/omap4-common.c | 5 ----- 1 file changed, 5 deletions(-)
arch/arm/mach-omap2/omap4-common.c +0 -5
@@ -223,11 +223,6 @@ static int __init omap_l2_cache_init(void) (1 <<L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT ) | (1 <<L2X0_AUX_CTRL_EARLY_BRESP_SHIFT ); -omap_smc1 (0x109 , aux_ctrl); - -/* Enable PL310 L2 Cache controller */ -omap_smc1 (0x102 ,0x1 ); - outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ())l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK );
Signature · 1 line
1.8.3.1
PATCH 44/97 ARM: l2c: highbank: implement new write_sec method
In reply to Russell King - ARM LinuxWith the write_sec method, we no longer need to override the default L2C disable method. This can be handled via the write_sec method instead.
--- arch/arm/mach-highbank/highbank.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
arch/arm/mach-highbank/highbank.c +7 -5
@@ -51,11 +51,13 @@ static void __init highbank_scu_map_io(void) } -static void highbank_l2x0_disable (void ) +static void highbank_l2c310_write_sec (unsigned long val,unsigned reg) { -outer_flush_all (); -/* Disable PL310 L2 Cache controller */ -highbank_smc1 (0x102 ,0x0 ); +if (reg ==L2X0_CTRL ) +highbank_smc1 (0x102 , val); +else +WARN_ONCE (1 ,"Highbank L2C310: ignoring write to reg 0x%x\n" , + reg); }static void __init highbank_init_irq (void )
@@ -69,8 +71,8 @@ static void __init highbank_init_irq(void)if (IS_ENABLED (CONFIG_CACHE_L2X0 ) &&of_find_compatible_node (NULL ,NULL ,"arm,pl310-cache" )) {highbank_smc1 (0x102 ,0x1 ); + outer_cache.write_sec = highbank_l2c310_write_sec;l2x0_of_init (0 , ~0 ); - outer_cache.disable = highbank_l2x0_disable; } }
Signature · 1 line
1.8.3.1
PATCH 45/97 ARM: l2c: highbank: remove explicit SMI call in L2 cache initialisation
In reply to Russell King - ARM LinuxNow that highbank uses the write_sec method, we don't need to enable the L2 cache in SoC specific code; this can be done via the normal mechanisms in the L2C code.
Checking with Rob Herring:
Quoted 7 lines
Quoted 3 lines
Can we kill the "
highbank_smc1(0x102, 0x1);" here? That meansl2x0_of_init()will see the L2 cache disabled, and will try to enable it via thewrite_sechook, so it should do the right thing.Yes, that should work. You should be able to just call
l2x0_of_initunconditionally. The condition was really to just avoid the smc on Midway which does get handled on h/w, but not if running virtualized.
So also drop the DT check too. I'm leaving the config check in place so that if L2 is disabled, the write_sec hook can be optimised away.
--- arch/arm/mach-highbank/highbank.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
arch/arm/mach-highbank/highbank.c +1 -3
@@ -68,9 +68,7 @@ static void __init highbank_init_irq(void)highbank_scu_map_io ();/* Enable PL310 L2 Cache controller */ -if (IS_ENABLED (CONFIG_CACHE_L2X0 ) && -of_find_compatible_node (NULL ,NULL ,"arm,pl310-cache" )) { -highbank_smc1 (0x102 ,0x1 ); +if (IS_ENABLED (CONFIG_CACHE_L2X0 )) { outer_cache.write_sec = highbank_l2c310_write_sec;l2x0_of_init (0 , ~0 ); }
Signature · 1 line
1.8.3.1
PATCH 46/97 ARM: l2c: ux500: implement dummy write_sec method
In reply to Russell King - ARM Linuxux500 can't write to any of the secure registers on the L2C controllers, so provide a dummy handler which ignores all writes.
--- arch/arm/mach-ux500/cache-l2x0.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
arch/arm/mach-ux500/cache-l2x0.c +10 -9
@@ -35,6 +35,14 @@ static int __init ux500_l2x0_unlock(void)return 0 ; } +static void ux500_l2c310_write_sec (unsigned long val,unsigned reg) +{ +/* +* We can't write to secure registers as we are in non-secure +* mode, until we have some SMI service available. +*/ +} +static int __init ux500_l2x0_init (void ) {u32 aux_val =0x3e000000 ;
@@ -56,21 +64,14 @@ static int __init ux500_l2x0_init(void)/* 64KB way size */ aux_val |= (0x3 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ); + outer_cache.write_sec = ux500_l2c310_write_sec; +/* 64KB way size, 8 way associativity, force WA */ if (of_have_populated_dt ())l2x0_of_init (aux_val,0xc0000fff );else l2x0_init (l2x0_base, aux_val,0xc0000fff ); -/* -* We can't disable l2 as we are in non secure mode, currently -* this seems be called only during kexec path. So let's -* override outer.disable with nasty assignment until we have -* some SMI service available. -*/ - outer_cache.disable =NULL ; - outer_cache.set_debug =NULL ; -return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 47/97 ARM: l2c: remove old .set_debug method
In reply to Russell King - ARM LinuxWe no longer need or require the .set_debug method; we handle everything it used to do via the .write_sec method instead.
--- arch/arm/include/asm/outercache.h | 1 - arch/arm/mm/cache-l2x0.c | 21 ++------------------- 2 files changed, 2 insertions(+), 20 deletions(-)
arch/arm/include/asm/outercache.h +0 -1
@@ -36,7 +36,6 @@ struct outer_cache_fns {void (*resume)(void );/* This is an ARM L2C thing */ -void (*set_debug)(unsigned long );void (*write_sec)(unsigned long ,unsigned ); };
arch/arm/mm/cache-l2x0.c +2 -19
@@ -80,10 +80,7 @@ static void l2c_write_sec(unsigned long val, void __iomem *base, unsigned reg)*/ static inline void l2c_set_debug (void __iomem *base,unsigned long val) { -if (outer_cache.set_debug) - outer_cache.set_debug (val); -else -l2c_write_sec (val, base,L2X0_DEBUG_CTRL ); +l2c_write_sec (val, base,L2X0_DEBUG_CTRL ); }static void __l2c_op_way (void __iomem *reg)
@@ -154,8 +151,7 @@ static inline void cache_sync(void)#if defined(CONFIG_PL310_ERRATA_588369 ) || defined(CONFIG_PL310_ERRATA_727915 )static inline void debug_writel (unsigned long val) { -if (outer_cache.set_debug || outer_cache.write_sec) -l2c_set_debug (l2x0_base, val); +l2c_set_debug (l2x0_base, val); }#else /* Optimised out for non-errata case */
@@ -489,11 +485,6 @@ static const struct l2c_init_data l2c220_data = {* Affects: store buffer * store buffer is not automatically drained. */ -static void l2c310_set_debug (unsigned long val) -{ -writel_relaxed (val, l2x0_base +L2X0_DEBUG_CTRL ); -} -static void l2c310_inv_range_erratum (unsigned long start,unsigned long end) {void __iomem *base = l2x0_base;
@@ -631,10 +622,6 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id,const char *errata[4 ];unsigned n =0 ; -/* For compatibility */ -if (revision <=L310_CACHE_ID_RTL_R3P0 ) - fns->set_debug = l2c310_set_debug; - if (IS_ENABLED(CONFIG_PL310_ERRATA_588369) && revision < L310_CACHE_ID_RTL_R2P0 &&/* For bcm compatibility */
@@ -684,7 +671,6 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .flush_all = l2c210_flush_all, .disable = l2c_disable, .sync = l2c210_sync, - .set_debug = l2c310_set_debug, .resume = l2c310_resume, }, };
@@ -750,8 +736,6 @@ static void __init __l2c_init(const struct l2c_init_data *data, fns.write_sec = outer_cache.write_sec;if (data->fixup) data->fixup (l2x0_base, cache_id, &fns); -if (fns.write_sec) - fns.set_debug =NULL ;/* * Check if l2x0 controller is already enabled. If we are booting
@@ -925,7 +909,6 @@ static const struct l2c_init_data of_l2c310_data __initconst = { .flush_all = l2c210_flush_all, .disable = l2c_disable, .sync = l2c210_sync, - .set_debug = l2c310_set_debug, .resume = l2c310_resume, }, };
Signature · 1 line
1.8.3.1
PATCH 48/97 ARM: l2c: implement L2C-310 erratum 752271 in core L2C code
In reply to Russell King - ARM LinuxRather than having SoCs work around L2C erratum themselves, move them into core code. This erratum affects the double linefill feature which needs to be disabled for r3p0 to r3p1-50rel0.
--- arch/arm/mm/cache-l2x0.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
arch/arm/mm/cache-l2x0.c +17 -1
@@ -476,6 +476,11 @@ static const struct l2c_init_data l2c220_data = {* hit the line between the clean operation and invalidate operation, * resulting in the store being lost. * +* 752271: PL310 R3P0->R3P1-50REL0, fixed R3P2. +* Affects: 8x64-bit (double fill) line fetches +* double fill line fetches can fail to cause dirty data to be evicted +* from the cache before the new data overwrites the second line. +* * 753970: PL310 R3P0, fixed R3P1. * Affects: sync * prevents merging writes after the sync operation, until another L2C
@@ -619,7 +624,7 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id, struct outer_cache_fns *fns) {unsigned revision = cache_id &L2X0_CACHE_ID_RTL_MASK ; -const char *errata[4 ]; +const char *errata[8 ];unsigned n =0 ; if (IS_ENABLED(CONFIG_PL310_ERRATA_588369) &&
@@ -638,6 +643,17 @@ static void __init l2c310_fixup(void __iomem *base, u32 cache_id, errata[n++] ="727915" ; } +if (revision >=L310_CACHE_ID_RTL_R3P0 && + revision <L310_CACHE_ID_RTL_R3P2 ) { +u32 val =readl_relaxed (base +L2X0_PREFETCH_CTRL ); +/* I don't think bit23 is required here... but iMX6 does so */ +if (val & (BIT (30 ) |BIT (23 ))) { + val &= ~(BIT (30 ) |BIT (23 )); +l2c_write_sec (val, base,L2X0_PREFETCH_CTRL ); + errata[n++] ="752271" ; + } + } +if (IS_ENABLED (CONFIG_PL310_ERRATA_753970 ) && revision ==L310_CACHE_ID_RTL_R3P0 ) { sync_reg_offset =L2X0_DUMMY_REG ;
Signature · 1 line
1.8.3.1
PATCH 49/97 ARM: l2c: fix register naming
In reply to Russell King - ARM LinuxWe have a mixture of different devices with different register layouts, but we group all the bits together in an opaque mess. Split them out into those which are L2C-310 specific and ones which refer to earlier devices. Provide full auxiliary control register definitions.
--- arch/arm/include/asm/hardware/cache-l2x0.h | 73 ++++++++++++++++++++---------- arch/arm/mach-cns3xxx/core.c | 8 ++-- arch/arm/mach-exynos/sleep.S | 8 ++-- arch/arm/mach-imx/system.c | 8 ++-- arch/arm/mach-omap2/omap-mpuss-lowpower.c | 2 +- arch/arm/mach-omap2/omap4-common.c | 18 ++++---- arch/arm/mach-prima2/l2x0.c | 5 +- arch/arm/mach-realview/realview_pbx.c | 4 +- arch/arm/mach-spear/spear13xx.c | 6 +-- arch/arm/mach-sti/board-dt.c | 8 ++-- arch/arm/mach-tegra/sleep.h | 8 ++-- arch/arm/mach-ux500/cache-l2x0.c | 4 +- arch/arm/mach-vexpress/ct-ca9x4.c | 4 +- arch/arm/mm/cache-l2x0.c | 57 +++++++++++------------ 14 files changed, 118 insertions(+), 95 deletions(-)
arch/arm/include/asm/hardware/cache-l2x0.h +48 -25
@@ -26,8 +26,8 @@#define L2X0_CACHE_TYPE 0x004#define L2X0_CTRL 0x100#define L2X0_AUX_CTRL 0x104 -#define L2X0_TAG_LATENCY_CTRL 0x108 -#define L2X0_DATA_LATENCY_CTRL 0x10C +#define L310_TAG_LATENCY_CTRL 0x108 +#define L310_DATA_LATENCY_CTRL 0x10C#define L2X0_EVENT_CNT_CTRL 0x200#define L2X0_EVENT_CNT1_CFG 0x204#define L2X0_EVENT_CNT0_CFG 0x208
@@ -54,16 +54,16 @@#define L2X0_LOCKDOWN_WAY_D_BASE 0x900#define L2X0_LOCKDOWN_WAY_I_BASE 0x904#define L2X0_LOCKDOWN_STRIDE 0x08 -#define L2X0_ADDR_FILTER_START 0xC00 -#define L2X0_ADDR_FILTER_END 0xC04 +#define L310_ADDR_FILTER_START 0xC00 +#define L310_ADDR_FILTER_END 0xC04#define L2X0_TEST_OPERATION 0xF00#define L2X0_LINE_DATA 0xF10#define L2X0_LINE_TAG 0xF30#define L2X0_DEBUG_CTRL 0xF40 -#define L2X0_PREFETCH_CTRL 0xF60 -#define L2X0_POWER_CTRL 0xF80 -#define L2X0_DYNAMIC_CLK_GATING_EN (1 << 1) -#define L2X0_STNDBY_MODE_EN (1 << 0) +#define L310_PREFETCH_CTRL 0xF60 +#define L310_POWER_CTRL 0xF80 +#define L310_DYNAMIC_CLK_GATING_EN (1 << 1) +#define L310_STNDBY_MODE_EN (1 << 0)/* Registers shifts and masks */ #define L2X0_CACHE_ID_PART_MASK (0xf << 6)
@@ -88,29 +88,52 @@#define L310_CACHE_ID_RTL_R3P3 0x09#define L2X0_AUX_CTRL_MASK 0xc0000fff +/* L2C auxiliary control register - bits common to L2C-210/220/310 */ +#define L2C_AUX_CTRL_WAY_SIZE_SHIFT 17 +#define L2C_AUX_CTRL_WAY_SIZE_MASK (7 << 17) +#define L2C_AUX_CTRL_WAY_SIZE (n) ((n) << 17) +#define L2C_AUX_CTRL_EVTMON_ENABLE BIT(20) +#define L2C_AUX_CTRL_PARITY_ENABLE BIT(21) +#define L2C_AUX_CTRL_SHARED_OVERRIDE BIT(22) +/* L2C-210/220 common bits */ #define L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT 0 -#define L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK 0x7 +#define L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK (7 << 0)#define L2X0_AUX_CTRL_DATA_WR_LATENCY_SHIFT 3 -#define L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK (0x7 << 3) +#define L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK (7 << 3)#define L2X0_AUX_CTRL_TAG_LATENCY_SHIFT 6 -#define L2X0_AUX_CTRL_TAG_LATENCY_MASK (0x7 << 6) +#define L2X0_AUX_CTRL_TAG_LATENCY_MASK (7 << 6)#define L2X0_AUX_CTRL_DIRTY_LATENCY_SHIFT 9 -#define L2X0_AUX_CTRL_DIRTY_LATENCY_MASK (0x7 << 9) -#define L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT 16 -#define L2X0_AUX_CTRL_WAY_SIZE_SHIFT 17 -#define L2X0_AUX_CTRL_WAY_SIZE_MASK (0x7 << 17) -#define L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT 22 -#define L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT 26 -#define L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT 27 -#define L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT 28 -#define L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT 29 -#define L2X0_AUX_CTRL_EARLY_BRESP_SHIFT 30 +#define L2X0_AUX_CTRL_DIRTY_LATENCY_MASK (7 << 9) +#define L2X0_AUX_CTRL_ASSOC_SHIFT 13 +#define L2X0_AUX_CTRL_ASSOC_MASK (15 << 13) +/* L2C-210 specific bits */ +#define L210_AUX_CTRL_WRAP_DISABLE BIT(12) +#define L210_AUX_CTRL_WA_OVERRIDE BIT(23) +#define L210_AUX_CTRL_EXCLUSIVE_ABORT BIT(24) +/* L2C-220 specific bits */ +#define L220_AUX_CTRL_EXCLUSIVE_CACHE BIT(12) +#define L220_AUX_CTRL_FWA_SHIFT 23 +#define L220_AUX_CTRL_FWA_MASK (3 << 23) +#define L220_AUX_CTRL_NS_LOCKDOWN BIT(26) +#define L220_AUX_CTRL_NS_INT_CTRL BIT(27) +/* L2C-310 specific bits */ +#define L310_AUX_CTRL_FULL_LINE_ZERO BIT(0)/* R2P0+ */ +#define L310_AUX_CTRL_HIGHPRIO_SO_DEV BIT(10)/* R2P0+ */ +#define L310_AUX_CTRL_STORE_LIMITATION BIT(11)/* R2P0+ */ +#define L310_AUX_CTRL_EXCLUSIVE_CACHE BIT(12) +#define L310_AUX_CTRL_ASSOCIATIVITY_16 BIT(16) +#define L310_AUX_CTRL_CACHE_REPLACE_RR BIT(25)/* R2P0+ */ +#define L310_AUX_CTRL_NS_LOCKDOWN BIT(26) +#define L310_AUX_CTRL_NS_INT_CTRL BIT(27) +#define L310_AUX_CTRL_DATA_PREFETCH BIT(28) +#define L310_AUX_CTRL_INSTR_PREFETCH BIT(29) +#define L310_AUX_CTRL_EARLY_BRESP BIT(30)/* R2P0+ */ -#define L2X0_LATENCY_CTRL_SETUP_SHIFT 0 -#define L2X0_LATENCY_CTRL_RD_SHIFT 4 -#define L2X0_LATENCY_CTRL_WR_SHIFT 8 +#define L310_LATENCY_CTRL_SETUP (n) ((n) << 0) +#define L310_LATENCY_CTRL_RD (n) ((n) << 4) +#define L310_LATENCY_CTRL_WR (n) ((n) << 8) -#define L2X0_ADDR_FILTER_EN 1 +#define L310_ADDR_FILTER_EN 1#define L2X0_CTRL_EN 1
arch/arm/mach-cns3xxx/core.c +4 -4
@@ -272,9 +272,9 @@ void __init cns3xxx_l2x0_init(void)* * 1 cycle of latency for setup, read and write accesses */ - val =readl (base +L2X0_TAG_LATENCY_CTRL ); + val =readl (base +L310_TAG_LATENCY_CTRL ); val &=0xfffff888 ; -writel (val, base +L2X0_TAG_LATENCY_CTRL ); +writel (val, base +L310_TAG_LATENCY_CTRL );/* * Data RAM Control register
@@ -285,9 +285,9 @@ void __init cns3xxx_l2x0_init(void)* * 1 cycle of latency for setup, read and write accesses */ - val =readl (base +L2X0_DATA_LATENCY_CTRL ); + val =readl (base +L310_DATA_LATENCY_CTRL ); val &=0xfffff888 ; -writel (val, base +L2X0_DATA_LATENCY_CTRL ); +writel (val, base +L310_DATA_LATENCY_CTRL );/* 32 KiB, 8-way, parity disable */ l2x0_init (base,0x00540000 ,0xfe000fff );
arch/arm/mach-exynos/sleep.S +4 -4
@@ -65,13 +65,13 @@ ENTRY(exynos_cpu_resume) ldr r2, [r0, #L2X0_R_AUX_CTRL] str r2, [r1, #L2X0_AUX_CTRL] ldr r2, [r0, #L2X0_R_TAG_LATENCY] - str r2, [r1, #L2X0_TAG_LATENCY_CTRL] + str r2, [r1, #L310_TAG_LATENCY_CTRL] ldr r2, [r0, #L2X0_R_DATA_LATENCY] - str r2, [r1, #L2X0_DATA_LATENCY_CTRL] + str r2, [r1, #L310_DATA_LATENCY_CTRL] ldr r2, [r0, #L2X0_R_PREFETCH_CTRL] - str r2, [r1, #L2X0_PREFETCH_CTRL] + str r2, [r1, #L310_PREFETCH_CTRL] ldr r2, [r0, #L2X0_R_PWR_CTRL] - str r2, [r1, #L2X0_POWER_CTRL] + str r2, [r1, #L310_POWER_CTRL] mov r2, #1 str r2, [r1, #L2X0_CTRL] skip_l2_resume:
arch/arm/mach-imx/system.c +4 -4
@@ -124,7 +124,7 @@ void __init imx_init_l2cache(void) }/* Configure the L2 PREFETCH and POWER registers */ - val =readl_relaxed (l2x0_base +L2X0_PREFETCH_CTRL ); + val =readl_relaxed (l2x0_base +L310_PREFETCH_CTRL ); val |=0x70800000 ;/* * The L2 cache controller(PL310) version on the i.MX6D/Q is r3p1-50rel0
@@ -137,9 +137,9 @@ void __init imx_init_l2cache(void)*/ if (cpu_is_imx6q ()) val &= ~(1 <<30 |1 <<23 ); -writel_relaxed (val, l2x0_base +L2X0_PREFETCH_CTRL ); - val =L2X0_DYNAMIC_CLK_GATING_EN |L2X0_STNDBY_MODE_EN ; -writel_relaxed (val, l2x0_base +L2X0_POWER_CTRL ); +writel_relaxed (val, l2x0_base +L310_PREFETCH_CTRL ); + val =L310_DYNAMIC_CLK_GATING_EN |L310_STNDBY_MODE_EN ; +writel_relaxed (val, l2x0_base +L310_POWER_CTRL );iounmap (l2x0_base);of_node_put (np);
arch/arm/mach-omap2/omap-mpuss-lowpower.c +1 -1
@@ -194,7 +194,7 @@ static void save_l2x0_context(void)if (l2x0_base) { val =__raw_readl (l2x0_base +L2X0_AUX_CTRL );__raw_writel (val, sar_base +L2X0_AUXCTRL_OFFSET ); - val =__raw_readl (l2x0_base +L2X0_PREFETCH_CTRL ); + val =__raw_readl (l2x0_base +L310_PREFETCH_CTRL );__raw_writel (val, sar_base +L2X0_PREFETCH_CTRL_OFFSET ); } }
arch/arm/mach-omap2/omap4-common.c +9 -9
@@ -213,15 +213,15 @@ static int __init omap_l2_cache_init(void)return -ENOMEM ;/* 16-way associativity, parity disabled, way size - 64KB (es2.0 +) */ - aux_ctrl = (1 <<L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT ) | - (0x1 <<25 ) | - (0x1 <<L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT ) | - (0x1 << L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT)) | - (0x3 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ) | - (1 <<L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT ) | - (1 <<L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT ) | - (1 <<L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT ) | - (1 <<L2X0_AUX_CTRL_EARLY_BRESP_SHIFT ); + aux_ctrl =L310_AUX_CTRL_ASSOCIATIVITY_16 | +L310_AUX_CTRL_CACHE_REPLACE_RR | +L310_AUX_CTRL_NS_LOCKDOWN | +L310_AUX_CTRL_NS_INT_CTRL | +L2C_AUX_CTRL_WAY_SIZE (3 ) | +L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | +L310_AUX_CTRL_INSTR_PREFETCH | +L310_AUX_CTRL_EARLY_BRESP ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ())
arch/arm/mach-prima2/l2x0.c +2 -3
@@ -17,13 +17,12 @@ struct l2x0_aux { };static const struct l2x0_aux prima2_l2x0_aux__initconst = { - .val =2 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT , + .val =L2C_AUX_CTRL_WAY_SIZE (2 ), .mask =0 , };static const struct l2x0_aux marco_l2x0_aux__initconst = { - .val = (2 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ) | - (1 <<L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT ), + .val =L2C_AUX_CTRL_WAY_SIZE (2 ) |L310_AUX_CTRL_ASSOCIATIVITY_16 , .mask =L2X0_AUX_CTRL_MASK , };
arch/arm/mach-realview/realview_pbx.c +2 -2
@@ -370,8 +370,8 @@ static void __init realview_pbx_init(void)__io_address (REALVIEW_PBX_TILE_L220_BASE );/* set RAM latencies to 1 cycle for eASIC */ -writel (0 , l2x0_base +L2X0_TAG_LATENCY_CTRL ); -writel (0 , l2x0_base +L2X0_DATA_LATENCY_CTRL ); +writel (0 , l2x0_base +L310_TAG_LATENCY_CTRL ); +writel (0 , l2x0_base +L310_DATA_LATENCY_CTRL );/* 16KB way size, 8-way associativity, parity disabled * Bits: .. 0 0 0 0 1 00 1 0 1 001 0 000 0 .... .... .... */
arch/arm/mach-spear/spear13xx.c +3 -3
@@ -38,14 +38,14 @@ void __init spear13xx_l2x0_init(void)if (!IS_ENABLED (CONFIG_CACHE_L2X0 ))return ; -writel_relaxed (0x06 ,VA_L2CC_BASE +L2X0_PREFETCH_CTRL ); +writel_relaxed (0x06 ,VA_L2CC_BASE +L310_PREFETCH_CTRL );/* * Program following latencies in order to make * SPEAr1340 work@600 MHz */ -writel_relaxed (0x221 ,VA_L2CC_BASE +L2X0_TAG_LATENCY_CTRL ); -writel_relaxed (0x441 ,VA_L2CC_BASE +L2X0_DATA_LATENCY_CTRL ); +writel_relaxed (0x221 ,VA_L2CC_BASE +L310_TAG_LATENCY_CTRL ); +writel_relaxed (0x441 ,VA_L2CC_BASE +L310_DATA_LATENCY_CTRL );l2x0_init (VA_L2CC_BASE ,0x70A60001 ,0xfe00ffff ); }
arch/arm/mach-sti/board-dt.c +4 -4
@@ -19,10 +19,10 @@ void __init stih41x_l2x0_init(void)u32 way_size =0x4 ;u32 aux_ctrl;/* may be this can be encoded in macros like BIT*() */ - aux_ctrl = (0x1 <<L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT ) | - (0x1 <<L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT ) | - (0x1 <<L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT ) | - (way_size <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ); + aux_ctrl =L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | +L310_AUX_CTRL_INSTR_PREFETCH | +L2C_AUX_CTRL_WAY_SIZE (way_size);l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK ); }
arch/arm/mach-tegra/sleep.h +4 -4
@@ -134,13 +134,13 @@ tst \tmp3, #L2X0_CTRL_ENbne exit_l2_resume ldr \tmp3, [\tmp1, #L2X0_R_TAG_LATENCY] - str \tmp3, [\tmp2, #L2X0_TAG_LATENCY_CTRL] + str \tmp3, [\tmp2, #L310_TAG_LATENCY_CTRL] ldr \tmp3, [\tmp1, #L2X0_R_DATA_LATENCY] - str \tmp3, [\tmp2, #L2X0_DATA_LATENCY_CTRL] + str \tmp3, [\tmp2, #L310_DATA_LATENCY_CTRL] ldr \tmp3, [\tmp1, #L2X0_R_PREFETCH_CTRL] - str \tmp3, [\tmp2, #L2X0_PREFETCH_CTRL] + str \tmp3, [\tmp2, #L310_PREFETCH_CTRL] ldr \tmp3, [\tmp1, #L2X0_R_PWR_CTRL] - str \tmp3, [\tmp2, #L2X0_POWER_CTRL] + str \tmp3, [\tmp2, #L310_POWER_CTRL] ldr \tmp3, [\tmp1, #L2X0_R_AUX_CTRL] str \tmp3, [\tmp2, #L2X0_AUX_CTRL] mov \tmp3, #L2X0_CTRL_EN
arch/arm/mach-ux500/cache-l2x0.c +2 -2
@@ -59,10 +59,10 @@ static int __init ux500_l2x0_init(void)/* DBx540's L2 has 128KB way size */ if (cpu_is_ux540_family ())/* 128KB way size */ - aux_val |= (0x4 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ); + aux_val |=L2C_AUX_CTRL_WAY_SIZE (4 );else /* 64KB way size */ - aux_val |= (0x3 <<L2X0_AUX_CTRL_WAY_SIZE_SHIFT ); + aux_val |=L2C_AUX_CTRL_WAY_SIZE (3 ); outer_cache.write_sec = ux500_l2c310_write_sec;
arch/arm/mach-vexpress/ct-ca9x4.c +2 -2
@@ -145,8 +145,8 @@ static void __init ct_ca9x4_init(void)void __iomem *l2x0_base =ioremap (CT_CA9X4_L2CC ,SZ_4K );/* set RAM latencies to 1 cycle for this core tile. */ -writel (0 , l2x0_base +L2X0_TAG_LATENCY_CTRL ); -writel (0 , l2x0_base +L2X0_DATA_LATENCY_CTRL ); +writel (0 , l2x0_base +L310_TAG_LATENCY_CTRL ); +writel (0 , l2x0_base +L310_DATA_LATENCY_CTRL );l2x0_init (l2x0_base,0x00400000 ,0xfe0fffff );#endif
arch/arm/mm/cache-l2x0.c +29 -28
136 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 49/97 ARM: l2c: fix register naming
Quoted 4 lines · Russell King
We have a mixture of different devices with different register layouts, but we group all the bits together in an opaque mess. Split them out into those which are L2C-310 specific and ones which refer to earlier devices. Provide full auxiliary control register definitions.
PATCH 50/97 ARM: l2c: add automatic enable of early BRESP
In reply to Russell King - ARM LinuxThe AXI bus protocol requires that a write response should only be sent back to the master when the last write has been accepted. Early BRESP allows the L2C-310 to send the write response as soon as the store buffer accepts the write address.
Cortex-A9 processors can signal to the L2C-310 that they wish to be notified early, and if this optimisation is enabled, the L2C-310 can signal an early write response.
--- arch/arm/mm/cache-l2x0.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)
arch/arm/mm/cache-l2x0.c +22 -3
@@ -24,6 +24,7 @@#include <linux/of_address.h> #include <asm/cacheflush.h> +#include <asm/cputype.h> #include <asm/hardware/cache-l2x0.h> #include "cache-tauros3.h" #include "cache-aurora-l2.h"
@@ -620,6 +621,24 @@ static void l2c310_resume(void) } } +static void __init l2c310_enable (void __iomem *base,u32 aux,unsigned num_lock) +{ +unsigned rev =readl_relaxed (base +L2X0_CACHE_ID ) &L2X0_CACHE_ID_PART_MASK ; +bool cortex_a9 =read_cpuid_part_number () ==ARM_CPU_PART_CORTEX_A9 ; + +if (rev >=L310_CACHE_ID_RTL_R2P0 ) { +if (cortex_a9) { + aux |=L310_AUX_CTRL_EARLY_BRESP ; +pr_info ("L2C-310 enabling early BRESP for Cortex-A9\n" ); + }else if (aux &L310_AUX_CTRL_EARLY_BRESP ) { +pr_warn ("L2C-310 early BRESP only supported with Cortex-A9\n" ); + aux &= ~L310_AUX_CTRL_EARLY_BRESP ; + } + } + +l2c_enable (base, aux, num_lock); +} +static void __init l2c310_fixup (void __iomem *base,u32 cache_id,struct outer_cache_fns *fns) {
@@ -677,7 +696,7 @@ static const struct l2c_init_data l2c310_init_fns __initconst = { .type = "L2C-310", .way_size_0 = SZ_8K, .num_lock = 8, - .enable = l2c_enable, + .enable = l2c310_enable, .fixup = l2c310_fixup, .save = l2c310_save, .outer_cache = {
@@ -916,7 +935,7 @@ static const struct l2c_init_data of_l2c310_data __initconst = { .way_size_0 = SZ_8K, .num_lock = 8, .of_parse = l2c310_of_parse, - .enable = l2c_enable, + .enable = l2c310_enable, .fixup = l2c310_fixup, .save = l2c310_save, .outer_cache = {
@@ -1264,7 +1283,7 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = { .way_size_0 = SZ_8K, .num_lock = 8, .of_parse = l2c310_of_parse, - .enable = l2c_enable, + .enable = l2c310_enable, .save = l2c310_save, .outer_cache = { .inv_range = bcm_inv_range,
Signature · 1 line
1.8.3.1
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
In reply to Russell King - ARM LinuxSince we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
--- arch/arm/mach-berlin/berlin.c | 2 +- arch/arm/mach-exynos/exynos.c | 4 ++-- arch/arm/mach-omap2/omap4-common.c | 3 +-- arch/arm/mach-shmobile/board-armadillo800eva-reference.c | 4 ++-- arch/arm/mach-shmobile/board-armadillo800eva.c | 4 ++-- arch/arm/mach-shmobile/board-kzm9g-reference.c | 4 ++-- arch/arm/mach-shmobile/board-kzm9g.c | 4 ++-- arch/arm/mach-shmobile/setup-r8a7778.c | 4 ++-- arch/arm/mach-shmobile/setup-r8a7779.c | 4 ++-- arch/arm/mach-spear/spear13xx.c | 2 +- arch/arm/mach-tegra/tegra.c | 4 ++-- 11 files changed, 19 insertions(+), 20 deletions(-)
arch/arm/mach-berlin/berlin.c +1 -1
@@ -24,7 +24,7 @@ static void __init berlin_init_machine(void)* with DT probing for L2CCs, berlin_init_machine can be removed. * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc */ -l2x0_of_init (0x70c00000 ,0xfeffffff ); +l2x0_of_init (0x30c00000 ,0xfeffffff );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }
arch/arm/mach-exynos/exynos.c +2 -2
@@ -32,8 +32,8 @@#include "mfc.h" #include "regs-pmu.h" -#define L2_AUX_VAL 0x7C470001 -#define L2_AUX_MASK 0xC200ffff +#define L2_AUX_VAL 0x3c470001 +#define L2_AUX_MASK 0xc200ffffstatic struct map_desc exynos4_iodesc[]__initdata = { {
arch/arm/mach-omap2/omap4-common.c +1 -2
@@ -220,8 +220,7 @@ static int __init omap_l2_cache_init(void)L2C_AUX_CTRL_WAY_SIZE (3 ) |L2C_AUX_CTRL_SHARED_OVERRIDE |L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH | -L310_AUX_CTRL_EARLY_BRESP ; +L310_AUX_CTRL_INSTR_PREFETCH ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ())
arch/arm/mach-shmobile/board-armadillo800eva-reference.c +2 -2
@@ -164,8 +164,8 @@ static void __init eva_init(void)r8a7740_meram_workaround ();#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x40440000 ,0x82000fff ); +/* Shared attribute override enable, 32K*8way */ +l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff );#endif r8a7740_add_standard_devices_dt ();
arch/arm/mach-shmobile/board-armadillo800eva.c +2 -2
@@ -1270,8 +1270,8 @@ static void __init eva_init(void)#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x40440000 ,0x82000fff ); +/* Shared attribute override enable, 32K*8way */ +l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));
arch/arm/mach-shmobile/board-kzm9g-reference.c +2 -2
@@ -36,8 +36,8 @@ static void __init kzm_init(void)sh73a0_add_standard_devices_dt ();#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x40460000 ,0x82000fff ); +/* Shared attribute override enable, 64K*8way */ +l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff );#endif }
arch/arm/mach-shmobile/board-kzm9g.c +2 -2
@@ -876,8 +876,8 @@ static void __init kzm_init(void)gpio_request_one (223 ,GPIOF_IN ,NULL );/* IRQ8 */ #ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x40460000 ,0x82000fff ); +/* Shared attribute override enable, 64K*8way */ +l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));
arch/arm/mach-shmobile/setup-r8a7778.c +2 -2
@@ -298,10 +298,10 @@ void __init r8a7778_add_dt_devices(void)void __iomem *base =ioremap_nocache (0xf0100000 ,0x1000 );if (base) {/* -* Early BRESP enable, Shared attribute override enable, 64K*16way +* Shared attribute override enable, 64K*16way * don't call iounmap(base) */ -l2x0_init (base,0x40470000 ,0x82000fff ); +l2x0_init (base,0x00470000 ,0xc2000fff ); }#endif
arch/arm/mach-shmobile/setup-r8a7779.c +2 -2
@@ -700,8 +700,8 @@ static struct platform_device *r8a7779_standard_devices[] __initdata = {void __init r8a7779_add_standard_devices (void ) {#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*16way */ -l2x0_init (IOMEM (0xf0100000 ),0x40470000 ,0x82000fff ); +/* Shared attribute override enable, 64K*16way */ +l2x0_init (IOMEM (0xf0100000 ),0x00470000 ,0xc2000fff );#endif r8a7779_pm_init ();
arch/arm/mach-spear/spear13xx.c +1 -1
@@ -46,7 +46,7 @@ void __init spear13xx_l2x0_init(void)*/ writel_relaxed (0x221 ,VA_L2CC_BASE +L310_TAG_LATENCY_CTRL );writel_relaxed (0x441 ,VA_L2CC_BASE +L310_DATA_LATENCY_CTRL ); -l2x0_init (VA_L2CC_BASE ,0x70A60001 ,0xfe00ffff ); +l2x0_init (VA_L2CC_BASE ,0x30a60001 ,0xfe00ffff ); }/*
arch/arm/mach-tegra/tegra.c +2 -2
@@ -89,9 +89,9 @@ static void __init tegra_init_cache(void) cache_type =readl (p +L2X0_CACHE_TYPE ); aux_ctrl = (cache_type &0x700 ) << (17 -8 ); - aux_ctrl |=0x7C400001 ; + aux_ctrl |=0x3c400001 ; - ret =l2x0_of_init (aux_ctrl,0x8200c3fe ); + ret =l2x0_of_init (aux_ctrl,0xc200c3fe );if (!ret) l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs);#endif
Signature · 1 line
1.8.3.1
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
Quoted 4 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
In reply to Russell KingQuoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>
I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
Quoted 180 lines
--- arch/arm/mach-berlin/berlin.c | 2 +- arch/arm/mach-exynos/exynos.c | 4 ++-- arch/arm/mach-omap2/omap4-common.c | 3 +-- arch/arm/mach-shmobile/board-armadillo800eva-reference.c | 4 ++-- arch/arm/mach-shmobile/board-armadillo800eva.c | 4 ++-- arch/arm/mach-shmobile/board-kzm9g-reference.c | 4 ++-- arch/arm/mach-shmobile/board-kzm9g.c | 4 ++-- arch/arm/mach-shmobile/setup-r8a7778.c | 4 ++-- arch/arm/mach-shmobile/setup-r8a7779.c | 4 ++-- arch/arm/mach-spear/spear13xx.c | 2 +- arch/arm/mach-tegra/tegra.c | 4 ++-- 11 files changed, 19 insertions(+), 20 deletions(-)arch/arm/mach-berlin/berlin.c +1
-1@@ -24,7 +24,7 @@ static void __init berlin_init_machine(void)* with DT probing for L2CCs, berlin_init_machine can be removed. * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc */ -l2x0_of_init (0x70c00000 ,0xfeffffff ); +l2x0_of_init (0x30c00000 ,0xfeffffff );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }arch/arm/mach-exynos/exynos.c +2
-2@@ -32,8 +32,8 @@#include "mfc.h" #include "regs-pmu.h" -#define L2_AUX_VAL 0x7C470001 -#define L2_AUX_MASK 0xC200ffff +#define L2_AUX_VAL 0x3c470001 +#define L2_AUX_MASK 0xc200ffffstatic struct map_desc exynos4_iodesc[]__initdata = { {arch/arm/mach-omap2/omap4-common.c +1
-2@@ -220,8 +220,7 @@ static int __init omap_l2_cache_init(void)L2C_AUX_CTRL_WAY_SIZE (3 ) |L2C_AUX_CTRL_SHARED_OVERRIDE |L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH | -L310_AUX_CTRL_EARLY_BRESP ; +L310_AUX_CTRL_INSTR_PREFETCH ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ())arch/arm/mach-shmobile/board-armadillo800eva-reference.c +2
-2@@ -164,8 +164,8 @@ static void __init eva_init(void)r8a7740_meram_workaround ();#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x40440000 ,0x82000fff ); +/* Shared attribute override enable, 32K*8way */ +l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff );#endif r8a7740_add_standard_devices_dt ();arch/arm/mach-shmobile/board-armadillo800eva.c +2
-2@@ -1270,8 +1270,8 @@ static void __init eva_init(void)#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x40440000 ,0x82000fff ); +/* Shared attribute override enable, 32K*8way */ +l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));arch/arm/mach-shmobile/board-kzm9g-reference.c +2
-2@@ -36,8 +36,8 @@ static void __init kzm_init(void)sh73a0_add_standard_devices_dt ();#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x40460000 ,0x82000fff ); +/* Shared attribute override enable, 64K*8way */ +l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff );#endif }arch/arm/mach-shmobile/board-kzm9g.c +2
-2@@ -876,8 +876,8 @@ static void __init kzm_init(void)gpio_request_one (223 ,GPIOF_IN ,NULL );/* IRQ8 */ #ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x40460000 ,0x82000fff ); +/* Shared attribute override enable, 64K*8way */ +l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));arch/arm/mach-shmobile/setup-r8a7778.c +2
-2@@ -298,10 +298,10 @@ void __init r8a7778_add_dt_devices(void)void __iomem *base =ioremap_nocache (0xf0100000 ,0x1000 );if (base) {/* -* Early BRESP enable, Shared attribute override enable, 64K*16way +* Shared attribute override enable, 64K*16way * don't call iounmap(base) */ -l2x0_init (base,0x40470000 ,0x82000fff ); +l2x0_init (base,0x00470000 ,0xc2000fff ); }#endif arch/arm/mach-shmobile/setup-r8a7779.c +2
-2@@ -700,8 +700,8 @@ static struct platform_device *r8a7779_standard_devices[] __initdata = {void __init r8a7779_add_standard_devices (void ) {#ifdef CONFIG_CACHE_L2X0 -/* Early BRESP enable, Shared attribute override enable, 64K*16way */ -l2x0_init (IOMEM (0xf0100000 ),0x40470000 ,0x82000fff ); +/* Shared attribute override enable, 64K*16way */ +l2x0_init (IOMEM (0xf0100000 ),0x00470000 ,0xc2000fff );#endif r8a7779_pm_init ();arch/arm/mach-spear/spear13xx.c +1
-1@@ -46,7 +46,7 @@ void __init spear13xx_l2x0_init(void)*/ writel_relaxed (0x221 ,VA_L2CC_BASE +L310_TAG_LATENCY_CTRL );writel_relaxed (0x441 ,VA_L2CC_BASE +L310_DATA_LATENCY_CTRL ); -l2x0_init (VA_L2CC_BASE ,0x70A60001 ,0xfe00ffff ); +l2x0_init (VA_L2CC_BASE ,0x30a60001 ,0xfe00ffff ); }/* arch/arm/mach-tegra/tegra.c +2
-2@@ -89,9 +89,9 @@ static void __init tegra_init_cache(void) cache_type =readl (p +L2X0_CACHE_TYPE ); aux_ctrl = (cache_type &0x700 ) << (17 -8 ); - aux_ctrl |=0x7C400001 ; + aux_ctrl |=0x3c400001 ; - ret =l2x0_of_init (aux_ctrl,0x8200c3fe ); + ret =l2x0_of_init (aux_ctrl,0xc200c3fe );if (!ret) l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs);#endif Signature · 1 line
1.8.3.1
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
Quoted 9 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>
Quoted 6 lines
I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
Oh fuck that.
Okay, I'm dropping the whole patch set right now and forgetting the whole damned thing. The L2 cache code can damned well stay as it is and remain an unmaintainable mess.
Signature · 2 lines
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it.
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
Quoted 14 lines · Russell King - ARM Linux
Quoted 13 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Quoted 8 lines
Quoted 2 lines
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
Oh fuck that.
Okay, I'm dropping the whole patch set right now and forgetting the whole damned thing. The L2 cache code can damned well stay as it is and remain an unmaintainable mess.
FWIW, there are an awful lot of people, myself included, who do care that you've done this work. It is 100% okay for you to say "no" to requests to split things up because of the complexity of the series.
I really hope you're reconsider and not give up on this series.
g.
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
Hi Russell,
I emphatically second Grant's opinion here:
This is a good patch series and is a much-needed improvement.
I am in the middle of a board-port for an A9 system, and this series will greatly simplify things for me *despite* the fact that I will need to convert to the new write_sec() form of L2C control on PSCI-enabled non-secure platforms.
To reiterate Grant's request, please re-consider applying this L2C patch series!
Thank you,
jdl
Quoted 38 lines · Grant Likely
Quoted 14 lines · Russell King - ARM Linux
Quoted 13 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Quoted 8 lines
Quoted 2 lines
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
Oh fuck that.
Okay, I'm dropping the whole patch set right now and forgetting the whole damned thing. The L2 cache code can damned well stay as it is and remain an unmaintainable mess.
FWIW, there are an awful lot of people, myself included, who do care that you've done this work. It is 100% okay for you to say "no" to requests to split things up because of the complexity of the series.
I really hope you're reconsider and not give up on this series.
g.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
In reply to Grant LikelyQuoted 24 lines · Grant Likely
Quoted 14 lines · Russell King - ARM Linux
Quoted 13 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Quoted 8 lines
Quoted 2 lines
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
Oh fuck that.
Okay, I'm dropping the whole patch set right now and forgetting the whole damned thing. The L2 cache code can damned well stay as it is and remain an unmaintainable mess.
Quoted 5 lines
FWIW, there are an awful lot of people, myself included, who do care that you've done this work. It is 100% okay for you to say "no" to requests to split things up because of the complexity of the series.
I really hope you're reconsider and not give up on this series.
+1. I've been very behind on email lately and I haven't paid enough attention to this, but I'd like to see this go in for 3.16 as well, and it shouldn't have to go in through each subtree. Sequencing that in this case would be a huge pain indeed.
It would be better to just keep it all on a shared topic branch that we can merge into arm-soc as a dependency, so we can resolve merge conflicts as we merge in from platform maintainers. I wouldn't expect anything major besides some context conflicts due to nearby edits.
The only thing I am not 100% on is if it's a good idea or not to add to the machine descriptor, since it'll make it harder to make descriptor-free generic platforms for A9, but it's a minor detail and the benefit of the series outweigh that (and we can revisit if truly needed later).
-Olof
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
In reply to Simon HormanQuoted 9 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>
Quoted 6 lines
I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
There are far too many dependencies in this series to break out the board file patches to be merged separately; it'd take either a whole bunch of kernel releases to merge it all that way, or a twisty maze of tiny topic branches cross-merged all over the place. Neither option is realistic.
PATCH 51/97 ARM: l2c: remove platforms/SoCs setting early BRESP
Quoted 14 lines · Stephen Warren
Quoted 13 lines · Simon Horman
Quoted 7 lines · Russell King
Since we now automatically enable early BRESP in core L2C-310 code when we detect a Cortex-A9, we don't need platforms/SoCs to set this bit explicitly. Instead, they should seek to preserve the value of bit 30 in the auxiliary control register.
Acked-by Tony Lindgren <[email protected]>Signed-off-by Russell King <[email protected]>I would prefer if this patch was broken out into individual patches for each board or SoC file and that they were then picked up by their respective platform maintainers.
Quoted 8 lines
Quoted 2 lines
Likewise for patch 66/97. Although it is only for shmobile I would prefer it broken out.
There are far too many dependencies in this series to break out the board file patches to be merged separately; it'd take either a whole bunch of kernel releases to merge it all that way, or a twisty maze of tiny topic branches cross-merged all over the place. Neither option is realistic.
Understood, that seems reasonable to me.
For the shmobile portions this patch and 66/97.
PATCH 52/97 ARM: l2c: add platform independent core L2 cache initialisation
In reply to Russell King - ARM LinuxAdd a hook into the core ARM code to perform L2 cache initialisation in a platform independent manner. Platforms still get to indicate their auxiliary control register values and mask, but the initialisation call will now be made from generic code.
--- arch/arm/include/asm/mach/arch.h | 3 +++ arch/arm/kernel/irq.c | 12 ++++++++++++ 2 files changed, 15 insertions(+)
arch/arm/include/asm/mach/arch.h +3 -0
@@ -45,6 +45,9 @@ struct machine_desc { unsigned char reserve_lp1 :1; /* never has lp1 */ unsigned char reserve_lp2 :1; /* never has lp2 */enum reboot_mode reboot_mode;/* default restart mode */ +unsigned l2c_aux_val;/* L2 cache aux value */ +unsigned l2c_aux_mask;/* L2 cache aux mask */ +void (*l2c_write_sec)(unsigned long ,unsigned );struct smp_operations *smp;/* SMP operations */ bool (*smp_init)(void ); void (*fixup)(struct tag *, char **,
arch/arm/kernel/irq.c +12 -0
@@ -37,6 +37,7 @@#include <linux/proc_fs.h> #include <linux/export.h> +#include <asm/hardware/cache-l2x0.h> #include <asm/exception.h> #include <asm/mach/arch.h> #include <asm/mach/irq.h>
@@ -115,10 +116,21 @@ EXPORT_SYMBOL_GPL(set_irq_flags);void __init init_IRQ (void ) { +int ret; +if (IS_ENABLED (CONFIG_OF ) && !machine_desc->init_irq)irqchip_init ();else machine_desc->init_irq (); + +if (IS_ENABLED (CONFIG_OF ) &&IS_ENABLED (CONFIG_CACHE_L2X0 ) && + (machine_desc->l2c_aux_mask || machine_desc->l2c_aux_val)) { + outer_cache.write_sec = machine_desc->l2c_write_sec; + ret =l2x0_of_init (machine_desc->l2c_aux_val, + machine_desc->l2c_aux_mask); +if (ret) +pr_err ("L2C: failed to init: %d\n" , ret); + } }#ifdef CONFIG_MULTI_IRQ_HANDLER
Signature · 1 line
1.8.3.1
PATCH 53/97 ARM: l2c: provide common PL310 early resume code
In reply to Russell King - ARM Linux--- arch/arm/mm/Makefile | 2 +- arch/arm/mm/l2c-l2x0-resume.S | 58 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 arch/arm/mm/l2c-l2x0-resume.S
arch/arm/mm/Makefile +1 -1
@@ -97,6 +97,6 @@ AFLAGS_proc-v7.o :=-Wa,-march=armv7-a obj-$(CONFIG_OUTER_CACHE) += l2c-common.o obj-$(CONFIG_CACHE_FEROCEON_L2) += cache-feroceon-l2.o -obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o +obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o l2c-l2x0-resume.o obj-$(CONFIG_CACHE_XSC3L2) += cache-xsc3l2.o obj-$(CONFIG_CACHE_TAUROS2) += cache-tauros2.o
arch/arm/mm/l2c-l2x0-resume.S new file +58 -0
58 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 54/97 ARM: l2c: tegra: remove associativity and way size from aux_ctrl
In reply to Russell King - ARM Linux--- arch/arm/mach-tegra/tegra.c | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-)
arch/arm/mach-tegra/tegra.c +1 -17
@@ -73,25 +73,9 @@ u32 tegra_uart_config[3] = {static void __init tegra_init_cache (void ) {#ifdef CONFIG_CACHE_L2X0 -static const struct of_device_id pl310_ids[]__initconst = { - { .compatible ="arm,pl310-cache" , }, - {} - }; - -struct device_node *np;int ret; -void __iomem *p =IO_ADDRESS (TEGRA_ARM_PERIF_BASE ) +0x3000 ; -u32 aux_ctrl, cache_type; - - np =of_find_matching_node (NULL , pl310_ids); -if (!np) -return ; - - cache_type =readl (p +L2X0_CACHE_TYPE ); - aux_ctrl = (cache_type &0x700 ) << (17 -8 ); - aux_ctrl |=0x3c400001 ; - ret =l2x0_of_init (aux_ctrl,0xc200c3fe ); + ret =l2x0_of_init (0x3c400001 ,0xc20fc3fe );if (!ret) l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs);#endif
Signature · 1 line
1.8.3.1
PATCH 54/97 ARM: l2c: tegra: remove associativity and way size from aux_ctrl
Quoted 1 line · Russell King
Signed-off-by Russell King <[email protected]>
Peter, can you please ack this patch if you see no issue. Discussion below...
Quoted 18 lines
arch/arm/mach-tegra/tegra.c +0
-12static void __init tegra_init_cache (void ) {#ifdef CONFIG_CACHE_L2X0 -static const struct of_device_id pl310_ids[]__initconst = { - { .compatible ="arm,pl310-cache" , }, - {} - }; - -struct device_node *np;int ret; -void __iomem *p =IO_ADDRESS (TEGRA_ARM_PERIF_BASE ) +0x3000 ; -u32 aux_ctrl, cache_type; - - np =of_find_matching_node (NULL , pl310_ids); -if (!np) -return ;
arch/arm/mach-tegra/tegra.c u32 tegra_uart_config[3] = { · line 81
Quoted 10 lines
arch/arm/mach-tegra/tegra.c +1
-5- - cache_type =readl (p +L2X0_CACHE_TYPE ); - aux_ctrl = (cache_type &0x700 ) << (17 -8 ); - aux_ctrl |=0x3c400001 ; - ret =l2x0_of_init (aux_ctrl,0xc200c3fe ); + ret =l2x0_of_init (0x3c400001 ,0xc20fc3fe );if (!ret) l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs);#endif
I tested on both Tegra20 and Tegra30, and see bits 19:16 are 8 on both, with or without this patch.
I know that the code above was introduced in:
01548673fa15 arm/tegra: generalize L2 cache initialization
... by Peter, as part of the port to Tegra30. However, there was no explanation in that patch why it was needed. The existence of the patch implies that Tegra20/30 use different way sizes or associativity for their cache, and hence if we're going to forcibly over-write that part of the aux register, we need to dynamically calculate the correct value to put there. However in practice, both chips seem to use the same value for that field anyway (unless perhaps U-Boot is trashing the field before the kernel boots).
PATCH 54/97 ARM: l2c: tegra: remove associativity and way size from aux_ctrl
Quoted 45 lines · Stephen Warren
Quoted 1 line · Russell King
Signed-off-by Russell King <[email protected]>Peter, can you please ack this patch if you see no issue. Discussion below...
Quoted 18 lines
arch/arm/mach-tegra/tegra.c +0
-12static void __init tegra_init_cache (void ) {#ifdef CONFIG_CACHE_L2X0 -static const struct of_device_id pl310_ids[]__initconst = { - { .compatible ="arm,pl310-cache" , }, - {} - }; - -struct device_node *np;int ret; -void __iomem *p =IO_ADDRESS (TEGRA_ARM_PERIF_BASE ) +0x3000 ; -u32 aux_ctrl, cache_type; - - np =of_find_matching_node (NULL , pl310_ids); -if (!np) -return ;arch/arm/mach-tegra/tegra.c u32 tegra_uart_config[3] = { · line 81
Quoted 10 lines
arch/arm/mach-tegra/tegra.c +1
-5- - cache_type =readl (p +L2X0_CACHE_TYPE ); - aux_ctrl = (cache_type &0x700 ) << (17 -8 ); - aux_ctrl |=0x3c400001 ; - ret =l2x0_of_init (aux_ctrl,0xc200c3fe ); + ret =l2x0_of_init (0x3c400001 ,0xc20fc3fe );if (!ret) l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs);#endif Acked-by Stephen Warren <[email protected]>Tested-by Stephen Warren <[email protected]>I tested on both Tegra20 and Tegra30, and see bits 19:16 are 8 on both, with or without this patch.
I know that the code above was introduced in:
01548673fa15arm/tegra: generalize L2 cache initialization
Quoted 8 lines
... by Peter, as part of the port to Tegra30. However, there was no explanation in that patch why it was needed. The existence of the patch implies that Tegra20/30 use different way sizes or associativity for their cache, and hence if we're going to forcibly over-write that part of the aux register, we need to dynamically calculate the correct value to put there. However in practice, both chips seem to use the same value for that field anyway (unless perhaps U-Boot is trashing the field before the kernel boots).
This code was written anticipating A9 based designs which have a different number of ways per cluster. However up to now, we haven't done any upstreaming work for those, so this code is indeed not required for the currently upstreamed Tegra SoCs. I don't think that will change in the forseeable future. Therefore:
Cheers,
Peter.
PATCH 55/97 ARM: l2c: ux500: remove associativity and way size from aux_ctrl
In reply to Russell King - ARM Linux--- arch/arm/mach-ux500/cache-l2x0.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)
arch/arm/mach-ux500/cache-l2x0.c +2 -13
@@ -45,8 +45,6 @@ static void ux500_l2c310_write_sec(unsigned long val, unsigned reg)static int __init ux500_l2x0_init (void ) { -u32 aux_val =0x3e000000 ; -if (cpu_is_u8500_family () ||cpu_is_ux540_family ()) l2x0_base =__io_address (U8500_L2CC_BASE );else
@@ -56,21 +54,12 @@ static int __init ux500_l2x0_init(void)/* Unlock before init */ ux500_l2x0_unlock (); -/* DBx540's L2 has 128KB way size */ -if (cpu_is_ux540_family ()) -/* 128KB way size */ - aux_val |=L2C_AUX_CTRL_WAY_SIZE (4 ); -else -/* 64KB way size */ - aux_val |=L2C_AUX_CTRL_WAY_SIZE (3 ); - outer_cache.write_sec = ux500_l2c310_write_sec; -/* 64KB way size, 8 way associativity, force WA */ if (of_have_populated_dt ()) -l2x0_of_init (aux_val,0xc0000fff ); +l2x0_of_init (0x3e000000 ,0xc00f0fff );else -l2x0_init (l2x0_base, aux_val,0xc0000fff ); +l2x0_init (l2x0_base,0x3e000000 ,0xc00f0fff );return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 56/97 ARM: l2c: ux500: don't try to change the L2 cache auxiliary control register
In reply to Russell King - ARM Linuxux500 can't change the auxiliary control register, so there's no point passing values to try and modify it to the l2x0 init functions.
--- arch/arm/mach-ux500/cache-l2x0.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm/mach-ux500/cache-l2x0.c +2 -2
@@ -57,9 +57,9 @@ static int __init ux500_l2x0_init(void) outer_cache.write_sec = ux500_l2c310_write_sec;if (of_have_populated_dt ()) -l2x0_of_init (0x3e000000 ,0xc00f0fff ); +l2x0_of_init (0 , ~0 );else -l2x0_init (l2x0_base,0x3e000000 ,0xc00f0fff ); +l2x0_init (l2x0_base,0 , ~0 );return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 57/97 ARM: l2c: cns3xxx: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-cns3xxx/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-cns3xxx/core.c +1 -1
@@ -290,7 +290,7 @@ void __init cns3xxx_l2x0_init(void)writel (val, base +L310_DATA_LATENCY_CTRL );/* 32 KiB, 8-way, parity disable */ - l2x0_init(base, 0x00540000, 0xfe000fff); + l2x0_init(base, 0x00500000, 0xfe0f0fff); }#endif /* CONFIG_CACHE_L2X0 */
Signature · 1 line
1.8.3.1
PATCH 58/97 ARM: l2c: exynos: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-exynos/exynos.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
arch/arm/mach-exynos/exynos.c +1 -4
@@ -32,9 +32,6 @@#include "mfc.h" #include "regs-pmu.h" -#define L2_AUX_VAL 0x3c470001 -#define L2_AUX_MASK 0xc200ffff -static struct map_desc exynos4_iodesc[]__initdata = { { .virtual = (unsigned long )S3C_VA_SYS ,
@@ -323,7 +320,7 @@ static int __init exynos4_l2x0_cache_init(void) {int ret; - ret =l2x0_of_init (L2_AUX_VAL ,L2_AUX_MASK ); + ret =l2x0_of_init (0x3c400001 ,0xc20fffff );if (ret)return ret;
Signature · 1 line
1.8.3.1
PATCH 59/97 ARM: l2c: exynos: convert to common l2c310 early resume functionality
In reply to Russell King - ARM Linux--- arch/arm/mach-exynos/common.h | 1 - arch/arm/mach-exynos/exynos.c | 12 +----------- arch/arm/mach-exynos/sleep.S | 30 +----------------------------- arch/arm/plat-samsung/s5p-sleep.S | 1 - 4 files changed, 2 insertions(+), 42 deletions(-)
arch/arm/mach-exynos/common.h +0 -1
@@ -55,7 +55,6 @@ enum sys_powerdown { NUM_SYS_POWERDOWN, }; -extern unsigned long l2x0_regs_phys;struct exynos_pmu_conf {void __iomem *reg;unsigned int val[NUM_SYS_POWERDOWN ];
arch/arm/mach-exynos/exynos.c +1 -11
@@ -318,17 +318,7 @@ core_initcall(exynos_core_init);static int __init exynos4_l2x0_cache_init (void ) { -int ret; - - ret =l2x0_of_init (0x3c400001 ,0xc20fffff ); -if (ret) -return ret; - -if (IS_ENABLED (CONFIG_S5P_SLEEP )) { - l2x0_regs_phys =virt_to_phys (&l2x0_saved_regs); -clean_dcache_area (&l2x0_regs_phys,sizeof (unsigned long )); - } -return 0 ; +return l2x0_of_init (0x3c400001 ,0xc20fffff ); }early_initcall (exynos4_l2x0_cache_init);
arch/arm/mach-exynos/sleep.S +1 -29
@@ -16,8 +16,6 @@ */ #include <linux/linkage.h> -#include <asm/asm-offsets.h> -#include <asm/hardware/cache-l2x0.h> #define CPU_MASK 0xff0ffff0 #define CPU_CORTEX_A9 0x410fc090
@@ -53,33 +51,7 @@ ENTRY(exynos_cpu_resume) and r0, r0, r1 ldr r1, =CPU_CORTEX_A9 cmp r0, r1 - bne skip_l2_resume - adr r0, l2x0_regs_phys - ldr r0, [r0] - cmp r0, #0 - beq skip_l2_resume - ldr r1, [r0, #L2X0_R_PHY_BASE] - ldr r2, [r1, #L2X0_CTRL] - tst r2, #0x1 - bne skip_l2_resume - ldr r2, [r0, #L2X0_R_AUX_CTRL] - str r2, [r1, #L2X0_AUX_CTRL] - ldr r2, [r0, #L2X0_R_TAG_LATENCY] - str r2, [r1, #L310_TAG_LATENCY_CTRL] - ldr r2, [r0, #L2X0_R_DATA_LATENCY] - str r2, [r1, #L310_DATA_LATENCY_CTRL] - ldr r2, [r0, #L2X0_R_PREFETCH_CTRL] - str r2, [r1, #L310_PREFETCH_CTRL] - ldr r2, [r0, #L2X0_R_PWR_CTRL] - str r2, [r1, #L310_POWER_CTRL] - mov r2, #1 - str r2, [r1, #L2X0_CTRL] -skip_l2_resume: + bleq l2c310_early_resume #endif b cpu_resume ENDPROC(exynos_cpu_resume) -#ifdef CONFIG_CACHE_L2X0 - .globl l2x0_regs_phys -l2x0_regs_phys: - .long 0 -#endif
arch/arm/plat-samsung/s5p-sleep.S +0 -1
@@ -22,7 +22,6 @@ */ #include <linux/linkage.h> -#include <asm/asm-offsets.h> .data .align
Signature · 1 line
1.8.3.1
PATCH 60/97 ARM: l2c: exynos: convert to generic l2c initialisation (and thereby fix it)
In reply to Russell King - ARM Linuxexynos was unconditionally calling the L2 cache initialisation from an early_initcall. This breaks multiplatform kernels. Thankfully, converting to generic l2c initialisation fixes this.
--- arch/arm/mach-exynos/exynos.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
arch/arm/mach-exynos/exynos.c +2 -6
@@ -316,12 +316,6 @@ static int __init exynos_core_init(void) }core_initcall (exynos_core_init); -static int __init exynos4_l2x0_cache_init (void ) -{ -return l2x0_of_init (0x3c400001 ,0xc20fffff ); -} -early_initcall (exynos4_l2x0_cache_init); -static void __init exynos_dt_machine_init (void ) {struct device_node *i2c_np;
@@ -387,6 +381,8 @@ static void __init exynos_reserve(void)DT_MACHINE_START (EXYNOS_DT ,"SAMSUNG EXYNOS (Flattened Device Tree)" )/* Maintainer: Thomas Abraham <[email protected]> */ /* Maintainer: Kukjin Kim <[email protected]> */ + .l2c_aux_val = 0x3c400001, + .l2c_aux_mask = 0xc20fffff, .smp = smp_ops(exynos_smp_ops), .map_io = exynos_init_io, .init_early = exynos_firmware_init,
Signature · 1 line
1.8.3.1
PATCH 61/97 ARM: l2c: nomadik: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-nomadik/cpu-8815.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-nomadik/cpu-8815.c +1 -1
@@ -147,7 +147,7 @@ static void __init cpu8815_init_of(void) {#ifdef CONFIG_CACHE_L2X0 /* At full speed latency must be >=2, so 0x249 in low bits */ -l2x0_of_init (0x00730249 ,0xfe000fff ); +l2x0_of_init (0x00700249 ,0xfe0fefff );#endif of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); }
Signature · 1 line
1.8.3.1
PATCH 62/97 ARM: l2c: nomadik: convert to generic l2c initialisation
In reply to Russell King - ARM LinuxThis also allows us to eliminate the .init_machine function.
--- arch/arm/mach-nomadik/cpu-8815.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
arch/arm/mach-nomadik/cpu-8815.c +3 -10
@@ -143,23 +143,16 @@ static int __init cpu8815_mmcsd_init(void) }device_initcall (cpu8815_mmcsd_init); -static void __init cpu8815_init_of (void ) -{ -#ifdef CONFIG_CACHE_L2X0 -/* At full speed latency must be >=2, so 0x249 in low bits */ -l2x0_of_init (0x00700249 ,0xfe0fefff ); -#endif -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char * cpu8815_board_compat[] = {"calaosystems,usb-s8815" ,NULL , };DT_MACHINE_START (NOMADIK_DT ,"Nomadik STn8815" ) +/* At full speed latency must be >=2, so 0x249 in low bits */ + .l2c_aux_val = 0x00700249, + .l2c_aux_mask = 0xfe0fefff, .map_io = cpu8815_map_io, - .init_machine = cpu8815_init_of, .restart = cpu8815_restart, .dt_compat = cpu8815_board_compat,MACHINE_END
Signature · 1 line
1.8.3.1
PATCH 62/97 ARM: l2c: nomadik: convert to generic l2c initialisation
Quoted 3 lines · Russell King
This also allows us to eliminate the .init_machine function.
Signed-off-by Russell King <[email protected]>
OK
Yours,
Linus Walleij
PATCH 63/97 ARM: l2c: omap2: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-omap2/omap4-common.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/arm/mach-omap2/omap4-common.c +3 -5
@@ -213,20 +213,18 @@ static int __init omap_l2_cache_init(void)return -ENOMEM ;/* 16-way associativity, parity disabled, way size - 64KB (es2.0 +) */ - aux_ctrl =L310_AUX_CTRL_ASSOCIATIVITY_16 | -L310_AUX_CTRL_CACHE_REPLACE_RR | + aux_ctrl =L310_AUX_CTRL_CACHE_REPLACE_RR |L310_AUX_CTRL_NS_LOCKDOWN |L310_AUX_CTRL_NS_INT_CTRL | -L2C_AUX_CTRL_WAY_SIZE (3 ) |L2C_AUX_CTRL_SHARED_OVERRIDE |L310_AUX_CTRL_DATA_PREFETCH |L310_AUX_CTRL_INSTR_PREFETCH ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ()) -l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK ); +l2x0_of_init (aux_ctrl,0xc19fffff );else -l2x0_init (l2cache_base, aux_ctrl,L2X0_AUX_CTRL_MASK ); +l2x0_init (l2cache_base, aux_ctrl,0xc19fffff );return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 64/97 ARM: l2c: prima2: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-prima2/l2x0.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-)
arch/arm/mach-prima2/l2x0.c +2 -20
@@ -11,21 +11,6 @@#include <linux/of.h> #include <asm/hardware/cache-l2x0.h> -struct l2x0_aux { -u32 val; -u32 mask; -}; - -static const struct l2x0_aux prima2_l2x0_aux__initconst = { - .val =L2C_AUX_CTRL_WAY_SIZE (2 ), - .mask =0 , -}; - -static const struct l2x0_aux marco_l2x0_aux__initconst = { - .val =L2C_AUX_CTRL_WAY_SIZE (2 ) |L310_AUX_CTRL_ASSOCIATIVITY_16 , - .mask =L2X0_AUX_CTRL_MASK , -}; -static const struct of_device_id sirf_l2x0_ids[]__initconst = { { .compatible ="sirf,prima2-pl310-cache" , .data = &prima2_l2x0_aux, }, { .compatible ="sirf,marco-pl310-cache" , .data = &marco_l2x0_aux, },
@@ -35,13 +20,10 @@ static const struct of_device_id sirf_l2x0_ids[] __initconst = {static int __init sirfsoc_l2x0_init (void ) {struct device_node *np; -const struct l2x0_aux *aux; np =of_find_matching_node (NULL , sirf_l2x0_ids); -if (np) { - aux =of_match_node (sirf_l2x0_ids, np)->data; -return l2x0_of_init (aux->val, aux->mask); - } +if (np) +return l2x0_of_init (0 , ~0 );return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 65/97 ARM: l2c: prima2: convert to generic l2c initialisation
In reply to Russell King - ARM LinuxAlong with this change, we can delete l2x0.c from prima2.
--- arch/arm/boot/dts/marco.dtsi | 2 +- arch/arm/boot/dts/prima2.dtsi | 2 +- arch/arm/mach-prima2/Makefile | 1 - arch/arm/mach-prima2/common.c | 6 ++++++ arch/arm/mach-prima2/l2x0.c | 30 ------------------------------ 5 files changed, 8 insertions(+), 33 deletions(-) delete mode 100644 arch/arm/mach-prima2/l2x0.c
arch/arm/boot/dts/marco.dtsi +1 -1
@@ -36,7 +36,7 @@ ranges = <0x40000000 0x40000000 0xa0000000>; l2-cache-controller at c0030000 { - compatible = "sirf,marco-pl310-cache", "arm,pl310-cache"; + compatible = "arm,pl310-cache"; reg = <0xc0030000 0x1000>; interrupts = <0 59 0>; arm,tag-latency = <1 1 1>;
arch/arm/boot/dts/prima2.dtsi +1 -1
@@ -48,7 +48,7 @@ ranges = <0x40000000 0x40000000 0x80000000>; l2-cache-controller at 80040000 { - compatible = "arm,pl310-cache", "sirf,prima2-pl310-cache"; + compatible = "arm,pl310-cache"; reg = <0x80040000 0x1000>; interrupts = <59>; arm,tag-latency = <1 1 1>;
arch/arm/mach-prima2/Makefile +0 -1
@@ -2,7 +2,6 @@ obj-y += rstc.o obj-y += common.o obj-y += rtciobrg.o obj-$(CONFIG_DEBUG_LL) += lluart.o -obj-$(CONFIG_CACHE_L2X0) += l2x0.o obj-$(CONFIG_SUSPEND) += pm.o sleep.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
arch/arm/mach-prima2/common.c +6 -0
@@ -34,6 +34,8 @@ static const char *atlas6_dt_match[] __initconst = {DT_MACHINE_START (ATLAS6_DT ,"Generic ATLAS6 (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .map_io = sirfsoc_map_io, .init_late = sirfsoc_init_late, .dt_compat = atlas6_dt_match,
@@ -48,6 +50,8 @@ static const char *prima2_dt_match[] __initconst = {DT_MACHINE_START (PRIMA2_DT ,"Generic PRIMA2 (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .map_io = sirfsoc_map_io, .dma_zone_size = SZ_256M, .init_late = sirfsoc_init_late,
@@ -63,6 +67,8 @@ static const char *marco_dt_match[] __initconst = {DT_MACHINE_START (MARCO_DT ,"Generic MARCO (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .smp = smp_ops(sirfsoc_smp_ops), .map_io = sirfsoc_map_io, .init_late = sirfsoc_init_late,
arch/arm/mach-prima2/l2x0.c deleted +0 -30
@@ -1,30 +0,0 @@ -/* -* l2 cache initialization for CSR SiRFprimaII -* -* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. -* -* Licensed under GPLv2 or later. -*/ - -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/of.h> -#include <asm/hardware/cache-l2x0.h> - -static const struct of_device_id sirf_l2x0_ids[]__initconst = { - { .compatible ="sirf,prima2-pl310-cache" , .data = &prima2_l2x0_aux, }, - { .compatible ="sirf,marco-pl310-cache" , .data = &marco_l2x0_aux, }, - {}, -}; - -static int __init sirfsoc_l2x0_init (void ) -{ -struct device_node *np; - - np =of_find_matching_node (NULL , sirf_l2x0_ids); -if (np) -return l2x0_of_init (0 , ~0 ); - -return 0 ; -} -early_initcall (sirfsoc_l2x0_init);
Signature · 1 line
1.8.3.1
PATCH 65/97 ARM: l2c: prima2: convert to generic l2c initialisation
2014-04-29 3:31 GMT+08:00 Russell King <[email protected]>:
Quoted 3 lines
Along with this change, we can delete
l2x0.cfrom prima2.Signed-off-by Russell King <[email protected]>
if the information you want is l2c_aux_val, l2c_aux_mask for prima2 platform.
it is (0, 0xfdffffff), you can cleary know that from the v1 i sent on April 15, which was much earlier than your this patch:
http://lists.infradead.org/pipermail/linux-arm-kernel/2014-April/247423.html
and you gave many comments on that, and you read the (0, 0xFDFFFFFUL) and disliked the upper letter.
but you just complained that i didn't provide any information to you and you felt "frustrated".
i think that man who should fell frustrated is me not you. i feel very frustrated for the moment.
Quoted 115 lines
--- arch/arm/boot/dts/marco.dtsi | 2 +- arch/arm/boot/dts/prima2.dtsi | 2 +- arch/arm/mach-prima2/Makefile | 1 - arch/arm/mach-prima2/common.c | 6 ++++++ arch/arm/mach-prima2/l2x0.c | 30 ------------------------------ 5 files changed, 8 insertions(+), 33 deletions(-) delete mode 100644 arch/arm/mach-prima2/l2x0.carch/arm/boot/dts/marco.dtsi +1
-1@@ -36,7 +36,7 @@ ranges = <0x40000000 0x40000000 0xa0000000>; l2-cache-controller at c0030000 { - compatible = "sirf,marco-pl310-cache", "arm,pl310-cache"; + compatible = "arm,pl310-cache"; reg = <0xc0030000 0x1000>; interrupts = <0 59 0>; arm,tag-latency = <1 1 1>;arch/arm/boot/dts/prima2.dtsi +1
-1@@ -48,7 +48,7 @@ ranges = <0x40000000 0x40000000 0x80000000>; l2-cache-controller at 80040000 { - compatible = "arm,pl310-cache", "sirf,prima2-pl310-cache"; + compatible = "arm,pl310-cache"; reg = <0x80040000 0x1000>; interrupts = <59>; arm,tag-latency = <1 1 1>;arch/arm/mach-prima2/Makefile +0
-1@@ -2,7 +2,6 @@ obj-y += rstc.o obj-y += common.o obj-y += rtciobrg.o obj-$(CONFIG_DEBUG_LL) += lluart.o -obj-$(CONFIG_CACHE_L2X0) += l2x0.o obj-$(CONFIG_SUSPEND) += pm.o sleep.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o obj-$(CONFIG_HOTPLUG_CPU) += hotplug.oarch/arm/mach-prima2/common.c +6
-0@@ -34,6 +34,8 @@ static const char *atlas6_dt_match[] __initconst = {DT_MACHINE_START (ATLAS6_DT ,"Generic ATLAS6 (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .map_io = sirfsoc_map_io, .init_late = sirfsoc_init_late, .dt_compat = atlas6_dt_match,@@ -48,6 +50,8 @@ static const char *prima2_dt_match[] __initconst = {DT_MACHINE_START (PRIMA2_DT ,"Generic PRIMA2 (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .map_io = sirfsoc_map_io, .dma_zone_size = SZ_256M, .init_late = sirfsoc_init_late,@@ -63,6 +67,8 @@ static const char *marco_dt_match[] __initconst = {DT_MACHINE_START (MARCO_DT ,"Generic MARCO (Flattened Device Tree)" )/* Maintainer: Barry Song <[email protected]> */ + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .smp = smp_ops(sirfsoc_smp_ops), .map_io = sirfsoc_map_io, .init_late = sirfsoc_init_late,arch/arm/mach-prima2/l2x0.c deleted +0
-31@@ -1,30 +0,0 @@ -/* -* l2 cache initialization for CSR SiRFprimaII -* -* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company. -* -* Licensed under GPLv2 or later. -*/ - -#include <linux/init.h> -#include <linux/kernel.h> -#include <linux/of.h> -#include <asm/hardware/cache-l2x0.h> - -static const struct of_device_id sirf_l2x0_ids[]__initconst = { - { .compatible ="sirf,prima2-pl310-cache" , .data = &prima2_l2x0_aux, }, - { .compatible ="sirf,marco-pl310-cache" , .data = &marco_l2x0_aux, }, - {}, -}; - -static int __init sirfsoc_l2x0_init (void ) -{ -struct device_node *np; - - np =of_find_matching_node (NULL , sirf_l2x0_ids); -if (np) -return l2x0_of_init (0 , ~0 ); - -return 0 ; -} -early_initcall (sirfsoc_l2x0_init); --
Quoted 2 lines
1.8.3.1
-barry
PATCH 66/97 ARM: l2c: shmobile: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-shmobile/board-armadillo800eva-reference.c | 2 +- arch/arm/mach-shmobile/board-armadillo800eva.c | 2 +- arch/arm/mach-shmobile/board-kzm9g-reference.c | 2 +- arch/arm/mach-shmobile/board-kzm9g.c | 2 +- arch/arm/mach-shmobile/setup-r8a7778.c | 2 +- arch/arm/mach-shmobile/setup-r8a7779.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-)
arch/arm/mach-shmobile/board-armadillo800eva-reference.c +1 -1
@@ -165,7 +165,7 @@ static void __init eva_init(void)#ifdef CONFIG_CACHE_L2X0 /* Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff ); +l2x0_init (IOMEM (0xf0002000 ),0x00400000 ,0xc20f0fff );#endif r8a7740_add_standard_devices_dt ();
arch/arm/mach-shmobile/board-armadillo800eva.c +1 -1
@@ -1271,7 +1271,7 @@ static void __init eva_init(void)#ifdef CONFIG_CACHE_L2X0 /* Shared attribute override enable, 32K*8way */ -l2x0_init (IOMEM (0xf0002000 ),0x00440000 ,0xc2000fff ); +l2x0_init (IOMEM (0xf0002000 ),0x00400000 ,0xc20f0fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));
arch/arm/mach-shmobile/board-kzm9g-reference.c +1 -1
@@ -37,7 +37,7 @@ static void __init kzm_init(void)#ifdef CONFIG_CACHE_L2X0 /* Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff ); +l2x0_init (IOMEM (0xf0100000 ),0x00400000 ,0xc20f0fff );#endif }
arch/arm/mach-shmobile/board-kzm9g.c +1 -1
@@ -877,7 +877,7 @@ static void __init kzm_init(void)#ifdef CONFIG_CACHE_L2X0 /* Shared attribute override enable, 64K*8way */ -l2x0_init (IOMEM (0xf0100000 ),0x00460000 ,0xc2000fff ); +l2x0_init (IOMEM (0xf0100000 ),0x00400000 ,0xc20f0fff );#endif i2c_register_board_info (0 , i2c0_devices,ARRAY_SIZE (i2c0_devices));
arch/arm/mach-shmobile/setup-r8a7778.c +1 -1
@@ -301,7 +301,7 @@ void __init r8a7778_add_dt_devices(void)* Shared attribute override enable, 64K*16way * don't call iounmap(base) */ - l2x0_init(base, 0x00470000, 0xc2000fff); + l2x0_init(base, 0x00400000, 0xc20f0fff); }#endif
arch/arm/mach-shmobile/setup-r8a7779.c +1 -1
@@ -701,7 +701,7 @@ void __init r8a7779_add_standard_devices(void) {#ifdef CONFIG_CACHE_L2X0 /* Shared attribute override enable, 64K*16way */ -l2x0_init (IOMEM (0xf0100000 ),0x00470000 ,0xc2000fff ); +l2x0_init (IOMEM (0xf0100000 ),0x00400000 ,0xc20f0fff );#endif r8a7779_pm_init ();
Signature · 1 line
1.8.3.1
PATCH 67/97 ARM: l2c: spear13xx: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-spear/spear13xx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-spear/spear13xx.c +1 -1
@@ -46,7 +46,7 @@ void __init spear13xx_l2x0_init(void)*/ writel_relaxed (0x221 ,VA_L2CC_BASE +L310_TAG_LATENCY_CTRL );writel_relaxed (0x441 ,VA_L2CC_BASE +L310_DATA_LATENCY_CTRL ); -l2x0_init (VA_L2CC_BASE ,0x30a60001 ,0xfe00ffff ); +l2x0_init (VA_L2CC_BASE ,0x30a00001 ,0xfe0fffff ); }/*
Signature · 1 line
1.8.3.1
PATCH 68/97 ARM: l2c: sti: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-sti/board-dt.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
arch/arm/mach-sti/board-dt.c +3 -9
@@ -16,15 +16,9 @@void __init stih41x_l2x0_init (void ) { -u32 way_size =0x4 ; -u32 aux_ctrl; -/* may be this can be encoded in macros like BIT*() */ - aux_ctrl =L2C_AUX_CTRL_SHARED_OVERRIDE | -L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH | -L2C_AUX_CTRL_WAY_SIZE (way_size); - -l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK ); +l2x0_of_init (L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | +L310_AUX_CTRL_INSTR_PREFETCH ,0xc00f0fff ); }static void __init stih41x_machine_init (void )
Signature · 1 line
1.8.3.1
PATCH 68/97 ARM: l2c: sti: remove cache size override
Hi Russell,
Thankyou for the patch,
The only issue I see is, on most of the STi SOCs the default value for AUXCTRL register is 0x0, so the waysize is not set.
The way size is different on some SOCs in the same series.
Where is the way-size mentioned in this new style?
Thanks,
srini
Quoted 29 lines · Russell King
Signed-off-by Russell King <[email protected]>--- arch/arm/mach-sti/board-dt.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)arch/arm/mach-sti/board-dt.c +3
-9@@ -16,15 +16,9 @@void __init stih41x_l2x0_init (void ) { -u32 way_size =0x4 ; -u32 aux_ctrl; -/* may be this can be encoded in macros like BIT*() */ - aux_ctrl =L2C_AUX_CTRL_SHARED_OVERRIDE | -L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH | -L2C_AUX_CTRL_WAY_SIZE (way_size); - -l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK ); +l2x0_of_init (L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | +L310_AUX_CTRL_INSTR_PREFETCH ,0xc00f0fff ); }static void __init stih41x_machine_init (void )
PATCH 68/97 ARM: l2c: sti: remove cache size override
Hi Srini,
Quoted 5 lines · Srinivas Kandagatla
Hi Russell,
Thankyou for the patch,The only issue I see is, on most of the STi SOCs the default value for AUXCTRL register is
0x0, so the waysize is not set.
I checked all the ARM SoCs we support currently.
Only STiH416 has its reset value at 0x0.
Quoted 4 lines
The way size is different on some SOCs in the same series.
Where is the way-size mentioned in this new style?
Then, I think it should be the role of the bootloaders to set it for STiH416 (I have been told U-Boot already does it).
Does it sound acceptable for you?
Best regards,
Maxime
Quoted 34 lines
Thanks,
sriniQuoted 29 lines · Russell King
Signed-off-by Russell King <[email protected]>--- arch/arm/mach-sti/board-dt.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)arch/arm/mach-sti/board-dt.c +3
-9@@ -16,15 +16,9 @@void __init stih41x_l2x0_init (void ) { -u32 way_size =0x4 ; -u32 aux_ctrl; -/* may be this can be encoded in macros like BIT*() */ - aux_ctrl =L2C_AUX_CTRL_SHARED_OVERRIDE | -L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH | -L2C_AUX_CTRL_WAY_SIZE (way_size); - -l2x0_of_init (aux_ctrl,L2X0_AUX_CTRL_MASK ); +l2x0_of_init (L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | +L310_AUX_CTRL_INSTR_PREFETCH ,0xc00f0fff ); }static void __init stih41x_machine_init (void )
PATCH 68/97 ARM: l2c: sti: remove cache size override
Hi Maxime,
Quoted 12 lines · Maxime Coquelin
Hi Srini,
Quoted 5 lines · Srinivas Kandagatla
Hi Russell,
Thankyou for the patch,The only issue I see is, on most of the STi SOCs the default value for AUXCTRL register is
0x0, so the waysize is not set.I checked all the ARM SoCs we support currently.
Only STiH416 has its reset value at0x0.Quoted 1 line
Quoted 7 lines
Quoted 3 lines
The way size is different on some SOCs in the same series.
Where is the way-size mentioned in this new style?
Then, I think it should be the role of the bootloaders to set it for STiH416 (I have been told U-Boot already does it).
Does it sound acceptable for you?
That's great, so the gdb startup scripts should takecare of it too.
Thanks,
srini
PATCH 68/97 ARM: l2c: sti: remove cache size override
Quoted 17 lines · Srinivas Kandagatla
Hi Maxime,
Quoted 14 lines · Maxime Coquelin
Hi Srini,
Quoted 5 lines · Srinivas Kandagatla
Hi Russell,
Thankyou for the patch,The only issue I see is, on most of the STi SOCs the default value for AUXCTRL register is
0x0, so the waysize is not set.I checked all the ARM SoCs we support currently.
Only STiH416 has its reset value at0x0.Quoted 3 lines
The way size is different on some SOCs in the same series.
Quoted 7 lines
Quoted 5 lines
Quoted 1 line
Where is the way-size mentioned in this new style?
Then, I think it should be the role of the bootloaders to set it for STiH416 (I have been told U-Boot already does it).
Does it sound acceptable for you?That's great, so the gdb startup scripts should takecare of it too.
It's already in my ToDo list!
Thanks,
Maxime
Quoted 4 lines
Thanks,
srini
PATCH 69/97 ARM: l2c: sti: convert to generic l2c initialisation
In reply to Russell King - ARM LinuxWe can remove the .init_machine as it becomes the generic version.
--- arch/arm/mach-sti/board-dt.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-)
arch/arm/mach-sti/board-dt.c +5 -15
@@ -14,19 +14,6 @@#include "smp.h" -void __init stih41x_l2x0_init (void ) -{ -l2x0_of_init (L2C_AUX_CTRL_SHARED_OVERRIDE | -L310_AUX_CTRL_DATA_PREFETCH | -L310_AUX_CTRL_INSTR_PREFETCH ,0xc00f0fff ); -} - -static void __init stih41x_machine_init (void ) -{ -stih41x_l2x0_init (); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char *stih41x_dt_match[]__initdata = {"st,stih415" ,"st,stih416" ,
@@ -34,7 +21,10 @@ static const char *stih41x_dt_match[] __initdata = { };DT_MACHINE_START (STM ,"STiH415/416 SoC with Flattened Device Tree" ) - .init_machine = stih41x_machine_init, - .smp = smp_ops(sti_smp_ops), .dt_compat = stih41x_dt_match, + .l2c_aux_val =L2C_AUX_CTRL_SHARED_OVERRIDE | +L310_AUX_CTRL_DATA_PREFETCH | + L310_AUX_CTRL_INSTR_PREFETCH, + .l2c_aux_mask = 0xc00f0fff, + .smp =smp_ops (sti_smp_ops),MACHINE_END
Signature · 1 line
1.8.3.1
PATCH 70/97 ARM: l2c: tegra: convert to common l2c310 early resume functionality
In reply to Russell King - ARM Linux--- arch/arm/mach-tegra/pm.h | 2 -- arch/arm/mach-tegra/reset-handler.S | 11 +++-------- arch/arm/mach-tegra/sleep.h | 31 ------------------------------- arch/arm/mach-tegra/tegra.c | 6 +----- 4 files changed, 4 insertions(+), 46 deletions(-)
arch/arm/mach-tegra/pm.h +0 -2
@@ -35,8 +35,6 @@ void tegra20_sleep_core_init(void);void tegra30_lp1_iram_hook (void );void tegra30_sleep_core_init (void ); -extern unsigned long l2x0_saved_regs_addr; -void tegra_clear_cpu_in_lp2 (void );bool tegra_set_cpu_in_lp2 (void );
arch/arm/mach-tegra/reset-handler.S +3 -8
@@ -19,7 +19,6 @@ #include <asm/cache.h> #include <asm/asm-offsets.h> -#include <asm/hardware/cache-l2x0.h> #include "flowctrl.h" #include "fuse.h"
@@ -78,8 +77,10 @@ ENTRY(tegra_resume) str r1, [r0] #endif +#ifdef CONFIG_CACHE_L2X0 /* L2 cache resume & re-enable */ - l2_cache_resume r0, r1, r2, l2x0_saved_regs_addr + bl l2c310_early_resume +#endif end_ca9_scu_l2_resume: mov32 r9, 0xc0f cmp r8, r9
@@ -89,12 +90,6 @@ end_ca9_scu_l2_resume: ENDPROC(tegra_resume) #endif -#ifdef CONFIG_CACHE_L2X0 - .globl l2x0_saved_regs_addr -l2x0_saved_regs_addr: - .long 0 -#endif - .align L1_CACHE_SHIFT ENTRY(__tegra_cpu_reset_handler_start)
arch/arm/mach-tegra/sleep.h +0 -31
@@ -120,37 +120,6 @@ mov \tmp1, \tmp1, lsr #8 .endm -/* Macro to resume & re-enable L2 cache */ -#ifndef L2X0_CTRL_EN -#define L2X0_CTRL_EN 1 -#endif - -#ifdef CONFIG_CACHE_L2X0 -.macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs - W(adr) \tmp1, \phys_l2x0_saved_regs - ldr \tmp1, [\tmp1] - ldr \tmp2, [\tmp1, #L2X0_R_PHY_BASE] - ldr \tmp3, [\tmp2, #L2X0_CTRL] - tst \tmp3, #L2X0_CTRL_EN - bne exit_l2_resume - ldr \tmp3, [\tmp1, #L2X0_R_TAG_LATENCY] - str \tmp3, [\tmp2, #L310_TAG_LATENCY_CTRL] - ldr \tmp3, [\tmp1, #L2X0_R_DATA_LATENCY] - str \tmp3, [\tmp2, #L310_DATA_LATENCY_CTRL] - ldr \tmp3, [\tmp1, #L2X0_R_PREFETCH_CTRL] - str \tmp3, [\tmp2, #L310_PREFETCH_CTRL] - ldr \tmp3, [\tmp1, #L2X0_R_PWR_CTRL] - str \tmp3, [\tmp2, #L310_POWER_CTRL] - ldr \tmp3, [\tmp1, #L2X0_R_AUX_CTRL] - str \tmp3, [\tmp2, #L2X0_AUX_CTRL] - mov \tmp3, #L2X0_CTRL_EN - str \tmp3, [\tmp2, #L2X0_CTRL] -exit_l2_resume: -.endm -#else /* CONFIG_CACHE_L2X0 */ -.macro l2_cache_resume, tmp1, tmp2, tmp3, phys_l2x0_saved_regs -.endm -#endif /* CONFIG_CACHE_L2X0 */ #else void tegra_pen_lock(void);void tegra_pen_unlock (void );
arch/arm/mach-tegra/tegra.c +1 -5
@@ -73,11 +73,7 @@ u32 tegra_uart_config[3] = {static void __init tegra_init_cache (void ) {#ifdef CONFIG_CACHE_L2X0 -int ret; - - ret =l2x0_of_init (0x3c400001 ,0xc20fc3fe ); -if (!ret) - l2x0_saved_regs_addr =virt_to_phys (&l2x0_saved_regs); +l2x0_of_init (0x3c400001 ,0xc20fc3fe );#endif }
Signature · 1 line
1.8.3.1
PATCH 70/97 ARM: l2c: tegra: convert to common l2c310 early resume functionality
Quoted 1 line · Russell King
Signed-off-by Russell King <[email protected]>
(On Springbank/Tegra20 and Beaver/Tegra30; tested suspend/resume via RTC wakealarm IRQ)
Joseph, if you see any issue here, please respond. Thanks.
PATCH 70/97 ARM: l2c: tegra: convert to common l2c310 early resume functionality
Quoted 11 lines · Stephen Warren
Quoted 1 line · Russell King
Signed-off-by Russell King <[email protected]>Acked-by Stephen Warren <[email protected]>Tested-by Stephen Warren <[email protected]>(On Springbank/Tegra20 and Beaver/Tegra30; tested suspend/resume via RTC wakealarm IRQ)
Joseph, if you see any issue here, please respond. Thanks.
Thanks for taking care of this. LGTM.
PATCH 71/97 ARM: l2c: convert tegra to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-tegra/tegra.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
arch/arm/mach-tegra/tegra.c +3 -9
@@ -70,20 +70,12 @@ u32 tegra_uart_config[3] = { 0, }; -static void __init tegra_init_cache (void ) -{ -#ifdef CONFIG_CACHE_L2X0 -l2x0_of_init (0x3c400001 ,0xc20fc3fe ); -#endif -} -static void __init tegra_init_early (void ) {of_register_trusted_foundations ();tegra_apb_io_init ();tegra_init_fuse ();tegra_cpu_reset_handler_init (); -tegra_init_cache ();tegra_powergate_init ();tegra_hotplug_init (); }
@@ -171,8 +163,10 @@ static const char * const tegra_dt_board_compat[] = { };DT_MACHINE_START (TEGRA_DT ,"NVIDIA Tegra SoC (Flattened Device Tree)" ) - .map_io = tegra_map_common_io, + .l2c_aux_val = 0x3c400001, + .l2c_aux_mask = 0xc20fc3fe, .smp = smp_ops(tegra_smp_ops), + .map_io = tegra_map_common_io, .init_early = tegra_init_early, .init_irq = tegra_dt_init_irq, .init_machine = tegra_dt_init,
Signature · 1 line
1.8.3.1
PATCH 71/97 ARM: l2c: convert tegra to generic l2c initialisation
arch/arm/mach-tegra/tegra.c static const char * const tegra_dt_board_compat[] = { · line 167
Quoted 6 lines · Russell King
arch/arm/mach-tegra/tegra.c +2
-1DT_MACHINE_START (TEGRA_DT ,"NVIDIA Tegra SoC (Flattened Device Tree)" ) - .map_io = tegra_map_common_io, + .l2c_aux_val = 0x3c400001, + .l2c_aux_mask = 0xc20fc3fe,
I assume those values are simply ignored for CPUs without an l2c (or with an architected one?) i.e. A15. If so,
PATCH 71/97 ARM: l2c: convert tegra to generic l2c initialisation
Quoted 12 lines · Stephen Warren
arch/arm/mach-tegra/tegra.c static const char * const tegra_dt_board_compat[] = { · line 167
Quoted 6 lines · Russell King
arch/arm/mach-tegra/tegra.c +2
-1DT_MACHINE_START (TEGRA_DT ,"NVIDIA Tegra SoC (Flattened Device Tree)" ) - .map_io = tegra_map_common_io, + .l2c_aux_val = 0x3c400001, + .l2c_aux_mask = 0xc20fc3fe,I assume those values are simply ignored for CPUs without an l2c (or with an architected one?) i.e. A15. If so,
Quoted 1 line
Acked-by Stephen Warren <[email protected]>
l2x0_of_init() only does something when your DT file specifies that there's a L2C cache controller of the appropriate type present. So yes, when there's no L2C cache controller mentioned, it's a no-op.
Signature · 2 lines
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it.
PATCH 72/97 ARM: l2c: zynq: remove cache size override
In reply to Russell King - ARM Linux--- arch/arm/mach-zynq/common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-zynq/common.c +1 -1
@@ -70,7 +70,7 @@ static void __init zynq_init_machine(void)/* * 64KB way size, 8-way associativity, parity disabled */ -l2x0_of_init (0x02060000 ,0xF0F0FFFF ); +l2x0_of_init (0x02000000 ,0xf0ffffff );of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL );
Signature · 1 line
1.8.3.1
PATCH 73/97 ARM: l2c: zynq: convert to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-zynq/common.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/arm/mach-zynq/common.c +3 -5
@@ -67,11 +67,6 @@ static void __init zynq_init_machine(void) {struct platform_device_info devinfo = { .name ="cpufreq-cpu0" , }; -/* -* 64KB way size, 8-way associativity, parity disabled -*/ -l2x0_of_init (0x02000000 ,0xf0ffffff ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL );platform_device_register (&zynq_cpuidle_device);
@@ -133,6 +128,9 @@ static const char * const zynq_dt_match[] = { };DT_MACHINE_START (XILINX_EP107 ,"Xilinx Zynq Platform" ) +/* 64KB way size, 8-way associativity, parity disabled */ + .l2c_aux_val = 0x02000000, + .l2c_aux_mask = 0xf0ffffff, .smp = smp_ops(zynq_smp_ops), .map_io = zynq_map_io, .init_irq = zynq_irq_init,
Signature · 1 line
1.8.3.1
PATCH 74/97 ARM: l2c: realview: improve commentry about the L2 cache requirements
In reply to Russell King - ARM LinuxAdd better commentry about the L2 cache requirements on these platforms. Unfortunately, the auxiliary control register is not pre-set to indicate the correct cache parameters, so we have to manually program these.
--- arch/arm/mach-realview/realview_eb.c | 9 +++++++-- arch/arm/mach-realview/realview_pb1176.c | 8 +++++++- arch/arm/mach-realview/realview_pb11mp.c | 9 +++++++-- 3 files changed, 21 insertions(+), 5 deletions(-)
arch/arm/mach-realview/realview_eb.c +7 -2
@@ -442,8 +442,13 @@ static void __init realview_eb_init(void)realview_eb11mp_fixup ();#ifdef CONFIG_CACHE_L2X0 -/* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled -* Bits: .... ...0 0111 1001 0000 .... .... .... */ +/* +* The PL220 needs to be manually configured as the hardware +* doesn't report the correct sizes. +* 1MB (128KB/way), 8-way associativity, event monitor and +* parity enabled, ignore share bit, no force write allocate +* Bits: .... ...0 0111 1001 0000 .... .... .... +*/ l2x0_init (__io_address (REALVIEW_EB11MP_L220_BASE ),0x00790000 ,0xfe000fff );#endif platform_device_register (&pmu_device);
arch/arm/mach-realview/realview_pb1176.c +7 -1
@@ -355,7 +355,13 @@ static void __init realview_pb1176_init(void)int i;#ifdef CONFIG_CACHE_L2X0 -/* 128Kb (16Kb/way) 8-way associativity. evmon/parity/share enabled. */ +/* +* The PL220 needs to be manually configured as the hardware +* doesn't report the correct sizes. +* 128kB (16kB/way), 8-way associativity, event monitor and +* parity enabled, ignore share bit, no force write allocate +* Bits: .... ...0 0111 0011 0000 .... .... .... +*/ l2x0_init (__io_address (REALVIEW_PB1176_L220_BASE ),0x00730000 ,0xfe000fff );#endif
arch/arm/mach-realview/realview_pb11mp.c +7 -2
@@ -337,8 +337,13 @@ static void __init realview_pb11mp_init(void)int i;#ifdef CONFIG_CACHE_L2X0 -/* 1MB (128KB/way), 8-way associativity, evmon/parity/share enabled -* Bits: .... ...0 0111 1001 0000 .... .... .... */ +/* +* The PL220 needs to be manually configured as the hardware +* doesn't report the correct sizes. +* 1MB (128KB/way), 8-way associativity, event monitor and +* parity enabled, ignore share bit, no force write allocate +* Bits: .... ...0 0111 1001 0000 .... .... .... +*/ l2x0_init (__io_address (REALVIEW_TC11MP_L220_BASE ),0x00790000 ,0xfe000fff );#endif
Signature · 1 line
1.8.3.1
PATCH 75/97 ARM: l2c: kill L2X0_AUX_CTRL_MASK before anyone else makes use of this
In reply to Russell King - ARM LinuxL2X0_AUX_CTRL_MASK is not useful for PL310s. It would be better if people thought about their value for this rather than cargo-cult programming.
--- arch/arm/include/asm/hardware/cache-l2x0.h | 1 - 1 file changed, 1 deletion(-)
arch/arm/include/asm/hardware/cache-l2x0.h +0 -1
@@ -87,7 +87,6 @@#define L310_CACHE_ID_RTL_R3P2 0x08#define L310_CACHE_ID_RTL_R3P3 0x09 -#define L2X0_AUX_CTRL_MASK 0xc0000fff/* L2C auxiliary control register - bits common to L2C-210/220/310 */ #define L2C_AUX_CTRL_WAY_SIZE_SHIFT 17#define L2C_AUX_CTRL_WAY_SIZE_MASK (7 << 17)
Signature · 1 line
1.8.3.1
PATCH 76/97 ARM: l2c: print a warning with L2C-310 caches if the cache size is modified
In reply to Russell King - ARM LinuxAs we have now removed all instances of the L2C-310 having its cache size "modified" via platform/SoC code, discourage new cases showing up by printing a warning.
--- arch/arm/mm/cache-l2x0.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/mm/cache-l2x0.c +2 -0
@@ -732,6 +732,8 @@ static void __init __l2c_init(const struct l2c_init_data *data,/* Determine the number of ways */ switch (cache_id &L2X0_CACHE_ID_PART_MASK ) {case L2X0_CACHE_ID_PART_L310 : +if ((aux_val | ~aux_mask) & (L2C_AUX_CTRL_WAY_SIZE_MASK |L310_AUX_CTRL_ASSOCIATIVITY_16 )) +pr_warn ("L2C: DT/platform tries to modify or specify cache size\n" );if (aux & (1 <<16 )) ways =16 ;else
Signature · 1 line
1.8.3.1
PATCH 77/97 ARM: l2c: vexpress ca9x4: move L2 cache initialisation earlier
In reply to Russell King - ARM LinuxIt is beneficial to have the L2 cache up and running earlier in the system boot. Not only will this allow for simpler code when we come to enable some features, but it also means that we get a more accurate bogomips value for the udelay() loop. Calibrating the loop with the L2 cache off, and then running with the L2 cache on is not the best idea.
--- arch/arm/mach-vexpress/ct-ca9x4.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
arch/arm/mach-vexpress/ct-ca9x4.c +18 -10
@@ -45,6 +45,23 @@ static void __init ct_ca9x4_map_io(void)iotable_init (ct_ca9x4_io_desc,ARRAY_SIZE (ct_ca9x4_io_desc)); } +static void __init ca9x4_l2_init (void ) +{ +#ifdef CONFIG_CACHE_L2X0 +void __iomem *l2x0_base =ioremap (CT_CA9X4_L2CC ,SZ_4K ); + +if (l2x0_base) { +/* set RAM latencies to 1 cycle for this core tile. */ +writel (0 , l2x0_base +L310_TAG_LATENCY_CTRL ); +writel (0 , l2x0_base +L310_DATA_LATENCY_CTRL ); + +l2x0_init (l2x0_base,0x00400000 ,0xfe0fffff ); + }else { +pr_err ("L2C: unable to map L2 cache controller\n" ); + } +#endif +} +#ifdef CONFIG_HAVE_ARM_TWD static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, A9_MPCORE_TWD, IRQ_LOCALTIMER);
@@ -63,6 +80,7 @@ static void __init ct_ca9x4_init_irq(void)gic_init (0 ,29 ,ioremap (A9_MPCORE_GIC_DIST ,SZ_4K ),ioremap (A9_MPCORE_GIC_CPU ,SZ_256 ));ca9x4_twd_init (); +ca9x4_l2_init (); }static int ct_ca9x4_clcd_setup (struct clcd_fb *fb)
@@ -141,16 +159,6 @@ static void __init ct_ca9x4_init(void) {int i; -#ifdef CONFIG_CACHE_L2X0 -void __iomem *l2x0_base =ioremap (CT_CA9X4_L2CC ,SZ_4K ); - -/* set RAM latencies to 1 cycle for this core tile. */ -writel (0 , l2x0_base +L310_TAG_LATENCY_CTRL ); -writel (0 , l2x0_base +L310_DATA_LATENCY_CTRL ); - -l2x0_init (l2x0_base,0x00400000 ,0xfe0fffff ); -#endif -for (i =0 ; i <ARRAY_SIZE (ct_ca9x4_amba_devs); i++)amba_device_register (ct_ca9x4_amba_devs[i], &iomem_resource);
Signature · 1 line
1.8.3.1
PATCH 78/97 ARM: l2c: check that DT files specify the required "cache-unified" property
In reply to Russell King - ARM LinuxThis is a required property, and should always be specified.
--- arch/arm/mm/cache-l2x0.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/arm/mm/cache-l2x0.c +4 -0
@@ -1368,6 +1368,10 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) data =of_match_node (l2x0_ids, np)->data; +/* All L2 caches are unified, so this property should be specified */ +if (!of_property_read_bool (np,"cache-unified" )) +pr_err ("L2C: device tree omits to specify unified cache\n" ); +/* L2 configuration can only be changed if the cache is disabled */ if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN ))if (data->of_parse)
Signature · 1 line
1.8.3.1
PATCH 79/97 ARM: l2c: add warnings for stuff modifying aux_ctrl register values
In reply to Russell King - ARM Linux--- arch/arm/mm/cache-l2x0.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
arch/arm/mm/cache-l2x0.c +23 -4
@@ -715,7 +715,15 @@ static void __init __l2c_init(const struct l2c_init_data *data, {struct outer_cache_fns fns;unsigned way_size_bits, ways; -u32 aux; +u32 aux, old_aux; + +/* +* Sanity check the aux values. aux_mask is the bits we preserve +* from reading the hardware register, and aux_val is the bits we +* set. +*/ +if (aux_val & aux_mask) +pr_alert ("L2C: platform provided aux values permit register corruption.\n" );/* * It is strange to save the register state before initialisation,
@@ -724,11 +732,14 @@ static void __init __l2c_init(const struct l2c_init_data *data,if (data->save) data->save (l2x0_base); - aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); - + old_aux = aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); aux &= aux_mask; aux |= aux_val; +if (old_aux != aux) +pr_warn ("L2C: DT/platform modifies aux control register: 0x%08x -> 0x%08x\n" , + old_aux, aux); +/* Determine the number of ways */ switch (cache_id &L2X0_CACHE_ID_PART_MASK ) {case L2X0_CACHE_ID_PART_L310 :
@@ -1351,7 +1362,7 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask)const struct l2c_init_data *data;struct device_node *np;struct resource res; -u32 cache_id; +u32 cache_id, old_aux; np =of_find_matching_node (NULL , l2x0_ids);if (!np)
@@ -1368,6 +1379,14 @@ int __init l2x0_of_init(u32 aux_val, u32 aux_mask) data =of_match_node (l2x0_ids, np)->data; + old_aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); +if (old_aux != ((old_aux & aux_mask) | aux_val)) { +pr_warn ("L2C: platform modifies aux control register: 0x%08x -> 0x%08x\n" , + old_aux, (old_aux & aux_mask) | aux_val); + }else if (aux_mask != ~0U && aux_val !=0 ) { +pr_alert ("L2C: platform provided aux values match the hardware, so have no effect. Please remove them.\n" ); + } +/* All L2 caches are unified, so this property should be specified */ if (!of_property_read_bool (np,"cache-unified" ))pr_err ("L2C: device tree omits to specify unified cache\n" );
Signature · 1 line
1.8.3.1
PATCH 80/97 ARM: l2c: trial at enabling some Cortex-A9 optimisations
In reply to Russell King - ARM Linux--- arch/arm/include/asm/hardware/cache-l2x0.h | 8 ++++ arch/arm/mm/cache-l2x0.c | 73 ++++++++++++++++++++++++++++-- 2 files changed, 78 insertions(+), 3 deletions(-)
arch/arm/include/asm/hardware/cache-l2x0.h +8 -0
@@ -134,6 +134,14 @@#define L310_ADDR_FILTER_EN 1 +#define L310_PREFETCH_CTRL_OFFSET_MASK 0x1f +#define L310_PREFETCH_CTRL_DBL_LINEFILL_INCR BIT(23) +#define L310_PREFETCH_CTRL_PREFETCH_DROP BIT(24) +#define L310_PREFETCH_CTRL_DBL_LINEFILL_WRAP BIT(27) +#define L310_PREFETCH_CTRL_DATA_PREFETCH BIT(28) +#define L310_PREFETCH_CTRL_INSTR_PREFETCH BIT(29) +#define L310_PREFETCH_CTRL_DBL_LINEFILL BIT(30) +#define L2X0_CTRL_EN 1#define L2X0_WAY_SIZE_SHIFT 3
arch/arm/mm/cache-l2x0.c +70 -3
125 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 81/97 ARM: l2c: move L2 cache register saving to a more sensible location
In reply to Russell King - ARM LinuxMove the L2 cache register saving to a more sensible location - after the cache has been enabled, and fixups have been run. We move the saving of the auxiliary control register into the ->save function as well which makes everything operate in a sane and maintainable way.
--- arch/arm/mm/cache-l2x0.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-)
arch/arm/mm/cache-l2x0.c +22 -12
@@ -202,6 +202,11 @@ static void l2x0_disable(void)raw_spin_unlock_irqrestore (&l2x0_lock, flags); } +static void l2c_save (void __iomem *base) +{ + l2x0_saved_regs.aux_ctrl =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); +} +/* * L2C-210 specific code. *
@@ -295,6 +300,7 @@ static const struct l2c_init_data l2c210_data __initconst = { .way_size_0 = SZ_8K, .num_lock = 1, .enable = l2c_enable, + .save = l2c_save, .outer_cache = { .inv_range = l2c210_inv_range, .clean_range = l2c210_clean_range,
@@ -439,6 +445,7 @@ static const struct l2c_init_data l2c220_data = { .way_size_0 = SZ_8K, .num_lock = 1, .enable = l2c_enable, + .save = l2c_save, .outer_cache = { .inv_range = l2c220_inv_range, .clean_range = l2c220_clean_range,
@@ -570,6 +577,8 @@ static void __init l2c310_save(void __iomem *base) {unsigned revision; +l2c_save (base); + l2x0_saved_regs.tag_latency =readl_relaxed (base +L310_TAG_LATENCY_CTRL ); l2x0_saved_regs.data_latency = readl_relaxed(base +
@@ -792,13 +801,6 @@ static void __init __l2c_init(const struct l2c_init_data *data,if (aux_val & aux_mask)pr_alert ("L2C: platform provided aux values permit register corruption.\n" ); -/* -* It is strange to save the register state before initialisation, -* but hey, this is what the DT implementations decided to do. -*/ -if (data->save) - data->save (l2x0_base); - old_aux = aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); aux &= aux_mask; aux |= aux_val;
@@ -860,13 +862,17 @@ static void __init __l2c_init(const struct l2c_init_data *data,if (!(readl_relaxed (l2x0_base +L2X0_CTRL ) &L2X0_CTRL_EN )) data->enable (l2x0_base, aux, data->num_lock); -/* Re-read it in case some bits are reserved. */ - aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL ); + outer_cache = fns; -/* Save the value for resuming. */ - l2x0_saved_regs.aux_ctrl = aux; +/* +* It is strange to save the register state before initialisation, +* but hey, this is what the DT implementations decided to do. +*/ +if (data->save) + data->save (l2x0_base); - outer_cache = fns; +/* Re-read it in case some bits are reserved. */ + aux =readl_relaxed (l2x0_base +L2X0_AUX_CTRL );pr_info ("%s cache controller enabled, %d ways, %d kB\n" , data->type, ways, l2x0_size >>10 );
@@ -948,6 +954,7 @@ static const struct l2c_init_data of_l2c210_data __initconst = { .num_lock = 1, .of_parse = l2x0_of_parse, .enable = l2c_enable, + .save = l2c_save, .outer_cache = { .inv_range = l2c210_inv_range, .clean_range = l2c210_clean_range,
@@ -965,6 +972,7 @@ static const struct l2c_init_data of_l2c220_data __initconst = { .num_lock = 1, .of_parse = l2x0_of_parse, .enable = l2c_enable, + .save = l2c_save, .outer_cache = { .inv_range = l2c220_inv_range, .clean_range = l2c220_clean_range,
@@ -1378,6 +1386,8 @@ static const struct l2c_init_data of_bcm_l2x0_data __initconst = {static void __init tauros3_save (void __iomem *base) { +l2c_save (base); + l2x0_saved_regs.aux2_ctrl =readl_relaxed (base +TAUROS3_AUX2_CTRL ); l2x0_saved_regs.prefetch_ctrl =
Signature · 1 line
1.8.3.1
PATCH 82/97 ARM: l2c: always enable low power modes
In reply to Russell King - ARM LinuxAlways enable the L2C low power modes on L2C-310 R3P0 and newer parts.
--- arch/arm/mm/cache-l2x0.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/mm/cache-l2x0.c +12 -0
@@ -695,6 +695,18 @@ static void __init l2c310_enable(void __iomem *base, u32 aux, unsigned num_lock) 1 + (prefetch & L310_PREFETCH_CTRL_OFFSET_MASK)); } +/* r3p0 or later has power control register */ +if (rev >=L310_CACHE_ID_RTL_R3P0 ) { +u32 power_ctrl; + +l2c_write_sec (L310_DYNAMIC_CLK_GATING_EN |L310_STNDBY_MODE_EN , + base,L310_POWER_CTRL ); + power_ctrl =readl_relaxed (base +L310_POWER_CTRL ); +pr_info ("L2C-310 dynamic clock gating %sabled, standby mode %sabled\n" , + power_ctrl &L310_DYNAMIC_CLK_GATING_EN ?"en" :"dis" , + power_ctrl &L310_STNDBY_MODE_EN ?"en" :"dis" ); + } +l2c_enable (base, aux, num_lock);if (aux &L310_AUX_CTRL_FULL_LINE_ZERO ) {
Signature · 1 line
1.8.3.1
PATCH 83/97 ARM: l2c: imx: remove direct write to power control register
In reply to Russell King - ARM LinuxNow that we handle this in core code, we don't need platforms enabling the low power modes directly.
--- arch/arm/mach-imx/system.c | 2 -- 1 file changed, 2 deletions(-)
arch/arm/mach-imx/system.c +0 -2
@@ -138,8 +138,6 @@ void __init imx_init_l2cache(void)if (cpu_is_imx6q ()) val &= ~(1 <<30 |1 <<23 );writel_relaxed (val, l2x0_base +L310_PREFETCH_CTRL ); - val =L310_DYNAMIC_CLK_GATING_EN |L310_STNDBY_MODE_EN ; -writel_relaxed (val, l2x0_base +L310_POWER_CTRL );iounmap (l2x0_base);of_node_put (np);
Signature · 1 line
1.8.3.1
PATCH 84/97 ARM: l2c: omap2: avoid reading directly from the L2 registers in platform code
In reply to Russell King - ARM LinuxAvoid reading directly from the L2 registers in platform code. The L2 code will have already saved the register values itself into the l2x0_saved_regs structure, so platform code should just move these values to where they're required.
This is safe because the L2x0 will have been initialised by an early initcall, whereas the OMAP4 PM code is initialised late.
--- arch/arm/mach-omap2/omap-mpuss-lowpower.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)
arch/arm/mach-omap2/omap-mpuss-lowpower.c +6 -10
@@ -187,19 +187,15 @@ static void l2x0_pwrst_prepare(unsigned int cpu_id, unsigned int save_state)* in every restore MPUSS OFF path. */ #ifdef CONFIG_CACHE_L2X0 -static void save_l2x0_context (void ) +static void __init save_l2x0_context (void ) { -u32 val; -void __iomem *l2x0_base =omap4_get_l2cache_base (); -if (l2x0_base) { - val =__raw_readl (l2x0_base +L2X0_AUX_CTRL ); -__raw_writel (val, sar_base +L2X0_AUXCTRL_OFFSET ); - val =__raw_readl (l2x0_base +L310_PREFETCH_CTRL ); -__raw_writel (val, sar_base +L2X0_PREFETCH_CTRL_OFFSET ); - } +__raw_writel (l2x0_saved_regs.aux_ctrl, + sar_base +L2X0_AUXCTRL_OFFSET ); +__raw_writel (l2x0_saved_regs.prefetch_ctrl, + sar_base +L2X0_PREFETCH_CTRL_OFFSET ); }#else -static void save_l2x0_context (void ) +static void __init save_l2x0_context (void ) {}#endif
Signature · 1 line
1.8.3.1
PATCH 85/97 ARM: l2c: imx: convert to common l2c310 early resume functionality
In reply to Russell King - ARM Linux--- arch/arm/mach-imx/suspend-imx6.S | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-)
arch/arm/mach-imx/suspend-imx6.S +3 -21
@@ -334,28 +334,10 @@ ENDPROC(imx6_suspend) * turned into relative ones. */ -#ifdef CONFIG_CACHE_L2X0 - .macro pl310_resume - adr r0, l2x0_saved_regs_offset - ldr r2, [r0] - add r2, r2, r0 - ldr r0, [r2, #L2X0_R_PHY_BASE] @ get physical base of l2x0 - ldr r1, [r2, #L2X0_R_AUX_CTRL] @ get aux_ctrl value - str r1, [r0, #L2X0_AUX_CTRL] @ restore aux_ctrl - mov r1, #0x1 - str r1, [r0, #L2X0_CTRL] @ re-enable L2 - .endm - -l2x0_saved_regs_offset: - .word l2x0_saved_regs - . - -#else - .macro pl310_resume - .endm -#endif - ENTRY(v7_cpu_resume) bl v7_invalidate_l1 - pl310_resume +#ifdef CONFIG_CACHE_L2X0 + bl l2c310_early_resume +#endif b cpu_resume ENDPROC(v7_cpu_resume)
Signature · 1 line
1.8.3.1
PATCH 86/97 ARM: l2c: always enable non-secure access to lockdown registers
In reply to Russell King - ARM LinuxSince we always write to these during the cache initialisation, it is a good idea to always have the non-secure access bit set. Set it in core code and remove it from OMAP4. Remove the NS access bit for the interrupt registers from OMAP4 as well - nothing in the kernel accesses that yet, and we can add it in core code when we have the need.
--- arch/arm/mach-omap2/omap4-common.c | 6 ++---- arch/arm/mm/cache-l2x0.c | 23 +++++++++++++++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-)
arch/arm/mach-omap2/omap4-common.c +2 -4
@@ -214,17 +214,15 @@ static int __init omap_l2_cache_init(void)/* 16-way associativity, parity disabled, way size - 64KB (es2.0 +) */ aux_ctrl =L310_AUX_CTRL_CACHE_REPLACE_RR | -L310_AUX_CTRL_NS_LOCKDOWN | -L310_AUX_CTRL_NS_INT_CTRL |L2C_AUX_CTRL_SHARED_OVERRIDE |L310_AUX_CTRL_DATA_PREFETCH |L310_AUX_CTRL_INSTR_PREFETCH ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ()) -l2x0_of_init (aux_ctrl,0xc19fffff ); +l2x0_of_init (aux_ctrl,0xcd9fffff );else -l2x0_init (l2cache_base, aux_ctrl,0xc19fffff ); +l2x0_init (l2cache_base, aux_ctrl,0xcd9fffff );return 0 ; }
arch/arm/mm/cache-l2x0.c +21 -2
@@ -440,11 +440,23 @@ static void l2c220_sync(void)raw_spin_unlock_irqrestore (&l2x0_lock, flags); } +static void l2c220_enable (void __iomem *base,u32 aux,unsigned num_lock) +{ +/* +* Always enable non-secure access to the lockdown registers - +* we write to them as part of the L2C enable sequence so they +* need to be accessible. +*/ + aux |=L220_AUX_CTRL_NS_LOCKDOWN ; + +l2c_enable (base, aux, num_lock); +} +static const struct l2c_init_data l2c220_data = { .type ="L2C-220" , .way_size_0 =SZ_8K , .num_lock =1 , - .enable = l2c_enable, + .enable = l2c220_enable, .save = l2c_save, .outer_cache = { .inv_range = l2c220_inv_range,
@@ -707,6 +719,13 @@ static void __init l2c310_enable(void __iomem *base, u32 aux, unsigned num_lock) power_ctrl & L310_STNDBY_MODE_EN ? "en" : "dis"); } +/* +* Always enable non-secure access to the lockdown registers - +* we write to them as part of the L2C enable sequence so they +* need to be accessible. +*/ + aux |=L310_AUX_CTRL_NS_LOCKDOWN ; +l2c_enable (base, aux, num_lock);if (aux &L310_AUX_CTRL_FULL_LINE_ZERO ) {
@@ -983,7 +1002,7 @@ static const struct l2c_init_data of_l2c220_data __initconst = { .way_size_0 = SZ_8K, .num_lock = 1, .of_parse = l2x0_of_parse, - .enable = l2c_enable, + .enable = l2c220_enable, .save = l2c_save, .outer_cache = { .inv_range = l2c220_inv_range,
Signature · 1 line
1.8.3.1
PATCH 87/97 ARM: l2c: omap2+: get rid of redundant cache replacement policy setting
In reply to Russell King - ARM LinuxFrom: Sekhar Nori <[email protected]>
To: linux-arm-kernel at lists.ifradead.org
L2 cache initialization for OMAP4 redundantly sets the cache policy to Round-Robin. This is not needed since thats the PL310 default anyway.
Removing this reduces the number of platform specific aux control settings.
--- arch/arm/mach-omap2/omap4-common.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
arch/arm/mach-omap2/omap4-common.c +3 -4
@@ -213,16 +213,15 @@ static int __init omap_l2_cache_init(void)return -ENOMEM ;/* 16-way associativity, parity disabled, way size - 64KB (es2.0 +) */ - aux_ctrl =L310_AUX_CTRL_CACHE_REPLACE_RR | -L2C_AUX_CTRL_SHARED_OVERRIDE | + aux_ctrl =L2C_AUX_CTRL_SHARED_OVERRIDE |L310_AUX_CTRL_DATA_PREFETCH |L310_AUX_CTRL_INSTR_PREFETCH ; outer_cache.write_sec = omap4_l2c310_write_sec;if (of_have_populated_dt ()) -l2x0_of_init (aux_ctrl,0xcd9fffff ); +l2x0_of_init (aux_ctrl,0xcf9fffff );else -l2x0_init (l2cache_base, aux_ctrl,0xcd9fffff ); +l2x0_init (l2cache_base, aux_ctrl,0xcf9fffff );return 0 ; }
Signature · 1 line
1.8.3.1
PATCH 88/97 ARM: l2c: omap2+: get rid of init call
In reply to Russell King - ARM LinuxFrom: Sekhar Nori <[email protected]>
To: linux-arm-kernel at lists.ifradead.org
Get rid of init call to initialize L2 cache. Instead use the init_early machine hook. This helps in using the initialization routine across SoCs without the need of ugly cpu_is_*() checks.
--- arch/arm/mach-omap2/common.h | 1 + arch/arm/mach-omap2/io.c | 1 + arch/arm/mach-omap2/omap4-common.c | 10 +--------- 3 files changed, 3 insertions(+), 9 deletions(-)
arch/arm/mach-omap2/common.h +1 -0
@@ -91,6 +91,7 @@ extern void omap3_sync32k_timer_init(void);extern void omap3_secure_sync32k_timer_init (void );extern void omap3_gptimer_timer_init (void );extern void omap4_local_timer_init (void ); +int omap_l2_cache_init (void );extern void omap5_realtime_timer_init (void );void omap2420_init_early (void );
arch/arm/mach-omap2/io.c +1 -0
@@ -640,6 +640,7 @@ void __init omap4430_init_early(void)omap44xx_clockdomains_init ();omap44xx_hwmod_init ();omap_hwmod_init_postsetup (); +omap_l2_cache_init (); omap_clk_soc_init = omap4xxx_dt_clk_init; }
arch/arm/mach-omap2/omap4-common.c +1 -9
@@ -196,17 +196,10 @@ static void omap4_l2c310_write_sec(unsigned long val, unsigned reg)omap_smc1 (smc_op, val); } -static int __init omap_l2_cache_init (void ) +int __init omap_l2_cache_init (void ) {u32 aux_ctrl; -/* -* To avoid code running on other OMAPs in -* multi-omap builds -*/ -if (!cpu_is_omap44xx ()) -return -ENODEV ; -/* Static mapping, never released */ l2cache_base =ioremap (OMAP44XX_L2CACHE_BASE ,SZ_4K );if (WARN_ON (!l2cache_base))
@@ -225,7 +218,6 @@ static int __init omap_l2_cache_init(void) return 0; } -omap_early_initcall (omap_l2_cache_init);#endif void __iomem *omap4_get_sar_ram_base (void )
Signature · 1 line
1.8.3.1
PATCH 89/97 ARM: l2c: AM43x: add L2 cache support
In reply to Russell King - ARM LinuxFrom: Sekhar Nori <[email protected]>
To: linux-arm-kernel at lists.ifradead.org
Add support for L2 cache controller (PL310) on AM437x SoC.
--- arch/arm/mach-omap2/Kconfig | 1 + arch/arm/mach-omap2/io.c | 1 + 2 files changed, 2 insertions(+)
arch/arm/mach-omap2/Kconfig +1 -0
@@ -65,6 +65,7 @@ config SOC_AM43XX select ARCH_HAS_OPP select ARM_GIC select MACH_OMAP_GENERIC + select MIGHT_HAVE_CACHE_L2X0 config SOC_DRA7XX bool "TI DRA7XX"
arch/arm/mach-omap2/io.c +1 -0
@@ -609,6 +609,7 @@ void __init am43xx_init_early(void)am43xx_clockdomains_init ();am43xx_hwmod_init ();omap_hwmod_init_postsetup (); +omap_l2_cache_init (); omap_clk_soc_init = am43xx_dt_clk_init; }
Signature · 1 line
1.8.3.1
PATCH 90/97 ARM: l2c: convert rockchip to generic l2c initialisation
In reply to Russell King - ARM LinuxThis also allows us to eliminate the .init_machine function.
--- arch/arm/mach-rockchip/rockchip.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
arch/arm/mach-rockchip/rockchip.c +2 -7
@@ -24,12 +24,6 @@#include <asm/hardware/cache-l2x0.h> #include "core.h" -static void __init rockchip_dt_init (void ) -{ -l2x0_of_init (0 , ~0 ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char *const rockchip_board_dt_compat[] = {"rockchip,rk2928" ,"rockchip,rk3066a" ,
@@ -39,7 +33,8 @@ static const char * const rockchip_board_dt_compat[] = { };DT_MACHINE_START (ROCKCHIP_DT ,"Rockchip Cortex-A9 (Device Tree)" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .smp = smp_ops(rockchip_smp_ops), - .init_machine = rockchip_dt_init, .dt_compat = rockchip_board_dt_compat,MACHINE_END
Signature · 1 line
1.8.3.1
PATCH 91/97 ARM: l2c: convert highbank to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-highbank/highbank.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
arch/arm/mach-highbank/highbank.c +3 -6
@@ -66,12 +66,6 @@ static void __init highbank_init_irq(void)if (of_find_compatible_node (NULL ,NULL ,"arm,cortex-a9" ))highbank_scu_map_io (); - -/* Enable PL310 L2 Cache controller */ -if (IS_ENABLED (CONFIG_CACHE_L2X0 )) { - outer_cache.write_sec = highbank_l2c310_write_sec; -l2x0_of_init (0 , ~0 ); - } }static void highbank_power_off (void )
@@ -185,6 +179,9 @@ DT_MACHINE_START(HIGHBANK, "Highbank") #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) .dma_zone_size = (4ULL * SZ_1G), #endif + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, + .l2c_write_sec = highbank_l2c310_write_sec, .init_irq = highbank_init_irq, .init_machine = highbank_init, .dt_compat = highbank_match,
Signature · 1 line
1.8.3.1
PATCH 92/97 ARM: l2c: convert vexpress to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-vexpress/v2m.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/arm/mach-vexpress/v2m.c +2 -1
@@ -432,7 +432,6 @@ static const struct of_device_id v2m_dt_bus_match[] __initconst = {static void __init v2m_dt_init (void ) { -l2x0_of_init (0x00400000 ,0xfe0fffff );of_platform_populate (NULL , v2m_dt_bus_match,NULL ,NULL ); }
@@ -443,6 +442,8 @@ static const char * const v2m_dt_match[] __initconst = {DT_MACHINE_START (VEXPRESS_DT ,"ARM-Versatile Express" ) .dt_compat = v2m_dt_match, + .l2c_aux_val = 0x00400000, + .l2c_aux_mask = 0xfe0fffff, .smp = smp_ops(vexpress_smp_ops), .smp_init = smp_init_ops(vexpress_smp_init_ops), .map_io = v2m_dt_map_io,
Signature · 1 line
1.8.3.1
PATCH 93/97 ARM: l2c: convert mvebu to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-mvebu/board-v7.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/arm/mach-mvebu/board-v7.c +6 -3
@@ -59,9 +59,6 @@ static void __init mvebu_timer_and_clk_init(void)clocksource_of_init ();coherency_init ();BUG_ON (mvebu_mbus_dt_init ()); -#ifdef CONFIG_CACHE_L2X0 -l2x0_of_init (0 , ~0 ); -#endif if (of_machine_is_compatible ("marvell,armada375" )) hook_fault_code(16 + 6, armada_375_external_abort_wa, SIGBUS, 0,
@@ -109,6 +106,8 @@ static const char * const armada_370_xp_dt_compat[] = { };DT_MACHINE_START (ARMADA_370_XP_DT ,"Marvell Armada 370/XP (Device Tree)" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .smp = smp_ops(armada_xp_smp_ops), .init_machine = mvebu_dt_init, .init_time = mvebu_timer_and_clk_init,
@@ -122,6 +121,8 @@ static const char * const armada_375_dt_compat[] = { };DT_MACHINE_START (ARMADA_375_DT ,"Marvell Armada 375 (Device Tree)" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .init_time = mvebu_timer_and_clk_init, .restart = mvebu_restart, .dt_compat = armada_375_dt_compat,
@@ -134,6 +135,8 @@ static const char * const armada_38x_dt_compat[] = { };DT_MACHINE_START (ARMADA_38X_DT ,"Marvell Armada 380/385 (Device Tree)" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .init_time = mvebu_timer_and_clk_init, .restart = mvebu_restart, .dt_compat = armada_38x_dt_compat,
Signature · 1 line
1.8.3.1
PATCH 93/97 ARM: l2c: convert mvebu to generic l2c initialisation
Quoted 4 lines · Russell King
Signed-off-by Russell King <[email protected]>--- arch/arm/mach-mvebu/board-v7.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
Are you taking this, or shall I? We already have one trivial conflict with your UL patch. This won't be any worse than that, so
Otherwise, just let me know and I'll pick it up.
thx,
Jason.
PATCH 93/97 ARM: l2c: convert mvebu to generic l2c initialisation
Quoted 6 lines · Jason Cooper
Quoted 4 lines · Russell King
Signed-off-by Russell King <[email protected]>--- arch/arm/mach-mvebu/board-v7.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
Quoted 6 lines
Are you taking this, or shall I? We already have one trivial conflict with your UL patch. This won't be any worse than that, so
Acked-by Jason Cooper <[email protected]>Otherwise, just let me know and I'll pick it up.
Neither, I've just decided to scrap the entire lot of patches. I don't care whether people think this set was a good idea or not, it's just impractical to merge this kind of change with people who can't be fucked to look at the earlier series, and then come around wanting patches split up and other crap like that, and who make accusations about patches not being acked.
I've had enough of crap like this.
Core ARM maintanence is impossible.
Signature · 2 lines
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it.
PATCH 94/97 ARM: l2c: convert bcm_5301x to generic l2c initialisation
In reply to Russell King - ARM LinuxThis also allows us to eliminate the .init_machine function.
--- arch/arm/mach-bcm/bcm_5301x.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
arch/arm/mach-bcm/bcm_5301x.c +2 -7
@@ -43,19 +43,14 @@ static void __init bcm5301x_init_early(void) "imprecise external abort"); } -static void __init bcm5301x_dt_init (void ) -{ -l2x0_of_init (0 , ~0 ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char __initconst *bcm5301x_dt_compat[] = {"brcm,bcm4708" ,NULL , };DT_MACHINE_START (BCM5301X ,"BCM5301X" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .init_early = bcm5301x_init_early, - .init_machine = bcm5301x_dt_init, .dt_compat = bcm5301x_dt_compat,MACHINE_END
Signature · 1 line
1.8.3.1
PATCH 95/97 ARM: l2c: convert imx vf610 to generic l2c initialisation
In reply to Russell King - ARM LinuxSince the .init_irq method only calls irqchip_init, we can remove that too.
--- arch/arm/mach-imx/mach-vf610.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
arch/arm/mach-imx/mach-vf610.c +2 -7
@@ -20,19 +20,14 @@ static void __init vf610_init_machine(void)of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); } -static void __init vf610_init_irq (void ) -{ -l2x0_of_init (0 , ~0 ); -irqchip_init (); -} -static const char *vf610_dt_compat[]__initconst = {"fsl,vf610" ,NULL , };DT_MACHINE_START (VYBRID_VF610 ,"Freescale Vybrid VF610 (Device Tree)" ) - .init_irq = vf610_init_irq, + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .init_machine = vf610_init_machine, .dt_compat = vf610_dt_compat, .restart = mxc_restart,
Signature · 1 line
1.8.3.1
PATCH 96/97 ARM: l2c: convert socfpga to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-socfpga/socfpga.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
arch/arm/mach-socfpga/socfpga.c +2 -7
@@ -98,22 +98,17 @@ static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd)writel (temp, rst_manager_base_addr +SOCFPGA_RSTMGR_CTRL ); } -static void __init socfpga_cyclone5_init (void ) -{ -l2x0_of_init (0 , ~0 ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char *altera_dt_match[] = {"altr,socfpga" ,NULL };DT_MACHINE_START (SOCFPGA ,"Altera SOCFPGA" ) + .l2c_aux_val = 0, + .l2c_aux_mask = ~0, .smp = smp_ops(socfpga_smp_ops), .map_io = socfpga_map_io, .init_irq = socfpga_init_irq, - .init_machine = socfpga_cyclone5_init, .restart = socfpga_cyclone5_restart, .dt_compat = altera_dt_match,MACHINE_END
Signature · 1 line
1.8.3.1
PATCH 97/97 ARM: l2c: convert berlin to generic l2c initialisation
In reply to Russell King - ARM Linux--- arch/arm/mach-berlin/berlin.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)
arch/arm/mach-berlin/berlin.c +6 -11
@@ -18,16 +18,6 @@#include <asm/hardware/cache-l2x0.h> #include <asm/mach/arch.h> -static void __init berlin_init_machine (void ) -{ -/* -* with DT probing for L2CCs, berlin_init_machine can be removed. -* Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc -*/ -l2x0_of_init (0x30c00000 ,0xfeffffff ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char *const berlin_dt_compat[] = {"marvell,berlin" ,NULL ,
@@ -35,5 +25,10 @@ static const char * const berlin_dt_compat[] = {DT_MACHINE_START (BERLIN_DT ,"Marvell Berlin" ) .dt_compat = berlin_dt_compat, - .init_machine = berlin_init_machine, +/* +* with DT probing for L2CCs, berlin_init_machine can be removed. +* Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc +*/ + .l2c_aux_val = 0x30c00000, + .l2c_aux_mask =0xfeffffff ,MACHINE_END
Signature · 1 line
1.8.3.1
Sebastian Hesselbarth
maintainerPATCH 97/97 ARM: l2c: convert berlin to generic l2c initialisation
Quoted 1 line · Russell King
Signed-off-by Russell King <[email protected]>
FWIW,
Thanks for looking into this!
Quoted 38 lines
--- arch/arm/mach-berlin/berlin.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)arch/arm/mach-berlin/berlin.c +6
-11@@ -18,16 +18,6 @@#include <asm/hardware/cache-l2x0.h> #include <asm/mach/arch.h> -static void __init berlin_init_machine (void ) -{ -/* -* with DT probing for L2CCs, berlin_init_machine can be removed. -* Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc -*/ -l2x0_of_init (0x30c00000 ,0xfeffffff ); -of_platform_populate (NULL , of_default_bus_match_table,NULL ,NULL ); -} -static const char *const berlin_dt_compat[] = {"marvell,berlin" ,NULL ,@@ -35,5 +25,10 @@ static const char * const berlin_dt_compat[] = {DT_MACHINE_START (BERLIN_DT ,"Marvell Berlin" ) .dt_compat = berlin_dt_compat, - .init_machine = berlin_init_machine, +/* +* with DT probing for L2CCs, berlin_init_machine can be removed. +* Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc +*/ + .l2c_aux_val = 0x30c00000, + .l2c_aux_mask =0xfeffffff ,MACHINE_END
cover Full L2C patch series
In reply to Russell King - ARM LinuxQuoted 5 lines · Russell King - ARM Linux
Not much to say which hasn't already been said... except I'm reaching the end of my teather with this series.
I'll push it out shortly as my "to-build" branch - which is a branch which gets automatic separate build testing by Olof's system.
... now withdrawn and removed.
Congratulations everyone.
Signature · 2 lines
FTTC broadband for 0.8mile line: now at 9.7Mbps down 460kbps up... slowly improving, and getting towards what was expected from it.