mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 16:52:14 +02:00
x86: Add a common HOB library
FSP (CONFIG_HAVE_FSP) and Slim Bootloader (CONFIG_SYS_SLIMBOOTLOADER) consume HOB (CONFIG_USE_HOB) data from the each HOB list pointer. Add a common HOB library in lib/hob.c and include/asm/hob.h. Signed-off-by: Aiden Park <aiden.park@intel.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
@@ -7,125 +7,7 @@
|
|||||||
#ifndef __FSP_HOB_H__
|
#ifndef __FSP_HOB_H__
|
||||||
#define __FSP_HOB_H__
|
#define __FSP_HOB_H__
|
||||||
|
|
||||||
#include <efi.h>
|
#include <asm/hob.h>
|
||||||
#include <efi_loader.h>
|
|
||||||
|
|
||||||
/* Type of HOB Header */
|
|
||||||
#define HOB_TYPE_MEM_ALLOC 0x0002
|
|
||||||
#define HOB_TYPE_RES_DESC 0x0003
|
|
||||||
#define HOB_TYPE_GUID_EXT 0x0004
|
|
||||||
#define HOB_TYPE_UNUSED 0xFFFE
|
|
||||||
#define HOB_TYPE_EOH 0xFFFF
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Describes the format and size of the data inside the HOB.
|
|
||||||
* All HOBs must contain this generic HOB header.
|
|
||||||
*/
|
|
||||||
struct hob_header {
|
|
||||||
u16 type; /* HOB type */
|
|
||||||
u16 len; /* HOB length */
|
|
||||||
u32 reserved; /* always zero */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Describes all memory ranges used during the HOB producer phase that
|
|
||||||
* exist outside the HOB list. This HOB type describes how memory is used,
|
|
||||||
* not the physical attributes of memory.
|
|
||||||
*/
|
|
||||||
struct hob_mem_alloc {
|
|
||||||
struct hob_header hdr;
|
|
||||||
/*
|
|
||||||
* A GUID that defines the memory allocation region's type and purpose,
|
|
||||||
* as well as other fields within the memory allocation HOB. This GUID
|
|
||||||
* is used to define the additional data within the HOB that may be
|
|
||||||
* present for the memory allocation HOB. Type efi_guid is defined in
|
|
||||||
* InstallProtocolInterface() in the UEFI 2.0 specification.
|
|
||||||
*/
|
|
||||||
efi_guid_t name;
|
|
||||||
/*
|
|
||||||
* The base address of memory allocated by this HOB.
|
|
||||||
* Type phys_addr_t is defined in AllocatePages() in the UEFI 2.0
|
|
||||||
* specification.
|
|
||||||
*/
|
|
||||||
phys_addr_t mem_base;
|
|
||||||
/* The length in bytes of memory allocated by this HOB */
|
|
||||||
phys_size_t mem_len;
|
|
||||||
/*
|
|
||||||
* Defines the type of memory allocated by this HOB.
|
|
||||||
* The memory type definition follows the EFI_MEMORY_TYPE definition.
|
|
||||||
* Type EFI_MEMORY_TYPE is defined in AllocatePages() in the UEFI 2.0
|
|
||||||
* specification.
|
|
||||||
*/
|
|
||||||
enum efi_mem_type mem_type;
|
|
||||||
/* padding */
|
|
||||||
u8 reserved[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Value of ResourceType in HOB_RES_DESC */
|
|
||||||
#define RES_SYS_MEM 0x00000000
|
|
||||||
#define RES_MMAP_IO 0x00000001
|
|
||||||
#define RES_IO 0x00000002
|
|
||||||
#define RES_FW_DEVICE 0x00000003
|
|
||||||
#define RES_MMAP_IO_PORT 0x00000004
|
|
||||||
#define RES_MEM_RESERVED 0x00000005
|
|
||||||
#define RES_IO_RESERVED 0x00000006
|
|
||||||
#define RES_MAX_MEM_TYPE 0x00000007
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These types can be ORed together as needed.
|
|
||||||
*
|
|
||||||
* The first three enumerations describe settings
|
|
||||||
* The rest of the settings describe capabilities
|
|
||||||
*/
|
|
||||||
#define RES_ATTR_PRESENT 0x00000001
|
|
||||||
#define RES_ATTR_INITIALIZED 0x00000002
|
|
||||||
#define RES_ATTR_TESTED 0x00000004
|
|
||||||
#define RES_ATTR_SINGLE_BIT_ECC 0x00000008
|
|
||||||
#define RES_ATTR_MULTIPLE_BIT_ECC 0x00000010
|
|
||||||
#define RES_ATTR_ECC_RESERVED_1 0x00000020
|
|
||||||
#define RES_ATTR_ECC_RESERVED_2 0x00000040
|
|
||||||
#define RES_ATTR_READ_PROTECTED 0x00000080
|
|
||||||
#define RES_ATTR_WRITE_PROTECTED 0x00000100
|
|
||||||
#define RES_ATTR_EXECUTION_PROTECTED 0x00000200
|
|
||||||
#define RES_ATTR_UNCACHEABLE 0x00000400
|
|
||||||
#define RES_ATTR_WRITE_COMBINEABLE 0x00000800
|
|
||||||
#define RES_ATTR_WRITE_THROUGH_CACHEABLE 0x00001000
|
|
||||||
#define RES_ATTR_WRITE_BACK_CACHEABLE 0x00002000
|
|
||||||
#define RES_ATTR_16_BIT_IO 0x00004000
|
|
||||||
#define RES_ATTR_32_BIT_IO 0x00008000
|
|
||||||
#define RES_ATTR_64_BIT_IO 0x00010000
|
|
||||||
#define RES_ATTR_UNCACHED_EXPORTED 0x00020000
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Describes the resource properties of all fixed, nonrelocatable resource
|
|
||||||
* ranges found on the processor host bus during the HOB producer phase.
|
|
||||||
*/
|
|
||||||
struct hob_res_desc {
|
|
||||||
struct hob_header hdr;
|
|
||||||
/*
|
|
||||||
* A GUID representing the owner of the resource. This GUID is
|
|
||||||
* used by HOB consumer phase components to correlate device
|
|
||||||
* ownership of a resource.
|
|
||||||
*/
|
|
||||||
efi_guid_t owner;
|
|
||||||
u32 type;
|
|
||||||
u32 attr;
|
|
||||||
/* The physical start address of the resource region */
|
|
||||||
phys_addr_t phys_start;
|
|
||||||
/* The number of bytes of the resource region */
|
|
||||||
phys_size_t len;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Allows writers of executable content in the HOB producer phase to
|
|
||||||
* maintain and manage HOBs with specific GUID.
|
|
||||||
*/
|
|
||||||
struct hob_guid {
|
|
||||||
struct hob_header hdr;
|
|
||||||
/* A GUID that defines the contents of this HOB */
|
|
||||||
efi_guid_t name;
|
|
||||||
/* GUID specific data goes here */
|
|
||||||
};
|
|
||||||
|
|
||||||
enum pixel_format {
|
enum pixel_format {
|
||||||
pixel_rgbx_8bpc, /* RGB 8 bit per color */
|
pixel_rgbx_8bpc, /* RGB 8 bit per color */
|
||||||
@@ -147,70 +29,6 @@ struct __packed hob_graphics_info {
|
|||||||
u32 pixels_per_scanline;
|
u32 pixels_per_scanline;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* get_next_hob() - return a pointer to the next HOB in the HOB list
|
|
||||||
*
|
|
||||||
* This macro returns a pointer to HOB that follows the HOB specified by hob
|
|
||||||
* in the HOB List.
|
|
||||||
*
|
|
||||||
* @hdr: A pointer to a HOB.
|
|
||||||
*
|
|
||||||
* @return: A pointer to the next HOB in the HOB list.
|
|
||||||
*/
|
|
||||||
static inline const struct hob_header *get_next_hob(const struct hob_header *hdr)
|
|
||||||
{
|
|
||||||
return (const struct hob_header *)((uintptr_t)hdr + hdr->len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* end_of_hob() - determine if a HOB is the last HOB in the HOB list
|
|
||||||
*
|
|
||||||
* This macro determine if the HOB specified by hob is the last HOB in the
|
|
||||||
* HOB list. If hob is last HOB in the HOB list, then true is returned.
|
|
||||||
* Otherwise, false is returned.
|
|
||||||
*
|
|
||||||
* @hdr: A pointer to a HOB.
|
|
||||||
*
|
|
||||||
* @retval true: The HOB specified by hdr is the last HOB in the HOB list.
|
|
||||||
* @retval false: The HOB specified by hdr is not the last HOB in the HOB list.
|
|
||||||
*/
|
|
||||||
static inline bool end_of_hob(const struct hob_header *hdr)
|
|
||||||
{
|
|
||||||
return hdr->type == HOB_TYPE_EOH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get_guid_hob_data() - return a pointer to data buffer from a HOB of
|
|
||||||
* type HOB_TYPE_GUID_EXT
|
|
||||||
*
|
|
||||||
* This macro returns a pointer to the data buffer in a HOB specified by hob.
|
|
||||||
* hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
|
|
||||||
*
|
|
||||||
* @hdr: A pointer to a HOB.
|
|
||||||
*
|
|
||||||
* @return: A pointer to the data buffer in a HOB.
|
|
||||||
*/
|
|
||||||
static inline void *get_guid_hob_data(const struct hob_header *hdr)
|
|
||||||
{
|
|
||||||
return (void *)((uintptr_t)hdr + sizeof(struct hob_guid));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get_guid_hob_data_size() - return the size of the data buffer from a HOB
|
|
||||||
* of type HOB_TYPE_GUID_EXT
|
|
||||||
*
|
|
||||||
* This macro returns the size, in bytes, of the data buffer in a HOB
|
|
||||||
* specified by hob. hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
|
|
||||||
*
|
|
||||||
* @hdr: A pointer to a HOB.
|
|
||||||
*
|
|
||||||
* @return: The size of the data buffer.
|
|
||||||
*/
|
|
||||||
static inline u16 get_guid_hob_data_size(const struct hob_header *hdr)
|
|
||||||
{
|
|
||||||
return hdr->len - sizeof(struct hob_guid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* FSP specific GUID HOB definitions */
|
/* FSP specific GUID HOB definitions */
|
||||||
#define FSP_GUID_DATA1 0x912740be
|
#define FSP_GUID_DATA1 0x912740be
|
||||||
#define FSP_GUID_DATA2 0x2284
|
#define FSP_GUID_DATA2 0x2284
|
||||||
|
@@ -8,10 +8,10 @@
|
|||||||
#define __FSP_SUPPORT_H__
|
#define __FSP_SUPPORT_H__
|
||||||
|
|
||||||
#include "fsp_types.h"
|
#include "fsp_types.h"
|
||||||
|
#include "fsp_hob.h"
|
||||||
#include "fsp_fv.h"
|
#include "fsp_fv.h"
|
||||||
#include "fsp_ffs.h"
|
#include "fsp_ffs.h"
|
||||||
#include "fsp_api.h"
|
#include "fsp_api.h"
|
||||||
#include "fsp_hob.h"
|
|
||||||
#include "fsp_infoheader.h"
|
#include "fsp_infoheader.h"
|
||||||
#include "fsp_bootmode.h"
|
#include "fsp_bootmode.h"
|
||||||
#include "fsp_azalia.h"
|
#include "fsp_azalia.h"
|
||||||
@@ -131,41 +131,6 @@ u32 fsp_get_fsp_reserved_mem(const void *hob_list, u32 *len);
|
|||||||
*/
|
*/
|
||||||
u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len);
|
u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len);
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 *fsp_get_next_hob(uint type, const void *hob_list);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 *fsp_get_next_guid_hob(const efi_guid_t *guid,
|
|
||||||
const void *hob_list);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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 *fsp_get_guid_hob_data(const void *hob_list, u32 *len,
|
|
||||||
const efi_guid_t *guid);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function retrieves FSP Non-volatile Storage HOB buffer and size.
|
* This function retrieves FSP Non-volatile Storage HOB buffer and size.
|
||||||
*
|
*
|
||||||
|
230
arch/x86/include/asm/hob.h
Normal file
230
arch/x86/include/asm/hob.h
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
/* SPDX-License-Identifier: Intel */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2013, Intel Corporation
|
||||||
|
* Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __HOB_H__
|
||||||
|
#define __HOB_H__
|
||||||
|
|
||||||
|
#include <efi.h>
|
||||||
|
#include <efi_loader.h>
|
||||||
|
|
||||||
|
/* Type of HOB Header */
|
||||||
|
#define HOB_TYPE_MEM_ALLOC 0x0002
|
||||||
|
#define HOB_TYPE_RES_DESC 0x0003
|
||||||
|
#define HOB_TYPE_GUID_EXT 0x0004
|
||||||
|
#define HOB_TYPE_UNUSED 0xFFFE
|
||||||
|
#define HOB_TYPE_EOH 0xFFFF
|
||||||
|
|
||||||
|
/* Value of ResourceType in HOB_RES_DESC */
|
||||||
|
#define RES_SYS_MEM 0x00000000
|
||||||
|
#define RES_MMAP_IO 0x00000001
|
||||||
|
#define RES_IO 0x00000002
|
||||||
|
#define RES_FW_DEVICE 0x00000003
|
||||||
|
#define RES_MMAP_IO_PORT 0x00000004
|
||||||
|
#define RES_MEM_RESERVED 0x00000005
|
||||||
|
#define RES_IO_RESERVED 0x00000006
|
||||||
|
#define RES_MAX_MEM_TYPE 0x00000007
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These types can be ORed together as needed.
|
||||||
|
*
|
||||||
|
* The first three enumerations describe settings
|
||||||
|
* The rest of the settings describe capabilities
|
||||||
|
*/
|
||||||
|
#define RES_ATTR_PRESENT 0x00000001
|
||||||
|
#define RES_ATTR_INITIALIZED 0x00000002
|
||||||
|
#define RES_ATTR_TESTED 0x00000004
|
||||||
|
#define RES_ATTR_SINGLE_BIT_ECC 0x00000008
|
||||||
|
#define RES_ATTR_MULTIPLE_BIT_ECC 0x00000010
|
||||||
|
#define RES_ATTR_ECC_RESERVED_1 0x00000020
|
||||||
|
#define RES_ATTR_ECC_RESERVED_2 0x00000040
|
||||||
|
#define RES_ATTR_READ_PROTECTED 0x00000080
|
||||||
|
#define RES_ATTR_WRITE_PROTECTED 0x00000100
|
||||||
|
#define RES_ATTR_EXECUTION_PROTECTED 0x00000200
|
||||||
|
#define RES_ATTR_UNCACHEABLE 0x00000400
|
||||||
|
#define RES_ATTR_WRITE_COMBINEABLE 0x00000800
|
||||||
|
#define RES_ATTR_WRITE_THROUGH_CACHEABLE 0x00001000
|
||||||
|
#define RES_ATTR_WRITE_BACK_CACHEABLE 0x00002000
|
||||||
|
#define RES_ATTR_16_BIT_IO 0x00004000
|
||||||
|
#define RES_ATTR_32_BIT_IO 0x00008000
|
||||||
|
#define RES_ATTR_64_BIT_IO 0x00010000
|
||||||
|
#define RES_ATTR_UNCACHED_EXPORTED 0x00020000
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Describes the format and size of the data inside the HOB.
|
||||||
|
* All HOBs must contain this generic HOB header.
|
||||||
|
*/
|
||||||
|
struct hob_header {
|
||||||
|
u16 type; /* HOB type */
|
||||||
|
u16 len; /* HOB length */
|
||||||
|
u32 reserved; /* always zero */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Describes all memory ranges used during the HOB producer phase that
|
||||||
|
* exist outside the HOB list. This HOB type describes how memory is used,
|
||||||
|
* not the physical attributes of memory.
|
||||||
|
*/
|
||||||
|
struct hob_mem_alloc {
|
||||||
|
struct hob_header hdr;
|
||||||
|
/*
|
||||||
|
* A GUID that defines the memory allocation region's type and purpose,
|
||||||
|
* as well as other fields within the memory allocation HOB. This GUID
|
||||||
|
* is used to define the additional data within the HOB that may be
|
||||||
|
* present for the memory allocation HOB. Type efi_guid_t is defined in
|
||||||
|
* InstallProtocolInterface() in the UEFI 2.0 specification.
|
||||||
|
*/
|
||||||
|
efi_guid_t name;
|
||||||
|
/*
|
||||||
|
* The base address of memory allocated by this HOB.
|
||||||
|
* Type phys_addr_t is defined in AllocatePages() in the UEFI 2.0
|
||||||
|
* specification.
|
||||||
|
*/
|
||||||
|
phys_addr_t mem_base;
|
||||||
|
/* The length in bytes of memory allocated by this HOB */
|
||||||
|
phys_size_t mem_len;
|
||||||
|
/*
|
||||||
|
* Defines the type of memory allocated by this HOB.
|
||||||
|
* The memory type definition follows the EFI_MEMORY_TYPE definition.
|
||||||
|
* Type EFI_MEMORY_TYPE is defined in AllocatePages() in the UEFI 2.0
|
||||||
|
* specification.
|
||||||
|
*/
|
||||||
|
enum efi_mem_type mem_type;
|
||||||
|
/* padding */
|
||||||
|
u8 reserved[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Describes the resource properties of all fixed, nonrelocatable resource
|
||||||
|
* ranges found on the processor host bus during the HOB producer phase.
|
||||||
|
*/
|
||||||
|
struct hob_res_desc {
|
||||||
|
struct hob_header hdr;
|
||||||
|
/*
|
||||||
|
* A GUID representing the owner of the resource. This GUID is
|
||||||
|
* used by HOB consumer phase components to correlate device
|
||||||
|
* ownership of a resource.
|
||||||
|
*/
|
||||||
|
efi_guid_t owner;
|
||||||
|
u32 type;
|
||||||
|
u32 attr;
|
||||||
|
/* The physical start address of the resource region */
|
||||||
|
phys_addr_t phys_start;
|
||||||
|
/* The number of bytes of the resource region */
|
||||||
|
phys_size_t len;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allows writers of executable content in the HOB producer phase to
|
||||||
|
* maintain and manage HOBs with specific GUID.
|
||||||
|
*/
|
||||||
|
struct hob_guid {
|
||||||
|
struct hob_header hdr;
|
||||||
|
/* A GUID that defines the contents of this HOB */
|
||||||
|
efi_guid_t name;
|
||||||
|
/* GUID specific data goes here */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_next_hob() - return a pointer to the next HOB in the HOB list
|
||||||
|
*
|
||||||
|
* This macro returns a pointer to HOB that follows the HOB specified by hob
|
||||||
|
* in the HOB List.
|
||||||
|
*
|
||||||
|
* @hdr: A pointer to a HOB.
|
||||||
|
*
|
||||||
|
* @return: A pointer to the next HOB in the HOB list.
|
||||||
|
*/
|
||||||
|
static inline const struct hob_header *get_next_hob(const struct hob_header
|
||||||
|
*hdr)
|
||||||
|
{
|
||||||
|
return (const struct hob_header *)((uintptr_t)hdr + hdr->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* end_of_hob() - determine if a HOB is the last HOB in the HOB list
|
||||||
|
*
|
||||||
|
* This macro determine if the HOB specified by hob is the last HOB in the
|
||||||
|
* HOB list. If hob is last HOB in the HOB list, then true is returned.
|
||||||
|
* Otherwise, false is returned.
|
||||||
|
*
|
||||||
|
* @hdr: A pointer to a HOB.
|
||||||
|
*
|
||||||
|
* @retval true: The HOB specified by hdr is the last HOB in the HOB list.
|
||||||
|
* @retval false: The HOB specified by hdr is not the last HOB in the HOB list.
|
||||||
|
*/
|
||||||
|
static inline bool end_of_hob(const struct hob_header *hdr)
|
||||||
|
{
|
||||||
|
return hdr->type == HOB_TYPE_EOH;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_guid_hob_data() - return a pointer to data buffer from a HOB of
|
||||||
|
* type HOB_TYPE_GUID_EXT
|
||||||
|
*
|
||||||
|
* This macro returns a pointer to the data buffer in a HOB specified by hob.
|
||||||
|
* hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
|
||||||
|
*
|
||||||
|
* @hdr: A pointer to a HOB.
|
||||||
|
*
|
||||||
|
* @return: A pointer to the data buffer in a HOB.
|
||||||
|
*/
|
||||||
|
static inline void *get_guid_hob_data(const struct hob_header *hdr)
|
||||||
|
{
|
||||||
|
return (void *)((uintptr_t)hdr + sizeof(struct hob_guid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_guid_hob_data_size() - return the size of the data buffer from a HOB
|
||||||
|
* of type HOB_TYPE_GUID_EXT
|
||||||
|
*
|
||||||
|
* This macro returns the size, in bytes, of the data buffer in a HOB
|
||||||
|
* specified by hob. hob is assumed to be a HOB of type HOB_TYPE_GUID_EXT.
|
||||||
|
*
|
||||||
|
* @hdr: A pointer to a HOB.
|
||||||
|
*
|
||||||
|
* @return: The size of the data buffer.
|
||||||
|
*/
|
||||||
|
static inline u16 get_guid_hob_data_size(const struct hob_header *hdr)
|
||||||
|
{
|
||||||
|
return hdr->len - sizeof(struct hob_guid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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);
|
||||||
|
|
||||||
|
#endif /* __HOB_H__ */
|
@@ -42,6 +42,7 @@ obj-y += tables.o
|
|||||||
ifndef CONFIG_SPL_BUILD
|
ifndef CONFIG_SPL_BUILD
|
||||||
obj-$(CONFIG_CMD_ZBOOT) += zimage.o
|
obj-$(CONFIG_CMD_ZBOOT) += zimage.o
|
||||||
endif
|
endif
|
||||||
|
obj-$(CONFIG_USE_HOB) += hob.o
|
||||||
obj-$(CONFIG_HAVE_FSP) += fsp/
|
obj-$(CONFIG_HAVE_FSP) += fsp/
|
||||||
|
|
||||||
ifdef CONFIG_SPL_BUILD
|
ifdef CONFIG_SPL_BUILD
|
||||||
|
@@ -344,74 +344,23 @@ u32 fsp_get_tseg_reserved_mem(const void *hob_list, u32 *len)
|
|||||||
return base;
|
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 efi_guid_t *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 (!guidcmp(guid, &guid_hob->name))
|
|
||||||
break;
|
|
||||||
hdr = get_next_hob(hdr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return hdr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *fsp_get_guid_hob_data(const void *hob_list, u32 *len,
|
|
||||||
const efi_guid_t *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)
|
void *fsp_get_nvs_data(const void *hob_list, u32 *len)
|
||||||
{
|
{
|
||||||
const efi_guid_t 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, &guid);
|
return hob_get_guid_hob_data(hob_list, len, &guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len)
|
void *fsp_get_bootloader_tmp_mem(const void *hob_list, u32 *len)
|
||||||
{
|
{
|
||||||
const efi_guid_t 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, &guid);
|
return hob_get_guid_hob_data(hob_list, len, &guid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *fsp_get_graphics_info(const void *hob_list, u32 *len)
|
void *fsp_get_graphics_info(const void *hob_list, u32 *len)
|
||||||
{
|
{
|
||||||
const efi_guid_t 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, &guid);
|
return hob_get_guid_hob_data(hob_list, len, &guid);
|
||||||
}
|
}
|
||||||
|
84
arch/x86/lib/hob.c
Normal file
84
arch/x86/lib/hob.c
Normal file
@@ -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);
|
||||||
|
}
|
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
obj-y += mtrr.o
|
obj-y += mtrr.o
|
||||||
obj-$(CONFIG_CMD_EXCEPTION) += exception.o
|
obj-$(CONFIG_CMD_EXCEPTION) += exception.o
|
||||||
|
obj-$(CONFIG_USE_HOB) += hob.o
|
||||||
obj-$(CONFIG_HAVE_FSP) += fsp.o
|
obj-$(CONFIG_HAVE_FSP) += fsp.o
|
||||||
|
@@ -9,21 +9,6 @@
|
|||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
static char *hob_type[] = {
|
|
||||||
"reserved",
|
|
||||||
"Hand-off",
|
|
||||||
"Mem Alloc",
|
|
||||||
"Res Desc",
|
|
||||||
"GUID Ext",
|
|
||||||
"FV",
|
|
||||||
"CPU",
|
|
||||||
"Mem Pool",
|
|
||||||
"reserved",
|
|
||||||
"FV2",
|
|
||||||
"Load PEIM",
|
|
||||||
"Capsule",
|
|
||||||
};
|
|
||||||
|
|
||||||
static int do_hdr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
static int do_hdr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
struct fsp_header *hdr = find_fsp_header();
|
struct fsp_header *hdr = find_fsp_header();
|
||||||
@@ -72,55 +57,8 @@ static int do_hdr(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int do_hob(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
||||||
{
|
|
||||||
const struct hob_header *hdr;
|
|
||||||
uint type;
|
|
||||||
char *desc;
|
|
||||||
int i = 0;
|
|
||||||
char uuid[UUID_STR_LEN + 1];
|
|
||||||
|
|
||||||
hdr = gd->arch.hob_list;
|
|
||||||
|
|
||||||
printf("HOB list address: 0x%08x\n\n", (unsigned int)hdr);
|
|
||||||
|
|
||||||
printf("# | Address | Type | Len | ");
|
|
||||||
printf("%42s\n", "GUID");
|
|
||||||
printf("---|----------|-----------|------|-");
|
|
||||||
printf("------------------------------------------\n");
|
|
||||||
while (!end_of_hob(hdr)) {
|
|
||||||
printf("%02x | %08x | ", i, (unsigned int)hdr);
|
|
||||||
type = hdr->type;
|
|
||||||
if (type == HOB_TYPE_UNUSED)
|
|
||||||
desc = "*Unused*";
|
|
||||||
else if (type == HOB_TYPE_EOH)
|
|
||||||
desc = "*EOH*";
|
|
||||||
else if (type >= 0 && type <= ARRAY_SIZE(hob_type))
|
|
||||||
desc = hob_type[type];
|
|
||||||
else
|
|
||||||
desc = "*Invalid*";
|
|
||||||
printf("%-9s | %04x | ", desc, hdr->len);
|
|
||||||
|
|
||||||
if (type == HOB_TYPE_MEM_ALLOC || type == HOB_TYPE_RES_DESC ||
|
|
||||||
type == HOB_TYPE_GUID_EXT) {
|
|
||||||
efi_guid_t *guid = (efi_guid_t *)(hdr + 1);
|
|
||||||
|
|
||||||
uuid_bin_to_str(guid->b, uuid, UUID_STR_FORMAT_GUID);
|
|
||||||
printf("%s", uuid);
|
|
||||||
} else {
|
|
||||||
printf("%42s", "Not Available");
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
hdr = get_next_hob(hdr);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static cmd_tbl_t fsp_commands[] = {
|
static cmd_tbl_t fsp_commands[] = {
|
||||||
U_BOOT_CMD_MKENT(hdr, 0, 1, do_hdr, "", ""),
|
U_BOOT_CMD_MKENT(hdr, 0, 1, do_hdr, "", ""),
|
||||||
U_BOOT_CMD_MKENT(hob, 0, 1, do_hob, "", ""),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int do_fsp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
static int do_fsp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
@@ -144,6 +82,5 @@ static int do_fsp(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|||||||
U_BOOT_CMD(
|
U_BOOT_CMD(
|
||||||
fsp, 2, 1, do_fsp,
|
fsp, 2, 1, do_fsp,
|
||||||
"Show Intel Firmware Support Package (FSP) related information",
|
"Show Intel Firmware Support Package (FSP) related information",
|
||||||
"hdr - Print FSP header information\n"
|
"hdr - Print FSP header information"
|
||||||
"fsp hob - Print FSP Hand-Off Block (HOB) information"
|
|
||||||
);
|
);
|
||||||
|
77
cmd/x86/hob.c
Normal file
77
cmd/x86/hob.c
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2014-2015, Bin Meng <bmeng.cn@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <common.h>
|
||||||
|
#include <command.h>
|
||||||
|
#include <efi.h>
|
||||||
|
#include <asm/hob.h>
|
||||||
|
|
||||||
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
static char *hob_type[] = {
|
||||||
|
"reserved",
|
||||||
|
"Hand-off",
|
||||||
|
"Mem Alloc",
|
||||||
|
"Res Desc",
|
||||||
|
"GUID Ext",
|
||||||
|
"FV",
|
||||||
|
"CPU",
|
||||||
|
"Mem Pool",
|
||||||
|
"reserved",
|
||||||
|
"FV2",
|
||||||
|
"Load PEIM",
|
||||||
|
"Capsule",
|
||||||
|
};
|
||||||
|
|
||||||
|
static int do_hob(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
|
{
|
||||||
|
const struct hob_header *hdr;
|
||||||
|
uint type;
|
||||||
|
char *desc;
|
||||||
|
int i = 0;
|
||||||
|
efi_guid_t *guid;
|
||||||
|
char uuid[UUID_STR_LEN + 1];
|
||||||
|
|
||||||
|
hdr = gd->arch.hob_list;
|
||||||
|
|
||||||
|
printf("HOB list address: 0x%08x\n\n", (unsigned int)hdr);
|
||||||
|
|
||||||
|
printf("# | Address | Type | Len | ");
|
||||||
|
printf("%36s\n", "GUID");
|
||||||
|
printf("---|----------|-----------|------|-");
|
||||||
|
printf("------------------------------------\n");
|
||||||
|
while (!end_of_hob(hdr)) {
|
||||||
|
printf("%02x | %08x | ", i, (unsigned int)hdr);
|
||||||
|
type = hdr->type;
|
||||||
|
if (type == HOB_TYPE_UNUSED)
|
||||||
|
desc = "*Unused*";
|
||||||
|
else if (type == HOB_TYPE_EOH)
|
||||||
|
desc = "*EOH*";
|
||||||
|
else if (type >= 0 && type <= ARRAY_SIZE(hob_type))
|
||||||
|
desc = hob_type[type];
|
||||||
|
else
|
||||||
|
desc = "*Invalid*";
|
||||||
|
printf("%-9s | %04x | ", desc, hdr->len);
|
||||||
|
|
||||||
|
if (type == HOB_TYPE_MEM_ALLOC || type == HOB_TYPE_RES_DESC ||
|
||||||
|
type == HOB_TYPE_GUID_EXT) {
|
||||||
|
guid = (efi_guid_t *)(hdr + 1);
|
||||||
|
uuid_bin_to_str(guid->b, uuid, UUID_STR_FORMAT_GUID);
|
||||||
|
printf("%s", uuid);
|
||||||
|
} else {
|
||||||
|
printf("%36s", "Not Available");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
hdr = get_next_hob(hdr);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
U_BOOT_CMD(hob, 1, 1, do_hob,
|
||||||
|
"Print Hand-Off Block (HOB) information",
|
||||||
|
""
|
||||||
|
);
|
Reference in New Issue
Block a user