1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | |
3 | #ifndef _THINK_LMI_H_ |
4 | #define _THINK_LMI_H_ |
5 | |
6 | #include <linux/types.h> |
7 | |
8 | #define TLMI_SETTINGS_COUNT 256 |
9 | #define TLMI_SETTINGS_MAXLEN 512 |
10 | #define TLMI_PWD_BUFSIZE 129 |
11 | #define TLMI_LANG_MAXLEN 4 |
12 | #define TLMI_INDEX_MAX 32 |
13 | |
14 | /* Possible error values */ |
15 | struct tlmi_err_codes { |
16 | const char *err_str; |
17 | int err_code; |
18 | }; |
19 | |
20 | enum encoding_option { |
21 | TLMI_ENCODING_ASCII, |
22 | TLMI_ENCODING_SCANCODE, |
23 | }; |
24 | |
25 | enum level_option { |
26 | TLMI_LEVEL_USER, |
27 | TLMI_LEVEL_MASTER, |
28 | }; |
29 | |
30 | /* |
31 | * There are a limit on the number of WMI operations you can do if you use |
32 | * the default implementation of saving on every set. This is due to a |
33 | * limitation in EFI variable space used. |
34 | * Have a 'bulk save' mode where you can manually trigger the save, and can |
35 | * therefore set unlimited variables - for users that need it. |
36 | */ |
37 | enum save_mode { |
38 | TLMI_SAVE_SINGLE, |
39 | TLMI_SAVE_BULK, |
40 | TLMI_SAVE_SAVE, |
41 | }; |
42 | |
43 | /* password configuration details */ |
44 | struct tlmi_pwdcfg_core { |
45 | uint32_t password_mode; |
46 | uint32_t password_state; |
47 | uint32_t min_length; |
48 | uint32_t max_length; |
49 | uint32_t supported_encodings; |
50 | uint32_t supported_keyboard; |
51 | }; |
52 | |
53 | struct tlmi_pwdcfg_ext { |
54 | uint32_t hdd_user_password; |
55 | uint32_t hdd_master_password; |
56 | uint32_t nvme_user_password; |
57 | uint32_t nvme_master_password; |
58 | }; |
59 | |
60 | struct tlmi_pwdcfg { |
61 | struct tlmi_pwdcfg_core core; |
62 | struct tlmi_pwdcfg_ext ext; |
63 | }; |
64 | |
65 | /* password setting details */ |
66 | struct tlmi_pwd_setting { |
67 | struct kobject kobj; |
68 | bool valid; |
69 | char password[TLMI_PWD_BUFSIZE]; |
70 | const char *pwd_type; |
71 | const char *role; |
72 | int minlen; |
73 | int maxlen; |
74 | enum encoding_option encoding; |
75 | char kbdlang[TLMI_LANG_MAXLEN]; |
76 | int index; /*Used for HDD and NVME auth */ |
77 | enum level_option level; |
78 | bool cert_installed; |
79 | char *signature; |
80 | char *save_signature; |
81 | }; |
82 | |
83 | /* Attribute setting details */ |
84 | struct tlmi_attr_setting { |
85 | struct kobject kobj; |
86 | int index; |
87 | char display_name[TLMI_SETTINGS_MAXLEN]; |
88 | char *possible_values; |
89 | }; |
90 | |
91 | struct think_lmi { |
92 | struct wmi_device *wmi_device; |
93 | |
94 | bool can_set_bios_settings; |
95 | bool can_get_bios_selections; |
96 | bool can_set_bios_password; |
97 | bool can_get_password_settings; |
98 | bool pending_changes; |
99 | bool can_debug_cmd; |
100 | bool opcode_support; |
101 | bool certificate_support; |
102 | enum save_mode save_mode; |
103 | bool save_required; |
104 | bool reboot_required; |
105 | |
106 | struct tlmi_attr_setting *setting[TLMI_SETTINGS_COUNT]; |
107 | struct device *class_dev; |
108 | struct kset *attribute_kset; |
109 | struct kset *authentication_kset; |
110 | |
111 | struct tlmi_pwdcfg pwdcfg; |
112 | struct tlmi_pwd_setting *pwd_admin; |
113 | struct tlmi_pwd_setting *pwd_power; |
114 | struct tlmi_pwd_setting *pwd_system; |
115 | struct tlmi_pwd_setting *pwd_hdd; |
116 | struct tlmi_pwd_setting *pwd_nvme; |
117 | }; |
118 | |
119 | #endif /* !_THINK_LMI_H_ */ |
120 | |