summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorChenhui Zhao <chenhui.zhao@freescale.com>2014-04-29 09:27:51 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-04-30 12:49:49 (GMT)
commitf545f6ba27c0e36c6a81a4ed003247dac938cc75 (patch)
tree070395c2495c6c08ae3177cbfe9f2086e01ba041 /arch
parentb60a25ed3b3a01a450bc4d6711025620a1a9e842 (diff)
downloadlinux-fsl-qoriq-f545f6ba27c0e36c6a81a4ed003247dac938cc75.tar.xz
powerpc/t104x: fix deep sleep resume problem in 32-bit mode
Kernel in 32-bit mode can not resume to the command shell after waking from deep sleep. Changes: * change fsl_booke_entry_mapping.S to make it work under deep sleep context * fix bugs in sleep.S Change-Id: Ic5186267ae82d12165029093b49c257bba3a3cc1 Signed-off-by: Chenhui Zhao <chenhui.zhao@freescale.com> Reviewed-on: http://git.am.freescale.net:8181/11665 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Yang Li <LeoLi@freescale.com> Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/fsl_booke_entry_mapping.S10
-rw-r--r--arch/powerpc/platforms/85xx/sleep.S14
2 files changed, 19 insertions, 5 deletions
diff --git a/arch/powerpc/kernel/fsl_booke_entry_mapping.S b/arch/powerpc/kernel/fsl_booke_entry_mapping.S
index 3a8e2d8..e988a40 100644
--- a/arch/powerpc/kernel/fsl_booke_entry_mapping.S
+++ b/arch/powerpc/kernel/fsl_booke_entry_mapping.S
@@ -183,6 +183,10 @@ skpinv: addi r6,r6,1 /* Increment */
lis r6,MAS2_VAL(PAGE_OFFSET, BOOK3E_PAGESZ_64M, M_IF_SMP)@h
ori r6,r6,MAS2_VAL(PAGE_OFFSET, BOOK3E_PAGESZ_64M, M_IF_SMP)@l
mtspr SPRN_MAS2,r6
+#ifdef ENTRY_DEEPSLEEP_SETUP
+ LOAD_REG_IMMEDIATE(r8, MEMORY_START)
+ ori r8,r8,(MAS3_SX|MAS3_SW|MAS3_SR)
+#endif
mtspr SPRN_MAS3,r8
tlbwe
@@ -223,12 +227,18 @@ next_tlb_setup:
#error You need to specify the mapping or not use this at all.
#endif
+#ifdef ENTRY_DEEPSLEEP_SETUP
+ LOAD_REG_ADDR(r6, 2f)
+ mfmsr r7
+ rlwinm r7,r7,0,~(MSR_IS|MSR_DS)
+#else
lis r7,MSR_KERNEL@h
ori r7,r7,MSR_KERNEL@l
bl 1f /* Find our address */
1: mflr r9
rlwimi r6,r9,0,20,31
addi r6,r6,(2f - 1b)
+#endif
mtspr SPRN_SRR0,r6
mtspr SPRN_SRR1,r7
rfi /* start execution out of TLB1[0] entry */
diff --git a/arch/powerpc/platforms/85xx/sleep.S b/arch/powerpc/platforms/85xx/sleep.S
index cf4da3c..9c7c0f3 100644
--- a/arch/powerpc/platforms/85xx/sleep.S
+++ b/arch/powerpc/platforms/85xx/sleep.S
@@ -1071,8 +1071,10 @@ _GLOBAL(fsl_booke_deep_sleep_resume)
/* disable interrupts */
FSL_DIS_ALL_IRQ
+#define ENTRY_DEEPSLEEP_SETUP
#define ENTRY_MAPPING_BOOT_SETUP
#include <../../kernel/fsl_booke_entry_mapping.S>
+#undef ENTRY_DEEPSLEEP_SETUP
#undef ENTRY_MAPPING_BOOT_SETUP
li r3, 0
@@ -1083,10 +1085,10 @@ _GLOBAL(fsl_booke_deep_sleep_resume)
LOAD_REG_ADDR(r3, tlbcam_index)
lwz r3, 0(r3)
mtctr r3
- li r0, 0
-3: mr r3, r0
+ li r9, 0
+3: mr r3, r9
bl loadcam_entry
- addi r0, r0, 1
+ addi r9, r9, 1
bdnz 3b
/* restore cpu registers */
@@ -1095,9 +1097,11 @@ _GLOBAL(fsl_booke_deep_sleep_resume)
/* restore return address */
LOAD_REG_ADDR(r3, buf_tmp)
- ld r4, 0(r3)
+ lwz r4, 16(r3)
+ mtspr SPRN_TCR, r4
+ lwz r4, 0(r3)
mtlr r4
- ld r4, 8(r3)
+ lwz r4, 8(r3)
mtmsr r4
blr