/* * Save the FSP memory HOB (mrc data) to the MRC area in CBMEM */ int save_mrc_data(void *hob_start) { u32 *mrc_hob; u32 *mrc_hob_data; u32 mrc_hob_size; struct mrc_data_container *mrc_data; int output_len; const EFI_GUID mrc_guid = FSP_NON_VOLATILE_STORAGE_HOB_GUID; mrc_hob = get_next_guid_hob(&mrc_guid, hob_start); if (mrc_hob == NULL) { printk(BIOS_DEBUG, "Memory Configure Data Hob is not present\n"); return 0; } mrc_hob_data = GET_GUID_HOB_DATA(mrc_hob); mrc_hob_size = (u32) GET_HOB_LENGTH(mrc_hob); printk(BIOS_DEBUG, "Memory Configure Data Hob at %p (size = 0x%x).\n", (void *)mrc_hob_data, mrc_hob_size); output_len = ALIGN(mrc_hob_size, 16); /* Save the MRC S3/fast boot/ADR restore data to cbmem */ mrc_data = cbmem_add(CBMEM_ID_MRCDATA, output_len + sizeof(struct mrc_data_container)); /* Just return if there was a problem with getting CBMEM */ if (mrc_data == NULL) { printk(BIOS_WARNING, "CBMEM was not available to save the fast boot cache data.\n"); return 0; } printk(BIOS_DEBUG, "Copy FSP MRC DATA to HOB (source addr %p, dest addr %p, %u bytes)\n", (void *)mrc_hob_data, mrc_data, output_len); mrc_data->mrc_signature = MRC_DATA_SIGNATURE; mrc_data->mrc_data_size = output_len; mrc_data->reserved = 0; memcpy(mrc_data->mrc_data, (const void *)mrc_hob_data, mrc_hob_size); /* Zero the unused space in aligned buffer. */ if (output_len > mrc_hob_size) memset((mrc_data->mrc_data + mrc_hob_size), 0, output_len - mrc_hob_size); mrc_data->mrc_checksum = compute_ip_checksum(mrc_data->mrc_data, mrc_data->mrc_data_size); #if IS_ENABLED(CONFIG_DISPLAY_FAST_BOOT_DATA) printk(BIOS_SPEW, "Fast boot data (includes align and checksum):\n"); hexdump32(BIOS_SPEW, (void *)mrc_data->mrc_data, output_len); #endif return 1; }
void * find_and_set_fastboot_cache(void) { struct mrc_data_container *mrc_cache = NULL; if (((mrc_cache = find_current_mrc_cache()) == NULL) || (mrc_cache->mrc_data_size == -1UL)) { printk(BIOS_DEBUG, "FSP MRC cache not present.\n"); return NULL; } printk(BIOS_DEBUG, "FSP MRC cache present at %x.\n", (u32)mrc_cache); printk(BIOS_SPEW, "Saved MRC data:\n"); hexdump32(BIOS_SPEW, (void *)mrc_cache->mrc_data, (mrc_cache->mrc_data_size) / 4); return (void *) mrc_cache->mrc_data; }