blob: 1d682b99c297a547a3df3765644427f6e77134e9 [file] [log] [blame]
Reka Norman7b5a9312022-09-13 14:06:52 +10001/* SPDX-License-Identifier: GPL-2.0-or-later */
2
3#include <acpi/acpi.h>
4#include <bootstate.h>
5#include <cbmem.h>
6#include <console/console.h>
7#include <fsp/util.h>
8#include <mrc_cache.h>
9
10static void save_mrc_data(void *unused)
11{
12 size_t mrc_data_size;
13 const void *mrc_data;
Subrata Banikf31ab7a2023-06-19 12:07:29 +000014 uint32_t cbmem_id = CONFIG(MRC_CACHE_USING_MRC_VERSION) ? CBMEM_ID_MRC_VERSION :
15 CBMEM_ID_FSPM_VERSION;
Subrata Banik79274e012023-06-19 11:32:19 +000016 uint32_t *version;
Reka Norman7b5a9312022-09-13 14:06:52 +100017
18 if (acpi_is_wakeup_s3())
19 return;
20
Subrata Banikf31ab7a2023-06-19 12:07:29 +000021 version = cbmem_find(cbmem_id);
Subrata Banik79274e012023-06-19 11:32:19 +000022 if (!version) {
Subrata Banikf31ab7a2023-06-19 12:07:29 +000023 printk(BIOS_ERR, "Failed to read %s version from cbmem.\n",
24 CONFIG(MRC_CACHE_USING_MRC_VERSION) ? "MRC" : "FSP-M");
Reka Norman7b5a9312022-09-13 14:06:52 +100025 return;
26 }
27
28 mrc_data = fsp_find_nv_storage_data(&mrc_data_size);
29 if (!mrc_data) {
30 printk(BIOS_ERR, "FSP_NON_VOLATILE_STORAGE_HOB missing!\n");
31 return;
32 }
33
34 /*
35 * Save MRC data to SPI flash. By always saving the data this forces
36 * a retrain after a trip through ChromeOS recovery path. The
37 * code which saves the data to flash doesn't write if the latest
38 * training data matches this one.
39 */
Subrata Banik79274e012023-06-19 11:32:19 +000040 if (mrc_cache_stash_data(MRC_TRAINING_DATA, *version, mrc_data,
Reka Norman7b5a9312022-09-13 14:06:52 +100041 mrc_data_size) < 0)
42 printk(BIOS_ERR, "Failed to stash MRC data\n");
43}
44
45/*
46 * Should be done before ramstage_cse_fw_sync() to avoid traning memory twice on
47 * a cold boot after a full firmware update.
48 */
Subrata Banik1b96bff2023-09-02 19:16:52 +000049#if CONFIG(FSP_NVS_DATA_POST_SILICON_INIT)
Johnny Lin55bc2d32022-06-13 14:05:43 +080050BOOT_STATE_INIT_ENTRY(BS_DEV_INIT_CHIPS, BS_ON_EXIT, save_mrc_data, NULL);
David Hendricks69b81942023-01-29 17:56:23 -080051#else
52BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_ENTRY, save_mrc_data, NULL);
Johnny Lin55bc2d32022-06-13 14:05:43 +080053#endif