Hello Andrey Romanov,
Byte 3 of SPD data is used to identify the SDRAM memory module type. According to your attachment, byte 3 is "0C", please refer to the following definition in include/ddr_spd.h.
#define DDR4_SPD_MODULETYPE_16B_SO_DIMM (0x0C)
In the function ddr_compute_dimm_parameters in u-boot source code drivers/ddr/fsl/ddr4_dimm_params.c, the module type DDR4_SPD_MODULETYPE_16B_SO_DIMM is not listed in the module type, please try whether it can work after modifying u-boot source code as the following.
case DDR4_SPD_MODULETYPE_UDIMM:
case DDR4_SPD_MODULETYPE_SO_DIMM:
case DDR4_SPD_MODULETYPE_16B_SO_DIMM:
/* Unbuffered DIMMs */
if (spd->mod_section.unbuffered.addr_mapping & 0x1)
pdimm->mirrored_dimm = 1;
if ((spd->mod_section.unbuffered.mod_height & 0xe0) == 0 &&
(spd->mod_section.unbuffered.ref_raw_card == 0x04)) {
/* Fix SPD error found on DIMMs with raw card E0 */
for (i = 0; i < 18; i++) {
if (spd->mapping[i] == udimm_rc_e_dq[i])
continue;
spd_error = 1;
debug("SPD byte %d: 0x%x, should be 0x%x\n",
60 + i, spd->mapping[i],
udimm_rc_e_dq[i]);
ptr = (u8 *)&spd->mapping[i];
*ptr = udimm_rc_e_dq[i];
}
Thanks,
Yiping