/*
 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of ARM nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <debug.h>
#include <mmio.h>
#include <plat_private.h>
#include "dram.h"
#include "dram_spec_timing.h"
#include "string.h"
#include "soc.h"
#include "pmu.h"

#include <delay_timer.h>

#define CTL_TRAINING	(1)
#define PI_TRAINING		(!CTL_TRAINING)

#define EN_READ_GATE_TRAINING	(1)
#define EN_CA_TRAINING		(0)
#define EN_WRITE_LEVELING	(0)
#define EN_READ_LEVELING	(0)
#define EN_WDQ_LEVELING	(0)

#define ENPER_CS_TRAINING_FREQ	(933)

struct pll_div {
	unsigned int mhz;
	unsigned int refdiv;
	unsigned int fbdiv;
	unsigned int postdiv1;
	unsigned int postdiv2;
	unsigned int frac;
	unsigned int freq;
};

static const struct pll_div dpll_rates_table[] = {

	/* _mhz, _refdiv, _fbdiv, _postdiv1, _postdiv2 */
	{.mhz = 933, .refdiv = 3, .fbdiv = 350, .postdiv1 = 3, .postdiv2 = 1},
	{.mhz = 800, .refdiv = 1, .fbdiv = 100, .postdiv1 = 3, .postdiv2 = 1},
	{.mhz = 732, .refdiv = 1, .fbdiv = 61, .postdiv1 = 2, .postdiv2 = 1},
	{.mhz = 666, .refdiv = 1, .fbdiv = 111, .postdiv1 = 4, .postdiv2 = 1},
	{.mhz = 600, .refdiv = 1, .fbdiv = 50, .postdiv1 = 2, .postdiv2 = 1},
	{.mhz = 528, .refdiv = 1, .fbdiv = 66, .postdiv1 = 3, .postdiv2 = 1},
	{.mhz = 400, .refdiv = 1, .fbdiv = 50, .postdiv1 = 3, .postdiv2 = 1},
	{.mhz = 300, .refdiv = 1, .fbdiv = 50, .postdiv1 = 4, .postdiv2 = 1},
	{.mhz = 200, .refdiv = 1, .fbdiv = 50, .postdiv1 = 3, .postdiv2 = 2},
};

static struct rk3399_ddr_cic_regs *const rk3399_ddr_cic = (void *)CIC_BASE;
static struct rk3399_ddr_pctl_regs *const rk3399_ddr_pctl[2] = {
	(void *)DDRC0_BASE, (void *)DDRC1_BASE
};

static struct rk3399_ddr_pi_regs *const rk3399_ddr_pi[2] = {
	(void *)DDRC0_PI_BASE, (void *)DDRC1_PI_BASE
};

static struct rk3399_ddr_publ_regs *const rk3399_ddr_publ[2] = {
	(void *)DDRC0_PHY_BASE, (void *)DDRC1_PHY_BASE
};

struct rk3399_dram_status {
	uint32_t current_index;
	uint32_t index_freq[2];
	struct timing_related_config timing_config;
	struct drv_odt_lp_config drv_odt_lp_cfg;
};

static struct rk3399_dram_status rk3399_dram_status;
static struct ddr_dts_config_timing dts_parameter = {
	.available = 0
};

static struct rk3399_sdram_default_config ddr3_default_config = {
	.bl = 8,
	.ap = 0,
	.dramds = 40,
	.dramodt = 120,
	.burst_ref_cnt = 1,
	.zqcsi = 0
};

static struct drv_odt_lp_config ddr3_drv_odt_default_config = {
	.ddr3_speed_bin = DDR3_DEFAULT,
	.pd_idle = 0,
	.sr_idle = 0,
	.sr_mc_gate_idle = 0,
	.srpd_lite_idle = 0,
	.standby_idle = 0,

	.ddr3_dll_dis_freq = 300,
	.phy_dll_dis_freq = 125,
	.odt_dis_freq = 933,

	.dram_side_drv = 40,
	.dram_side_dq_odt = 120,
	.dram_side_ca_odt = 120,

	.phy_side_ca_drv = 40,
	.phy_side_ck_cs_drv = 40,
	.phy_side_dq_drv = 40,
	.phy_side_odt = 240,
};

static struct rk3399_sdram_default_config lpddr3_default_config = {
	.bl = 8,
	.ap = 0,
	.dramds = 34,
	.dramodt = 240,
	.burst_ref_cnt = 1,
	.zqcsi = 0
};

static struct drv_odt_lp_config lpddr3_drv_odt_default_config = {
	.ddr3_speed_bin = DDR3_DEFAULT,
	.pd_idle = 0,
	.sr_idle = 0,
	.sr_mc_gate_idle = 0,
	.srpd_lite_idle = 0,
	.standby_idle = 0,

	.ddr3_dll_dis_freq = 300,
	.phy_dll_dis_freq = 125,
	.odt_dis_freq = 666,

	.dram_side_drv = 40,
	.dram_side_dq_odt = 120,
	.dram_side_ca_odt = 120,

	.phy_side_ca_drv = 40,
	.phy_side_ck_cs_drv = 40,
	.phy_side_dq_drv = 40,
	.phy_side_odt = 240,
};

static struct rk3399_sdram_default_config lpddr4_default_config = {
	.bl = 16,
	.ap = 0,
	.dramds = 40,
	.dramodt = 240,
	.caodt = 240,
	.burst_ref_cnt = 1,
	.zqcsi = 0
};

static struct drv_odt_lp_config lpddr4_drv_odt_default_config = {
	.ddr3_speed_bin = DDR3_DEFAULT,
	.pd_idle = 0,
	.sr_idle = 0,
	.sr_mc_gate_idle = 0,
	.srpd_lite_idle = 0,
	.standby_idle = 0,

	.ddr3_dll_dis_freq = 300,
	.phy_dll_dis_freq = 125,
	.odt_dis_freq = 933,

	.dram_side_drv = 60,
	.dram_side_dq_odt = 40,
	.dram_side_ca_odt = 40,

	.phy_side_ca_drv = 40,
	.phy_side_ck_cs_drv = 80,
	.phy_side_dq_drv = 80,
	.phy_side_odt = 60,
};

uint32_t dcf_code[] = {
#include "dcf_code.inc"
};


#define write_32(addr, value)\
	mmio_write_32((uintptr_t)(addr), (uint32_t)(value))

#define read_32(addr) \
		mmio_read_32((uintptr_t)(addr))
#define clrbits_32(addr, clear)\
		mmio_clrbits_32((uintptr_t)(addr), (uint32_t)(clear))
#define setbits_32(addr, set)\
	mmio_setbits_32((uintptr_t)(addr), (uint32_t)(set))
#define clrsetbits_32(addr, clear, set)\
	mmio_clrsetbits_32((uintptr_t)(addr), (uint32_t)(clear),\
					(uint32_t)(set))

#define DCF_START_ADDR	(SRAM_BASE + 0x1400)
#define DCF_PARAM_ADDR	(SRAM_BASE + 0x1000)

/* DCF_PAMET */
#define PARAM_DRAM_FREQ		(0)
#define PARAM_DPLL_CON0		(4)
#define PARAM_DPLL_CON1		(8)
#define PARAM_DPLL_CON2		(0xc)
#define PARAM_DPLL_CON3		(0x10)
#define PARAM_DPLL_CON4		(0x14)
#define PARAM_DPLL_CON5		(0x18)
/* equal to fn<<4 */
#define PARAM_FREQ_SELECT	(0x1c)

static unsigned int get_cs_die_capability(struct rk3399_sdram_config
					  *psdram_config, unsigned int channel,
					  unsigned int cs)
{
	unsigned int die;
	unsigned int cs_cap;
	unsigned int row[2];

	row[0] = psdram_config->ch[channel].cs0_row;
	row[1] = psdram_config->ch[channel].cs1_row;
	die = psdram_config->ch[channel].bus_width /
	    psdram_config->ch[channel].each_die_bus_width;
	cs_cap = (1 << (row[cs] +
			(psdram_config->ch[channel].bank / 4 + 1) +
			psdram_config->ch[channel].col +
			(psdram_config->ch[channel].bus_width / 16)));
	if (psdram_config->ch[channel].each_die_6gb_or_12gb)
		cs_cap = cs_cap * 3 / 4;

	return (cs_cap / die);
}

static void sdram_config_init(struct rk3399_sdram_config *psdram_config)
{
	uint32_t os_reg2_val, i;

	os_reg2_val = read_32(PMUGRF_BASE + PMUGRF_OSREG(2));

	for (i = 0; i < READ_CH_CNT(os_reg2_val); i++) {
		psdram_config->ch[i].bank = 1 << READ_BK_INFO(os_reg2_val, i);
		psdram_config->ch[i].bus_width =
		    8 * (1 << READ_BW_INFO(os_reg2_val, i));
		psdram_config->ch[i].col = READ_COL_INFO(os_reg2_val, i);
		psdram_config->ch[i].cs0_row =
		    READ_CS0_ROW_INFO(os_reg2_val, i);
		psdram_config->ch[i].cs1_row =
		    READ_CS1_ROW_INFO(os_reg2_val, i);
		psdram_config->ch[i].cs_cnt = READ_CS_INFO(os_reg2_val, i);
		psdram_config->ch[i].each_die_6gb_or_12gb =
		    READ_CH_ROW_INFO(os_reg2_val, i);
		psdram_config->ch[i].each_die_bus_width =
		    8 * (1 << READ_DIE_BW_INFO(os_reg2_val, i));
	}
	psdram_config->dramtype = READ_DRAMTYPE_INFO(os_reg2_val);
	psdram_config->channal_num = READ_CH_CNT(os_reg2_val);
}

static void drv_odt_lp_cfg_init(uint32_t dram_type,
				struct ddr_dts_config_timing *dts_timing,
				struct drv_odt_lp_config *drv_config)
{
	if ((dts_timing) && (dts_timing->available)) {
		drv_config->ddr3_speed_bin = dts_timing->ddr3_speed_bin;
		drv_config->pd_idle = dts_timing->pd_idle;
		drv_config->sr_idle = dts_timing->sr_idle;
		drv_config->sr_mc_gate_idle = dts_timing->sr_mc_gate_idle;
		drv_config->srpd_lite_idle = dts_timing->srpd_lite_idle;
		drv_config->standby_idle = dts_timing->standby_idle;
		drv_config->ddr3_dll_dis_freq = dts_timing->ddr3_dll_dis_freq;
		drv_config->phy_dll_dis_freq = dts_timing->phy_dll_dis_freq;
	}

	switch (dram_type) {
	case DDR3:
		if ((dts_timing) && (dts_timing->available)) {
			drv_config->odt_dis_freq =
			    dts_timing->ddr3_odt_dis_freq;
			drv_config->dram_side_drv = dts_timing->ddr3_drv;
			drv_config->dram_side_dq_odt = dts_timing->ddr3_odt;
			drv_config->phy_side_ca_drv =
			    dts_timing->phy_ddr3_ca_drv;
			drv_config->phy_side_ck_cs_drv =
			    dts_timing->phy_ddr3_ca_drv;
			drv_config->phy_side_dq_drv =
			    dts_timing->phy_ddr3_dq_drv;
			drv_config->phy_side_odt = dts_timing->phy_ddr3_odt;
		} else {
			memcpy(drv_config, &ddr3_drv_odt_default_config,
			       sizeof(struct drv_odt_lp_config));
		}
		break;
	case LPDDR3:
		if ((dts_timing) && (dts_timing->available)) {
			drv_config->odt_dis_freq =
			    dts_timing->lpddr3_odt_dis_freq;
			drv_config->dram_side_drv = dts_timing->lpddr3_drv;
			drv_config->dram_side_dq_odt = dts_timing->lpddr3_odt;
			drv_config->phy_side_ca_drv =
			    dts_timing->phy_lpddr3_ca_drv;
			drv_config->phy_side_ck_cs_drv =
			    dts_timing->phy_lpddr3_ca_drv;
			drv_config->phy_side_dq_drv =
			    dts_timing->phy_lpddr3_dq_drv;
			drv_config->phy_side_odt = dts_timing->phy_lpddr3_odt;

		} else {
			memcpy(drv_config, &lpddr3_drv_odt_default_config,
			       sizeof(struct drv_odt_lp_config));
		}
		break;
	case LPDDR4:
	default:
		if ((dts_timing) && (dts_timing->available)) {
			drv_config->odt_dis_freq =
			    dts_timing->lpddr4_odt_dis_freq;
			drv_config->dram_side_drv = dts_timing->lpddr4_drv;
			drv_config->dram_side_dq_odt =
			    dts_timing->lpddr4_dq_odt;
			drv_config->dram_side_ca_odt =
			    dts_timing->lpddr4_ca_odt;
			drv_config->phy_side_ca_drv =
			    dts_timing->phy_lpddr4_ca_drv;
			drv_config->phy_side_ck_cs_drv =
			    dts_timing->phy_lpddr4_ck_cs_drv;
			drv_config->phy_side_dq_drv =
			    dts_timing->phy_lpddr4_dq_drv;
			drv_config->phy_side_odt = dts_timing->phy_lpddr4_odt;
		} else {
			memcpy(drv_config, &lpddr4_drv_odt_default_config,
			       sizeof(struct drv_odt_lp_config));
		}
		break;
	}

	switch (drv_config->phy_side_ca_drv) {
	case 240:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_240;
		break;
	case 120:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_120;
		break;
	case 80:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_80;
		break;
	case 60:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_60;
		break;
	case 48:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_48;
		break;
	case 40:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_40;
		break;
	default:
		drv_config->phy_side_ca_drv = PHY_DRV_ODT_34_3;
		break;
	};

	switch (drv_config->phy_side_ck_cs_drv) {
	case 240:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_240;
		break;
	case 120:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_120;
		break;
	case 80:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_80;
		break;
	case 60:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_60;
		break;
	case 48:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_48;
		break;
	case 40:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_40;
		break;
	default:
		drv_config->phy_side_ck_cs_drv = PHY_DRV_ODT_34_3;
		break;
	}

	switch (drv_config->phy_side_dq_drv) {
	case 240:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_240;
		break;
	case 120:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_120;
		break;
	case 80:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_80;
		break;
	case 60:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_60;
		break;
	case 48:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_48;
		break;
	case 40:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_40;
		break;
	default:
		drv_config->phy_side_dq_drv = PHY_DRV_ODT_34_3;
		break;
	}

	switch (drv_config->phy_side_odt) {
	case 240:
		drv_config->phy_side_odt = PHY_DRV_ODT_240;
		break;
	case 120:
		drv_config->phy_side_odt = PHY_DRV_ODT_120;
		break;
	case 80:
		drv_config->phy_side_odt = PHY_DRV_ODT_80;
		break;
	case 60:
		drv_config->phy_side_odt = PHY_DRV_ODT_60;
		break;
	case 48:
		drv_config->phy_side_odt = PHY_DRV_ODT_48;
		break;
	case 40:
		drv_config->phy_side_odt = PHY_DRV_ODT_40;
		break;
	default:
		drv_config->phy_side_odt = PHY_DRV_ODT_34_3;
		break;
	}
}

static void sdram_timing_cfg_init(struct timing_related_config *ptiming_config,
				  struct rk3399_sdram_config *psdram_config,
				  struct drv_odt_lp_config *drv_config)
{
	uint32_t i, j;

	for (i = 0; i < psdram_config->channal_num; i++) {
		ptiming_config->dram_info[i].speed_rate =
		    drv_config->ddr3_speed_bin;
		ptiming_config->dram_info[i].cs_cnt =
		    psdram_config->ch[i].cs_cnt;
		for (j = 0; j < psdram_config->ch[i].cs_cnt; j++) {
			ptiming_config->dram_info[i].per_die_capability[j] =
			    get_cs_die_capability(psdram_config, i, j);
		}
	}
	ptiming_config->dram_type = psdram_config->dramtype;
	ptiming_config->ch_cnt = psdram_config->channal_num;
	switch (psdram_config->dramtype) {
	case DDR3:
		ptiming_config->bl = ddr3_default_config.bl;
		ptiming_config->ap = ddr3_default_config.ap;
		break;
	case LPDDR3:
		ptiming_config->bl = lpddr3_default_config.bl;
		ptiming_config->ap = lpddr3_default_config.ap;
		break;
	case LPDDR4:
		ptiming_config->bl = lpddr4_default_config.bl;
		ptiming_config->ap = lpddr4_default_config.ap;
		ptiming_config->rdbi = 0;
		ptiming_config->wdbi = 0;
		break;
	}
	ptiming_config->dramds = drv_config->dram_side_drv;
	ptiming_config->dramodt = drv_config->dram_side_dq_odt;
	ptiming_config->caodt = drv_config->dram_side_ca_odt;
}

struct lat_adj_pair {
	uint32_t cl;
	uint32_t rdlat_adj;
	uint32_t cwl;
	uint32_t wrlat_adj;
};

const struct lat_adj_pair ddr3_lat_adj[] = {
	{6, 5, 5, 4},
	{8, 7, 6, 5},
	{10, 9, 7, 6},
	{11, 9, 8, 7},
	{13, 0xb, 9, 8},
	{14, 0xb, 0xa, 9}
};

const struct lat_adj_pair lpddr3_lat_adj[] = {
	{3, 2, 1, 0},
	{6, 5, 3, 2},
	{8, 7, 4, 3},
	{9, 8, 5, 4},
	{10, 9, 6, 5},
	{11, 9, 6, 5},
	{12, 0xa, 6, 5},
	{14, 0xc, 8, 7},
	{16, 0xd, 8, 7}
};

const struct lat_adj_pair lpddr4_lat_adj[] = {
	{6, 5, 4, 2},
	{10, 9, 6, 4},
	{14, 0xc, 8, 6},
	{20, 0x11, 0xa, 8},
	{24, 0x15, 0xc, 0xa},
	{28, 0x18, 0xe, 0xc},
	{32, 0x1b, 0x10, 0xe},
	{36, 0x1e, 0x12, 0x10}
};

static uint32_t get_rdlat_adj(uint32_t dram_type, uint32_t cl)
{
	const struct lat_adj_pair *p;
	uint32_t cnt;
	uint32_t i;

	if (dram_type == DDR3) {
		p = ddr3_lat_adj;
		cnt = ARRAY_SIZE(ddr3_lat_adj);
	} else if (dram_type == LPDDR3) {
		p = lpddr3_lat_adj;
		cnt = ARRAY_SIZE(lpddr3_lat_adj);
	} else {
		p = lpddr4_lat_adj;
		cnt = ARRAY_SIZE(lpddr4_lat_adj);
	}

	for (i = 0; i < cnt; i++) {
		if (cl == p[i].cl)
			return p[i].rdlat_adj;
	}
	/* fail */
	return 0xff;
}

static uint32_t get_wrlat_adj(uint32_t dram_type, uint32_t cwl)
{
	const struct lat_adj_pair *p;
	uint32_t cnt;
	uint32_t i;

	if (dram_type == DDR3) {
		p = ddr3_lat_adj;
		cnt = ARRAY_SIZE(ddr3_lat_adj);
	} else if (dram_type == LPDDR3) {
		p = lpddr3_lat_adj;
		cnt = ARRAY_SIZE(lpddr3_lat_adj);
	} else {
		p = lpddr4_lat_adj;
		cnt = ARRAY_SIZE(lpddr4_lat_adj);
	}

	for (i = 0; i < cnt; i++) {
		if (cwl == p[i].cwl)
			return p[i].wrlat_adj;
	}
	/* fail */
	return 0xff;
}

#define PI_REGS_DIMM_SUPPORT	(0)
#define PI_ADD_LATENCY	(0)
#define PI_DOUBLEFREEK	(1)

#define PI_PAD_DELAY_PS_VALUE	(1000)
#define PI_IE_ENABLE_VALUE	(3000)
#define PI_TSEL_ENABLE_VALUE	(700)

static uint32_t get_pi_rdlat_adj(struct dram_timing_t *pdram_timing)
{
	/*[DLLSUBTYPE2] == "STD_DENALI_HS" */
	uint32_t rdlat, delay_adder, ie_enable, hs_offset, tsel_adder,
	    extra_adder, tsel_enable;

	ie_enable = PI_IE_ENABLE_VALUE;
	tsel_enable = PI_TSEL_ENABLE_VALUE;

	rdlat = pdram_timing->cl + PI_ADD_LATENCY;
	delay_adder = ie_enable / (1000000 / pdram_timing->mhz);
	if ((ie_enable % (1000000 / pdram_timing->mhz)) != 0)
		delay_adder++;
	hs_offset = 0;
	tsel_adder = 0;
	extra_adder = 0;
	/* rdlat = rdlat - (PREAMBLE_SUPPORT & 0x1); */
	tsel_adder = tsel_enable / (1000000 / pdram_timing->mhz);
	if ((tsel_enable % (1000000 / pdram_timing->mhz)) != 0)
		tsel_adder++;
	delay_adder = delay_adder - 1;
	if (tsel_adder > delay_adder)
		extra_adder = tsel_adder - delay_adder;
	else
		extra_adder = 0;
	if (PI_REGS_DIMM_SUPPORT && PI_DOUBLEFREEK)
		hs_offset = 2;
	else
		hs_offset = 1;

	if (delay_adder > (rdlat - 1 - hs_offset)) {
		rdlat = rdlat - tsel_adder;
	} else {
		if ((rdlat - delay_adder) < 2)
			rdlat = 2;
		else
			rdlat = rdlat - delay_adder - extra_adder;
	}

	return rdlat;
}

static uint32_t get_pi_wrlat(struct dram_timing_t *pdram_timing,
			     struct timing_related_config *timing_config)
{
	uint32_t tmp;

	if (timing_config->dram_type == LPDDR3) {
		tmp = pdram_timing->cl;
		if (tmp >= 14)
			tmp = 8;
		else if (tmp >= 10)
			tmp = 6;
		else if (tmp == 9)
			tmp = 5;
		else if (tmp == 8)
			tmp = 4;
		else if (tmp == 6)
			tmp = 3;
		else
			tmp = 1;
	} else {
		tmp = 1;
	}

	return tmp;
}

static uint32_t get_pi_wrlat_adj(struct dram_timing_t *pdram_timing,
				 struct timing_related_config *timing_config)
{
	return get_pi_wrlat(pdram_timing, timing_config) + PI_ADD_LATENCY - 1;
}

static uint32_t get_pi_tdfi_phy_rdlat(struct dram_timing_t *pdram_timing,
			struct timing_related_config *timing_config)
{
	/* [DLLSUBTYPE2] == "STD_DENALI_HS" */
	uint32_t cas_lat, delay_adder, ie_enable, hs_offset, ie_delay_adder;
	uint32_t mem_delay_ps, round_trip_ps;
	uint32_t phy_internal_delay, lpddr_adder, dfi_adder, rdlat_delay;

	ie_enable = PI_IE_ENABLE_VALUE;

	delay_adder = ie_enable / (1000000 / pdram_timing->mhz);
	if ((ie_enable % (1000000 / pdram_timing->mhz)) != 0)
		delay_adder++;
	delay_adder = delay_adder - 1;
	if (PI_REGS_DIMM_SUPPORT && PI_DOUBLEFREEK)
		hs_offset = 2;
	else
		hs_offset = 1;

	cas_lat = pdram_timing->cl + PI_ADD_LATENCY;

	if (delay_adder > (cas_lat - 1 - hs_offset)) {
		ie_delay_adder = 0;
	} else {
		ie_delay_adder = ie_enable / (1000000 / pdram_timing->mhz);
		if ((ie_enable % (1000000 / pdram_timing->mhz)) != 0)
			ie_delay_adder++;
	}

	if (timing_config->dram_type == DDR3) {
		mem_delay_ps = 0;
	} else if (timing_config->dram_type == LPDDR4) {
		mem_delay_ps = 3600;
	} else if (timing_config->dram_type == LPDDR3) {
		mem_delay_ps = 5500;
	} else {
		printf("get_pi_tdfi_phy_rdlat:dramtype unsupport\n");
		return 0;
	}
	round_trip_ps = 1100 + 500 + mem_delay_ps + 500 + 600;
	delay_adder = round_trip_ps / (1000000 / pdram_timing->mhz);
	if ((round_trip_ps % (1000000 / pdram_timing->mhz)) != 0)
		delay_adder++;

	phy_internal_delay = 5 + 2 + 4;
	lpddr_adder = mem_delay_ps / (1000000 / pdram_timing->mhz);
	if ((mem_delay_ps % (1000000 / pdram_timing->mhz)) != 0)
		lpddr_adder++;
	dfi_adder = 0;
	phy_internal_delay = phy_internal_delay + 2;
	rdlat_delay = delay_adder + phy_internal_delay +
	    ie_delay_adder + lpddr_adder + dfi_adder;

	rdlat_delay = rdlat_delay + 2;
	return rdlat_delay;
}

static uint32_t get_pi_todtoff_min(struct dram_timing_t *pdram_timing,
				   struct timing_related_config *timing_config)
{
	uint32_t tmp, todtoff_min_ps;

	if (timing_config->dram_type == LPDDR3)
		todtoff_min_ps = 2500;
	else if (timing_config->dram_type == LPDDR4)
		todtoff_min_ps = 1500;
	else
		todtoff_min_ps = 0;
	/* todtoff_min */
	tmp = todtoff_min_ps / (1000000 / pdram_timing->mhz);
	if ((todtoff_min_ps % (1000000 / pdram_timing->mhz)) != 0)
		tmp++;
	return tmp;
}

static uint32_t get_pi_todtoff_max(struct dram_timing_t *pdram_timing,
				   struct timing_related_config *timing_config)
{
	uint32_t tmp, todtoff_max_ps;

	if ((timing_config->dram_type == LPDDR4)
	    || (timing_config->dram_type == LPDDR3))
		todtoff_max_ps = 3500;
	else
		todtoff_max_ps = 0;

	/* todtoff_max */
	tmp = todtoff_max_ps / (1000000 / pdram_timing->mhz);
	if ((todtoff_max_ps % (1000000 / pdram_timing->mhz)) != 0)
		tmp++;
	return tmp;
}

static void gen_rk3399_ctl_params_f0(struct timing_related_config
				     *timing_config,
				     struct dram_timing_t *pdram_timing)
{
	uint32_t i;
	uint32_t tmp, tmp1;

	for (i = 0; i < timing_config->ch_cnt; i++) {
		if (timing_config->dram_type == DDR3) {
			tmp = ((700000 + 10) * timing_config->freq +
				999) / 1000;
			tmp += pdram_timing->txsnr + (pdram_timing->tmrd * 3) +
			    pdram_timing->tmod + pdram_timing->tzqinit;
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[5], tmp);

			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[22],
				      0xffff, pdram_timing->tdllk);

			write_32(&rk3399_ddr_pctl[i]->denali_ctl[32],
				 (pdram_timing->tmod << 8) |
				 pdram_timing->tmrd);

			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[59],
				      0xffff << 16,
				      (pdram_timing->txsr -
				       pdram_timing->trcd) << 16);
		} else if (timing_config->dram_type == LPDDR4) {
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[5],
				 pdram_timing->tinit1 + pdram_timing->tinit3);
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[32],
				 (pdram_timing->tmrd << 8) |
				 pdram_timing->tmrd);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[59],
				      0xffff << 16, pdram_timing->txsr << 16);
		} else {
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[5],
				 pdram_timing->tinit1);
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[7],
				 pdram_timing->tinit4);
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[32],
				 (pdram_timing->tmrd << 8) |
				 pdram_timing->tmrd);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[59],
				      0xffff << 16, pdram_timing->txsr << 16);
		}
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[6],
			 pdram_timing->tinit3);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[8],
			 pdram_timing->tinit5);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[23], (0x7f << 16),
			      ((pdram_timing->cl * 2) << 16));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[23], (0x1f << 24),
			      (pdram_timing->cwl << 24));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[24], 0x3f,
			      pdram_timing->al);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[26], 0xffff << 16,
			      (pdram_timing->trc << 24) |
			      (pdram_timing->trrd << 16));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[27],
			 (pdram_timing->tfaw << 24) |
			 (pdram_timing->trppb << 16) |
			 (pdram_timing->twtr << 8) | pdram_timing->tras_min);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[31], 0xff << 24,
			      max(4, pdram_timing->trtp) << 24);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[33],
			 (pdram_timing->tcke << 24) | pdram_timing->tras_max);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[34], 0xff,
			      max(1, pdram_timing->tckesr));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[39],
			      (0x3f << 16) | (0xff << 8),
			      (pdram_timing->twr << 16) |
			      (pdram_timing->trcd << 8));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[42], 0x1f << 16,
			      pdram_timing->tmrz << 16);
		tmp = pdram_timing->tdal ? pdram_timing->tdal :
		       (pdram_timing->twr + pdram_timing->trp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[44], 0xff, tmp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[45], 0xff,
			      pdram_timing->trp);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[48],
			 ((pdram_timing->trefi - 8) << 16) |
			 pdram_timing->trfc);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[52], 0xffff,
			      pdram_timing->txp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[53], 0xffff << 16,
			      pdram_timing->txpdll << 16);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[55], 0xf << 24,
			      pdram_timing->tcscke << 24);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[55], 0xff,
			      pdram_timing->tmrri);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[56],
			 (pdram_timing->tzqcke << 24) |
			 (pdram_timing->tmrwckel << 16) |
			 (pdram_timing->tckehcs << 8) | pdram_timing->tckelcs);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[60], 0xffff,
			      pdram_timing->txsnr);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[62], 0xffff << 16,
			      (pdram_timing->tckehcmd << 24) |
			      (pdram_timing->tckelcmd << 16));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[63],
			 (pdram_timing->tckelpd << 24) |
			 (pdram_timing->tescke << 16) |
			 (pdram_timing->tsr << 8) | pdram_timing->tckckel);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[64], 0xfff,
			      (pdram_timing->tcmdcke << 8) |
			      pdram_timing->tcsckeh);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[92],
			      (0xffff << 8),
			      (pdram_timing->tcksrx << 16) |
			      (pdram_timing->tcksre << 8));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[108], (0x1 << 24),
			      (timing_config->dllbp << 24));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[122],
			      (0x3FF << 16),
			      (pdram_timing->tvrcg_enable << 16));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[123],
			 (pdram_timing->tfc_long << 16) |
			 pdram_timing->tvrcg_disable);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[124],
			 (pdram_timing->tvref_long << 16) |
			 (pdram_timing->tckfspx << 8) |
			 pdram_timing->tckfspe);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[133],
			 (pdram_timing->mr[1] << 16) | pdram_timing->mr[0]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[134], 0xffff,
			      pdram_timing->mr[2]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[138], 0xffff,
			      pdram_timing->mr[3]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[139], 0xff << 24,
			      pdram_timing->mr11 << 24);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[147],
			 (pdram_timing->mr[1] << 16) | pdram_timing->mr[0]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[148], 0xffff,
			      pdram_timing->mr[2]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[152], 0xffff,
			      pdram_timing->mr[3]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[153], 0xff << 24,
			      pdram_timing->mr11 << 24);
		if (timing_config->dram_type == LPDDR4) {
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[140],
				      0xffff << 16, pdram_timing->mr12 << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[142],
				      0xffff << 16, pdram_timing->mr14 << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[145],
				      0xffff << 16, pdram_timing->mr22 << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[154],
				      0xffff << 16, pdram_timing->mr12 << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[156],
				      0xffff << 16, pdram_timing->mr14 << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[159],
				      0xffff << 16, pdram_timing->mr22 << 16);
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[179], 0xfff << 8,
			      pdram_timing->tzqinit << 8);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[180],
			 (pdram_timing->tzqcs << 16) |
			 (pdram_timing->tzqinit / 2));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[181],
			 (pdram_timing->tzqlat << 16) | pdram_timing->tzqcal);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[212], 0xff << 8,
			      pdram_timing->todton << 8);

		if (timing_config->odt) {
			setbits_32(&rk3399_ddr_pctl[i]->denali_ctl[213],
				   1 << 16);
			if (timing_config->freq < 400)
				tmp = 4 << 24;
			else
				tmp = 8 << 24;
		} else {
			clrbits_32(&rk3399_ddr_pctl[i]->denali_ctl[213],
				   1 << 16);
			tmp = 2 << 24;
		}

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[216],
			      0x1f << 24, tmp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[221],
			      (0x3 << 16) | (0xf << 8),
			      (pdram_timing->tdqsck << 16) |
			      (pdram_timing->tdqsck_max << 8));
		tmp =
		    (get_wrlat_adj(timing_config->dram_type, pdram_timing->cwl)
		     << 8) | get_rdlat_adj(timing_config->dram_type,
					   pdram_timing->cl);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[284], 0xffff,
			      tmp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[82], 0xffff << 16,
			      (4 * pdram_timing->trefi) << 16);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[83], 0xffff,
			      (2 * pdram_timing->trefi) & 0xffff);

		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			tmp = get_pi_wrlat(pdram_timing, timing_config);
			tmp1 = get_pi_todtoff_max(pdram_timing, timing_config);
			tmp = (tmp > tmp1) ? (tmp - tmp1) : 0;
		} else {
			tmp = 0;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[214], 0x3f << 16,
			      (tmp & 0x3f) << 16);

		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			/* min_rl_preamble= cl+TDQSCK_MIN-1 */
			tmp = pdram_timing->cl +
			    get_pi_todtoff_min(pdram_timing, timing_config) - 1;
			/* todtoff_max */
			tmp1 = get_pi_todtoff_max(pdram_timing, timing_config);
			tmp = (tmp > tmp1) ? (tmp - tmp1) : 0;
		} else {
			tmp = pdram_timing->cl - pdram_timing->cwl;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[215], 0x3f << 8,
			      (tmp & 0x3f) << 8);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[275], 0xff << 16,
			      (get_pi_tdfi_phy_rdlat
			       (pdram_timing, timing_config)
			       & 0xff) << 16);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[277], 0xffff,
			      (2 * pdram_timing->trefi) & 0xffff);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[282], 0xffff,
			      (2 * pdram_timing->trefi) & 0xffff);

		write_32(&rk3399_ddr_pctl[i]->denali_ctl[283],
			 20 * pdram_timing->trefi);

		/* CTL_308 TDFI_CALVL_CAPTURE_F0:RW:16:10 */
		tmp1 = 20000 / (1000000 / pdram_timing->mhz) + 1;
		if ((20000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		tmp = (tmp1 >> 1) + (tmp1 % 2) + 5;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[308], 0x3ff << 16,
				tmp << 16);

		/* CTL_308 TDFI_CALVL_CC_F0:RW:0:10 */
		tmp = tmp + 18;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[308], 0x3ff,
				tmp);

		/* CTL_314 TDFI_WRCSLAT_F0:RW:8:8 */
		tmp1 = get_pi_wrlat_adj(pdram_timing, timing_config);
		if (timing_config->freq <= ENPER_CS_TRAINING_FREQ) {
			if (tmp1 < 5) {
				if (tmp1 == 0)
					tmp = 0;
				else
					tmp = tmp1 - 1;
			} else {
				tmp = tmp1 - 5;
			}
		} else {
			tmp = tmp1 - 2;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[314], 0xff << 8,
				tmp << 8);

		/* CTL_314 TDFI_RDCSLAT_F0:RW:0:8 */
		if ((timing_config->freq <= ENPER_CS_TRAINING_FREQ) &&
			(pdram_timing->cl >= 5))
			tmp = pdram_timing->cl - 5;
		else
			tmp = pdram_timing->cl - 2;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[314], 0xff,
				tmp);
	}
}

static void gen_rk3399_ctl_params_f1(struct timing_related_config
				     *timing_config,
				     struct dram_timing_t *pdram_timing)
{
	uint32_t i;
	uint32_t tmp, tmp1;

	for (i = 0; i < timing_config->ch_cnt; i++) {
		if (timing_config->dram_type == DDR3) {
			tmp =
			    ((700000 + 10) * timing_config->freq +
			      999) / 1000;
			tmp +=
			    pdram_timing->txsnr + (pdram_timing->tmrd * 3) +
			    pdram_timing->tmod + pdram_timing->tzqinit;
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[9], tmp);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[22],
				      0xffff << 16, pdram_timing->tdllk << 16);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[34],
				      0xffffff00,
				      (pdram_timing->tmod << 24) |
				      (pdram_timing->tmrd << 16) |
				      (pdram_timing->trtp << 8));
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[60],
				      0xffff << 16,
				      (pdram_timing->txsr -
				       pdram_timing->trcd) << 16);
		} else if (timing_config->dram_type == LPDDR4) {
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[9],
				 pdram_timing->tinit1 + pdram_timing->tinit3);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[34],
				      0xffffff00,
				      (pdram_timing->tmrd << 24) |
				      (pdram_timing->tmrd << 16) |
				      (pdram_timing->trtp << 8));
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[60],
				      0xffff << 16, pdram_timing->txsr << 16);
		} else {
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[9],
				 pdram_timing->tinit1);
			write_32(&rk3399_ddr_pctl[i]->denali_ctl[11],
				 pdram_timing->tinit4);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[34],
				      0xffffff00,
				      (pdram_timing->tmrd << 24) |
				      (pdram_timing->tmrd << 16) |
				      (pdram_timing->trtp << 8));
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[60],
				      0xffff << 16, pdram_timing->txsr << 16);
		}
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[10],
			 pdram_timing->tinit3);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[12],
			 pdram_timing->tinit5);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[24], (0x7f << 8),
			      ((pdram_timing->cl * 2) << 8));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[24], (0x1f << 16),
			      (pdram_timing->cwl << 16));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[24], 0x3f << 24,
			      pdram_timing->al << 24);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[28], 0xffffff00,
			      (pdram_timing->tras_min << 24) |
			      (pdram_timing->trc << 16) |
			      (pdram_timing->trrd << 8));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[29], 0xffffff,
			      (pdram_timing->tfaw << 16) |
			      (pdram_timing->trppb << 8) | pdram_timing->twtr);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[35],
			 (pdram_timing->tcke << 24) | pdram_timing->tras_max);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[36], 0xff,
			      max(1, pdram_timing->tckesr));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[39],
			      (0xff << 24), (pdram_timing->trcd << 24));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[40],
			      0x3f, pdram_timing->twr);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[42], 0x1f << 24,
			      pdram_timing->tmrz << 24);
		tmp = pdram_timing->tdal ? pdram_timing->tdal :
		       (pdram_timing->twr + pdram_timing->trp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[44], 0xff << 8,
			      tmp << 8);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[45], 0xff << 8,
			      pdram_timing->trp << 8);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[49],
			 ((pdram_timing->trefi - 8) << 16) |
			 pdram_timing->trfc);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[52], 0xffff << 16,
			      pdram_timing->txp << 16);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[54], 0xffff,
			      pdram_timing->txpdll);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[55], 0xff << 8,
			      pdram_timing->tmrri << 8);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[57],
			 (pdram_timing->tmrwckel << 24) |
			 (pdram_timing->tckehcs << 16) |
			 (pdram_timing->tckelcs << 8) | pdram_timing->tcscke);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[58], 0xf,
			      pdram_timing->tzqcke);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[61], 0xffff,
			      pdram_timing->txsnr);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[64], 0xffff << 16,
			      (pdram_timing->tckehcmd << 24) |
			      (pdram_timing->tckelcmd << 16));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[65],
			 (pdram_timing->tckelpd << 24) |
			 (pdram_timing->tescke << 16) |
			 (pdram_timing->tsr << 8) | pdram_timing->tckckel);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[66], 0xfff,
			      (pdram_timing->tcmdcke << 8) |
			      pdram_timing->tcsckeh);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[92], (0xff << 24),
			      (pdram_timing->tcksre << 24));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[93], 0xff,
			      pdram_timing->tcksrx);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[108], (0x1 << 25),
			      (timing_config->dllbp << 25));
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[125],
			 (pdram_timing->tvrcg_disable << 16) |
			 pdram_timing->tvrcg_enable);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[126],
			 (pdram_timing->tckfspx << 24) |
			 (pdram_timing->tckfspe << 16) |
			 pdram_timing->tfc_long);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[127], 0xffff,
			      pdram_timing->tvref_long);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[134],
			      0xffff << 16, pdram_timing->mr[0] << 16);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[135],
			 (pdram_timing->mr[2] << 16) | pdram_timing->mr[1]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[138],
			      0xffff << 16, pdram_timing->mr[3] << 16);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[140], 0xff,
			      pdram_timing->mr11);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[148],
			      0xffff << 16, pdram_timing->mr[0] << 16);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[149],
			 (pdram_timing->mr[2] << 16) | pdram_timing->mr[1]);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[152],
			      0xffff << 16, pdram_timing->mr[3] << 16);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[154], 0xff,
			      pdram_timing->mr11);
		if (timing_config->dram_type == LPDDR4) {
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[141],
				      0xffff, pdram_timing->mr12);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[143],
				      0xffff, pdram_timing->mr14);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[146],
				      0xffff, pdram_timing->mr22);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[155],
				      0xffff, pdram_timing->mr12);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[157],
				      0xffff, pdram_timing->mr14);
			clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[160],
				      0xffff, pdram_timing->mr22);
		}
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[182],
			 ((pdram_timing->tzqinit / 2) << 16) |
			 pdram_timing->tzqinit);
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[183],
			 (pdram_timing->tzqcal << 16) | pdram_timing->tzqcs);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[184], 0x3f,
			      pdram_timing->tzqlat);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[188], 0xfff,
			      pdram_timing->tzqreset);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[212], 0xff << 16,
			      pdram_timing->todton << 16);

		if (timing_config->odt) {
			setbits_32(&rk3399_ddr_pctl[i]->denali_ctl[213],
				   (1 << 24));
			if (timing_config->freq < 400)
				tmp = 4 << 24;
			else
				tmp = 8 << 24;
		} else {
			clrbits_32(&rk3399_ddr_pctl[i]->denali_ctl[213],
				   (1 << 24));
			tmp = 2 << 24;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[217], 0x1f << 24,
			      tmp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[221], 0xf << 24,
			      (pdram_timing->tdqsck_max << 24));
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[222], 0x3,
			      pdram_timing->tdqsck);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[291], 0xffff,
			      (get_wrlat_adj(timing_config->dram_type,
					     pdram_timing->cwl) << 8) |
			      get_rdlat_adj(timing_config->dram_type,
					    pdram_timing->cl));

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[84], 0xffff,
			      (4 * pdram_timing->trefi) & 0xffff);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[84], 0xffff << 16,
			      ((2 * pdram_timing->trefi) & 0xffff) << 16);

		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			tmp = get_pi_wrlat(pdram_timing, timing_config);
			tmp1 = get_pi_todtoff_max(pdram_timing, timing_config);
			tmp = (tmp > tmp1) ? (tmp - tmp1) : 0;
		} else {
			tmp = 0;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[214], 0x3f << 24,
			      (tmp & 0x3f) << 24);

		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			/* min_rl_preamble= cl+TDQSCK_MIN-1 */
			tmp = pdram_timing->cl +
			    get_pi_todtoff_min(pdram_timing, timing_config) - 1;
			/* todtoff_max */
			tmp1 = get_pi_todtoff_max(pdram_timing, timing_config);
			tmp = (tmp > tmp1) ? (tmp - tmp1) : 0;
		} else {
			tmp = pdram_timing->cl - pdram_timing->cwl;
		}
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[215], 0x3f << 16,
			      (tmp & 0x3f) << 16);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[275], 0xff << 24,
			      (get_pi_tdfi_phy_rdlat
			       (pdram_timing, timing_config)
			       & 0xff) << 24);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[284],
			      0xffff << 16,
			      ((2 * pdram_timing->trefi) & 0xffff) << 16);

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[289], 0xffff,
			      (2 * pdram_timing->trefi) & 0xffff);

		write_32(&rk3399_ddr_pctl[i]->denali_ctl[290],
			 20 * pdram_timing->trefi);

		/* CTL_309 TDFI_CALVL_CAPTURE_F1:RW:16:10 */
		tmp1 = 20000 / (1000000 / pdram_timing->mhz) + 1;
		if ((20000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		tmp = (tmp1 >> 1) + (tmp1 % 2) + 5;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[309], 0x3ff << 16,
				tmp << 16);

		/* CTL_309 TDFI_CALVL_CC_F1:RW:0:10 */
		tmp = tmp + 18;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[309], 0x3ff,
				tmp);

		/* CTL_314 TDFI_WRCSLAT_F1:RW:24:8 */
		tmp1 = get_pi_wrlat_adj(pdram_timing, timing_config);
		if (timing_config->freq <= ENPER_CS_TRAINING_FREQ) {
			if (tmp1 < 5) {
				if (tmp1 == 0)
					tmp = 0;
				else
					tmp = tmp1 - 1;
			} else {
				tmp = tmp1 - 5;
			}
		} else {
			tmp = tmp1 - 2;
		}

		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[314], 0xff << 24,
				tmp << 24);

		/* CTL_314 TDFI_RDCSLAT_F1:RW:16:8 */
		if ((timing_config->freq <= ENPER_CS_TRAINING_FREQ) &&
			(pdram_timing->cl >= 5))
			tmp = pdram_timing->cl - 5;
		else
			tmp = pdram_timing->cl - 2;
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[314], 0xff << 16,
				tmp << 16);
	}
}

static void gen_rk3399_ctl_params(struct timing_related_config *timing_config,
				  struct dram_timing_t *pdram_timing,
				  uint32_t fn)
{
	if (fn == 0)
		gen_rk3399_ctl_params_f0(timing_config, pdram_timing);
	else
		gen_rk3399_ctl_params_f1(timing_config, pdram_timing);

#if CTL_TRAINING
	uint32_t i, tmp0, tmp1;

	tmp0 = tmp1 = 0;
#if EN_READ_GATE_TRAINING
	tmp1 = 1;
#endif

#if EN_CA_TRAINING
	tmp0 |= (1 << 8);
#endif

#if EN_WRITE_LEVELING
	tmp0 |= (1 << 16);
#endif

#if EN_READ_LEVELING
	tmp0 |= (1 << 24);
#endif
	for (i = 0; i < timing_config->ch_cnt; i++) {
		if (tmp0 | tmp1)
			setbits_32(&rk3399_ddr_pctl[i]->denali_ctl[305],
				   1 << 16);
		if (tmp0)
			setbits_32(&rk3399_ddr_pctl[i]->denali_ctl[70], tmp0);
		if (tmp1)
			setbits_32(&rk3399_ddr_pctl[i]->denali_ctl[71], tmp1);
	}
#endif
}

static void gen_rk3399_pi_params_f0(struct timing_related_config *timing_config,
				    struct dram_timing_t *pdram_timing)
{
	uint32_t tmp, tmp1, tmp2;
	uint32_t i;

	for (i = 0; i < timing_config->ch_cnt; i++) {
		/* PI_02 PI_TDFI_PHYMSTR_MAX_F0:RW:0:32 */
		tmp = 4 * pdram_timing->trefi;
		write_32(&rk3399_ddr_pi[i]->denali_pi[2], tmp);
		/* PI_03 PI_TDFI_PHYMSTR_RESP_F0:RW:0:16 */
		tmp = 2 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[3], 0xffff, tmp);
		/* PI_07 PI_TDFI_PHYUPD_RESP_F0:RW:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[7], 0xffff << 16,
			      tmp << 16);

		/* PI_42 PI_TDELAY_RDWR_2_BUS_IDLE_F0:RW:0:8 */
		if (timing_config->dram_type == LPDDR4)
			tmp = 2;
		else
			tmp = 0;
		tmp = (pdram_timing->bl / 2) + 4 +
		    (get_pi_rdlat_adj(pdram_timing) - 2) + tmp +
		    get_pi_tdfi_phy_rdlat(pdram_timing, timing_config);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[42], 0xff, tmp);
		/* PI_43 PI_WRLAT_F0:RW:0:5 */
		if (timing_config->dram_type == LPDDR3) {
			tmp = get_pi_wrlat(pdram_timing, timing_config);
			clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[43], 0x1f,
				      tmp);
		}
		/* PI_43 PI_ADDITIVE_LAT_F0:RW:8:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[43], 0x3f << 8,
			      PI_ADD_LATENCY << 8);

		/* PI_43 PI_CASLAT_LIN_F0:RW:16:7 */
		tmp = pdram_timing->cl * 2;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[43], 0x7f << 16,
			      tmp << 16);
		/* PI_46 PI_TREF_F0:RW:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[46], 0xffff << 16,
			      pdram_timing->trefi << 16);
		/* PI_46 PI_TRFC_F0:RW:0:10 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[46], 0x3ff,
			      pdram_timing->trfc);
		/* PI_66 PI_TODTL_2CMD_F0:RW:24:8 */
		if (timing_config->dram_type == LPDDR3) {
			tmp = get_pi_todtoff_max(pdram_timing, timing_config);
			clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[66],
				      0xff << 24, tmp << 24);
		}
		/* PI_72 PI_WR_TO_ODTH_F0:RW:16:6 */
		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			tmp1 = get_pi_wrlat(pdram_timing, timing_config);
			tmp2 = get_pi_todtoff_max(pdram_timing, timing_config);
			if (tmp1 > tmp2)
				tmp = tmp1 - tmp2;
			else
				tmp = 0;
		} else if (timing_config->dram_type == DDR3) {
			tmp = 0;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[72], 0x3f << 16,
			      tmp << 16);
		/* PI_73 PI_RD_TO_ODTH_F0:RW:8:6 */
		if ((timing_config->dram_type == LPDDR3) ||
		    (timing_config->dram_type == LPDDR4)) {
			/* min_rl_preamble= cl+TDQSCK_MIN-1 */
			tmp1 = pdram_timing->cl +
			    get_pi_todtoff_min(pdram_timing, timing_config) - 1;
			/* todtoff_max */
			tmp2 = get_pi_todtoff_max(pdram_timing, timing_config);
			if (tmp1 > tmp2)
				tmp = tmp1 - tmp2;
			else
				tmp = 0;
		} else if (timing_config->dram_type == DDR3) {
			tmp = pdram_timing->cl - pdram_timing->cwl;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[73], 0x3f << 8,
			      tmp << 8);
		/* PI_89 PI_RDLAT_ADJ_F0:RW:16:8 */
		tmp = get_pi_rdlat_adj(pdram_timing);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[89], 0xff << 16,
			      tmp << 16);
		/* PI_90 PI_WRLAT_ADJ_F0:RW:16:8 */
		tmp = get_pi_wrlat_adj(pdram_timing, timing_config);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[90], 0xff << 16,
			      tmp << 16);
		/* PI_91 PI_TDFI_WRCSLAT_F0:RW:16:8 */
		tmp1 = tmp;
		if (tmp1 < 5) {
			if (tmp1 == 0)
				tmp = 0;
			else
				tmp = tmp1 - 1;
		} else {
			tmp = tmp1 - 5;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[91], 0xff << 16,
			      tmp << 16);
		/* PI_95 PI_TDFI_CALVL_CAPTURE_F0:RW:16:10 */
		tmp1 = 20000 / (1000000 / pdram_timing->mhz) + 1;
		if ((20000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		tmp = (tmp1 >> 1) + (tmp1 % 2) + 5;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[95], 0x3ff << 16,
			      tmp << 16);
		/* PI_95 PI_TDFI_CALVL_CC_F0:RW:0:10 */
		tmp = tmp + 18;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[95], 0x3ff, tmp);
		/* PI_102 PI_TMRZ_F0:RW:8:5 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[102], 0x1f << 8,
			      pdram_timing->tmrz << 8);
		/* PI_111 PI_TDFI_CALVL_STROBE_F0:RW:8:4 */
		tmp1 = 2 * 1000 / (1000000 / pdram_timing->mhz);
		if ((2 * 1000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		/* pi_tdfi_calvl_strobe=tds_train+5 */
		tmp = tmp1 + 5;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[111], 0xf << 8,
			      tmp << 8);
		/* PI_116 PI_TCKEHDQS_F0:RW:16:6 */
		tmp = 10000 / (1000000 / pdram_timing->mhz);
		if ((10000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp++;
		if (pdram_timing->mhz <= 100)
			tmp = tmp + 1;
		else
			tmp = tmp + 8;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[116], 0x3f << 16,
			      tmp << 16);
		/* PI_125 PI_MR1_DATA_F0_0:RW+:8:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[125], 0xffff << 8,
			      pdram_timing->mr[1] << 8);
		/* PI_133 PI_MR1_DATA_F0_1:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[133], 0xffff,
			      pdram_timing->mr[1]);
		/* PI_140 PI_MR1_DATA_F0_2:RW+:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[140], 0xffff << 16,
			      pdram_timing->mr[1] << 16);
		/* PI_148 PI_MR1_DATA_F0_3:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[148], 0xffff,
			      pdram_timing->mr[1]);
		/* PI_126 PI_MR2_DATA_F0_0:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[126], 0xffff,
			      pdram_timing->mr[2]);
		/* PI_133 PI_MR2_DATA_F0_1:RW+:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[133], 0xffff << 16,
			      pdram_timing->mr[2] << 16);
		/* PI_141 PI_MR2_DATA_F0_2:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[141], 0xffff,
			      pdram_timing->mr[2]);
		/* PI_148 PI_MR2_DATA_F0_3:RW+:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[148], 0xffff << 16,
			      pdram_timing->mr[2] << 16);
		/* PI_156 PI_TFC_F0:RW:0:10 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[156], 0x3ff,
			      pdram_timing->trfc);
		/* PI_158 PI_TWR_F0:RW:24:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[158], 0x3f << 24,
			      pdram_timing->twr << 24);
		/* PI_158 PI_TWTR_F0:RW:16:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[158], 0x3f << 16,
			      pdram_timing->twtr << 16);
		/* PI_158 PI_TRCD_F0:RW:8:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[158], 0xff << 8,
			      pdram_timing->trcd << 8);
		/* PI_158 PI_TRP_F0:RW:0:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[158], 0xff,
			      pdram_timing->trp);
		/* PI_157 PI_TRTP_F0:RW:24:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[157], 0xff << 24,
			      pdram_timing->trtp << 24);
		/* PI_159 PI_TRAS_MIN_F0:RW:24:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[159], 0xff << 24,
			      pdram_timing->tras_min << 24);
		/* PI_159 PI_TRAS_MAX_F0:RW:0:17 */
		tmp = pdram_timing->tras_max * 99 / 100;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[159], 0x1ffff, tmp);
		/* PI_160 PI_TMRD_F0:RW:16:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[160], 0x3f << 16,
			      pdram_timing->tmrd << 16);
		/*PI_160 PI_TDQSCK_MAX_F0:RW:0:4 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[160], 0xf,
			      pdram_timing->tdqsck_max);
		/* PI_187 PI_TDFI_CTRLUPD_MAX_F0:RW:8:16 */
		tmp = 2 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[187], 0xffff << 8,
			      tmp << 8);
		/* PI_188 PI_TDFI_CTRLUPD_INTERVAL_F0:RW:0:32 */
		tmp = 20 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[188], 0xffffffff,
			      tmp);
	}
}

static void gen_rk3399_pi_params_f1(struct timing_related_config *timing_config,
				    struct dram_timing_t *pdram_timing)
{
	uint32_t tmp, tmp1, tmp2;
	uint32_t i;

	for (i = 0; i < timing_config->ch_cnt; i++) {
		/* PI_04 PI_TDFI_PHYMSTR_MAX_F1:RW:0:32 */
		tmp = 4 * pdram_timing->trefi;
		write_32(&rk3399_ddr_pi[i]->denali_pi[4], tmp);
		/* PI_05 PI_TDFI_PHYMSTR_RESP_F1:RW:0:16 */
		tmp = 2 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[5], 0xffff, tmp);
		/* PI_12 PI_TDFI_PHYUPD_RESP_F1:RW:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[12], 0xffff, tmp);

		/* PI_42 PI_TDELAY_RDWR_2_BUS_IDLE_F1:RW:8:8 */
		if (timing_config->dram_type == LPDDR4)
			tmp = 2;
		else
			tmp = 0;
		tmp = (pdram_timing->bl / 2) + 4 +
		    (get_pi_rdlat_adj(pdram_timing) - 2) + tmp +
		    get_pi_tdfi_phy_rdlat(pdram_timing, timing_config);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[42], 0xff << 8,
			      tmp << 8);
		/* PI_43 PI_WRLAT_F1:RW:24:5 */
		if (timing_config->dram_type == LPDDR3) {
			tmp = get_pi_wrlat(pdram_timing, timing_config);
			clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[43],
				      0x1f << 24, tmp << 24);
		}
		/* PI_44 PI_ADDITIVE_LAT_F1:RW:0:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[44], 0x3f,
			      PI_ADD_LATENCY);
		/* PI_44 PI_CASLAT_LIN_F1:RW:8:7:=0x18 */
		tmp = pdram_timing->cl * 2;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[44], 0x7f << 8,
			      tmp << 8);
		/* PI_47 PI_TREF_F1:RW:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[47], 0xffff << 16,
			      pdram_timing->trefi << 16);
		/* PI_47 PI_TRFC_F1:RW:0:10 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[47], 0x3ff,
			      pdram_timing->trfc);
		/* PI_67 PI_TODTL_2CMD_F1:RW:8:8 */
		if (timing_config->dram_type == LPDDR3) {
			tmp = get_pi_todtoff_max(pdram_timing, timing_config);
			clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[67],
				      0xff << 8, tmp << 8);
		}
		/* PI_72 PI_WR_TO_ODTH_F1:RW:24:6 */
		if ((timing_config->dram_type == LPDDR3)
		    || (timing_config->dram_type == LPDDR4)) {
			tmp1 = get_pi_wrlat(pdram_timing, timing_config);
			tmp2 = get_pi_todtoff_max(pdram_timing, timing_config);
			if (tmp1 > tmp2)
				tmp = tmp1 - tmp2;
			else
				tmp = 0;
		} else if (timing_config->dram_type == DDR3) {
			tmp = 0;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[72], 0x3f << 24,
			      tmp << 24);
		/* PI_73 PI_RD_TO_ODTH_F1:RW:16:6 */
		if ((timing_config->dram_type == LPDDR3)
		    || (timing_config->dram_type == LPDDR4)) {
			/* min_rl_preamble= cl+TDQSCK_MIN-1 */
			tmp1 =
			    pdram_timing->cl + get_pi_todtoff_min(pdram_timing,
								  timing_config)
			    - 1;
			/* todtoff_max */
			tmp2 = get_pi_todtoff_max(pdram_timing, timing_config);
			if (tmp1 > tmp2)
				tmp = tmp1 - tmp2;
			else
				tmp = 0;
		} else if (timing_config->dram_type == DDR3) {
			tmp = pdram_timing->cl - pdram_timing->cwl;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[73], 0x3f << 16,
			      tmp << 16);
		/*P I_89 PI_RDLAT_ADJ_F1:RW:24:8 */
		tmp = get_pi_rdlat_adj(pdram_timing);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[89], 0xff << 24,
			      tmp << 24);
		/* PI_90 PI_WRLAT_ADJ_F1:RW:24:8 */
		tmp = get_pi_wrlat_adj(pdram_timing, timing_config);
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[90], 0xff << 24,
			      tmp << 24);
		/* PI_91 PI_TDFI_WRCSLAT_F1:RW:24:8 */
		tmp1 = tmp;
		if (tmp1 < 5) {
			if (tmp1 == 0)
				tmp = 0;
			else
				tmp = tmp1 - 1;
		} else {
			tmp = tmp1 - 5;
		}
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[91], 0xff << 24,
			      tmp << 24);
		/*PI_96 PI_TDFI_CALVL_CAPTURE_F1:RW:16:10 */
		/* tadr=20ns */
		tmp1 = 20000 / (1000000 / pdram_timing->mhz) + 1;
		if ((20000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		tmp = (tmp1 >> 1) + (tmp1 % 2) + 5;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[96], 0x3ff << 16,
			      tmp << 16);
		/* PI_96 PI_TDFI_CALVL_CC_F1:RW:0:10 */
		tmp = tmp + 18;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[96], 0x3ff, tmp);
		/*PI_103 PI_TMRZ_F1:RW:0:5 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[103], 0x1f,
			      pdram_timing->tmrz);
		/*PI_111 PI_TDFI_CALVL_STROBE_F1:RW:16:4 */
		/* tds_train=ceil(2/ns) */
		tmp1 = 2 * 1000 / (1000000 / pdram_timing->mhz);
		if ((2 * 1000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp1++;
		/* pi_tdfi_calvl_strobe=tds_train+5 */
		tmp = tmp1 + 5;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[111], 0xf << 16,
			      tmp << 16);
		/* PI_116 PI_TCKEHDQS_F1:RW:24:6 */
		tmp = 10000 / (1000000 / pdram_timing->mhz);
		if ((10000 % (1000000 / pdram_timing->mhz)) != 0)
			tmp++;
		if (pdram_timing->mhz <= 100)
			tmp = tmp + 1;
		else
			tmp = tmp + 8;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[116], 0x3f << 24,
			      tmp << 24);
		/* PI_128 PI_MR1_DATA_F1_0:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[128], 0xffff,
			      pdram_timing->mr[1]);
		/* PI_135 PI_MR1_DATA_F1_1:RW+:8:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[135], 0xffff << 8,
			      pdram_timing->mr[1] << 8);
		/* PI_143 PI_MR1_DATA_F1_2:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[143], 0xffff,
			      pdram_timing->mr[1]);
		/* PI_150 PI_MR1_DATA_F1_3:RW+:8:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[150], 0xffff << 8,
			      pdram_timing->mr[1] << 8);
		/* PI_128 PI_MR2_DATA_F1_0:RW+:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[128], 0xffff << 16,
			      pdram_timing->mr[2] << 16);
		/* PI_136 PI_MR2_DATA_F1_1:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[136], 0xffff,
			      pdram_timing->mr[2]);
		/* PI_143 PI_MR2_DATA_F1_2:RW+:16:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[143], 0xffff << 16,
			      pdram_timing->mr[2] << 16);
		/* PI_151 PI_MR2_DATA_F1_3:RW+:0:16 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[151], 0xffff,
			      pdram_timing->mr[2]);
		/* PI_156 PI_TFC_F1:RW:16:10 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[156], 0x3ff << 16,
			      pdram_timing->trfc << 16);
		/* PI_162 PI_TWR_F1:RW:8:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[162], 0x3f << 8,
			      pdram_timing->twr << 8);
		/* PI_162 PI_TWTR_F1:RW:0:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[162], 0x3f,
			      pdram_timing->twtr);
		/* PI_161 PI_TRCD_F1:RW:24:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[161], 0xff << 24,
			      pdram_timing->trcd << 24);
		/* PI_161 PI_TRP_F1:RW:16:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[161], 0xff << 16,
			      pdram_timing->trp << 16);
		/* PI_161 PI_TRTP_F1:RW:8:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[161], 0xff << 8,
			      pdram_timing->trtp << 8);
		/* PI_163 PI_TRAS_MIN_F1:RW:24:8 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[163], 0xff << 24,
			      pdram_timing->tras_min << 24);
		/* PI_163 PI_TRAS_MAX_F1:RW:0:17 */
		tmp = pdram_timing->tras_max * 99 / 100;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[163], 0x1ffff, tmp);
		/* PI_164 PI_TMRD_F1:RW:16:6 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[164], 0x3f << 16,
			      pdram_timing->tmrd << 16);
		/* PI_164 PI_TDQSCK_MAX_F1:RW:0:4 */
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[164], 0xf,
			      pdram_timing->tdqsck_max);
		/* PI_189 PI_TDFI_CTRLUPD_MAX_F1:RW:0:16 */
		tmp = 2 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[189], 0xffff, tmp);
		/* PI_190 PI_TDFI_CTRLUPD_INTERVAL_F1:RW:0:32 */
		tmp = 20 * pdram_timing->trefi;
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[190], 0xffffffff,
			      tmp);
	}
}

static void gen_rk3399_pi_params(struct timing_related_config *timing_config,
				 struct dram_timing_t *pdram_timing,
				 uint32_t fn)
{
	if (fn == 0)
		gen_rk3399_pi_params_f0(timing_config, pdram_timing);
	else
		gen_rk3399_pi_params_f1(timing_config, pdram_timing);

#if PI_TRAINING
		uint32_t i;

		for (i = 0; i < timing_config->ch_cnt; i++) {
#if EN_READ_GATE_TRAINING
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[80], 3 << 24,
			      2 << 24);
#endif

#if EN_CA_TRAINING
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[100], 3 << 8,
			      2 << 8);
#endif

#if EN_WRITE_LEVELING
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[60], 3 << 8,
			      2 << 8);
#endif

#if EN_READ_LEVELING
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[80], 3 << 16,
			      2 << 16);
#endif

#if EN_WDQ_LEVELING
		clrsetbits_32(&rk3399_ddr_pi[i]->denali_pi[124], 3 << 16,
			      2 << 16);
#endif
		}
#endif
}

static void gen_rk3399_set_odt(uint32_t odt_en)
{
	uint32_t drv_odt_val;
	uint32_t i;

	for (i = 0; i < rk3399_dram_status.timing_config.ch_cnt; i++) {
		drv_odt_val = (odt_en | (0 << 1) | (0 << 2)) << 16;
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[5],
				  0x7 << 16, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[133],
				  0x7 << 16, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[261],
				  0x7 << 16, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[389],
				  0x7 << 16, drv_odt_val);
		drv_odt_val = (odt_en | (0 << 1) | (0 << 2)) << 24;
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[6],
				  0x7 << 24, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[134],
				  0x7 << 24, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[262],
				  0x7 << 24, drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[390],
				  0x7 << 24, drv_odt_val);
	}
}

static void gen_rk3399_set_ds_odt(struct timing_related_config *timing_config,
				  struct drv_odt_lp_config *drv_config)
{
	uint32_t i, drv_odt_val;

	for (i = 0; i < timing_config->ch_cnt; i++) {
		if (timing_config->dram_type == LPDDR4)
			drv_odt_val = drv_config->phy_side_odt |
				(PHY_DRV_ODT_Hi_Z << 4) |
				(drv_config->phy_side_dq_drv << 8) |
				(drv_config->phy_side_dq_drv << 12);
		else if (timing_config->dram_type == LPDDR3)
			drv_odt_val = PHY_DRV_ODT_Hi_Z |
				(drv_config->phy_side_odt << 4) |
				(drv_config->phy_side_dq_drv << 8) |
				(drv_config->phy_side_dq_drv << 12);
		else
			drv_odt_val = drv_config->phy_side_odt |
				(drv_config->phy_side_odt << 4) |
				(drv_config->phy_side_dq_drv << 8) |
				(drv_config->phy_side_dq_drv << 12);

		/* DQ drv odt set */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[6], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[134], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[262], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[390], 0xffffff,
				  drv_odt_val);
		/* DQS drv odt set */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[7], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[135], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[263], 0xffffff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[391], 0xffffff,
				  drv_odt_val);

		gen_rk3399_set_odt(timing_config->odt);

		/* CA drv set */
		drv_odt_val = drv_config->phy_side_ca_drv |
			(drv_config->phy_side_ca_drv << 4);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[544], 0xff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[672], 0xff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[800], 0xff,
				  drv_odt_val);

		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[928], 0xff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[937], 0xff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[935], 0xff,
				  drv_odt_val);

		drv_odt_val = drv_config->phy_side_ck_cs_drv |
			(drv_config->phy_side_ck_cs_drv << 4);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[929], 0xff,
				  drv_odt_val);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[939], 0xff,
				  drv_odt_val);
	}
}

static void gen_rk3399_phy_params(struct timing_related_config *timing_config,
				  struct drv_odt_lp_config *drv_config,
				  struct dram_timing_t *pdram_timing,
				  uint32_t fn)
{
	uint32_t tmp, i, div, j;
	uint32_t mem_delay_ps, pad_delay_ps, total_delay_ps, delay_frac_ps;
	uint32_t trpre_min_ps, gate_delay_ps, gate_delay_frac_ps;
	uint32_t ie_enable, tsel_enable, cas_lat, rddata_en_ie_dly, tsel_adder;
	uint32_t extra_adder, delta, hs_offset;

	for (i = 0; i < timing_config->ch_cnt; i++) {

		pad_delay_ps = PI_PAD_DELAY_PS_VALUE;
		ie_enable = PI_IE_ENABLE_VALUE;
		tsel_enable = PI_TSEL_ENABLE_VALUE;

		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[896],
			      (0x3 << 8) | 1, fn << 8);

		/* PHY_LOW_FREQ_SEL */
		/* DENALI_PHY_913 1bit offset_0 */
		if (timing_config->freq > 400)
			clrbits_32(&rk3399_ddr_publ[i]->denali_phy[913], 1);
		else
			setbits_32(&rk3399_ddr_publ[i]->denali_phy[913], 1);

		/* PHY_RPTR_UPDATE_x */
		/* DENALI_PHY_87/215/343/471 4bit offset_16 */
		tmp = 2500 / (1000000 / pdram_timing->mhz) + 3;
		if ((2500 % (1000000 / pdram_timing->mhz)) != 0)
			tmp++;
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[87], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[215], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[343], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[471], 0xf << 16,
			      tmp << 16);

		/* PHY_PLL_CTRL */
		/* DENALI_PHY_911 13bits offset_0 */
		/* PHY_LP4_BOOT_PLL_CTRL */
		/* DENALI_PHY_919 13bits offset_0 */
		if (pdram_timing->mhz <= 150)
			tmp = 3;
		else if (pdram_timing->mhz <= 300)
			tmp = 2;
		else if (pdram_timing->mhz <= 600)
			tmp = 1;
		else
			tmp = 0;
		tmp = (1 << 12) | (tmp << 9) | (2 << 7) | (1 << 1);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[911], 0x1fff,
			      tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[919], 0x1fff,
			      tmp);

		/* PHY_PLL_CTRL_CA */
		/* DENALI_PHY_911 13bits offset_16 */
		/* PHY_LP4_BOOT_PLL_CTRL_CA */
		/* DENALI_PHY_919 13bits offset_16 */
		if (pdram_timing->mhz <= 150)
			tmp = 3;
		else if (pdram_timing->mhz <= 300)
			tmp = 2;
		else if (pdram_timing->mhz <= 600)
			tmp = 1;
		else
			tmp = 0;
		tmp = (tmp << 9) | (2 << 7) | (1 << 5) | (1 << 1);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[911],
			      0x1fff << 16, tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[919],
			      0x1fff << 16, tmp << 16);

		/* PHY_TCKSRE_WAIT */
		/* DENALI_PHY_922 4bits offset_24 */
		if (pdram_timing->mhz <= 400)
			tmp = 1;
		else if (pdram_timing->mhz <= 800)
			tmp = 3;
		else if (pdram_timing->mhz <= 1000)
			tmp = 4;
		else
			tmp = 5;
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[922], 0xf << 24,
			      tmp << 24);
		/* PHY_CAL_CLK_SELECT_0:RW8:3 */
		div = pdram_timing->mhz / (2 * 20);
		for (j = 2, tmp = 1; j <= 128; j <<= 1, tmp++) {
			if (div < j)
				break;
		}
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[947], 0x7 << 8,
			      tmp << 8);
		setbits_32(&rk3399_ddr_publ[i]->denali_phy[927], (1 << 22));

		if (timing_config->dram_type == DDR3) {
			mem_delay_ps = 0;
			trpre_min_ps = 1000;
		} else if (timing_config->dram_type == LPDDR4) {
			mem_delay_ps = 1500;
			trpre_min_ps = 900;
		} else if (timing_config->dram_type == LPDDR3) {
			mem_delay_ps = 2500;
			trpre_min_ps = 900;
		} else {
			ERROR("gen_rk3399_phy_params:dramtype unsupport\n");
			return;
		}
		total_delay_ps = mem_delay_ps + pad_delay_ps;
		delay_frac_ps =
		    1000 * total_delay_ps / (1000000 / pdram_timing->mhz);
		gate_delay_ps = delay_frac_ps + 1000 - (trpre_min_ps / 2);
		gate_delay_frac_ps =
		    gate_delay_ps - gate_delay_ps / 1000 * 1000;
		tmp = gate_delay_frac_ps * 0x200 / 1000;
		/* PHY_RDDQS_GATE_BYPASS_SLAVE_DELAY */
		/* DENALI_PHY_2/130/258/386 10bits offset_0 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[2], 0x2ff, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[130], 0x2ff, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[258], 0x2ff, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[386], 0x2ff, tmp);
		/* PHY_RDDQS_GATE_SLAVE_DELAY */
		/* DENALI_PHY_77/205/333/461 10bits offset_16 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[77], 0x2ff << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[205], 0x2ff << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[333], 0x2ff << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[461], 0x2ff << 16,
			      tmp << 16);

		tmp = gate_delay_ps / 1000;
		/* PHY_LP4_BOOT_RDDQS_LATENCY_ADJUST */
		/* DENALI_PHY_10/138/266/394 4bit offset_0 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[10], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[138], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[266], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[394], 0xf, tmp);
		/* PHY_RDDQS_LATENCY_ADJUST */
		/* DENALI_PHY_78/206/334/462 4bits offset_0 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[78], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[206], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[334], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[462], 0xf, tmp);
		/* PHY_GTLVL_LAT_ADJ_START */
		/* DENALI_PHY_80/208/336/464 4bits offset_16 */
		tmp = delay_frac_ps / 1000;
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[80], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[208], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[336], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[464], 0xf << 16,
			      tmp << 16);

		cas_lat = pdram_timing->cl + PI_ADD_LATENCY;
		rddata_en_ie_dly = ie_enable / (1000000 / pdram_timing->mhz);
		if ((ie_enable % (1000000 / pdram_timing->mhz)) != 0)
			rddata_en_ie_dly++;
		rddata_en_ie_dly = rddata_en_ie_dly - 1;
		tsel_adder = tsel_enable / (1000000 / pdram_timing->mhz);
		if ((tsel_enable % (1000000 / pdram_timing->mhz)) != 0)
			tsel_adder++;
		if (rddata_en_ie_dly > tsel_adder)
			extra_adder = rddata_en_ie_dly - tsel_adder;
		else
			extra_adder = 0;
		delta = cas_lat - rddata_en_ie_dly;
		if (PI_REGS_DIMM_SUPPORT && PI_DOUBLEFREEK)
			hs_offset = 2;
		else
			hs_offset = 1;
		if (rddata_en_ie_dly > (cas_lat - 1 - hs_offset)) {
			tmp = 0;
		} else {
			if ((delta == 2) || (delta == 1))
				tmp = rddata_en_ie_dly - 0 - extra_adder;
			else
				tmp = extra_adder;
		}
		/* PHY_LP4_BOOT_RDDATA_EN_TSEL_DLY */
		/* DENALI_PHY_9/137/265/393 4bit offset_16 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[9], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[137], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[265], 0xf << 16,
			      tmp << 16);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[393], 0xf << 16,
			      tmp << 16);
		/* PHY_RDDATA_EN_TSEL_DLY */
		/* DENALI_PHY_86/214/342/470 4bit offset_0 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[86], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[214], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[342], 0xf, tmp);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[470], 0xf, tmp);

		if (tsel_adder > rddata_en_ie_dly)
			extra_adder = tsel_adder - rddata_en_ie_dly;
		else
			extra_adder = 0;
		if (rddata_en_ie_dly > (cas_lat - 1 - hs_offset))
			tmp = tsel_adder;
		else
			tmp = rddata_en_ie_dly - 0 + extra_adder;
		/* PHY_LP4_BOOT_RDDATA_EN_DLY */
		/* DENALI_PHY_9/137/265/393 4bit offset_8 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[9], 0xf << 8,
			      tmp << 8);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[137], 0xf << 8,
			      tmp << 8);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[265], 0xf << 8,
			      tmp << 8);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[393], 0xf << 8,
			      tmp << 8);
		/* PHY_RDDATA_EN_DLY */
		/* DENALI_PHY_85/213/341/469 4bit offset_24 */
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[85], 0xf << 24,
			      tmp << 24);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[213], 0xf << 24,
			      tmp << 24);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[341], 0xf << 24,
			      tmp << 24);
		clrsetbits_32(&rk3399_ddr_publ[i]->denali_phy[469], 0xf << 24,
			      tmp << 24);

		if (pdram_timing->mhz <= ENPER_CS_TRAINING_FREQ) {

			/*
			 * Note:Per-CS Training is not compatible at speeds
			 * under 533 MHz. If the PHY is running at a speed
			 * less than 533MHz, all phy_per_cs_training_en_X
			 * parameters must be cleared to 0.
			 */

			/*DENALI_PHY_84/212/340/468 1bit offset_16 */
			clrbits_32(&rk3399_ddr_publ[i]->denali_phy[84],
				   0x1 << 16);
			clrbits_32(&rk3399_ddr_publ[i]->denali_phy[212],
				   0x1 << 16);
			clrbits_32(&rk3399_ddr_publ[i]->denali_phy[340],
				   0x1 << 16);
			clrbits_32(&rk3399_ddr_publ[i]->denali_phy[468],
				   0x1 << 16);
		} else {
			setbits_32(&rk3399_ddr_publ[i]->denali_phy[84],
				   0x1 << 16);
			setbits_32(&rk3399_ddr_publ[i]->denali_phy[212],
				   0x1 << 16);
			setbits_32(&rk3399_ddr_publ[i]->denali_phy[340],
				   0x1 << 16);
			setbits_32(&rk3399_ddr_publ[i]->denali_phy[468],
				   0x1 << 16);
		}
	}
}

static int to_get_clk_index(unsigned int mhz)
{
	int pll_cnt, i;

	pll_cnt = sizeof(dpll_rates_table) / sizeof(struct pll_div);

	/* Assumming rate_table is in descending order */
	for (i = 0; i < pll_cnt; i++) {
		if (mhz >= dpll_rates_table[i].mhz)
			break;
	}

	return i;
}

uint32_t rkclk_prepare_pll_timing(unsigned int mhz)
{
	unsigned int refdiv, postdiv1, fbdiv, postdiv2;
	int index;

	index = to_get_clk_index(mhz);
	refdiv = dpll_rates_table[index].refdiv;
	fbdiv = dpll_rates_table[index].fbdiv;
	postdiv1 = dpll_rates_table[index].postdiv1;
	postdiv2 = dpll_rates_table[index].postdiv2;
	write_32(DCF_PARAM_ADDR + PARAM_DPLL_CON0, FBDIV(fbdiv));
	write_32(DCF_PARAM_ADDR + PARAM_DPLL_CON1, POSTDIV2(postdiv2) |
		 POSTDIV1(postdiv1) | REFDIV(refdiv));
	return (24 * fbdiv) / refdiv / postdiv1 / postdiv2;
}

uint64_t ddr_get_rate(void)
{
	uint32_t refdiv, postdiv1, fbdiv, postdiv2;

	refdiv = mmio_read_32(CRU_BASE + CRU_PLL_CON(DPLL_ID, 1)) & 0x3f;
	fbdiv = mmio_read_32(CRU_BASE + CRU_PLL_CON(DPLL_ID, 0)) & 0xfff;
	postdiv1 =
		(mmio_read_32(CRU_BASE + CRU_PLL_CON(DPLL_ID, 1)) >> 8) & 0x7;
	postdiv2 =
		(mmio_read_32(CRU_BASE + CRU_PLL_CON(DPLL_ID, 1)) >> 12) & 0x7;

	return (24 / refdiv * fbdiv / postdiv1 / postdiv2) * 1000 * 1000;
}

/*
 * return: bit12: channel 1, external self-refresh
 *         bit11: channel 1, stdby_mode
 *         bit10: channel 1, self-refresh with controller and memory clock gate
 *         bit9: channel 1, self-refresh
 *         bit8: channel 1, power-down
 *
 *         bit4: channel 1, external self-refresh
 *         bit3: channel 0, stdby_mode
 *         bit2: channel 0, self-refresh with controller and memory clock gate
 *         bit1: channel 0, self-refresh
 *         bit0: channel 0, power-down
 */
uint32_t exit_low_power(void)
{
	struct rk3399_ddr_pctl_regs *ddr_pctl_regs;
	uint32_t low_power = 0;
	uint32_t channel_mask;
	uint32_t channel;
	uint32_t tmp;

	channel_mask = (read_32(PMUGRF_BASE + PMUGRF_OSREG(2)) >> 28) & 0x3;
	for (channel = 0; channel < 2; channel++) {
		ddr_pctl_regs = rk3399_ddr_pctl[channel];
		if (!(channel_mask & (1 << channel)))
			continue;

		/* exit stdby mode */
		low_power |=
		    ((read_32(&rk3399_ddr_cic->cic_ctrl1) >>
		      channel) & 0x1) << (3 + 8 * channel);
		write_32(&rk3399_ddr_cic->cic_ctrl1,
			 (1 << (channel + 16)) | (0 << channel));
		/* exit external self-refresh */
		tmp = channel ? 12 : 8;
		low_power |= ((read_32(PMU_BASE + PMU_SFT_CON) >> tmp) & 0x1)
		    << (4 + 8 * channel);
		clrbits_32(PMU_BASE + PMU_SFT_CON, 1 << tmp);
		while (!(read_32(PMU_BASE + PMU_DDR_SREF_ST) &
				(1 << channel)))
			;
		/* exit auto low-power */
		low_power |= (read_32(&ddr_pctl_regs->denali_ctl[101]) &
				      0xf) << (8 * channel);
		clrbits_32(&ddr_pctl_regs->denali_ctl[101], 0xf);
		/* lp_cmd to exit */
		if (((read_32(&ddr_pctl_regs->denali_ctl[100]) >> 24) &
			      0x7f) != 0x40) {
			while (read_32(&ddr_pctl_regs->denali_ctl[200]) & 0x1)
				;
			clrsetbits_32(&ddr_pctl_regs->denali_ctl[93],
				      0xff << 24, 0x69 << 24);
			while (((read_32(&ddr_pctl_regs->denali_ctl[100]) >>
					  24) & 0x7f) != 0x40)
				;
		}
	}
	return low_power;
}

void resume_low_power(uint32_t low_power)
{
	struct rk3399_ddr_pctl_regs *ddr_pctl_regs;
	uint32_t channel_mask;
	uint32_t channel;
	uint32_t tmp;
	uint32_t val;

	channel_mask = (read_32(PMUGRF_BASE + PMUGRF_OSREG(2)) >> 28) & 0x3;
	for (channel = 0; channel < 2; channel++) {
		ddr_pctl_regs = rk3399_ddr_pctl[channel];
		if (!(channel_mask & (1 << channel)))
			continue;

		/* resume external self-refresh */
		tmp = channel ? 12 : 8;
		val = (low_power >> (4 + 8 * channel)) & 0x1;
		setbits_32(PMU_BASE + PMU_SFT_CON, val << tmp);
		/* resume auto low-power */
		val = (low_power >> (8 * channel)) & 0xf;
		setbits_32(&ddr_pctl_regs->denali_ctl[101], val);
		/* resume stdby mode */
		val = (low_power >> (3 + 8 * channel)) & 0x1;
		write_32(&rk3399_ddr_cic->cic_ctrl1,
			 (1 << (channel + 16)) | (val << channel));
	}
}

static void wait_dcf_done(void)
{
	while ((read_32(DCF_BASE + DCF_DCF_ISR) & (DCF_DONE)) == 0)
		continue;
}

void clr_dcf_irq(void)
{
	/* clear dcf irq status */
	mmio_write_32(DCF_BASE + DCF_DCF_ISR, DCF_TIMEOUT | DCF_ERR | DCF_DONE);
}

static void enable_dcf(uint32_t dcf_addr)
{
	/* config DCF start addr */
	write_32(DCF_BASE + DCF_DCF_ADDR, dcf_addr);
	/* wait dcf done */
	while (read_32(DCF_BASE + DCF_DCF_CTRL) & 1)
		continue;
	/* clear dcf irq status */
	write_32(DCF_BASE + DCF_DCF_ISR, DCF_TIMEOUT | DCF_ERR | DCF_DONE);
	/* DCF start */
	setbits_32(DCF_BASE + DCF_DCF_CTRL, DCF_START);
}

void dcf_code_init(void)
{
	memcpy((void *)DCF_START_ADDR, (void *)dcf_code, sizeof(dcf_code));
	/* set dcf master secure */
	write_32(SGRF_BASE + 0xe01c, ((0x3 << 0) << 16) | (0 << 0));
	write_32(DCF_BASE + DCF_DCF_TOSET, 0x80000000);
}

static void dcf_start(uint32_t freq, uint32_t index)
{
	write_32(CRU_BASE + CRU_SOFTRST_CON(10), (0x1 << (1 + 16)) | (1 << 1));
	write_32(CRU_BASE + CRU_SOFTRST_CON(11), (0x1 << (0 + 16)) | (1 << 0));
	write_32(DCF_PARAM_ADDR + PARAM_FREQ_SELECT, index << 4);

	write_32(DCF_PARAM_ADDR + PARAM_DRAM_FREQ, freq);

	rkclk_prepare_pll_timing(freq);
	udelay(10);
	write_32(CRU_BASE + CRU_SOFTRST_CON(10), (0x1 << (1 + 16)) | (0 << 1));
	write_32(CRU_BASE + CRU_SOFTRST_CON(11), (0x1 << (0 + 16)) | (0 << 0));
	udelay(10);
	enable_dcf(DCF_START_ADDR);
}

static void dram_low_power_config(struct drv_odt_lp_config *lp_config)
{
	uint32_t tmp, tmp1, i;
	uint32_t ch_cnt = rk3399_dram_status.timing_config.ch_cnt;
	uint32_t dram_type = rk3399_dram_status.timing_config.dram_type;

	if (dram_type == LPDDR4)
		tmp = (lp_config->srpd_lite_idle << 16) |
		      lp_config->pd_idle;
	else
		tmp = lp_config->pd_idle;

	if (dram_type == DDR3)
		tmp1 = (2 << 16) | (0x7 << 8) | 7;
	else
		tmp1 = (3 << 16) | (0x7 << 8) | 7;

	for (i = 0; i < ch_cnt; i++) {
		write_32(&rk3399_ddr_pctl[i]->denali_ctl[102], tmp);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[103], 0xffff,
			      (lp_config->sr_mc_gate_idle << 8) |
			      lp_config->sr_idle);
		clrsetbits_32(&rk3399_ddr_pctl[i]->denali_ctl[101],
			      0x70f0f, tmp1);
	}

	/* standby idle */
	write_32(&rk3399_ddr_cic->cic_idle_th, lp_config->standby_idle);
	write_32(&rk3399_ddr_cic->cic_cg_wait_th, 0x640008);

	if (ch_cnt == 2) {
		write_32(GRF_BASE + GRF_DDRC1_CON1,
			 (((0x1<<4) | (0x1<<5) | (0x1<<6) | (0x1<<7)) << 16) |
			 ((0x1<<4) | (0x0<<5) | (0x1<<6) | (0x1<<7)));
		if (lp_config->standby_idle)
			tmp = 0x002a002a;
		else
			tmp = 0;
		write_32(&rk3399_ddr_cic->cic_ctrl1, tmp);
	}

	write_32(GRF_BASE + GRF_DDRC0_CON1,
		 (((0x1<<4) | (0x1<<5) | (0x1<<6) | (0x1<<7)) << 16) |
		 ((0x1<<4) | (0x0<<5) | (0x1<<6) | (0x1<<7)));
	if (lp_config->standby_idle)
		tmp = 0x00150015;
	else
		tmp = 0;
	write_32(&rk3399_ddr_cic->cic_ctrl1, tmp);
}


static void dram_related_init(struct ddr_dts_config_timing *dts_timing)
{
	uint32_t trefi0, trefi1;
	uint32_t i;
	struct rk3399_sdram_config sdram_config;

	dcf_code_init();

	/* get sdram config for os reg */
	sdram_config_init(&sdram_config);
	drv_odt_lp_cfg_init(sdram_config.dramtype, dts_timing,
			    &rk3399_dram_status.drv_odt_lp_cfg);
	sdram_timing_cfg_init(&rk3399_dram_status.timing_config,
			      &sdram_config,
			      &rk3399_dram_status.drv_odt_lp_cfg);

	trefi0 = ((read_32(&rk3399_ddr_pctl[0]->denali_ctl[48]) >>
		   16) & 0xffff) + 8;
	trefi1 = ((read_32(&rk3399_ddr_pctl[0]->denali_ctl[49]) >>
		   16) & 0xffff) + 8;

	rk3399_dram_status.index_freq[0] = trefi0 * 10 / 39;
	rk3399_dram_status.index_freq[1] = trefi1 * 10 / 39;
	rk3399_dram_status.current_index =
	    (read_32(&rk3399_ddr_pctl[0]->denali_ctl[111])
	     >> 16) & 0x3;
	if (rk3399_dram_status.timing_config.dram_type == DDR3) {
		rk3399_dram_status.index_freq[0] /= 2;
		rk3399_dram_status.index_freq[1] /= 2;
	}
	rk3399_dram_status.index_freq[(rk3399_dram_status.current_index + 1)
				      & 0x1] = 0;

	/* disable all training by ctl and pi */
	for (i = 0; i < rk3399_dram_status.timing_config.ch_cnt; i++) {
		clrbits_32(&rk3399_ddr_pctl[i]->denali_ctl[70], (1 << 24) |
				(1 << 16) | (1 << 8) | 1);
		clrbits_32(&rk3399_ddr_pctl[i]->denali_ctl[71], 1);

		clrbits_32(&rk3399_ddr_pi[i]->denali_pi[60], 0x3 << 8);
		clrbits_32(&rk3399_ddr_pi[i]->denali_pi[80], (0x3 << 24) |
				(0x3 << 16));
		clrbits_32(&rk3399_ddr_pi[i]->denali_pi[100], 0x3 << 8);
		clrbits_32(&rk3399_ddr_pi[i]->denali_pi[124], 0x3 << 16);
	}

	/* init drv odt */
	if (rk3399_dram_status.index_freq[rk3399_dram_status.current_index] <
		rk3399_dram_status.drv_odt_lp_cfg.odt_dis_freq)
		rk3399_dram_status.timing_config.odt = 0;
	else
		rk3399_dram_status.timing_config.odt = 1;
	gen_rk3399_set_ds_odt(&rk3399_dram_status.timing_config,
			&rk3399_dram_status.drv_odt_lp_cfg);
	dram_low_power_config(&rk3399_dram_status.drv_odt_lp_cfg);
}

static uint32_t prepare_ddr_timing(uint32_t mhz)
{
	uint32_t index;
	struct dram_timing_t dram_timing;

	rk3399_dram_status.timing_config.freq = mhz;

	if (mhz < rk3399_dram_status.drv_odt_lp_cfg.ddr3_dll_dis_freq)
		rk3399_dram_status.timing_config.dllbp = 1;
	else
		rk3399_dram_status.timing_config.dllbp = 0;
	if (mhz < rk3399_dram_status.drv_odt_lp_cfg.odt_dis_freq) {
		rk3399_dram_status.timing_config.odt = 0;
	} else {
		rk3399_dram_status.timing_config.odt = 1;
		gen_rk3399_set_odt(1);
	}

	index = (rk3399_dram_status.current_index + 1) & 0x1;
	if (rk3399_dram_status.index_freq[index] == mhz)
		goto out;

	/*
	 * checking if having available gate traiing timing for
	 * target freq.
	 */
	dram_get_parameter(&rk3399_dram_status.timing_config, &dram_timing);

	gen_rk3399_ctl_params(&rk3399_dram_status.timing_config,
			      &dram_timing, index);
	gen_rk3399_pi_params(&rk3399_dram_status.timing_config,
			     &dram_timing, index);
	gen_rk3399_phy_params(&rk3399_dram_status.timing_config,
			      &rk3399_dram_status.drv_odt_lp_cfg,
			      &dram_timing, index);
	rk3399_dram_status.index_freq[index] = mhz;


out:
	return index;
}

void print_dram_status_info(void)
{
	uint32_t *p;
	uint32_t i;

	p = (uint32_t *) &rk3399_dram_status.timing_config;
	INFO("rk3399_dram_status.timing_config:\n");
	for (i = 0; i < sizeof(struct timing_related_config) / 4; i++)
		tf_printf("%u\n", p[i]);
	p = (uint32_t *) &rk3399_dram_status.drv_odt_lp_cfg;
	INFO("rk3399_dram_status.drv_odt_lp_cfg:\n");
	for (i = 0; i < sizeof(struct drv_odt_lp_config) / 4; i++)
		tf_printf("%u\n", p[i]);
}

uint64_t ddr_set_rate(uint64_t hz)
{
	uint32_t low_power, index;
	uint32_t mhz = hz / (1000 * 1000);

	if (mhz ==
	    rk3399_dram_status.index_freq[rk3399_dram_status.current_index])
		goto out;

	low_power = exit_low_power();
	index = prepare_ddr_timing(mhz);
	if (index > 1) {
		/* set timing error, quit */
		mhz = 0;
		goto out;
	}

	dcf_start(mhz, index);
	wait_dcf_done();
	if (rk3399_dram_status.timing_config.odt == 0)
		gen_rk3399_set_odt(0);

	rk3399_dram_status.current_index = index;
	resume_low_power(low_power);
out:
	return mhz;
}

uint64_t ddr_round_rate(uint64_t hz)
{
	int index;
	uint32_t mhz = hz / (1000 * 1000);

	index = to_get_clk_index(mhz);

	return dpll_rates_table[index].mhz * 1000 * 1000;
}

uint64_t dts_timing_receive(uint64_t timing, uint64_t index)
{
	uint32_t *p = (uint32_t *) &dts_parameter;
	static uint32_t receive_nums;

	if (index < (sizeof(dts_parameter) / sizeof(uint32_t) - 1)) {
		p[index] = (uint32_t)timing;
		receive_nums++;
	} else {
		dts_parameter.available = 0;
		return -1;
	}

	/* receive all parameter */
	if (receive_nums  == (sizeof(dts_parameter) / sizeof(uint32_t) - 1)) {
		dts_parameter.available = 1;
		receive_nums = 0;
	}

	return index;
}

void ddr_init(void)
{
	dram_related_init(&dts_parameter);
}
