linux-next/arch/arm
Santosh Shilimkar ff999b8a09 ARM: OMAP4460: Workaround for ROM bug because of CA9 r2pX GIC control register change.
On OMAP4+ devices, GIC register context is lost when MPUSS hits
the OSWR(Open Switch Retention). On the CPU wakeup path, ROM code
gets executed and one of the steps in it is to restore the
saved context of the GIC. The ROM Code GIC distributor restoration
is split in two parts: CPU specific register done by each CPU and
common register done by only one CPU.

Below is the abstract flow.

...............................................................
- MPUSS in OSWR state.
- CPU0 wakes up on the event(interrupt) and start executing ROM code.

[..]

- CPU0 executes "GIC Restoration:"

[...]

- CPU0 swicthes to non-secure mode and jumps to OS resume code.

[...]

- CPU0 is online in OS
- CPU0 enables the GIC distributor. GICD.Enable Non-secure = 1
- CPU0 wakes up CPU1 with clock-domain force wakeup method.
- CPU0 continues it's execution.
[..]

- CPU1 wakes up and start executing ROM code.

[..]

- CPU1 executes "GIC Restoration:"

[..]

- CPU1 swicthes to non-secure mode and jumps to OS resume code.

[...]

- CPU1 is online in OS and start executing.
[...]   -

GIC Restoration: /* Common routine for HS and GP devices */
{
       if (GICD != 1)  { /* This will be true in OSWR state */
               if (GIC_SAR_BACKUP_STATE == SAVED)
                       - CPU restores GIC distributor
               else
                       - reconfigure GIC distributor to boot values.

               GICD.Enable secure = 1
       }

       if (GIC_SAR_BACKUP_STATE == SAVED)
               - CPU restore its GIC CPU interface registers if saved.
       else
               - reconfigure its GIC CPU interface registers to boot
                       values.
}
...............................................................

So as mentioned in the flow, GICD != 1 condition decides how
the GIC registers are handled in ROM code wakeup path from
OSWR. As evident from the flow, ROM code relies on the entire
GICD register value and not specific register bits.

The assumption was valid till CortexA9 r1pX version since there
was only one banked bit to control secure and non-secure GICD.
Secure view which ROM code sees:
       bit 0 == Enable Non-secure
Non-secure view which HLOS sees:
       bit 0 == Enable secure

But GICD register has changed between CortexA9 r1pX and r2pX.
On r2pX GICD register is composed of 2 bits.
Secure view which ROM code sees:
       bit 1 == Enable Non-secure
       bit 0 == Enable secure
Non-secure view which HLOS sees:
       bit 0 == Enable Non-secure

Hence on OMAP4460(r2pX) devices, if you go through the
above flow again during CPU1 wakeup, GICD == 3 and hence
ROM code fails to understand the real wakeup power state
and reconfigures GIC distributor to boot values. This is
nasty since you loose the entire interrupt controller
context in a live system.

The ROM code fix done on next OMAP4 device (OMAP4470 - r2px) is to
check "GICD.Enable secure != 1" for GIC restoration in OSWR wakeup path.

Since ROM code can't be fixed on OMAP4460 devices, a work around
needs to be implemented. As evident from the flow, as long as
CPU1 sees GICD == 1 in it's wakeup path from OSWR, the issue
won't happen. Below is the flow with the work-around.

...............................................................
- MPUSS in OSWR state.
- CPU0 wakes up on the event(interrupt) and start executing ROM code.

[..]

- CPU0 executes "GIC Restoration:"

[..]

- CPU0 swicthes to non-secure mode and jumps to OS resume code.

[..]

- CPU0 is online in OS.
- CPU0 does GICD.Enable Non-secure = 0
- CPU0 wakes up CPU1 with clock domain force wakeup method.
- CPU0 waits for GICD.Enable Non-secure = 1
- CPU0 coninues it's execution.
[..]

- CPU1 wakes up and start executing ROM code.

[..]

- CPU1 executes "GIC Restoration:"

[..]

- CPU1 swicthes to non-secure mode and jumps to OS resume code.

[..]

- CPU1 is online in OS
- CPU1 does GICD.Enable Non-secure = 1
- CPU1 start executing
[...]
...............................................................

With this procedure, the GIC configuration done between the
CPU0 wakeup and CPU1 wakeup will not be lost but during this
short windows, the CPU0 will not receive interrupts.

The BUG is applicable to only OMAP4460(r2pX) devices.
OMAP4470 (also r2pX) is not affected by this bug because
ROM code has been fixed.

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
2012-11-05 14:26:43 -08:00
..
boot arm-soc: fixes for v3.7-rc3 2012-10-28 11:12:38 -07:00
common ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
configs ARM: versatile: fix versatile_defconfig 2012-10-27 17:46:56 +02:00
crypto arm/crypto: Add optimized AES and SHA1 routines 2012-09-07 04:17:02 +08:00
include arm-soc: fixes for v3.7-rc3 2012-10-28 11:12:38 -07:00
kernel Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm 2012-10-25 15:59:34 -07:00
lib ARM: export default read_current_timer 2012-10-09 20:24:36 +02:00
mach-at91 ARM: at91: fix at91x40 build 2012-10-27 17:46:48 +02:00
mach-bcm2835 ARM: dtb: move all dtb targets to common Makefile 2012-09-20 22:58:17 -07:00
mach-clps711x ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-cns3xxx ARM: PCI: provide a default bus scan implementation 2012-05-13 17:12:17 +01:00
mach-davinci ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-dove ARM: dove: Add crypto engine to DT 2012-10-17 17:20:01 +00:00
mach-ebsa110 ARM: soc: driver specific changes 2012-10-01 18:46:13 -07:00
mach-ep93xx ARM: soc: multiplatform enablement 2012-10-01 19:11:38 -07:00
mach-exynos ARM: EXYNOS: Set .smp field of machine descriptor for exynos4-dt 2012-10-22 08:16:44 +09:00
mach-footbridge ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-gemini ARM: gemini: fix the gemini build 2012-09-04 22:17:34 -07:00
mach-h720x ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-highbank Merge branch 'for-v3.7' of git://git.linaro.org/people/mszyprowski/linux-dma-mapping 2012-10-02 19:13:12 -07:00
mach-imx Revert "ARM i.MX25: Fix PWM per clock lookups" 2012-10-27 17:46:56 +02:00
mach-integrator ARM: integrator: use __iomem pointers for MMIO, part 2 2012-10-09 17:27:33 +02:00
mach-iop13xx Merge branch 'late/fixes' into fixes 2012-10-07 07:22:32 -07:00
mach-iop32x Merge branch 'cleanup/__iomem' into next/cleanup 2012-09-22 10:24:29 -07:00
mach-iop33x ARM: iop3xx: use fixed PCI i/o mapping 2012-07-26 09:10:04 -05:00
mach-ixp4xx ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-kirkwood ARM: Kirkwood: fix disabling CACHE_FEROCEON_L2 2012-10-18 17:04:24 +00:00
mach-ks8695 Merge branch 'late/fixes' into fixes 2012-10-07 07:22:32 -07:00
mach-l7200/include/mach
mach-lpc32xx ARM: soc: multiplatform enablement 2012-10-01 19:11:38 -07:00
mach-mmp ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-msm ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-mv78xx0 Merge branch 'late/fixes' into fixes 2012-10-07 07:22:32 -07:00
mach-mvebu ARM: mvebu: fix build breaks from multi-platform conversion 2012-09-28 22:27:07 +02:00
mach-mxs ARM: soc: multiplatform enablement 2012-10-01 19:11:38 -07:00
mach-netx ARM: netx: move platform_data definitions 2012-09-14 11:17:36 +02:00
mach-nomadik ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-omap1 ASoC: Fixes for v3.7 2012-10-17 14:09:15 +02:00
mach-omap2 ARM: OMAP4460: Workaround for ROM bug because of CA9 r2pX GIC control register change. 2012-11-05 14:26:43 -08:00
mach-orion5x ARM: soc: late platform updates 2012-10-07 20:55:16 +09:00
mach-picoxcell ARM: initial multiplatform support 2012-09-14 09:22:06 -05:00
mach-prima2 pinctrl: sirf: remove sirfsoc_gpio_set_pull function 2012-10-15 09:09:27 +02:00
mach-pxa ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-realview ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-rpc ARM: rpc: check device_register return code in ecard_probe 2012-10-07 10:33:09 +02:00
mach-s3c24xx Merge branch 'v3.7-samsung-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into fixes 2012-10-26 14:45:06 +02:00
mach-s3c64xx ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-s3c2410
mach-s3c2412 ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-s3c2440 ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-s5p64x0 ARM: SAMSUNG: Add naming of s3c64xx-spi devices 2012-10-17 16:47:32 +09:00
mach-s5pc100 ARM: SAMSUNG: Add naming of s3c64xx-spi devices 2012-10-17 16:47:32 +09:00
mach-s5pv210 ARM: SAMSUNG: Add naming of s3c64xx-spi devices 2012-10-17 16:47:32 +09:00
mach-sa1100 ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-shark Merge branch 'late/fixes' into fixes 2012-10-07 07:22:32 -07:00
mach-shmobile ARM: shmobile: r8a7779: I/O address abuse cleanup 2012-10-19 15:39:38 +09:00
mach-socfpga ARM: initial multiplatform support 2012-09-14 09:22:06 -05:00
mach-spear3xx ARM: move all dtb targets out of Makefile.boot 2012-09-14 09:22:04 -05:00
mach-spear6xx ARM: move all dtb targets out of Makefile.boot 2012-09-14 09:22:04 -05:00
mach-spear13xx ARM: SPEAr: Remove unused empty files 2012-10-25 16:34:18 +02:00
mach-tegra ARM: tegra: add tegra_timer clock 2012-10-16 11:15:05 -06:00
mach-u300 ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-ux500 ARM: ux500: Fix build error relating to IRQCHIP_SKIP_SET_WAKE 2012-10-25 08:43:49 +01:00
mach-versatile ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
mach-vexpress Features: 2012-10-07 07:13:01 +09:00
mach-vt8500 arm: vt8500: Fix build warning in uncompress.h 2012-10-07 14:50:06 -07:00
mach-w90x900 ARM: w90x900: move platform_data definitions 2012-09-14 11:18:59 +02:00
mach-zynq
mm Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm 2012-10-25 15:59:34 -07:00
net ARM: 7421/1: bpf_jit: BPF_S_ANC_ALU_XOR_X support 2012-06-14 15:12:13 +01:00
nwfpe
oprofile ARM: 7448/1: perf: remove arm_perf_pmu_ids global enumeration 2012-07-09 17:41:10 +01:00
plat-iop Bunch of perf updates for the ARM backend that pave the way for 2012-09-04 22:12:41 -07:00
plat-mxc ARM i.MX fixes for 3.7-rc 2012-10-25 15:57:40 +02:00
plat-nomadik ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
plat-omap arm-soc: fixes for v3.7-rc3 2012-10-28 11:12:38 -07:00
plat-orion Merge branch 'samsung_platform_data' into staging/for_v3.7 2012-10-05 22:32:05 -03:00
plat-pxa ARM: pxa: move platform_data definitions 2012-09-14 11:18:10 +02:00
plat-s3c24xx ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
plat-samsung ARM: SAMSUNG: Add naming of s3c64xx-spi devices 2012-10-17 16:47:32 +09:00
plat-spear ARM: config: sort select statements alphanumerically 2012-10-13 17:11:28 +01:00
plat-versatile Merge branch 'for-linus' of git://git.linaro.org/people/rmk/linux-arm 2012-10-07 21:20:57 +09:00
tools ARM: be really quiet when building with 'make -s' 2012-10-09 20:29:05 +02:00
vfp ARM: 7483/1: vfp: only advertise VFPv4 in hwcaps if CONFIG_VFPv3 is enabled 2012-08-11 09:15:57 +01:00
xen xen/arm: use the __HVC macro 2012-10-30 10:41:19 -04:00
Kconfig Merge tag 'fixes-for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc into fixes 2012-10-22 22:56:09 +01:00
Kconfig-nommu
Kconfig.debug ARM: soc: multiplatform enablement 2012-10-01 19:11:38 -07:00
Makefile ARM: pass -marm to gcc by default for both C and assembler 2012-10-09 20:29:05 +02:00