/* * 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; }
EFI_STATUS testHotKey() { EFI_STATUS Status = 0; EFI_HOB_GENERIC_HEADER *Hob; UINT16 HobType; UINT16 HobLength; for(Hob = GetHobList();!END_OF_HOB_LIST(Hob);Hob = GET_NEXT_HOB(Hob)) { HobType = GET_HOB_TYPE (Hob); HobLength = GET_HOB_LENGTH (Hob); Print((CONST CHAR16*)L"Hob %x %x\n", HobType, HobLength); } return Status; }
/* Returns the next instance of a HOB type from the starting HOB. */ void *get_next_hob(uint16_t type, const void *hob_start) { EFI_PEI_HOB_POINTERS hob; if (!hob_start) return NULL; hob.Raw = (UINT8 *)hob_start; /* Parse the HOB list until end of list or matching type is found. */ while (!END_OF_HOB_LIST(hob.Raw)) { if (hob.Header->HobType == type) return hob.Raw; if (GET_HOB_LENGTH(hob.Raw) < sizeof(*hob.Header)) break; hob.Raw = GET_NEXT_HOB(hob.Raw); } return NULL; }
static void save_mma_results_data(void *unused) { void *mma_results_hob; u32 mma_hob_size; u32 *mma_hob_data; struct mma_data_container *mma_data; int cbmem_size; const EFI_GUID mma_results_guid = FSP_MMA_RESULTS_GUID; printk(BIOS_DEBUG, "Entry save_mma_results_data MMA save data.\n"); mma_results_hob = get_first_guid_hob(&mma_results_guid); if (mma_results_hob == NULL) { printk(BIOS_DEBUG, "MMA results data Hob not present\n"); return; } mma_hob_data = GET_GUID_HOB_DATA(mma_results_hob); mma_hob_size = GET_HOB_LENGTH(mma_results_hob); cbmem_size = ALIGN(mma_hob_size, 16) + sizeof(struct mma_data_container); mma_data = cbmem_add(CBMEM_ID_MMA_DATA, cbmem_size); if (mma_data == NULL) { printk(BIOS_DEBUG, "CBMEM was not available to save the MMA data.\n"); return; } /*clear the mma_data before coping the actual data */ memset(mma_data, 0, cbmem_size); printk(BIOS_DEBUG, "Copy MMA DATA to HOB(src addr %p, dest addr %p, %u bytes)\n", mma_hob_data, mma_data, mma_hob_size); mma_data->mma_signature = MMA_DATA_SIGNATURE; memcpy(mma_data->mma_data, mma_hob_data, mma_hob_size); printk(BIOS_DEBUG, "write MMA results data to cbmem success\n"); }
EFIAPI get_next_hob( UINT16 type, CONST VOID *hob_start ) { EFI_PEI_HOB_POINTERS hob; ASSERT(hob_start != NULL); hob.Raw = (UINT8 *)hob_start; /* Parse the HOB list until end of list or matching type is found. */ while (!END_OF_HOB_LIST(hob.Raw)) { if (hob.Header->HobType == type) return hob.Raw; if (GET_HOB_LENGTH(hob.Raw) < sizeof(*hob.Header)) break; hob.Raw = GET_NEXT_HOB(hob.Raw); } return NULL; }
void raminit(struct romstage_params *params) { const EFI_GUID bootldr_tolum_guid = FSP_BOOTLOADER_TOLUM_HOB_GUID; EFI_HOB_RESOURCE_DESCRIPTOR *cbmem_root; FSP_INFO_HEADER *fsp_header; EFI_HOB_RESOURCE_DESCRIPTOR *fsp_memory; FSP_MEMORY_INIT fsp_memory_init; FSP_MEMORY_INIT_PARAMS fsp_memory_init_params; const EFI_GUID fsp_reserved_guid = FSP_RESERVED_MEMORY_RESOURCE_HOB_GUID; void *fsp_reserved_memory_area; FSP_INIT_RT_COMMON_BUFFER fsp_rt_common_buffer; void *hob_list_ptr; FSP_SMBIOS_MEMORY_INFO *memory_info_hob; const EFI_GUID memory_info_hob_guid = FSP_SMBIOS_MEMORY_INFO_GUID; MEMORY_INIT_UPD memory_init_params; const EFI_GUID mrc_guid = FSP_NON_VOLATILE_STORAGE_HOB_GUID; u32 *mrc_hob; u32 fsp_reserved_bytes; MEMORY_INIT_UPD *original_params; struct pei_data *pei_ptr; EFI_STATUS status; VPD_DATA_REGION *vpd_ptr; UPD_DATA_REGION *upd_ptr; int fsp_verification_failure = 0; #if IS_ENABLED(CONFIG_DISPLAY_HOBS) unsigned long int data; EFI_PEI_HOB_POINTERS hob_ptr; #endif /* * Find and copy the UPD region to the stack so the platform can modify * the settings if needed. Modifications to the UPD buffer are done in * the platform callback code. The platform callback code is also * responsible for assigning the UpdDataRngPtr to this buffer if any * updates are made. The default state is to leave the UpdDataRngPtr * set to NULL. This indicates that the FSP code will use the UPD * region in the FSP binary. */ post_code(0x34); fsp_header = params->chipset_context; vpd_ptr = (VPD_DATA_REGION *)(fsp_header->CfgRegionOffset + fsp_header->ImageBase); printk(BIOS_DEBUG, "VPD Data: 0x%p\n", vpd_ptr); upd_ptr = (UPD_DATA_REGION *)(vpd_ptr->PcdUpdRegionOffset + fsp_header->ImageBase); printk(BIOS_DEBUG, "UPD Data: 0x%p\n", upd_ptr); original_params = (void *)((u8 *)upd_ptr + upd_ptr->MemoryInitUpdOffset); memcpy(&memory_init_params, original_params, sizeof(memory_init_params)); /* Zero fill RT Buffer data and start populating fields. */ memset(&fsp_rt_common_buffer, 0, sizeof(fsp_rt_common_buffer)); pei_ptr = params->pei_data; if (pei_ptr->boot_mode == SLEEP_STATE_S3) { fsp_rt_common_buffer.BootMode = BOOT_ON_S3_RESUME; } else if (pei_ptr->saved_data != NULL) { fsp_rt_common_buffer.BootMode = BOOT_ASSUMING_NO_CONFIGURATION_CHANGES; } else { fsp_rt_common_buffer.BootMode = BOOT_WITH_FULL_CONFIGURATION; } fsp_rt_common_buffer.UpdDataRgnPtr = &memory_init_params; fsp_rt_common_buffer.BootLoaderTolumSize = cbmem_overhead_size(); /* Get any board specific changes */ fsp_memory_init_params.NvsBufferPtr = (void *)pei_ptr->saved_data; fsp_memory_init_params.RtBufferPtr = &fsp_rt_common_buffer; fsp_memory_init_params.HobListPtr = &hob_list_ptr; /* Update the UPD data */ soc_memory_init_params(params, &memory_init_params); mainboard_memory_init_params(params, &memory_init_params); if (IS_ENABLED(CONFIG_MMA)) setup_mma(&memory_init_params); post_code(0x36); /* Display the UPD data */ if (IS_ENABLED(CONFIG_DISPLAY_UPD_DATA)) soc_display_memory_init_params(original_params, &memory_init_params); /* Call FspMemoryInit to initialize RAM */ fsp_memory_init = (FSP_MEMORY_INIT)(fsp_header->ImageBase + fsp_header->FspMemoryInitEntryOffset); printk(BIOS_DEBUG, "Calling FspMemoryInit: 0x%p\n", fsp_memory_init); printk(BIOS_SPEW, " 0x%p: NvsBufferPtr\n", fsp_memory_init_params.NvsBufferPtr); printk(BIOS_SPEW, " 0x%p: RtBufferPtr\n", fsp_memory_init_params.RtBufferPtr); printk(BIOS_SPEW, " 0x%p: HobListPtr\n", fsp_memory_init_params.HobListPtr); timestamp_add_now(TS_FSP_MEMORY_INIT_START); post_code(POST_FSP_MEMORY_INIT); status = fsp_memory_init(&fsp_memory_init_params); post_code(0x37); timestamp_add_now(TS_FSP_MEMORY_INIT_END); printk(BIOS_DEBUG, "FspMemoryInit returned 0x%08x\n", status); if (status != EFI_SUCCESS) die("ERROR - FspMemoryInit failed to initialize memory!\n"); /* Locate the FSP reserved memory area */ fsp_reserved_bytes = 0; fsp_memory = get_next_resource_hob(&fsp_reserved_guid, hob_list_ptr); if (fsp_memory == NULL) { fsp_verification_failure = 1; printk(BIOS_DEBUG, "7.2: FSP_RESERVED_MEMORY_RESOURCE_HOB missing!\n"); } else { fsp_reserved_bytes = fsp_memory->ResourceLength; printk(BIOS_DEBUG, "Reserving 0x%016lx bytes for FSP\n", (unsigned long int)fsp_reserved_bytes); } /* Display SMM area */ #if IS_ENABLED(CONFIG_HAVE_SMI_HANDLER) char *smm_base; size_t smm_size; smm_region((void **)&smm_base, &smm_size); printk(BIOS_DEBUG, "0x%08x: smm_size\n", (unsigned int)smm_size); printk(BIOS_DEBUG, "0x%p: smm_base\n", smm_base); #endif /* Migrate CAR data */ printk(BIOS_DEBUG, "0x%p: cbmem_top\n", cbmem_top()); if (pei_ptr->boot_mode != SLEEP_STATE_S3) { cbmem_initialize_empty_id_size(CBMEM_ID_FSP_RESERVED_MEMORY, fsp_reserved_bytes); } else if (cbmem_initialize_id_size(CBMEM_ID_FSP_RESERVED_MEMORY, fsp_reserved_bytes)) { #if IS_ENABLED(CONFIG_HAVE_ACPI_RESUME) printk(BIOS_DEBUG, "Failed to recover CBMEM in S3 resume.\n"); /* Failed S3 resume, reset to come up cleanly */ hard_reset(); #endif } /* Save the FSP runtime parameters. */ fsp_set_runtime(fsp_header, hob_list_ptr); /* Lookup the FSP_BOOTLOADER_TOLUM_HOB */ cbmem_root = get_next_resource_hob(&bootldr_tolum_guid, hob_list_ptr); if (cbmem_root == NULL) { fsp_verification_failure = 1; printk(BIOS_ERR, "7.4: FSP_BOOTLOADER_TOLUM_HOB missing!\n"); printk(BIOS_ERR, "BootLoaderTolumSize: 0x%08x bytes\n", fsp_rt_common_buffer.BootLoaderTolumSize); } /* Locate the FSP_SMBIOS_MEMORY_INFO HOB */ memory_info_hob = get_next_guid_hob(&memory_info_hob_guid, hob_list_ptr); if (NULL == memory_info_hob) { printk(BIOS_ERR, "FSP_SMBIOS_MEMORY_INFO HOB missing!\n"); fsp_verification_failure = 1; } else { printk(BIOS_DEBUG, "FSP_SMBIOS_MEMORY_INFO HOB: 0x%p\n", memory_info_hob); } #if IS_ENABLED(CONFIG_DISPLAY_HOBS) if (hob_list_ptr == NULL) die("ERROR - HOB pointer is NULL!\n"); /* * Verify that FSP is generating the required HOBs: * 7.1: FSP_BOOTLOADER_TEMP_MEMORY_HOB only produced for FSP 1.0 * 7.2: FSP_RESERVED_MEMORY_RESOURCE_HOB verified above * 7.3: FSP_NON_VOLATILE_STORAGE_HOB verified below * 7.4: FSP_BOOTLOADER_TOLUM_HOB verified above * 7.5: EFI_PEI_GRAPHICS_INFO_HOB produced by SiliconInit * FSP_SMBIOS_MEMORY_INFO HOB verified above */ if (NULL != cbmem_root) { printk(BIOS_DEBUG, "7.4: FSP_BOOTLOADER_TOLUM_HOB: 0x%p\n", cbmem_root); data = cbmem_root->PhysicalStart; printk(BIOS_DEBUG, " 0x%016lx: PhysicalStart\n", data); data = cbmem_root->ResourceLength; printk(BIOS_DEBUG, " 0x%016lx: ResourceLength\n", data); } hob_ptr.Raw = get_next_guid_hob(&mrc_guid, hob_list_ptr); if (NULL == hob_ptr.Raw) { printk(BIOS_ERR, "7.3: FSP_NON_VOLATILE_STORAGE_HOB missing!\n"); fsp_verification_failure = (params->pei_data->saved_data == NULL) ? 1 : 0; } else { printk(BIOS_DEBUG, "7.3: FSP_NON_VOLATILE_STORAGE_HOB: 0x%p\n", hob_ptr.Raw); } if (fsp_memory != NULL) { printk(BIOS_DEBUG, "7.2: FSP_RESERVED_MEMORY_RESOURCE_HOB: 0x%p\n", fsp_memory); data = fsp_memory->PhysicalStart; printk(BIOS_DEBUG, " 0x%016lx: PhysicalStart\n", data); data = fsp_memory->ResourceLength; printk(BIOS_DEBUG, " 0x%016lx: ResourceLength\n", data); } /* Verify all the HOBs are present */ if (fsp_verification_failure) printk(BIOS_DEBUG, "ERROR - Missing one or more required FSP HOBs!\n"); /* Display the HOBs */ print_hob_type_structure(0, hob_list_ptr); #endif /* Get the address of the CBMEM region for the FSP reserved memory */ fsp_reserved_memory_area = cbmem_find(CBMEM_ID_FSP_RESERVED_MEMORY); printk(BIOS_DEBUG, "0x%p: fsp_reserved_memory_area\n", fsp_reserved_memory_area); /* Verify the order of CBMEM root and FSP memory */ if ((fsp_memory != NULL) && (cbmem_root != NULL) && (cbmem_root->PhysicalStart <= fsp_memory->PhysicalStart)) { fsp_verification_failure = 1; printk(BIOS_DEBUG, "ERROR - FSP reserved memory above CBMEM root!\n"); } /* Verify that the FSP memory was properly reserved */ if ((fsp_memory != NULL) && ((fsp_reserved_memory_area == NULL) || (fsp_memory->PhysicalStart != (unsigned int)fsp_reserved_memory_area))) { fsp_verification_failure = 1; printk(BIOS_DEBUG, "ERROR - Reserving FSP memory area!\n"); #if IS_ENABLED(CONFIG_HAVE_SMI_HANDLER) if (cbmem_root != NULL) { size_t delta_bytes = (unsigned int)smm_base - cbmem_root->PhysicalStart - cbmem_root->ResourceLength; printk(BIOS_DEBUG, "0x%08x: Chipset reserved bytes reported by FSP\n", (unsigned int)delta_bytes); die("Please verify the chipset reserved size\n"); } #endif } /* Verify the FSP 1.1 HOB interface */ if (fsp_verification_failure) die("ERROR - Coreboot's requirements not met by FSP binary!\n"); /* Display the memory configuration */ report_memory_config(); /* Locate the memory configuration data to speed up the next reboot */ mrc_hob = get_next_guid_hob(&mrc_guid, hob_list_ptr); if (mrc_hob == NULL) printk(BIOS_DEBUG, "Memory Configuration Data Hob not present\n"); else { pei_ptr->data_to_save = GET_GUID_HOB_DATA(mrc_hob); pei_ptr->data_to_save_size = ALIGN( ((u32)GET_HOB_LENGTH(mrc_hob)), 16); } }