ARM: tegra: Clean kernel and I/O mappings upon LP2
Antti P Miettinen [Thu, 23 Feb 2012 11:18:31 +0000 (13:18 +0200)]
There is no need to flush the complete L2 upon LP2
entry but it is necessary to clean the page table
entries needed by LP2 code sequence that has L2 off
and MMU on.

Bug 931316

Change-Id: Ice353f16d35ee24d4387e7b9b135f205c4d0ba32
Signed-off-by: Antti P Miettinen <amiettinen@nvidia.com>
Reviewed-on: http://git-master/r/86293
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/pm.c

index 450c5e1..ee5517e 100644 (file)
@@ -577,6 +577,7 @@ unsigned int tegra_idle_lp2_last(unsigned int sleep_time, unsigned int flags)
 {
        u32 mode;       /* hardware + software power mode flags */
        unsigned int remain;
+       pgd_t *pgd;
 
        /* Only the last cpu down does the final suspend steps */
        mode = readl(pmc + PMC_CTRL);
@@ -611,6 +612,14 @@ unsigned int tegra_idle_lp2_last(unsigned int sleep_time, unsigned int flags)
        suspend_cpu_complex(mode);
        tegra_cluster_switch_time(flags, tegra_cluster_switch_time_id_prolog);
        flush_cache_all();
+       /*
+        * No need to flush complete L2. Cleaning kernel and IO mappings
+        * is enough for the LP code sequence that has L2 disabled but
+        * MMU on.
+        */
+       pgd = cpu_get_pgd();
+       outer_clean_range(__pa(pgd + USER_PTRS_PER_PGD),
+                         __pa(pgd + PTRS_PER_PGD));
        outer_disable();
 
        tegra_sleep_cpu(PLAT_PHYS_OFFSET - PAGE_OFFSET);