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 (dhowells@redhat.com)
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