xref: /rk3399_rockchip-uboot/arch/arm/mach-orion5x/lowlevel_init.S (revision 57dc53a72460e8e301fa1cc7951b41db8e731485)
13e93b4e6SMasahiro Yamada/*
23e93b4e6SMasahiro Yamada * Copyright (C) 2010 Albert ARIBAUD <albert.u.boot@aribaud.net>
33e93b4e6SMasahiro Yamada *
43e93b4e6SMasahiro Yamada * (C) Copyright 2009
53e93b4e6SMasahiro Yamada * Marvell Semiconductor <www.marvell.com>
63e93b4e6SMasahiro Yamada * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
73e93b4e6SMasahiro Yamada *
83e93b4e6SMasahiro Yamada * SPDX-License-Identifier:	GPL-2.0+
93e93b4e6SMasahiro Yamada */
103e93b4e6SMasahiro Yamada
113e93b4e6SMasahiro Yamada#include <config.h>
123e93b4e6SMasahiro Yamada#include "asm/arch/orion5x.h"
133e93b4e6SMasahiro Yamada
143e93b4e6SMasahiro Yamada/*
153e93b4e6SMasahiro Yamada * Configuration values for SDRAM access setup
163e93b4e6SMasahiro Yamada */
173e93b4e6SMasahiro Yamada
183e93b4e6SMasahiro Yamada#define SDRAM_CONFIG			0x3148400
193e93b4e6SMasahiro Yamada#define SDRAM_MODE			0x62
203e93b4e6SMasahiro Yamada#define SDRAM_CONTROL			0x4041000
213e93b4e6SMasahiro Yamada#define SDRAM_TIME_CTRL_LOW		0x11602220
223e93b4e6SMasahiro Yamada#define SDRAM_TIME_CTRL_HI		0x40c
233e93b4e6SMasahiro Yamada#define SDRAM_OPEN_PAGE_EN		0x0
243e93b4e6SMasahiro Yamada/* DDR 1 2x 32M NANYA NT5DS16M16CS-6K ==> 64MB */
253e93b4e6SMasahiro Yamada#define SDRAM_BANK0_SIZE		0x3ff0001
263e93b4e6SMasahiro Yamada#define SDRAM_ADDR_CTRL			0x10
273e93b4e6SMasahiro Yamada
283e93b4e6SMasahiro Yamada#define SDRAM_OP_NOP			0x05
293e93b4e6SMasahiro Yamada#define SDRAM_OP_SETMODE		0x03
303e93b4e6SMasahiro Yamada
313e93b4e6SMasahiro Yamada#define SDRAM_PAD_CTRL_WR_EN		0x80000000
323e93b4e6SMasahiro Yamada#define SDRAM_PAD_CTRL_TUNE_EN		0x00010000
333e93b4e6SMasahiro Yamada#define SDRAM_PAD_CTRL_DRVN_MASK	0x0000003f
343e93b4e6SMasahiro Yamada#define SDRAM_PAD_CTRL_DRVP_MASK	0x00000fc0
353e93b4e6SMasahiro Yamada
363e93b4e6SMasahiro Yamada/*
373e93b4e6SMasahiro Yamada * For Guideline MEM-3 - Drive Strength value
383e93b4e6SMasahiro Yamada */
393e93b4e6SMasahiro Yamada
403e93b4e6SMasahiro Yamada#define DDR1_PAD_STRENGTH_DEFAULT	0x00001000
413e93b4e6SMasahiro Yamada#define SDRAM_PAD_CTRL_DRV_STR_MASK	0x00003000
423e93b4e6SMasahiro Yamada
433e93b4e6SMasahiro Yamada/*
443e93b4e6SMasahiro Yamada * For Guideline MEM-4 - DQS Reference Delay Tuning
453e93b4e6SMasahiro Yamada */
463e93b4e6SMasahiro Yamada
473e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_MASK		0x000000f0
483e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_H_MASK		0x00000100
493e93b4e6SMasahiro Yamada
503e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_333_167		0x00000000
513e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_500_167		0x00000030
523e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_667_167		0x00000060
533e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_400_200_1	0x000001E0
543e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_400_200		0x00000010
553e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_600_200		0x00000050
563e93b4e6SMasahiro Yamada#define MSAR_ARMDDRCLCK_800_200		0x00000070
573e93b4e6SMasahiro Yamada
583e93b4e6SMasahiro Yamada#define FTDLL_DDR1_166MHZ		0x0047F001
593e93b4e6SMasahiro Yamada
603e93b4e6SMasahiro Yamada#define FTDLL_DDR1_200MHZ		0x0044D001
613e93b4e6SMasahiro Yamada
623e93b4e6SMasahiro Yamada/*
633e93b4e6SMasahiro Yamada * Low-level init happens right after start.S has switched to SVC32,
643e93b4e6SMasahiro Yamada * flushed and disabled caches and disabled MMU. We're still running
659608e7deSAlbert ARIBAUD * from the boot chip select, so the first thing SPL should do is to
669608e7deSAlbert ARIBAUD * set up the RAM to copy U-Boot into.
673e93b4e6SMasahiro Yamada */
683e93b4e6SMasahiro Yamada
693e93b4e6SMasahiro Yamada.globl lowlevel_init
703e93b4e6SMasahiro Yamada
713e93b4e6SMasahiro Yamadalowlevel_init:
723e93b4e6SMasahiro Yamada
739608e7deSAlbert ARIBAUD#ifdef CONFIG_SPL_BUILD
749608e7deSAlbert ARIBAUD
753e93b4e6SMasahiro Yamada	/* Use 'r4 as the base for internal register accesses */
763e93b4e6SMasahiro Yamada	ldr	r4, =ORION5X_REGS_PHY_BASE
773e93b4e6SMasahiro Yamada
783e93b4e6SMasahiro Yamada	/* move internal registers from the default 0xD0000000
793e93b4e6SMasahiro Yamada	 * to their intended location, defined by SoC */
803e93b4e6SMasahiro Yamada	ldr	r3, =0xD0000000
813e93b4e6SMasahiro Yamada	add	r3, r3, #0x20000
823e93b4e6SMasahiro Yamada	str	r4, [r3, #0x80]
833e93b4e6SMasahiro Yamada
843e93b4e6SMasahiro Yamada	/* Use R3 as the base for DRAM registers */
853e93b4e6SMasahiro Yamada	add	r3, r4, #0x01000
863e93b4e6SMasahiro Yamada
873e93b4e6SMasahiro Yamada	/*DDR SDRAM Initialization Control */
883e93b4e6SMasahiro Yamada	ldr	r6, =0x00000001
893e93b4e6SMasahiro Yamada	str	r6, [r3, #0x480]
903e93b4e6SMasahiro Yamada
913e93b4e6SMasahiro Yamada	/* Use R3 as the base for PCI registers */
923e93b4e6SMasahiro Yamada	add	r3, r4, #0x31000
933e93b4e6SMasahiro Yamada
943e93b4e6SMasahiro Yamada	/* Disable arbiter */
953e93b4e6SMasahiro Yamada	ldr	r6, =0x00000030
963e93b4e6SMasahiro Yamada	str	r6, [r3, #0xd00]
973e93b4e6SMasahiro Yamada
983e93b4e6SMasahiro Yamada	/* Use R3 as the base for DRAM registers */
993e93b4e6SMasahiro Yamada	add	r3, r4, #0x01000
1003e93b4e6SMasahiro Yamada
1013e93b4e6SMasahiro Yamada	/* set all dram windows to 0 */
1023e93b4e6SMasahiro Yamada	mov	r6, #0
1033e93b4e6SMasahiro Yamada	str	r6, [r3, #0x504]
1043e93b4e6SMasahiro Yamada	str	r6, [r3, #0x50C]
1053e93b4e6SMasahiro Yamada	str	r6, [r3, #0x514]
1063e93b4e6SMasahiro Yamada	str	r6, [r3, #0x51C]
1073e93b4e6SMasahiro Yamada
1083e93b4e6SMasahiro Yamada	/* 1) Configure SDRAM  */
1093e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_CONFIG
1103e93b4e6SMasahiro Yamada	str	r6, [r3, #0x400]
1113e93b4e6SMasahiro Yamada
1123e93b4e6SMasahiro Yamada	/* 2) Set SDRAM Control reg */
1133e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_CONTROL
1143e93b4e6SMasahiro Yamada	str	r6, [r3, #0x404]
1153e93b4e6SMasahiro Yamada
1163e93b4e6SMasahiro Yamada	/* 3) Write SDRAM address control register */
1173e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_ADDR_CTRL
1183e93b4e6SMasahiro Yamada	str	r6, [r3, #0x410]
1193e93b4e6SMasahiro Yamada
1203e93b4e6SMasahiro Yamada	/* 4) Write SDRAM bank 0 size register */
1213e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_BANK0_SIZE
1223e93b4e6SMasahiro Yamada	str	r6, [r3, #0x504]
1233e93b4e6SMasahiro Yamada	/* keep other banks disabled */
1243e93b4e6SMasahiro Yamada
1253e93b4e6SMasahiro Yamada	/* 5) Write SDRAM open pages control register */
1263e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_OPEN_PAGE_EN
1273e93b4e6SMasahiro Yamada	str	r6, [r3, #0x414]
1283e93b4e6SMasahiro Yamada
1293e93b4e6SMasahiro Yamada	/* 6) Write SDRAM timing Low register */
1303e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_TIME_CTRL_LOW
1313e93b4e6SMasahiro Yamada	str	r6, [r3, #0x408]
1323e93b4e6SMasahiro Yamada
1333e93b4e6SMasahiro Yamada	/* 7) Write SDRAM timing High register */
1343e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_TIME_CTRL_HI
1353e93b4e6SMasahiro Yamada	str	r6, [r3, #0x40C]
1363e93b4e6SMasahiro Yamada
1373e93b4e6SMasahiro Yamada	/* 8) Write SDRAM mode register */
1383e93b4e6SMasahiro Yamada	/* The CPU must not attempt to change the SDRAM Mode register setting */
1393e93b4e6SMasahiro Yamada	/* prior to DRAM controller completion of the DRAM initialization     */
1403e93b4e6SMasahiro Yamada	/* sequence. To guarantee this restriction, it is recommended that    */
1413e93b4e6SMasahiro Yamada	/* the CPU sets the SDRAM Operation register to NOP command, performs */
1423e93b4e6SMasahiro Yamada	/* read polling until the register is back in Normal operation value, */
1433e93b4e6SMasahiro Yamada	/* and then sets SDRAM Mode register to its new value.		      */
1443e93b4e6SMasahiro Yamada
1453e93b4e6SMasahiro Yamada	/* 8.1 write 'nop' to SDRAM operation */
1463e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_OP_NOP
1473e93b4e6SMasahiro Yamada	str	r6, [r3, #0x418]
1483e93b4e6SMasahiro Yamada
1493e93b4e6SMasahiro Yamada	/* 8.2 poll SDRAM operation until back in 'normal' mode.  */
1503e93b4e6SMasahiro Yamada1:
1513e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x418]
1523e93b4e6SMasahiro Yamada	cmp	r6, #0
1533e93b4e6SMasahiro Yamada	bne	1b
1543e93b4e6SMasahiro Yamada
1553e93b4e6SMasahiro Yamada	/* 8.3 Now its safe to write new value to SDRAM Mode register	      */
1563e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_MODE
1573e93b4e6SMasahiro Yamada	str	r6, [r3, #0x41C]
1583e93b4e6SMasahiro Yamada
1593e93b4e6SMasahiro Yamada	/* 8.4 Set new mode */
1603e93b4e6SMasahiro Yamada	ldr	r6, =SDRAM_OP_SETMODE
1613e93b4e6SMasahiro Yamada	str	r6, [r3, #0x418]
1623e93b4e6SMasahiro Yamada
1633e93b4e6SMasahiro Yamada	/* 8.5 poll SDRAM operation until back in 'normal' mode.  */
1643e93b4e6SMasahiro Yamada2:
1653e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x418]
1663e93b4e6SMasahiro Yamada	cmp	r6, #0
1673e93b4e6SMasahiro Yamada	bne	2b
1683e93b4e6SMasahiro Yamada
1693e93b4e6SMasahiro Yamada	/* DDR SDRAM Address/Control Pads Calibration */
1703e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x4C0]
1713e93b4e6SMasahiro Yamada
1723e93b4e6SMasahiro Yamada	/* Set Bit [31] to make the register writable			*/
1733e93b4e6SMasahiro Yamada	orr	r6, r6, #SDRAM_PAD_CTRL_WR_EN
1743e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C0]
1753e93b4e6SMasahiro Yamada
1763e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_WR_EN
1773e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_TUNE_EN
1783e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRVN_MASK
1793e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRVP_MASK
1803e93b4e6SMasahiro Yamada
1813e93b4e6SMasahiro Yamada	/* Get the final N locked value of driving strength [22:17]	*/
1823e93b4e6SMasahiro Yamada	mov	r1, r6
1833e93b4e6SMasahiro Yamada	mov	r1, r1, LSL #9
1843e93b4e6SMasahiro Yamada	mov	r1, r1, LSR #26	 /* r1[5:0]<DrvN>  = r3[22:17]<LockN>	*/
1853e93b4e6SMasahiro Yamada	orr	r1, r1, r1, LSL #6 /* r1[11:6]<DrvP> = r1[5:0]<DrvN>	*/
1863e93b4e6SMasahiro Yamada
1873e93b4e6SMasahiro Yamada	/* Write to both <DrvN> bits [5:0] and <DrvP> bits [11:6]	*/
1883e93b4e6SMasahiro Yamada	orr	r6, r6, r1
1893e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C0]
1903e93b4e6SMasahiro Yamada
1913e93b4e6SMasahiro Yamada	/* DDR SDRAM Data Pads Calibration				*/
1923e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x4C4]
1933e93b4e6SMasahiro Yamada
1943e93b4e6SMasahiro Yamada	/* Set Bit [31] to make the register writable			*/
1953e93b4e6SMasahiro Yamada	orr	r6, r6, #SDRAM_PAD_CTRL_WR_EN
1963e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C4]
1973e93b4e6SMasahiro Yamada
1983e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_WR_EN
1993e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_TUNE_EN
2003e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRVN_MASK
2013e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRVP_MASK
2023e93b4e6SMasahiro Yamada
2033e93b4e6SMasahiro Yamada	/* Get the final N locked value of driving strength [22:17]	*/
2043e93b4e6SMasahiro Yamada	mov	r1, r6
2053e93b4e6SMasahiro Yamada	mov	r1, r1, LSL #9
2063e93b4e6SMasahiro Yamada	mov	r1, r1, LSR #26
2073e93b4e6SMasahiro Yamada	orr	r1, r1, r1, LSL #6 /* r1[5:0] = r3[22:17]<LockN>	*/
2083e93b4e6SMasahiro Yamada
2093e93b4e6SMasahiro Yamada	/* Write to both <DrvN> bits [5:0] and <DrvP> bits [11:6]	*/
2103e93b4e6SMasahiro Yamada	orr	r6, r6, r1
2113e93b4e6SMasahiro Yamada
2123e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C4]
2133e93b4e6SMasahiro Yamada
2143e93b4e6SMasahiro Yamada	/* Implement Guideline (GL# MEM-3) Drive Strength Value		*/
2153e93b4e6SMasahiro Yamada	/* Relevant for: 88F5181-A1/B0/B1 and 88F5281-A0/B0		*/
2163e93b4e6SMasahiro Yamada
2173e93b4e6SMasahiro Yamada	ldr	r1, =DDR1_PAD_STRENGTH_DEFAULT
2183e93b4e6SMasahiro Yamada
2193e93b4e6SMasahiro Yamada	/* Enable writes to DDR SDRAM Addr/Ctrl Pads Calibration register */
2203e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x4C0]
2213e93b4e6SMasahiro Yamada	orr	r6, r6, #SDRAM_PAD_CTRL_WR_EN
2223e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C0]
2233e93b4e6SMasahiro Yamada
2243e93b4e6SMasahiro Yamada	/* Correct strength and disable writes again */
2253e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_WR_EN
2263e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRV_STR_MASK
2273e93b4e6SMasahiro Yamada	orr	r6, r6, r1
2283e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C0]
2293e93b4e6SMasahiro Yamada
2303e93b4e6SMasahiro Yamada	/* Enable writes to DDR SDRAM Data Pads Calibration register */
2313e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x4C4]
2323e93b4e6SMasahiro Yamada	orr	r6, r6, #SDRAM_PAD_CTRL_WR_EN
2333e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C4]
2343e93b4e6SMasahiro Yamada
2353e93b4e6SMasahiro Yamada	/* Correct strength and disable writes again */
2363e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_DRV_STR_MASK
2373e93b4e6SMasahiro Yamada	bic	r6, r6, #SDRAM_PAD_CTRL_WR_EN
2383e93b4e6SMasahiro Yamada	orr	r6, r6, r1
2393e93b4e6SMasahiro Yamada	str	r6, [r3, #0x4C4]
2403e93b4e6SMasahiro Yamada
2413e93b4e6SMasahiro Yamada	/* Implement Guideline (GL# MEM-4) DQS Reference Delay Tuning	*/
2423e93b4e6SMasahiro Yamada	/* Relevant for: 88F5181-A1/B0/B1 and 88F5281-A0/B0		*/
2433e93b4e6SMasahiro Yamada
2443e93b4e6SMasahiro Yamada	/* Get the "sample on reset" register for the DDR frequancy	*/
2453e93b4e6SMasahiro Yamada	ldr	r3, =0x10000
2463e93b4e6SMasahiro Yamada	ldr	r6, [r3, #0x010]
2473e93b4e6SMasahiro Yamada	ldr	r1, =MSAR_ARMDDRCLCK_MASK
2483e93b4e6SMasahiro Yamada	and	r1, r6, r1
2493e93b4e6SMasahiro Yamada
2503e93b4e6SMasahiro Yamada	ldr	r6, =FTDLL_DDR1_166MHZ
2513e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_333_167
2523e93b4e6SMasahiro Yamada	beq	3f
2533e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_500_167
2543e93b4e6SMasahiro Yamada	beq	3f
2553e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_667_167
2563e93b4e6SMasahiro Yamada	beq	3f
2573e93b4e6SMasahiro Yamada
2583e93b4e6SMasahiro Yamada	ldr	r6, =FTDLL_DDR1_200MHZ
2593e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_400_200_1
2603e93b4e6SMasahiro Yamada	beq	3f
2613e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_400_200
2623e93b4e6SMasahiro Yamada	beq	3f
2633e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_600_200
2643e93b4e6SMasahiro Yamada	beq	3f
2653e93b4e6SMasahiro Yamada	cmp	r1, #MSAR_ARMDDRCLCK_800_200
2663e93b4e6SMasahiro Yamada	beq	3f
2673e93b4e6SMasahiro Yamada
2683e93b4e6SMasahiro Yamada	ldr	r6, =0
2693e93b4e6SMasahiro Yamada
2703e93b4e6SMasahiro Yamada3:
2713e93b4e6SMasahiro Yamada	/* Use R3 as the base for DRAM registers */
2723e93b4e6SMasahiro Yamada	add	r3, r4, #0x01000
2733e93b4e6SMasahiro Yamada
2743e93b4e6SMasahiro Yamada	ldr	r2, [r3, #0x484]
2753e93b4e6SMasahiro Yamada	orr	r2, r2, r6
2763e93b4e6SMasahiro Yamada	str	r2, [r3, #0x484]
2773e93b4e6SMasahiro Yamada
2789608e7deSAlbert ARIBAUD	/* enable for 2 GB DDR; detection should find out real amount */
2799608e7deSAlbert ARIBAUD	sub	r6, r6, r6
2809608e7deSAlbert ARIBAUD	str	r6, [r3, #0x500]
2819608e7deSAlbert ARIBAUD	ldr	r6, =0x7fff0001
2829608e7deSAlbert ARIBAUD	str	r6, [r3, #0x504]
2839608e7deSAlbert ARIBAUD
2849608e7deSAlbert ARIBAUD#endif /* CONFIG_SPL_BUILD */
2859608e7deSAlbert ARIBAUD
286*a187559eSBin Meng	/* Return to U-Boot via saved link register */
2873e93b4e6SMasahiro Yamada	mov	pc, lr
288