mb/google/slippy: Correct memory-down SPD handling
MRC only uses the SPD data for the first index, and ignores the rest. Moreover, index 1 corresponds to the second DIMM on the first channel, which does not exist on ULT (only one DIMM per channel is supported). Copy the SPD to the first DIMM on channel 1 instead. Adjust northbridge code to retrieve the serial number from the correct SPD data block. Tested on Google Wolf, both channels are still correctly detected. Change-Id: Ic60ff75043e6b96a59baa9e5ebffb712a100a934 Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/51443 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
260e98fbe7
commit
afc6c0ae12
|
@ -18,7 +18,7 @@ void copy_spd(struct pei_data *peid)
|
||||||
*/
|
*/
|
||||||
switch (spd_index) {
|
switch (spd_index) {
|
||||||
case 0: case 1: case 2: case 6:
|
case 0: case 1: case 2: case 6:
|
||||||
memcpy(peid->spd_data[1], peid->spd_data[0], SPD_LEN);
|
memcpy(peid->spd_data[2], peid->spd_data[0], SPD_LEN);
|
||||||
break;
|
break;
|
||||||
case 3: case 4: case 5: case 7:
|
case 3: case 4: case 5: case 7:
|
||||||
peid->dimm_channel1_disabled = 3;
|
peid->dimm_channel1_disabled = 3;
|
||||||
|
|
|
@ -19,7 +19,7 @@ void copy_spd(struct pei_data *peid)
|
||||||
if (spd_index & 0x4)
|
if (spd_index & 0x4)
|
||||||
peid->dimm_channel1_disabled = 3;
|
peid->dimm_channel1_disabled = 3;
|
||||||
else
|
else
|
||||||
memcpy(peid->spd_data[1], peid->spd_data[0], SPD_LEN);
|
memcpy(peid->spd_data[2], peid->spd_data[0], SPD_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
|
const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
|
||||||
|
|
|
@ -24,7 +24,7 @@ void copy_spd(struct pei_data *peid)
|
||||||
if (spd_index == 0)
|
if (spd_index == 0)
|
||||||
peid->dimm_channel1_disabled = 3;
|
peid->dimm_channel1_disabled = 3;
|
||||||
else
|
else
|
||||||
memcpy(peid->spd_data[1], peid->spd_data[0], SPD_LEN);
|
memcpy(peid->spd_data[2], peid->spd_data[0], SPD_LEN);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PEPPY_BOARD_VERSION_EVT:
|
case PEPPY_BOARD_VERSION_EVT:
|
||||||
|
@ -34,7 +34,7 @@ void copy_spd(struct pei_data *peid)
|
||||||
if (spd_index > 3)
|
if (spd_index > 3)
|
||||||
peid->dimm_channel1_disabled = 3;
|
peid->dimm_channel1_disabled = 3;
|
||||||
else
|
else
|
||||||
memcpy(peid->spd_data[1], peid->spd_data[0], SPD_LEN);
|
memcpy(peid->spd_data[2], peid->spd_data[0], SPD_LEN);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ void copy_spd(struct pei_data *peid)
|
||||||
*/
|
*/
|
||||||
switch (spd_index) {
|
switch (spd_index) {
|
||||||
case 0: case 1: case 2:
|
case 0: case 1: case 2:
|
||||||
memcpy(peid->spd_data[1], peid->spd_data[0], SPD_LEN);
|
memcpy(peid->spd_data[2], peid->spd_data[0], SPD_LEN);
|
||||||
break;
|
break;
|
||||||
case 3: case 4: case 5:
|
case 3: case 4: case 5:
|
||||||
peid->dimm_channel1_disabled = 3;
|
peid->dimm_channel1_disabled = 3;
|
||||||
|
|
|
@ -227,6 +227,7 @@ void setup_sdram_meminfo(struct pei_data *pei_data)
|
||||||
for (d_num = 0; d_num < NUM_SLOTS; d_num++) {
|
for (d_num = 0; d_num < NUM_SLOTS; d_num++) {
|
||||||
const u32 dimm_size = ((ch_conf >> (d_num * 8)) & 0xff) * 256;
|
const u32 dimm_size = ((ch_conf >> (d_num * 8)) & 0xff) * 256;
|
||||||
if (dimm_size) {
|
if (dimm_size) {
|
||||||
|
const int index = ch * NUM_SLOTS + d_num;
|
||||||
dimm = &mem_info->dimm[dimm_cnt];
|
dimm = &mem_info->dimm[dimm_cnt];
|
||||||
dimm->dimm_size = dimm_size;
|
dimm->dimm_size = dimm_size;
|
||||||
dimm->ddr_type = MEMORY_TYPE_DDR3;
|
dimm->ddr_type = MEMORY_TYPE_DDR3;
|
||||||
|
@ -236,14 +237,14 @@ void setup_sdram_meminfo(struct pei_data *pei_data)
|
||||||
dimm->dimm_num = d_num;
|
dimm->dimm_num = d_num;
|
||||||
dimm->bank_locator = ch * 2;
|
dimm->bank_locator = ch * 2;
|
||||||
memcpy(dimm->serial,
|
memcpy(dimm->serial,
|
||||||
&pei_data->spd_data[dimm_cnt][SPD_DIMM_SERIAL_NUM],
|
&pei_data->spd_data[index][SPD_DIMM_SERIAL_NUM],
|
||||||
SPD_DIMM_SERIAL_LEN);
|
SPD_DIMM_SERIAL_LEN);
|
||||||
memcpy(dimm->module_part_number,
|
memcpy(dimm->module_part_number,
|
||||||
&pei_data->spd_data[dimm_cnt][SPD_DIMM_PART_NUM],
|
&pei_data->spd_data[index][SPD_DIMM_PART_NUM],
|
||||||
SPD_DIMM_PART_LEN);
|
SPD_DIMM_PART_LEN);
|
||||||
dimm->mod_id =
|
dimm->mod_id =
|
||||||
(pei_data->spd_data[dimm_cnt][SPD_DIMM_MOD_ID2] << 8) |
|
(pei_data->spd_data[index][SPD_DIMM_MOD_ID2] << 8) |
|
||||||
(pei_data->spd_data[dimm_cnt][SPD_DIMM_MOD_ID1] & 0xff);
|
(pei_data->spd_data[index][SPD_DIMM_MOD_ID1] & 0xff);
|
||||||
dimm->mod_type = SPD_SODIMM;
|
dimm->mod_type = SPD_SODIMM;
|
||||||
dimm->bus_width = MEMORY_BUS_WIDTH_64;
|
dimm->bus_width = MEMORY_BUS_WIDTH_64;
|
||||||
dimm_cnt++;
|
dimm_cnt++;
|
||||||
|
|
Loading…
Reference in New Issue