blob: cd4a1e665e25f872dd61d4133be069b07881c064 [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Lee Leahy0946ec32015-04-20 15:24:54 -07002
Duncan Laurie59be6242016-03-07 13:21:56 -08003#include <bootmode.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07004#include <acpi/acpi.h>
Lee Leahy0946ec32015-04-20 15:24:54 -07005#include <console/console.h>
Lee Leahy94b856e2015-10-15 12:07:03 -07006#include <fsp/ramstage.h>
Aaron Durbin789f2b62015-09-09 17:05:06 -05007#include <fsp/util.h>
Lee Leahy0946ec32015-04-20 15:24:54 -07008#include <lib.h>
Lee Leahy0946ec32015-04-20 15:24:54 -07009#include <stage_cache.h>
Aaron Durbin39bdb0b2015-08-04 23:59:43 -050010#include <string.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070011#include <timestamp.h>
Frans Hendriks50b999f2019-11-08 13:55:45 +010012#include <cbmem.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070013
14/* SOC initialization after FSP silicon init */
Aaron Durbin64031672018-04-21 14:45:32 -060015__weak void soc_after_silicon_init(void)
Lee Leahy0946ec32015-04-20 15:24:54 -070016{
Lee Leahy0946ec32015-04-20 15:24:54 -070017}
18
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040019static void display_hob_info(FSP_INFO_HEADER *fsp_info_header)
20{
21 const EFI_GUID graphics_info_guid = EFI_PEI_GRAPHICS_INFO_HOB_GUID;
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040022 void *hob_list_ptr = get_hob_list();
23
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040024 /* Verify the HOBs */
25 if (hob_list_ptr == NULL) {
Frans Hendriks509f4692019-06-28 14:11:41 +020026 printk(BIOS_ERR, "ERROR - HOB pointer is NULL!\n");
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040027 return;
28 }
29
Frans Hendriks509f4692019-06-28 14:11:41 +020030 if (CONFIG(DISPLAY_HOBS))
31 print_hob_type_structure(0, hob_list_ptr);
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040032
33 /*
34 * Verify that FSP is generating the required HOBs:
35 * 7.1: FSP_BOOTLOADER_TEMP_MEMORY_HOB only produced for FSP 1.0
36 * 7.2: FSP_RESERVED_MEMORY_RESOURCE_HOB verified by raminit
37 * 7.3: FSP_NON_VOLATILE_STORAGE_HOB verified by raminit
38 * 7.4: FSP_BOOTLOADER_TOLUM_HOB verified by raminit
39 * 7.5: EFI_PEI_GRAPHICS_INFO_HOB verified below,
40 * if the ImageAttribute bit is set
41 * FSP_SMBIOS_MEMORY_INFO HOB verified by raminit
42 */
43 if ((fsp_info_header->ImageAttribute & GRAPHICS_SUPPORT_BIT) &&
Frans Hendriks509f4692019-06-28 14:11:41 +020044 !get_next_guid_hob(&graphics_info_guid, hob_list_ptr) &&
45 CONFIG(DISPLAY_HOBS)) {
46 printk(BIOS_ERR, "7.5: EFI_PEI_GRAPHICS_INFO_HOB missing!\n");
47 printk(BIOS_ERR,
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040048 "ERROR - Missing one or more required FSP HOBs!\n");
Frans Hendriks509f4692019-06-28 14:11:41 +020049 }
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040050}
51
Lee Leahycff5f092016-02-08 08:37:53 -080052void fsp_run_silicon_init(FSP_INFO_HEADER *fsp_info_header, int is_s3_wakeup)
Lee Leahy0946ec32015-04-20 15:24:54 -070053{
Lee Leahy0946ec32015-04-20 15:24:54 -070054 FSP_SILICON_INIT fsp_silicon_init;
55 SILICON_INIT_UPD *original_params;
56 SILICON_INIT_UPD silicon_init_params;
57 EFI_STATUS status;
58 UPD_DATA_REGION *upd_ptr;
59 VPD_DATA_REGION *vpd_ptr;
Wim Vervoorn67117c32019-12-16 14:21:09 +010060 const struct cbmem_entry *logo_entry = NULL;
Lee Leahy0946ec32015-04-20 15:24:54 -070061
Lee Leahycff5f092016-02-08 08:37:53 -080062 /* Display the FSP header */
Lee Leahy0946ec32015-04-20 15:24:54 -070063 if (fsp_info_header == NULL) {
64 printk(BIOS_ERR, "FSP_INFO_HEADER not set!\n");
65 return;
66 }
67 print_fsp_info(fsp_info_header);
68
69 /* Initialize the UPD values */
70 vpd_ptr = (VPD_DATA_REGION *)(fsp_info_header->CfgRegionOffset +
71 fsp_info_header->ImageBase);
Julius Werner540a9802019-12-09 13:03:29 -080072 printk(BIOS_DEBUG, "%p: VPD Data\n", vpd_ptr);
Lee Leahy0946ec32015-04-20 15:24:54 -070073 upd_ptr = (UPD_DATA_REGION *)(vpd_ptr->PcdUpdRegionOffset +
74 fsp_info_header->ImageBase);
Julius Werner540a9802019-12-09 13:03:29 -080075 printk(BIOS_DEBUG, "%p: UPD Data\n", upd_ptr);
Lee Leahy0946ec32015-04-20 15:24:54 -070076 original_params = (void *)((u8 *)upd_ptr +
77 upd_ptr->SiliconInitUpdOffset);
78 memcpy(&silicon_init_params, original_params,
79 sizeof(silicon_init_params));
80 soc_silicon_init_params(&silicon_init_params);
81
82 /* Locate VBT and pass to FSP GOP */
Julius Wernercd49cce2019-03-05 16:53:33 -080083 if (CONFIG(RUN_FSP_GOP))
Aaron Durbin39bdb0b2015-08-04 23:59:43 -050084 load_vbt(is_s3_wakeup, &silicon_init_params);
Lee Leahy0946ec32015-04-20 15:24:54 -070085 mainboard_silicon_init_params(&silicon_init_params);
86
Wim Vervoorn67117c32019-12-16 14:21:09 +010087 if (CONFIG(FSP1_1_DISPLAY_LOGO) && !is_s3_wakeup)
88 logo_entry = soc_load_logo(&silicon_init_params);
Frans Hendriks50b999f2019-11-08 13:55:45 +010089
Lee Leahy0946ec32015-04-20 15:24:54 -070090 /* Display the UPD data */
Julius Wernercd49cce2019-03-05 16:53:33 -080091 if (CONFIG(DISPLAY_UPD_DATA))
Lee Leahy0946ec32015-04-20 15:24:54 -070092 soc_display_silicon_init_params(original_params,
93 &silicon_init_params);
94
95 /* Perform silicon initialization after RAM is configured */
96 printk(BIOS_DEBUG, "Calling FspSiliconInit\n");
97 fsp_silicon_init = (FSP_SILICON_INIT)(fsp_info_header->ImageBase
98 + fsp_info_header->FspSiliconInitEntryOffset);
99 timestamp_add_now(TS_FSP_SILICON_INIT_START);
Julius Werner540a9802019-12-09 13:03:29 -0800100 printk(BIOS_DEBUG, "Calling FspSiliconInit(%p) at %p\n",
Lee Leahy0946ec32015-04-20 15:24:54 -0700101 &silicon_init_params, fsp_silicon_init);
Duncan Lauriefb509832015-11-22 14:53:57 -0800102 post_code(POST_FSP_SILICON_INIT);
Lee Leahy0946ec32015-04-20 15:24:54 -0700103 status = fsp_silicon_init(&silicon_init_params);
104 timestamp_add_now(TS_FSP_SILICON_INIT_END);
105 printk(BIOS_DEBUG, "FspSiliconInit returned 0x%08x\n", status);
106
Frans Hendriks50b999f2019-11-08 13:55:45 +0100107 /* The logo_entry can be freed up now as it is not required any longer */
Wim Vervoorn67117c32019-12-16 14:21:09 +0100108 if (logo_entry && !is_s3_wakeup)
Frans Hendriks50b999f2019-11-08 13:55:45 +0100109 cbmem_entry_remove(logo_entry);
110
Duncan Laurie59be6242016-03-07 13:21:56 -0800111 /* Mark graphics init done after SiliconInit if VBT was provided */
Julius Wernercd49cce2019-03-05 16:53:33 -0800112#if CONFIG(RUN_FSP_GOP)
Duncan Laurie59be6242016-03-07 13:21:56 -0800113 /* GraphicsConfigPtr doesn't exist in Quark X1000's FSP, so this needs
Elyes HAOUAS2e4d8062016-08-25 20:50:50 +0200114 * to be #if'd out instead of using if (). */
Duncan Laurie59be6242016-03-07 13:21:56 -0800115 if (silicon_init_params.GraphicsConfigPtr)
116 gfx_set_init_done(1);
117#endif
118
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -0400119 display_hob_info(fsp_info_header);
Lee Leahy0946ec32015-04-20 15:24:54 -0700120 soc_after_silicon_init();
121}
122
Aaron Durbinabf87a22015-08-05 12:26:56 -0500123static void fsp_cache_save(struct prog *fsp)
Lee Leahy0946ec32015-04-20 15:24:54 -0700124{
Julius Wernercd49cce2019-03-05 16:53:33 -0800125 if (CONFIG(NO_STAGE_CACHE))
Furquan Shaikh1e162bf2016-05-06 09:20:35 -0700126 return;
127
128 printk(BIOS_DEBUG, "FSP: Saving binary in cache\n");
129
Aaron Durbinabf87a22015-08-05 12:26:56 -0500130 if (prog_entry(fsp) == NULL) {
131 printk(BIOS_ERR, "ERROR: No FSP to save in cache.\n");
Lee Leahy0946ec32015-04-20 15:24:54 -0700132 return;
133 }
134
Aaron Durbinabf87a22015-08-05 12:26:56 -0500135 stage_cache_add(STAGE_REFCODE, fsp);
Lee Leahy0946ec32015-04-20 15:24:54 -0700136}
137
Aaron Durbinabf87a22015-08-05 12:26:56 -0500138static int fsp_find_and_relocate(struct prog *fsp)
Lee Leahy0946ec32015-04-20 15:24:54 -0700139{
Aaron Durbin5d6f0f92015-10-08 15:06:28 -0500140 if (prog_locate(fsp)) {
141 printk(BIOS_ERR, "ERROR: Couldn't find %s\n", prog_name(fsp));
Lee Leahy0946ec32015-04-20 15:24:54 -0700142 return -1;
143 }
144
Aaron Durbin5d6f0f92015-10-08 15:06:28 -0500145 if (fsp_relocate(fsp, prog_rdev(fsp))) {
Aaron Durbin22ea0072015-08-05 10:17:33 -0500146 printk(BIOS_ERR, "ERROR: FSP relocation failed.\n");
147 return -1;
148 }
Lee Leahy0946ec32015-04-20 15:24:54 -0700149
Lee Leahy0946ec32015-04-20 15:24:54 -0700150 return 0;
151}
152
Furquan Shaikhf4b20af2017-02-20 13:33:32 -0800153void fsp_load(void)
Lee Leahy0946ec32015-04-20 15:24:54 -0700154{
Furquan Shaikhf4b20af2017-02-20 13:33:32 -0800155 static int load_done;
Aaron Durbin7e7a4df2015-12-08 14:34:35 -0600156 struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
Aaron Durbin39bdb0b2015-08-04 23:59:43 -0500157 int is_s3_wakeup = acpi_is_wakeup_s3();
Lee Leahy0946ec32015-04-20 15:24:54 -0700158
Furquan Shaikhf4b20af2017-02-20 13:33:32 -0800159 if (load_done)
160 return;
161
Julius Wernercd49cce2019-03-05 16:53:33 -0800162 if (is_s3_wakeup && !CONFIG(NO_STAGE_CACHE)) {
Lee Leahy0946ec32015-04-20 15:24:54 -0700163 printk(BIOS_DEBUG, "FSP: Loading binary from cache\n");
Aaron Durbinabf87a22015-08-05 12:26:56 -0500164 stage_cache_load_stage(STAGE_REFCODE, &fsp);
Lee Leahy0946ec32015-04-20 15:24:54 -0700165 } else {
Aaron Durbinabf87a22015-08-05 12:26:56 -0500166 fsp_find_and_relocate(&fsp);
Aaron Durbinabf87a22015-08-05 12:26:56 -0500167 fsp_cache_save(&fsp);
Lee Leahy0946ec32015-04-20 15:24:54 -0700168 }
169
Aaron Durbinabf87a22015-08-05 12:26:56 -0500170 /* FSP_INFO_HEADER is set as the program entry. */
171 fsp_update_fih(prog_entry(&fsp));
172
Furquan Shaikhf4b20af2017-02-20 13:33:32 -0800173 load_done = 1;
174}
175
176void intel_silicon_init(void)
177{
178 fsp_load();
179 fsp_run_silicon_init(fsp_get_fih(), acpi_is_wakeup_s3());
Lee Leahy0946ec32015-04-20 15:24:54 -0700180}
181
182/* Initialize the UPD parameters for SiliconInit */
Aaron Durbin64031672018-04-21 14:45:32 -0600183__weak void mainboard_silicon_init_params(
Lee Leahy0946ec32015-04-20 15:24:54 -0700184 SILICON_INIT_UPD *params)
185{
Lee Leahy0946ec32015-04-20 15:24:54 -0700186};
187
188/* Display the UPD parameters for SiliconInit */
Aaron Durbin64031672018-04-21 14:45:32 -0600189__weak void soc_display_silicon_init_params(
Lee Leahy0946ec32015-04-20 15:24:54 -0700190 const SILICON_INIT_UPD *old, SILICON_INIT_UPD *new)
191{
192 printk(BIOS_SPEW, "UPD values for SiliconInit:\n");
193 hexdump32(BIOS_SPEW, new, sizeof(*new));
194}
195
196/* Initialize the UPD parameters for SiliconInit */
Aaron Durbin64031672018-04-21 14:45:32 -0600197__weak void soc_silicon_init_params(SILICON_INIT_UPD *params)
Lee Leahy0946ec32015-04-20 15:24:54 -0700198{
Lee Leahy0946ec32015-04-20 15:24:54 -0700199}