blob: ff45d007d19568d08d3b4eaba0ab863e406cfd5d [file] [log] [blame]
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +11001/*
2 * This file contains low level CPU setup functions.
3 * Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version.
9 *
10 */
11
12#include <asm/processor.h>
13#include <asm/page.h>
14#include <asm/cputable.h>
15#include <asm/ppc_asm.h>
16#include <asm/asm-offsets.h>
17#include <asm/cache.h>
Aneesh Kumar K.Vf64e8082016-03-01 12:59:20 +053018#include <asm/book3s/64/mmu-hash.h>
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110019
20/* Entry: r3 = crap, r4 = ptr to cputable entry
21 *
22 * Note that we can be called twice for pseudo-PVRs
23 */
24_GLOBAL(__setup_cpu_power7)
25 mflr r11
26 bl __init_hvmode_206
27 mtlr r11
28 beqlr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +110029 li r0,0
30 mtspr SPRN_LPID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +100031 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110032 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110033 bl __init_LPCR
Mahesh Salgaonkar04407052013-10-30 20:04:56 +053034 bl __init_tlb_power7
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110035 mtlr r11
36 blr
37
38_GLOBAL(__restore_cpu_power7)
39 mflr r11
40 mfmsr r3
41 rldicl. r0,r3,4,63
42 beqlr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +110043 li r0,0
44 mtspr SPRN_LPID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +100045 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110046 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110047 bl __init_LPCR
Mahesh Salgaonkar04407052013-10-30 20:04:56 +053048 bl __init_tlb_power7
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +110049 mtlr r11
50 blr
51
Michael Neulingaec937b2012-10-30 19:34:14 +000052_GLOBAL(__setup_cpu_power8)
53 mflr r11
Michael Neuling57d23162013-03-04 19:45:50 +000054 bl __init_FSCR
Michael Ellerman240686c2013-04-25 19:28:22 +000055 bl __init_PMU
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053056 bl __init_PMU_ISA207
Michael Neulingaec937b2012-10-30 19:34:14 +000057 bl __init_hvmode_206
58 mtlr r11
59 beqlr
60 li r0,0
61 mtspr SPRN_LPID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +100062 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +110063 mfspr r3,SPRN_LPCR
Michael Neulingd4e58e52014-06-11 15:59:28 +100064 ori r3, r3, LPCR_PECEDH
Michael Neulingaec937b2012-10-30 19:34:14 +000065 bl __init_LPCR
Michael Neuling2a3563b2013-03-05 17:35:24 +000066 bl __init_HFSCR
Mahesh Salgaonkar04407052013-10-30 20:04:56 +053067 bl __init_tlb_power8
Michael Ellerman240686c2013-04-25 19:28:22 +000068 bl __init_PMU_HV
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053069 bl __init_PMU_HV_ISA207
Michael Neulingaec937b2012-10-30 19:34:14 +000070 mtlr r11
71 blr
72
73_GLOBAL(__restore_cpu_power8)
74 mflr r11
Michael Neuling57d23162013-03-04 19:45:50 +000075 bl __init_FSCR
Michael Ellerman240686c2013-04-25 19:28:22 +000076 bl __init_PMU
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053077 bl __init_PMU_ISA207
78 mfmsr r3
79 rldicl. r0,r3,4,63
80 mtlr r11
81 beqlr
82 li r0,0
83 mtspr SPRN_LPID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +100084 mtspr SPRN_PCR,r0
Madhavan Srinivasan393eb792016-06-26 23:07:06 +053085 mfspr r3,SPRN_LPCR
86 ori r3, r3, LPCR_PECEDH
87 bl __init_LPCR
88 bl __init_HFSCR
89 bl __init_tlb_power8
90 bl __init_PMU_HV
91 bl __init_PMU_HV_ISA207
92 mtlr r11
93 blr
94
95_GLOBAL(__setup_cpu_power9)
96 mflr r11
97 bl __init_FSCR
98 bl __init_PMU
99 bl __init_hvmode_206
100 mtlr r11
101 beqlr
102 li r0,0
103 mtspr SPRN_LPID,r0
Nicholas Piggin8950c982017-12-06 18:21:14 +1000104 mtspr SPRN_PID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +1000105 mtspr SPRN_PCR,r0
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530106 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt7a439062016-11-21 18:08:05 +1100107 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
108 or r3, r3, r4
Aneesh Kumar K.V075be782017-02-22 10:42:02 +0530109 LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
110 andc r3, r3, r4
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530111 bl __init_LPCR
112 bl __init_HFSCR
113 bl __init_tlb_power9
114 bl __init_PMU_HV
115 mtlr r11
116 blr
117
118_GLOBAL(__restore_cpu_power9)
119 mflr r11
120 bl __init_FSCR
121 bl __init_PMU
Michael Neulingaec937b2012-10-30 19:34:14 +0000122 mfmsr r3
123 rldicl. r0,r3,4,63
Michael Neuling8c2a3812013-04-24 21:00:37 +0000124 mtlr r11
Michael Neulingaec937b2012-10-30 19:34:14 +0000125 beqlr
126 li r0,0
127 mtspr SPRN_LPID,r0
Nicholas Piggin8950c982017-12-06 18:21:14 +1000128 mtspr SPRN_PID,r0
Michael Neuling09ae0d22018-05-18 11:37:42 +1000129 mtspr SPRN_PCR,r0
Michael Neulingf7c32c22012-11-05 14:40:18 +1100130 mfspr r3,SPRN_LPCR
Benjamin Herrenschmidt7a439062016-11-21 18:08:05 +1100131 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
132 or r3, r3, r4
Aneesh Kumar K.V075be782017-02-22 10:42:02 +0530133 LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR)
134 andc r3, r3, r4
Michael Neulingaec937b2012-10-30 19:34:14 +0000135 bl __init_LPCR
Michael Neuling2a3563b2013-03-05 17:35:24 +0000136 bl __init_HFSCR
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530137 bl __init_tlb_power9
Michael Ellerman240686c2013-04-25 19:28:22 +0000138 bl __init_PMU_HV
Michael Neulingaec937b2012-10-30 19:34:14 +0000139 mtlr r11
140 blr
141
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100142__init_hvmode_206:
Paul Mackerras969391c2011-06-29 00:26:11 +0000143 /* Disable CPU_FTR_HVMODE and exit if MSR:HV is not set */
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100144 mfmsr r3
145 rldicl. r0,r3,4,63
146 bnelr
147 ld r5,CPU_SPEC_FEATURES(r4)
Paul Mackerras969391c2011-06-29 00:26:11 +0000148 LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100149 xor r5,r5,r6
150 std r5,CPU_SPEC_FEATURES(r4)
151 blr
152
153__init_LPCR:
154 /* Setup a sane LPCR:
Michael Neulingf7c32c22012-11-05 14:40:18 +1100155 * Called with initial LPCR in R3
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100156 *
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000157 * LPES = 0b01 (HSRR0/1 used for 0x500)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100158 * PECE = 0b111
Benjamin Herrenschmidt895796a2011-01-24 13:25:55 +1100159 * DPFD = 4
Paul Mackerras923c53c2011-06-29 00:20:24 +0000160 * HDICE = 0
161 * VC = 0b100 (VPM0=1, VPM1=0, ISL=0)
162 * VRMASD = 0b10000 (L=1, LP=00)
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100163 *
164 * Other bits untouched for now
165 */
Paul Mackerras923c53c2011-06-29 00:20:24 +0000166 li r5,1
167 rldimi r3,r5, LPCR_LPES_SH, 64-LPCR_LPES_SH-2
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100168 ori r3,r3,(LPCR_PECE0|LPCR_PECE1|LPCR_PECE2)
Benjamin Herrenschmidt895796a2011-01-24 13:25:55 +1100169 li r5,4
Paul Mackerras923c53c2011-06-29 00:20:24 +0000170 rldimi r3,r5, LPCR_DPFD_SH, 64-LPCR_DPFD_SH-3
171 clrrdi r3,r3,1 /* clear HDICE */
172 li r5,4
173 rldimi r3,r5, LPCR_VC_SH, 0
174 li r5,0x10
175 rldimi r3,r5, LPCR_VRMASD_SH, 64-LPCR_VRMASD_SH-5
Benjamin Herrenschmidt24cc67d2011-01-20 18:50:55 +1100176 mtspr SPRN_LPCR,r3
177 isync
178 blr
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +1100179
Ian Munsie2468dcf2013-02-07 15:46:58 +0000180__init_FSCR:
181 mfspr r3,SPRN_FSCR
Michael Neuling1ddf4992013-04-30 20:17:03 +0000182 ori r3,r3,FSCR_TAR|FSCR_DSCR|FSCR_EBB
Ian Munsie2468dcf2013-02-07 15:46:58 +0000183 mtspr SPRN_FSCR,r3
184 blr
185
Michael Neuling2a3563b2013-03-05 17:35:24 +0000186__init_HFSCR:
187 mfspr r3,SPRN_HFSCR
Anshuman Khandual53b56ca2013-04-25 20:54:55 +0000188 ori r3,r3,HFSCR_TAR|HFSCR_TM|HFSCR_BHRB|HFSCR_PM|\
Michael Neuling1ddf4992013-04-30 20:17:03 +0000189 HFSCR_DSCR|HFSCR_VECVSX|HFSCR_FP|HFSCR_EBB
Michael Neuling2a3563b2013-03-05 17:35:24 +0000190 mtspr SPRN_HFSCR,r3
191 blr
192
Mahesh Salgaonkar04407052013-10-30 20:04:56 +0530193/*
194 * Clear the TLB using the specified IS form of tlbiel instruction
195 * (invalidate by congruence class). P7 has 128 CCs., P8 has 512.
Mahesh Salgaonkar04407052013-10-30 20:04:56 +0530196 */
197__init_tlb_power7:
Michael Neuling15b16242016-02-19 11:16:23 +1100198 li r6,POWER7_TLB_SETS
Mahesh Salgaonkar04407052013-10-30 20:04:56 +0530199 mtctr r6
Mahesh Salgaonkar45706bb2014-12-19 08:41:05 +0530200 li r7,0xc00 /* IS field = 0b11 */
Mahesh Salgaonkar04407052013-10-30 20:04:56 +0530201 ptesync
2022: tlbiel r7
203 addi r7,r7,0x1000
204 bdnz 2b
205 ptesync
2061: blr
207
208__init_tlb_power8:
Michael Neuling15b16242016-02-19 11:16:23 +1100209 li r6,POWER8_TLB_SETS
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +1100210 mtctr r6
Mahesh Salgaonkar45706bb2014-12-19 08:41:05 +0530211 li r7,0xc00 /* IS field = 0b11 */
Benjamin Herrenschmidtb1448712011-03-01 15:46:09 +1100212 ptesync
2132: tlbiel r7
214 addi r7,r7,0x1000
215 bdnz 2b
216 ptesync
2171: blr
Michael Ellerman240686c2013-04-25 19:28:22 +0000218
Michael Neulingc3ab3002016-02-19 11:16:24 +1100219__init_tlb_power9:
220 li r6,POWER9_TLB_SETS_HASH
221 mtctr r6
222 li r7,0xc00 /* IS field = 0b11 */
223 ptesync
2242: tlbiel r7
225 addi r7,r7,0x1000
226 bdnz 2b
227 ptesync
2281: blr
229
Michael Ellerman240686c2013-04-25 19:28:22 +0000230__init_PMU_HV:
231 li r5,0
232 mtspr SPRN_MMCRC,r5
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530233 blr
234
235__init_PMU_HV_ISA207:
236 li r5,0
Michael Ellerman240686c2013-04-25 19:28:22 +0000237 mtspr SPRN_MMCRH,r5
238 blr
239
240__init_PMU:
241 li r5,0
Michael Ellerman240686c2013-04-25 19:28:22 +0000242 mtspr SPRN_MMCRA,r5
243 mtspr SPRN_MMCR0,r5
244 mtspr SPRN_MMCR1,r5
245 mtspr SPRN_MMCR2,r5
246 blr
Madhavan Srinivasan393eb792016-06-26 23:07:06 +0530247
248__init_PMU_ISA207:
249 li r5,0
250 mtspr SPRN_MMCRS,r5
251 blr