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