| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Root node for system services | |
| * | |
| * Copyright (c) 2018 Heinrich Schuchardt | |
| */ | |
| #define LOG_CATEGORY LOGC_EFI | |
| #include <malloc.h> | |
| #include <efi_dt_fixup.h> | |
| #include <efi_loader.h> | |
| const efi_guid_t efi_u_boot_guid = U_BOOT_GUID; | |
| efi_handle_t efi_root = NULL; | |
| struct efi_root_dp { | |
| struct efi_device_path_vendor vendor; | |
| struct efi_device_path end; | |
| } __packed; | |
| /** | |
| * efi_root_node_register() - create root node | |
| * | |
| * Create the root node on which we install all protocols that are | |
| * not related to a loaded image or a driver. | |
| * | |
| * Return: status code | |
| */ | |
| efi_status_t efi_root_node_register(void) | |
| { | |
| efi_status_t ret; | |
| struct efi_root_dp *dp; | |
| /* Create device path protocol */ | |
| dp = calloc(1, sizeof(*dp)); | |
| if (!dp) | |
| return EFI_OUT_OF_RESOURCES; | |
| /* Fill vendor node */ | |
| dp->vendor.dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE; | |
| dp->vendor.dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR; | |
| dp->vendor.dp.length = sizeof(struct efi_device_path_vendor); | |
| dp->vendor.guid = efi_u_boot_guid; | |
| /* Fill end node */ | |
| dp->end.type = DEVICE_PATH_TYPE_END; | |
| dp->end.sub_type = DEVICE_PATH_SUB_TYPE_END; | |
| dp->end.length = sizeof(struct efi_device_path); | |
| /* Create root node and install protocols */ | |
| ret = efi_install_multiple_protocol_interfaces | |
| (&efi_root, | |
| /* Device path protocol */ | |
| &efi_guid_device_path, dp, | |
| #if CONFIG_IS_ENABLED(EFI_DEVICE_PATH_TO_TEXT) | |
| /* Device path to text protocol */ | |
| &efi_guid_device_path_to_text_protocol, | |
| &efi_device_path_to_text, | |
| #endif | |
| #if IS_ENABLED(CONFIG_EFI_DEVICE_PATH_UTIL) | |
| /* Device path utilities protocol */ | |
| &efi_guid_device_path_utilities_protocol, | |
| &efi_device_path_utilities, | |
| #endif | |
| #if CONFIG_IS_ENABLED(EFI_DT_FIXUP) | |
| /* Device-tree fix-up protocol */ | |
| &efi_guid_dt_fixup_protocol, | |
| &efi_dt_fixup_prot, | |
| #endif | |
| #if IS_ENABLED(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) | |
| &efi_guid_unicode_collation_protocol2, | |
| &efi_unicode_collation_protocol2, | |
| #endif | |
| #if IS_ENABLED(CONFIG_EFI_LOADER_HII) | |
| /* HII string protocol */ | |
| &efi_guid_hii_string_protocol, | |
| &efi_hii_string, | |
| /* HII database protocol */ | |
| &efi_guid_hii_database_protocol, | |
| &efi_hii_database, | |
| /* EFI HII Configuration Routing Protocol */ | |
| &efi_guid_hii_config_routing_protocol, | |
| &efi_hii_config_routing, | |
| #endif | |
| NULL); | |
| efi_root->type = EFI_OBJECT_TYPE_U_BOOT_FIRMWARE; | |
| return ret; | |
| } |