1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  *  Menu-driven UEFI Variable maintenance
4  *
5  *  Copyright (c) 2022 Masahisa Kojima, Linaro Limited
6  */
7 
8 #ifndef _EFI_CONFIG_H
9 #define _EFI_CONFIG_H
10 
11 #include <efi_loader.h>
12 #include <menu.h>
13 
14 #define EFICONFIG_ENTRY_NUM_MAX (INT_MAX - 1)
15 #define EFICONFIG_VOLUME_PATH_MAX 512
16 #define EFICONFIG_FILE_PATH_MAX 512
17 #define EFICONFIG_FILE_PATH_BUF_SIZE (EFICONFIG_FILE_PATH_MAX * sizeof(u16))
18 
19 extern const char *eficonfig_menu_desc;
20 typedef efi_status_t (*eficonfig_entry_func)(void *data);
21 
22 /**
23  * struct eficonfig_entry - menu entry structure
24  *
25  * @num:	menu entry index
26  * @title:	title of entry
27  * @key:	unique key
28  * @efi_menu:	pointer to the menu structure
29  * @func:	callback function to be called when this entry is selected
30  * @data:	data to be passed to the callback function, caller must free() this pointer
31  * @list:	list structure
32  */
33 struct eficonfig_entry {
34 	u32 num;
35 	char *title;
36 	char key[3];
37 	struct efimenu *efi_menu;
38 	eficonfig_entry_func func;
39 	void *data;
40 	struct list_head list;
41 };
42 
43 /**
44  * struct efimenu - efi menu structure
45  *
46  * @delay:		delay for autoboot
47  * @active:		active menu entry index
48  * @count:		total count of menu entry
49  * @menu_header:	menu header string
50  * @menu_desc:		menu description string
51  * @list:		menu entry list structure
52  * @start:		top menu index to draw
53  * @end:		bottom menu index to draw
54  */
55 struct efimenu {
56 	int delay;
57 	int active;
58 	int count;
59 	char *menu_header;
60 	const char *menu_desc;
61 	struct list_head list;
62 	int start;
63 	int end;
64 };
65 
66 /**
67  * struct eficonfig_item - structure to construct eficonfig_entry
68  *
69  * @title:	title of entry
70  * @func:	callback function to be called when this entry is selected
71  * @data:	data to be passed to the callback function
72  */
73 struct eficonfig_item {
74 	char *title;
75 	eficonfig_entry_func func;
76 	void *data;
77 };
78 
79 /**
80  * struct eficonfig_select_file_info - structure to be used for file selection
81  *
82  * @current_volume:	pointer to the efi_simple_file_system_protocol
83  * @dp_volume:		pointer to device path of the selected device
84  * @current_path:	pointer to the selected file path string
85  * @uri:		URI for HTTP Boot
86  * @filepath_list:	list_head structure for file path list
87  * @file_selectred:	flag indicates file selecting status
88  */
89 struct eficonfig_select_file_info {
90 	struct efi_simple_file_system_protocol *current_volume;
91 	struct efi_device_path *dp_volume;
92 	u16 *current_path;
93 	u16 *uri;
94 	struct list_head filepath_list;
95 	bool file_selected;
96 };
97 
98 void eficonfig_print_msg(char *msg);
99 void eficonfig_print_entry(void *data);
100 void eficonfig_display_statusline(struct menu *m);
101 char *eficonfig_choice_entry(void *data);
102 void eficonfig_destroy(struct efimenu *efi_menu);
103 efi_status_t eficonfig_process_quit(void *data);
104 efi_status_t eficonfig_process_common(struct efimenu *efi_menu,
105 				      char *menu_header, const char *menu_desc,
106 				      void (*display_statusline)(struct menu *),
107 				      void (*item_data_print)(void *),
108 				      char *(*item_choice)(void *));
109 efi_status_t eficonfig_process_select_file(void *data);
110 efi_status_t eficonfig_append_menu_entry(struct efimenu *efi_menu,
111 					 char *title, eficonfig_entry_func func,
112 					 void *data);
113 efi_status_t eficonfig_append_quit_entry(struct efimenu *efi_menu);
114 struct efi_device_path *eficonfig_create_device_path(struct efi_device_path *dp_volume,
115 						     u16 *current_path);
116 void *eficonfig_create_fixed_menu(const struct eficonfig_item *items, int count);
117 #ifdef CONFIG_EFI_SECURE_BOOT
118 efi_status_t eficonfig_process_secure_boot_config(void *data);
119 #endif
120 
121 #endif
122