Skip to content

Commit 08a1e65

Browse files
ozbenhmpe
authored andcommitted
powerpc: Fixup LPCR:PECE and HEIC setting on POWER9
We need to set LPES in order for normal external interrupts (0x500) to be directed to the guest while running in guest state. We also need HEIC set to prevent them to be sent to the host while in host state. With XIVE the host never gets one of these and wouldn't know how to handle it. All host external interrupts come in via the new hypervisor virtualization interrupts vector. Signed-off-by: Benjamin Herrenschmidt <[email protected]> Signed-off-by: Michael Ellerman <[email protected]>
1 parent d381d7c commit 08a1e65

File tree

2 files changed

+11
-5
lines changed

2 files changed

+11
-5
lines changed

arch/powerpc/include/asm/reg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,7 @@
365365
#define LPCR_MER_SH 11
366366
#define LPCR_GTSE ASM_CONST(0x0000000000000400) /* Guest Translation Shootdown Enable */
367367
#define LPCR_TC ASM_CONST(0x0000000000000200) /* Translation control */
368+
#define LPCR_HEIC ASM_CONST(0x0000000000000010) /* Hypervisor External Interrupt Control */
368369
#define LPCR_LPES 0x0000000c
369370
#define LPCR_LPES0 ASM_CONST(0x0000000000000008) /* LPAR Env selector 0 */
370371
#define LPCR_LPES1 ASM_CONST(0x0000000000000004) /* LPAR Env selector 1 */

arch/powerpc/kernel/cpu_setup_power.S

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ _GLOBAL(__setup_cpu_power7)
2929
li r0,0
3030
mtspr SPRN_LPID,r0
3131
mfspr r3,SPRN_LPCR
32+
li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
3233
bl __init_LPCR
3334
bl __init_tlb_power7
3435
mtlr r11
@@ -42,6 +43,7 @@ _GLOBAL(__restore_cpu_power7)
4243
li r0,0
4344
mtspr SPRN_LPID,r0
4445
mfspr r3,SPRN_LPCR
46+
li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
4547
bl __init_LPCR
4648
bl __init_tlb_power7
4749
mtlr r11
@@ -59,6 +61,7 @@ _GLOBAL(__setup_cpu_power8)
5961
mtspr SPRN_LPID,r0
6062
mfspr r3,SPRN_LPCR
6163
ori r3, r3, LPCR_PECEDH
64+
li r4,0 /* LPES = 0 */
6265
bl __init_LPCR
6366
bl __init_HFSCR
6467
bl __init_tlb_power8
@@ -80,6 +83,7 @@ _GLOBAL(__restore_cpu_power8)
8083
mtspr SPRN_LPID,r0
8184
mfspr r3,SPRN_LPCR
8285
ori r3, r3, LPCR_PECEDH
86+
li r4,0 /* LPES = 0 */
8387
bl __init_LPCR
8488
bl __init_HFSCR
8589
bl __init_tlb_power8
@@ -99,10 +103,11 @@ _GLOBAL(__setup_cpu_power9)
99103
mtspr SPRN_PSSCR,r0
100104
mtspr SPRN_LPID,r0
101105
mfspr r3,SPRN_LPCR
102-
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
106+
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
103107
or r3, r3, r4
104108
LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
105109
andc r3, r3, r4
110+
li r4,(LPCR_LPES0 >> LPCR_LPES_SH)
106111
bl __init_LPCR
107112
bl __init_HFSCR
108113
bl __init_tlb_power9
@@ -122,10 +127,11 @@ _GLOBAL(__restore_cpu_power9)
122127
mtspr SPRN_PSSCR,r0
123128
mtspr SPRN_LPID,r0
124129
mfspr r3,SPRN_LPCR
125-
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
130+
LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
126131
or r3, r3, r4
127132
LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
128133
andc r3, r3, r4
134+
li r4,(LPCR_LPES0 >> LPCR_LPES_SH)
129135
bl __init_LPCR
130136
bl __init_HFSCR
131137
bl __init_tlb_power9
@@ -146,7 +152,7 @@ __init_hvmode_206:
146152

147153
__init_LPCR:
148154
/* Setup a sane LPCR:
149-
* Called with initial LPCR in R3
155+
* Called with initial LPCR in R3 and desired LPES 2-bit value in R4
150156
*
151157
* LPES = 0b01 (HSRR0/1 used for 0x500)
152158
* PECE = 0b111
@@ -157,8 +163,7 @@ __init_LPCR:
157163
*
158164
* Other bits untouched for now
159165
*/
160-
li r5,1
161-
rldimi r3,r5, LPCR_LPES_SH, 64-LPCR_LPES_SH-2
166+
rldimi r3,r4, LPCR_LPES_SH, 64-LPCR_LPES_SH-2
162167
ori r3,r3,(LPCR_PECE0|LPCR_PECE1|LPCR_PECE2)
163168
li r5,4
164169
rldimi r3,r5, LPCR_DPFD_SH, 64-LPCR_DPFD_SH-3

0 commit comments

Comments
 (0)