162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef _THINK_LMI_H_
462306a36Sopenharmony_ci#define _THINK_LMI_H_
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define TLMI_SETTINGS_COUNT  256
962306a36Sopenharmony_ci#define TLMI_SETTINGS_MAXLEN 512
1062306a36Sopenharmony_ci#define TLMI_PWD_BUFSIZE     129
1162306a36Sopenharmony_ci#define TLMI_LANG_MAXLEN       4
1262306a36Sopenharmony_ci#define TLMI_INDEX_MAX        32
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci/* Possible error values */
1562306a36Sopenharmony_cistruct tlmi_err_codes {
1662306a36Sopenharmony_ci	const char *err_str;
1762306a36Sopenharmony_ci	int err_code;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cienum encoding_option {
2162306a36Sopenharmony_ci	TLMI_ENCODING_ASCII,
2262306a36Sopenharmony_ci	TLMI_ENCODING_SCANCODE,
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cienum level_option {
2662306a36Sopenharmony_ci	TLMI_LEVEL_USER,
2762306a36Sopenharmony_ci	TLMI_LEVEL_MASTER,
2862306a36Sopenharmony_ci};
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* password configuration details */
3162306a36Sopenharmony_cistruct tlmi_pwdcfg_core {
3262306a36Sopenharmony_ci	uint32_t password_mode;
3362306a36Sopenharmony_ci	uint32_t password_state;
3462306a36Sopenharmony_ci	uint32_t min_length;
3562306a36Sopenharmony_ci	uint32_t max_length;
3662306a36Sopenharmony_ci	uint32_t supported_encodings;
3762306a36Sopenharmony_ci	uint32_t supported_keyboard;
3862306a36Sopenharmony_ci};
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct tlmi_pwdcfg_ext {
4162306a36Sopenharmony_ci	uint32_t hdd_user_password;
4262306a36Sopenharmony_ci	uint32_t hdd_master_password;
4362306a36Sopenharmony_ci	uint32_t nvme_user_password;
4462306a36Sopenharmony_ci	uint32_t nvme_master_password;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct tlmi_pwdcfg {
4862306a36Sopenharmony_ci	struct tlmi_pwdcfg_core core;
4962306a36Sopenharmony_ci	struct tlmi_pwdcfg_ext ext;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* password setting details */
5362306a36Sopenharmony_cistruct tlmi_pwd_setting {
5462306a36Sopenharmony_ci	struct kobject kobj;
5562306a36Sopenharmony_ci	bool valid;
5662306a36Sopenharmony_ci	char password[TLMI_PWD_BUFSIZE];
5762306a36Sopenharmony_ci	const char *pwd_type;
5862306a36Sopenharmony_ci	const char *role;
5962306a36Sopenharmony_ci	int minlen;
6062306a36Sopenharmony_ci	int maxlen;
6162306a36Sopenharmony_ci	enum encoding_option encoding;
6262306a36Sopenharmony_ci	char kbdlang[TLMI_LANG_MAXLEN];
6362306a36Sopenharmony_ci	int index; /*Used for HDD and NVME auth */
6462306a36Sopenharmony_ci	enum level_option level;
6562306a36Sopenharmony_ci	bool cert_installed;
6662306a36Sopenharmony_ci	char *signature;
6762306a36Sopenharmony_ci	char *save_signature;
6862306a36Sopenharmony_ci};
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci/* Attribute setting details */
7162306a36Sopenharmony_cistruct tlmi_attr_setting {
7262306a36Sopenharmony_ci	struct kobject kobj;
7362306a36Sopenharmony_ci	int index;
7462306a36Sopenharmony_ci	char display_name[TLMI_SETTINGS_MAXLEN];
7562306a36Sopenharmony_ci	char *possible_values;
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistruct think_lmi {
7962306a36Sopenharmony_ci	struct wmi_device *wmi_device;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	bool can_set_bios_settings;
8262306a36Sopenharmony_ci	bool can_get_bios_selections;
8362306a36Sopenharmony_ci	bool can_set_bios_password;
8462306a36Sopenharmony_ci	bool can_get_password_settings;
8562306a36Sopenharmony_ci	bool pending_changes;
8662306a36Sopenharmony_ci	bool can_debug_cmd;
8762306a36Sopenharmony_ci	bool opcode_support;
8862306a36Sopenharmony_ci	bool certificate_support;
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	struct tlmi_attr_setting *setting[TLMI_SETTINGS_COUNT];
9162306a36Sopenharmony_ci	struct device *class_dev;
9262306a36Sopenharmony_ci	struct kset *attribute_kset;
9362306a36Sopenharmony_ci	struct kset *authentication_kset;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	struct tlmi_pwdcfg pwdcfg;
9662306a36Sopenharmony_ci	struct tlmi_pwd_setting *pwd_admin;
9762306a36Sopenharmony_ci	struct tlmi_pwd_setting *pwd_power;
9862306a36Sopenharmony_ci	struct tlmi_pwd_setting *pwd_system;
9962306a36Sopenharmony_ci	struct tlmi_pwd_setting *pwd_hdd;
10062306a36Sopenharmony_ci	struct tlmi_pwd_setting *pwd_nvme;
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci#endif /* !_THINK_LMI_H_ */
104