soc/intel/tigerlake: add common routine for DDR init
Add a common routine meminit_ddr() that calls the appropriate meminit routine based on whether the memory type requested is LPDDR4x or DDR4. BUG=b:161772961 TEST='emerge-volteer coreboot chromeos-bootimage' and verify that volteer still boots. NOTE that this only tests the lpddr4 side of the implementation. I do not have a DDR4 board to test this on. Change-Id: Ib2039eb89211efc48d10897eb679d05f567ae5a1 Signed-off-by: Nick Vaccaro <nvaccaro@google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/44249 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Angel Pons <th3fanbus@gmail.com> Reviewed-by: Ravishankar Sarawadi <ravishankar.sarawadi@intel.com> Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
This commit is contained in:
parent
7245a098d0
commit
0cc63ccaa2
|
@ -21,6 +21,11 @@ enum mem_topology {
|
||||||
MIXED, /* CH0 = MD, CH1 = SODIMM (only for DDR4). */
|
MIXED, /* CH0 = MD, CH1 = SODIMM (only for DDR4). */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ddr_memtype {
|
||||||
|
MEMTYPE_DDR4, /* Uses DDR4 memory */
|
||||||
|
MEMTYPE_LPDDR4X, /* Uses LPDDR4x memory */
|
||||||
|
};
|
||||||
|
|
||||||
enum md_spd_loc {
|
enum md_spd_loc {
|
||||||
/* Read SPD from pointer provided to memory location. */
|
/* Read SPD from pointer provided to memory location. */
|
||||||
SPD_MEMPTR,
|
SPD_MEMPTR,
|
||||||
|
@ -127,9 +132,24 @@ struct mb_ddr4_cfg {
|
||||||
uint8_t ect;
|
uint8_t ect;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* DDR Memory Information - Supports DDR4 and LPDDR4x */
|
||||||
|
struct ddr_memory_cfg {
|
||||||
|
enum ddr_memtype mem_type;
|
||||||
|
union {
|
||||||
|
const struct mb_ddr4_cfg *ddr4_cfg;
|
||||||
|
const struct lpddr4x_cfg *lpddr4_cfg;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Initialize LPDDR4x memory configurations */
|
||||||
void meminit_lpddr4x(FSP_M_CONFIG *mem_cfg, const struct lpddr4x_cfg *board_cfg,
|
void meminit_lpddr4x(FSP_M_CONFIG *mem_cfg, const struct lpddr4x_cfg *board_cfg,
|
||||||
const struct spd_info *spd, bool half_populated);
|
const struct spd_info *spd, bool half_populated);
|
||||||
|
|
||||||
/* Initialize DDR4 memory configurations */
|
/* Initialize DDR4 memory configurations */
|
||||||
void meminit_ddr4(FSP_M_CONFIG *mem_cfg, const struct mb_ddr4_cfg *board_cfg,
|
void meminit_ddr4(FSP_M_CONFIG *mem_cfg, const struct mb_ddr4_cfg *board_cfg,
|
||||||
const struct spd_info *spd, const bool half_populated);
|
const struct spd_info *spd, const bool half_populated);
|
||||||
|
|
||||||
|
/* Determine which DDR memory is used and call appropriate init routine */
|
||||||
|
void meminit_ddr(FSP_M_CONFIG *mem_cfg, const struct ddr_memory_cfg *board_cfg,
|
||||||
|
const struct spd_info *info, bool half_populated);
|
||||||
#endif /* _SOC_TIGERLAKE_MEMINIT_H_ */
|
#endif /* _SOC_TIGERLAKE_MEMINIT_H_ */
|
||||||
|
|
|
@ -435,3 +435,20 @@ void meminit_ddr4(FSP_M_CONFIG *mem_cfg, const struct mb_ddr4_cfg *board_cfg,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void meminit_ddr(FSP_M_CONFIG *mem_cfg, const struct ddr_memory_cfg *board_cfg,
|
||||||
|
const struct spd_info *info, bool half_populated)
|
||||||
|
{
|
||||||
|
switch (board_cfg->mem_type) {
|
||||||
|
case MEMTYPE_DDR4:
|
||||||
|
meminit_ddr4(mem_cfg, board_cfg->ddr4_cfg, info,
|
||||||
|
half_populated);
|
||||||
|
break;
|
||||||
|
case MEMTYPE_LPDDR4X:
|
||||||
|
meminit_lpddr4x(mem_cfg, board_cfg->lpddr4_cfg, info,
|
||||||
|
half_populated);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
die("Unsupported memory type = %d!\n", board_cfg->mem_type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue