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, µn_2gib_1600_mmdc_calib,
13053249171SChristian Gmeiner µn_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