summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2010-05-27 15:54:44 -0700
committerGary King <gking@nvidia.com>2010-05-27 21:40:55 -0700
commitf8d6750d57c63fec8f8980c430522a231ca4c8ef (patch)
tree8c34900cc390d8673dfb516a21dda6dc7fe46832 /arch/arm/mach-tegra
parent3ef10ea5a7707480519eb04b6602e38f2d006b36 (diff)
[ARM/tegra] suspend: remove literals from CPU save & restore code
use the ARMv7 movw and movt instructions to load literal values, rather than allowing the compiler to silently generate literal sections all over memory since this code needs to be relocatable (may run with no MMU, may run with MMU, may run in IRAM), the fewer literals, the better Change-Id: I06c3e1b607649946273a9b8cb87008bbec3bc4ae
Diffstat (limited to 'arch/arm/mach-tegra')
-rw-r--r--arch/arm/mach-tegra/cortex_a9_save.S30
-rw-r--r--arch/arm/mach-tegra/headsmp.S28
-rw-r--r--arch/arm/mach-tegra/power-macros.S6
3 files changed, 36 insertions, 28 deletions
diff --git a/arch/arm/mach-tegra/cortex_a9_save.S b/arch/arm/mach-tegra/cortex_a9_save.S
index 9eab4bd550b0..791856e5e8db 100644
--- a/arch/arm/mach-tegra/cortex_a9_save.S
+++ b/arch/arm/mach-tegra/cortex_a9_save.S
@@ -482,7 +482,7 @@ __tear_down_master:
* preserve the data in the L2, the control words (L2X0_CTRL,
* L2X0_AUX_CTRL, etc.) need to be cleaned to L3 so that they
* will be visible on reboot */
- ldr r0, =(TEGRA_ARM_PL310_BASE-IO_CPU_PHYS+IO_CPU_VIRT)
+ mov32 r0, (TEGRA_ARM_PL310_BASE-IO_CPU_PHYS+IO_CPU_VIRT)
add r3, r8, #(CONTEXT_SIZE_WORDS*4)
bic r8, r8, #0x1f
add r3, r3, #0x1f
@@ -508,14 +508,16 @@ __tear_down_master:
* LP0 / LP1 use physical address, since the MMU needs to be
* disabled before putting SDRAM into self-refresh to avoid
* memory access due to page table walks */
- ldreq r4, =(TEGRA_PMC_BASE-IO_APB_PHYS+IO_APB_VIRT)
- ldreq r5, =(TEGRA_CLK_RESET_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
- ldreq r6, =(TEGRA_FLOW_CTRL_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
- ldreq r7, =(TEGRA_TMRUS_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
- ldrne r4, =(TEGRA_PMC_BASE)
- ldrne r5, =(TEGRA_CLK_RESET_BASE)
- ldrne r6, =(TEGRA_FLOW_CTRL_BASE)
- ldrne r7, =(TEGRA_TMRUS_BASE)
+ mov32 r0, (IO_APB_VIRT-IO_APB_PHYS)
+ mov32 r4, TEGRA_PMC_BASE
+ addeq r4, r4, r0
+ mov32 r0, (IO_PPSB_VIRT-IO_PPSB_PHYS)
+ mov32 r5, TEGRA_CLK_RESET_BASE
+ mov32 r6, TEGRA_FLOW_CTRL_BASE
+ mov32 r7, TEGRA_TMRUS_BASE
+ addeq r5, r5, r0
+ addeq r6, r6, r0
+ addeq r7, r7, r0
beq __tear_down_master_pll_cpu
@@ -530,7 +532,7 @@ __tear_down_master:
isb
mcr p15, 0, r3, c2, c0, 0 @ TTB 0
isb
- ldrne r3, =(IO_IRAM_PHYS) @ __tear_down_master_sdram, in IRAM
+ mov32 r3, (IO_IRAM_PHYS) @ __tear_down_master_sdram, in IRAM
movne pc, r3
ENDPROC(__tear_down_master)
.type __tear_down_master_data, %object
@@ -543,7 +545,7 @@ __tear_down_master_data:
__tear_down_master_sdram:
mrc p15, 0, r3, c1, c0, 0
bic r3, r3, #(1<<0)
- mcr p15, 0, r3, c1, c0, 0 @ disable MMU
+ mcr p15, 0, r3, c1, c0, 0 @ disable MMU to prevent page misses
/* FIXME: save off DDR pad settings, put SDRAM in self refresh,
* jump to tear_down_master_pll_cpu */
b .
@@ -625,14 +627,14 @@ __put_cpu_in_reset:
movne r1, r1, lsl #3
addne r1, r1, #0x14
moveq r1, #0 @ r1 = CPUx_HALT_EVENTS register offset
- ldr r7, =(TEGRA_FLOW_CTRL_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
+ mov32 r7, (TEGRA_FLOW_CTRL_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
mov r2, #(0x2<<29)
str r2, [r7, r1] @ put flow controller in wait event mode
isb
dsb
- ldr r1, =0x1011
+ movw r1, 0x1011
mov r1, r1, lsl r0
- ldr r7, =(TEGRA_CLK_RESET_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
+ mov32 r7, (TEGRA_CLK_RESET_BASE-IO_PPSB_PHYS+IO_PPSB_VIRT)
str r1, [r7, #0x340] @ put slave CPU in reset
isb
dsb
diff --git a/arch/arm/mach-tegra/headsmp.S b/arch/arm/mach-tegra/headsmp.S
index 843b1108f386..d99404b67f5f 100644
--- a/arch/arm/mach-tegra/headsmp.S
+++ b/arch/arm/mach-tegra/headsmp.S
@@ -61,10 +61,10 @@ __invalidate_l1:
mcr p15, 2, r0, c0, c0, 0
mrc p15, 1, r0, c0, c0, 0
- ldr r1, =0x7fff
+ movw r1, #0x7fff
and r2, r1, r0, lsr #13
- ldr r1, =0x3ff
+ movw r1, #0x3ff
and r3, r1, r0, lsr #3 @ NumWays - 1
add r2, r2, #1 @ NumSets
@@ -110,7 +110,7 @@ __invalidate_cpu_state:
cpu_id r0
cmp r0, #0
- ldrne r1, =(TEGRA_ARM_PERIF_BASE + 0xC)
+ mov32 r1, (TEGRA_ARM_PERIF_BASE + 0xC)
movne r0, r0, lsl #2
movne r2, #0xf
movne r2, r2, lsl r0
@@ -159,14 +159,14 @@ __return_to_virtual:
mov r0, #0x1f
mcr p15, 0, r0, c3, c0, 0 @ domain access register
- ldr r0, =0xff0a81a8
- ldr r1, =0x40e040e0
+ mov32 r0, 0xff0a89a8
+ mov32 r1, 0x40e044e0
mcr p15, 0, r0, c10, c2, 0 @ PRRR
mcr p15, 0, r1, c10, c2, 1 @ NMRR
mrc p15, 0, r0, c1, c0, 0
- ldr r1, =0x0120c302
+ mov32 r1, 0x0120c302
bic r0, r0, r1
- ldr r1, =0x10c03c7d
+ mov32 r1, 0x10c03c7d
orr r0, r0, r1
#ifdef CONFIG_ALIGNMENT_TRAP
@@ -236,8 +236,8 @@ ENDPROC(__restart_pllx)
*/
.align L1_CACHE_SHIFT
__enable_coresite_access:
- ldr r0, =(TEGRA_CLK_RESET_BASE + RST_DEVICES_U)
- ldr r2, =(TEGRA_TMRUS_BASE)
+ mov32 r0, (TEGRA_CLK_RESET_BASE + RST_DEVICES_U)
+ mov32 r2, (TEGRA_TMRUS_BASE)
/* assert reset for 2usec */
ldr r1, [r0]
@@ -246,8 +246,8 @@ __enable_coresite_access:
wait_for_us r3, r2, r4
add r3, r3, #2
bic r1, r1, #(1<<9)
- ldr r5, =0xC5ACCE55
- ldr r6, =(TEGRA_CSITE_BASE + 0x10fb0) @ CPUDBG0_LAR
+ mov32 r5, 0xC5ACCE55
+ mov32 r6, (TEGRA_CSITE_BASE + 0x10fb0) @ CPUDBG0_LAR
mov r7, #CONFIG_NR_CPUS
wait_until r3, r2, r4
str r1, [r0]
@@ -268,9 +268,9 @@ ENDPROC(__enable_coresite_access)
ENTRY(tegra_lp2_startup)
setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9
- ldr r0, =TEGRA_TMRUS_BASE
+ mov32 r0, TEGRA_TMRUS_BASE
ldr r1, [r0]
- ldr r0, =TEGRA_PMC_BASE
+ mov32 r0, TEGRA_PMC_BASE
str r1, [r0, #PMC_SCRATCH39] @ save off exact lp2 exit time
mov r1, #0
str r1, [r0, #PMC_DPD_SAMPLE]
@@ -284,7 +284,7 @@ ENTRY(tegra_lp2_startup)
mcr p15, 0, r0, c1, c0, 1
/* enable SCU */
- ldr r0, =TEGRA_ARM_PERIF_BASE
+ mov32 r0, TEGRA_ARM_PERIF_BASE
ldr r1, [r0]
orr r1, r1, #1
str r1, [r0]
diff --git a/arch/arm/mach-tegra/power-macros.S b/arch/arm/mach-tegra/power-macros.S
index 492416439760..9692de40bc6f 100644
--- a/arch/arm/mach-tegra/power-macros.S
+++ b/arch/arm/mach-tegra/power-macros.S
@@ -26,6 +26,12 @@
and \rd, \rd, #0xF
.endm
+
+.macro mov32, reg, val
+ movw \reg, #:lower16:\val
+ movt \reg, #:upper16:\val
+.endm
+
/* waits until the microsecond counter (base) ticks, for exact timing loops */
.macro wait_for_us, rd, base, tmp
ldr \rd, [\base]