xref: /rk3399_rockchip-uboot/arch/nds32/cpu/n1213/ag101/lowlevel_init.S (revision c2774e6149a6bedb0941deefec84665119e685a4)
1445a886dSMacpaul Lin/*
2445a886dSMacpaul Lin * Copyright (C) 2011 Andes Technology Corporation
3445a886dSMacpaul Lin * Shawn Lin, Andes Technology Corporation <nobuhiro@andestech.com>
4445a886dSMacpaul Lin * Macpaul Lin, Andes Technology Corporation <macpaul@andestech.com>
5445a886dSMacpaul Lin *
61a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
7445a886dSMacpaul Lin */
8445a886dSMacpaul Lin
9d607f6faSrick.pic
10d607f6faSrick
11445a886dSMacpaul Lin.text
12445a886dSMacpaul Lin
13445a886dSMacpaul Lin#include <common.h>
14445a886dSMacpaul Lin#include <config.h>
15445a886dSMacpaul Lin
16445a886dSMacpaul Lin#include <asm/macro.h>
17445a886dSMacpaul Lin#include <generated/asm-offsets.h>
18445a886dSMacpaul Lin
19445a886dSMacpaul Lin/*
20445a886dSMacpaul Lin * parameters for the SDRAM controller
21445a886dSMacpaul Lin */
22445a886dSMacpaul Lin#define SDMC_TP1_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_TP1)
23445a886dSMacpaul Lin#define SDMC_TP2_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_TP2)
24445a886dSMacpaul Lin#define SDMC_CR1_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_CR1)
25445a886dSMacpaul Lin#define SDMC_CR2_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_CR2)
26445a886dSMacpaul Lin#define SDMC_B0_BSR_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_BANK0_BSR)
273c016704Sken kuo#define SDMC_B1_BSR_A		(CONFIG_FTSDMC021_BASE + FTSDMC021_BANK1_BSR)
28445a886dSMacpaul Lin
29445a886dSMacpaul Lin#define SDMC_TP1_D		CONFIG_SYS_FTSDMC021_TP1
30445a886dSMacpaul Lin#define SDMC_TP2_D		CONFIG_SYS_FTSDMC021_TP2
31445a886dSMacpaul Lin#define SDMC_CR1_D		CONFIG_SYS_FTSDMC021_CR1
32445a886dSMacpaul Lin#define SDMC_CR2_D		CONFIG_SYS_FTSDMC021_CR2
33445a886dSMacpaul Lin
34445a886dSMacpaul Lin#define SDMC_B0_BSR_D		CONFIG_SYS_FTSDMC021_BANK0_BSR
353c016704Sken kuo#define SDMC_B1_BSR_D		CONFIG_SYS_FTSDMC021_BANK1_BSR
36445a886dSMacpaul Lin
37f889cc81Srick
38f889cc81Srick/*
39f889cc81Srick * for Orca and Emerald
40f889cc81Srick */
41f889cc81Srick#define BOARD_ID_REG		0x104
42f889cc81Srick#define BOARD_ID_FAMILY_MASK 	0xfff000
43f889cc81Srick#define BOARD_ID_FAMILY_V5   	0x556000
44f889cc81Srick#define BOARD_ID_FAMILY_K7   	0x74b000
45f889cc81Srick
46445a886dSMacpaul Lin/*
47445a886dSMacpaul Lin * parameters for the static memory controller
48445a886dSMacpaul Lin */
49445a886dSMacpaul Lin#define SMC_BANK0_CR_A		(CONFIG_FTSMC020_BASE + FTSMC020_BANK0_CR)
50445a886dSMacpaul Lin#define SMC_BANK0_TPR_A		(CONFIG_FTSMC020_BASE + FTSMC020_BANK0_TPR)
51445a886dSMacpaul Lin
52445a886dSMacpaul Lin#define SMC_BANK0_CR_D		FTSMC020_BANK0_LOWLV_CONFIG
53445a886dSMacpaul Lin#define SMC_BANK0_TPR_D		FTSMC020_BANK0_LOWLV_TIMING
54445a886dSMacpaul Lin
55445a886dSMacpaul Lin/*
56445a886dSMacpaul Lin * parameters for the ahbc controller
57445a886dSMacpaul Lin */
58445a886dSMacpaul Lin#define AHBC_CR_A		(CONFIG_FTAHBC020S_BASE + FTAHBC020S_CR)
59445a886dSMacpaul Lin#define AHBC_BSR6_A	(CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_6)
60445a886dSMacpaul Lin
61f889cc81Srick/*
62f889cc81Srick * for Orca and Emerald
63f889cc81Srick */
64f889cc81Srick#define AHBC_BSR4_A	(CONFIG_FTAHBC020S_BASE + FTAHBC020S_SLAVE_BSR_4)
65445a886dSMacpaul Lin#define AHBC_BSR6_D		CONFIG_SYS_FTAHBC020S_SLAVE_BSR_6
66445a886dSMacpaul Lin
67445a886dSMacpaul Lin/*
68445a886dSMacpaul Lin * parameters for the pmu controoler
69445a886dSMacpaul Lin */
70445a886dSMacpaul Lin#define PMU_PDLLCR0_A		(CONFIG_FTPMU010_BASE + FTPMU010_PDLLCR0)
71445a886dSMacpaul Lin
72445a886dSMacpaul Lin/*
73445a886dSMacpaul Lin * numeric 7 segment display
74445a886dSMacpaul Lin */
75445a886dSMacpaul Lin.macro	led, num
76445a886dSMacpaul Lin	write32	CONFIG_DEBUG_LED, \num
77445a886dSMacpaul Lin.endm
78445a886dSMacpaul Lin
79445a886dSMacpaul Lin/*
80445a886dSMacpaul Lin * Waiting for SDRAM to set up
81445a886dSMacpaul Lin */
82445a886dSMacpaul Lin.macro	wait_sdram
83445a886dSMacpaul Lin	li	$r0, CONFIG_FTSDMC021_BASE
84445a886dSMacpaul Lin1:
85445a886dSMacpaul Lin	lwi	$r1, [$r0+FTSDMC021_CR2]
86445a886dSMacpaul Lin	bnez	$r1, 1b
87445a886dSMacpaul Lin.endm
88445a886dSMacpaul Lin
89*b841b6e9Srick.globl	mem_init
90445a886dSMacpaul Linmem_init:
91445a886dSMacpaul Lin	move	$r11, $lp
92445a886dSMacpaul Lin
93445a886dSMacpaul Lin	/*
94445a886dSMacpaul Lin	 * mem_init:
95445a886dSMacpaul Lin	 *	There are 2 bank connected to FTSMC020 on AG101
96445a886dSMacpaul Lin	 *	BANK0: FLASH/ROM (SW5, J16), BANK1: OnBoard SDRAM.
97445a886dSMacpaul Lin	 *	we need to set onboard SDRAM before remap and relocation.
98445a886dSMacpaul Lin	 */
99445a886dSMacpaul Lin	led	0x01
100f889cc81Srick
101f889cc81Srick  /*
102f889cc81Srick   * for Orca and Emerald
103f889cc81Srick   * disable write protection and reset bank size
104f889cc81Srick   */
105f889cc81Srick	li	$r0, SMC_BANK0_CR_A
106f889cc81Srick	lwi $r1, [$r0+#0x00]
107f889cc81Srick	ori $r1, $r1, 0x8f0
108f889cc81Srick	xori $r1, $r1, 0x8f0
109*b841b6e9Srick	/* check board */
110f889cc81Srick	li      $r3, CONFIG_FTPMU010_BASE + BOARD_ID_REG
111f889cc81Srick  lwi     $r3, [$r3]
112f889cc81Srick  li      $r4, BOARD_ID_FAMILY_MASK
113f889cc81Srick  and     $r3, $r3, $r4
114f889cc81Srick  li      $r4, BOARD_ID_FAMILY_K7
115f889cc81Srick  xor     $r4, $r3, $r4
116f889cc81Srick  beqz    $r4, use_flash_16bit_boot
117*b841b6e9Srick	/* 32-bit mode */
118f889cc81Srickuse_flash_32bit_boot:
119f889cc81Srick	ori     $r1, $r1, 0x50
120f889cc81Srick  li      $r2, 0x00151151
121f889cc81Srick  j       sdram_b0_cr
122*b841b6e9Srick	/* 16-bit mode */
123f889cc81Srickuse_flash_16bit_boot:
124f889cc81Srick  ori     $r1, $r1, 0x60
125f889cc81Srick  li      $r2, 0x00153153
126*b841b6e9Srick	/* SRAM bank0 config */
127f889cc81Sricksdram_b0_cr:
128f889cc81Srick  swi     $r1, [$r0+#0x00]
129f889cc81Srick  swi     $r2, [$r0+#0x04]
130445a886dSMacpaul Lin
131*b841b6e9Srick	/* config AHB Controller */
132445a886dSMacpaul Lin	led	0x02
133445a886dSMacpaul Lin
134445a886dSMacpaul Lin	/*
135445a886dSMacpaul Lin	 * config PMU controller
136445a886dSMacpaul Lin	 */
137445a886dSMacpaul Lin	/* ftpmu010_dlldis_disable, must do it in lowleve_init */
138445a886dSMacpaul Lin	led	0x03
139445a886dSMacpaul Lin	setbf32	PMU_PDLLCR0_A, FTPMU010_PDLLCR0_DLLDIS		! 0x00010000
140445a886dSMacpaul Lin
141445a886dSMacpaul Lin	/*
142445a886dSMacpaul Lin	 * config SDRAM controller
143445a886dSMacpaul Lin	 */
144445a886dSMacpaul Lin	led	0x04
145445a886dSMacpaul Lin	write32	SDMC_TP1_A, SDMC_TP1_D				! 0x00011312
146445a886dSMacpaul Lin	led	0x05
147445a886dSMacpaul Lin	write32	SDMC_TP2_A, SDMC_TP2_D				! 0x00480180
148445a886dSMacpaul Lin	led	0x06
149445a886dSMacpaul Lin	write32	SDMC_CR1_A, SDMC_CR1_D				! 0x00002326
150445a886dSMacpaul Lin
151445a886dSMacpaul Lin	led	0x07
152445a886dSMacpaul Lin	write32	SDMC_CR2_A, FTSDMC021_CR2_IPREC			! 0x00000010
153445a886dSMacpaul Lin	wait_sdram
154445a886dSMacpaul Lin
155445a886dSMacpaul Lin	led	0x08
156445a886dSMacpaul Lin	write32	SDMC_CR2_A, FTSDMC021_CR2_ISMR			! 0x00000004
157445a886dSMacpaul Lin	wait_sdram
158445a886dSMacpaul Lin
159445a886dSMacpaul Lin	led	0x09
160445a886dSMacpaul Lin	write32	SDMC_CR2_A, FTSDMC021_CR2_IREF			! 0x00000008
161445a886dSMacpaul Lin	wait_sdram
162445a886dSMacpaul Lin
163445a886dSMacpaul Lin	led	0x0a
164445a886dSMacpaul Lin	move	$lp, $r11
165445a886dSMacpaul Lin	ret
166445a886dSMacpaul Lin
167*b841b6e9Srick
168*b841b6e9Srick#ifndef CONFIG_SKIP_LOWLEVEL_INIT
169*b841b6e9Srick
170*b841b6e9Srick.globl	lowlevel_init
171*b841b6e9Sricklowlevel_init:
172*b841b6e9Srick	move	$r10, $lp
173*b841b6e9Srick	led	0x10
174*b841b6e9Srick	jal	remap
175*b841b6e9Srick#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP))
176*b841b6e9Srick	led	0x1f
177*b841b6e9Srick	jal	enable_fpu
178*b841b6e9Srick#endif
179*b841b6e9Srick	led	0x20
180*b841b6e9Srick	ret	$r10
181*b841b6e9Srick
182445a886dSMacpaul Linremap:
183445a886dSMacpaul Lin	move	$r11, $lp
184445a886dSMacpaul Lin#ifdef __NDS32_N1213_43U1H__	/* NDS32 V0 ISA - AG101 Only */
185445a886dSMacpaul Lin	bal	2f
186445a886dSMacpaul Linrelo_base:
187445a886dSMacpaul Lin	move	$r0, $lp
188445a886dSMacpaul Lin#else
189445a886dSMacpaul Linrelo_base:
190445a886dSMacpaul Lin	mfusr	$r0, $pc
191445a886dSMacpaul Lin#endif /* __NDS32_N1213_43U1H__ */
192445a886dSMacpaul Lin
193*b841b6e9Srick	/* Remapping */
194445a886dSMacpaul Lin	led	0x1a
1952e88bb28SKun-Hua Huang	write32	SDMC_B0_BSR_A, SDMC_B0_BSR_D		! 0x00001800
1962e88bb28SKun-Hua Huang	write32	SDMC_B1_BSR_A, SDMC_B1_BSR_D		! 0x00001880
197445a886dSMacpaul Lin
198445a886dSMacpaul Lin	/* clear empty BSR registers */
199445a886dSMacpaul Lin	led	0x1b
200445a886dSMacpaul Lin	li	$r4, CONFIG_FTSDMC021_BASE
201445a886dSMacpaul Lin	li	$r5, 0x0
202445a886dSMacpaul Lin	swi	$r5, [$r4 + FTSDMC021_BANK2_BSR]
203445a886dSMacpaul Lin	swi	$r5, [$r4 + FTSDMC021_BANK3_BSR]
204445a886dSMacpaul Lin
205445a886dSMacpaul Lin#ifdef CONFIG_MEM_REMAP
206445a886dSMacpaul Lin	/*
207445a886dSMacpaul Lin	 * Copy ROM code to SDRAM base for memory remap layout.
208445a886dSMacpaul Lin	 * This is not the real relocation, the real relocation is the function
209445a886dSMacpaul Lin	 * relocate_code() is start.S which supports the systems is memory
210445a886dSMacpaul Lin	 * remapped or not.
211445a886dSMacpaul Lin	 */
212445a886dSMacpaul Lin	/*
213445a886dSMacpaul Lin	 * Doing memory remap is essential for preparing some non-OS or RTOS
214445a886dSMacpaul Lin	 * applications.
215445a886dSMacpaul Lin	 *
216445a886dSMacpaul Lin	 * This is also a must on ADP-AG101 board.
217445a886dSMacpaul Lin	 * The reason is because the ROM/FLASH circuit on PCB board.
218445a886dSMacpaul Lin	 * AG101-A0 board has 2 jumpers MA17 and SW5 to configure which
219445a886dSMacpaul Lin	 * ROM/FLASH is used to boot.
220445a886dSMacpaul Lin	 *
221445a886dSMacpaul Lin	 * When SW5 = "0101", MA17 = LO, the ROM is connected to BANK0,
222445a886dSMacpaul Lin	 * and the FLASH is connected to BANK1.
223445a886dSMacpaul Lin	 * When SW5 = "1010", MA17 = HI, the ROM is disabled (still at BANK0),
224445a886dSMacpaul Lin	 * and the FLASH is connected to BANK0.
225445a886dSMacpaul Lin	 * It will occur problem when doing flash probing if the flash is at
226445a886dSMacpaul Lin	 * BANK0 (0x00000000) while memory remapping was skipped.
227445a886dSMacpaul Lin	 *
228445a886dSMacpaul Lin	 * Other board like ADP-AG101P may not enable this since there is only
229445a886dSMacpaul Lin	 * a FLASH connected to bank0.
230445a886dSMacpaul Lin	 */
231445a886dSMacpaul Lin	led	0x11
232f889cc81Srick   /*
233f889cc81Srick    * for Orca and Emerald
234f889cc81Srick    * read sdram base address automatically
235f889cc81Srick    */
236f889cc81Srick	li	$r5, AHBC_BSR6_A
237f889cc81Srick	lwi $r8, [$r5]
238d607f6faSrick	li	$r4, 0xfff00000   /* r4 = bank6 base */
239f889cc81Srick	and $r4, $r4, $r8
240f889cc81Srick
241d607f6faSrick	la	$r5, _start@GOTOFF
242d607f6faSrick	la  $r6, _end@GOTOFF
243445a886dSMacpaul Lin1:
244445a886dSMacpaul Lin	lwi.p	$r7, [$r5], #4
245445a886dSMacpaul Lin	swi.p	$r7, [$r4], #4
246445a886dSMacpaul Lin	blt	$r5, $r6, 1b
247445a886dSMacpaul Lin
248445a886dSMacpaul Lin	/* set remap bit */
249445a886dSMacpaul Lin	/*
250445a886dSMacpaul Lin	 * MEM remap bit is operational
251445a886dSMacpaul Lin	 * - use it to map writeable memory at 0x00000000, in place of flash
252445a886dSMacpaul Lin	 * - before remap: flash/rom 0x00000000, sdram: 0x10000000-0x4fffffff
253445a886dSMacpaul Lin	 * - after  remap: flash/rom 0x80000000, sdram: 0x00000000
254445a886dSMacpaul Lin	 */
255445a886dSMacpaul Lin	led	0x1c
2563c016704Sken kuo	write32 SDMC_B0_BSR_A, 0x00001000
2572e88bb28SKun-Hua Huang	write32 SDMC_B1_BSR_A, 0x00001200
2582e88bb28SKun-Hua Huang	li $r5, CONFIG_SYS_TEXT_BASE	/* flash base address */
2592e88bb28SKun-Hua Huang	add $r11, $r11, $r5	/* add flash address offset for ret */
2602e88bb28SKun-Hua Huang	add $r10, $r10, $r5
2612e88bb28SKun-Hua Huang	move $lp, $r11
262445a886dSMacpaul Lin	setbf15	AHBC_CR_A, FTAHBC020S_CR_REMAP		! 0x1
263445a886dSMacpaul Lin
264f889cc81Srick  /*
265f889cc81Srick   * for Orca and Emerald
266f889cc81Srick   * extend sdram size from 256MB to 2GB
267f889cc81Srick   */
268f889cc81Srick	li	$r5, AHBC_BSR6_A
269f889cc81Srick	lwi $r6, [$r5]
270f889cc81Srick	li  $r4, 0xfff0ffff
271f889cc81Srick	and $r6 ,$r4, $r6
272f889cc81Srick	li	$r4, 0x000b0000
273f889cc81Srick	or  $r6, $r4, $r6
274f889cc81Srick	swi	$r6, [$r5]
275f889cc81Srick
276f889cc81Srick  /*
277f889cc81Srick   * for Orca and Emerald
278f889cc81Srick   * extend rom base from 256MB to 2GB
279f889cc81Srick   */
280f889cc81Srick	li	$r4, AHBC_BSR4_A
281f889cc81Srick	lwi $r5, [$r4]
282f889cc81Srick	li	$r6, 0xffffff
283f889cc81Srick	and $r5, $r5, $r6
284f889cc81Srick	li  $r6, 0x80000000
285f889cc81Srick	or  $r5, $r5, $r6
286f889cc81Srick	swi $r5,	[$r4]
287445a886dSMacpaul Lin#endif /* #ifdef CONFIG_MEM_REMAP */
288445a886dSMacpaul Lin	move $lp, $r11
289445a886dSMacpaul Lin2:
290445a886dSMacpaul Lin	ret
291445a886dSMacpaul Lin
292c54fd3efSken kuo	/*
293c54fd3efSken kuo	 * enable_fpu:
294c54fd3efSken kuo	 *  Some of Andes CPU version support FPU coprocessor, if so,
295c54fd3efSken kuo	 *  and toolchain support FPU instruction set, we should enable it.
296c54fd3efSken kuo	 */
297c54fd3efSken kuo#if (defined(NDS32_EXT_FPU_DP) || defined(NDS32_EXT_FPU_SP))
298c54fd3efSken kuoenable_fpu:
299c54fd3efSken kuo	mfsr    $r0, $CPU_VER     /* enable FPU if it exists */
300c54fd3efSken kuo	srli    $r0, $r0, 3
301c54fd3efSken kuo	andi    $r0, $r0, 1
302c54fd3efSken kuo	beqz    $r0, 1f           /* skip if no COP */
303c54fd3efSken kuo	mfsr    $r0, $FUCOP_EXIST
304c54fd3efSken kuo	srli    $r0, $r0, 31
305c54fd3efSken kuo	beqz    $r0, 1f           /* skip if no FPU */
306c54fd3efSken kuo	mfsr    $r0, $FUCOP_CTL
307c54fd3efSken kuo	ori     $r0, $r0, 1
308c54fd3efSken kuo	mtsr    $r0, $FUCOP_CTL
309c54fd3efSken kuo1:
310c54fd3efSken kuo	ret
311c54fd3efSken kuo#endif
312c54fd3efSken kuo
313445a886dSMacpaul Lin.globl show_led
314445a886dSMacpaul Linshow_led:
315445a886dSMacpaul Lin    li      $r8, (CONFIG_DEBUG_LED)
316445a886dSMacpaul Lin    swi     $r7, [$r8]
317445a886dSMacpaul Lin    ret
318445a886dSMacpaul Lin#endif /* #ifndef CONFIG_SKIP_LOWLEVEL_INIT */
319