Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/frv/kernel/head-mmu-fr451.S
10817 views
1
/* head-mmu-fr451.S: FR451 mmu-linux specific bits of initialisation
2
*
3
* Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells ([email protected])
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*/
11
12
#include <linux/init.h>
13
#include <linux/threads.h>
14
#include <linux/linkage.h>
15
#include <asm/ptrace.h>
16
#include <asm/page.h>
17
#include <asm/mem-layout.h>
18
#include <asm/spr-regs.h>
19
#include <asm/mb86943a.h>
20
#include "head.inc"
21
22
23
#define __400_DBR0 0xfe000e00
24
#define __400_DBR1 0xfe000e08
25
#define __400_DBR2 0xfe000e10
26
#define __400_DBR3 0xfe000e18
27
#define __400_DAM0 0xfe000f00
28
#define __400_DAM1 0xfe000f08
29
#define __400_DAM2 0xfe000f10
30
#define __400_DAM3 0xfe000f18
31
#define __400_LGCR 0xfe000010
32
#define __400_LCR 0xfe000100
33
#define __400_LSBR 0xfe000c00
34
35
__INIT
36
.balign 4
37
38
###############################################################################
39
#
40
# describe the position and layout of the SDRAM controller registers
41
#
42
# ENTRY: EXIT:
43
# GR5 - cacheline size
44
# GR11 - displacement of 2nd SDRAM addr reg from GR14
45
# GR12 - displacement of 3rd SDRAM addr reg from GR14
46
# GR13 - displacement of 4th SDRAM addr reg from GR14
47
# GR14 - address of 1st SDRAM addr reg
48
# GR15 - amount to shift address by to match SDRAM addr reg
49
# GR26 &__head_reference [saved]
50
# GR30 LED address [saved]
51
# CC0 - T if DBR0 is present
52
# CC1 - T if DBR1 is present
53
# CC2 - T if DBR2 is present
54
# CC3 - T if DBR3 is present
55
#
56
###############################################################################
57
.globl __head_fr451_describe_sdram
58
__head_fr451_describe_sdram:
59
sethi.p %hi(__400_DBR0),gr14
60
setlo %lo(__400_DBR0),gr14
61
setlos.p #__400_DBR1-__400_DBR0,gr11
62
setlos #__400_DBR2-__400_DBR0,gr12
63
setlos.p #__400_DBR3-__400_DBR0,gr13
64
setlos #32,gr5 ; cacheline size
65
setlos.p #0,gr15 ; amount to shift addr reg by
66
setlos #0x00ff,gr4
67
movgs gr4,cccr ; extant DARS/DAMK regs
68
bralr
69
70
###############################################################################
71
#
72
# rearrange the bus controller registers
73
#
74
# ENTRY: EXIT:
75
# GR26 &__head_reference [saved]
76
# GR30 LED address revised LED address
77
#
78
###############################################################################
79
.globl __head_fr451_set_busctl
80
__head_fr451_set_busctl:
81
sethi.p %hi(__400_LGCR),gr4
82
setlo %lo(__400_LGCR),gr4
83
sethi.p %hi(__400_LSBR),gr10
84
setlo %lo(__400_LSBR),gr10
85
sethi.p %hi(__400_LCR),gr11
86
setlo %lo(__400_LCR),gr11
87
88
# set the bus controller
89
ldi @(gr4,#0),gr5
90
ori gr5,#0xff,gr5 ; make sure all chip-selects are enabled
91
sti gr5,@(gr4,#0)
92
93
sethi.p %hi(__region_CS1),gr4
94
setlo %lo(__region_CS1),gr4
95
sethi.p %hi(__region_CS1_M),gr5
96
setlo %lo(__region_CS1_M),gr5
97
sethi.p %hi(__region_CS1_C),gr6
98
setlo %lo(__region_CS1_C),gr6
99
sti gr4,@(gr10,#1*0x08)
100
sti gr5,@(gr10,#1*0x08+0x100)
101
sti gr6,@(gr11,#1*0x08)
102
sethi.p %hi(__region_CS2),gr4
103
setlo %lo(__region_CS2),gr4
104
sethi.p %hi(__region_CS2_M),gr5
105
setlo %lo(__region_CS2_M),gr5
106
sethi.p %hi(__region_CS2_C),gr6
107
setlo %lo(__region_CS2_C),gr6
108
sti gr4,@(gr10,#2*0x08)
109
sti gr5,@(gr10,#2*0x08+0x100)
110
sti gr6,@(gr11,#2*0x08)
111
sethi.p %hi(__region_CS3),gr4
112
setlo %lo(__region_CS3),gr4
113
sethi.p %hi(__region_CS3_M),gr5
114
setlo %lo(__region_CS3_M),gr5
115
sethi.p %hi(__region_CS3_C),gr6
116
setlo %lo(__region_CS3_C),gr6
117
sti gr4,@(gr10,#3*0x08)
118
sti gr5,@(gr10,#3*0x08+0x100)
119
sti gr6,@(gr11,#3*0x08)
120
sethi.p %hi(__region_CS4),gr4
121
setlo %lo(__region_CS4),gr4
122
sethi.p %hi(__region_CS4_M),gr5
123
setlo %lo(__region_CS4_M),gr5
124
sethi.p %hi(__region_CS4_C),gr6
125
setlo %lo(__region_CS4_C),gr6
126
sti gr4,@(gr10,#4*0x08)
127
sti gr5,@(gr10,#4*0x08+0x100)
128
sti gr6,@(gr11,#4*0x08)
129
sethi.p %hi(__region_CS5),gr4
130
setlo %lo(__region_CS5),gr4
131
sethi.p %hi(__region_CS5_M),gr5
132
setlo %lo(__region_CS5_M),gr5
133
sethi.p %hi(__region_CS5_C),gr6
134
setlo %lo(__region_CS5_C),gr6
135
sti gr4,@(gr10,#5*0x08)
136
sti gr5,@(gr10,#5*0x08+0x100)
137
sti gr6,@(gr11,#5*0x08)
138
sethi.p %hi(__region_CS6),gr4
139
setlo %lo(__region_CS6),gr4
140
sethi.p %hi(__region_CS6_M),gr5
141
setlo %lo(__region_CS6_M),gr5
142
sethi.p %hi(__region_CS6_C),gr6
143
setlo %lo(__region_CS6_C),gr6
144
sti gr4,@(gr10,#6*0x08)
145
sti gr5,@(gr10,#6*0x08+0x100)
146
sti gr6,@(gr11,#6*0x08)
147
sethi.p %hi(__region_CS7),gr4
148
setlo %lo(__region_CS7),gr4
149
sethi.p %hi(__region_CS7_M),gr5
150
setlo %lo(__region_CS7_M),gr5
151
sethi.p %hi(__region_CS7_C),gr6
152
setlo %lo(__region_CS7_C),gr6
153
sti gr4,@(gr10,#7*0x08)
154
sti gr5,@(gr10,#7*0x08+0x100)
155
sti gr6,@(gr11,#7*0x08)
156
membar
157
bar
158
159
# adjust LED bank address
160
#ifdef CONFIG_MB93091_VDK
161
sethi.p %hi(__region_CS2 + 0x01200004),gr30
162
setlo %lo(__region_CS2 + 0x01200004),gr30
163
#endif
164
bralr
165
166
###############################################################################
167
#
168
# determine the total SDRAM size
169
#
170
# ENTRY: EXIT:
171
# GR25 - SDRAM size
172
# GR26 &__head_reference [saved]
173
# GR30 LED address [saved]
174
#
175
###############################################################################
176
.globl __head_fr451_survey_sdram
177
__head_fr451_survey_sdram:
178
sethi.p %hi(__400_DAM0),gr11
179
setlo %lo(__400_DAM0),gr11
180
sethi.p %hi(__400_DBR0),gr12
181
setlo %lo(__400_DBR0),gr12
182
183
sethi.p %hi(0xfe000000),gr17 ; unused SDRAM DBR value
184
setlo %lo(0xfe000000),gr17
185
setlos #0,gr25
186
187
ldi @(gr12,#0x00),gr4 ; DAR0
188
subcc gr4,gr17,gr0,icc0
189
beq icc0,#0,__head_no_DCS0
190
ldi @(gr11,#0x00),gr6 ; DAM0: bits 31:20 match addr 31:20
191
add gr25,gr6,gr25
192
addi gr25,#1,gr25
193
__head_no_DCS0:
194
195
ldi @(gr12,#0x08),gr4 ; DAR1
196
subcc gr4,gr17,gr0,icc0
197
beq icc0,#0,__head_no_DCS1
198
ldi @(gr11,#0x08),gr6 ; DAM1: bits 31:20 match addr 31:20
199
add gr25,gr6,gr25
200
addi gr25,#1,gr25
201
__head_no_DCS1:
202
203
ldi @(gr12,#0x10),gr4 ; DAR2
204
subcc gr4,gr17,gr0,icc0
205
beq icc0,#0,__head_no_DCS2
206
ldi @(gr11,#0x10),gr6 ; DAM2: bits 31:20 match addr 31:20
207
add gr25,gr6,gr25
208
addi gr25,#1,gr25
209
__head_no_DCS2:
210
211
ldi @(gr12,#0x18),gr4 ; DAR3
212
subcc gr4,gr17,gr0,icc0
213
beq icc0,#0,__head_no_DCS3
214
ldi @(gr11,#0x18),gr6 ; DAM3: bits 31:20 match addr 31:20
215
add gr25,gr6,gr25
216
addi gr25,#1,gr25
217
__head_no_DCS3:
218
bralr
219
220
###############################################################################
221
#
222
# set the protection map with the I/DAMPR registers
223
#
224
# ENTRY: EXIT:
225
# GR25 SDRAM size [saved]
226
# GR26 &__head_reference [saved]
227
# GR30 LED address [saved]
228
#
229
#
230
# Using this map:
231
# REGISTERS ADDRESS RANGE VIEW
232
# =============== ====================== ===============================
233
# IAMPR0/DAMPR0 0xC0000000-0xCFFFFFFF Cached kernel RAM Window
234
# DAMPR11 0xE0000000-0xFFFFFFFF Uncached I/O
235
#
236
###############################################################################
237
.globl __head_fr451_set_protection
238
__head_fr451_set_protection:
239
movsg lr,gr27
240
241
# set the I/O region protection registers for FR451 in MMU mode
242
#define PGPROT_IO xAMPRx_L|xAMPRx_M|xAMPRx_S_KERNEL|xAMPRx_C|xAMPRx_V
243
244
sethi.p %hi(__region_IO),gr5
245
setlo %lo(__region_IO),gr5
246
setlos #PGPROT_IO|xAMPRx_SS_512Mb,gr4
247
or gr4,gr5,gr4
248
movgs gr5,damlr11 ; General I/O tile
249
movgs gr4,dampr11
250
251
# need to open a window onto at least part of the RAM for the kernel's use
252
sethi.p %hi(__sdram_base),gr8
253
setlo %lo(__sdram_base),gr8 ; physical address
254
sethi.p %hi(__page_offset),gr9
255
setlo %lo(__page_offset),gr9 ; virtual address
256
257
setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_256Mb|xAMPRx_S_KERNEL|xAMPRx_V,gr11
258
or gr8,gr11,gr8
259
260
movgs gr9,iamlr0 ; mapped from real address 0
261
movgs gr8,iampr0 ; cached kernel memory at 0xC0000000
262
movgs gr9,damlr0
263
movgs gr8,dampr0
264
265
# set a temporary mapping for the kernel running at address 0 until we've turned on the MMU
266
sethi.p %hi(__sdram_base),gr9
267
setlo %lo(__sdram_base),gr9 ; virtual address
268
269
and.p gr4,gr11,gr4
270
and gr5,gr11,gr5
271
or.p gr4,gr11,gr4
272
or gr5,gr11,gr5
273
274
movgs gr9,iamlr1 ; mapped from real address 0
275
movgs gr8,iampr1 ; cached kernel memory at 0x00000000
276
movgs gr9,damlr1
277
movgs gr8,dampr1
278
279
# we use DAMR2-10 for kmap_atomic(), cache flush and TLB management
280
# since the DAMLR regs are not going to change, we can set them now
281
# also set up IAMLR2 to the same as DAMLR5
282
sethi.p %hi(KMAP_ATOMIC_PRIMARY_FRAME),gr4
283
setlo %lo(KMAP_ATOMIC_PRIMARY_FRAME),gr4
284
sethi.p %hi(PAGE_SIZE),gr5
285
setlo %lo(PAGE_SIZE),gr5
286
287
movgs gr4,damlr2
288
movgs gr4,iamlr2
289
add gr4,gr5,gr4
290
movgs gr4,damlr3
291
add gr4,gr5,gr4
292
movgs gr4,damlr4
293
add gr4,gr5,gr4
294
movgs gr4,damlr5
295
add gr4,gr5,gr4
296
movgs gr4,damlr6
297
add gr4,gr5,gr4
298
movgs gr4,damlr7
299
add gr4,gr5,gr4
300
movgs gr4,damlr8
301
add gr4,gr5,gr4
302
movgs gr4,damlr9
303
add gr4,gr5,gr4
304
movgs gr4,damlr10
305
306
movgs gr0,dampr2
307
movgs gr0,dampr4
308
movgs gr0,dampr5
309
movgs gr0,dampr6
310
movgs gr0,dampr7
311
movgs gr0,dampr8
312
movgs gr0,dampr9
313
movgs gr0,dampr10
314
315
movgs gr0,iamlr3
316
movgs gr0,iamlr4
317
movgs gr0,iamlr5
318
movgs gr0,iamlr6
319
movgs gr0,iamlr7
320
321
movgs gr0,iampr2
322
movgs gr0,iampr3
323
movgs gr0,iampr4
324
movgs gr0,iampr5
325
movgs gr0,iampr6
326
movgs gr0,iampr7
327
328
# start in TLB context 0 with the swapper's page tables
329
movgs gr0,cxnr
330
331
sethi.p %hi(swapper_pg_dir),gr4
332
setlo %lo(swapper_pg_dir),gr4
333
sethi.p %hi(__page_offset),gr5
334
setlo %lo(__page_offset),gr5
335
sub gr4,gr5,gr4
336
movgs gr4,ttbr
337
setlos #xAMPRx_L|xAMPRx_M|xAMPRx_SS_16Kb|xAMPRx_S|xAMPRx_C|xAMPRx_V,gr5
338
or gr4,gr5,gr4
339
movgs gr4,dampr3
340
341
# the FR451 also has an extra trap base register
342
movsg tbr,gr4
343
movgs gr4,btbr
344
345
LEDS 0x3300
346
jmpl @(gr27,gr0)
347
348
###############################################################################
349
#
350
# finish setting up the protection registers
351
#
352
###############################################################################
353
.globl __head_fr451_finalise_protection
354
__head_fr451_finalise_protection:
355
# turn on the timers as appropriate
356
movgs gr0,timerh
357
movgs gr0,timerl
358
movgs gr0,timerd
359
movsg hsr0,gr4
360
sethi.p %hi(HSR0_ETMI),gr5
361
setlo %lo(HSR0_ETMI),gr5
362
or gr4,gr5,gr4
363
movgs gr4,hsr0
364
365
# clear the TLB entry cache
366
movgs gr0,iamlr1
367
movgs gr0,iampr1
368
movgs gr0,damlr1
369
movgs gr0,dampr1
370
371
# clear the PGE cache
372
sethi.p %hi(__flush_tlb_all),gr4
373
setlo %lo(__flush_tlb_all),gr4
374
jmpl @(gr4,gr0)
375
376