blob: 2ffa67587db84398df3621a43cf4ca6bead41007 [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>
Kyösti Mälkki4949a3d2021-01-09 20:38:43 +02004#include <bootsplash.h>
Furquan Shaikh76cedd22020-05-02 10:24:23 -07005#include <acpi/acpi.h>
Lee Leahy0946ec32015-04-20 15:24:54 -07006#include <console/console.h>
Lee Leahy94b856e2015-10-15 12:07:03 -07007#include <fsp/ramstage.h>
Aaron Durbin789f2b62015-09-09 17:05:06 -05008#include <fsp/util.h>
Patrick Rudolph92106b12020-02-19 12:54:06 +01009#include <framebuffer_info.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070010#include <lib.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070011#include <stage_cache.h>
Aaron Durbin39bdb0b2015-08-04 23:59:43 -050012#include <string.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070013#include <timestamp.h>
Frans Hendriks50b999f2019-11-08 13:55:45 +010014#include <cbmem.h>
Lee Leahy0946ec32015-04-20 15:24:54 -070015
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040016static void display_hob_info(FSP_INFO_HEADER *fsp_info_header)
17{
18 const EFI_GUID graphics_info_guid = EFI_PEI_GRAPHICS_INFO_HOB_GUID;
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040019 void *hob_list_ptr = get_hob_list();
20
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040021 /* Verify the HOBs */
22 if (hob_list_ptr == NULL) {
Elyes HAOUAS22ad8f22022-02-04 19:44:16 +010023 printk(BIOS_ERR, "HOB pointer is NULL!\n");
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040024 return;
25 }
26
Frans Hendriks509f4692019-06-28 14:11:41 +020027 if (CONFIG(DISPLAY_HOBS))
28 print_hob_type_structure(0, hob_list_ptr);
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040029
30 /*
31 * Verify that FSP is generating the required HOBs:
32 * 7.1: FSP_BOOTLOADER_TEMP_MEMORY_HOB only produced for FSP 1.0
33 * 7.2: FSP_RESERVED_MEMORY_RESOURCE_HOB verified by raminit
34 * 7.3: FSP_NON_VOLATILE_STORAGE_HOB verified by raminit
35 * 7.4: FSP_BOOTLOADER_TOLUM_HOB verified by raminit
36 * 7.5: EFI_PEI_GRAPHICS_INFO_HOB verified below,
37 * if the ImageAttribute bit is set
38 * FSP_SMBIOS_MEMORY_INFO HOB verified by raminit
39 */
40 if ((fsp_info_header->ImageAttribute & GRAPHICS_SUPPORT_BIT) &&
Arthur Heymansca74d7e2022-03-30 14:41:16 +020041 !get_guid_hob(&graphics_info_guid, hob_list_ptr) &&
Frans Hendriks509f4692019-06-28 14:11:41 +020042 CONFIG(DISPLAY_HOBS)) {
43 printk(BIOS_ERR, "7.5: EFI_PEI_GRAPHICS_INFO_HOB missing!\n");
Elyes HAOUAS22ad8f22022-02-04 19:44:16 +010044 printk(BIOS_ERR, "Missing one or more required FSP HOBs!\n");
Frans Hendriks509f4692019-06-28 14:11:41 +020045 }
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -040046}
47
Kyösti Mälkkicc93c6e2021-01-09 22:53:52 +020048static void fsp_run_silicon_init(FSP_INFO_HEADER *fsp_info_header)
Lee Leahy0946ec32015-04-20 15:24:54 -070049{
Lee Leahy0946ec32015-04-20 15:24:54 -070050 FSP_SILICON_INIT fsp_silicon_init;
51 SILICON_INIT_UPD *original_params;
52 SILICON_INIT_UPD silicon_init_params;
53 EFI_STATUS status;
54 UPD_DATA_REGION *upd_ptr;
55 VPD_DATA_REGION *vpd_ptr;
56
Lee Leahycff5f092016-02-08 08:37:53 -080057 /* Display the FSP header */
Lee Leahy0946ec32015-04-20 15:24:54 -070058 if (fsp_info_header == NULL) {
59 printk(BIOS_ERR, "FSP_INFO_HEADER not set!\n");
60 return;
61 }
62 print_fsp_info(fsp_info_header);
63
64 /* Initialize the UPD values */
65 vpd_ptr = (VPD_DATA_REGION *)(fsp_info_header->CfgRegionOffset +
66 fsp_info_header->ImageBase);
Julius Werner540a9802019-12-09 13:03:29 -080067 printk(BIOS_DEBUG, "%p: VPD Data\n", vpd_ptr);
Lee Leahy0946ec32015-04-20 15:24:54 -070068 upd_ptr = (UPD_DATA_REGION *)(vpd_ptr->PcdUpdRegionOffset +
69 fsp_info_header->ImageBase);
Julius Werner540a9802019-12-09 13:03:29 -080070 printk(BIOS_DEBUG, "%p: UPD Data\n", upd_ptr);
Lee Leahy0946ec32015-04-20 15:24:54 -070071 original_params = (void *)((u8 *)upd_ptr +
72 upd_ptr->SiliconInitUpdOffset);
73 memcpy(&silicon_init_params, original_params,
74 sizeof(silicon_init_params));
75 soc_silicon_init_params(&silicon_init_params);
76
77 /* Locate VBT and pass to FSP GOP */
Julius Wernercd49cce2019-03-05 16:53:33 -080078 if (CONFIG(RUN_FSP_GOP))
Kyösti Mälkki0a546852021-01-24 18:06:26 +020079 load_vbt(&silicon_init_params);
Lee Leahy0946ec32015-04-20 15:24:54 -070080 mainboard_silicon_init_params(&silicon_init_params);
81
Kyösti Mälkki4949a3d2021-01-09 20:38:43 +020082 if (CONFIG(BMP_LOGO))
83 bmp_load_logo(&silicon_init_params.PcdLogoPtr,
84 &silicon_init_params.PcdLogoSize);
Frans Hendriks50b999f2019-11-08 13:55:45 +010085
Lee Leahy0946ec32015-04-20 15:24:54 -070086 /* Display the UPD data */
Julius Wernercd49cce2019-03-05 16:53:33 -080087 if (CONFIG(DISPLAY_UPD_DATA))
Lee Leahy0946ec32015-04-20 15:24:54 -070088 soc_display_silicon_init_params(original_params,
89 &silicon_init_params);
90
91 /* Perform silicon initialization after RAM is configured */
92 printk(BIOS_DEBUG, "Calling FspSiliconInit\n");
93 fsp_silicon_init = (FSP_SILICON_INIT)(fsp_info_header->ImageBase
94 + fsp_info_header->FspSiliconInitEntryOffset);
95 timestamp_add_now(TS_FSP_SILICON_INIT_START);
Julius Werner540a9802019-12-09 13:03:29 -080096 printk(BIOS_DEBUG, "Calling FspSiliconInit(%p) at %p\n",
Lee Leahy0946ec32015-04-20 15:24:54 -070097 &silicon_init_params, fsp_silicon_init);
Duncan Lauriefb509832015-11-22 14:53:57 -080098 post_code(POST_FSP_SILICON_INIT);
Lee Leahy0946ec32015-04-20 15:24:54 -070099 status = fsp_silicon_init(&silicon_init_params);
100 timestamp_add_now(TS_FSP_SILICON_INIT_END);
101 printk(BIOS_DEBUG, "FspSiliconInit returned 0x%08x\n", status);
102
Frans Hendriks50b999f2019-11-08 13:55:45 +0100103 /* The logo_entry can be freed up now as it is not required any longer */
Kyösti Mälkki4949a3d2021-01-09 20:38:43 +0200104 if (CONFIG(BMP_LOGO))
105 bmp_release_logo();
Frans Hendriks50b999f2019-11-08 13:55:45 +0100106
Duncan Laurie59be6242016-03-07 13:21:56 -0800107 /* Mark graphics init done after SiliconInit if VBT was provided */
Julius Wernercd49cce2019-03-05 16:53:33 -0800108#if CONFIG(RUN_FSP_GOP)
Duncan Laurie59be6242016-03-07 13:21:56 -0800109 /* GraphicsConfigPtr doesn't exist in Quark X1000's FSP, so this needs
Elyes HAOUAS2e4d8062016-08-25 20:50:50 +0200110 * to be #if'd out instead of using if (). */
Duncan Laurie59be6242016-03-07 13:21:56 -0800111 if (silicon_init_params.GraphicsConfigPtr)
112 gfx_set_init_done(1);
113#endif
114
Patrick Rudolph92106b12020-02-19 12:54:06 +0100115 if (CONFIG(RUN_FSP_GOP)) {
116 const EFI_GUID vbt_guid = EFI_PEI_GRAPHICS_INFO_HOB_GUID;
117 u32 *vbt_hob;
118
119 void *hob_list_ptr = get_hob_list();
Arthur Heymansca74d7e2022-03-30 14:41:16 +0200120 vbt_hob = get_guid_hob(&vbt_guid, hob_list_ptr);
Patrick Rudolph92106b12020-02-19 12:54:06 +0100121 if (vbt_hob == NULL) {
122 printk(BIOS_ERR, "FSP_ERR: Graphics Data HOB is not present\n");
123 } else {
124 EFI_PEI_GRAPHICS_INFO_HOB *gop;
125
126 printk(BIOS_DEBUG, "FSP_DEBUG: Graphics Data HOB present\n");
127 gop = GET_GUID_HOB_DATA(vbt_hob);
128
129 fb_add_framebuffer_info(gop->FrameBufferBase,
130 gop->GraphicsMode.HorizontalResolution,
131 gop->GraphicsMode.VerticalResolution,
132 gop->GraphicsMode.PixelsPerScanLine * 4,
133 32);
134 }
135 }
136
Alexandru Gagniuc41c003c2015-08-28 19:07:35 -0400137 display_hob_info(fsp_info_header);
Lee Leahy0946ec32015-04-20 15:24:54 -0700138}
139
Kyösti Mälkkid0bc92d2021-01-10 00:23:58 +0200140static void fsp_load(void)
Lee Leahy0946ec32015-04-20 15:24:54 -0700141{
Aaron Durbin7e7a4df2015-12-08 14:34:35 -0600142 struct prog fsp = PROG_INIT(PROG_REFCODE, "fsp.bin");
Lee Leahy0946ec32015-04-20 15:24:54 -0700143
Kyösti Mälkkie0165fb2021-01-09 13:30:57 +0200144 if (resume_from_stage_cache()) {
Aaron Durbinabf87a22015-08-05 12:26:56 -0500145 stage_cache_load_stage(STAGE_REFCODE, &fsp);
Lee Leahy0946ec32015-04-20 15:24:54 -0700146 } else {
Julius Werner53584672021-01-11 16:44:06 -0800147 fsp_relocate(&fsp);
Kyösti Mälkkie0165fb2021-01-09 13:30:57 +0200148
149 if (prog_entry(&fsp))
150 stage_cache_add(STAGE_REFCODE, &fsp);
Lee Leahy0946ec32015-04-20 15:24:54 -0700151 }
152
Aaron Durbinabf87a22015-08-05 12:26:56 -0500153 /* FSP_INFO_HEADER is set as the program entry. */
154 fsp_update_fih(prog_entry(&fsp));
Furquan Shaikhf4b20af2017-02-20 13:33:32 -0800155}
156
157void intel_silicon_init(void)
158{
159 fsp_load();
Kyösti Mälkkicc93c6e2021-01-09 22:53:52 +0200160 fsp_run_silicon_init(fsp_get_fih());
Lee Leahy0946ec32015-04-20 15:24:54 -0700161}
162
163/* Initialize the UPD parameters for SiliconInit */
Aaron Durbin64031672018-04-21 14:45:32 -0600164__weak void mainboard_silicon_init_params(
Lee Leahy0946ec32015-04-20 15:24:54 -0700165 SILICON_INIT_UPD *params)
166{
Lee Leahy0946ec32015-04-20 15:24:54 -0700167}