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