105 u8 capacity_shift, bus_width;
128 spd_crc = (spd[127] << 8) + spd[126];
130 if (crc != spd_crc) {
131 printram(
"ERROR: SPD CRC failed!!!\n");
135 printram(
" Revision : %x\n", spd[1]);
141 val = (reg8 >> 4) & 0x07;
143 printram(
" Invalid number of memory banks\n");
148 capacity_shift = reg8 & 0x0f;
149 if (capacity_shift > 0x06) {
150 printram(
" Invalid module capacity\n");
153 if (capacity_shift < 0x02) {
154 printram(
" Capacity : %u Mb\n", 256 << capacity_shift);
156 printram(
" Capacity : %u Gb\n", 1 << (capacity_shift - 2));
161 val = (reg8 >> 3) & 0x07;
163 printram(
" Invalid row address bits\n");
170 printram(
" Invalid column address bits\n");
178 if (reg8 & (1 << 2)) {
183 if (reg8 & (1 << 1)) {
188 if (!(reg8 & (1 << 0))) {
198 val = (reg8 >> 3) & 0x07;
200 printram(
" Invalid number of ranks\n");
216 val = (reg8 >> 3) & 0x03;
218 printram(
" Invalid bus extension\n");
222 printram(
" Bus extension : %u bits\n",
val ? 8 : 0);
229 bus_width = 8 <<
val;
230 printram(
" Bus width : %u\n", bus_width);
236 dimm->
size_mb = ((1 << (capacity_shift + (25 - 20))) * bus_width
242 mtb = (((
u32) spd[10]) << 8) / spd[11];
245 dimm->
tCK = spd[12] * mtb;
249 dimm->
tAA = spd[16] * mtb;
251 dimm->
tWR = spd[17] * mtb;
253 dimm->
tRCD = spd[18] * mtb;
255 dimm->
tRRD = spd[19] * mtb;
257 dimm->
tRP = spd[20] * mtb;
259 dimm->
tRAS = (((spd[21] & 0x0f) << 8) + spd[22]) * mtb;
261 dimm->
tRC = (((spd[21] & 0xf0) << 4) + spd[23]) * mtb;
263 dimm->
tRFC = ((spd[25] << 8) + spd[24]) * mtb;
265 dimm->
tWTR = spd[26] * mtb;
267 dimm->
tRTP = spd[27] * mtb;
269 dimm->
tFAW = (((spd[28] & 0x0f) << 8) + spd[29]) * mtb;
278 if (spd[1] >= 0x11 && spd[9] & 0x0f) {
284 ftb = (((
u16) spd[9] & 0xf0) << 4) / (spd[9] & 0x0f);
290 dimm->
tCK += (
s32)((
s8) spd[34] * ftb - 500) / 1000;
292 dimm->
tAA += (
s32)((
s8) spd[35] * ftb - 500) / 1000;
294 dimm->
tRCD += (
s32)((
s8) spd[36] * ftb - 500) / 1000;
296 dimm->
tRP += (
s32)((
s8) spd[37] * ftb - 500) / 1000;
298 dimm->
tRC += (
s32)((
s8) spd[38] * ftb - 500) / 1000;
354 printram(
" Standard SDRAM : %s\n", (spd[33] & 0x80) ?
"no" :
"yes");
356 if (spd[63] & 0x01) {
359 printram(
" Rank1 Address bits : %s\n",
360 (spd[63] & 0x01) ?
"mirrored" :
"normal");
411 if (spd[176] != 0x0C || spd[177] != 0x4A) {
412 printram(
"Not a DDR3 XMP profile!\n");
418 if (!(spd[178] & 1)) {
419 printram(
"Selected XMP profile disabled!\n");
430 mtb = (((
u32) spd[180]) << 8) / spd[181];
434 if (!(spd[178] & 2)) {
435 printram(
"Selected XMP profile disabled!\n");
445 mtb = (((
u32) spd[182]) << 8) / spd[183];
450 printram(
" Max DIMMs/channel : %u\n",
453 printram(
" XMP Revision : %u.%u\n", spd[179] >> 4, spd[179] & 0xf);
456 dimm->
voltage = (xmp[0] & 1) * 50;
457 dimm->
voltage += ((xmp[0] >> 1) & 0xf) * 100;
458 dimm->
voltage += ((xmp[0] >> 5) & 0x3) * 1000;
463 dimm->
tCK = xmp[1] * mtb;
467 dimm->
tAA = xmp[2] * mtb;
469 dimm->
tWR = xmp[8] * mtb;
471 dimm->
tRCD = xmp[7] * mtb;
473 dimm->
tRRD = xmp[17] * mtb;
475 dimm->
tRP = xmp[6] * mtb;
477 dimm->
tRAS = (((xmp[9] & 0x0f) << 8) + xmp[10]) * mtb;
479 dimm->
tRC = (((xmp[9] & 0xf0) << 4) + xmp[11]) * mtb;
481 dimm->
tRFC = ((xmp[15] << 8) + xmp[14]) * mtb;
483 dimm->
tWTR = xmp[20] * mtb;
485 dimm->
tRTP = xmp[16] * mtb;
487 dimm->
tFAW = (((xmp[18] & 0x0f) << 8) + xmp[19]) * mtb;
489 dimm->
tCWL = xmp[5] * mtb;
491 dimm->
tCMD = xmp[23] * mtb;
507 const u16 selected_freq,
526 memset(mem_info, 0,
sizeof(*mem_info));
546 switch (
info->dimm_type) {
587 fp = (
val % 256) * 1000 / 256;
void * memcpy(void *dest, const void *src, size_t n)
void * memset(void *dstpp, int c, size_t len)
#define DIV_ROUND_UP(x, y)
cb_err
coreboot error codes
@ CB_ERR
Generic error code.
@ CB_SUCCESS
Call completed successfully.
void * cbmem_add(u32 id, u64 size)
void * cbmem_find(u32 id)
#define printk(level,...)
static void print_ns(const char *msg, u32 val)
int spd_dimm_is_registered_ddr3(enum spd_dimm_type_ddr3 type)
Checks if the DIMM is Registered based on byte[3] of the SPD.
enum cb_err spd_add_smbios17(const u8 channel, const u8 slot, const u16 selected_freq, const struct dimm_attr_ddr3_st *info)
Fill cbmem with information for SMBIOS type 17.
void dram_print_spd_ddr3(const struct dimm_attr_ddr3_st *dimm)
Print the info in DIMM.
int spd_xmp_decode_ddr3(struct dimm_attr_ddr3_st *dimm, spd_raw_data spd, enum ddr3_xmp_profile profile)
Decode the raw SPD XMP data.
int spd_decode_ddr3(struct dimm_attr_ddr3_st *dimm, spd_raw_data spd)
Decode the raw SPD data.
u16 spd_ddr3_calc_crc(u8 *spd, int len)
Calculate the CRC of a DDR3 SPD.
u16 spd_ddr3_calc_unique_crc(u8 *spd, int len)
Calculate the CRC of a DDR3 SPD unique identifier.
u16 ddr_crc16(const u8 *ptr, int n_crc)
Calculate the CRC of a DDR SPD data.
static struct smmstore_params_info info
#define printram(x,...)
Convenience macro for enabling printk with CONFIG(DEBUG_RAM_SETUP)
@ SPD_STATUS_INVALID_FIELD
Utilities for decoding DDR3 SPDs.
@ SPD_DDR3_DIMM_TYPE_SO_DIMM
@ SPD_DDR3_DIMM_TYPE_72B_SO_CDIMM
@ SPD_DDR3_DIMM_TYPE_72B_SO_RDIMM
@ SPD_DDR3_DIMM_TYPE_MINI_RDIMM
@ SPD_DDR3_DIMM_TYPE_UNDEFINED
@ SPD_DDR3_DIMM_TYPE_RDIMM
@ SPD_DDR3_DIMM_TYPE_UDIMM
#define SPD_DIMM_SERIAL_NUM
#define SPD_DIMM_SERIAL_LEN
@ SPD_MEMORY_TYPE_SDRAM_DDR3
@ SPD_MEMORY_TYPE_UNDEFINED
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
union dimm_flags_ddr3_st flags
enum spd_memory_type dram_type
u8 serial[SPD_DIMM_SERIAL_LEN]
enum spd_dimm_type_ddr3 dimm_type
If this table is filled and put in CBMEM, then these info in CBMEM will be used to generate smbios ty...
uint8_t module_part_number[DIMM_INFO_PART_NUMBER_SIZE]
uint8_t serial[DIMM_INFO_SERIAL_SIZE]
struct dimm_info dimm[DIMM_INFO_TOTAL]
unsigned int rzq7_supported
unsigned int operable_1_25V
unsigned int rzq6_supported
unsigned int operable_1_50V
unsigned int pins_mirrored
unsigned int dll_off_mode
unsigned int operable_1_35V
unsigned int ext_temp_range
unsigned int therm_sensor
unsigned int ext_temp_refresh