mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
Pull request for UEFI sub-system for efi-2020-04-rc4 (4)
This series fixes several bugs: * consider the /reserved-memory node in the device tree * consider memory reservations created in ft_board_setup() * correct output of 'efidebug memmap' on the sandbox * correct the definition of efi_capsule_header() Furthermore some definitions needed for future patches are added to header files. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEbcT5xx8ppvoGt20zxIHbvCwFGsQFAl5x6bIACgkQxIHbvCwF GsSTYQ//fyixmgA7x6uD3222BAq000Y5bQ2jkt5Pd4dlg4Nv3FdNvElfSTOt9whT CCAGKMKafB7jkqXRohlPAmO4JG9bZmpJD26Wd1J+XWwax5q5ngFYFbWYZyymb4OQ xD8pxHkwwrF6D0VrVCbk3CMn+7sGIaGxm+0zZXDPQ1ZS2zbEkJlWGn6dGXy00yJY DWc+9P4e+bPGCKLU2xzADpY9seCg52OQ+C66aCj/f2qeMhOykgWG1B/GhvryljMl rbueOClQEbPdB6mAm7xyvOEDQ1K5Iy1JNf/4v5kL07jDiO/7rWP6ptXflaPIJP9y qhQ7Ozige/VpTUHauv9BE2oREPaSArJNhetyV4tWcNtS2+9vk+JLHoGWNK/8LtrE fTwL8tUyvTDA2YPQKy0TTJ0swLV3Y+Iwv7n51SxbAR7uMeRT9acs9ljciQtF5CQh S3i5ZN5+45utS6Gv8kVAwYsbFAs1CIuRAVleCu9OcnfWj61X5gvtkgNlbG5P1gGS WHsteTxB4gCQIyS+n0H9MhJFLzYFvj0WQWmJGULmEqgnWO06+gUsTLli9yt/ytoS a03VLMx/EZn2W48366OgH/dqrzVFT17IyrAehz08Uu7mk127OGggSJm5j2JRHqUf aBDn8K8+rf0zdaFtLDh8DagPX2fV97cPvmMQ/x2r+Ahqoc2rWhI= =zB6g -----END PGP SIGNATURE----- Merge tag 'efi-2020-04-rc4-4' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi Pull request for UEFI sub-system for efi-2020-04-rc4 (4) This series fixes several bugs: * consider the /reserved-memory node in the device tree * consider memory reservations created in ft_board_setup() * correct output of 'efidebug memmap' on the sandbox * correct the definition of efi_capsule_header() Furthermore some definitions needed for future patches are added to header files.
This commit is contained in:
commit
40e82bb97c
5 changed files with 102 additions and 24 deletions
|
@ -149,6 +149,20 @@ done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void efi_reserve_memory(u64 addr, u64 size)
|
||||||
|
{
|
||||||
|
u64 pages;
|
||||||
|
|
||||||
|
/* Convert from sandbox address space. */
|
||||||
|
addr = (uintptr_t)map_sysmem(addr, 0);
|
||||||
|
pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
|
||||||
|
addr &= ~EFI_PAGE_MASK;
|
||||||
|
if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
||||||
|
false) != EFI_SUCCESS)
|
||||||
|
printf("Reserved memory mapping failed addr %llx size %llx\n",
|
||||||
|
addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
|
* efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
|
||||||
*
|
*
|
||||||
|
@ -161,7 +175,8 @@ done:
|
||||||
static void efi_carve_out_dt_rsv(void *fdt)
|
static void efi_carve_out_dt_rsv(void *fdt)
|
||||||
{
|
{
|
||||||
int nr_rsv, i;
|
int nr_rsv, i;
|
||||||
uint64_t addr, size, pages;
|
u64 addr, size;
|
||||||
|
int nodeoffset, subnode;
|
||||||
|
|
||||||
nr_rsv = fdt_num_mem_rsv(fdt);
|
nr_rsv = fdt_num_mem_rsv(fdt);
|
||||||
|
|
||||||
|
@ -169,15 +184,25 @@ static void efi_carve_out_dt_rsv(void *fdt)
|
||||||
for (i = 0; i < nr_rsv; i++) {
|
for (i = 0; i < nr_rsv; i++) {
|
||||||
if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
|
if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
efi_reserve_memory(addr, size);
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert from sandbox address space. */
|
/* process reserved-memory */
|
||||||
addr = (uintptr_t)map_sysmem(addr, 0);
|
nodeoffset = fdt_subnode_offset(fdt, 0, "reserved-memory");
|
||||||
|
if (nodeoffset >= 0) {
|
||||||
pages = efi_size_in_pages(size + (addr & EFI_PAGE_MASK));
|
subnode = fdt_first_subnode(fdt, nodeoffset);
|
||||||
addr &= ~EFI_PAGE_MASK;
|
while (subnode >= 0) {
|
||||||
if (efi_add_memory_map(addr, pages, EFI_RESERVED_MEMORY_TYPE,
|
/* check if this subnode has a reg property */
|
||||||
false) != EFI_SUCCESS)
|
addr = fdtdec_get_addr_size(fdt, subnode, "reg",
|
||||||
printf("FDT memrsv map %d: Failed to add to map\n", i);
|
(fdt_size_t *)&size);
|
||||||
|
/*
|
||||||
|
* The /reserved-memory node may have children with
|
||||||
|
* a size instead of a reg property.
|
||||||
|
*/
|
||||||
|
if (addr != FDT_ADDR_T_NONE)
|
||||||
|
efi_reserve_memory(addr, size);
|
||||||
|
subnode = fdt_next_subnode(fdt, subnode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,9 +288,6 @@ efi_status_t efi_install_fdt(void *fdt)
|
||||||
return EFI_LOAD_ERROR;
|
return EFI_LOAD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create memory reservations as indicated by the device tree */
|
|
||||||
efi_carve_out_dt_rsv(fdt);
|
|
||||||
|
|
||||||
/* Prepare device tree for payload */
|
/* Prepare device tree for payload */
|
||||||
ret = copy_fdt(&fdt);
|
ret = copy_fdt(&fdt);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -278,6 +300,9 @@ efi_status_t efi_install_fdt(void *fdt)
|
||||||
return EFI_LOAD_ERROR;
|
return EFI_LOAD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create memory reservations as indicated by the device tree */
|
||||||
|
efi_carve_out_dt_rsv(fdt);
|
||||||
|
|
||||||
/* Install device tree as UEFI table */
|
/* Install device tree as UEFI table */
|
||||||
ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
|
ret = efi_install_configuration_table(&efi_guid_fdt, fdt);
|
||||||
if (ret != EFI_SUCCESS) {
|
if (ret != EFI_SUCCESS) {
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include <exports.h>
|
#include <exports.h>
|
||||||
#include <hexdump.h>
|
#include <hexdump.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <mapmem.h>
|
||||||
#include <search.h>
|
#include <search.h>
|
||||||
#include <linux/ctype.h>
|
#include <linux/ctype.h>
|
||||||
|
|
||||||
|
@ -488,9 +489,10 @@ static int do_efi_show_memmap(cmd_tbl_t *cmdtp, int flag,
|
||||||
|
|
||||||
printf("%-16s %.*llx-%.*llx", type,
|
printf("%-16s %.*llx-%.*llx", type,
|
||||||
EFI_PHYS_ADDR_WIDTH,
|
EFI_PHYS_ADDR_WIDTH,
|
||||||
map->physical_start,
|
(u64)map_to_sysmem((void *)map->physical_start),
|
||||||
EFI_PHYS_ADDR_WIDTH,
|
EFI_PHYS_ADDR_WIDTH,
|
||||||
map->physical_start + map->num_pages * EFI_PAGE_SIZE);
|
(u64)map_to_sysmem((void *)map->physical_start +
|
||||||
|
map->num_pages * EFI_PAGE_SIZE));
|
||||||
|
|
||||||
print_memory_attributes(map->attribute);
|
print_memory_attributes(map->attribute);
|
||||||
putc('\n');
|
putc('\n');
|
||||||
|
|
|
@ -57,6 +57,16 @@ typedef u16 efi_form_id_t;
|
||||||
|
|
||||||
struct efi_event;
|
struct efi_event;
|
||||||
|
|
||||||
|
/* OsIndicationsSupported flags */
|
||||||
|
#define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001
|
||||||
|
#define EFI_OS_INDICATIONS_TIMESTAMP_REVOCATION 0x0000000000000002
|
||||||
|
#define EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED 0x0000000000000004
|
||||||
|
#define EFI_OS_INDICATIONS_FMP_CAPSULE_SUPPORTED 0x0000000000000008
|
||||||
|
#define EFI_OS_INDICATIONS_CAPSULE_RESULT_VAR_SUPPORTED 0x0000000000000010
|
||||||
|
#define EFI_OS_INDICATIONS_START_OS_RECOVERY 0x0000000000000020
|
||||||
|
#define EFI_OS_INDICATIONS_START_PLATFORM_RECOVERY 0x0000000000000040
|
||||||
|
#define EFI_OS_INDICATIONS_JSON_CONFIG_DATA_REFRESH 0x0000000000000080
|
||||||
|
|
||||||
/* EFI Boot Services table */
|
/* EFI Boot Services table */
|
||||||
#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
|
#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
|
||||||
struct efi_boot_services {
|
struct efi_boot_services {
|
||||||
|
@ -207,11 +217,11 @@ enum efi_reset_type {
|
||||||
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
|
#define CAPSULE_FLAGS_INITIATE_RESET 0x00040000
|
||||||
|
|
||||||
struct efi_capsule_header {
|
struct efi_capsule_header {
|
||||||
efi_guid_t *capsule_guid;
|
efi_guid_t capsule_guid;
|
||||||
u32 header_size;
|
u32 header_size;
|
||||||
u32 flags;
|
u32 flags;
|
||||||
u32 capsule_image_size;
|
u32 capsule_image_size;
|
||||||
};
|
} __packed;
|
||||||
|
|
||||||
#define EFI_RT_SUPPORTED_GET_TIME 0x0001
|
#define EFI_RT_SUPPORTED_GET_TIME 0x0001
|
||||||
#define EFI_RT_SUPPORTED_SET_TIME 0x0002
|
#define EFI_RT_SUPPORTED_SET_TIME 0x0002
|
||||||
|
@ -1645,4 +1655,31 @@ struct efi_load_file_protocol {
|
||||||
#define LOAD_OPTION_CATEGORY_BOOT 0x00000000
|
#define LOAD_OPTION_CATEGORY_BOOT 0x00000000
|
||||||
#define LOAD_OPTION_CATEGORY_APP 0x00000100
|
#define LOAD_OPTION_CATEGORY_APP 0x00000100
|
||||||
|
|
||||||
|
/*
|
||||||
|
* System Resource Table
|
||||||
|
*/
|
||||||
|
/* Firmware Type Definitions */
|
||||||
|
#define ESRT_FW_TYPE_UNKNOWN 0x00000000
|
||||||
|
#define ESRT_FW_TYPE_SYSTEMFIRMWARE 0x00000001
|
||||||
|
#define ESRT_FW_TYPE_DEVICEFIRMWARE 0x00000002
|
||||||
|
#define ESRT_FW_TYPE_UEFIDRIVER 0x00000003
|
||||||
|
|
||||||
|
/* Last Attempt Status Values */
|
||||||
|
#define LAST_ATTEMPT_STATUS_SUCCESS 0x00000000
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL 0x00000001
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_INSUFFICIENT_RESOURCES 0x00000002
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_INCORRECT_VERSION 0x00000003
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_INVALID_FORMAT 0x00000004
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_AUTH_ERROR 0x00000005
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_AC 0x00000006
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_PWR_EVT_BATT 0x00000007
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_UNSATISFIED_DEPENDENCIES 0x00000008
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The LastAttemptStatus values of 0x1000 - 0x4000 are reserved for vendor
|
||||||
|
* usage.
|
||||||
|
*/
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MIN 0x00001000
|
||||||
|
#define LAST_ATTEMPT_STATUS_ERROR_UNSUCCESSFUL_VENDOR_RANGE_MAX 0x00004000
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -457,6 +457,20 @@ efi_status_t efi_remove_all_protocols(const efi_handle_t handle);
|
||||||
/* Install multiple protocol interfaces */
|
/* Install multiple protocol interfaces */
|
||||||
efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
|
efi_status_t EFIAPI efi_install_multiple_protocol_interfaces
|
||||||
(efi_handle_t *handle, ...);
|
(efi_handle_t *handle, ...);
|
||||||
|
/* Get handles that support a given protocol */
|
||||||
|
efi_status_t EFIAPI efi_locate_handle_buffer(
|
||||||
|
enum efi_locate_search_type search_type,
|
||||||
|
const efi_guid_t *protocol, void *search_key,
|
||||||
|
efi_uintn_t *no_handles, efi_handle_t **buffer);
|
||||||
|
/* Close an previously opened protocol interface */
|
||||||
|
efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
|
||||||
|
const efi_guid_t *protocol,
|
||||||
|
efi_handle_t agent_handle,
|
||||||
|
efi_handle_t controller_handle);
|
||||||
|
/* Open a protocol interface */
|
||||||
|
efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
|
||||||
|
const efi_guid_t *protocol,
|
||||||
|
void **protocol_interface);
|
||||||
/* Call this to create an event */
|
/* Call this to create an event */
|
||||||
efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
|
efi_status_t efi_create_event(uint32_t type, efi_uintn_t notify_tpl,
|
||||||
void (EFIAPI *notify_function) (
|
void (EFIAPI *notify_function) (
|
||||||
|
|
|
@ -2106,10 +2106,10 @@ static efi_status_t EFIAPI efi_set_watchdog_timer(unsigned long timeout,
|
||||||
*
|
*
|
||||||
* Return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
|
efi_status_t EFIAPI efi_close_protocol(efi_handle_t handle,
|
||||||
const efi_guid_t *protocol,
|
const efi_guid_t *protocol,
|
||||||
efi_handle_t agent_handle,
|
efi_handle_t agent_handle,
|
||||||
efi_handle_t controller_handle)
|
efi_handle_t controller_handle)
|
||||||
{
|
{
|
||||||
struct efi_handler *handler;
|
struct efi_handler *handler;
|
||||||
struct efi_open_protocol_info_item *item;
|
struct efi_open_protocol_info_item *item;
|
||||||
|
@ -2282,7 +2282,7 @@ static efi_status_t EFIAPI efi_protocols_per_handle(
|
||||||
*
|
*
|
||||||
* Return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static efi_status_t EFIAPI efi_locate_handle_buffer(
|
efi_status_t EFIAPI efi_locate_handle_buffer(
|
||||||
enum efi_locate_search_type search_type,
|
enum efi_locate_search_type search_type,
|
||||||
const efi_guid_t *protocol, void *search_key,
|
const efi_guid_t *protocol, void *search_key,
|
||||||
efi_uintn_t *no_handles, efi_handle_t **buffer)
|
efi_uintn_t *no_handles, efi_handle_t **buffer)
|
||||||
|
@ -3182,9 +3182,9 @@ out:
|
||||||
*
|
*
|
||||||
* Return: status code
|
* Return: status code
|
||||||
*/
|
*/
|
||||||
static efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
|
efi_status_t EFIAPI efi_handle_protocol(efi_handle_t handle,
|
||||||
const efi_guid_t *protocol,
|
const efi_guid_t *protocol,
|
||||||
void **protocol_interface)
|
void **protocol_interface)
|
||||||
{
|
{
|
||||||
return efi_open_protocol(handle, protocol, protocol_interface, efi_root,
|
return efi_open_protocol(handle, protocol, protocol_interface, efi_root,
|
||||||
NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL);
|
||||||
|
|
Loading…
Add table
Reference in a new issue