Restore "ARM: tegra: power: Workaround PMD corruption by cpu_resume_mmu"
authorSang-Hun Lee <sanlee@nvidia.com>
Mon, 16 Apr 2012 17:53:37 +0000 (10:53 -0700)
committerRohan Somvanshi <rsomvanshi@nvidia.com>
Thu, 19 Apr 2012 14:40:13 +0000 (07:40 -0700)
commitfce62841d65737d001b083db0a74525a9d611dfc
treeeb9f8985164677f879945ac168dc5d0e4e14e423
parent4fa4ef0ac97433028ad84f9df1266790c44651e7
Restore "ARM: tegra: power: Workaround PMD corruption by cpu_resume_mmu"

This restores commit 607d5ec8bb46f95473533f611da1ffc97907d16e.

The common ARM CPU state suspend/resume code does not work with
and external L2 cache controller (like a PL310) enabled. This
change fixes corruption of the current PMD by the MMU resume code.

cpu_resume_mmu modifies the currently active page tables to add
a flat (VA==PA) section mapping of cpu_resume_turn_mmu_on to
handle MMU off-to-on transition. It turns off the L1 data cache
but it knows nothing of the L2 cache. Since page table walks are
L2 cacheable, other CPUs in the system can pick up the corrupted
PMD which will eventually result in a kernel panic.

The workaround for this is to modify push_ctx_regs to save the
current TTB0 and CONTEXID registers in the CPU register context
and switch to the private tegra_pgd before saving the rest of the
CPU context. The tegra_pgd already has a flat mapping for the
code in question, so it can't be damaged by the actions of
cpu_resume_mmu. Likewise, pop_ctx_regs is modified to restore
the actual TTB0 and CONTEXTID registers when restoring the CPU
registers.

Bug 967887

Change-Id: Iaf98c46359860531874354e8cddabe299ea90d57
Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com>
Reviewed-on: http://git-master/r/96789
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h