1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Root node for system services 4 * 5 * Copyright (c) 2018 Heinrich Schuchardt 6 */ 7 8#include <malloc.h> 9#include <efi_dt_fixup.h> 10#include <efi_loader.h> 11 12const efi_guid_t efi_u_boot_guid = U_BOOT_GUID; 13 14efi_handle_t efi_root = NULL; 15 16struct efi_root_dp { 17 struct efi_device_path_vendor vendor; 18 struct efi_device_path end; 19} __packed; 20 21/** 22 * efi_root_node_register() - create root node 23 * 24 * Create the root node on which we install all protocols that are 25 * not related to a loaded image or a driver. 26 * 27 * Return: status code 28 */ 29efi_status_t efi_root_node_register(void) 30{ 31 efi_status_t ret; 32 struct efi_root_dp *dp; 33 34 /* Create device path protocol */ 35 dp = calloc(1, sizeof(*dp)); 36 if (!dp) 37 return EFI_OUT_OF_RESOURCES; 38 39 /* Fill vendor node */ 40 dp->vendor.dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE; 41 dp->vendor.dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR; 42 dp->vendor.dp.length = sizeof(struct efi_device_path_vendor); 43 dp->vendor.guid = efi_u_boot_guid; 44 45 /* Fill end node */ 46 dp->end.type = DEVICE_PATH_TYPE_END; 47 dp->end.sub_type = DEVICE_PATH_SUB_TYPE_END; 48 dp->end.length = sizeof(struct efi_device_path); 49 50 /* Create root node and install protocols */ 51 ret = efi_install_multiple_protocol_interfaces 52 (&efi_root, 53 /* Device path protocol */ 54 &efi_guid_device_path, dp, 55#if CONFIG_IS_ENABLED(EFI_DEVICE_PATH_TO_TEXT) 56 /* Device path to text protocol */ 57 &efi_guid_device_path_to_text_protocol, 58 &efi_device_path_to_text, 59#endif 60#if IS_ENABLED(CONFIG_EFI_DEVICE_PATH_UTIL) 61 /* Device path utilities protocol */ 62 &efi_guid_device_path_utilities_protocol, 63 &efi_device_path_utilities, 64#endif 65#if CONFIG_IS_ENABLED(EFI_DT_FIXUP) 66 /* Device-tree fix-up protocol */ 67 &efi_guid_dt_fixup_protocol, 68 &efi_dt_fixup_prot, 69#endif 70#if IS_ENABLED(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2) 71 &efi_guid_unicode_collation_protocol2, 72 &efi_unicode_collation_protocol2, 73#endif 74#if IS_ENABLED(CONFIG_EFI_LOADER_HII) 75 /* HII string protocol */ 76 &efi_guid_hii_string_protocol, 77 &efi_hii_string, 78 /* HII database protocol */ 79 &efi_guid_hii_database_protocol, 80 &efi_hii_database, 81#endif 82 NULL); 83 efi_root->type = EFI_OBJECT_TYPE_U_BOOT_FIRMWARE; 84 return ret; 85} 86