aboutsummaryrefslogtreecommitdiff
path: root/arch/x86/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/lib')
-rw-r--r--arch/x86/lib/Makefile1
-rw-r--r--arch/x86/lib/acpi_table.c32
-rw-r--r--arch/x86/lib/asm-offsets.c2
-rw-r--r--arch/x86/lib/fsp/fsp_support.c123
-rw-r--r--arch/x86/lib/hob.c84
-rw-r--r--arch/x86/lib/init_helpers.c3
6 files changed, 148 insertions, 97 deletions
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile
index 436252dd83..906be5eab9 100644
--- a/arch/x86/lib/Makefile
+++ b/arch/x86/lib/Makefile
@@ -42,6 +42,7 @@ obj-y += tables.o
ifndef CONFIG_SPL_BUILD
obj-$(CONFIG_CMD_ZBOOT) += zimage.o
endif
+obj-$(CONFIG_USE_HOB) += hob.o
obj-$(CONFIG_HAVE_FSP) += fsp/
ifdef CONFIG_SPL_BUILD
diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c
index 270274f6b3..0d69cf271f 100644
--- a/arch/x86/lib/acpi_table.c
+++ b/arch/x86/lib/acpi_table.c
@@ -337,6 +337,30 @@ static void acpi_create_mcfg(struct acpi_mcfg *mcfg)
header->checksum = table_compute_checksum((void *)mcfg, header->length);
}
+__weak u32 acpi_fill_csrt(u32 current)
+{
+ return current;
+}
+
+static void acpi_create_csrt(struct acpi_csrt *csrt)
+{
+ struct acpi_table_header *header = &(csrt->header);
+ u32 current = (u32)csrt + sizeof(struct acpi_csrt);
+
+ memset((void *)csrt, 0, sizeof(struct acpi_csrt));
+
+ /* Fill out header fields */
+ acpi_fill_header(header, "CSRT");
+ header->length = sizeof(struct acpi_csrt);
+ header->revision = 0;
+
+ current = acpi_fill_csrt(current);
+
+ /* (Re)calculate length and checksum */
+ header->length = current - (u32)csrt;
+ header->checksum = table_compute_checksum((void *)csrt, header->length);
+}
+
static void acpi_create_spcr(struct acpi_spcr *spcr)
{
struct acpi_table_header *header = &(spcr->header);
@@ -464,6 +488,7 @@ ulong write_acpi_tables(ulong start)
struct acpi_fadt *fadt;
struct acpi_mcfg *mcfg;
struct acpi_madt *madt;
+ struct acpi_csrt *csrt;
struct acpi_spcr *spcr;
int i;
@@ -553,6 +578,13 @@ ulong write_acpi_tables(ulong start)
acpi_add_table(rsdp, mcfg);
current = ALIGN(current, 16);
+ debug("ACPI: * CSRT\n");
+ csrt = (struct acpi_csrt *)current;
+ acpi_create_csrt(csrt);
+ current += csrt->header.length;
+ acpi_add_table(rsdp, csrt);
+ current = ALIGN(current, 16);
+
debug("ACPI: * SPCR\n");
spcr = (struct acpi_spcr *)current;
acpi_create_spcr(spcr);
diff --git a/arch/x86/lib/asm-offsets.c b/arch/x86/lib/asm-offsets.c
index 90dce22b25..47b38cd9e7 100644
--- a/arch/x86/lib/asm-offsets.c
+++ b/arch/x86/lib/asm-offsets.c
@@ -17,7 +17,7 @@
int main(void)
{
DEFINE(GD_BIST, offsetof(gd_t, arch.bist));
-#ifdef CONFIG_HAVE_FSP
+#ifdef CONFIG_USE_HOB
DEFINE(GD_HOB_LIST, offsetof(gd_t, arch.hob_list));
#endif
DEFINE(GD_TABLE, offsetof(gd_t, arch.table));
diff --git a/arch/x86/lib/fsp/fsp_support.c b/arch/x86/lib/fsp/fsp_support.c
index 90e4e7db26..0eaa9b232b 100644
--- a/arch/x86/lib/fsp/fsp_support.c
+++ b/arch/x86/lib/fsp/fsp_support.c
@@ -8,27 +8,6 @@
#include <asm/fsp/fsp_support.h>
#include <asm/post.h>
-/**
- * Compares two GUIDs
- *
- * If the GUIDs are identical then true is returned.
- * If there are any bit differences in the two GUIDs, then false is returned.
- *
- * @guid1: A pointer to a 128 bit GUID.
- * @guid2: A pointer to a 128 bit GUID.
- *
- * @retval true: guid1 and guid2 are identical.
- * @retval false: guid1 and guid2 are not identical.
- */
-static bool compare_guid(const struct efi_guid *guid1,
- const struct efi_guid *guid2)
-{
- if (memcmp(guid1, guid2, sizeof(struct efi_guid)) == 0)
- return true;
- else
- return false;
-}
-
struct fsp_header *__attribute__((optimize("O0"))) find_fsp_header(void)
{
/*
@@ -58,17 +37,22 @@ struct fsp_header *__attribute__((optimize("O0"))) find_fsp_header(void)
/* Check the FFS GUID */
if (fsp &&
- ((struct ffs_file_header *)fsp)->name.data1 == FSP_GUID_DATA1 &&
- ((struct ffs_file_header *)fsp)->name.data2 == FSP_GUID_DATA2 &&
- ((struct ffs_file_header *)fsp)->name.data3 == FSP_GUID_DATA3 &&
- ((struct ffs_file_header *)fsp)->name.data4[0] == FSP_GUID_DATA4_0 &&
- ((struct ffs_file_header *)fsp)->name.data4[1] == FSP_GUID_DATA4_1 &&
- ((struct ffs_file_header *)fsp)->name.data4[2] == FSP_GUID_DATA4_2 &&
- ((struct ffs_file_header *)fsp)->name.data4[3] == FSP_GUID_DATA4_3 &&
- ((struct ffs_file_header *)fsp)->name.data4[4] == FSP_GUID_DATA4_4 &&
- ((struct ffs_file_header *)fsp)->name.data4[5] == FSP_GUID_DATA4_5 &&
- ((struct ffs_file_header *)fsp)->name.data4[6] == FSP_GUID_DATA4_6 &&
- ((struct ffs_file_header *)fsp)->name.data4[7] == FSP_GUID_DATA4_7) {
+ ((struct ffs_file_header *)fsp)->name.b[0] == FSP_GUID_BYTE0 &&
+ ((struct ffs_file_header *)fsp)->name.b[1] == FSP_GUID_BYTE1 &&
+ ((struct ffs_file_header *)fsp)->name.b[2] == FSP_GUID_BYTE2 &&
+ ((struct ffs_file_header *)fsp)->name.b[3] == FSP_GUID_BYTE3 &&
+ ((struct ffs_file_header *)fsp)->name.b[4] == FSP_GUID_BYTE4 &&
+ ((struct ffs_file_header *)fsp)->name.b[5] == FSP_GUID_BYTE5 &&
+ ((struct ffs_file_header *)fsp)->name.b[6] == FSP_GUID_BYTE6 &&
+ ((struct ffs_file_header *)fsp)->name.b[7] == FSP_GUID_BYTE7 &&
+ ((struct ffs_file_header *)fsp)->name.b[8] == FSP_GUID_BYTE8 &&
+ ((struct ffs_file_header *)fsp)->name.b[9] == FSP_GUID_BYTE9 &&
+ ((struct ffs_file_header *)fsp)->name.b[10] == FSP_GUID_BYTE10 &&
+ ((struct ffs_file_header *)fsp)->name.b[11] == FSP_GUID_BYTE11 &&
+ ((struct ffs_file_header *)fsp)->name.b[12] == FSP_GUID_BYTE12 &&
+ ((struct ffs_file_header *)fsp)->name.b[13] == FSP_GUID_BYTE13 &&
+ ((struct ffs_file_header *)fsp)->name.b[14] == FSP_GUID_BYTE14 &&
+ ((struct ffs_file_header *)fsp)->name.b[15] == FSP_GUID_BYTE15) {
/* Add the FFS header size to find the raw section header */
fsp += sizeof(struct ffs_file_header);
} else {
@@ -305,7 +289,7 @@ u64 fsp_get_usable_highmem_top(const void *hob_list)
}
u64 fsp_get_reserved_mem_from_guid(const void *hob_list, u64 *len,
- struct efi_guid *guid)
+ const efi_guid_t *guid)
{
const struct hob_header *hdr;
struct hob_res_desc *res_desc;
@@ -318,7 +302,7 @@ u64 fsp_get_reserved_mem_from_guid(const void *hob_list, u64 *len,
if (hdr->type == HOB_TYPE_RES_DESC) {
res_desc = (struct hob_res_desc *)hdr;
if (res_desc->type == RES_MEM_RESERVED) {
- if (compare_guid(&res_desc->owner, guid)) {
+ if (!guidcmp(&res_desc->owner, guid)) {
if (len)
*len = (u32)(res_desc->len);
@@ -334,12 +318,12 @@ u64 fsp_get_reserved_mem_from_guid(const void *hob_list, u64 *len,
u32 fsp_get_fsp_reserved_mem(const void *hob_list, u32 *len)
{
- const struct efi_guid guid = FSP_HOB_RESOURCE_OWNER_FSP_GUID;
+ const efi_guid_t guid = FSP_HOB_RESOURCE_OWNER_FSP_GUID;
u64 length;
u32 base;
base = (u32)fsp_get_reserved_mem_from_guid(hob_list,
- &length, (struct efi_guid *)&guid);
+ &length, &guid);
if ((len != 0) && (base != 0))
*len = (u32)length;
@@ -348,86 +332,35 @@ u32 fsp_get_fsp_reserved_mem(const void *hob_list, u32 *len)
u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len)
{
- const struct efi_guid guid = FSP_HOB_RESOURCE_OWNER_TSEG_GUID;
+ const efi_guid_t guid = FSP_HOB_RESOURCE_OWNER_TSEG_GUID;
u64 length;
u32 base;
base = (u32)fsp_get_reserved_mem_from_guid(hob_list,
- &length, (struct efi_guid *)&guid);
+ &length, &guid);
if ((len != 0) && (base != 0))
*len = (u32)length;
return base;
}
-const struct hob_header *fsp_get_next_hob(uint type, const void *hob_list)
-{
- const struct hob_header *hdr;
-
- hdr = hob_list;
-
- /* Parse the HOB list until end of list or matching type is found */
- while (!end_of_hob(hdr)) {
- if (hdr->type == type)
- return hdr;
-
- hdr = get_next_hob(hdr);
- }
-
- return NULL;
-}
-
-const struct hob_header *fsp_get_next_guid_hob(const struct efi_guid *guid,
- const void *hob_list)
-{
- const struct hob_header *hdr;
- struct hob_guid *guid_hob;
-
- hdr = hob_list;
- while ((hdr = fsp_get_next_hob(HOB_TYPE_GUID_EXT,
- hdr)) != NULL) {
- guid_hob = (struct hob_guid *)hdr;
- if (compare_guid(guid, &(guid_hob->name)))
- break;
- hdr = get_next_hob(hdr);
- }
-
- return hdr;
-}
-
-void *fsp_get_guid_hob_data(const void *hob_list, u32 *len,
- struct efi_guid *guid)
-{
- const struct hob_header *guid_hob;
-
- guid_hob = fsp_get_next_guid_hob(guid, hob_list);
- if (guid_hob == NULL) {
- return NULL;
- } else {
- if (len)
- *len = get_guid_hob_data_size(guid_hob);
-
- return get_guid_hob_data(guid_hob);
- }
-}
-
void *fsp_get_nvs_data(const void *hob_list, u32 *len)
{
- const struct efi_guid guid = FSP_NON_VOLATILE_STORAGE_HOB_GUID;
+ const efi_guid_t guid = FSP_NON_VOLATILE_STORAGE_HOB_GUID;
- return fsp_get_guid_hob_data(hob_list, len, (struct efi_guid *)&guid);
+ return hob_get_guid_hob_data(hob_list, len, &guid);
}
void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len)
{
- const struct efi_guid guid = FSP_BOOTLOADER_TEMP_MEM_HOB_GUID;
+ const efi_guid_t guid = FSP_BOOTLOADER_TEMP_MEM_HOB_GUID;
- return fsp_get_guid_hob_data(hob_list, len, (struct efi_guid *)&guid);
+ return hob_get_guid_hob_data(hob_list, len, &guid);
}
void *fsp_get_graphics_info(const void *hob_list, u32 *len)
{
- const struct efi_guid guid = FSP_GRAPHICS_INFO_HOB_GUID;
+ const efi_guid_t guid = FSP_GRAPHICS_INFO_HOB_GUID;
- return fsp_get_guid_hob_data(hob_list, len, (struct efi_guid *)&guid);
+ return hob_get_guid_hob_data(hob_list, len, &guid);
}
diff --git a/arch/x86/lib/hob.c b/arch/x86/lib/hob.c
new file mode 100644
index 0000000000..dcee29b04c
--- /dev/null
+++ b/arch/x86/lib/hob.c
@@ -0,0 +1,84 @@
+// SPDX-License-Identifier: Intel
+/*
+ * Copyright (C) 2013, Intel Corporation
+ * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
+ */
+
+#include <common.h>
+#include <asm/hob.h>
+
+/**
+ * Returns the next instance of a HOB type from the starting HOB.
+ *
+ * @type: HOB type to search
+ * @hob_list: A pointer to the HOB list
+ *
+ * @retval: A HOB object with matching type; Otherwise NULL.
+ */
+const struct hob_header *hob_get_next_hob(uint type, const void *hob_list)
+{
+ const struct hob_header *hdr;
+
+ hdr = hob_list;
+
+ /* Parse the HOB list until end of list or matching type is found */
+ while (!end_of_hob(hdr)) {
+ if (hdr->type == type)
+ return hdr;
+
+ hdr = get_next_hob(hdr);
+ }
+
+ return NULL;
+}
+
+/**
+ * Returns the next instance of the matched GUID HOB from the starting HOB.
+ *
+ * @guid: GUID to search
+ * @hob_list: A pointer to the HOB list
+ *
+ * @retval: A HOB object with matching GUID; Otherwise NULL.
+ */
+const struct hob_header *hob_get_next_guid_hob(const efi_guid_t *guid,
+ const void *hob_list)
+{
+ const struct hob_header *hdr;
+ struct hob_guid *guid_hob;
+
+ hdr = hob_list;
+ while ((hdr = hob_get_next_hob(HOB_TYPE_GUID_EXT, hdr))) {
+ guid_hob = (struct hob_guid *)hdr;
+ if (!guidcmp(guid, &guid_hob->name))
+ break;
+ hdr = get_next_hob(hdr);
+ }
+
+ return hdr;
+}
+
+/**
+ * This function retrieves a GUID HOB data buffer and size.
+ *
+ * @hob_list: A HOB list pointer.
+ * @len: A pointer to the GUID HOB data buffer length.
+ * If the GUID HOB is located, the length will be updated.
+ * @guid A pointer to HOB GUID.
+ *
+ * @retval NULL: Failed to find the GUID HOB.
+ * @retval others: GUID HOB data buffer pointer.
+ */
+void *hob_get_guid_hob_data(const void *hob_list, u32 *len,
+ const efi_guid_t *guid)
+{
+ const struct hob_header *guid_hob;
+
+ guid_hob = hob_get_next_guid_hob(guid, hob_list);
+ if (!guid_hob)
+ return NULL;
+
+ if (len)
+ *len = get_guid_hob_data_size(guid_hob);
+
+ return get_guid_hob_data(guid_hob);
+}
diff --git a/arch/x86/lib/init_helpers.c b/arch/x86/lib/init_helpers.c
index 0481f453ca..5e19f13720 100644
--- a/arch/x86/lib/init_helpers.c
+++ b/arch/x86/lib/init_helpers.c
@@ -18,7 +18,8 @@ __weak ulong board_get_usable_ram_top(ulong total_size)
int init_cache_f_r(void)
{
-#if CONFIG_IS_ENABLED(X86_32BIT_INIT) && !defined(CONFIG_HAVE_FSP)
+#if CONFIG_IS_ENABLED(X86_32BIT_INIT) && !defined(CONFIG_HAVE_FSP) && \
+ !defined(CONFIG_SYS_SLIMBOOTLOADER)
int ret;
ret = mtrr_commit(false);