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