xref: /openbmc/linux/drivers/platform/x86/dell/dell-wmi-sysman/dell-wmi-sysman.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
1f1e1ea51SMario Limonciello /* SPDX-License-Identifier: GPL-2.0
2f1e1ea51SMario Limonciello  * Definitions for kernel modules using Dell WMI System Management Driver
3f1e1ea51SMario Limonciello  *
4f1e1ea51SMario Limonciello  *  Copyright (c) 2020 Dell Inc.
5f1e1ea51SMario Limonciello  */
6f1e1ea51SMario Limonciello 
7f1e1ea51SMario Limonciello #ifndef _DELL_WMI_BIOS_ATTR_H_
8f1e1ea51SMario Limonciello #define _DELL_WMI_BIOS_ATTR_H_
9f1e1ea51SMario Limonciello 
10f1e1ea51SMario Limonciello #include <linux/wmi.h>
11f1e1ea51SMario Limonciello #include <linux/device.h>
12f1e1ea51SMario Limonciello #include <linux/module.h>
13f1e1ea51SMario Limonciello #include <linux/kernel.h>
14f1e1ea51SMario Limonciello #include <linux/capability.h>
15f1e1ea51SMario Limonciello 
16f1e1ea51SMario Limonciello #define DRIVER_NAME					"dell-wmi-sysman"
17f1e1ea51SMario Limonciello #define MAX_BUFF  512
18f1e1ea51SMario Limonciello 
19f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_ENUMERATION_ATTRIBUTE_GUID	"F1DDEE52-063C-4784-A11E-8A06684B9BF5"
20f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_INTEGER_ATTRIBUTE_GUID		"F1DDEE52-063C-4784-A11E-8A06684B9BFA"
21f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_STRING_ATTRIBUTE_GUID		"F1DDEE52-063C-4784-A11E-8A06684B9BF9"
22f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_PASSOBJ_ATTRIBUTE_GUID		"0894B8D6-44A6-4719-97D7-6AD24108BFD4"
23f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_ATTRIBUTES_INTERFACE_GUID		"F1DDEE52-063C-4784-A11E-8A06684B9BF4"
24f1e1ea51SMario Limonciello #define DELL_WMI_BIOS_PASSWORD_INTERFACE_GUID		"70FE8229-D03B-4214-A1C6-1F884B1A892A"
25f1e1ea51SMario Limonciello 
26f1e1ea51SMario Limonciello struct enumeration_data {
27f1e1ea51SMario Limonciello 	struct kobject *attr_name_kobj;
28f1e1ea51SMario Limonciello 	char display_name_language_code[MAX_BUFF];
29f1e1ea51SMario Limonciello 	char dell_value_modifier[MAX_BUFF];
30f1e1ea51SMario Limonciello 	char possible_values[MAX_BUFF];
31f1e1ea51SMario Limonciello 	char attribute_name[MAX_BUFF];
32f1e1ea51SMario Limonciello 	char default_value[MAX_BUFF];
33f1e1ea51SMario Limonciello 	char dell_modifier[MAX_BUFF];
34f1e1ea51SMario Limonciello 	char display_name[MAX_BUFF];
35f1e1ea51SMario Limonciello };
36f1e1ea51SMario Limonciello 
37f1e1ea51SMario Limonciello struct integer_data {
38f1e1ea51SMario Limonciello 	struct kobject *attr_name_kobj;
39f1e1ea51SMario Limonciello 	char display_name_language_code[MAX_BUFF];
40f1e1ea51SMario Limonciello 	char attribute_name[MAX_BUFF];
41f1e1ea51SMario Limonciello 	char dell_modifier[MAX_BUFF];
42f1e1ea51SMario Limonciello 	char display_name[MAX_BUFF];
43f1e1ea51SMario Limonciello 	int scalar_increment;
44f1e1ea51SMario Limonciello 	int default_value;
45f1e1ea51SMario Limonciello 	int min_value;
46f1e1ea51SMario Limonciello 	int max_value;
47f1e1ea51SMario Limonciello };
48f1e1ea51SMario Limonciello 
49f1e1ea51SMario Limonciello struct str_data {
50f1e1ea51SMario Limonciello 	struct kobject *attr_name_kobj;
51f1e1ea51SMario Limonciello 	char display_name_language_code[MAX_BUFF];
52f1e1ea51SMario Limonciello 	char attribute_name[MAX_BUFF];
53f1e1ea51SMario Limonciello 	char display_name[MAX_BUFF];
54f1e1ea51SMario Limonciello 	char default_value[MAX_BUFF];
55f1e1ea51SMario Limonciello 	char dell_modifier[MAX_BUFF];
56f1e1ea51SMario Limonciello 	int min_length;
57f1e1ea51SMario Limonciello 	int max_length;
58f1e1ea51SMario Limonciello };
59f1e1ea51SMario Limonciello 
60f1e1ea51SMario Limonciello struct po_data {
61f1e1ea51SMario Limonciello 	struct kobject *attr_name_kobj;
62f1e1ea51SMario Limonciello 	char attribute_name[MAX_BUFF];
63f1e1ea51SMario Limonciello 	int min_password_length;
64f1e1ea51SMario Limonciello 	int max_password_length;
65f1e1ea51SMario Limonciello };
66f1e1ea51SMario Limonciello 
67f1e1ea51SMario Limonciello struct wmi_sysman_priv {
68f1e1ea51SMario Limonciello 	char current_admin_password[MAX_BUFF];
69f1e1ea51SMario Limonciello 	char current_system_password[MAX_BUFF];
70f1e1ea51SMario Limonciello 	struct wmi_device *password_attr_wdev;
71f1e1ea51SMario Limonciello 	struct wmi_device *bios_attr_wdev;
72f1e1ea51SMario Limonciello 	struct kset *authentication_dir_kset;
73f1e1ea51SMario Limonciello 	struct kset *main_dir_kset;
74f1e1ea51SMario Limonciello 	struct device *class_dev;
75f1e1ea51SMario Limonciello 	struct enumeration_data *enumeration_data;
76f1e1ea51SMario Limonciello 	int enumeration_instances_count;
77f1e1ea51SMario Limonciello 	struct integer_data *integer_data;
78f1e1ea51SMario Limonciello 	int integer_instances_count;
79f1e1ea51SMario Limonciello 	struct str_data *str_data;
80f1e1ea51SMario Limonciello 	int str_instances_count;
81f1e1ea51SMario Limonciello 	struct po_data *po_data;
82f1e1ea51SMario Limonciello 	int po_instances_count;
83f1e1ea51SMario Limonciello 	bool pending_changes;
84f1e1ea51SMario Limonciello 	struct mutex mutex;
85f1e1ea51SMario Limonciello };
86f1e1ea51SMario Limonciello 
87f1e1ea51SMario Limonciello /* global structure used by multiple WMI interfaces */
88f1e1ea51SMario Limonciello extern struct wmi_sysman_priv wmi_priv;
89f1e1ea51SMario Limonciello 
90f1e1ea51SMario Limonciello enum { ENUM, INT, STR, PO };
91f1e1ea51SMario Limonciello 
92f1e1ea51SMario Limonciello enum {
93f1e1ea51SMario Limonciello 	ATTR_NAME,
94f1e1ea51SMario Limonciello 	DISPL_NAME_LANG_CODE,
95f1e1ea51SMario Limonciello 	DISPLAY_NAME,
96f1e1ea51SMario Limonciello 	DEFAULT_VAL,
97f1e1ea51SMario Limonciello 	CURRENT_VAL,
98f1e1ea51SMario Limonciello 	MODIFIER
99f1e1ea51SMario Limonciello };
100f1e1ea51SMario Limonciello 
101f1e1ea51SMario Limonciello #define get_instance_id(type)							\
102f1e1ea51SMario Limonciello static int get_##type##_instance_id(struct kobject *kobj)			\
103f1e1ea51SMario Limonciello {										\
104f1e1ea51SMario Limonciello 	int i;									\
105f1e1ea51SMario Limonciello 	for (i = 0; i <= wmi_priv.type##_instances_count; i++) {		\
106f1e1ea51SMario Limonciello 		if (!(strcmp(kobj->name, wmi_priv.type##_data[i].attribute_name)))\
107f1e1ea51SMario Limonciello 			return i;						\
108f1e1ea51SMario Limonciello 	}									\
109f1e1ea51SMario Limonciello 	return -EIO;								\
110f1e1ea51SMario Limonciello }
111f1e1ea51SMario Limonciello 
112f1e1ea51SMario Limonciello #define attribute_s_property_show(name, type)					\
113f1e1ea51SMario Limonciello static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr,	\
114f1e1ea51SMario Limonciello 			   char *buf)						\
115f1e1ea51SMario Limonciello {										\
116f1e1ea51SMario Limonciello 	int i = get_##type##_instance_id(kobj);					\
117f1e1ea51SMario Limonciello 	if (i >= 0)								\
118f1e1ea51SMario Limonciello 		return sprintf(buf, "%s\n", wmi_priv.type##_data[i].name);	\
119f1e1ea51SMario Limonciello 	return 0;								\
120f1e1ea51SMario Limonciello }
121f1e1ea51SMario Limonciello 
122f1e1ea51SMario Limonciello #define attribute_n_property_show(name, type)					\
123f1e1ea51SMario Limonciello static ssize_t name##_show(struct kobject *kobj, struct kobj_attribute *attr,	\
124f1e1ea51SMario Limonciello 			   char *buf)						\
125f1e1ea51SMario Limonciello {										\
126f1e1ea51SMario Limonciello 	int i = get_##type##_instance_id(kobj);					\
127f1e1ea51SMario Limonciello 	if (i >= 0)								\
128f1e1ea51SMario Limonciello 		return sprintf(buf, "%d\n", wmi_priv.type##_data[i].name);	\
129f1e1ea51SMario Limonciello 	return 0;								\
130f1e1ea51SMario Limonciello }
131f1e1ea51SMario Limonciello 
132f1e1ea51SMario Limonciello #define attribute_property_store(curr_val, type)				\
133f1e1ea51SMario Limonciello static ssize_t curr_val##_store(struct kobject *kobj,				\
134f1e1ea51SMario Limonciello 				struct kobj_attribute *attr,			\
135f1e1ea51SMario Limonciello 				const char *buf, size_t count)			\
136f1e1ea51SMario Limonciello {										\
137f1e1ea51SMario Limonciello 	char *p, *buf_cp;							\
138f1e1ea51SMario Limonciello 	int i, ret = -EIO;							\
139f1e1ea51SMario Limonciello 	buf_cp = kstrdup(buf, GFP_KERNEL);					\
140f1e1ea51SMario Limonciello 	if (!buf_cp)								\
141f1e1ea51SMario Limonciello 		return -ENOMEM;							\
142f1e1ea51SMario Limonciello 	p = memchr(buf_cp, '\n', count);					\
143f1e1ea51SMario Limonciello 										\
144f1e1ea51SMario Limonciello 	if (p != NULL)								\
145f1e1ea51SMario Limonciello 		*p = '\0';							\
146f1e1ea51SMario Limonciello 	i = get_##type##_instance_id(kobj);					\
147f1e1ea51SMario Limonciello 	if (i >= 0)								\
148f1e1ea51SMario Limonciello 		ret = validate_##type##_input(i, buf_cp);			\
149f1e1ea51SMario Limonciello 	if (!ret)								\
150f1e1ea51SMario Limonciello 		ret = set_attribute(kobj->name, buf_cp);			\
151f1e1ea51SMario Limonciello 	kfree(buf_cp);								\
152f1e1ea51SMario Limonciello 	return ret ? ret : count;						\
153f1e1ea51SMario Limonciello }
154f1e1ea51SMario Limonciello 
155*97be86e3SPrasanth KSR #define check_property_type(attr, prop, valuetype)				\
156*97be86e3SPrasanth KSR 	(attr##_obj[prop].type != valuetype)
157*97be86e3SPrasanth KSR 
158f1e1ea51SMario Limonciello union acpi_object *get_wmiobj_pointer(int instance_id, const char *guid_string);
159f1e1ea51SMario Limonciello int get_instance_count(const char *guid_string);
160f1e1ea51SMario Limonciello void strlcpy_attr(char *dest, char *src);
161f1e1ea51SMario Limonciello 
162f1e1ea51SMario Limonciello int populate_enum_data(union acpi_object *enumeration_obj, int instance_id,
163*97be86e3SPrasanth KSR 			struct kobject *attr_name_kobj, u32 enum_property_count);
164f1e1ea51SMario Limonciello int alloc_enum_data(void);
165f1e1ea51SMario Limonciello void exit_enum_attributes(void);
166f1e1ea51SMario Limonciello 
167f1e1ea51SMario Limonciello int populate_int_data(union acpi_object *integer_obj, int instance_id,
168f1e1ea51SMario Limonciello 			struct kobject *attr_name_kobj);
169f1e1ea51SMario Limonciello int alloc_int_data(void);
170f1e1ea51SMario Limonciello void exit_int_attributes(void);
171f1e1ea51SMario Limonciello 
172f1e1ea51SMario Limonciello int populate_str_data(union acpi_object *str_obj, int instance_id, struct kobject *attr_name_kobj);
173f1e1ea51SMario Limonciello int alloc_str_data(void);
174f1e1ea51SMario Limonciello void exit_str_attributes(void);
175f1e1ea51SMario Limonciello 
176f1e1ea51SMario Limonciello int populate_po_data(union acpi_object *po_obj, int instance_id, struct kobject *attr_name_kobj);
177f1e1ea51SMario Limonciello int alloc_po_data(void);
178f1e1ea51SMario Limonciello void exit_po_attributes(void);
179f1e1ea51SMario Limonciello 
180f1e1ea51SMario Limonciello int set_attribute(const char *a_name, const char *a_value);
181f1e1ea51SMario Limonciello int set_bios_defaults(u8 defType);
182f1e1ea51SMario Limonciello 
183f1e1ea51SMario Limonciello void exit_bios_attr_set_interface(void);
184f1e1ea51SMario Limonciello int init_bios_attr_set_interface(void);
185f1e1ea51SMario Limonciello int map_wmi_error(int error_code);
186f1e1ea51SMario Limonciello size_t calculate_string_buffer(const char *str);
187f1e1ea51SMario Limonciello size_t calculate_security_buffer(char *authentication);
188f1e1ea51SMario Limonciello void populate_security_buffer(char *buffer, char *authentication);
189f1e1ea51SMario Limonciello ssize_t populate_string_buffer(char *buffer, size_t buffer_len, const char *str);
190f1e1ea51SMario Limonciello int set_new_password(const char *password_type, const char *new);
191f1e1ea51SMario Limonciello int init_bios_attr_pass_interface(void);
192f1e1ea51SMario Limonciello void exit_bios_attr_pass_interface(void);
193f1e1ea51SMario Limonciello 
194f1e1ea51SMario Limonciello #endif
195