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