ARM: Tegra: Omit L2 flush at disable
Antti P Miettinen [Thu, 31 May 2012 09:44:01 +0000 (12:44 +0300)]
In Tegra kernel L2 is disabled only upon CPU cluster power down,
e.g. LP2 entry. Flushing L2 upon every LP2 entry is costly.
Since we are always in single core mode upon cluster power down
we can safely omit L2 flush upon L2 disable.

Change-Id: I27542b11e6133f3192a02440e5b14ea408b860fd
Signed-off-by: Antti P Miettinen <amiettinen@nvidia.com>
Reviewed-on: http://git-master/r/105625
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com>

arch/arm/mach-tegra/common.c

index 85eb11f..c5401e6 100644 (file)
@@ -290,6 +290,20 @@ static inline void tegra_init_cache_tz(bool init)
 #endif /* CONFIG_TRUSTED_FOUNDATIONS  */
 
 #ifdef CONFIG_CACHE_L2X0
+/*
+ * We define our own outer_disable() to avoid L2 flush upon LP2 entry.
+ * Since the Tegra kernel will always be in single core mode when
+ * L2 is being disabled, we can omit the locking. Since we are not
+ * accessing the spinlock we also avoid the problem of the spinlock
+ * storage getting out of sync.
+ */
+static inline void tegra_l2x0_disable(void)
+{
+       void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000;
+       writel_relaxed(0, p + L2X0_CTRL);
+       dsb();
+}
+
 void tegra_init_cache(bool init)
 {
 #ifdef CONFIG_TRUSTED_FOUNDATIONS
@@ -336,6 +350,8 @@ void tegra_init_cache(bool init)
        aux_ctrl |= 0x7C000001;
        if (init) {
                l2x0_init(p, aux_ctrl, 0x8200c3fe);
+               /* use our outer_disable() routine to avoid flush */
+               outer_cache.disable = tegra_l2x0_disable;
        } else {
                u32 tmp;