xref: /openbmc/linux/drivers/platform/x86/hp/hp-bioscfg/bioscfg.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1*5f94f181SJorge Lopez /* SPDX-License-Identifier: GPL-2.0
2*5f94f181SJorge Lopez  *
3*5f94f181SJorge Lopez  * Definitions for kernel modules using hp_bioscfg driver
4*5f94f181SJorge Lopez  *
5*5f94f181SJorge Lopez  *  Copyright (c) 2022 HP Development Company, L.P.
6*5f94f181SJorge Lopez  */
7*5f94f181SJorge Lopez 
8*5f94f181SJorge Lopez #ifndef _HP_BIOSCFG_H_
9*5f94f181SJorge Lopez #define _HP_BIOSCFG_H_
10*5f94f181SJorge Lopez 
11*5f94f181SJorge Lopez #include <linux/wmi.h>
12*5f94f181SJorge Lopez #include <linux/types.h>
13*5f94f181SJorge Lopez #include <linux/device.h>
14*5f94f181SJorge Lopez #include <linux/module.h>
15*5f94f181SJorge Lopez #include <linux/kernel.h>
16*5f94f181SJorge Lopez #include <linux/nls.h>
17*5f94f181SJorge Lopez 
18*5f94f181SJorge Lopez #define DRIVER_NAME		"hp-bioscfg"
19*5f94f181SJorge Lopez 
20*5f94f181SJorge Lopez #define MAX_BUFF_SIZE		512
21*5f94f181SJorge Lopez #define MAX_KEY_MOD_SIZE	256
22*5f94f181SJorge Lopez #define MAX_PASSWD_SIZE		64
23*5f94f181SJorge Lopez #define MAX_PREREQUISITES_SIZE	20
24*5f94f181SJorge Lopez #define MAX_REQ_ELEM_SIZE	128
25*5f94f181SJorge Lopez #define MAX_VALUES_SIZE		16
26*5f94f181SJorge Lopez #define MAX_ENCODINGS_SIZE	16
27*5f94f181SJorge Lopez #define MAX_ELEMENTS_SIZE	16
28*5f94f181SJorge Lopez 
29*5f94f181SJorge Lopez #define SPM_STR_DESC		"Secure Platform Management"
30*5f94f181SJorge Lopez #define SPM_STR			"SPM"
31*5f94f181SJorge Lopez #define SURE_START_DESC		"Sure Start"
32*5f94f181SJorge Lopez #define SURE_START_STR		"Sure_Start"
33*5f94f181SJorge Lopez #define SETUP_PASSWD		"Setup Password"
34*5f94f181SJorge Lopez #define POWER_ON_PASSWD		"Power-On Password"
35*5f94f181SJorge Lopez 
36*5f94f181SJorge Lopez #define LANG_CODE_STR		"en_US.UTF-8"
37*5f94f181SJorge Lopez #define SCHEDULE_POWER_ON	"Scheduled Power-On"
38*5f94f181SJorge Lopez 
39*5f94f181SJorge Lopez #define COMMA_SEP		","
40*5f94f181SJorge Lopez #define SEMICOLON_SEP		";"
41*5f94f181SJorge Lopez 
42*5f94f181SJorge Lopez /* Sure Admin Functions */
43*5f94f181SJorge Lopez 
44*5f94f181SJorge Lopez #define UTF_PREFIX		"<utf-16/>"
45*5f94f181SJorge Lopez #define BEAM_PREFIX		"<BEAM/>"
46*5f94f181SJorge Lopez 
47*5f94f181SJorge Lopez enum mechanism_values {
48*5f94f181SJorge Lopez 	PASSWORD		= 0x00,
49*5f94f181SJorge Lopez 	SIGNING_KEY		= 0x01,
50*5f94f181SJorge Lopez 	ENDORSEMENT_KEY		= 0x02,
51*5f94f181SJorge Lopez };
52*5f94f181SJorge Lopez 
53*5f94f181SJorge Lopez #define BIOS_ADMIN		"bios-admin"
54*5f94f181SJorge Lopez #define POWER_ON		"power-on"
55*5f94f181SJorge Lopez #define BIOS_SPM		"enhanced-bios-auth"
56*5f94f181SJorge Lopez 
57*5f94f181SJorge Lopez #define PASSWD_MECHANISM_TYPES "password"
58*5f94f181SJorge Lopez 
59*5f94f181SJorge Lopez #define HP_WMI_BIOS_GUID		"5FB7F034-2C63-45e9-BE91-3D44E2C707E4"
60*5f94f181SJorge Lopez 
61*5f94f181SJorge Lopez #define HP_WMI_BIOS_STRING_GUID		"988D08E3-68F4-4c35-AF3E-6A1B8106F83C"
62*5f94f181SJorge Lopez #define HP_WMI_BIOS_INTEGER_GUID	"8232DE3D-663D-4327-A8F4-E293ADB9BF05"
63*5f94f181SJorge Lopez #define HP_WMI_BIOS_ENUMERATION_GUID	"2D114B49-2DFB-4130-B8FE-4A3C09E75133"
64*5f94f181SJorge Lopez #define HP_WMI_BIOS_ORDERED_LIST_GUID	"14EA9746-CE1F-4098-A0E0-7045CB4DA745"
65*5f94f181SJorge Lopez #define HP_WMI_BIOS_PASSWORD_GUID	"322F2028-0F84-4901-988E-015176049E2D"
66*5f94f181SJorge Lopez #define HP_WMI_SET_BIOS_SETTING_GUID	"1F4C91EB-DC5C-460b-951D-C7CB9B4B8D5E"
67*5f94f181SJorge Lopez 
68*5f94f181SJorge Lopez enum hp_wmi_spm_commandtype {
69*5f94f181SJorge Lopez 	HPWMI_SECUREPLATFORM_GET_STATE  = 0x10,
70*5f94f181SJorge Lopez 	HPWMI_SECUREPLATFORM_SET_KEK	= 0x11,
71*5f94f181SJorge Lopez 	HPWMI_SECUREPLATFORM_SET_SK	= 0x12,
72*5f94f181SJorge Lopez };
73*5f94f181SJorge Lopez 
74*5f94f181SJorge Lopez enum hp_wmi_surestart_commandtype {
75*5f94f181SJorge Lopez 	HPWMI_SURESTART_GET_LOG_COUNT	= 0x01,
76*5f94f181SJorge Lopez 	HPWMI_SURESTART_GET_LOG		= 0x02,
77*5f94f181SJorge Lopez };
78*5f94f181SJorge Lopez 
79*5f94f181SJorge Lopez enum hp_wmi_command {
80*5f94f181SJorge Lopez 	HPWMI_READ		= 0x01,
81*5f94f181SJorge Lopez 	HPWMI_WRITE		= 0x02,
82*5f94f181SJorge Lopez 	HPWMI_ODM		= 0x03,
83*5f94f181SJorge Lopez 	HPWMI_SURESTART		= 0x20006,
84*5f94f181SJorge Lopez 	HPWMI_GM		= 0x20008,
85*5f94f181SJorge Lopez 	HPWMI_SECUREPLATFORM	= 0x20010,
86*5f94f181SJorge Lopez };
87*5f94f181SJorge Lopez 
88*5f94f181SJorge Lopez struct bios_return {
89*5f94f181SJorge Lopez 	u32 sigpass;
90*5f94f181SJorge Lopez 	u32 return_code;
91*5f94f181SJorge Lopez };
92*5f94f181SJorge Lopez 
93*5f94f181SJorge Lopez enum wmi_error_values {
94*5f94f181SJorge Lopez 	SUCCESS				= 0x00,
95*5f94f181SJorge Lopez 	CMD_FAILED			= 0x01,
96*5f94f181SJorge Lopez 	INVALID_SIGN			= 0x02,
97*5f94f181SJorge Lopez 	INVALID_CMD_VALUE		= 0x03,
98*5f94f181SJorge Lopez 	INVALID_CMD_TYPE		= 0x04,
99*5f94f181SJorge Lopez 	INVALID_DATA_SIZE		= 0x05,
100*5f94f181SJorge Lopez 	INVALID_CMD_PARAM		= 0x06,
101*5f94f181SJorge Lopez 	ENCRYP_CMD_REQUIRED		= 0x07,
102*5f94f181SJorge Lopez 	NO_SECURE_SESSION		= 0x08,
103*5f94f181SJorge Lopez 	SECURE_SESSION_FOUND		= 0x09,
104*5f94f181SJorge Lopez 	SECURE_SESSION_FAILED		= 0x0A,
105*5f94f181SJorge Lopez 	AUTH_FAILED			= 0x0B,
106*5f94f181SJorge Lopez 	INVALID_BIOS_AUTH		= 0x0E,
107*5f94f181SJorge Lopez 	NONCE_DID_NOT_MATCH		= 0x18,
108*5f94f181SJorge Lopez 	GENERIC_ERROR			= 0x1C,
109*5f94f181SJorge Lopez 	BIOS_ADMIN_POLICY_NOT_MET	= 0x28,
110*5f94f181SJorge Lopez 	BIOS_ADMIN_NOT_SET		= 0x38,
111*5f94f181SJorge Lopez 	P21_NO_PROVISIONED		= 0x1000,
112*5f94f181SJorge Lopez 	P21_PROVISION_IN_PROGRESS	= 0x1001,
113*5f94f181SJorge Lopez 	P21_IN_USE			= 0x1002,
114*5f94f181SJorge Lopez 	HEP_NOT_ACTIVE			= 0x1004,
115*5f94f181SJorge Lopez 	HEP_ALREADY_SET			= 0x1006,
116*5f94f181SJorge Lopez 	HEP_CHECK_STATE			= 0x1007,
117*5f94f181SJorge Lopez };
118*5f94f181SJorge Lopez 
119*5f94f181SJorge Lopez struct common_data {
120*5f94f181SJorge Lopez 	u8 display_name[MAX_BUFF_SIZE];
121*5f94f181SJorge Lopez 	u8 path[MAX_BUFF_SIZE];
122*5f94f181SJorge Lopez 	u32 is_readonly;
123*5f94f181SJorge Lopez 	u32 display_in_ui;
124*5f94f181SJorge Lopez 	u32 requires_physical_presence;
125*5f94f181SJorge Lopez 	u32 sequence;
126*5f94f181SJorge Lopez 	u32 prerequisites_size;
127*5f94f181SJorge Lopez 	u8 prerequisites[MAX_PREREQUISITES_SIZE][MAX_BUFF_SIZE];
128*5f94f181SJorge Lopez 	u32 security_level;
129*5f94f181SJorge Lopez };
130*5f94f181SJorge Lopez 
131*5f94f181SJorge Lopez struct string_data {
132*5f94f181SJorge Lopez 	struct common_data common;
133*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
134*5f94f181SJorge Lopez 	u8 current_value[MAX_BUFF_SIZE];
135*5f94f181SJorge Lopez 	u8 new_value[MAX_BUFF_SIZE];
136*5f94f181SJorge Lopez 	u32 min_length;
137*5f94f181SJorge Lopez 	u32 max_length;
138*5f94f181SJorge Lopez };
139*5f94f181SJorge Lopez 
140*5f94f181SJorge Lopez struct integer_data {
141*5f94f181SJorge Lopez 	struct common_data common;
142*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
143*5f94f181SJorge Lopez 	u32 current_value;
144*5f94f181SJorge Lopez 	u32 new_value;
145*5f94f181SJorge Lopez 	u32 lower_bound;
146*5f94f181SJorge Lopez 	u32 upper_bound;
147*5f94f181SJorge Lopez 	u32 scalar_increment;
148*5f94f181SJorge Lopez };
149*5f94f181SJorge Lopez 
150*5f94f181SJorge Lopez struct enumeration_data {
151*5f94f181SJorge Lopez 	struct common_data common;
152*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
153*5f94f181SJorge Lopez 	u8 current_value[MAX_BUFF_SIZE];
154*5f94f181SJorge Lopez 	u8 new_value[MAX_BUFF_SIZE];
155*5f94f181SJorge Lopez 	u32 possible_values_size;
156*5f94f181SJorge Lopez 	u8 possible_values[MAX_VALUES_SIZE][MAX_BUFF_SIZE];
157*5f94f181SJorge Lopez };
158*5f94f181SJorge Lopez 
159*5f94f181SJorge Lopez struct ordered_list_data {
160*5f94f181SJorge Lopez 	struct common_data common;
161*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
162*5f94f181SJorge Lopez 	u8 current_value[MAX_BUFF_SIZE];
163*5f94f181SJorge Lopez 	u8 new_value[MAX_BUFF_SIZE];
164*5f94f181SJorge Lopez 	u32 elements_size;
165*5f94f181SJorge Lopez 	u8 elements[MAX_ELEMENTS_SIZE][MAX_BUFF_SIZE];
166*5f94f181SJorge Lopez };
167*5f94f181SJorge Lopez 
168*5f94f181SJorge Lopez struct password_data {
169*5f94f181SJorge Lopez 	struct common_data common;
170*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
171*5f94f181SJorge Lopez 	u8 current_password[MAX_PASSWD_SIZE];
172*5f94f181SJorge Lopez 	u8 new_password[MAX_PASSWD_SIZE];
173*5f94f181SJorge Lopez 	u32 min_password_length;
174*5f94f181SJorge Lopez 	u32 max_password_length;
175*5f94f181SJorge Lopez 	u32 encodings_size;
176*5f94f181SJorge Lopez 	u8 encodings[MAX_ENCODINGS_SIZE][MAX_BUFF_SIZE];
177*5f94f181SJorge Lopez 	bool is_enabled;
178*5f94f181SJorge Lopez 
179*5f94f181SJorge Lopez 	/*
180*5f94f181SJorge Lopez 	 * 'role' identifies the type of authentication.
181*5f94f181SJorge Lopez 	 * Two known types are bios-admin and power-on.
182*5f94f181SJorge Lopez 	 * 'bios-admin' represents BIOS administrator password
183*5f94f181SJorge Lopez 	 * 'power-on' represents a password required to use the system
184*5f94f181SJorge Lopez 	 */
185*5f94f181SJorge Lopez 	u32 role;
186*5f94f181SJorge Lopez 
187*5f94f181SJorge Lopez 	/*
188*5f94f181SJorge Lopez 	 * 'mechanism' represents the means of authentication.
189*5f94f181SJorge Lopez 	 * Only supported type currently is "password"
190*5f94f181SJorge Lopez 	 */
191*5f94f181SJorge Lopez 	u32 mechanism;
192*5f94f181SJorge Lopez };
193*5f94f181SJorge Lopez 
194*5f94f181SJorge Lopez struct secure_platform_data {
195*5f94f181SJorge Lopez 	struct kobject *attr_name_kobj;
196*5f94f181SJorge Lopez 	u8 attribute_name[MAX_BUFF_SIZE];
197*5f94f181SJorge Lopez 	u8 *endorsement_key;
198*5f94f181SJorge Lopez 	u8 *signing_key;
199*5f94f181SJorge Lopez 	u8 *auth_token;
200*5f94f181SJorge Lopez 	bool is_enabled;
201*5f94f181SJorge Lopez 	u32 mechanism;
202*5f94f181SJorge Lopez };
203*5f94f181SJorge Lopez 
204*5f94f181SJorge Lopez struct bioscfg_priv {
205*5f94f181SJorge Lopez 	struct kset *authentication_dir_kset;
206*5f94f181SJorge Lopez 	struct kset *main_dir_kset;
207*5f94f181SJorge Lopez 	struct device *class_dev;
208*5f94f181SJorge Lopez 	struct string_data *string_data;
209*5f94f181SJorge Lopez 	u32 string_instances_count;
210*5f94f181SJorge Lopez 	struct integer_data *integer_data;
211*5f94f181SJorge Lopez 	u32 integer_instances_count;
212*5f94f181SJorge Lopez 	struct enumeration_data *enumeration_data;
213*5f94f181SJorge Lopez 	u32 enumeration_instances_count;
214*5f94f181SJorge Lopez 	struct ordered_list_data *ordered_list_data;
215*5f94f181SJorge Lopez 	u32 ordered_list_instances_count;
216*5f94f181SJorge Lopez 	struct password_data *password_data;
217*5f94f181SJorge Lopez 	u32 password_instances_count;
218*5f94f181SJorge Lopez 
219*5f94f181SJorge Lopez 	struct kobject *sure_start_attr_kobj;
220*5f94f181SJorge Lopez 	struct secure_platform_data spm_data;
221*5f94f181SJorge Lopez 	u8 display_name_language_code[MAX_BUFF_SIZE];
222*5f94f181SJorge Lopez 	bool pending_reboot;
223*5f94f181SJorge Lopez 	struct mutex mutex;
224*5f94f181SJorge Lopez };
225*5f94f181SJorge Lopez 
226*5f94f181SJorge Lopez /* global structure used by multiple WMI interfaces */
227*5f94f181SJorge Lopez extern struct bioscfg_priv bioscfg_drv;
228*5f94f181SJorge Lopez 
229*5f94f181SJorge Lopez enum hp_wmi_data_type {
230*5f94f181SJorge Lopez 	HPWMI_STRING_TYPE,
231*5f94f181SJorge Lopez 	HPWMI_INTEGER_TYPE,
232*5f94f181SJorge Lopez 	HPWMI_ENUMERATION_TYPE,
233*5f94f181SJorge Lopez 	HPWMI_ORDERED_LIST_TYPE,
234*5f94f181SJorge Lopez 	HPWMI_PASSWORD_TYPE,
235*5f94f181SJorge Lopez 	HPWMI_SECURE_PLATFORM_TYPE,
236*5f94f181SJorge Lopez 	HPWMI_SURE_START_TYPE,
237*5f94f181SJorge Lopez };
238*5f94f181SJorge Lopez 
239*5f94f181SJorge Lopez enum hp_wmi_data_elements {
240*5f94f181SJorge Lopez 	/* Common elements */
241*5f94f181SJorge Lopez 	NAME = 0,
242*5f94f181SJorge Lopez 	VALUE = 1,
243*5f94f181SJorge Lopez 	PATH = 2,
244*5f94f181SJorge Lopez 	IS_READONLY = 3,
245*5f94f181SJorge Lopez 	DISPLAY_IN_UI = 4,
246*5f94f181SJorge Lopez 	REQUIRES_PHYSICAL_PRESENCE = 5,
247*5f94f181SJorge Lopez 	SEQUENCE = 6,
248*5f94f181SJorge Lopez 	PREREQUISITES_SIZE = 7,
249*5f94f181SJorge Lopez 	PREREQUISITES = 8,
250*5f94f181SJorge Lopez 	SECURITY_LEVEL = 9,
251*5f94f181SJorge Lopez 
252*5f94f181SJorge Lopez 	/* String elements */
253*5f94f181SJorge Lopez 	STR_MIN_LENGTH = 10,
254*5f94f181SJorge Lopez 	STR_MAX_LENGTH = 11,
255*5f94f181SJorge Lopez 	STR_ELEM_CNT = 12,
256*5f94f181SJorge Lopez 
257*5f94f181SJorge Lopez 	/* Integer elements */
258*5f94f181SJorge Lopez 	INT_LOWER_BOUND = 10,
259*5f94f181SJorge Lopez 	INT_UPPER_BOUND = 11,
260*5f94f181SJorge Lopez 	INT_SCALAR_INCREMENT = 12,
261*5f94f181SJorge Lopez 	INT_ELEM_CNT = 13,
262*5f94f181SJorge Lopez 
263*5f94f181SJorge Lopez 	/* Enumeration elements */
264*5f94f181SJorge Lopez 	ENUM_CURRENT_VALUE = 10,
265*5f94f181SJorge Lopez 	ENUM_SIZE = 11,
266*5f94f181SJorge Lopez 	ENUM_POSSIBLE_VALUES = 12,
267*5f94f181SJorge Lopez 	ENUM_ELEM_CNT = 13,
268*5f94f181SJorge Lopez 
269*5f94f181SJorge Lopez 	/* Ordered list elements */
270*5f94f181SJorge Lopez 	ORD_LIST_SIZE = 10,
271*5f94f181SJorge Lopez 	ORD_LIST_ELEMENTS = 11,
272*5f94f181SJorge Lopez 	ORD_ELEM_CNT = 12,
273*5f94f181SJorge Lopez 
274*5f94f181SJorge Lopez 	/* Password elements */
275*5f94f181SJorge Lopez 	PSWD_MIN_LENGTH = 10,
276*5f94f181SJorge Lopez 	PSWD_MAX_LENGTH = 11,
277*5f94f181SJorge Lopez 	PSWD_SIZE = 12,
278*5f94f181SJorge Lopez 	PSWD_ENCODINGS = 13,
279*5f94f181SJorge Lopez 	PSWD_IS_SET = 14,
280*5f94f181SJorge Lopez 	PSWD_ELEM_CNT = 15,
281*5f94f181SJorge Lopez };
282*5f94f181SJorge Lopez 
283*5f94f181SJorge Lopez #define GET_INSTANCE_ID(type)						\
284*5f94f181SJorge Lopez 	static int get_##type##_instance_id(struct kobject *kobj)	\
285*5f94f181SJorge Lopez 	{								\
286*5f94f181SJorge Lopez 		int i;							\
287*5f94f181SJorge Lopez 									\
288*5f94f181SJorge Lopez 		for (i = 0; i <= bioscfg_drv.type##_instances_count; i++) { \
289*5f94f181SJorge Lopez 			if (!strcmp(kobj->name, bioscfg_drv.type##_data[i].attr_name_kobj->name)) \
290*5f94f181SJorge Lopez 				return i;				\
291*5f94f181SJorge Lopez 		}							\
292*5f94f181SJorge Lopez 		return -EIO;						\
293*5f94f181SJorge Lopez 	}
294*5f94f181SJorge Lopez 
295*5f94f181SJorge Lopez #define ATTRIBUTE_S_PROPERTY_SHOW(name, type)				\
296*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
297*5f94f181SJorge Lopez 				   char *buf)				\
298*5f94f181SJorge Lopez 	{								\
299*5f94f181SJorge Lopez 		int i = get_##type##_instance_id(kobj);			\
300*5f94f181SJorge Lopez 		if (i >= 0)						\
301*5f94f181SJorge Lopez 			return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data[i].name); \
302*5f94f181SJorge Lopez 		return -EIO;						\
303*5f94f181SJorge Lopez 	}
304*5f94f181SJorge Lopez 
305*5f94f181SJorge Lopez #define ATTRIBUTE_N_PROPERTY_SHOW(name, type)				\
306*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
307*5f94f181SJorge Lopez 				   char *buf)				\
308*5f94f181SJorge Lopez 	{								\
309*5f94f181SJorge Lopez 		int i = get_##type##_instance_id(kobj);			\
310*5f94f181SJorge Lopez 		if (i >= 0)						\
311*5f94f181SJorge Lopez 			return sysfs_emit(buf, "%d\n", bioscfg_drv.type##_data[i].name); \
312*5f94f181SJorge Lopez 		return -EIO;						\
313*5f94f181SJorge Lopez 	}
314*5f94f181SJorge Lopez 
315*5f94f181SJorge Lopez #define ATTRIBUTE_PROPERTY_STORE(curr_val, type)			\
316*5f94f181SJorge Lopez 	static ssize_t curr_val##_store(struct kobject *kobj,		\
317*5f94f181SJorge Lopez 					struct kobj_attribute *attr,	\
318*5f94f181SJorge Lopez 					const char *buf, size_t count)	\
319*5f94f181SJorge Lopez 	{								\
320*5f94f181SJorge Lopez 		char *attr_value = NULL;				\
321*5f94f181SJorge Lopez 		int i;							\
322*5f94f181SJorge Lopez 		int ret = -EIO;						\
323*5f94f181SJorge Lopez 									\
324*5f94f181SJorge Lopez 		attr_value = kstrdup(buf, GFP_KERNEL);			\
325*5f94f181SJorge Lopez 		if (!attr_value)					\
326*5f94f181SJorge Lopez 			return -ENOMEM;					\
327*5f94f181SJorge Lopez 									\
328*5f94f181SJorge Lopez 		ret = hp_enforce_single_line_input(attr_value, count);	\
329*5f94f181SJorge Lopez 		if (!ret) {						\
330*5f94f181SJorge Lopez 			i = get_##type##_instance_id(kobj);		\
331*5f94f181SJorge Lopez 			if (i >= 0)					\
332*5f94f181SJorge Lopez 				ret = validate_##type##_input(i, attr_value); \
333*5f94f181SJorge Lopez 		}							\
334*5f94f181SJorge Lopez 		if (!ret)						\
335*5f94f181SJorge Lopez 			ret = hp_set_attribute(kobj->name, attr_value);	\
336*5f94f181SJorge Lopez 		if (!ret) {						\
337*5f94f181SJorge Lopez 			update_##type##_value(i, attr_value);		\
338*5f94f181SJorge Lopez 			if (bioscfg_drv.type##_data[i].common.requires_physical_presence)	\
339*5f94f181SJorge Lopez 				hp_set_reboot_and_signal_event();	\
340*5f94f181SJorge Lopez 		}							\
341*5f94f181SJorge Lopez 		hp_clear_all_credentials();				\
342*5f94f181SJorge Lopez 		kfree(attr_value);					\
343*5f94f181SJorge Lopez 									\
344*5f94f181SJorge Lopez 		return ret ? ret : count;				\
345*5f94f181SJorge Lopez 	}
346*5f94f181SJorge Lopez 
347*5f94f181SJorge Lopez #define ATTRIBUTE_SPM_N_PROPERTY_SHOW(name, type)			\
348*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
349*5f94f181SJorge Lopez 	{								\
350*5f94f181SJorge Lopez 		return sysfs_emit(buf, "%d\n", bioscfg_drv.type##_data.name); \
351*5f94f181SJorge Lopez 	}
352*5f94f181SJorge Lopez 
353*5f94f181SJorge Lopez #define ATTRIBUTE_SPM_S_PROPERTY_SHOW(name, type)			\
354*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
355*5f94f181SJorge Lopez 	{								\
356*5f94f181SJorge Lopez 		return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data.name); \
357*5f94f181SJorge Lopez 	}
358*5f94f181SJorge Lopez 
359*5f94f181SJorge Lopez #define ATTRIBUTE_VALUES_PROPERTY_SHOW(name, type, sep)			\
360*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj,		\
361*5f94f181SJorge Lopez 				   struct kobj_attribute *attr, char *buf) \
362*5f94f181SJorge Lopez 	{								\
363*5f94f181SJorge Lopez 		int i;							\
364*5f94f181SJorge Lopez 		int len = 0;						\
365*5f94f181SJorge Lopez 		int instance_id = get_##type##_instance_id(kobj);	\
366*5f94f181SJorge Lopez 									\
367*5f94f181SJorge Lopez 		if (instance_id < 0)					\
368*5f94f181SJorge Lopez 			return 0;					\
369*5f94f181SJorge Lopez 									\
370*5f94f181SJorge Lopez 		for (i = 0; i < bioscfg_drv.type##_data[instance_id].name##_size; i++) { \
371*5f94f181SJorge Lopez 			if (i)						\
372*5f94f181SJorge Lopez 				len += sysfs_emit_at(buf, len, "%s", sep); \
373*5f94f181SJorge Lopez 									\
374*5f94f181SJorge Lopez 			len += sysfs_emit_at(buf, len, "%s",		\
375*5f94f181SJorge Lopez 					     bioscfg_drv.type##_data[instance_id].name[i]); \
376*5f94f181SJorge Lopez 		}							\
377*5f94f181SJorge Lopez 		len += sysfs_emit_at(buf, len, "\n");			\
378*5f94f181SJorge Lopez 		return len;						\
379*5f94f181SJorge Lopez 	}
380*5f94f181SJorge Lopez 
381*5f94f181SJorge Lopez #define ATTRIBUTE_S_COMMON_PROPERTY_SHOW(name, type)		\
382*5f94f181SJorge Lopez 	static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr, \
383*5f94f181SJorge Lopez 				   char *buf)				\
384*5f94f181SJorge Lopez 	{								\
385*5f94f181SJorge Lopez 		int i = get_##type##_instance_id(kobj);			\
386*5f94f181SJorge Lopez 		if (i >= 0)						\
387*5f94f181SJorge Lopez 			return sysfs_emit(buf, "%s\n", bioscfg_drv.type##_data[i].common.name); \
388*5f94f181SJorge Lopez 		return -EIO;						\
389*5f94f181SJorge Lopez 	}
390*5f94f181SJorge Lopez 
391*5f94f181SJorge Lopez extern struct kobj_attribute common_display_langcode;
392*5f94f181SJorge Lopez 
393*5f94f181SJorge Lopez /* Prototypes */
394*5f94f181SJorge Lopez 
395*5f94f181SJorge Lopez /* String attributes */
396*5f94f181SJorge Lopez int hp_populate_string_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
397*5f94f181SJorge Lopez 				   int instance_id,
398*5f94f181SJorge Lopez 				   struct kobject *attr_name_kobj);
399*5f94f181SJorge Lopez int hp_alloc_string_data(void);
400*5f94f181SJorge Lopez void hp_exit_string_attributes(void);
401*5f94f181SJorge Lopez int hp_populate_string_package_data(union acpi_object *str_obj,
402*5f94f181SJorge Lopez 				    int instance_id,
403*5f94f181SJorge Lopez 				    struct kobject *attr_name_kobj);
404*5f94f181SJorge Lopez 
405*5f94f181SJorge Lopez /* Integer attributes */
406*5f94f181SJorge Lopez int hp_populate_integer_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
407*5f94f181SJorge Lopez 				    int instance_id,
408*5f94f181SJorge Lopez 				    struct kobject *attr_name_kobj);
409*5f94f181SJorge Lopez int hp_alloc_integer_data(void);
410*5f94f181SJorge Lopez void hp_exit_integer_attributes(void);
411*5f94f181SJorge Lopez int hp_populate_integer_package_data(union acpi_object *integer_obj,
412*5f94f181SJorge Lopez 				     int instance_id,
413*5f94f181SJorge Lopez 				     struct kobject *attr_name_kobj);
414*5f94f181SJorge Lopez 
415*5f94f181SJorge Lopez /* Enumeration attributes */
416*5f94f181SJorge Lopez int hp_populate_enumeration_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
417*5f94f181SJorge Lopez 					int instance_id,
418*5f94f181SJorge Lopez 					struct kobject *attr_name_kobj);
419*5f94f181SJorge Lopez int hp_alloc_enumeration_data(void);
420*5f94f181SJorge Lopez void hp_exit_enumeration_attributes(void);
421*5f94f181SJorge Lopez int hp_populate_enumeration_package_data(union acpi_object *enum_obj,
422*5f94f181SJorge Lopez 					 int instance_id,
423*5f94f181SJorge Lopez 					 struct kobject *attr_name_kobj);
424*5f94f181SJorge Lopez 
425*5f94f181SJorge Lopez /* Ordered list */
426*5f94f181SJorge Lopez int hp_populate_ordered_list_buffer_data(u8 *buffer_ptr,
427*5f94f181SJorge Lopez 					 u32 *buffer_size,
428*5f94f181SJorge Lopez 					 int instance_id,
429*5f94f181SJorge Lopez 					 struct kobject *attr_name_kobj);
430*5f94f181SJorge Lopez int hp_alloc_ordered_list_data(void);
431*5f94f181SJorge Lopez void hp_exit_ordered_list_attributes(void);
432*5f94f181SJorge Lopez int hp_populate_ordered_list_package_data(union acpi_object *order_obj,
433*5f94f181SJorge Lopez 					  int instance_id,
434*5f94f181SJorge Lopez 					  struct kobject *attr_name_kobj);
435*5f94f181SJorge Lopez 
436*5f94f181SJorge Lopez /* Password authentication attributes */
437*5f94f181SJorge Lopez int hp_populate_password_buffer_data(u8 *buffer_ptr, u32 *buffer_size,
438*5f94f181SJorge Lopez 				     int instance_id,
439*5f94f181SJorge Lopez 				     struct kobject *attr_name_kobj);
440*5f94f181SJorge Lopez int hp_populate_password_package_data(union acpi_object *password_obj,
441*5f94f181SJorge Lopez 				      int instance_id,
442*5f94f181SJorge Lopez 				      struct kobject *attr_name_kobj);
443*5f94f181SJorge Lopez int hp_alloc_password_data(void);
444*5f94f181SJorge Lopez int hp_get_password_instance_for_type(const char *name);
445*5f94f181SJorge Lopez int hp_clear_all_credentials(void);
446*5f94f181SJorge Lopez int hp_set_attribute(const char *a_name, const char *a_value);
447*5f94f181SJorge Lopez 
448*5f94f181SJorge Lopez /* SPM attributes */
449*5f94f181SJorge Lopez void hp_exit_password_attributes(void);
450*5f94f181SJorge Lopez void hp_exit_secure_platform_attributes(void);
451*5f94f181SJorge Lopez int hp_populate_secure_platform_data(struct kobject *attr_name_kobj);
452*5f94f181SJorge Lopez int hp_populate_security_buffer(u16 *buffer, const char *authentication);
453*5f94f181SJorge Lopez 
454*5f94f181SJorge Lopez /* Bios Attributes interface */
455*5f94f181SJorge Lopez int hp_wmi_set_bios_setting(u16 *input_buffer, u32 input_size);
456*5f94f181SJorge Lopez int hp_wmi_perform_query(int query, enum hp_wmi_command command,
457*5f94f181SJorge Lopez 			 void *buffer, u32 insize, u32 outsize);
458*5f94f181SJorge Lopez 
459*5f94f181SJorge Lopez /* Sure Start attributes */
460*5f94f181SJorge Lopez void hp_exit_sure_start_attributes(void);
461*5f94f181SJorge Lopez int hp_populate_sure_start_data(struct kobject *attr_name_kobj);
462*5f94f181SJorge Lopez 
463*5f94f181SJorge Lopez /* Bioscfg */
464*5f94f181SJorge Lopez 
465*5f94f181SJorge Lopez void hp_exit_attr_set_interface(void);
466*5f94f181SJorge Lopez int hp_init_attr_set_interface(void);
467*5f94f181SJorge Lopez size_t hp_calculate_string_buffer(const char *str);
468*5f94f181SJorge Lopez size_t hp_calculate_security_buffer(const char *authentication);
469*5f94f181SJorge Lopez void *hp_ascii_to_utf16_unicode(u16 *p, const u8 *str);
470*5f94f181SJorge Lopez int hp_get_integer_from_buffer(u8 **buffer, u32 *buffer_size, u32 *integer);
471*5f94f181SJorge Lopez int hp_get_string_from_buffer(u8 **buffer, u32 *buffer_size, char *dst, u32 dst_size);
472*5f94f181SJorge Lopez int hp_convert_hexstr_to_str(const char *input, u32 input_len, char **str, int *len);
473*5f94f181SJorge Lopez int hp_encode_outsize_for_pvsz(int outsize);
474*5f94f181SJorge Lopez int hp_enforce_single_line_input(char *buf, size_t count);
475*5f94f181SJorge Lopez void hp_set_reboot_and_signal_event(void);
476*5f94f181SJorge Lopez ssize_t display_name_language_code_show(struct kobject *kobj,
477*5f94f181SJorge Lopez 					struct kobj_attribute *attr,
478*5f94f181SJorge Lopez 					char *buf);
479*5f94f181SJorge Lopez union acpi_object *hp_get_wmiobj_pointer(int instance_id, const char *guid_string);
480*5f94f181SJorge Lopez int hp_get_instance_count(const char *guid_string);
481*5f94f181SJorge Lopez void hp_update_attribute_permissions(bool isreadonly, struct kobj_attribute *current_val);
482*5f94f181SJorge Lopez void hp_friendly_user_name_update(char *path, const char *attr_name,
483*5f94f181SJorge Lopez 				  char *attr_display, int attr_size);
484*5f94f181SJorge Lopez int hp_wmi_error_and_message(int error_code);
485*5f94f181SJorge Lopez int hp_get_common_data_from_buffer(u8 **buffer_ptr, u32 *buffer_size, struct common_data *common);
486*5f94f181SJorge Lopez 
487*5f94f181SJorge Lopez #endif
488