blob: 74225edad295847d9b1e769741f3b4957842ad03 [file] [log] [blame]
Heinrich Schuchardt79d72022018-09-20 21:58:23 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Root node for system services
4 *
5 * Copyright (c) 2018 Heinrich Schuchardt
6 */
7
Heinrich Schuchardt955a3212025-01-16 20:26:59 +01008#define LOG_CATEGORY LOGC_EFI
9
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020010#include <malloc.h>
Heinrich Schuchardt2c1e2242020-12-13 10:30:24 +010011#include <efi_dt_fixup.h>
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020012#include <efi_loader.h>
13
14const efi_guid_t efi_u_boot_guid = U_BOOT_GUID;
15
AKASHI Takahiro0b275752019-04-16 13:24:20 +090016efi_handle_t efi_root = NULL;
17
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020018struct 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 */
31efi_status_t efi_root_node_register(void)
32{
Heinrich Schuchardt2e0a7902019-05-05 16:55:06 +020033 efi_status_t ret;
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020034 struct efi_root_dp *dp;
35
Heinrich Schuchardt22b9fb92019-04-12 07:14:43 +020036 /* Create device path protocol */
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020037 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
Heinrich Schuchardt22b9fb92019-04-12 07:14:43 +020052 /* Create root node and install protocols */
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030053 ret = efi_install_multiple_protocol_interfaces
54 (&efi_root,
55 /* Device path protocol */
56 &efi_guid_device_path, dp,
Heinrich Schuchardt3db35912019-05-11 09:53:33 +020057#if CONFIG_IS_ENABLED(EFI_DEVICE_PATH_TO_TEXT)
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030058 /* Device path to text protocol */
59 &efi_guid_device_path_to_text_protocol,
60 &efi_device_path_to_text,
Heinrich Schuchardt3db35912019-05-11 09:53:33 +020061#endif
Simon Glass3e26ee42023-02-05 15:39:41 -070062#if IS_ENABLED(CONFIG_EFI_DEVICE_PATH_UTIL)
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030063 /* Device path utilities protocol */
64 &efi_guid_device_path_utilities_protocol,
65 &efi_device_path_utilities,
Heinrich Schuchardt1cb1a9d2021-01-16 09:44:25 +010066#endif
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030067#if CONFIG_IS_ENABLED(EFI_DT_FIXUP)
68 /* Device-tree fix-up protocol */
69 &efi_guid_dt_fixup_protocol,
70 &efi_dt_fixup_prot,
Heinrich Schuchardt2c1e2242020-12-13 10:30:24 +010071#endif
Simon Glass8f438112023-02-05 15:39:47 -070072#if IS_ENABLED(CONFIG_EFI_UNICODE_COLLATION_PROTOCOL2)
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030073 &efi_guid_unicode_collation_protocol2,
74 &efi_unicode_collation_protocol2,
Heinrich Schuchardt532fec72019-05-08 23:24:26 +020075#endif
Simon Glass6b52ab52023-02-05 15:39:43 -070076#if IS_ENABLED(CONFIG_EFI_LOADER_HII)
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030077 /* 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,
Heinrich Schuchardt926e6962019-04-07 23:53:53 +020083#endif
Ilias Apalodimas8ac0ebe2022-10-06 16:08:46 +030084 NULL);
Heinrich Schuchardt2e0a7902019-05-05 16:55:06 +020085 efi_root->type = EFI_OBJECT_TYPE_U_BOOT_FIRMWARE;
86 return ret;
Heinrich Schuchardt79d72022018-09-20 21:58:23 +020087}