MLK-20163-03 board: imx8mq_evk: Refact the imx8mq dram init code
Refact the i.MX8MQ dram init flow to reuse the common dram driver used by i.MX8MM. Signed-off-by: Bai Ping <ping.bai@nxp.com>
This commit is contained in:
parent
cb43368096
commit
f773733d4a
|
|
@ -21,6 +21,7 @@ config TARGET_IMX8MQ_EVK
|
|||
bool "imx8mq_evk"
|
||||
select IMX8MQ
|
||||
select SUPPORT_SPL
|
||||
select IMX8M_LPDDR4
|
||||
|
||||
config TARGET_IMX8MQ_DDR3L_ARM2
|
||||
bool "imx8mq_ddr3l_arm2"
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@ obj-y += imx8mq_evk.o
|
|||
|
||||
ifdef CONFIG_SPL_BUILD
|
||||
obj-y += spl.o
|
||||
obj-y += ddr/ddr_init.o ddr/ddrphy_train.o ddr/helper.o
|
||||
obj-$(CONFIG_IMX8M_LPDDR4) += lpddr4_timing.o lpddr4_timing_b0.o
|
||||
endif
|
||||
|
|
|
|||
|
|
@ -1,34 +0,0 @@
|
|||
/*
|
||||
* Copyright 2017 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
enum fw_type {
|
||||
FW_1D_IMAGE,
|
||||
FW_2D_IMAGE,
|
||||
};
|
||||
|
||||
void ddr_init(void);
|
||||
void ddr_load_train_code(enum fw_type type);
|
||||
void lpddr4_800M_cfg_phy(void);
|
||||
|
||||
static inline void reg32_write(unsigned long addr, u32 val)
|
||||
{
|
||||
writel(val, addr);
|
||||
}
|
||||
|
||||
static inline uint32_t reg32_read(unsigned long addr)
|
||||
{
|
||||
return readl(addr);
|
||||
}
|
||||
|
||||
static void inline dwc_ddrphy_apb_wr(unsigned long addr, u32 val)
|
||||
{
|
||||
writel(val, addr);
|
||||
}
|
||||
|
||||
static inline void reg32setbit(unsigned long addr, u32 bit)
|
||||
{
|
||||
setbits_le32(addr, (1 << bit));
|
||||
}
|
||||
|
|
@ -1,275 +0,0 @@
|
|||
/*
|
||||
* Copyright 2017-2018 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/ddr.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include "ddr.h"
|
||||
|
||||
#ifdef CONFIG_ENABLE_DDR_TRAINING_DEBUG
|
||||
#define ddr_printf(args...) printf(args)
|
||||
#else
|
||||
#define ddr_printf(args...)
|
||||
#endif
|
||||
|
||||
#include "wait_ddrphy_training_complete.c"
|
||||
#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
|
||||
#define DDR_BOOT_P1 /* default DDR boot frequency point */
|
||||
#define WR_POST_EXT_3200
|
||||
|
||||
volatile unsigned int tmp, tmp_t, i;
|
||||
void lpddr4_800MHz_cfg_umctl2(void)
|
||||
{
|
||||
/* Start to config, default 3200mbps */
|
||||
/* dis_dq=1, indicates no reads or writes are issued to SDRAM */
|
||||
reg32_write(DDRC_DBG1(0), 0x00000001);
|
||||
/* selfref_en=1, SDRAM enter self-refresh state */
|
||||
reg32_write(DDRC_PWRCTL(0), 0x00000001);
|
||||
reg32_write(DDRC_MSTR(0), 0xa3080020);
|
||||
reg32_write(DDRC_MSTR2(0), 0x00000000);
|
||||
reg32_write(DDRC_RFSHTMG(0), 0x006100E0);
|
||||
reg32_write(DDRC_INIT0(0), 0xC003061B);
|
||||
reg32_write(DDRC_INIT1(0), 0x009D0000);
|
||||
reg32_write(DDRC_INIT3(0), 0x00D4002D);
|
||||
#ifdef WR_POST_EXT_3200 // recommened to define
|
||||
reg32_write(DDRC_INIT4(0), 0x00330008);
|
||||
#else
|
||||
reg32_write(DDRC_INIT4(0), 0x00310008);
|
||||
#endif
|
||||
reg32_write(DDRC_INIT6(0), 0x0066004a);
|
||||
reg32_write(DDRC_INIT7(0), 0x0006004a);
|
||||
|
||||
reg32_write(DDRC_DRAMTMG0(0), 0x1A201B22);
|
||||
reg32_write(DDRC_DRAMTMG1(0), 0x00060633);
|
||||
reg32_write(DDRC_DRAMTMG3(0), 0x00C0C000);
|
||||
reg32_write(DDRC_DRAMTMG4(0), 0x0F04080F);
|
||||
reg32_write(DDRC_DRAMTMG5(0), 0x02040C0C);
|
||||
reg32_write(DDRC_DRAMTMG6(0), 0x01010007);
|
||||
reg32_write(DDRC_DRAMTMG7(0), 0x00000401);
|
||||
reg32_write(DDRC_DRAMTMG12(0), 0x00020600);
|
||||
reg32_write(DDRC_DRAMTMG13(0), 0x0C100002);
|
||||
reg32_write(DDRC_DRAMTMG14(0), 0x000000E6);
|
||||
reg32_write(DDRC_DRAMTMG17(0), 0x00A00050);
|
||||
|
||||
reg32_write(DDRC_ZQCTL0(0), 0x03200018);
|
||||
reg32_write(DDRC_ZQCTL1(0), 0x028061A8);
|
||||
reg32_write(DDRC_ZQCTL2(0), 0x00000000);
|
||||
|
||||
reg32_write(DDRC_DFITMG0(0), 0x0497820A);
|
||||
reg32_write(DDRC_DFITMG1(0), 0x00080303);
|
||||
reg32_write(DDRC_DFIUPD0(0), 0xE0400018);
|
||||
reg32_write(DDRC_DFIUPD1(0), 0x00DF00E4);
|
||||
reg32_write(DDRC_DFIUPD2(0), 0x80000000);
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000011);
|
||||
reg32_write(DDRC_DFITMG2(0), 0x0000170A);
|
||||
|
||||
reg32_write(DDRC_DBICTL(0), 0x00000001);
|
||||
reg32_write(DDRC_DFIPHYMSTR(0), 0x00000001);
|
||||
|
||||
/* need be refined by ddrphy trained value */
|
||||
reg32_write(DDRC_RANKCTL(0), 0x00000c99);
|
||||
reg32_write(DDRC_DRAMTMG2(0), 0x070E171a);
|
||||
|
||||
/* address mapping */
|
||||
/* Address map is from MSB 29: r15, r14, cs, r13-r0, b2-b0, c9-c0 */
|
||||
reg32_write(DDRC_ADDRMAP0(0), 0x00000015);
|
||||
reg32_write(DDRC_ADDRMAP3(0), 0x00000000);
|
||||
/* addrmap_col_b10 and addrmap_col_b11 set to de-activated (5-bit width) */
|
||||
reg32_write(DDRC_ADDRMAP4(0), 0x00001F1F);
|
||||
/* bank interleave */
|
||||
/* addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0 */
|
||||
reg32_write(DDRC_ADDRMAP1(0), 0x00080808);
|
||||
/* addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0 */
|
||||
reg32_write(DDRC_ADDRMAP5(0), 0x07070707);
|
||||
/* addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12 */
|
||||
reg32_write(DDRC_ADDRMAP6(0), 0x08080707);
|
||||
|
||||
/* 667mts frequency setting */
|
||||
reg32_write(DDRC_FREQ1_DERATEEN(0), 0x0000000);
|
||||
reg32_write(DDRC_FREQ1_DERATEINT(0), 0x0800000);
|
||||
reg32_write(DDRC_FREQ1_RFSHCTL0(0), 0x0210000);
|
||||
reg32_write(DDRC_FREQ1_RFSHTMG(0), 0x014001E);
|
||||
reg32_write(DDRC_FREQ1_INIT3(0), 0x0140009);
|
||||
reg32_write(DDRC_FREQ1_INIT4(0), 0x00310008);
|
||||
reg32_write(DDRC_FREQ1_INIT6(0), 0x0066004a);
|
||||
reg32_write(DDRC_FREQ1_INIT7(0), 0x0006004a);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG0(0), 0xB070A07);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG1(0), 0x003040A);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG2(0), 0x305080C);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG3(0), 0x0505000);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG4(0), 0x3040203);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG5(0), 0x2030303);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG6(0), 0x2020004);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG7(0), 0x0000302);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG12(0), 0x0020310);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG13(0), 0xA100002);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG14(0), 0x0000020);
|
||||
reg32_write(DDRC_FREQ1_DRAMTMG17(0), 0x0220011);
|
||||
reg32_write(DDRC_FREQ1_ZQCTL0(0), 0x0A70005);
|
||||
reg32_write(DDRC_FREQ1_DFITMG0(0), 0x3858202);
|
||||
reg32_write(DDRC_FREQ1_DFITMG1(0), 0x0000404);
|
||||
reg32_write(DDRC_FREQ1_DFITMG2(0), 0x0000502);
|
||||
|
||||
/* performance setting */
|
||||
dwc_ddrphy_apb_wr(DDRC_ODTCFG(0), 0x0b060908);
|
||||
dwc_ddrphy_apb_wr(DDRC_ODTMAP(0), 0x00000000);
|
||||
dwc_ddrphy_apb_wr(DDRC_SCHED(0), 0x29511505);
|
||||
dwc_ddrphy_apb_wr(DDRC_SCHED1(0), 0x0000002c);
|
||||
dwc_ddrphy_apb_wr(DDRC_PERFHPR1(0), 0x5900575b);
|
||||
/* 150T starve and 0x90 max tran len */
|
||||
dwc_ddrphy_apb_wr(DDRC_PERFLPR1(0), 0x90000096);
|
||||
/* 300T starve and 0x10 max tran len */
|
||||
dwc_ddrphy_apb_wr(DDRC_PERFWR1(0), 0x1000012c);
|
||||
dwc_ddrphy_apb_wr(DDRC_DBG0(0), 0x00000016);
|
||||
dwc_ddrphy_apb_wr(DDRC_DBG1(0), 0x00000000);
|
||||
dwc_ddrphy_apb_wr(DDRC_DBGCMD(0), 0x00000000);
|
||||
dwc_ddrphy_apb_wr(DDRC_SWCTL(0), 0x00000001);
|
||||
dwc_ddrphy_apb_wr(DDRC_POISONCFG(0), 0x00000011);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCCFG(0), 0x00000111);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGR_0(0), 0x000010f3);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGW_0(0), 0x000072ff);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCTRL_0(0), 0x00000001);
|
||||
/* disable Read Qos*/
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGQOS0_0(0), 0x00000e00);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGQOS1_0(0), 0x0062ffff);
|
||||
/* disable Write Qos*/
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGWQOS0_0(0), 0x00000e00);
|
||||
dwc_ddrphy_apb_wr(DDRC_PCFGWQOS1_0(0), 0x0000ffff);
|
||||
dwc_ddrphy_apb_wr(DDRC_FREQ1_DERATEEN(0), 0x00000202);
|
||||
dwc_ddrphy_apb_wr(DDRC_FREQ1_DERATEINT(0), 0xec78f4b5);
|
||||
dwc_ddrphy_apb_wr(DDRC_FREQ1_RFSHCTL0(0), 0x00618040);
|
||||
dwc_ddrphy_apb_wr(DDRC_FREQ1_RFSHTMG(0), 0x00610090);
|
||||
}
|
||||
|
||||
void ddr_init(void)
|
||||
{
|
||||
reg32_write(SRC_DDRC_RCR_ADDR + 0x04, 0x8F00000F);
|
||||
reg32_write(SRC_DDRC_RCR_ADDR, 0x8F00000F);
|
||||
mdelay(100);
|
||||
reg32_write(SRC_DDRC_RCR_ADDR + 0x04, 0x8F000000);
|
||||
|
||||
/* change the clock source of dram_apb_clk_root */
|
||||
reg32_write(CCM_IP_CLK_ROOT_GEN_TAGET_CLR(1), (0x7<<24)|(0x7<<16));
|
||||
reg32_write(CCM_IP_CLK_ROOT_GEN_TAGET_SET(1), (0x4<<24)|(0x3<<16));
|
||||
|
||||
/* disable iso */
|
||||
reg32_write(0x303A00EC, 0x0000ffff); /* PGC_CPU_MAPPING */
|
||||
reg32setbit(0x303A00F8, 5); /* PU_PGC_SW_PUP_REQ */
|
||||
|
||||
dram_pll_init(SSCG_PLL_OUT_800M);
|
||||
|
||||
reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000006);
|
||||
|
||||
/* Configure uMCTL2's registers */
|
||||
lpddr4_800MHz_cfg_umctl2();
|
||||
|
||||
#ifdef DDR_BOOT_P2
|
||||
reg32_write(DDRC_MSTR2(0), 0x2);
|
||||
#else
|
||||
#ifdef DDR_BOOT_P1
|
||||
reg32_write(DDRC_MSTR2(0), 0x1);
|
||||
#endif
|
||||
#endif
|
||||
/* release [1]ddr1_core_reset_n, [2]ddr1_phy_reset, [3]ddr1_phy_pwrokin_n */
|
||||
reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000004);
|
||||
|
||||
/* release [1]ddr1_core_reset_n, [2]ddr1_phy_reset, [3]ddr1_phy_pwrokin_n */
|
||||
reg32_write(SRC_DDRC_RCR_ADDR, 0x8F000000);
|
||||
|
||||
reg32_write(DDRC_DBG1(0), 0x00000000);
|
||||
tmp = reg32_read(DDRC_PWRCTL(0));
|
||||
reg32_write(DDRC_PWRCTL(0), 0x000000a8);
|
||||
|
||||
while ((reg32_read(DDRC_STAT(0)) & 0x33f) != 0x223)
|
||||
;
|
||||
|
||||
reg32_write(DDRC_SWCTL(0), 0x00000000);
|
||||
|
||||
/* LPDDR4 mode */
|
||||
reg32_write(DDRC_DDR_SS_GPR0, 0x01);
|
||||
|
||||
#ifdef DDR_BOOT_P1
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000110);
|
||||
#else
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000010);
|
||||
#endif
|
||||
/* LPDDR4 PHY config and training */
|
||||
lpddr4_800M_cfg_phy();
|
||||
|
||||
reg32_write(DDRC_RFSHCTL3(0), 0x00000000);
|
||||
|
||||
reg32_write(DDRC_SWCTL(0), 0x0000);
|
||||
|
||||
/* Set DFIMISC.dfi_init_start to 1 */
|
||||
#ifdef DDR_BOOT_P2
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000230);
|
||||
#else
|
||||
#ifdef DDR_BOOT_P1
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000130);
|
||||
#else
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000030);
|
||||
#endif
|
||||
#endif
|
||||
reg32_write(DDRC_SWCTL(0), 0x0001);
|
||||
|
||||
/* wait DFISTAT.dfi_init_complete to 1 */
|
||||
while ((reg32_read(DDRC_DFISTAT(0)) & 0x1) == 0x0)
|
||||
;
|
||||
|
||||
reg32_write(DDRC_SWCTL(0), 0x0000);
|
||||
|
||||
#ifdef DDR_BOOT_P2
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000210);
|
||||
/* set DFIMISC.dfi_init_complete_en again */
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000211);
|
||||
#else
|
||||
#ifdef DDR_BOOT_P1
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000110);
|
||||
/* set DFIMISC.dfi_init_complete_en again */
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000111);
|
||||
#else
|
||||
/* clear DFIMISC.dfi_init_complete_en */
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000010);
|
||||
/* set DFIMISC.dfi_init_complete_en again */
|
||||
reg32_write(DDRC_DFIMISC(0), 0x00000011);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
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) == 0x0)
|
||||
;
|
||||
|
||||
/* 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);
|
||||
|
||||
tmp = reg32_read(DDRC_CRCPARSTAT(0));
|
||||
|
||||
reg32_write(DDRC_PCTRL_0(0), 0x00000001);
|
||||
|
||||
tmp = reg32_read(DDRC_CRCPARSTAT(0));
|
||||
reg32_write(DDRC_RFSHCTL3(0), 0x00000000);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,104 +0,0 @@
|
|||
/*
|
||||
* Copyright 2017 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <spl.h>
|
||||
#include <asm/io.h>
|
||||
#include <errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/ddr.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
#include "ddr.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#define IMEM_LEN 32768//23400 //byte
|
||||
#define DMEM_LEN 16384//1720 //byte
|
||||
#define IMEM_2D_OFFSET 49152
|
||||
|
||||
#define IMEM_OFFSET_ADDR 0x00050000
|
||||
#define DMEM_OFFSET_ADDR 0x00054000
|
||||
#define DDR_TRAIN_CODE_BASE_ADDR IP2APB_DDRPHY_IPS_BASE_ADDR(0)
|
||||
|
||||
/* We need PHY iMEM PHY is 32KB padded */
|
||||
void ddr_load_train_code(enum fw_type type)
|
||||
{
|
||||
u32 tmp32, i;
|
||||
u32 error = 0;
|
||||
unsigned long pr_to32, pr_from32;
|
||||
unsigned long fw_offset = type ? IMEM_2D_OFFSET : 0;
|
||||
unsigned long imem_start = (unsigned long)&_end + fw_offset;
|
||||
unsigned long dmem_start = imem_start + IMEM_LEN;
|
||||
|
||||
pr_from32 = imem_start;
|
||||
pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR;
|
||||
for(i = 0x0; i < IMEM_LEN; ){
|
||||
tmp32 = readl(pr_from32);
|
||||
writew(tmp32 & 0x0000ffff, pr_to32);
|
||||
pr_to32 += 4;
|
||||
writew((tmp32 >> 16) & 0x0000ffff, pr_to32);
|
||||
pr_to32 += 4;
|
||||
pr_from32 += 4;
|
||||
i += 4;
|
||||
}
|
||||
|
||||
pr_from32 = dmem_start;
|
||||
pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR;
|
||||
for(i = 0x0; i < DMEM_LEN;){
|
||||
tmp32 = readl(pr_from32);
|
||||
writew(tmp32 & 0x0000ffff, pr_to32);
|
||||
pr_to32 += 4;
|
||||
writew((tmp32 >> 16) & 0x0000ffff, pr_to32);
|
||||
pr_to32 += 4;
|
||||
pr_from32 += 4;
|
||||
i += 4;
|
||||
}
|
||||
|
||||
printf("check ddr4_pmu_train_imem code\n");
|
||||
pr_from32 = imem_start;
|
||||
pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * IMEM_OFFSET_ADDR;
|
||||
for(i = 0x0; i < IMEM_LEN;){
|
||||
tmp32 = (readw(pr_to32) & 0x0000ffff);
|
||||
pr_to32 += 4;
|
||||
tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16);
|
||||
|
||||
if(tmp32 != readl(pr_from32)){
|
||||
printf("%lx %lx\n", pr_from32, pr_to32);
|
||||
error++;
|
||||
}
|
||||
pr_from32 += 4;
|
||||
pr_to32 += 4;
|
||||
i += 4;
|
||||
}
|
||||
if(error){
|
||||
printf("check ddr4_pmu_train_imem code fail=%d\n",error);
|
||||
}else{
|
||||
printf("check ddr4_pmu_train_imem code pass\n");
|
||||
}
|
||||
|
||||
printf("check ddr4_pmu_train_dmem code\n");
|
||||
pr_from32 = dmem_start;
|
||||
pr_to32 = DDR_TRAIN_CODE_BASE_ADDR + 4 * DMEM_OFFSET_ADDR;
|
||||
for(i = 0x0; i < DMEM_LEN;){
|
||||
tmp32 = (readw(pr_to32) & 0x0000ffff);
|
||||
pr_to32 += 4;
|
||||
tmp32 += ((readw(pr_to32) & 0x0000ffff) << 16);
|
||||
if(tmp32 != readl(pr_from32)){
|
||||
printf("%lx %lx\n", pr_from32, pr_to32);
|
||||
error++;
|
||||
}
|
||||
pr_from32 += 4;
|
||||
pr_to32 += 4;
|
||||
i += 4;
|
||||
}
|
||||
|
||||
if(error){
|
||||
printf("check ddr4_pmu_train_dmem code fail=%d",error);
|
||||
}else{
|
||||
printf("check ddr4_pmu_train_dmem code pass\n");
|
||||
}
|
||||
}
|
||||
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
#ifndef __LPDDR4_DVFS_H__
|
||||
#define __LPDDR4_DVFS_H__
|
||||
#include <asm/arch/ddr.h>
|
||||
|
||||
#define DFILP_SPT
|
||||
|
||||
#define ANAMIX_PLL_BASE_ADDR 0x30360000
|
||||
#define HW_DRAM_PLL_CFG0_ADDR (ANAMIX_PLL_BASE_ADDR + 0x60)
|
||||
#define HW_DRAM_PLL_CFG1_ADDR (ANAMIX_PLL_BASE_ADDR + 0x64)
|
||||
#define HW_DRAM_PLL_CFG2_ADDR (ANAMIX_PLL_BASE_ADDR + 0x68)
|
||||
|
||||
#define LPDDR4_HDT_CTL_2D 0xC8 /* stage completion */
|
||||
#define LPDDR4_HDT_CTL_3200_1D 0xC8 /* stage completion */
|
||||
#define LPDDR4_HDT_CTL_400_1D 0xC8 /* stage completion */
|
||||
#define LPDDR4_HDT_CTL_100_1D 0xC8 /* stage completion */
|
||||
|
||||
/* 2D share & weight */
|
||||
#define LPDDR4_2D_WEIGHT 0x1f7f
|
||||
#define LPDDR4_2D_SHARE 1
|
||||
#define LPDDR4_CATRAIN_3200_1d 0
|
||||
#define LPDDR4_CATRAIN_400 0
|
||||
#define LPDDR4_CATRAIN_100 0
|
||||
#define LPDDR4_CATRAIN_3200_2d 0
|
||||
|
||||
#define WR_POST_EXT_3200 /* recommened to define */
|
||||
|
||||
/* lpddr4 phy training config */
|
||||
/* for LPDDR4 Rtt */
|
||||
#define LPDDR4_RTT40 6
|
||||
#define LPDDR4_RTT48 5
|
||||
#define LPDDR4_RTT60 4
|
||||
#define LPDDR4_RTT80 3
|
||||
#define LPDDR4_RTT120 2
|
||||
#define LPDDR4_RTT240 1
|
||||
#define LPDDR4_RTT_DIS 0
|
||||
|
||||
/* for LPDDR4 Ron */
|
||||
#define LPDDR4_RON34 7
|
||||
#define LPDDR4_RON40 6
|
||||
#define LPDDR4_RON48 5
|
||||
#define LPDDR4_RON60 4
|
||||
#define LPDDR4_RON80 3
|
||||
|
||||
#define LPDDR4_PHY_ADDR_RON60 0x1
|
||||
#define LPDDR4_PHY_ADDR_RON40 0x3
|
||||
#define LPDDR4_PHY_ADDR_RON30 0x7
|
||||
#define LPDDR4_PHY_ADDR_RON24 0xf
|
||||
#define LPDDR4_PHY_ADDR_RON20 0x1f
|
||||
|
||||
/* for read channel */
|
||||
#define LPDDR4_RON LPDDR4_RON40 /* MR3[5:3] */
|
||||
#define LPDDR4_PHY_RTT 30
|
||||
#define LPDDR4_PHY_VREF_VALUE 17
|
||||
|
||||
/* for write channel */
|
||||
#define LPDDR4_PHY_RON 30
|
||||
#define LPDDR4_PHY_ADDR_RON LPDDR4_PHY_ADDR_RON40
|
||||
#define LPDDR4_RTT_DQ LPDDR4_RTT40 /* MR11[2:0] */
|
||||
#define LPDDR4_RTT_CA LPDDR4_RTT40 /* MR11[6:4] */
|
||||
#define LPDDR4_RTT_CA_BANK0 LPDDR4_RTT40 /* MR11[6:4] */
|
||||
#define LPDDR4_RTT_CA_BANK1 LPDDR4_RTT40 /* LPDDR4_RTT_DIS//MR11[6:4] */
|
||||
#define LPDDR4_VREF_VALUE_CA ((1<<6)|(0xd)) /*((0<<6)|(0xe)) MR12 */
|
||||
#define LPDDR4_VREF_VALUE_DQ_RANK0 ((1<<6)|(0xd)) /* MR14 */
|
||||
#define LPDDR4_VREF_VALUE_DQ_RANK1 ((1<<6)|(0xd)) /* MR14 */
|
||||
#define LPDDR4_MR22_RANK0 ((0<<5)|(1<<4)|(0<<3)|(LPDDR4_RTT40)) /* MR22: OP[5:3]ODTD-CA,CS,CK */
|
||||
#define LPDDR4_MR22_RANK1 ((0<<5)|(1<<4)|(0<<3)|(LPDDR4_RTT40)) /* MR22: OP[5:3]ODTD-CA,CS,CK */
|
||||
#define LPDDR4_MR3_PU_CAL 1 /* MR3[0] */
|
||||
|
||||
#define LPDDR4_2D_WEIGHT 0x1f7f
|
||||
#define LPDDR4_2D_SHARE 1
|
||||
|
||||
#endif /*__LPDDR4_DVFS_H__ */
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
/*
|
||||
* Copyright 2017 NXP
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0+
|
||||
*/
|
||||
|
||||
static inline void poll_pmu_message_ready(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
|
||||
do {
|
||||
reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0004);
|
||||
} while (reg & 0x1);
|
||||
}
|
||||
|
||||
static inline void ack_pmu_message_recieve(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
|
||||
reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0031,0x0);
|
||||
|
||||
do {
|
||||
reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0004);
|
||||
} while (!(reg & 0x1));
|
||||
|
||||
reg32_write(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0031,0x1);
|
||||
}
|
||||
|
||||
static inline unsigned int get_mail(void)
|
||||
{
|
||||
unsigned int reg;
|
||||
|
||||
poll_pmu_message_ready();
|
||||
|
||||
reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0032);
|
||||
|
||||
ack_pmu_message_recieve();
|
||||
|
||||
return reg;
|
||||
}
|
||||
|
||||
static inline unsigned int get_stream_message(void)
|
||||
{
|
||||
unsigned int reg, reg2;
|
||||
|
||||
poll_pmu_message_ready();
|
||||
|
||||
reg = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0032);
|
||||
|
||||
reg2 = reg32_read(IP2APB_DDRPHY_IPS_BASE_ADDR(0)+4*0xd0034);
|
||||
|
||||
reg2 = (reg2 << 16) | reg;
|
||||
|
||||
ack_pmu_message_recieve();
|
||||
|
||||
return reg2;
|
||||
}
|
||||
|
||||
static inline void decode_major_message(unsigned int mail)
|
||||
{
|
||||
ddr_printf("[PMU Major message = 0x%08x]\n", mail);
|
||||
}
|
||||
|
||||
static inline void decode_streaming_message(void)
|
||||
{
|
||||
unsigned int string_index, arg __maybe_unused;
|
||||
int i = 0;
|
||||
|
||||
string_index = get_stream_message();
|
||||
ddr_printf(" PMU String index = 0x%08x\n", string_index);
|
||||
while (i < (string_index & 0xffff)){
|
||||
arg = get_stream_message();
|
||||
ddr_printf(" arg[%d] = 0x%08x\n", i, arg);
|
||||
i++;
|
||||
}
|
||||
|
||||
ddr_printf("\n");
|
||||
}
|
||||
|
||||
void wait_ddrphy_training_complete(void)
|
||||
{
|
||||
unsigned int mail;
|
||||
while (1) {
|
||||
mail = get_mail();
|
||||
decode_major_message(mail);
|
||||
if (mail == 0x08) {
|
||||
decode_streaming_message();
|
||||
} else if (mail == 0x07) {
|
||||
printf("Training PASS\n");
|
||||
break;
|
||||
} else if (mail == 0xff) {
|
||||
printf("Training FAILED\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -21,14 +21,19 @@
|
|||
#include <asm/mach-imx/mxc_i2c.h>
|
||||
#include <fsl_esdhc.h>
|
||||
#include <mmc.h>
|
||||
#include "ddr/ddr.h"
|
||||
#include <asm/arch/imx8m_ddr.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
extern struct dram_timing_info dram_timing_b0;
|
||||
|
||||
void spl_dram_init(void)
|
||||
{
|
||||
/* ddr init */
|
||||
ddr_init();
|
||||
if ((get_cpu_rev() & 0xfff) == CHIP_REV_2_1)
|
||||
ddr_init(&dram_timing);
|
||||
else
|
||||
ddr_init(&dram_timing_b0);
|
||||
}
|
||||
|
||||
#define I2C_PAD_CTRL (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ CONFIG_ARCH_IMX8M=y
|
|||
CONFIG_SYS_TEXT_BASE=0x40200000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_TARGET_IMX8MQ_EVK=y
|
||||
CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
|
||||
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,ANDROID_SUPPORT"
|
||||
CONFIG_EFI_PARTITION=y
|
||||
CONFIG_ARCH_MISC_INIT=y
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ CONFIG_ARCH_IMX8M=y
|
|||
CONFIG_SYS_TEXT_BASE=0x40200000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_TARGET_IMX8MQ_EVK=y
|
||||
CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
|
||||
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg,ANDROID_THINGS_SUPPORT"
|
||||
CONFIG_EFI_PARTITION=y
|
||||
CONFIG_ARCH_MISC_INIT=y
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ CONFIG_ARCH_IMX8M=y
|
|||
CONFIG_SYS_TEXT_BASE=0x40200000
|
||||
CONFIG_SYS_MALLOC_F_LEN=0x2000
|
||||
CONFIG_TARGET_IMX8MQ_EVK=y
|
||||
CONFIG_SAVED_DRAM_TIMING_BASE=0x40000000
|
||||
CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=arch/arm/mach-imx/spl_sd.cfg"
|
||||
CONFIG_ARCH_MISC_INIT=y
|
||||
CONFIG_SPL=y
|
||||
|
|
|
|||
Loading…
Reference in New Issue