On Sun, Jul 27, 2025 at 11:14 PM Peng Fan (OSS) <peng....@oss.nxp.com> wrote: > > From: Viorel Suman <viorel.su...@nxp.com> > > Implement Synopsys LPDDR PHY QuickBoot flow.
What does "QuickBoot flow" mean? What are the motivations/advantages of adding support for it? Please expand the commit message to explain why you are doing this. > +config IMX_SNPS_DDR_PHY_QB > + bool "i.MX Synopsys DDR PHY QuickBoot mode" > + depends on IMX_SNPS_DDR_PHY && !IMX_SNPS_DDR_PHY_QB_GEN > + help > + Select the DDR PHY QuickBoot mode on i.MX9 SOC. Nothing selects IMX_SNPS_DDR_PHY_QB in this series, so this patch is only adding dead code. > +static int ddrphy_qb_restore(struct dram_timing_info *info, int fsp_id) > +{ > + int i; > + u32 to_addr; > + struct dram_fsp_msg *fsp_msg; > + struct dram_cfg_param *dram_cfg; > + > + fsp_msg = &info->fsp_msg[fsp_id]; > + for (i = 0; i < fsp_msg->fsp_cfg_num; i++) { > + dram_cfg = &fsp_msg->fsp_cfg[i]; > + dwc_ddrphy_apb_wr(dram_cfg->reg, dram_cfg->val); > + } > + > + /* enable the ddrphy apb */ > + dwc_ddrphy_apb_wr(0xd0000, 0x00); > + dwc_ddrphy_apb_wr(0x54008, 0x01); /* SequenceCtrl = 0x1 (DevInit > Only)*/ > + ddrphy_w(0x5400c, 0x19, 0x1); /* Lp4Quickboot = 0x1 */ > + > + /* Adjust MR14_xy if pstate=0 and 2D training data collected during > training phase */ > + if (fsp_id == 0 && (qb_state.flags & DDRPHY_QB_FLAG_2D)) { > + ddrphy_w(0x5401c, 0x39, qb_state.fsp[0] >> 8); /* > TrainedVREFDQ_A0 -> MR14_A0 */ > + ddrphy_w(0x54022, 0x45, qb_state.fsp[1] & 0xFF); /* > TrainedVREFDQ_A1 -> MR14_A1 */ > + ddrphy_w(0x54036, 0x6c, qb_state.fsp[2] & 0xFF); /* > TrainedVREFDQ_B0 -> MR14_B0 */ > + ddrphy_w(0x5403c, 0x78, qb_state.fsp[2] >> 8); /* > TrainedVREFDQ_B1 -> MR14_B1 */ > + } > + > + /* save CSRs to address starting with 0x54800 */ > + for (i = 0, to_addr = 0x54800; i < DDRPHY_QB_CSR_SIZE; i++, to_addr++) > + dwc_ddrphy_apb_wr(to_addr, qb_state.csr[i]); > + > + /* disable the ddrphy apb */ > + dwc_ddrphy_apb_wr(0xd0000, 0x01); Lots of magic numbers in this function. > + > + return 0; No need to return 0. Make the function 'void'. > +int ddr_cfg_phy_qb(struct dram_timing_info *dram_timing, int fsp_id) > +{ > + int ret; > + > + /* MemReset Toggle */ > + dwc_ddrphy_apb_wr(0xd0000, 0x0); > + dwc_ddrphy_apb_wr(0x20060, 0x3); > + dwc_ddrphy_apb_wr(0x2008F, 0x1); > + > + /* load the dram quick boot firmware image */ > + dwc_ddrphy_apb_wr(0xd0000, 0x0); > + ddr_load_train_firmware(FW_1D_IMAGE); > + ddrphy_qb_restore(dram_timing, fsp_id); > + > + /* excute the firmware */ > + dwc_ddrphy_apb_wr(0xd0000, 0x0); > + dwc_ddrphy_apb_wr(0xc0080, 0x3); > + dwc_ddrphy_apb_wr(0xd0031, 0x1); > + dwc_ddrphy_apb_wr(0xd0000, 0x1); > + dwc_ddrphy_apb_wr(0xd0099, 0x9); > + dwc_ddrphy_apb_wr(0xd0099, 0x1); > + dwc_ddrphy_apb_wr(0xd0099, 0x0); > + > + /* Wait for the quick boot firmware to complete */ Is there a special firmware for this quick boot firmware? Please explain the details. It is not clear why or how someone should enable this QuickBoot feature.