summaryrefslogtreecommitdiff
path: root/src/drivers/intel
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/intel')
-rw-r--r--src/drivers/intel/fsp2_0/include/fsp/util.h5
-rw-r--r--src/drivers/intel/fsp2_0/util.c36
2 files changed, 40 insertions, 1 deletions
diff --git a/src/drivers/intel/fsp2_0/include/fsp/util.h b/src/drivers/intel/fsp2_0/include/fsp/util.h
index ad6a4b5260..f154a34a34 100644
--- a/src/drivers/intel/fsp2_0/include/fsp/util.h
+++ b/src/drivers/intel/fsp2_0/include/fsp/util.h
@@ -12,6 +12,8 @@
#include <program_loading.h>
#include <types.h>
+#define FSP_VER_LEN 30
+
struct hob_header {
uint16_t type;
uint16_t length;
@@ -85,7 +87,8 @@ const struct hob_resource *fsp_hob_header_to_resource(
const struct hob_header *fsp_next_hob(const struct hob_header *parent);
bool fsp_guid_compare(const uint8_t guid1[16], const uint8_t guid2[16]);
void fsp_find_bootloader_tolum(struct range_entry *re);
-
+void fsp_get_version(char *buf);
+void lb_string_platform_blob_version(struct lb_header *header);
/* Fill in header and validate sanity of component within region device. */
enum cb_err fsp_validate_component(struct fsp_header *hdr,
diff --git a/src/drivers/intel/fsp2_0/util.c b/src/drivers/intel/fsp2_0/util.c
index e8c587628e..cfa83d7e0e 100644
--- a/src/drivers/intel/fsp2_0/util.c
+++ b/src/drivers/intel/fsp2_0/util.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
+#include <boot/coreboot_tables.h>
#include <device/mmio.h>
#include <cbfs.h>
#include <cf9_reset.h>
@@ -208,3 +209,38 @@ enum cb_err fsp_load_component(struct fsp_load_descriptor *fspld, struct fsp_hea
return CB_SUCCESS;
}
+
+/* Only call this function when FSP header has been read and validated */
+void fsp_get_version(char *buf)
+{
+ struct fsp_header *hdr = &fsps_hdr;
+ union {
+ uint32_t val;
+ struct {
+ uint8_t bld_num;
+ uint8_t revision;
+ uint8_t minor;
+ uint8_t major;
+ } rev;
+ } revision;
+
+ revision.val = hdr->fsp_revision;
+ snprintf(buf, FSP_VER_LEN, "%u.%u-%u.%u.%u.%u", (hdr->spec_version >> 4),
+ hdr->spec_version & 0xf, revision.rev.major,
+ revision.rev.minor, revision.rev.revision, revision.rev.bld_num);
+}
+
+/* Add FSP version to coreboot table LB_TAG_PLATFORM_BLOB_VERSION */
+void lb_string_platform_blob_version(struct lb_header *header)
+{
+ struct lb_string *rec;
+ size_t len;
+ char fsp_version[FSP_VER_LEN] = {0};
+
+ fsp_get_version(fsp_version);
+ rec = (struct lb_string *)lb_new_record(header);
+ rec->tag = LB_TAG_PLATFORM_BLOB_VERSION;
+ len = strlen(fsp_version);
+ rec->size = ALIGN_UP(sizeof(*rec) + len + 1, 8);
+ memcpy(rec->string, fsp_version, len+1);
+}