/*
 * Copyright 2017 NXP
 *
 * SPDX-License-Identifier:	GPL-2.0+
 *
 * Generated code from MX8M_DDR_tool
 */

#include "ddr.h"
#include <asm/arch/clock.h>
#include <asm/arch/ddr_memory_map.h>
#include <asm/io.h>
#include <common.h>
#include <errno.h>

#ifndef SRC_DDRC_RCR_ADDR
#define SRC_DDRC_RCR_ADDR SRC_IPS_BASE_ADDR + 0x1000
#endif
#ifndef DDR_CSD1_BASE_ADDR
#define DDR_CSD1_BASE_ADDR 0x40000000
#endif
#define SILICON_TRAIN

void ddr_cfg_phy_micron_1gb(void);
static volatile unsigned int tmp, tmp_t, i;
void ddr_init_micron_1gb(void)
{
	/** Initialize DDR clock and DDRC registers **/
	reg32_write(0x3038a088, 0x7070000);
	reg32_write(0x3038a084, 0x4030000);
	reg32_write(0x303a00ec, 0xffff);
	tmp = reg32_read(0x303a00f8);
	tmp |= 0x20;
	reg32_write(0x303a00f8, tmp);
	reg32_write(0x30391000, 0x8f000000);
	reg32_write(0x30391004, 0x8f000000);
	reg32_write(0x30360068, 0xece580);
	tmp = reg32_read(0x30360060);
	tmp &= ~0x80;
	reg32_write(0x30360060, tmp);
	tmp = reg32_read(0x30360060);
	tmp |= 0x200;
	reg32_write(0x30360060, tmp);
	tmp = reg32_read(0x30360060);
	tmp &= ~0x20;
	reg32_write(0x30360060, tmp);
	tmp = reg32_read(0x30360060);
	tmp &= ~0x10;
	reg32_write(0x30360060, tmp);
	do {
		tmp = reg32_read(0x30360060);
		if (tmp & 0x80000000)
			break;
	} while (1);
	reg32_write(0x30391000, 0x8f000006);
	reg32_write(0x3d400304, 0x1);
	reg32_write(0x3d400030, 0x1);
	reg32_write(0x3d400000, 0xa1080020);
	reg32_write(0x3d400028, 0x0);
	reg32_write(0x3d400020, 0x203);
	reg32_write(0x3d400024, 0x186a000);
	reg32_write(0x3d400064, 0x610090);
	reg32_write(0x3d4000d0, 0xc003061c);
	reg32_write(0x3d4000d4, 0x9e0000);
	reg32_write(0x3d4000dc, 0xd4002d);
	reg32_write(0x3d4000e0, 0x310008);
	reg32_write(0x3d4000e8, 0x66004a);
	reg32_write(0x3d4000ec, 0x16004a);
	reg32_write(0x3d400100, 0x1a201b22);
	reg32_write(0x3d400104, 0x60633);
	reg32_write(0x3d40010c, 0xc0c000);
	reg32_write(0x3d400110, 0xf04080f);
	reg32_write(0x3d400114, 0x2040c0c);
	reg32_write(0x3d400118, 0x1010007);
	reg32_write(0x3d40011c, 0x401);
	reg32_write(0x3d400130, 0x20600);
	reg32_write(0x3d400134, 0xc100002);
	reg32_write(0x3d400138, 0x96);
	reg32_write(0x3d400144, 0xa00050);
	reg32_write(0x3d400180, 0xc3200018);
	reg32_write(0x3d400184, 0x28061a8);
	reg32_write(0x3d400188, 0x0);
	reg32_write(0x3d400190, 0x497820a);
	reg32_write(0x3d400194, 0x80303);
	reg32_write(0x3d4001a0, 0xe0400018);
	reg32_write(0x3d4001a4, 0xdf00e4);
	reg32_write(0x3d4001a8, 0x80000000);
	reg32_write(0x3d4001b0, 0x11);
	reg32_write(0x3d4001b4, 0x170a);
	reg32_write(0x3d4001c0, 0x1);
	reg32_write(0x3d4001c4, 0x1);
	reg32_write(0x3d4000f4, 0x639);
	reg32_write(0x3d400108, 0x70e1214);
	reg32_write(0x3d400200, 0x1f);
	reg32_write(0x3d40020c, 0x0);
	reg32_write(0x3d400210, 0x1f1f);
	reg32_write(0x3d400204, 0x80808);
	reg32_write(0x3d400214, 0x7070707);
	reg32_write(0x3d400218, 0xf070707);
	reg32_write(0x3d402020, 0x1);
	reg32_write(0x3d402024, 0x518b00);
	reg32_write(0x3d402050, 0x20d040);
	reg32_write(0x3d402064, 0x14001f);
	reg32_write(0x3d4020dc, 0x940009);
	reg32_write(0x3d4020e0, 0x310000);
	reg32_write(0x3d4020e8, 0x66004a);
	reg32_write(0x3d4020ec, 0x16004a);
	reg32_write(0x3d402100, 0xb070508);
	reg32_write(0x3d402104, 0x3040b);
	reg32_write(0x3d402108, 0x305090c);
	reg32_write(0x3d40210c, 0x505000);
	reg32_write(0x3d402110, 0x4040204);
	reg32_write(0x3d402114, 0x2030303);
	reg32_write(0x3d402118, 0x1010004);
	reg32_write(0x3d40211c, 0x301);
	reg32_write(0x3d402130, 0x20300);
	reg32_write(0x3d402134, 0xa100002);
	reg32_write(0x3d402138, 0x20);
	reg32_write(0x3d402144, 0x220011);
	reg32_write(0x3d402180, 0xc0a70006);
	reg32_write(0x3d402190, 0x3858202);
	reg32_write(0x3d402194, 0x80303);
	reg32_write(0x3d4021b4, 0x502);
	reg32_write(0x3d400244, 0x0);
	reg32_write(0x3d400250, 0x29001505);
	reg32_write(0x3d400254, 0x2c);
	reg32_write(0x3d40025c, 0x5900575b);
	reg32_write(0x3d400264, 0x90000096);
	reg32_write(0x3d40026c, 0x1000012c);
	reg32_write(0x3d400300, 0x16);
	reg32_write(0x3d400304, 0x0);
	reg32_write(0x3d40030c, 0x0);
	reg32_write(0x3d400320, 0x1);
	reg32_write(0x3d40036c, 0x11);
	reg32_write(0x3d400400, 0x111);
	reg32_write(0x3d400404, 0x10f3);
	reg32_write(0x3d400408, 0x72ff);
	reg32_write(0x3d400490, 0x1);
	reg32_write(0x3d400494, 0xe00);
	reg32_write(0x3d400498, 0x62ffff);
	reg32_write(0x3d40049c, 0xe00);
	reg32_write(0x3d4004a0, 0xffff);
	reg32_write(0x30391000, 0x8f000004);
	reg32_write(0x30391000, 0x8f000000);
	reg32_write(0x3d400030, 0xa8);
	do {
		tmp = reg32_read(0x3d400004);
		if (tmp & 0x223)
			break;
	} while (1);
	reg32_write(0x3d400320, 0x0);
	reg32_write(0x3d000000, 0x1);
	reg32_write(0x3d4001b0, 0x10);
	reg32_write(0x3c040280, 0x0);
	reg32_write(0x3c040284, 0x1);
	reg32_write(0x3c040288, 0x2);
	reg32_write(0x3c04028c, 0x3);
	reg32_write(0x3c040290, 0x4);
	reg32_write(0x3c040294, 0x5);
	reg32_write(0x3c040298, 0x6);
	reg32_write(0x3c04029c, 0x7);
	reg32_write(0x3c044280, 0x0);
	reg32_write(0x3c044284, 0x1);
	reg32_write(0x3c044288, 0x2);
	reg32_write(0x3c04428c, 0x3);
	reg32_write(0x3c044290, 0x4);
	reg32_write(0x3c044294, 0x5);
	reg32_write(0x3c044298, 0x6);
	reg32_write(0x3c04429c, 0x7);
	reg32_write(0x3c048280, 0x0);
	reg32_write(0x3c048284, 0x1);
	reg32_write(0x3c048288, 0x2);
	reg32_write(0x3c04828c, 0x3);
	reg32_write(0x3c048290, 0x4);
	reg32_write(0x3c048294, 0x5);
	reg32_write(0x3c048298, 0x6);
	reg32_write(0x3c04829c, 0x7);
	reg32_write(0x3c04c280, 0x0);
	reg32_write(0x3c04c284, 0x1);
	reg32_write(0x3c04c288, 0x2);
	reg32_write(0x3c04c28c, 0x3);
	reg32_write(0x3c04c290, 0x4);
	reg32_write(0x3c04c294, 0x5);
	reg32_write(0x3c04c298, 0x6);
	reg32_write(0x3c04c29c, 0x7);

	/* Configure DDR PHY's registers */
	ddr_cfg_phy_micron_1gb();

	reg32_write(DDRC_RFSHCTL3(0), 0x00000000);
	reg32_write(DDRC_SWCTL(0), 0x0000);
	/*
	 * ------------------- 9 -------------------
	 * Set DFIMISC.dfi_init_start to 1
	 *  -----------------------------------------
	 */
	reg32_write(DDRC_DFIMISC(0), 0x00000030);
	reg32_write(DDRC_SWCTL(0), 0x0001);

	/* wait DFISTAT.dfi_init_complete to 1 */
	tmp_t = 0;
	while (tmp_t == 0) {
		tmp = reg32_read(DDRC_DFISTAT(0));
		tmp_t = tmp & 0x01;
		tmp = reg32_read(DDRC_MRSTAT(0));
	}

	reg32_write(DDRC_SWCTL(0), 0x0000);

	/* clear DFIMISC.dfi_init_complete_en */
	reg32_write(DDRC_DFIMISC(0), 0x00000010);
	reg32_write(DDRC_DFIMISC(0), 0x00000011);
	reg32_write(DDRC_PWRCTL(0), 0x00000088);

	tmp = reg32_read(DDRC_CRCPARSTAT(0));
	/*
	 * set SWCTL.sw_done to enable quasi-dynamic register
	 * programming outside reset.
	 */
	reg32_write(DDRC_SWCTL(0), 0x00000001);

	/* wait SWSTAT.sw_done_ack to 1 */
	while ((reg32_read(DDRC_SWSTAT(0)) & 0x1) == 0)
		;

	/* wait STAT.operating_mode([1:0] for ddr3) to normal state */
	while ((reg32_read(DDRC_STAT(0)) & 0x3) != 0x1)
		;

	reg32_write(DDRC_PWRCTL(0), 0x00000088);
	/* reg32_write(DDRC_PWRCTL(0), 0x018a); */
	tmp = reg32_read(DDRC_CRCPARSTAT(0));

	/* enable port 0 */
	reg32_write(DDRC_PCTRL_0(0), 0x00000001);
	/* enable DDR auto-refresh mode */
	tmp = reg32_read(DDRC_RFSHCTL3(0)) & ~0x1;
	reg32_write(DDRC_RFSHCTL3(0), tmp);
}
