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