Skip to content

Commit deb8c6d

Browse files
Viorel SumanYe Li
Viorel Suman
authored and
Ye Li
committed
LFU-609 ddr: imx95: add QB training data collect function
Add DDR PHY training data collect function for iMX95. Function allows transfering training data over USB connection to host machine using fastboot "upload -v snps-ddr-phy-qb -f qb_data.bin" command on host side. Signed-off-by: Viorel Suman <[email protected]> Reviewed-by: Ye Li <[email protected]>
1 parent 9abbe3e commit deb8c6d

File tree

5 files changed

+48
-3
lines changed

5 files changed

+48
-3
lines changed

arch/arm/include/asm/arch-imx9/ddr.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ struct dram_timing_info {
101101

102102
extern struct dram_timing_info dram_timing;
103103

104+
#if defined(CONFIG_IMX93) /* CONFIG_IMX93 */
104105
#if (defined(CONFIG_IMX_SNPS_DDR_PHY_QB_GEN) || defined(CONFIG_IMX_SNPS_DDR_PHY_QB))
105106
#define DDRPHY_QB_FSP_SIZE 3
106107
#define DDRPHY_QB_ERR_SIZE 6
@@ -126,6 +127,43 @@ int ddrphy_qb_save(void);
126127
int ddr_cfg_phy_qb(struct dram_timing_info *timing_info, int fsp_id);
127128
#endif
128129
#endif
130+
#elif defined(CONFIG_IMX95) /* CONFIG_IMX95 */
131+
#if defined(CONFIG_IMX_SNPS_DDR_PHY_QB_GEN)
132+
/* Quick Boot related */
133+
#define DDRPHY_QB_CSR_SIZE 5168
134+
#define DDRPHY_QB_ACSM_SIZE 4 * 1024
135+
#define DDRPHY_QB_MSB_SIZE 0x200
136+
#define DDRPHY_QB_PSTATES 0
137+
#define DDRPHY_QB_PST_SIZE DDRPHY_QB_PSTATES * 4 * 1024
138+
struct ddrphy_qb_state {
139+
u8 TrainedVREFCA_A0;
140+
u8 TrainedVREFCA_A1;
141+
u8 TrainedVREFCA_B0;
142+
u8 TrainedVREFCA_B1;
143+
u8 TrainedVREFDQ_A0;
144+
u8 TrainedVREFDQ_A1;
145+
u8 TrainedVREFDQ_B0;
146+
u8 TrainedVREFDQ_B1;
147+
u8 TrainedVREFDQU_A0;
148+
u8 TrainedVREFDQU_A1;
149+
u8 TrainedVREFDQU_B0;
150+
u8 TrainedVREFDQU_B1;
151+
u8 TrainedDRAMDFE_A0;
152+
u8 TrainedDRAMDFE_A1;
153+
u8 TrainedDRAMDFE_B0;
154+
u8 TrainedDRAMDFE_B1;
155+
u8 TrainedDRAMDCA_A0;
156+
u8 TrainedDRAMDCA_A1;
157+
u8 TrainedDRAMDCA_B0;
158+
u8 TrainedDRAMDCA_B1;
159+
u16 csr[DDRPHY_QB_CSR_SIZE];
160+
u16 acsm[DDRPHY_QB_ACSM_SIZE];
161+
u16 pst[DDRPHY_QB_PST_SIZE];
162+
};
163+
#elif defined(CONFIG_IMX_SNPS_DDR_PHY_QB)
164+
#error "Quick Boot flow not supported in SPL for iMX95, please use DDR OEI!"
165+
#endif /* #if defined(CONFIG_IMX_SNPS_DDR_PHY_QB_GEN) */
166+
#endif /* #elif defined(CONFIG_IMX95) */
129167

130168
void ddr_load_train_firmware(enum fw_type type);
131169
int ddr_init(struct dram_timing_info *timing_info);

configs/imx95_19x19_evk_defconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,6 @@ CONFIG_CLK_CCF=y
218218
CONFIG_SPL_CLK_CCF=y
219219

220220
CONFIG_SPL_RECOVER_DATA_SECTION=y
221+
222+
CONFIG_IMX_SNPS_DDR_PHY_QB_GEN=y
223+
CONFIG_SAVED_QB_STATE_BASE=0x4aa00000

drivers/ddr/imx/phy/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ config IMX_SNPS_DDR_PHY
55

66
config IMX_SNPS_DDR_PHY_QB_GEN
77
bool "i.MX Synopsys DDR PHY training data generation for QuickBoot mode"
8-
depends on IMX_SNPS_DDR_PHY
8+
depends on IMX_SNPS_DDR_PHY || IMX95
99
help
1010
Select the DDR PHY training data generation for QuickBoot support on i.MX9 SOC.
1111

drivers/ddr/imx/phy/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
ifdef CONFIG_SPL_BUILD
88
obj-$(CONFIG_IMX_SNPS_DDR_PHY) += helper.o ddrphy_utils.o ddrphy_train.o ddrphy_csr.o
9+
ifdef CONFIG_IMX93
910
obj-$(CONFIG_IMX_SNPS_DDR_PHY_QB_GEN) += ddrphy_qb_gen.o ddrphy_qb_errata.o
1011
obj-$(CONFIG_IMX_SNPS_DDR_PHY_QB) += ddrphy_qb.o ddrphy_qb_errata.o
1112
endif
13+
endif

drivers/fastboot/fb_fsl/fb_fsl_command.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,15 +225,17 @@ static void upload(char *cmd_parameter, char *response)
225225
#if CONFIG_IS_ENABLED(IMX_SNPS_DDR_PHY_QB_GEN)
226226
if (endswith(cmd_parameter, "snps-ddr-phy-qb")) {
227227
struct ddrphy_qb_state *qb_state;
228+
#if CONFIG_IS_ENABLED(IMX93)
228229
uint32_t crc;
229-
230+
#endif
230231
qb_state = (struct ddrphy_qb_state *)CONFIG_SAVED_QB_STATE_BASE;
232+
#if CONFIG_IS_ENABLED(IMX93)
231233
crc = crc32(0, (void *)&(qb_state->flags), DDRPHY_QB_STATE_SIZE);
232234

233235
if (crc != qb_state->crc)
234236
log_err("DDRPHY TD CRC error SPL->U-Boot: spl=0x%08x, uboot=0x%08x\n",
235237
qb_state->crc, crc);
236-
238+
#endif
237239
send(response, (const char *)qb_state, sizeof(struct ddrphy_qb_state));
238240
return;
239241
}

0 commit comments

Comments
 (0)