blob: 6e9d5fe5b7af425e54c03e2ec2c08897bd4915d6 [file] [log] [blame]
AKASHI Takahiro056b45b2018-12-30 15:16:55 +01001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * EFI setup code
4 *
5 * Copyright (c) 2016-2018 Alexander Graf et al.
6 */
7
8#include <common.h>
9#include <efi_loader.h>
10
11#define OBJ_LIST_NOT_INITIALIZED 1
12
Heinrich Schuchardt734d3252019-04-05 02:45:21 +020013/* Language code for American English according to RFC 4646 */
14#define EN_US L"en-US"
15
AKASHI Takahiro056b45b2018-12-30 15:16:55 +010016static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
17
18/* Initialize and populate EFI object list */
19efi_status_t efi_init_obj_list(void)
20{
21 efi_status_t ret = EFI_SUCCESS;
22
23 /*
Heinrich Schuchardt734d3252019-04-05 02:45:21 +020024 * Variable PlatformLang defines the language that the machine has been
25 * configured for.
26 */
27 ret = EFI_CALL(efi_set_variable(L"PlatformLang",
28 &efi_global_variable_guid,
29 EFI_VARIABLE_BOOTSERVICE_ACCESS |
30 EFI_VARIABLE_RUNTIME_ACCESS,
31 sizeof(EN_US), EN_US));
32 if (ret != EFI_SUCCESS)
33 goto out;
34
35 /*
36 * Variable PlatformLangCodes defines the language codes that the
37 * machine can support.
38 */
39 ret = EFI_CALL(efi_set_variable(L"PlatformLangCodes",
40 &efi_global_variable_guid,
41 EFI_VARIABLE_BOOTSERVICE_ACCESS |
42 EFI_VARIABLE_RUNTIME_ACCESS,
43 sizeof(EN_US), EN_US));
44 if (ret != EFI_SUCCESS)
45 goto out;
46
AKASHI Takahiro056b45b2018-12-30 15:16:55 +010047 /* Initialize once only */
48 if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
49 return efi_obj_list_initialized;
50
51 /* Initialize system table */
52 ret = efi_initialize_system_table();
53 if (ret != EFI_SUCCESS)
54 goto out;
55
56 /* Initialize root node */
57 ret = efi_root_node_register();
58 if (ret != EFI_SUCCESS)
59 goto out;
60
61 /* Initialize EFI driver uclass */
62 ret = efi_driver_init();
63 if (ret != EFI_SUCCESS)
64 goto out;
65
66 ret = efi_console_register();
67 if (ret != EFI_SUCCESS)
68 goto out;
69#ifdef CONFIG_PARTITIONS
70 ret = efi_disk_register();
71 if (ret != EFI_SUCCESS)
72 goto out;
73#endif
74#if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO)
75 ret = efi_gop_register();
76 if (ret != EFI_SUCCESS)
77 goto out;
78#endif
79#ifdef CONFIG_NET
80 ret = efi_net_register();
81 if (ret != EFI_SUCCESS)
82 goto out;
83#endif
84#ifdef CONFIG_GENERATE_ACPI_TABLE
85 ret = efi_acpi_register();
86 if (ret != EFI_SUCCESS)
87 goto out;
88#endif
89#ifdef CONFIG_GENERATE_SMBIOS_TABLE
90 ret = efi_smbios_register();
91 if (ret != EFI_SUCCESS)
92 goto out;
93#endif
94 ret = efi_watchdog_register();
95 if (ret != EFI_SUCCESS)
96 goto out;
97
98 /* Initialize EFI runtime services */
99 ret = efi_reset_system_init();
100 if (ret != EFI_SUCCESS)
101 goto out;
102
103out:
104 efi_obj_list_initialized = ret;
105 return ret;
106}