blob: 3239a9fe6c1cf90c43033ece68c1e317053c735d [file] [log] [blame]
Thomas Gleixner2874c5f2019-05-27 08:55:01 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +11002/*
3 * This file contains low level CPU setup functions.
4 * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +11005 */
6
7#include <asm/processor.h>
8#include <asm/page.h>
9#include <asm/cputable.h>
10#include <asm/ppc_asm.h>
11#include <asm/asm-offsets.h>
12#include <asm/cache.h>
Aneesh Kumar K.Vf64e8082016-03-01 12:59:20 +053013#include <asm/book3s/64/mmu-hash.h>
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110014
15/* Entry: r3 = crap, r4 = ptr to cputable entry
16 *
17 * Note that we can be called twice for pseudo-PVRs
18 */
19_GLOBAL(__setup_cpu_power7)
20 mflr r11
21 bl __init_hvmode_206
22 mtlr r11
23 beqlr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +110024 li r0,0
25 mtspr SPRN_LPID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +100026 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110027 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +100028 li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
Nicholas Piggin700b7ead2017-04-19 05:12:17 +100029 bl __init_LPCR_ISA206
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110030 mtlr r11
31 blr
32
33_GLOBAL(__restore_cpu_power7)
34 mflr r11
35 mfmsr r3
36 rldicl. r0,r3,4,63
37 beqlr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +110038 li r0,0
39 mtspr SPRN_LPID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +100040 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110041 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +100042 li r4,(LPCR_LPES1 >> LPCR_LPES_SH)
Nicholas Piggin700b7ead2017-04-19 05:12:17 +100043 bl __init_LPCR_ISA206
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110044 mtlr r11
45 blr
46
Michael Neulingaec937b2012-10-30 19:34:14 +000047_GLOBAL(__setup_cpu_power8)
48 mflr r11
Michael Neuling57d23162013-03-04 19:45:50 +000049 bl __init_FSCR
Michael Ellerman240686c2013-04-25 19:28:22 +000050 bl __init_PMU
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053051 bl __init_PMU_ISA207
Michael Neulingaec937b2012-10-30 19:34:14 +000052 bl __init_hvmode_206
53 mtlr r11
54 beqlr
55 li r0,0
56 mtspr SPRN_LPID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +100057 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110058 mfspr r3,SPRN_LPCR
Michael Neulingd4e58e52014-06-11 15:59:28 +100059 ori r3, r3, LPCR_PECEDH
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +100060 li r4,0 /* LPES = 0 */
Nicholas Piggin700b7ead2017-04-19 05:12:17 +100061 bl __init_LPCR_ISA206
Michael Neuling2a3563b2013-03-05 17:35:24 +000062 bl __init_HFSCR
Michael Ellerman240686c2013-04-25 19:28:22 +000063 bl __init_PMU_HV
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053064 bl __init_PMU_HV_ISA207
Michael Neulingaec937b2012-10-30 19:34:14 +000065 mtlr r11
66 blr
67
68_GLOBAL(__restore_cpu_power8)
69 mflr r11
Michael Neuling57d23162013-03-04 19:45:50 +000070 bl __init_FSCR
Michael Ellerman240686c2013-04-25 19:28:22 +000071 bl __init_PMU
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053072 bl __init_PMU_ISA207
73 mfmsr r3
74 rldicl. r0,r3,4,63
75 mtlr r11
76 beqlr
77 li r0,0
78 mtspr SPRN_LPID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +100079 mtspr SPRN_PCR,r0
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053080 mfspr r3,SPRN_LPCR
81 ori r3, r3, LPCR_PECEDH
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +100082 li r4,0 /* LPES = 0 */
Nicholas Piggin700b7ead2017-04-19 05:12:17 +100083 bl __init_LPCR_ISA206
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053084 bl __init_HFSCR
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053085 bl __init_PMU_HV
86 bl __init_PMU_HV_ISA207
87 mtlr r11
88 blr
89
90_GLOBAL(__setup_cpu_power9)
91 mflr r11
92 bl __init_FSCR
93 bl __init_PMU
94 bl __init_hvmode_206
95 mtlr r11
96 beqlr
97 li r0,0
Gautham R. Shenoy378f96d2016-11-22 23:36:40 +053098 mtspr SPRN_PSSCR,r0
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053099 mtspr SPRN_LPID,r0
Nicholas Piggin371b80442017-12-06 18:21:14 +1000100 mtspr SPRN_PID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +1000101 mtspr SPRN_PCR,r0
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530102 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +1000103 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
Benjamin Herrenschmidt7a439062016-11-21 18:08:05 +1100104 or r3, r3, r4
Aneesh Kumar K.Vfda2d272017-02-22 10:42:02 +0530105 LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
106 andc r3, r3, r4
Nicholas Piggin8d1b48e2017-04-19 05:12:16 +1000107 li r4,0 /* LPES = 0 */
Nicholas Piggin700b7ead2017-04-19 05:12:17 +1000108 bl __init_LPCR_ISA300
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530109 bl __init_HFSCR
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530110 bl __init_PMU_HV
111 mtlr r11
112 blr
113
114_GLOBAL(__restore_cpu_power9)
115 mflr r11
116 bl __init_FSCR
117 bl __init_PMU
Michael Neulingaec937b2012-10-30 19:34:14 +0000118 mfmsr r3
119 rldicl. r0,r3,4,63
Michael Neuling8c2a3812013-04-24 21:00:37 +0000120 mtlr r11
Michael Neulingaec937b2012-10-30 19:34:14 +0000121 beqlr
122 li r0,0
Gautham R. Shenoy378f96d2016-11-22 23:36:40 +0530123 mtspr SPRN_PSSCR,r0
Michael Neulingaec937b2012-10-30 19:34:14 +0000124 mtspr SPRN_LPID,r0
Nicholas Piggin371b80442017-12-06 18:21:14 +1000125 mtspr SPRN_PID,r0
Michael Neulingfaf37c42018-05-18 11:37:42 +1000126 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +1100127 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +1000128 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE | LPCR_HEIC)
Benjamin Herrenschmidt7a439062016-11-21 18:08:05 +1100129 or r3, r3, r4
Aneesh Kumar K.Vfda2d272017-02-22 10:42:02 +0530130 LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
131 andc r3, r3, r4
Nicholas Piggin8d1b48e2017-04-19 05:12:16 +1000132 li r4,0 /* LPES = 0 */
Nicholas Piggin700b7ead2017-04-19 05:12:17 +1000133 bl __init_LPCR_ISA300
Michael Neuling2a3563b2013-03-05 17:35:24 +0000134 bl __init_HFSCR
Michael Ellerman240686c2013-04-25 19:28:22 +0000135 bl __init_PMU_HV
Michael Neulingaec937b2012-10-30 19:34:14 +0000136 mtlr r11
137 blr
138
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100139__init_hvmode_206:
Paul Mackerras969391c2011-06-29 00:26:11 +0000140 /* Disable CPU_FTR_HVMODE and exit if MSR:HV is not set */
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100141 mfmsr r3
142 rldicl. r0,r3,4,63
143 bnelr
144 ld r5,CPU_SPEC_FEATURES(r4)
Paul Mackerrase7b17d52018-10-08 16:30:47 +1100145 LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE | CPU_FTR_P9_TM_HV_ASSIST)
146 andc r5,r5,r6
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100147 std r5,CPU_SPEC_FEATURES(r4)
148 blr
149
Nicholas Piggin700b7ead2017-04-19 05:12:17 +1000150__init_LPCR_ISA206:
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100151 /* Setup a sane LPCR:
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +1000152 * Called with initial LPCR in R3 and desired LPES 2-bit value in R4
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100153 *
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000154 * LPES = 0b01 (HSRR0/1 used for 0x500)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100155 * PECE = 0b111
Benjamin Herrenschmidt895796a2011-01-24 13:25:55 +1100156 * DPFD = 4
Paul Mackerras923c53c2011-06-29 00:20:24 +0000157 * HDICE = 0
158 * VC = 0b100 (VPM0=1, VPM1=0, ISL=0)
159 * VRMASD = 0b10000 (L=1, LP=00)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100160 *
161 * Other bits untouched for now
162 */
Nicholas Piggin700b7ead2017-04-19 05:12:17 +1000163 li r5,0x10
164 rldimi r3,r5, LPCR_VRMASD_SH, 64-LPCR_VRMASD_SH-5
165
166 /* POWER9 has no VRMASD */
167__init_LPCR_ISA300:
Benjamin Herrenschmidt08a1e652017-04-05 17:54:55 +1000168 rldimi r3,r4, LPCR_LPES_SH, 64-LPCR_LPES_SH-2
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100169 ori r3,r3,(LPCR_PECE0|LPCR_PECE1|LPCR_PECE2)
Benjamin Herrenschmidt895796a2011-01-24 13:25:55 +1100170 li r5,4
Paul Mackerras923c53c2011-06-29 00:20:24 +0000171 rldimi r3,r5, LPCR_DPFD_SH, 64-LPCR_DPFD_SH-3
172 clrrdi r3,r3,1 /* clear HDICE */
173 li r5,4
174 rldimi r3,r5, LPCR_VC_SH, 0
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100175 mtspr SPRN_LPCR,r3
176 isync
177 blr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +1100178
Ian Munsie2468dcf2013-02-07 15:46:58 +0000179__init_FSCR:
180 mfspr r3,SPRN_FSCR
Michael Neuling1ddf4992013-04-30 20:17:03 +0000181 ori r3,r3,FSCR_TAR|FSCR_DSCR|FSCR_EBB
Ian Munsie2468dcf2013-02-07 15:46:58 +0000182 mtspr SPRN_FSCR,r3
183 blr
184
Michael Neuling2a3563b2013-03-05 17:35:24 +0000185__init_HFSCR:
186 mfspr r3,SPRN_HFSCR
Anshuman Khandual53b56ca2013-04-25 20:54:55 +0000187 ori r3,r3,HFSCR_TAR|HFSCR_TM|HFSCR_BHRB|HFSCR_PM|\
Michael Neuling02ed21a2016-11-23 10:44:09 +1100188 HFSCR_DSCR|HFSCR_VECVSX|HFSCR_FP|HFSCR_EBB|HFSCR_MSGP
Michael Neuling2a3563b2013-03-05 17:35:24 +0000189 mtspr SPRN_HFSCR,r3
190 blr
191
Michael Ellerman240686c2013-04-25 19:28:22 +0000192__init_PMU_HV:
193 li r5,0
194 mtspr SPRN_MMCRC,r5
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530195 blr
196
197__init_PMU_HV_ISA207:
198 li r5,0
Michael Ellerman240686c2013-04-25 19:28:22 +0000199 mtspr SPRN_MMCRH,r5
200 blr
201
202__init_PMU:
203 li r5,0
Michael Ellerman240686c2013-04-25 19:28:22 +0000204 mtspr SPRN_MMCRA,r5
205 mtspr SPRN_MMCR0,r5
206 mtspr SPRN_MMCR1,r5
207 mtspr SPRN_MMCR2,r5
208 blr
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530209
210__init_PMU_ISA207:
211 li r5,0
212 mtspr SPRN_MMCRS,r5
213 blr