blob: 9a09cfd81a6db088829f424c5fc9a3225d9f9156 [file] [log] [blame]
Angel Pons8a3453f2020-04-02 23:48:19 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Lee Leahy3dad4892015-05-05 11:14:02 -07002
Lee Leahyb5ad8272015-04-20 15:29:16 -07003#include <arch/hlt.h>
Lee Leahy3dad4892015-05-05 11:14:02 -07004#include <console/console.h>
Aaron Durbin789f2b62015-09-09 17:05:06 -05005#include <fsp/util.h>
Lee Leahyb5ad8272015-04-20 15:29:16 -07006#include <ip_checksum.h>
Lee Leahyb5ad8272015-04-20 15:29:16 -07007#include <string.h>
Lee Leahy3dad4892015-05-05 11:14:02 -07008
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -04009/* Compares two EFI GUIDs. Returns true of the GUIDs match, false otherwise. */
10static bool compare_guid(const EFI_GUID *guid1, const EFI_GUID *guid2)
Lee Leahy3dad4892015-05-05 11:14:02 -070011{
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040012 return !memcmp(guid1, guid2, sizeof(EFI_GUID));
Lee Leahyb5ad8272015-04-20 15:29:16 -070013}
14
15/* Returns the pointer to the HOB list. */
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040016void *get_hob_list(void)
Lee Leahyb5ad8272015-04-20 15:29:16 -070017{
18 void *hob_list;
19
20 hob_list = fsp_get_hob_list();
21 if (hob_list == NULL)
22 die("Call fsp_set_runtime() before this call!\n");
23 return hob_list;
24}
25
26/* Returns the next instance of a HOB type from the starting HOB. */
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040027void *get_next_hob(uint16_t type, const void *hob_start)
Lee Leahyb5ad8272015-04-20 15:29:16 -070028{
29 EFI_PEI_HOB_POINTERS hob;
30
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040031 if (!hob_start)
32 return NULL;
Lee Leahyb5ad8272015-04-20 15:29:16 -070033
34 hob.Raw = (UINT8 *)hob_start;
35
36 /* Parse the HOB list until end of list or matching type is found. */
37 while (!END_OF_HOB_LIST(hob.Raw)) {
38 if (hob.Header->HobType == type)
39 return hob.Raw;
40 if (GET_HOB_LENGTH(hob.Raw) < sizeof(*hob.Header))
41 break;
42 hob.Raw = GET_NEXT_HOB(hob.Raw);
43 }
44 return NULL;
45}
46
47/* Returns the first instance of a HOB type among the whole HOB list. */
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040048void *get_first_hob(uint16_t type)
Lee Leahyb5ad8272015-04-20 15:29:16 -070049{
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040050 return get_next_hob(type, get_hob_list());
Lee Leahyb5ad8272015-04-20 15:29:16 -070051}
52
53/* Returns the next instance of the matched GUID HOB from the starting HOB. */
Lee Leahy216712a2017-03-17 11:23:32 -070054void *get_next_guid_hob(const EFI_GUID *guid, const void *hob_start)
Lee Leahyb5ad8272015-04-20 15:29:16 -070055{
56 EFI_PEI_HOB_POINTERS hob;
57
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040058 hob.Raw = (uint8_t *)hob_start;
Lee Leahyb5ad8272015-04-20 15:29:16 -070059 while ((hob.Raw = get_next_hob(EFI_HOB_TYPE_GUID_EXTENSION, hob.Raw))
60 != NULL) {
61 if (compare_guid(guid, &hob.Guid->Name))
62 break;
63 hob.Raw = GET_NEXT_HOB(hob.Raw);
64 }
65 return hob.Raw;
66}
67
68/*
69 * Returns the first instance of the matched GUID HOB among the whole HOB list.
70 */
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -040071void *get_first_guid_hob(const EFI_GUID *guid)
Lee Leahyb5ad8272015-04-20 15:29:16 -070072{
73 return get_next_guid_hob(guid, get_hob_list());
74}
75
76/*
77 * Returns the next instance of the matching resource HOB from the starting HOB.
78 */
79void *get_next_resource_hob(const EFI_GUID *guid, const void *hob_start)
80{
81 EFI_PEI_HOB_POINTERS hob;
82
83 hob.Raw = (UINT8 *)hob_start;
84 while ((hob.Raw = get_next_hob(EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
85 hob.Raw)) != NULL) {
86 if (compare_guid(guid, &hob.ResourceDescriptor->Owner))
87 break;
88 hob.Raw = GET_NEXT_HOB(hob.Raw);
89 }
90 return hob.Raw;
91}
92
93/*
94 * Returns the first instance of the matching resource HOB among the whole HOB
95 * list.
96 */
97void *get_first_resource_hob(const EFI_GUID *guid)
98{
99 return get_next_resource_hob(guid, get_hob_list());
100}
101
102static void print_hob_mem_attributes(void *hob_ptr)
103{
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400104 EFI_MEMORY_TYPE hob_mem_type;
105 EFI_HOB_MEMORY_ALLOCATION *hob_memory_ptr = hob_ptr;
Lee Leahyb5ad8272015-04-20 15:29:16 -0700106 u64 hob_mem_addr = hob_memory_ptr->AllocDescriptor.MemoryBaseAddress;
107 u64 hob_mem_length = hob_memory_ptr->AllocDescriptor.MemoryLength;
Lee Leahyb5ad8272015-04-20 15:29:16 -0700108
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400109 hob_mem_type = hob_memory_ptr->AllocDescriptor.MemoryType;
110
111 static const char *hob_mem_type_names[15] = {
112 [EfiReservedMemoryType] = "EfiReservedMemoryType",
113 [EfiLoaderCode] = "EfiLoaderCode",
114 [EfiLoaderData] = "EfiLoaderData",
115 [EfiBootServicesCode] = "EfiBootServicesCode",
116 [EfiBootServicesData] = "EfiBootServicesData",
117 [EfiRuntimeServicesCode] = "EfiRuntimeServicesCode",
118 [EfiRuntimeServicesData] = "EfiRuntimeServicesData",
119 [EfiConventionalMemory] = "EfiConventionalMemory",
120 [EfiUnusableMemory] = "EfiUnusableMemory",
121 [EfiACPIReclaimMemory] = "EfiACPIReclaimMemory",
122 [EfiACPIMemoryNVS] = "EfiACPIMemoryNVS",
123 [EfiMemoryMappedIO] = "EfiMemoryMappedIO",
124 [EfiMemoryMappedIOPortSpace] = "EfiMemoryMappedIOPortSpace",
125 [EfiPalCode] = "EfiPalCode",
126 [EfiMaxMemoryType] = "EfiMaxMemoryType",
127 };
128
129 if (hob_mem_type >= ARRAY_SIZE(hob_mem_type_names))
130 hob_mem_type = EfiReservedMemoryType;
Lee Leahy3dad4892015-05-05 11:14:02 -0700131
132 printk(BIOS_SPEW, " Memory type %s (0x%x)\n",
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400133 hob_mem_type_names[hob_mem_type],
Lee Leahyb5ad8272015-04-20 15:29:16 -0700134 (u32)hob_mem_type);
Lee Leahy3dad4892015-05-05 11:14:02 -0700135 printk(BIOS_SPEW, " at location 0x%0lx with length 0x%0lx\n",
Lee Leahyb5ad8272015-04-20 15:29:16 -0700136 (unsigned long)hob_mem_addr,
137 (unsigned long)hob_mem_length);
Lee Leahy3dad4892015-05-05 11:14:02 -0700138}
139
Lee Leahyb5ad8272015-04-20 15:29:16 -0700140static void print_hob_resource_attributes(void *hob_ptr)
Lee Leahy3dad4892015-05-05 11:14:02 -0700141{
Lee Leahyb5ad8272015-04-20 15:29:16 -0700142 EFI_HOB_RESOURCE_DESCRIPTOR *hob_resource_ptr =
143 (EFI_HOB_RESOURCE_DESCRIPTOR *)hob_ptr;
144 u32 hob_res_type = hob_resource_ptr->ResourceType;
145 u32 hob_res_attr = hob_resource_ptr->ResourceAttribute;
146 u64 hob_res_addr = hob_resource_ptr->PhysicalStart;
147 u64 hob_res_length = hob_resource_ptr->ResourceLength;
148 const char *hob_res_type_str = NULL;
Lee Leahy3dad4892015-05-05 11:14:02 -0700149
Lee Leahyb5ad8272015-04-20 15:29:16 -0700150 /* HOB Resource Types */
151 switch (hob_res_type) {
Lee Leahy3dad4892015-05-05 11:14:02 -0700152 case EFI_RESOURCE_SYSTEM_MEMORY:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700153 hob_res_type_str = "EFI_RESOURCE_SYSTEM_MEMORY";
154 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700155 case EFI_RESOURCE_MEMORY_MAPPED_IO:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700156 hob_res_type_str = "EFI_RESOURCE_MEMORY_MAPPED_IO";
157 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700158 case EFI_RESOURCE_IO:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700159 hob_res_type_str = "EFI_RESOURCE_IO";
160 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700161 case EFI_RESOURCE_FIRMWARE_DEVICE:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700162 hob_res_type_str = "EFI_RESOURCE_FIRMWARE_DEVICE";
163 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700164 case EFI_RESOURCE_MEMORY_MAPPED_IO_PORT:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700165 hob_res_type_str = "EFI_RESOURCE_MEMORY_MAPPED_IO_PORT";
166 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700167 case EFI_RESOURCE_MEMORY_RESERVED:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700168 hob_res_type_str = "EFI_RESOURCE_MEMORY_RESERVED";
169 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700170 case EFI_RESOURCE_IO_RESERVED:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700171 hob_res_type_str = "EFI_RESOURCE_IO_RESERVED";
172 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700173 case EFI_RESOURCE_MAX_MEMORY_TYPE:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700174 hob_res_type_str = "EFI_RESOURCE_MAX_MEMORY_TYPE";
175 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700176 default:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700177 hob_res_type_str = "EFI_RESOURCE_UNKNOWN";
178 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700179 }
180
181 printk(BIOS_SPEW, " Resource %s (0x%0x) has attributes 0x%0x\n",
Lee Leahyb5ad8272015-04-20 15:29:16 -0700182 hob_res_type_str, hob_res_type, hob_res_attr);
Lee Leahy3dad4892015-05-05 11:14:02 -0700183 printk(BIOS_SPEW, " at location 0x%0lx with length 0x%0lx\n",
Lee Leahyb5ad8272015-04-20 15:29:16 -0700184 (unsigned long)hob_res_addr,
185 (unsigned long)hob_res_length);
Lee Leahy3dad4892015-05-05 11:14:02 -0700186}
187
Lee Leahyb5ad8272015-04-20 15:29:16 -0700188static const char *get_hob_type_string(void *hob_ptr)
Lee Leahy3dad4892015-05-05 11:14:02 -0700189{
Lee Leahyb5ad8272015-04-20 15:29:16 -0700190 EFI_PEI_HOB_POINTERS hob;
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400191 const char *hob_type_string;
Lee Leahyb5ad8272015-04-20 15:29:16 -0700192 const EFI_GUID fsp_reserved_guid =
193 FSP_RESERVED_MEMORY_RESOURCE_HOB_GUID;
194 const EFI_GUID mrc_guid = FSP_NON_VOLATILE_STORAGE_HOB_GUID;
195 const EFI_GUID bootldr_tmp_mem_guid =
196 FSP_BOOTLOADER_TEMP_MEMORY_HOB_GUID;
197 const EFI_GUID bootldr_tolum_guid = FSP_BOOTLOADER_TOLUM_HOB_GUID;
198 const EFI_GUID graphics_info_guid = EFI_PEI_GRAPHICS_INFO_HOB_GUID;
Lee Leahy4a8c19c2015-06-16 14:33:30 -0700199 const EFI_GUID memory_info_hob_guid = FSP_SMBIOS_MEMORY_INFO_GUID;
Lee Leahy3dad4892015-05-05 11:14:02 -0700200
Lee Leahyb5ad8272015-04-20 15:29:16 -0700201 hob.Header = (EFI_HOB_GENERIC_HEADER *)hob_ptr;
202 switch (hob.Header->HobType) {
Lee Leahy3dad4892015-05-05 11:14:02 -0700203 case EFI_HOB_TYPE_HANDOFF:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700204 hob_type_string = "EFI_HOB_TYPE_HANDOFF";
205 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700206 case EFI_HOB_TYPE_MEMORY_ALLOCATION:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700207 hob_type_string = "EFI_HOB_TYPE_MEMORY_ALLOCATION";
208 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700209 case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR:
Lee Leahy4a8c19c2015-06-16 14:33:30 -0700210 if (compare_guid(&fsp_reserved_guid, &hob.Guid->Name))
211 hob_type_string = "FSP_RESERVED_MEMORY_RESOURCE_HOB";
212 else if (compare_guid(&bootldr_tolum_guid, &hob.Guid->Name))
213 hob_type_string = "FSP_BOOTLOADER_TOLUM_HOB_GUID";
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400214 else
215 hob_type_string = "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR";
Lee Leahyb5ad8272015-04-20 15:29:16 -0700216 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700217 case EFI_HOB_TYPE_GUID_EXTENSION:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700218 if (compare_guid(&bootldr_tmp_mem_guid, &hob.Guid->Name))
219 hob_type_string = "FSP_BOOTLOADER_TEMP_MEMORY_HOB";
Lee Leahyb5ad8272015-04-20 15:29:16 -0700220 else if (compare_guid(&mrc_guid, &hob.Guid->Name))
221 hob_type_string = "FSP_NON_VOLATILE_STORAGE_HOB";
Lee Leahyb5ad8272015-04-20 15:29:16 -0700222 else if (compare_guid(&graphics_info_guid, &hob.Guid->Name))
223 hob_type_string = "EFI_PEI_GRAPHICS_INFO_HOB_GUID";
Lee Leahy4a8c19c2015-06-16 14:33:30 -0700224 else if (compare_guid(&memory_info_hob_guid, &hob.Guid->Name))
225 hob_type_string = "FSP_SMBIOS_MEMORY_INFO_GUID";
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400226 else
227 hob_type_string = "EFI_HOB_TYPE_GUID_EXTENSION";
Lee Leahyb5ad8272015-04-20 15:29:16 -0700228 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700229 case EFI_HOB_TYPE_MEMORY_POOL:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700230 hob_type_string = "EFI_HOB_TYPE_MEMORY_POOL";
231 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700232 case EFI_HOB_TYPE_UNUSED:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700233 hob_type_string = "EFI_HOB_TYPE_UNUSED";
234 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700235 case EFI_HOB_TYPE_END_OF_HOB_LIST:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700236 hob_type_string = "EFI_HOB_TYPE_END_OF_HOB_LIST";
237 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700238 default:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700239 hob_type_string = "EFI_HOB_TYPE_UNRECOGNIZED";
240 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700241 }
242
Lee Leahyb5ad8272015-04-20 15:29:16 -0700243 return hob_type_string;
Lee Leahy3dad4892015-05-05 11:14:02 -0700244}
245
Lee Leahyb5ad8272015-04-20 15:29:16 -0700246/*
247 * Print out a structure of all the HOBs
Lee Leahy3dad4892015-05-05 11:14:02 -0700248 * that match a certain type:
249 * Print all types (0x0000)
Lee Leahyb5ad8272015-04-20 15:29:16 -0700250 * EFI_HOB_TYPE_HANDOFF (0x0001)
Lee Leahy3dad4892015-05-05 11:14:02 -0700251 * EFI_HOB_TYPE_MEMORY_ALLOCATION (0x0002)
252 * EFI_HOB_TYPE_RESOURCE_DESCRIPTOR (0x0003)
253 * EFI_HOB_TYPE_GUID_EXTENSION (0x0004)
254 * EFI_HOB_TYPE_MEMORY_POOL (0x0007)
255 * EFI_HOB_TYPE_UNUSED (0xFFFE)
256 * EFI_HOB_TYPE_END_OF_HOB_LIST (0xFFFF)
257 */
Lee Leahyb5ad8272015-04-20 15:29:16 -0700258void print_hob_type_structure(u16 hob_type, void *hob_list_ptr)
Lee Leahy3dad4892015-05-05 11:14:02 -0700259{
Lee Leahyb5ad8272015-04-20 15:29:16 -0700260 u32 *current_hob;
261 u32 *next_hob = 0;
262 u8 last_hob = 0;
263 u32 current_type;
264 const char *current_type_str;
Lee Leahy3dad4892015-05-05 11:14:02 -0700265
Lee Leahyb5ad8272015-04-20 15:29:16 -0700266 current_hob = hob_list_ptr;
Lee Leahy3dad4892015-05-05 11:14:02 -0700267
Lee Leahyb5ad8272015-04-20 15:29:16 -0700268 /*
269 * Print out HOBs of our desired type until
Lee Leahy3dad4892015-05-05 11:14:02 -0700270 * the end of the HOB list
271 */
272 printk(BIOS_DEBUG, "\n=== FSP HOB Data Structure ===\n");
Julius Werner540a9802019-12-09 13:03:29 -0800273 printk(BIOS_DEBUG, "%p: hob_list_ptr\n", hob_list_ptr);
Lee Leahy3dad4892015-05-05 11:14:02 -0700274 do {
Lee Leahyb5ad8272015-04-20 15:29:16 -0700275 EFI_HOB_GENERIC_HEADER *current_header_ptr =
276 (EFI_HOB_GENERIC_HEADER *)current_hob;
Lee Leahy3dad4892015-05-05 11:14:02 -0700277
Lee Leahyb5ad8272015-04-20 15:29:16 -0700278 /* Get the type of this HOB */
279 current_type = current_header_ptr->HobType;
280 current_type_str = get_hob_type_string(current_hob);
281
282 if (current_type == hob_type || hob_type == 0x0000) {
Alexandru Gagniuc5c9a71e2015-08-28 18:49:40 -0400283 printk(BIOS_DEBUG, "HOB %p is an %s (type 0x%0x)\n",
284 current_hob, current_type_str,
Lee Leahyb5ad8272015-04-20 15:29:16 -0700285 current_type);
286 switch (current_type) {
Lee Leahy3dad4892015-05-05 11:14:02 -0700287 case EFI_HOB_TYPE_MEMORY_ALLOCATION:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700288 print_hob_mem_attributes(current_hob);
289 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700290 case EFI_HOB_TYPE_RESOURCE_DESCRIPTOR:
Lee Leahyb5ad8272015-04-20 15:29:16 -0700291 print_hob_resource_attributes(current_hob);
292 break;
Lee Leahy3dad4892015-05-05 11:14:02 -0700293 }
294 }
295
Lee Leahyb5ad8272015-04-20 15:29:16 -0700296 /* Check for end of HOB list */
297 last_hob = END_OF_HOB_LIST(current_hob);
298 if (!last_hob) {
299 /* Get next HOB pointer */
300 next_hob = GET_NEXT_HOB(current_hob);
301
302 /* Start on next HOB */
303 current_hob = next_hob;
Lee Leahy3dad4892015-05-05 11:14:02 -0700304 }
Lee Leahyb5ad8272015-04-20 15:29:16 -0700305 } while (!last_hob);
Lee Leahy3dad4892015-05-05 11:14:02 -0700306 printk(BIOS_DEBUG, "=== End of FSP HOB Data Structure ===\n\n");
307}