Hello Kumar,

On Thu, May 28, 2026 at 10:55:23AM +0530, Kumar, Udit wrote:
> 
> 
> On 4/30/2026 2:03 PM, Simona Toaca (OSS) wrote:
> > From: Simona Toaca <[email protected]>
> > 
> > DDR training data can be saved to NVM and be available
> > to OEI at boot time, which will trigger QuickBoot flow.
> > 
> > U-Boot only checks for data integrity (CRC32), while
> > OEI is in charge of authentication when it tries to
> > load the data from NVM.
> > 
> >  
[...]
> > +#define DDRPHY_QB_PSTATES  0
> > +#define DDRPHY_QB_PST_SIZE (DDRPHY_QB_PSTATES * 4 * 1024)
> 
> [..]
> Sorry for basic question, in case OEI layer changes format due to one of
> other reason then how you are making sure, struct ddrphy_qb_state is
> aligned
> 
> + * This structure needs to be aligned with the one in OEI.
> 
For now, the structure is stable. If anything changes, I will take care
to update U-Boot accordingly.

> 
> [..]
> > +
> > +bool imx_qb_check(void)
> > +{
> > +   struct ddrphy_qb_state *qb_state;
> > +   u32 size, crc;
> > +
> > +   /**
> > +    * Ensure CRC is not empty, the reason is that
> > +    * the data is invalidated after first save run
> > +    * or after it is overwritten.
> > +    */
> 
> In case OEI layer using saved DDR training data, then will
> passed CRC will be zero ?
> 
No, the data in DRAM isn't guaranteed to be 0 after 'qb save' and
then reset. It is 0 only immediately after a successful 'qb save'.

> > +   qb_state = (struct ddrphy_qb_state *)CONFIG_QB_SAVED_STATE_BASE;
> 
> If yes then you can return from here, if no CRC found instead of doing
> crc calculation.
Agreed, but the CRC32 doesn't add significant overhead and, more often than
not, the data will not be 0, but something else.
> 
> > +   size = sizeof(struct ddrphy_qb_state) - sizeof(qb_state->crc);
> > +   crc = crc32(0, (u8 *)qb_state->mac, size);
> > +
> > +   if (!qb_state->crc || crc != qb_state->crc)
> > +           return false;
> > +
> > +   return true;
> > +}
> > +
> [..]
> > +
> > +void spl_imx_qb_save(void)
> > +{
> > +   /* Save QB data on current boot device */
> > +   if (imx_qb("auto", "", true))
> > +           printf("QB save failed\n");
> 
> In case, of 3rd boot or so, there is no need to save training data,
> whereas you will return error, in case this feature is auto enabled.
> 
There is no way to tell from U-Boot if Quickboot flow was run or not,
so that is why 'qb save' is tried everytime. The data in DRAM can be
invalid for 2 reasons:
- it was saved by Training flow, but it got corrupted/got saved wrong
- Quickboot flow was run so no data was saved - this doesn't mean that the
data in DRAM will be 0

> > +}
> [..]

Best regards,
Simona

Reply via email to