123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #include <linux/linkage.h>
- #include <linux/threads.h>
- #include <asm/asm-offsets.h>
- #include <asm/assembler.h>
- #include <asm/glue-cache.h>
- #include <asm/glue-proc.h>
- .text
- .macro compute_mpidr_hash dst, rs0, rs1, rs2, mpidr, mask
- and \mpidr, \mpidr, \mask
- and \dst, \mpidr, #0xff
- ARM( mov \dst, \dst, lsr \rs0 )
- THUMB( lsr \dst, \dst, \rs0 )
- and \mask, \mpidr, #0xff00
- ARM( orr \dst, \dst, \mask, lsr \rs1 )
- THUMB( lsr \mask, \mask, \rs1 )
- THUMB( orr \dst, \dst, \mask )
- and \mask, \mpidr, #0xff0000
- ARM( orr \dst, \dst, \mask, lsr \rs2 )
- THUMB( lsr \mask, \mask, \rs2 )
- THUMB( orr \dst, \dst, \mask )
- .endm
- ENTRY(__cpu_suspend)
- stmfd sp!, {r4 - r11, lr}
- #ifdef MULTI_CPU
- ldr r10, =processor
- ldr r4, [r10, #CPU_SLEEP_SIZE]
- #else
- ldr r4, =cpu_suspend_size
- #endif
- mov r5, sp
- add r4, r4, #12
- sub sp, sp, r4
- ldr r3, =sleep_save_sp
- stmfd sp!, {r0, r1}
- ldr r3, [r3, #SLEEP_SAVE_SP_VIRT]
- ALT_SMP(ldr r0, =mpidr_hash)
- ALT_UP_B(1f)
-
- ldmia r0, {r1, r6-r8}
- compute_mpidr_hash r0, r6, r7, r8, r2, r1
- add r3, r3, r0, lsl #2
- 1: mov r2, r5
- mov r1, r4
- add r0, sp, #8
- bl __cpu_suspend_save
- badr lr, cpu_suspend_abort
- ldmfd sp!, {r0, pc}
- ENDPROC(__cpu_suspend)
- .ltorg
- cpu_suspend_abort:
- ldmia sp!, {r1 - r3}
- teq r0, #0
- moveq r0, #1
- mov sp, r2
- ldmfd sp!, {r4 - r11, pc}
- ENDPROC(cpu_suspend_abort)
- .align 5
- .pushsection .idmap.text,"ax"
- ENTRY(cpu_resume_mmu)
- ldr r3, =cpu_resume_after_mmu
- instr_sync
- mcr p15, 0, r0, c1, c0, 0
- mrc p15, 0, r0, c0, c0, 0
- instr_sync
- mov r0, r0
- mov r0, r0
- ret r3
- ENDPROC(cpu_resume_mmu)
- .popsection
- cpu_resume_after_mmu:
- bl cpu_init
- mov r0, #0
- ldmfd sp!, {r4 - r11, pc}
- ENDPROC(cpu_resume_after_mmu)
- .text
- .align
- #ifdef CONFIG_MMU
- .arm
- ENTRY(cpu_resume_arm)
- THUMB( badr r9, 1f )
- THUMB( bx r9 )
- THUMB( .thumb )
- THUMB(1: )
- #endif
- ENTRY(cpu_resume)
- ARM_BE8(setend be)
- #ifdef CONFIG_ARM_VIRT_EXT
- bl __hyp_stub_install_secondary
- #endif
- safe_svcmode_maskall r1
- mov r1, #0
- ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
- ALT_UP_B(1f)
- adr r2, mpidr_hash_ptr
- ldr r3, [r2]
- add r2, r2, r3
-
- ldmia r2, { r3-r6 }
- compute_mpidr_hash r1, r4, r5, r6, r0, r3
- 1:
- adr r0, _sleep_save_sp
- ldr r2, [r0]
- add r0, r0, r2
- ldr r0, [r0, #SLEEP_SAVE_SP_PHYS]
- ldr r0, [r0, r1, lsl #2]
-
- ARM( ldmia r0!, {r1, sp, pc} )
- THUMB( ldmia r0!, {r1, r2, r3} )
- THUMB( mov sp, r2 )
- THUMB( bx r3 )
- ENDPROC(cpu_resume)
- #ifdef CONFIG_MMU
- ENDPROC(cpu_resume_arm)
- #endif
- .align 2
- _sleep_save_sp:
- .long sleep_save_sp - .
- mpidr_hash_ptr:
- .long mpidr_hash - .
- .data
- .type sleep_save_sp, #object
- ENTRY(sleep_save_sp)
- .space SLEEP_SAVE_SP_SZ
|