aboutsummaryrefslogtreecommitdiff
path: root/src/drivers/intel/fsp2_0/hob_display.c
diff options
context:
space:
mode:
authorLee Leahy <leroy.p.leahy@intel.com>2016-07-27 07:40:25 -0700
committerLee Leahy <leroy.p.leahy@intel.com>2016-08-03 06:15:47 +0200
commitac3b0a6e9f78cf7c4f2b32a6f97a42e7528aedd6 (patch)
treef3ec1ae156213d847e09c2b4fa61e482a607e442 /src/drivers/intel/fsp2_0/hob_display.c
parente6f2f74b2977fd57f1133fdad182bb718e8b8ddc (diff)
drivers/intel/fsp2_0: Add display HOB support
Add support to display the HOBs returned by FSP: * Add Kconfig value to enable HOB display * Move hob_header, hob_resource and uuid_name structures into util.h * Move hob_type enum into util.h * Remove static from the debug utility functions * Add fsp_ prefix to the debug utility functions * Declare the debug utility functions in debug.h * Add HOB type name table * Add more GUID values * Add new GUID name table for additional GUIDs * Add routine to convert EDK-II GUID into a name * Add SOC specific routine to handle unknown GUID types * Add routine to convert HOB type into a name * Add SOC specific routine to handle unknown HOB types * Add routine to display the hobs TEST=Build and run on Galileo Gen2 Change-Id: I10606d752859fff0f4f08a5ac03ab129b2c96d1f Signed-off-by: Lee Leahy <leroy.p.leahy@intel.com> Reviewed-on: https://review.coreboot.org/15851 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/drivers/intel/fsp2_0/hob_display.c')
-rw-r--r--src/drivers/intel/fsp2_0/hob_display.c231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/drivers/intel/fsp2_0/hob_display.c b/src/drivers/intel/fsp2_0/hob_display.c
new file mode 100644
index 0000000000..048d8606e4
--- /dev/null
+++ b/src/drivers/intel/fsp2_0/hob_display.c
@@ -0,0 +1,231 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2016 Intel Corp.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <console/console.h>
+#include <fsp/util.h>
+
+struct hob_type_name {
+ uint16_t type;
+ const char *name;
+} __attribute__((packed));
+
+static const struct hob_type_name hob_type_names [] = {
+ { HOB_TYPE_HANDOFF, "HOB_TYPE_HANDOFF" },
+ { HOB_TYPE_MEMORY_ALLOCATION, "HOB_TYPE_MEMORY_ALLOCATION" },
+ { HOB_TYPE_RESOURCE_DESCRIPTOR, "HOB_TYPE_RESOURCE_DESCRIPTOR" },
+ { HOB_TYPE_GUID_EXTENSION, "HOB_TYPE_GUID_EXTENSION" },
+ { HOB_TYPE_FV, "HOB_TYPE_FV" },
+ { HOB_TYPE_CPU, "HOB_TYPE_CPU" },
+ { HOB_TYPE_MEMORY_POOL, "HOB_TYPE_MEMORY_POOL" },
+ { HOB_TYPE_FV2, "HOB_TYPE_FV2" },
+ { HOB_TYPE_LOAD_PEIM_UNUSED, "HOB_TYPE_LOAD_PEIM_UNUSED" },
+ { HOB_TYPE_UCAPSULE, "HOB_TYPE_UCAPSULE" },
+ { HOB_TYPE_UNUSED, "HOB_TYPE_UNUSED" },
+ { HOB_TYPE_END_OF_HOB_LIST, "HOB_TYPE_END_OF_HOB_LIST" }
+};
+
+static const char *resource_names[] = {
+ [EFI_RESOURCE_SYSTEM_MEMORY] = "SYSTEM_MEMORY",
+ [EFI_RESOURCE_MEMORY_MAPPED_IO] = "MMIO",
+ [EFI_RESOURCE_IO] = "IO",
+ [EFI_RESOURCE_FIRMWARE_DEVICE] = "FIRMWARE_DEVICE",
+ [EFI_RESOURCE_MEMORY_MAPPED_IO_PORT] = "MMIO_PORT",
+ [EFI_RESOURCE_MEMORY_RESERVED] = "MEMORY_RESERVED",
+ [EFI_RESOURCE_IO_RESERVED] = "IO_RESERVED",
+};
+
+static const uint8_t bootloader_temp_memory_guid[16] = {
+ 0x6c, 0xf4, 0xcf, 0xbb, 0xd3, 0xc8, 0x13, 0x41,
+ 0x89, 0x85, 0xb9, 0xd4, 0xf3, 0xb3, 0xf6, 0x4e
+};
+
+static const uint8_t bootloader_tolum_guid[16] = {
+ 0x56, 0x4f, 0xff, 0x73, 0x8e, 0xaa, 0x51, 0x44,
+ 0xb3, 0x16, 0x36, 0x35, 0x36, 0x67, 0xad, 0x44,
+};
+
+static const uint8_t empty_guid[16] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const uint8_t fsp_info_header_guid[16] = {
+ 0xbe, 0x40, 0x27, 0x91, 0x84, 0x22, 0x34, 0x47,
+ 0xb9, 0x71, 0x84, 0xb0, 0x27, 0x35, 0x3f, 0x0c
+};
+
+static const uint8_t smbios_memory_info_guid[16] = {
+ 0x8c, 0x10, 0xa1, 0x01, 0xee, 0x9d, 0x84, 0x49,
+ 0x88, 0xc3, 0xee, 0xe8, 0xc4, 0x9e, 0xfb, 0x89
+};
+
+static const uint8_t tseg_guid[16] = {
+ 0x7c, 0x74, 0x38, 0xd0, 0x0c, 0xd0, 0x80, 0x49,
+ 0xb3, 0x19, 0x49, 0x01, 0x99, 0xa4, 0x7d, 0x55
+};
+
+struct guid_name_map {
+ const void *guid;
+ const char *name;
+};
+
+static const struct guid_name_map guid_names[] = {
+ { bootloader_temp_memory_guid, "FSP_BOOTLOADER_TEMP_MEMORY_HOB_GUID" },
+ { bootloader_tolum_guid, "BOOTLOADER_TOLUM" },
+ { empty_guid, "No GUID specified" },
+ { fsp_info_header_guid, "FSP_INFO_HEADER_GUID" },
+ { fsp_reserved_memory_guid, "FSP_RESERVED_MEMORY" },
+ { fsp_nv_storage_guid, "FSP_NV_STORAGE" },
+ { graphics_info_guid, "GRAPHICS INFO" },
+ { smbios_memory_info_guid, "FSP_SMBIOS_MEMORY_INFO_GUID" },
+ { tseg_guid, "TSEG" },
+};
+
+void fsp_print_guid(const void *base)
+{
+ uint32_t big;
+ uint16_t mid[2];
+
+ const uint8_t *id = base;
+ big = read32(id + 0);
+ mid[0] = read16(id + 4);
+ mid[1] = read16(id + 6);
+
+ printk(BIOS_SPEW, "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x",
+ big, mid[0], mid[1],
+ id[8], id[9], id[10], id[11], id[12], id[13], id[14], id[15]);
+}
+
+static const char *resource_name(enum resource_type type)
+{
+ if (type >= ARRAY_SIZE(resource_names))
+ return "UNKNOWN";
+ return resource_names[type];
+}
+
+void fsp_print_resource_descriptor(const void *base)
+{
+ const struct hob_resource *res;
+
+ res = fsp_hob_header_to_resource(base);
+
+ printk(BIOS_SPEW, "Resource %s, attribute %x\n",
+ resource_name(res->type), res->attribute_type);
+ printk(BIOS_SPEW, "\t0x%08llx + 0x%08llx\n", res->addr, res->length);
+ if (!fsp_guid_compare(res->owner_guid, empty_guid)) {
+ printk(BIOS_SPEW, "\tOwner GUID: ");
+ fsp_print_guid(res->owner_guid);
+ printk(BIOS_SPEW, " (%s)\n",
+ fsp_get_guid_name(res->owner_guid));
+ }
+}
+
+void fsp_print_memory_resource_hobs(void)
+{
+ const struct hob_header *hob = fsp_get_hob_list();
+
+ for ( ; hob->type != HOB_TYPE_END_OF_HOB_LIST;
+ hob = fsp_next_hob(hob)) {
+ if (hob->type == HOB_TYPE_RESOURCE_DESCRIPTOR)
+ fsp_print_resource_descriptor(hob);
+ }
+}
+
+const char *fsp_get_hob_type_name(const struct hob_header *hob)
+{
+ size_t index;
+ const char *name;
+
+ for (index = 0; index < ARRAY_SIZE(hob_type_names); index++)
+ if (hob->type == hob_type_names[index].type)
+ return hob_type_names[index].name;
+
+ /* Get name for SOC specific hob */
+ name = soc_get_hob_type_name(hob);
+ if (name != NULL)
+ return name;
+ return "Unknown HOB type";
+}
+
+const char *fsp_get_guid_name(const uint8_t *guid)
+{
+ size_t index;
+ const char *name;
+
+ /* Compare the GUID values in this module */
+ for (index = 0; index < ARRAY_SIZE(guid_names); index++)
+ if (fsp_guid_compare(guid, guid_names[index].guid))
+ return guid_names[index].name;
+
+ /* Get GUID name from SOC */
+ name = soc_get_guid_name(guid);
+ if (name != NULL)
+ return name;
+ return "Unknown GUID";
+}
+
+__attribute__((weak)) const char *soc_get_hob_type_name(
+ const struct hob_header *hob)
+{
+ return NULL;
+}
+
+void fsp_print_guid_extension_hob(const struct hob_header *hob)
+{
+ const struct hob_resource *res;
+
+ res = fsp_hob_header_to_resource(hob);
+ printk(BIOS_SPEW, "\t");
+ fsp_print_guid(res->owner_guid);
+ printk(BIOS_SPEW, ": %s\n", fsp_get_guid_name(res->owner_guid));
+}
+
+__attribute__((weak)) const char *soc_get_guid_name(const uint8_t *guid)
+{
+ return NULL;
+}
+
+void fsp_display_hobs(void)
+{
+ const struct hob_header *hob = fsp_get_hob_list();
+
+ /* Display the HOB list pointer */
+ printk(BIOS_SPEW, "\n=== FSP HOBs ===\n");
+ printk(BIOS_SPEW, "0x%p: hob_list_ptr\n", hob);
+
+ /* Walk the list of HOBs */
+ while (1) {
+ /* Display the HOB header */
+ printk(BIOS_SPEW, "0x%p, 0x%08x bytes: %s\n", hob, hob->length,
+ fsp_get_hob_type_name(hob));
+ switch(hob->type) {
+ default:
+ soc_display_hob(hob);
+ break;
+
+ case HOB_TYPE_END_OF_HOB_LIST:
+ printk(BIOS_SPEW, "=== End of FSP HOBs ===\n\n");
+ return;
+
+ case HOB_TYPE_RESOURCE_DESCRIPTOR:
+ fsp_print_resource_descriptor(hob);
+ break;
+
+ case HOB_TYPE_GUID_EXTENSION:
+ fsp_print_guid_extension_hob(hob);
+ break;
+ }
+ hob = fsp_next_hob(hob);
+ }
+}
+
+__attribute__((weak)) void soc_display_hob(const struct hob_header *hob)
+{
+}