162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * Definitions for kernel modules using hp_bioscfg driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (c) 2022 HP Development Company, L.P.
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _HP_BIOSCFG_H_
962306a36Sopenharmony_ci#define _HP_BIOSCFG_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/wmi.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/device.h>
1462306a36Sopenharmony_ci#include <linux/module.h>
1562306a36Sopenharmony_ci#include <linux/kernel.h>
1662306a36Sopenharmony_ci#include <linux/nls.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define DRIVER_NAME		"hp-bioscfg"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define MAX_BUFF_SIZE		512
2162306a36Sopenharmony_ci#define MAX_KEY_MOD_SIZE	256
2262306a36Sopenharmony_ci#define MAX_PASSWD_SIZE		64
2362306a36Sopenharmony_ci#define MAX_PREREQUISITES_SIZE	20
2462306a36Sopenharmony_ci#define MAX_REQ_ELEM_SIZE	128
2562306a36Sopenharmony_ci#define MAX_VALUES_SIZE		16
2662306a36Sopenharmony_ci#define MAX_ENCODINGS_SIZE	16
2762306a36Sopenharmony_ci#define MAX_ELEMENTS_SIZE	16
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define SPM_STR_DESC		"Secure Platform Management"
3062306a36Sopenharmony_ci#define SPM_STR			"SPM"
3162306a36Sopenharmony_ci#define SURE_START_DESC		"Sure Start"
3262306a36Sopenharmony_ci#define SURE_START_STR		"Sure_Start"
3362306a36Sopenharmony_ci#define SETUP_PASSWD		"Setup Password"
3462306a36Sopenharmony_ci#define POWER_ON_PASSWD		"Power-On Password"
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define LANG_CODE_STR		"en_US.UTF-8"
3762306a36Sopenharmony_ci#define SCHEDULE_POWER_ON	"Scheduled Power-On"
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define COMMA_SEP		","
4062306a36Sopenharmony_ci#define SEMICOLON_SEP		";"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* Sure Admin Functions */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define UTF_PREFIX		"<utf-16/>"
4562306a36Sopenharmony_ci#define BEAM_PREFIX		"<BEAM/>"
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cienum mechanism_values {
4862306a36Sopenharmony_ci	PASSWORD		= 0x00,
4962306a36Sopenharmony_ci	SIGNING_KEY		= 0x01,
5062306a36Sopenharmony_ci	ENDORSEMENT_KEY		= 0x02,
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define BIOS_ADMIN		"bios-admin"
5462306a36Sopenharmony_ci#define POWER_ON		"power-on"
5562306a36Sopenharmony_ci#define BIOS_SPM		"enhanced-bios-auth"
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci#define PASSWD_MECHANISM_TYPES "password"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define HP_WMI_BIOS_GUID		"5FB7F034-2C63-45e9-BE91-3D44E2C707E4"
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#define HP_WMI_BIOS_STRING_GUID		"988D08E3-68F4-4c35-AF3E-6A1B8106F83C"
6262306a36Sopenharmony_ci#define HP_WMI_BIOS_INTEGER_GUID	"8232DE3D-663D-4327-A8F4-E293ADB9BF05"
6362306a36Sopenharmony_ci#define HP_WMI_BIOS_ENUMERATION_GUID	"2D114B49-2DFB-4130-B8FE-4A3C09E75133"
6462306a36Sopenharmony_ci#define HP_WMI_BIOS_ORDERED_LIST_GUID	"14EA9746-CE1F-4098-A0E0-7045CB4DA745"
6562306a36Sopenharmony_ci#define HP_WMI_BIOS_PASSWORD_GUID	"322F2028-0F84-4901-988E-015176049E2D"
6662306a36Sopenharmony_ci#define HP_WMI_SET_BIOS_SETTING_GUID	"1F4C91EB-DC5C-460b-951D-C7CB9B4B8D5E"
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cienum hp_wmi_spm_commandtype {
6962306a36Sopenharmony_ci	HPWMI_SECUREPLATFORM_GET_STATE  = 0x10,
7062306a36Sopenharmony_ci	HPWMI_SECUREPLATFORM_SET_KEK	= 0x11,
7162306a36Sopenharmony_ci	HPWMI_SECUREPLATFORM_SET_SK	= 0x12,
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_cienum hp_wmi_surestart_commandtype {
7562306a36Sopenharmony_ci	HPWMI_SURESTART_GET_LOG_COUNT	= 0x01,
7662306a36Sopenharmony_ci	HPWMI_SURESTART_GET_LOG		= 0x02,
7762306a36Sopenharmony_ci};
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_cienum hp_wmi_command {
8062306a36Sopenharmony_ci	HPWMI_READ		= 0x01,
8162306a36Sopenharmony_ci	HPWMI_WRITE		= 0x02,
8262306a36Sopenharmony_ci	HPWMI_ODM		= 0x03,
8362306a36Sopenharmony_ci	HPWMI_SURESTART		= 0x20006,
8462306a36Sopenharmony_ci	HPWMI_GM		= 0x20008,
8562306a36Sopenharmony_ci	HPWMI_SECUREPLATFORM	= 0x20010,
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct bios_return {
8962306a36Sopenharmony_ci	u32 sigpass;
9062306a36Sopenharmony_ci	u32 return_code;
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cienum wmi_error_values {
9462306a36Sopenharmony_ci	SUCCESS				= 0x00,
9562306a36Sopenharmony_ci	CMD_FAILED			= 0x01,
9662306a36Sopenharmony_ci	INVALID_SIGN			= 0x02,
9762306a36Sopenharmony_ci	INVALID_CMD_VALUE		= 0x03,
9862306a36Sopenharmony_ci	INVALID_CMD_TYPE		= 0x04,
9962306a36Sopenharmony_ci	INVALID_DATA_SIZE		= 0x05,
10062306a36Sopenharmony_ci	INVALID_CMD_PARAM		= 0x06,
10162306a36Sopenharmony_ci	ENCRYP_CMD_REQUIRED		= 0x07,
10262306a36Sopenharmony_ci	NO_SECURE_SESSION		= 0x08,
10362306a36Sopenharmony_ci	SECURE_SESSION_FOUND		= 0x09,
10462306a36Sopenharmony_ci	SECURE_SESSION_FAILED		= 0x0A,
10562306a36Sopenharmony_ci	AUTH_FAILED			= 0x0B,
10662306a36Sopenharmony_ci	INVALID_BIOS_AUTH		= 0x0E,
10762306a36Sopenharmony_ci	NONCE_DID_NOT_MATCH		= 0x18,
10862306a36Sopenharmony_ci	GENERIC_ERROR			= 0x1C,
10962306a36Sopenharmony_ci	BIOS_ADMIN_POLICY_NOT_MET	= 0x28,
11062306a36Sopenharmony_ci	BIOS_ADMIN_NOT_SET		= 0x38,
11162306a36Sopenharmony_ci	P21_NO_PROVISIONED		= 0x1000,
11262306a36Sopenharmony_ci	P21_PROVISION_IN_PROGRESS	= 0x1001,
11362306a36Sopenharmony_ci	P21_IN_USE			= 0x1002,
11462306a36Sopenharmony_ci	HEP_NOT_ACTIVE			= 0x1004,
11562306a36Sopenharmony_ci	HEP_ALREADY_SET			= 0x1006,
11662306a36Sopenharmony_ci	HEP_CHECK_STATE			= 0x1007,
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_cistruct common_data {
12062306a36Sopenharmony_ci	u8 display_name[MAX_BUFF_SIZE];
12162306a36Sopenharmony_ci	u8 path[MAX_BUFF_SIZE];
12262306a36Sopenharmony_ci	u32 is_readonly;
12362306a36Sopenharmony_ci	u32 display_in_ui;
12462306a36Sopenharmony_ci	u32 requires_physical_presence;
12562306a36Sopenharmony_ci	u32 sequence;
12662306a36Sopenharmony_ci	u32 prerequisites_size;
12762306a36Sopenharmony_ci	u8 prerequisites[MAX_PREREQUISITES_SIZE][MAX_BUFF_SIZE];
12862306a36Sopenharmony_ci	u32 security_level;
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_cistruct string_data {
13262306a36Sopenharmony_ci	struct common_data common;
13362306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
13462306a36Sopenharmony_ci	u8 current_value[MAX_BUFF_SIZE];
13562306a36Sopenharmony_ci	u8 new_value[MAX_BUFF_SIZE];
13662306a36Sopenharmony_ci	u32 min_length;
13762306a36Sopenharmony_ci	u32 max_length;
13862306a36Sopenharmony_ci};
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistruct integer_data {
14162306a36Sopenharmony_ci	struct common_data common;
14262306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
14362306a36Sopenharmony_ci	u32 current_value;
14462306a36Sopenharmony_ci	u32 new_value;
14562306a36Sopenharmony_ci	u32 lower_bound;
14662306a36Sopenharmony_ci	u32 upper_bound;
14762306a36Sopenharmony_ci	u32 scalar_increment;
14862306a36Sopenharmony_ci};
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_cistruct enumeration_data {
15162306a36Sopenharmony_ci	struct common_data common;
15262306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
15362306a36Sopenharmony_ci	u8 current_value[MAX_BUFF_SIZE];
15462306a36Sopenharmony_ci	u8 new_value[MAX_BUFF_SIZE];
15562306a36Sopenharmony_ci	u32 possible_values_size;
15662306a36Sopenharmony_ci	u8 possible_values[MAX_VALUES_SIZE][MAX_BUFF_SIZE];
15762306a36Sopenharmony_ci};
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_cistruct ordered_list_data {
16062306a36Sopenharmony_ci	struct common_data common;
16162306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
16262306a36Sopenharmony_ci	u8 current_value[MAX_BUFF_SIZE];
16362306a36Sopenharmony_ci	u8 new_value[MAX_BUFF_SIZE];
16462306a36Sopenharmony_ci	u32 elements_size;
16562306a36Sopenharmony_ci	u8 elements[MAX_ELEMENTS_SIZE][MAX_BUFF_SIZE];
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistruct password_data {
16962306a36Sopenharmony_ci	struct common_data common;
17062306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
17162306a36Sopenharmony_ci	u8 current_password[MAX_PASSWD_SIZE];
17262306a36Sopenharmony_ci	u8 new_password[MAX_PASSWD_SIZE];
17362306a36Sopenharmony_ci	u32 min_password_length;
17462306a36Sopenharmony_ci	u32 max_password_length;
17562306a36Sopenharmony_ci	u32 encodings_size;
17662306a36Sopenharmony_ci	u8 encodings[MAX_ENCODINGS_SIZE][MAX_BUFF_SIZE];
17762306a36Sopenharmony_ci	bool is_enabled;
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	/*
18062306a36Sopenharmony_ci	 * 'role' identifies the type of authentication.
18162306a36Sopenharmony_ci	 * Two known types are bios-admin and power-on.
18262306a36Sopenharmony_ci	 * 'bios-admin' represents BIOS administrator password
18362306a36Sopenharmony_ci	 * 'power-on' represents a password required to use the system
18462306a36Sopenharmony_ci	 */
18562306a36Sopenharmony_ci	u32 role;
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	/*
18862306a36Sopenharmony_ci	 * 'mechanism' represents the means of authentication.
18962306a36Sopenharmony_ci	 * Only supported type currently is "password"
19062306a36Sopenharmony_ci	 */
19162306a36Sopenharmony_ci	u32 mechanism;
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_cistruct secure_platform_data {
19562306a36Sopenharmony_ci	struct kobject *attr_name_kobj;
19662306a36Sopenharmony_ci	u8 attribute_name[MAX_BUFF_SIZE];
19762306a36Sopenharmony_ci	u8 *endorsement_key;
19862306a36Sopenharmony_ci	u8 *signing_key;
19962306a36Sopenharmony_ci	u8 *auth_token;
20062306a36Sopenharmony_ci	bool is_enabled;
20162306a36Sopenharmony_ci	u32 mechanism;
20262306a36Sopenharmony_ci};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistruct bioscfg_priv {
20562306a36Sopenharmony_ci	struct kset *authentication_dir_kset;
20662306a36Sopenharmony_ci	struct kset *main_dir_kset;
20762306a36Sopenharmony_ci	struct device *class_dev;
20862306a36Sopenharmony_ci	struct string_data *string_data;
20962306a36Sopenharmony_ci	u32 string_instances_count;
21062306a36Sopenharmony_ci	struct integer_data *integer_data;
21162306a36Sopenharmony_ci	u32 integer_instances_count;
21262306a36Sopenharmony_ci	struct enumeration_data *enumeration_data;
21362306a36Sopenharmony_ci	u32 enumeration_instances_count;
21462306a36Sopenharmony_ci	struct ordered_list_data *ordered_list_data;
21562306a36Sopenharmony_ci	u32 ordered_list_instances_count;
21662306a36Sopenharmony_ci	struct password_data *password_data;
21762306a36Sopenharmony_ci	u32 password_instances_count;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	struct kobject *sure_start_attr_kobj;
22062306a36Sopenharmony_ci	struct secure_platform_data spm_data;
22162306a36Sopenharmony_ci	u8 display_name_language_code[MAX_BUFF_SIZE];
22262306a36Sopenharmony_ci	bool pending_reboot;
22362306a36Sopenharmony_ci	struct mutex mutex;
22462306a36Sopenharmony_ci};
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci/* global structure used by multiple WMI interfaces */
22762306a36Sopenharmony_ciextern struct bioscfg_priv bioscfg_drv;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_cienum hp_wmi_data_type {
23062306a36Sopenharmony_ci	HPWMI_STRING_TYPE,
23162306a36Sopenharmony_ci	HPWMI_INTEGER_TYPE,
23262306a36Sopenharmony_ci	HPWMI_ENUMERATION_TYPE,
23362306a36Sopenharmony_ci	HPWMI_ORDERED_LIST_TYPE,
23462306a36Sopenharmony_ci	HPWMI_PASSWORD_TYPE,
23562306a36Sopenharmony_ci	HPWMI_SECURE_PLATFORM_TYPE,
23662306a36Sopenharmony_ci	HPWMI_SURE_START_TYPE,
23762306a36Sopenharmony_ci};
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cienum hp_wmi_data_elements {
24062306a36Sopenharmony_ci	/* Common elements */
24162306a36Sopenharmony_ci	NAME = 0,
24262306a36Sopenharmony_ci	VALUE = 1,
24362306a36Sopenharmony_ci	PATH = 2,
24462306a36Sopenharmony_ci	IS_READONLY = 3,
24562306a36Sopenharmony_ci	DISPLAY_IN_UI = 4,
24662306a36Sopenharmony_ci	REQUIRES_PHYSICAL_PRESENCE = 5,
24762306a36Sopenharmony_ci	SEQUENCE = 6,
24862306a36Sopenharmony_ci	PREREQUISITES_SIZE = 7,
24962306a36Sopenharmony_ci	PREREQUISITES = 8,
25062306a36Sopenharmony_ci	SECURITY_LEVEL = 9,
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	/* String elements */
25362306a36Sopenharmony_ci	STR_MIN_LENGTH = 10,
25462306a36Sopenharmony_ci	STR_MAX_LENGTH = 11,
25562306a36Sopenharmony_ci	STR_ELEM_CNT = 12,
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	/* Integer elements */
25862306a36Sopenharmony_ci	INT_LOWER_BOUND = 10,
25962306a36Sopenharmony_ci	INT_UPPER_BOUND = 11,
26062306a36Sopenharmony_ci	INT_SCALAR_INCREMENT = 12,
26162306a36Sopenharmony_ci	INT_ELEM_CNT = 13,
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	/* Enumeration elements */
26462306a36Sopenharmony_ci	ENUM_CURRENT_VALUE = 10,
26562306a36Sopenharmony_ci	ENUM_SIZE = 11,
26662306a36Sopenharmony_ci	ENUM_POSSIBLE_VALUES = 12,
26762306a36Sopenharmony_ci	ENUM_ELEM_CNT = 13,
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	/* Ordered list elements */
27062306a36Sopenharmony_ci	ORD_LIST_SIZE = 10,
27162306a36Sopenharmony_ci	ORD_LIST_ELEMENTS = 11,
27262306a36Sopenharmony_ci	ORD_ELEM_CNT = 12,
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	/* Password elements */
27562306a36Sopenharmony_ci	PSWD_MIN_LENGTH = 10,
27662306a36Sopenharmony_ci	PSWD_MAX_LENGTH = 11,
27762306a36Sopenharmony_ci	PSWD_SIZE = 12,
27862306a36Sopenharmony_ci	PSWD_ENCODINGS = 13,
27962306a36Sopenharmony_ci	PSWD_IS_SET = 14,
28062306a36Sopenharmony_ci	PSWD_ELEM_CNT = 15,
28162306a36Sopenharmony_ci};
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci#define GET_INSTANCE_ID(type)						\
28462306a36Sopenharmony_ci	static int get_##type##_instance_id(struct kobject *kobj)	\
28562306a36Sopenharmony_ci	{								\
28662306a36Sopenharmony_ci		int i;							\
28762306a36Sopenharmony_ci									\
28862306a36Sopenharmony_ci		for (i = 0; i <= bioscfg_drv.type##_instances_count; i++) { \
28962306a36Sopenharmony_ci			if (!strcmp(kobj->name, bioscfg_drv.type##_data[i].attr_name_kobj->name)) \
29062306a36Sopenharmony_ci				return i;				\
29162306a36Sopenharmony_ci		}							\
29262306a36Sopenharmony_ci		return -EIO;						\
29362306a36Sopenharmony_ci	}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci#define ATTRIBUTE_S_PROPERTY_SHOW(name, type)				\
29662306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
29762306a36Sopenharmony_ci				   char *buf)				\
29862306a36Sopenharmony_ci	{								\
29962306a36Sopenharmony_ci		int i = get_##type##_instance_id(kobj);			\
30062306a36Sopenharmony_ci		if (i >= 0)						\
30162306a36Sopenharmony_ci			return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data[i].name); \
30262306a36Sopenharmony_ci		return -EIO;						\
30362306a36Sopenharmony_ci	}
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci#define ATTRIBUTE_N_PROPERTY_SHOW(name, type)				\
30662306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
30762306a36Sopenharmony_ci				   char *buf)				\
30862306a36Sopenharmony_ci	{								\
30962306a36Sopenharmony_ci		int i = get_##type##_instance_id(kobj);			\
31062306a36Sopenharmony_ci		if (i >= 0)						\
31162306a36Sopenharmony_ci			return sysfs_emit(buf, "%d\n", bioscfg_drv.type##_data[i].name); \
31262306a36Sopenharmony_ci		return -EIO;						\
31362306a36Sopenharmony_ci	}
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci#define ATTRIBUTE_PROPERTY_STORE(curr_val, type)			\
31662306a36Sopenharmony_ci	static ssize_t curr_val##_store(struct kobject *kobj,		\
31762306a36Sopenharmony_ci					struct kobj_attribute *attr,	\
31862306a36Sopenharmony_ci					const char *buf, size_t count)	\
31962306a36Sopenharmony_ci	{								\
32062306a36Sopenharmony_ci		char *attr_value = NULL;				\
32162306a36Sopenharmony_ci		int i;							\
32262306a36Sopenharmony_ci		int ret = -EIO;						\
32362306a36Sopenharmony_ci									\
32462306a36Sopenharmony_ci		attr_value = kstrdup(buf, GFP_KERNEL);			\
32562306a36Sopenharmony_ci		if (!attr_value)					\
32662306a36Sopenharmony_ci			return -ENOMEM;					\
32762306a36Sopenharmony_ci									\
32862306a36Sopenharmony_ci		ret = hp_enforce_single_line_input(attr_value, count);	\
32962306a36Sopenharmony_ci		if (!ret) {						\
33062306a36Sopenharmony_ci			i = get_##type##_instance_id(kobj);		\
33162306a36Sopenharmony_ci			if (i >= 0)					\
33262306a36Sopenharmony_ci				ret = validate_##type##_input(i, attr_value); \
33362306a36Sopenharmony_ci		}							\
33462306a36Sopenharmony_ci		if (!ret)						\
33562306a36Sopenharmony_ci			ret = hp_set_attribute(kobj->name, attr_value);	\
33662306a36Sopenharmony_ci		if (!ret) {						\
33762306a36Sopenharmony_ci			update_##type##_value(i, attr_value);		\
33862306a36Sopenharmony_ci			if (bioscfg_drv.type##_data[i].common.requires_physical_presence)	\
33962306a36Sopenharmony_ci				hp_set_reboot_and_signal_event();	\
34062306a36Sopenharmony_ci		}							\
34162306a36Sopenharmony_ci		hp_clear_all_credentials();				\
34262306a36Sopenharmony_ci		kfree(attr_value);					\
34362306a36Sopenharmony_ci									\
34462306a36Sopenharmony_ci		return ret ? ret : count;				\
34562306a36Sopenharmony_ci	}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci#define ATTRIBUTE_SPM_N_PROPERTY_SHOW(name, type)			\
34862306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
34962306a36Sopenharmony_ci	{								\
35062306a36Sopenharmony_ci		return sysfs_emit(buf, "%d\n", bioscfg_drv.type##_data.name); \
35162306a36Sopenharmony_ci	}
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci#define ATTRIBUTE_SPM_S_PROPERTY_SHOW(name, type)			\
35462306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
35562306a36Sopenharmony_ci	{								\
35662306a36Sopenharmony_ci		return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data.name); \
35762306a36Sopenharmony_ci	}
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci#define ATTRIBUTE_VALUES_PROPERTY_SHOW(name, type, sep)			\
36062306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj,		\
36162306a36Sopenharmony_ci				   struct kobj_attribute *attr, char *buf) \
36262306a36Sopenharmony_ci	{								\
36362306a36Sopenharmony_ci		int i;							\
36462306a36Sopenharmony_ci		int len = 0;						\
36562306a36Sopenharmony_ci		int instance_id = get_##type##_instance_id(kobj);	\
36662306a36Sopenharmony_ci									\
36762306a36Sopenharmony_ci		if (instance_id < 0)					\
36862306a36Sopenharmony_ci			return 0;					\
36962306a36Sopenharmony_ci									\
37062306a36Sopenharmony_ci		for (i = 0; i < bioscfg_drv.type##_data[instance_id].name##_size; i++) { \
37162306a36Sopenharmony_ci			if (i)						\
37262306a36Sopenharmony_ci				len += sysfs_emit_at(buf, len, "%s", sep); \
37362306a36Sopenharmony_ci									\
37462306a36Sopenharmony_ci			len += sysfs_emit_at(buf, len, "%s",		\
37562306a36Sopenharmony_ci					     bioscfg_drv.type##_data[instance_id].name[i]); \
37662306a36Sopenharmony_ci		}							\
37762306a36Sopenharmony_ci		len += sysfs_emit_at(buf, len, "\n");			\
37862306a36Sopenharmony_ci		return len;						\
37962306a36Sopenharmony_ci	}
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci#define ATTRIBUTE_S_COMMON_PROPERTY_SHOW(name, type)		\
38262306a36Sopenharmony_ci	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
38362306a36Sopenharmony_ci				   char *buf)				\
38462306a36Sopenharmony_ci	{								\
38562306a36Sopenharmony_ci		int i = get_##type##_instance_id(kobj);			\
38662306a36Sopenharmony_ci		if (i >= 0)						\
38762306a36Sopenharmony_ci			return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data[i].common.name); \
38862306a36Sopenharmony_ci		return -EIO;						\
38962306a36Sopenharmony_ci	}
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ciextern struct kobj_attribute common_display_langcode;
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_ci/* Prototypes */
39462306a36Sopenharmony_ci
39562306a36Sopenharmony_ci/* String attributes */
39662306a36Sopenharmony_ciint hp_populate_string_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
39762306a36Sopenharmony_ci				   int instance_id,
39862306a36Sopenharmony_ci				   struct kobject *attr_name_kobj);
39962306a36Sopenharmony_ciint hp_alloc_string_data(void);
40062306a36Sopenharmony_civoid hp_exit_string_attributes(void);
40162306a36Sopenharmony_ciint hp_populate_string_package_data(union acpi_object *str_obj,
40262306a36Sopenharmony_ci				    int instance_id,
40362306a36Sopenharmony_ci				    struct kobject *attr_name_kobj);
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci/* Integer attributes */
40662306a36Sopenharmony_ciint hp_populate_integer_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
40762306a36Sopenharmony_ci				    int instance_id,
40862306a36Sopenharmony_ci				    struct kobject *attr_name_kobj);
40962306a36Sopenharmony_ciint hp_alloc_integer_data(void);
41062306a36Sopenharmony_civoid hp_exit_integer_attributes(void);
41162306a36Sopenharmony_ciint hp_populate_integer_package_data(union acpi_object *integer_obj,
41262306a36Sopenharmony_ci				     int instance_id,
41362306a36Sopenharmony_ci				     struct kobject *attr_name_kobj);
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci/* Enumeration attributes */
41662306a36Sopenharmony_ciint hp_populate_enumeration_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
41762306a36Sopenharmony_ci					int instance_id,
41862306a36Sopenharmony_ci					struct kobject *attr_name_kobj);
41962306a36Sopenharmony_ciint hp_alloc_enumeration_data(void);
42062306a36Sopenharmony_civoid hp_exit_enumeration_attributes(void);
42162306a36Sopenharmony_ciint hp_populate_enumeration_package_data(union acpi_object *enum_obj,
42262306a36Sopenharmony_ci					 int instance_id,
42362306a36Sopenharmony_ci					 struct kobject *attr_name_kobj);
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci/* Ordered list */
42662306a36Sopenharmony_ciint hp_populate_ordered_list_buffer_data(u8 *buffer_ptr,
42762306a36Sopenharmony_ci					 u32 *buffer_size,
42862306a36Sopenharmony_ci					 int instance_id,
42962306a36Sopenharmony_ci					 struct kobject *attr_name_kobj);
43062306a36Sopenharmony_ciint hp_alloc_ordered_list_data(void);
43162306a36Sopenharmony_civoid hp_exit_ordered_list_attributes(void);
43262306a36Sopenharmony_ciint hp_populate_ordered_list_package_data(union acpi_object *order_obj,
43362306a36Sopenharmony_ci					  int instance_id,
43462306a36Sopenharmony_ci					  struct kobject *attr_name_kobj);
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci/* Password authentication attributes */
43762306a36Sopenharmony_ciint hp_populate_password_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
43862306a36Sopenharmony_ci				     int instance_id,
43962306a36Sopenharmony_ci				     struct kobject *attr_name_kobj);
44062306a36Sopenharmony_ciint hp_populate_password_package_data(union acpi_object *password_obj,
44162306a36Sopenharmony_ci				      int instance_id,
44262306a36Sopenharmony_ci				      struct kobject *attr_name_kobj);
44362306a36Sopenharmony_ciint hp_alloc_password_data(void);
44462306a36Sopenharmony_ciint hp_get_password_instance_for_type(const char *name);
44562306a36Sopenharmony_ciint hp_clear_all_credentials(void);
44662306a36Sopenharmony_ciint hp_set_attribute(const char *a_name, const char *a_value);
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci/* SPM attributes */
44962306a36Sopenharmony_civoid hp_exit_password_attributes(void);
45062306a36Sopenharmony_civoid hp_exit_secure_platform_attributes(void);
45162306a36Sopenharmony_ciint hp_populate_secure_platform_data(struct kobject *attr_name_kobj);
45262306a36Sopenharmony_ciint hp_populate_security_buffer(u16 *buffer, const char *authentication);
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci/* Bios Attributes interface */
45562306a36Sopenharmony_ciint hp_wmi_set_bios_setting(u16 *input_buffer, u32 input_size);
45662306a36Sopenharmony_ciint hp_wmi_perform_query(int query, enum hp_wmi_command command,
45762306a36Sopenharmony_ci			 void *buffer, u32 insize, u32 outsize);
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci/* Sure Start attributes */
46062306a36Sopenharmony_civoid hp_exit_sure_start_attributes(void);
46162306a36Sopenharmony_ciint hp_populate_sure_start_data(struct kobject *attr_name_kobj);
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci/* Bioscfg */
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_civoid hp_exit_attr_set_interface(void);
46662306a36Sopenharmony_ciint hp_init_attr_set_interface(void);
46762306a36Sopenharmony_cisize_t hp_calculate_string_buffer(const char *str);
46862306a36Sopenharmony_cisize_t hp_calculate_security_buffer(const char *authentication);
46962306a36Sopenharmony_civoid *hp_ascii_to_utf16_unicode(u16 *p, const u8 *str);
47062306a36Sopenharmony_ciint hp_get_integer_from_buffer(u8 **buffer, u32 *buffer_size, u32 *integer);
47162306a36Sopenharmony_ciint hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_size);
47262306a36Sopenharmony_ciint hp_convert_hexstr_to_str(const char *input, u32 input_len, char **str, int *len);
47362306a36Sopenharmony_ciint hp_encode_outsize_for_pvsz(int outsize);
47462306a36Sopenharmony_ciint hp_enforce_single_line_input(char *buf, size_t count);
47562306a36Sopenharmony_civoid hp_set_reboot_and_signal_event(void);
47662306a36Sopenharmony_cissize_t display_name_language_code_show(struct kobject *kobj,
47762306a36Sopenharmony_ci					struct kobj_attribute *attr,
47862306a36Sopenharmony_ci					char *buf);
47962306a36Sopenharmony_ciunion acpi_object *hp_get_wmiobj_pointer(int instance_id, const char *guid_string);
48062306a36Sopenharmony_ciint hp_get_instance_count(const char *guid_string);
48162306a36Sopenharmony_civoid hp_update_attribute_permissions(bool isreadonly, struct kobj_attribute *current_val);
48262306a36Sopenharmony_civoid hp_friendly_user_name_update(char *path, const char *attr_name,
48362306a36Sopenharmony_ci				  char *attr_display, int attr_size);
48462306a36Sopenharmony_ciint hp_wmi_error_and_message(int error_code);
48562306a36Sopenharmony_ciint hp_get_common_data_from_buffer(u8 **buffer_ptr, u32 *buffer_size, struct common_data *common);
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_ci#endif
488