xref: /rk3399_rockchip-uboot/board/bachmann/ot1200/ot1200_spl.c (revision 16f416661ec5ffa46b3f879a0b83907bbec13714)
153249171SChristian Gmeiner /*
253249171SChristian Gmeiner  * Copyright (C) 2015, Bachmann electronic GmbH
353249171SChristian Gmeiner  *
453249171SChristian Gmeiner  * SPDX-License-Identifier:     GPL-2.0+
553249171SChristian Gmeiner  */
653249171SChristian Gmeiner 
753249171SChristian Gmeiner #include <common.h>
853249171SChristian Gmeiner #include <spl.h>
953249171SChristian Gmeiner #include <asm/arch/mx6-ddr.h>
1053249171SChristian Gmeiner 
1153249171SChristian Gmeiner DECLARE_GLOBAL_DATA_PTR;
1253249171SChristian Gmeiner 
1353249171SChristian Gmeiner /* Configure MX6Q/DUAL mmdc DDR io registers */
1453249171SChristian Gmeiner static struct mx6dq_iomux_ddr_regs ot1200_ddr_ioregs = {
1553249171SChristian Gmeiner 	/* SDCLK[0:1], CAS, RAS, Reset: Differential input, 48ohm */
1653249171SChristian Gmeiner 	.dram_sdclk_0   = 0x00000028,
1753249171SChristian Gmeiner 	.dram_sdclk_1   = 0x00000028,
1853249171SChristian Gmeiner 	.dram_cas       = 0x00000028,
1953249171SChristian Gmeiner 	.dram_ras       = 0x00000028,
2053249171SChristian Gmeiner 	.dram_reset     = 0x00000028,
2153249171SChristian Gmeiner 	/* SDCKE[0:1]: 100k pull-up */
2253249171SChristian Gmeiner 	.dram_sdcke0    = 0x00003000,
2353249171SChristian Gmeiner 	.dram_sdcke1    = 0x00003000,
2453249171SChristian Gmeiner 	/* SDBA2: pull-up disabled */
2553249171SChristian Gmeiner 	.dram_sdba2	    = 0x00000000,
2653249171SChristian Gmeiner 	/* SDODT[0:1]: 100k pull-up, 48 ohm */
2753249171SChristian Gmeiner 	.dram_sdodt0    = 0x00000028,
2853249171SChristian Gmeiner 	.dram_sdodt1    = 0x00000028,
2953249171SChristian Gmeiner 	/* SDQS[0:7]: Differential input, 48 ohm */
3053249171SChristian Gmeiner 	.dram_sdqs0     = 0x00000028,
3153249171SChristian Gmeiner 	.dram_sdqs1     = 0x00000028,
3253249171SChristian Gmeiner 	.dram_sdqs2     = 0x00000028,
3353249171SChristian Gmeiner 	.dram_sdqs3     = 0x00000028,
3453249171SChristian Gmeiner 	.dram_sdqs4     = 0x00000028,
3553249171SChristian Gmeiner 	.dram_sdqs5     = 0x00000028,
3653249171SChristian Gmeiner 	.dram_sdqs6     = 0x00000028,
3753249171SChristian Gmeiner 	.dram_sdqs7     = 0x00000028,
3853249171SChristian Gmeiner 	/* DQM[0:7]: Differential input, 48 ohm */
3953249171SChristian Gmeiner 	.dram_dqm0      = 0x00000028,
4053249171SChristian Gmeiner 	.dram_dqm1      = 0x00000028,
4153249171SChristian Gmeiner 	.dram_dqm2      = 0x00000028,
4253249171SChristian Gmeiner 	.dram_dqm3      = 0x00000028,
4353249171SChristian Gmeiner 	.dram_dqm4      = 0x00000028,
4453249171SChristian Gmeiner 	.dram_dqm5      = 0x00000028,
4553249171SChristian Gmeiner 	.dram_dqm6      = 0x00000028,
4653249171SChristian Gmeiner 	.dram_dqm7      = 0x00000028,
4753249171SChristian Gmeiner };
4853249171SChristian Gmeiner 
4953249171SChristian Gmeiner /* Configure MX6Q/DUAL mmdc GRP io registers */
5053249171SChristian Gmeiner static struct mx6dq_iomux_grp_regs ot1200_grp_ioregs = {
5153249171SChristian Gmeiner 	/* DDR3 */
5253249171SChristian Gmeiner 	.grp_ddr_type    = 0x000c0000,
5353249171SChristian Gmeiner 	.grp_ddrmode_ctl = 0x00020000,
5453249171SChristian Gmeiner 	/* Disable DDR pullups */
5553249171SChristian Gmeiner 	.grp_ddrpke      = 0x00000000,
5653249171SChristian Gmeiner 	/* ADDR[00:16], SDBA[0:1]: 48 ohm */
5753249171SChristian Gmeiner 	.grp_addds       = 0x00000028,
5853249171SChristian Gmeiner 	/* CS0/CS1/SDBA2/CKE0/CKE1/SDWE: 48 ohm */
5953249171SChristian Gmeiner 	.grp_ctlds       = 0x00000028,
6053249171SChristian Gmeiner 	/* DATA[00:63]: Differential input, 48 ohm */
6153249171SChristian Gmeiner 	.grp_ddrmode     = 0x00020000,
6253249171SChristian Gmeiner 	.grp_b0ds        = 0x00000028,
6353249171SChristian Gmeiner 	.grp_b1ds        = 0x00000028,
6453249171SChristian Gmeiner 	.grp_b2ds        = 0x00000028,
6553249171SChristian Gmeiner 	.grp_b3ds        = 0x00000028,
6653249171SChristian Gmeiner 	.grp_b4ds        = 0x00000028,
6753249171SChristian Gmeiner 	.grp_b5ds        = 0x00000028,
6853249171SChristian Gmeiner 	.grp_b6ds        = 0x00000028,
6953249171SChristian Gmeiner 	.grp_b7ds        = 0x00000028,
7053249171SChristian Gmeiner };
7153249171SChristian Gmeiner 
7253249171SChristian Gmeiner static struct mx6_ddr_sysinfo ot1200_ddr_sysinfo = {
7353249171SChristian Gmeiner 	/* Width of data bus: 0=16, 1=32, 2=64 */
7453249171SChristian Gmeiner 	.dsize      = 2,
7553249171SChristian Gmeiner 	/* config for full 4GB range so that get_mem_size() works */
7653249171SChristian Gmeiner 	.cs_density = 32, /* 32Gb per CS */
7753249171SChristian Gmeiner 	/* Single chip select */
7853249171SChristian Gmeiner 	.ncs        = 1,
7953249171SChristian Gmeiner 	.cs1_mirror = 0,	/* war 0 */
8053249171SChristian Gmeiner 	.rtt_wr     = 1,	/* DDR3_RTT_60_OHM - RTT_Wr = RZQ/4 */
8153249171SChristian Gmeiner 	.rtt_nom    = 1,	/* DDR3_RTT_60_OHM - RTT_Nom = RZQ/4 */
8253249171SChristian Gmeiner 	.walat      = 1,	/* Write additional latency */
8353249171SChristian Gmeiner 	.ralat      = 5,	/* Read additional latency */
8453249171SChristian Gmeiner 	.mif3_mode  = 3,	/* Command prediction working mode */
8553249171SChristian Gmeiner 	.bi_on      = 1,	/* Bank interleaving enabled */	/* war 1 */
8653249171SChristian Gmeiner 	.sde_to_rst = 0x10,	/* 14 cycles, 200us (JEDEC default) */
8753249171SChristian Gmeiner 	.rst_to_cke = 0x23,	/* 33 cycles, 500us (JEDEC default) */
88*edf00937SFabio Estevam 	.refsel = 1,		/* Refresh cycles at 32KHz */
89*edf00937SFabio Estevam 	.refr = 7,		/* 8 refresh commands per refresh cycle */
9053249171SChristian Gmeiner };
9153249171SChristian Gmeiner 
9253249171SChristian Gmeiner /* MT41K128M16JT-125 */
9353249171SChristian Gmeiner static struct mx6_ddr3_cfg micron_2gib_1600 = {
9453249171SChristian Gmeiner 	.mem_speed = 1600,
9553249171SChristian Gmeiner 	.density   = 2,
9653249171SChristian Gmeiner 	.width     = 16,
9753249171SChristian Gmeiner 	.banks     = 8,
9853249171SChristian Gmeiner 	.rowaddr   = 14,
9953249171SChristian Gmeiner 	.coladdr   = 10,
10053249171SChristian Gmeiner 	.pagesz    = 2,
10153249171SChristian Gmeiner 	.trcd      = 1375,
10253249171SChristian Gmeiner 	.trcmin    = 4875,
10353249171SChristian Gmeiner 	.trasmin   = 3500,
10453249171SChristian Gmeiner 	.SRT       = 1,
10553249171SChristian Gmeiner };
10653249171SChristian Gmeiner 
10753249171SChristian Gmeiner static struct mx6_mmdc_calibration micron_2gib_1600_mmdc_calib = {
10853249171SChristian Gmeiner 	/* write leveling calibration determine */
10953249171SChristian Gmeiner 	.p0_mpwldectrl0 = 0x00260025,
11053249171SChristian Gmeiner 	.p0_mpwldectrl1 = 0x00270021,
11153249171SChristian Gmeiner 	.p1_mpwldectrl0 = 0x00180034,
11253249171SChristian Gmeiner 	.p1_mpwldectrl1 = 0x00180024,
11353249171SChristian Gmeiner 	/* Read DQS Gating calibration */
11453249171SChristian Gmeiner 	.p0_mpdgctrl0   = 0x04380344,
11553249171SChristian Gmeiner 	.p0_mpdgctrl1   = 0x0330032C,
11653249171SChristian Gmeiner 	.p1_mpdgctrl0   = 0x0338033C,
11753249171SChristian Gmeiner 	.p1_mpdgctrl1   = 0x032C0300,
11853249171SChristian Gmeiner 	/* Read Calibration: DQS delay relative to DQ read access */
11953249171SChristian Gmeiner 	.p0_mprddlctl   = 0x3C2E3238,
12053249171SChristian Gmeiner 	.p1_mprddlctl   = 0x3A2E303C,
12153249171SChristian Gmeiner 	/* Write Calibration: DQ/DM delay relative to DQS write access */
12253249171SChristian Gmeiner 	.p0_mpwrdlctl   = 0x36384036,
12353249171SChristian Gmeiner 	.p1_mpwrdlctl   = 0x442E4438,
12453249171SChristian Gmeiner };
12553249171SChristian Gmeiner 
ot1200_spl_dram_init(void)12653249171SChristian Gmeiner static void ot1200_spl_dram_init(void)
12753249171SChristian Gmeiner {
12853249171SChristian Gmeiner 	mx6dq_dram_iocfg(64, &ot1200_ddr_ioregs, &ot1200_grp_ioregs);
12953249171SChristian Gmeiner 	mx6_dram_cfg(&ot1200_ddr_sysinfo, &micron_2gib_1600_mmdc_calib,
13053249171SChristian Gmeiner 		     &micron_2gib_1600);
13153249171SChristian Gmeiner }
13253249171SChristian Gmeiner 
13353249171SChristian Gmeiner /*
13453249171SChristian Gmeiner  * called from C runtime startup code (arch/arm/lib/crt0.S:_main)
13553249171SChristian Gmeiner  * - we have a stack and a place to store GD, both in SRAM
13653249171SChristian Gmeiner  * - no variable global data is available
13753249171SChristian Gmeiner  */
board_init_f(ulong dummy)13853249171SChristian Gmeiner void board_init_f(ulong dummy)
13953249171SChristian Gmeiner {
14053249171SChristian Gmeiner 	/* setup AIPS and disable watchdog */
14153249171SChristian Gmeiner 	arch_cpu_init();
14253249171SChristian Gmeiner 
14353249171SChristian Gmeiner 	/* iomux and setup of i2c */
14453249171SChristian Gmeiner 	board_early_init_f();
14553249171SChristian Gmeiner 
14653249171SChristian Gmeiner 	/* setup GP timer */
14753249171SChristian Gmeiner 	timer_init();
14853249171SChristian Gmeiner 
14953249171SChristian Gmeiner 	/* UART clocks enabled and gd valid - init serial console */
15053249171SChristian Gmeiner 	preloader_console_init();
15153249171SChristian Gmeiner 
15253249171SChristian Gmeiner 	/* configure MMDC for SDRAM width/size and per-model calibration */
15353249171SChristian Gmeiner 	ot1200_spl_dram_init();
15453249171SChristian Gmeiner 
15553249171SChristian Gmeiner 	/* Clear the BSS. */
15653249171SChristian Gmeiner 	memset(__bss_start, 0, __bss_end - __bss_start);
15753249171SChristian Gmeiner 
15853249171SChristian Gmeiner 	/* load/boot image from boot device */
15953249171SChristian Gmeiner 	board_init_r(NULL, 0);
16053249171SChristian Gmeiner }
161