nb/intel: Factor out common MRC code
Remove code duplication and use the common function store_current_mrc_cache instead. No functionality is changed. Tested on Sandybridge Lenovo T520. Change-Id: I4aa5463f1b1d5e1afbe44b4bfc659524d86204db Signed-off-by: Patrick Rudolph <siro@das-labor.org> Reviewed-on: https://review.coreboot.org/15074 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
70e03fea5b
commit
bb9c90a207
|
@ -250,3 +250,35 @@ struct mrc_data_container *find_current_mrc_cache(void)
|
|||
// 0. compare MRC data to last mrc-cache block (exit if same)
|
||||
return find_current_mrc_cache_local(cache_base, cache_size);
|
||||
}
|
||||
|
||||
struct mrc_data_container *
|
||||
store_current_mrc_cache(void *data, unsigned length)
|
||||
{
|
||||
struct mrc_data_container *mrcdata;
|
||||
int output_len = ALIGN(length, 16);
|
||||
|
||||
/* Save the MRC S3 restore data to cbmem */
|
||||
mrcdata = cbmem_add
|
||||
(CBMEM_ID_MRCDATA,
|
||||
output_len + sizeof(struct mrc_data_container));
|
||||
|
||||
if (!mrcdata)
|
||||
return NULL;
|
||||
|
||||
printk(BIOS_DEBUG, "Relocate MRC DATA from %p to %p (%u bytes)\n",
|
||||
data, mrcdata, output_len);
|
||||
|
||||
mrcdata->mrc_signature = MRC_DATA_SIGNATURE;
|
||||
mrcdata->mrc_data_size = output_len;
|
||||
mrcdata->reserved = 0;
|
||||
memcpy(mrcdata->mrc_data, data, length);
|
||||
|
||||
/* Zero the unused space in aligned buffer. */
|
||||
if (output_len > length)
|
||||
memset(mrcdata->mrc_data+length, 0, output_len - length);
|
||||
|
||||
mrcdata->mrc_checksum = compute_ip_checksum(mrcdata->mrc_data,
|
||||
mrcdata->mrc_data_size);
|
||||
|
||||
return mrcdata;
|
||||
}
|
||||
|
|
|
@ -13,5 +13,6 @@ struct mrc_data_container {
|
|||
} __attribute__ ((packed));
|
||||
|
||||
struct mrc_data_container *find_current_mrc_cache(void);
|
||||
struct mrc_data_container *store_current_mrc_cache(void *data, unsigned length);
|
||||
|
||||
#endif /* NORTHBRIDGE_INTEL_COMMON_MRC_CACHE_H */
|
||||
|
|
|
@ -31,30 +31,8 @@
|
|||
|
||||
void save_mrc_data(struct pei_data *pei_data)
|
||||
{
|
||||
struct mrc_data_container *mrcdata;
|
||||
int output_len = ALIGN(pei_data->mrc_output_len, 16);
|
||||
|
||||
/* Save the MRC S3 restore data to cbmem */
|
||||
mrcdata = cbmem_add
|
||||
(CBMEM_ID_MRCDATA,
|
||||
output_len + sizeof(struct mrc_data_container));
|
||||
|
||||
printk(BIOS_DEBUG, "Relocate MRC DATA from %p to %p (%u bytes)\n",
|
||||
pei_data->mrc_output, mrcdata, output_len);
|
||||
|
||||
mrcdata->mrc_signature = MRC_DATA_SIGNATURE;
|
||||
mrcdata->mrc_data_size = output_len;
|
||||
mrcdata->reserved = 0;
|
||||
memcpy(mrcdata->mrc_data, pei_data->mrc_output,
|
||||
pei_data->mrc_output_len);
|
||||
|
||||
/* Zero the unused space in aligned buffer. */
|
||||
if (output_len > pei_data->mrc_output_len)
|
||||
memset(mrcdata->mrc_data+pei_data->mrc_output_len, 0,
|
||||
output_len - pei_data->mrc_output_len);
|
||||
|
||||
mrcdata->mrc_checksum = compute_ip_checksum(mrcdata->mrc_data,
|
||||
mrcdata->mrc_data_size);
|
||||
store_current_mrc_cache(pei_data->mrc_output, pei_data->mrc_output_len);
|
||||
}
|
||||
|
||||
static void prepare_mrc_cache(struct pei_data *pei_data)
|
||||
|
|
|
@ -1688,8 +1688,6 @@ static void dump_timings(struct raminfo *info)
|
|||
static void save_timings(struct raminfo *info)
|
||||
{
|
||||
struct ram_training train;
|
||||
struct mrc_data_container *mrcdata;
|
||||
int output_len = ALIGN(sizeof(train), 16);
|
||||
int channel, slot, rank, lane, i;
|
||||
|
||||
train = info->training;
|
||||
|
@ -1717,26 +1715,7 @@ static void save_timings(struct raminfo *info)
|
|||
printk (BIOS_SPEW, "[6e8] = %x\n", train.reg_6e8);
|
||||
|
||||
/* Save the MRC S3 restore data to cbmem */
|
||||
mrcdata = cbmem_add
|
||||
(CBMEM_ID_MRCDATA, output_len + sizeof(struct mrc_data_container));
|
||||
|
||||
if (mrcdata != NULL) {
|
||||
printk(BIOS_DEBUG, "Relocate MRC DATA from %p to %p (%u bytes)\n",
|
||||
&train, mrcdata, output_len);
|
||||
|
||||
mrcdata->mrc_signature = MRC_DATA_SIGNATURE;
|
||||
mrcdata->mrc_data_size = output_len;
|
||||
mrcdata->reserved = 0;
|
||||
memcpy(mrcdata->mrc_data, &train, sizeof(train));
|
||||
|
||||
/* Zero the unused space in aligned buffer. */
|
||||
if (output_len > sizeof(train))
|
||||
memset(mrcdata->mrc_data + sizeof(train), 0,
|
||||
output_len - sizeof(train));
|
||||
|
||||
mrcdata->mrc_checksum = compute_ip_checksum(mrcdata->mrc_data,
|
||||
mrcdata->mrc_data_size);
|
||||
}
|
||||
store_current_mrc_cache(&train, sizeof(train));
|
||||
}
|
||||
|
||||
#if REAL
|
||||
|
|
|
@ -3938,31 +3938,10 @@ static void final_registers(ramctr_timing * ctrl)
|
|||
| 0xc);
|
||||
}
|
||||
|
||||
static void save_timings(ramctr_timing * ctrl)
|
||||
static void save_timings(ramctr_timing *ctrl)
|
||||
{
|
||||
struct mrc_data_container *mrcdata;
|
||||
int output_len = ALIGN(sizeof (*ctrl), 16);
|
||||
|
||||
/* Save the MRC S3 restore data to cbmem */
|
||||
mrcdata = cbmem_add
|
||||
(CBMEM_ID_MRCDATA,
|
||||
output_len + sizeof(struct mrc_data_container));
|
||||
|
||||
printk(BIOS_DEBUG, "Relocate MRC DATA from %p to %p (%u bytes)\n",
|
||||
ctrl, mrcdata, output_len);
|
||||
|
||||
mrcdata->mrc_signature = MRC_DATA_SIGNATURE;
|
||||
mrcdata->mrc_data_size = output_len;
|
||||
mrcdata->reserved = 0;
|
||||
memcpy(mrcdata->mrc_data, ctrl, sizeof (*ctrl));
|
||||
|
||||
/* Zero the unused space in aligned buffer. */
|
||||
if (output_len > sizeof (*ctrl))
|
||||
memset(mrcdata->mrc_data+sizeof (*ctrl), 0,
|
||||
output_len - sizeof (*ctrl));
|
||||
|
||||
mrcdata->mrc_checksum = compute_ip_checksum(mrcdata->mrc_data,
|
||||
mrcdata->mrc_data_size);
|
||||
store_current_mrc_cache(ctrl, sizeof(*ctrl));
|
||||
}
|
||||
|
||||
static void restore_timings(ramctr_timing * ctrl)
|
||||
|
|
|
@ -52,32 +52,9 @@
|
|||
void save_mrc_data(struct pei_data *pei_data)
|
||||
{
|
||||
u16 c1, c2, checksum;
|
||||
struct mrc_data_container *mrcdata;
|
||||
int output_len = ALIGN(pei_data->mrc_output_len, 16);
|
||||
|
||||
/* Save the MRC S3 restore data to cbmem */
|
||||
mrcdata = cbmem_add
|
||||
(CBMEM_ID_MRCDATA,
|
||||
output_len + sizeof(struct mrc_data_container));
|
||||
|
||||
if (mrcdata != NULL) {
|
||||
printk(BIOS_DEBUG, "Relocate MRC DATA from %p to %p (%u bytes)\n",
|
||||
pei_data->mrc_output, mrcdata, output_len);
|
||||
|
||||
mrcdata->mrc_signature = MRC_DATA_SIGNATURE;
|
||||
mrcdata->mrc_data_size = output_len;
|
||||
mrcdata->reserved = 0;
|
||||
memcpy(mrcdata->mrc_data, pei_data->mrc_output,
|
||||
pei_data->mrc_output_len);
|
||||
|
||||
/* Zero the unused space in aligned buffer. */
|
||||
if (output_len > pei_data->mrc_output_len)
|
||||
memset(mrcdata->mrc_data+pei_data->mrc_output_len, 0,
|
||||
output_len - pei_data->mrc_output_len);
|
||||
|
||||
mrcdata->mrc_checksum = compute_ip_checksum(mrcdata->mrc_data,
|
||||
mrcdata->mrc_data_size);
|
||||
}
|
||||
store_current_mrc_cache(pei_data->mrc_output, pei_data->mrc_output_len);
|
||||
|
||||
/* Save the MRC seed values to CMOS */
|
||||
cmos_write32(CMOS_OFFSET_MRC_SEED, pei_data->scrambler_seed);
|
||||
|
|
Loading…
Reference in New Issue