Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/powerpc/kernel/cpu_setup_ppc970.S
26451 views
1
/* SPDX-License-Identifier: GPL-2.0-or-later */
2
/*
3
* This file contains low level CPU setup functions.
4
* Copyright (C) 2003 Benjamin Herrenschmidt ([email protected])
5
*/
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>
13
14
_GLOBAL(__cpu_preinit_ppc970)
15
/* Do nothing if not running in HV mode */
16
mfmsr r0
17
rldicl. r0,r0,4,63
18
beqlr
19
20
/* Make sure HID4:rm_ci is off before MMU is turned off, that large
21
* pages are enabled with HID4:61 and clear HID5:DCBZ_size and
22
* HID5:DCBZ32_ill
23
*/
24
li r0,0
25
mfspr r3,SPRN_HID4
26
rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */
27
rldimi r3,r0,2,61 /* clear bit 61 (lg_pg_en) */
28
sync
29
mtspr SPRN_HID4,r3
30
isync
31
sync
32
mfspr r3,SPRN_HID5
33
rldimi r3,r0,6,56 /* clear bits 56 & 57 (DCBZ*) */
34
sync
35
mtspr SPRN_HID5,r3
36
isync
37
sync
38
39
/* Setup some basic HID1 features */
40
mfspr r0,SPRN_HID1
41
li r3,0x1200 /* enable i-fetch cacheability */
42
sldi r3,r3,44 /* and prefetch */
43
or r0,r0,r3
44
mtspr SPRN_HID1,r0
45
mtspr SPRN_HID1,r0
46
isync
47
48
/* Clear HIOR */
49
li r0,0
50
sync
51
mtspr SPRN_HIOR,0 /* Clear interrupt prefix */
52
isync
53
blr
54
55
/* Definitions for the table use to save CPU states */
56
#define CS_HID0 0
57
#define CS_HID1 8
58
#define CS_HID4 16
59
#define CS_HID5 24
60
#define CS_SIZE 32
61
62
.data
63
.balign L1_CACHE_BYTES,0
64
cpu_state_storage:
65
.space CS_SIZE
66
.balign L1_CACHE_BYTES,0
67
.text
68
69
70
_GLOBAL(__setup_cpu_ppc970)
71
/* Do nothing if not running in HV mode */
72
mfmsr r0
73
rldicl. r0,r0,4,63
74
beq no_hv_mode
75
76
mfspr r0,SPRN_HID0
77
li r11,5 /* clear DOZE and SLEEP */
78
rldimi r0,r11,52,8 /* set NAP and DPM */
79
li r11,0
80
rldimi r0,r11,32,31 /* clear EN_ATTN */
81
b load_hids /* Jump to shared code */
82
83
84
_GLOBAL(__setup_cpu_ppc970MP)
85
/* Do nothing if not running in HV mode */
86
mfmsr r0
87
rldicl. r0,r0,4,63
88
beq no_hv_mode
89
90
mfspr r0,SPRN_HID0
91
li r11,0x15 /* clear DOZE and SLEEP */
92
rldimi r0,r11,52,6 /* set DEEPNAP, NAP and DPM */
93
li r11,0
94
rldimi r0,r11,32,31 /* clear EN_ATTN */
95
96
load_hids:
97
mtspr SPRN_HID0,r0
98
mfspr r0,SPRN_HID0
99
mfspr r0,SPRN_HID0
100
mfspr r0,SPRN_HID0
101
mfspr r0,SPRN_HID0
102
mfspr r0,SPRN_HID0
103
mfspr r0,SPRN_HID0
104
sync
105
isync
106
107
/* Try to set LPES = 01 in HID4 */
108
mfspr r0,SPRN_HID4
109
clrldi r0,r0,1 /* clear LPES0 */
110
ori r0,r0,HID4_LPES1 /* set LPES1 */
111
sync
112
mtspr SPRN_HID4,r0
113
isync
114
115
/* Save away cpu state */
116
LOAD_REG_ADDR(r5,cpu_state_storage)
117
118
/* Save HID0,1,4 and 5 */
119
mfspr r3,SPRN_HID0
120
std r3,CS_HID0(r5)
121
mfspr r3,SPRN_HID1
122
std r3,CS_HID1(r5)
123
mfspr r4,SPRN_HID4
124
std r4,CS_HID4(r5)
125
mfspr r3,SPRN_HID5
126
std r3,CS_HID5(r5)
127
128
/* See if we successfully set LPES1 to 1; if not we are in Apple mode */
129
andi. r4,r4,HID4_LPES1
130
bnelr
131
132
no_hv_mode:
133
/* Disable CPU_FTR_HVMODE and exit, since we don't have HV mode */
134
ld r5,CPU_SPEC_FEATURES(r4)
135
LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE)
136
andc r5,r5,r6
137
std r5,CPU_SPEC_FEATURES(r4)
138
blr
139
140
/* Called with no MMU context (typically MSR:IR/DR off) to
141
* restore CPU state as backed up by the previous
142
* function. This does not include cache setting
143
*/
144
_GLOBAL(__restore_cpu_ppc970)
145
/* Do nothing if not running in HV mode */
146
mfmsr r0
147
rldicl. r0,r0,4,63
148
beqlr
149
150
LOAD_REG_ADDR(r5,cpu_state_storage)
151
/* Before accessing memory, we make sure rm_ci is clear */
152
li r0,0
153
mfspr r3,SPRN_HID4
154
rldimi r3,r0,40,23 /* clear bit 23 (rm_ci) */
155
sync
156
mtspr SPRN_HID4,r3
157
isync
158
sync
159
160
/* Clear interrupt prefix */
161
li r0,0
162
sync
163
mtspr SPRN_HIOR,0
164
isync
165
166
/* Restore HID0 */
167
ld r3,CS_HID0(r5)
168
sync
169
isync
170
mtspr SPRN_HID0,r3
171
mfspr r3,SPRN_HID0
172
mfspr r3,SPRN_HID0
173
mfspr r3,SPRN_HID0
174
mfspr r3,SPRN_HID0
175
mfspr r3,SPRN_HID0
176
mfspr r3,SPRN_HID0
177
sync
178
isync
179
180
/* Restore HID1 */
181
ld r3,CS_HID1(r5)
182
sync
183
isync
184
mtspr SPRN_HID1,r3
185
mtspr SPRN_HID1,r3
186
sync
187
isync
188
189
/* Restore HID4 */
190
ld r3,CS_HID4(r5)
191
sync
192
isync
193
mtspr SPRN_HID4,r3
194
sync
195
isync
196
197
/* Restore HID5 */
198
ld r3,CS_HID5(r5)
199
sync
200
isync
201
mtspr SPRN_HID5,r3
202
sync
203
isync
204
blr
205
206
207