1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Copyright (C) 2012 Freescale Semiconductor, Inc. |
4 | */ |
5 | |
6 | #include <linux/export.h> |
7 | #include <linux/threads.h> |
8 | #include <asm/epapr_hcalls.h> |
9 | #include <asm/reg.h> |
10 | #include <asm/page.h> |
11 | #include <asm/cputable.h> |
12 | #include <asm/thread_info.h> |
13 | #include <asm/ppc_asm.h> |
14 | #include <asm/asm-compat.h> |
15 | #include <asm/asm-offsets.h> |
16 | |
17 | #ifndef CONFIG_PPC64 |
18 | /* epapr_ev_idle() was derived from e500_idle() */ |
19 | _GLOBAL(epapr_ev_idle) |
20 | PPC_LL r4, TI_LOCAL_FLAGS(r2) /* set napping bit */ |
21 | ori r4, r4,_TLF_NAPPING /* so when we take an exception */ |
22 | PPC_STL r4, TI_LOCAL_FLAGS(r2) /* it will return to our caller */ |
23 | |
24 | #ifdef CONFIG_BOOKE_OR_40x |
25 | wrteei 1 |
26 | #else |
27 | mfmsr r4 |
28 | ori r4, r4, MSR_EE |
29 | mtmsr r4 |
30 | #endif |
31 | |
32 | idle_loop: |
33 | LOAD_REG_IMMEDIATE(r11, EV_HCALL_TOKEN(EV_IDLE)) |
34 | |
35 | .global epapr_ev_idle_start |
36 | epapr_ev_idle_start: |
37 | li r3, -1 |
38 | nop |
39 | nop |
40 | nop |
41 | |
42 | /* |
43 | * Guard against spurious wakeups from a hypervisor -- |
44 | * only interrupt will cause us to return to LR due to |
45 | * _TLF_NAPPING. |
46 | */ |
47 | b idle_loop |
48 | #endif |
49 | |
50 | /* Hypercall entry point. Will be patched with device tree instructions. */ |
51 | .global epapr_hypercall_start |
52 | epapr_hypercall_start: |
53 | li r3, -1 |
54 | nop |
55 | nop |
56 | nop |
57 | blr |
58 | EXPORT_SYMBOL(epapr_hypercall_start) |
59 | |