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