* [PATCH 0/2] i8k.c => dell-smm-hwmon.c @ 2015-03-28 10:24 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c and allows to compile hwmon driver without /proc/i8k file. Pali Rohár (2): hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k MAINTAINERS | 3 +- arch/x86/Kconfig | 25 +- drivers/char/Makefile | 1 - drivers/char/i8k.c | 1005 --------------------------------------- drivers/hwmon/Kconfig | 11 + drivers/hwmon/Makefile | 1 + drivers/hwmon/dell-smm-hwmon.c | 1019 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1042 insertions(+), 1023 deletions(-) delete mode 100644 drivers/char/i8k.c create mode 100644 drivers/hwmon/dell-smm-hwmon.c -- 1.7.9.5 ^ permalink raw reply [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH 0/2] i8k.c => dell-smm-hwmon.c @ 2015-03-28 10:24 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzZXJpZXMgbW92ZXMgZHJpdmVycy9jaGFyL2k4ay5jIHRvIGRyaXZlcnMvaHdt b24vZGVsbC1zbW0taHdtb24uYwphbmQgYWxsb3dzIHRvIGNvbXBpbGUgaHdtb24gZHJpdmVyIHdp dGhvdXQgL3Byb2MvaThrIGZpbGUuCgpQYWxpIFJvaMOhciAoMik6CiAgaHdtb246IFJlbmFtZSBp OGsgZHJpdmVyIHRvIGRlbGwtc21tLWh3bW9uIGFuZCBtb3ZlIGl0IHRvIGh3bW9uIHRyZWUKICBo d21vbjogQWxsb3cgdG8gY29tcGlsZSBkZWxsLXNtbS1od21vbiBkcml2ZXIgd2l0aG91dCAvcHJv Yy9pOGsKCiBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICAzICstCiBhcmNoL3g4 Ni9LY29uZmlnICAgICAgICAgICAgICAgfCAgIDI1ICstCiBkcml2ZXJzL2NoYXIvTWFrZWZpbGUg ICAgICAgICAgfCAgICAxIC0KIGRyaXZlcnMvY2hhci9pOGsuYyAgICAgICAgICAgICB8IDEwMDUg LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2h3bW9uL0tj b25maWcgICAgICAgICAgfCAgIDExICsKIGRyaXZlcnMvaHdtb24vTWFrZWZpbGUgICAgICAgICB8 ICAgIDEgKwogZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgMTAxOSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA3IGZpbGVzIGNoYW5nZWQsIDEwNDIgaW5z ZXJ0aW9ucygrKSwgMTAyMyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2NoYXIvaThrLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3 bW9uLmMKCi0tIAoxLjcuOS41CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3Jz Lm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5z b3Jz ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-28 10:24 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is better name then abbreviation i8k. For backward compatibility is added macro MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K compile option was not changed. This commit also adds me as maintainer of this new dell-smm-hwmon driver. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- MAINTAINERS | 3 +- drivers/char/Makefile | 1 - drivers/char/i8k.c | 1005 --------------------------------------- drivers/hwmon/Makefile | 1 + drivers/hwmon/dell-smm-hwmon.c | 1007 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1010 insertions(+), 1007 deletions(-) delete mode 100644 drivers/char/i8k.c create mode 100644 drivers/hwmon/dell-smm-hwmon.c diff --git a/MAINTAINERS b/MAINTAINERS index 88c09ca..bf5bb05 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3064,8 +3064,9 @@ F: drivers/platform/x86/dell-laptop.c DELL LAPTOP SMM DRIVER M: Guenter Roeck <linux@roeck-us.net> +M: Pali Rohár <pali.rohar@gmail.com> S: Maintained -F: drivers/char/i8k.c +F: drivers/hwmon/dell-smm-hwmon.c F: include/uapi/linux/i8k.h DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) diff --git a/drivers/char/Makefile b/drivers/char/Makefile index d06cde26..1d9cf00 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -36,7 +36,6 @@ else obj-$(CONFIG_NVRAM) += nvram.o endif obj-$(CONFIG_TOSHIBA) += toshiba.o -obj-$(CONFIG_I8K) += i8k.o obj-$(CONFIG_DS1620) += ds1620.o obj-$(CONFIG_HW_RANDOM) += hw_random/ obj-$(CONFIG_PPDEV) += ppdev.o diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c deleted file mode 100644 index 24cc4ed..0000000 --- a/drivers/char/i8k.c +++ /dev/null @@ -1,1005 +0,0 @@ -/* - * i8k.c -- Linux driver for accessing the SMM BIOS on Dell laptops. - * - * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> - * - * Hwmon integration: - * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> - * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> - * Copyright (C) 2014 Pali Rohár <pali.rohar@gmail.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/delay.h> -#include <linux/module.h> -#include <linux/types.h> -#include <linux/init.h> -#include <linux/proc_fs.h> -#include <linux/seq_file.h> -#include <linux/dmi.h> -#include <linux/capability.h> -#include <linux/mutex.h> -#include <linux/hwmon.h> -#include <linux/hwmon-sysfs.h> -#include <linux/uaccess.h> -#include <linux/io.h> -#include <linux/sched.h> - -#include <linux/i8k.h> - -#define I8K_SMM_FN_STATUS 0x0025 -#define I8K_SMM_POWER_STATUS 0x0069 -#define I8K_SMM_SET_FAN 0x01a3 -#define I8K_SMM_GET_FAN 0x00a3 -#define I8K_SMM_GET_SPEED 0x02a3 -#define I8K_SMM_GET_FAN_TYPE 0x03a3 -#define I8K_SMM_GET_NOM_SPEED 0x04a3 -#define I8K_SMM_GET_TEMP 0x10a3 -#define I8K_SMM_GET_TEMP_TYPE 0x11a3 -#define I8K_SMM_GET_DELL_SIG1 0xfea3 -#define I8K_SMM_GET_DELL_SIG2 0xffa3 - -#define I8K_FAN_MULT 30 -#define I8K_FAN_MAX_RPM 30000 -#define I8K_MAX_TEMP 127 - -#define I8K_FN_NONE 0x00 -#define I8K_FN_UP 0x01 -#define I8K_FN_DOWN 0x02 -#define I8K_FN_MUTE 0x04 -#define I8K_FN_MASK 0x07 -#define I8K_FN_SHIFT 8 - -#define I8K_POWER_AC 0x05 -#define I8K_POWER_BATTERY 0x01 - -static DEFINE_MUTEX(i8k_mutex); -static char bios_version[4]; -static struct device *i8k_hwmon_dev; -static u32 i8k_hwmon_flags; -static uint i8k_fan_mult = I8K_FAN_MULT; -static uint i8k_pwm_mult; -static uint i8k_fan_max = I8K_FAN_HIGH; - -#define I8K_HWMON_HAVE_TEMP1 (1 << 0) -#define I8K_HWMON_HAVE_TEMP2 (1 << 1) -#define I8K_HWMON_HAVE_TEMP3 (1 << 2) -#define I8K_HWMON_HAVE_TEMP4 (1 << 3) -#define I8K_HWMON_HAVE_FAN1 (1 << 4) -#define I8K_HWMON_HAVE_FAN2 (1 << 5) - -MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); -MODULE_LICENSE("GPL"); - -static bool force; -module_param(force, bool, 0); -MODULE_PARM_DESC(force, "Force loading without checking for supported models"); - -static bool ignore_dmi; -module_param(ignore_dmi, bool, 0); -MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); - -static bool restricted; -module_param(restricted, bool, 0); -MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); - -static bool power_status; -module_param(power_status, bool, 0600); -MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); - -static uint fan_mult; -module_param(fan_mult, uint, 0); -MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); - -static uint fan_max; -module_param(fan_max, uint, 0); -MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); - -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - -struct smm_regs { - unsigned int eax; - unsigned int ebx __packed; - unsigned int ecx __packed; - unsigned int edx __packed; - unsigned int esi __packed; - unsigned int edi __packed; -}; - -static inline const char *i8k_get_dmi_data(int field) -{ - const char *dmi_data = dmi_get_system_info(field); - - return dmi_data && *dmi_data ? dmi_data : "?"; -} - -/* - * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. - */ -static int i8k_smm(struct smm_regs *regs) -{ - int rc; - int eax = regs->eax; - cpumask_var_t old_mask; - - /* SMM requires CPU 0 */ - if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) - return -ENOMEM; - cpumask_copy(old_mask, ¤t->cpus_allowed); - rc = set_cpus_allowed_ptr(current, cpumask_of(0)); - if (rc) - goto out; - if (smp_processor_id() != 0) { - rc = -EBUSY; - goto out; - } - -#if defined(CONFIG_X86_64) - asm volatile("pushq %%rax\n\t" - "movl 0(%%rax),%%edx\n\t" - "pushq %%rdx\n\t" - "movl 4(%%rax),%%ebx\n\t" - "movl 8(%%rax),%%ecx\n\t" - "movl 12(%%rax),%%edx\n\t" - "movl 16(%%rax),%%esi\n\t" - "movl 20(%%rax),%%edi\n\t" - "popq %%rax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgq %%rax,(%%rsp)\n\t" - "movl %%ebx,4(%%rax)\n\t" - "movl %%ecx,8(%%rax)\n\t" - "movl %%edx,12(%%rax)\n\t" - "movl %%esi,16(%%rax)\n\t" - "movl %%edi,20(%%rax)\n\t" - "popq %%rdx\n\t" - "movl %%edx,0(%%rax)\n\t" - "pushfq\n\t" - "popq %%rax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#else - asm volatile("pushl %%eax\n\t" - "movl 0(%%eax),%%edx\n\t" - "push %%edx\n\t" - "movl 4(%%eax),%%ebx\n\t" - "movl 8(%%eax),%%ecx\n\t" - "movl 12(%%eax),%%edx\n\t" - "movl 16(%%eax),%%esi\n\t" - "movl 20(%%eax),%%edi\n\t" - "popl %%eax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgl %%eax,(%%esp)\n\t" - "movl %%ebx,4(%%eax)\n\t" - "movl %%ecx,8(%%eax)\n\t" - "movl %%edx,12(%%eax)\n\t" - "movl %%esi,16(%%eax)\n\t" - "movl %%edi,20(%%eax)\n\t" - "popl %%edx\n\t" - "movl %%edx,0(%%eax)\n\t" - "lahf\n\t" - "shrl $8,%%eax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#endif - if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) - rc = -EINVAL; - -out: - set_cpus_allowed_ptr(current, old_mask); - free_cpumask_var(old_mask); - return rc; -} - -/* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* - * Read the fan status. - */ -static int i8k_get_fan_status(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan speed in RPM. - */ -static int i8k_get_fan_speed(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Read the fan type. - */ -static int i8k_get_fan_type(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan nominal rpm for specific fan speed. - */ -static int i8k_get_fan_nominal_speed(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; - - regs.ebx = (fan & 0xff) | (speed << 8); - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Set the fan speed (off, low, high). Returns the new fan status. - */ -static int i8k_set_fan(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; - - speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); - regs.ebx = (fan & 0xff) | (speed << 8); - - return i8k_smm(®s) ? : i8k_get_fan_status(fan); -} - -static int i8k_get_temp_type(int sensor) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; - - regs.ebx = sensor & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the cpu temperature. - */ -static int _i8k_get_temp(int sensor) -{ - struct smm_regs regs = { - .eax = I8K_SMM_GET_TEMP, - .ebx = sensor & 0xff, - }; - - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -static int i8k_get_temp(int sensor) -{ - int temp = _i8k_get_temp(sensor); - - /* - * Sometimes the temperature sensor returns 0x99, which is out of range. - * In this case we retry (once) before returning an error. - # 1003655137 00000058 00005a4b - # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees - # 1003655139 00000054 00005c52 - */ - if (temp == 0x99) { - msleep(100); - temp = _i8k_get_temp(sensor); - } - /* - * Return -ENODATA for all invalid temperatures. - * - * Known instances are the 0x99 value as seen above as well as - * 0xc1 (193), which may be returned when trying to read the GPU - * temperature if the system supports a GPU and it is currently - * turned off. - */ - if (temp > I8K_MAX_TEMP) - return -ENODATA; - - return temp; -} - -static int i8k_get_dell_signature(int req_fn) -{ - struct smm_regs regs = { .eax = req_fn, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; -} - -static int -i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) -{ - int val = 0; - int speed; - unsigned char buff[16]; - int __user *argp = (int __user *)arg; - - if (!argp) - return -EINVAL; - - switch (cmd) { - case I8K_BIOS_VERSION: - val = (bios_version[0] << 16) | - (bios_version[1] << 8) | bios_version[2]; - break; - - case I8K_MACHINE_ID: - memset(buff, 0, 16); - strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - sizeof(buff)); - break; - - case I8K_FN_STATUS: - val = i8k_get_fn_status(); - break; - - case I8K_POWER_STATUS: - val = i8k_get_power_status(); - break; - - case I8K_GET_TEMP: - val = i8k_get_temp(0); - break; - - case I8K_GET_SPEED: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_speed(val); - break; - - case I8K_GET_FAN: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_status(val); - break; - - case I8K_SET_FAN: - if (restricted && !capable(CAP_SYS_ADMIN)) - return -EPERM; - - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - if (copy_from_user(&speed, argp + 1, sizeof(int))) - return -EFAULT; - - val = i8k_set_fan(val, speed); - break; - - default: - return -EINVAL; - } - - if (val < 0) - return val; - - switch (cmd) { - case I8K_BIOS_VERSION: - if (copy_to_user(argp, &val, 4)) - return -EFAULT; - - break; - case I8K_MACHINE_ID: - if (copy_to_user(argp, buff, 16)) - return -EFAULT; - - break; - default: - if (copy_to_user(argp, &val, sizeof(int))) - return -EFAULT; - - break; - } - - return 0; -} - -static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) -{ - long ret; - - mutex_lock(&i8k_mutex); - ret = i8k_ioctl_unlocked(fp, cmd, arg); - mutex_unlock(&i8k_mutex); - - return ret; -} - -/* - * Print the information for /proc/i8k. - */ -static int i8k_proc_show(struct seq_file *seq, void *offset) -{ - int fn_key, cpu_temp, ac_power; - int left_fan, right_fan, left_speed, right_speed; - - cpu_temp = i8k_get_temp(0); /* 11100 µs */ - left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ - right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ - left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ - right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ - fn_key = i8k_get_fn_status(); /* 750 µs */ - if (power_status) - ac_power = i8k_get_power_status(); /* 14700 µs */ - else - ac_power = -1; - - /* - * Info: - * - * 1) Format version (this will change if format changes) - * 2) BIOS version - * 3) BIOS machine ID - * 4) Cpu temperature - * 5) Left fan status - * 6) Right fan status - * 7) Left fan speed - * 8) Right fan speed - * 9) AC power - * 10) Fn Key status - */ - return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", - I8K_PROC_FMT, - bios_version, - i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - cpu_temp, - left_fan, right_fan, left_speed, right_speed, - ac_power, fn_key); -} - -static int i8k_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, i8k_proc_show, NULL); -} - - -/* - * Hwmon interface - */ - -static ssize_t i8k_hwmon_show_temp_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "CPU", - "GPU", - "SODIMM", - "Other", - "Ambient", - "Other", - }; - int index = to_sensor_dev_attr(devattr)->index; - int type; - - type = i8k_get_temp_type(index); - if (type < 0) - return type; - if (type >= ARRAY_SIZE(labels)) - type = ARRAY_SIZE(labels) - 1; - return sprintf(buf, "%s\n", labels[type]); -} - -static ssize_t i8k_hwmon_show_temp(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int temp; - - temp = i8k_get_temp(index); - if (temp < 0) - return temp; - return sprintf(buf, "%d\n", temp * 1000); -} - -static ssize_t i8k_hwmon_show_fan_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "Processor Fan", - "Motherboard Fan", - "Video Fan", - "Power Supply Fan", - "Chipset Fan", - "Other Fan", - }; - int index = to_sensor_dev_attr(devattr)->index; - bool dock = false; - int type; - - type = i8k_get_fan_type(index); - if (type < 0) - return type; - - if (type & 0x10) { - dock = true; - type &= 0x0F; - } - - if (type >= ARRAY_SIZE(labels)) - type = (ARRAY_SIZE(labels) - 1); - - return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); -} - -static ssize_t i8k_hwmon_show_fan(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int fan_speed; - - fan_speed = i8k_get_fan_speed(index); - if (fan_speed < 0) - return fan_speed; - return sprintf(buf, "%d\n", fan_speed); -} - -static ssize_t i8k_hwmon_show_pwm(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int status; - - status = i8k_get_fan_status(index); - if (status < 0) - return -EIO; - return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); -} - -static ssize_t i8k_hwmon_set_pwm(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int index = to_sensor_dev_attr(attr)->index; - unsigned long val; - int err; - - err = kstrtoul(buf, 10, &val); - if (err) - return err; - val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); - - mutex_lock(&i8k_mutex); - err = i8k_set_fan(index, val); - mutex_unlock(&i8k_mutex); - - return err < 0 ? -EIO : count; -} - -static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); -static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); -static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); -static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 2); -static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); -static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 3); -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); -static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 0); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, - 1); -static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 1); - -static struct attribute *i8k_attrs[] = { - &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ - &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ - &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ - &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ - &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ - &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ - &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ - &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ - &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ - &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ - &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ - &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ - &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ - &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ - NULL -}; - -static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, - int index) -{ - if (index >= 0 && index <= 1 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) - return 0; - if (index >= 2 && index <= 3 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) - return 0; - if (index >= 4 && index <= 5 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) - return 0; - if (index >= 6 && index <= 7 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) - return 0; - if (index >= 8 && index <= 10 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) - return 0; - if (index >= 11 && index <= 13 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) - return 0; - - return attr->mode; -} - -static const struct attribute_group i8k_group = { - .attrs = i8k_attrs, - .is_visible = i8k_is_visible, -}; -__ATTRIBUTE_GROUPS(i8k); - -static int __init i8k_init_hwmon(void) -{ - int err; - - i8k_hwmon_flags = 0; - - /* CPU temperature attributes, if temperature type is OK */ - err = i8k_get_temp_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; - /* check for additional temperature sensors */ - err = i8k_get_temp_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; - err = i8k_get_temp_type(2); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; - err = i8k_get_temp_type(3); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; - - /* First fan attributes, if fan type is OK */ - err = i8k_get_fan_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; - - /* Second fan attributes, if fan type is OK */ - err = i8k_get_fan_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); - if (IS_ERR(i8k_hwmon_dev)) { - err = PTR_ERR(i8k_hwmon_dev); - i8k_hwmon_dev = NULL; - pr_err("hwmon registration failed (%d)\n", err); - return err; - } - return 0; -} - -struct i8k_config_data { - uint fan_mult; - uint fan_max; -}; - -enum i8k_configs { - DELL_LATITUDE_D520, - DELL_PRECISION_490, - DELL_STUDIO, - DELL_XPS, -}; - -static const struct i8k_config_data i8k_config_data[] = { - [DELL_LATITUDE_D520] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_PRECISION_490] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_STUDIO] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, - [DELL_XPS] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, -}; - -static struct dmi_system_id i8k_dmi_table[] __initdata = { - { - .ident = "Dell Inspiron", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { - .ident = "Dell Inspiron 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude D520", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), - }, - .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], - }, - { - .ident = "Dell Latitude 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { /* UK Inspiron 6400 */ - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), - }, - }, - { - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), - }, - }, - { - .ident = "Dell Precision 490", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, - "Precision WorkStation 490"), - }, - .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], - }, - { - .ident = "Dell Precision", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), - }, - }, - { - .ident = "Dell Vostro", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), - }, - }, - { - .ident = "Dell XPS421", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), - }, - }, - { - .ident = "Dell Studio", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), - }, - .driver_data = (void *)&i8k_config_data[DELL_STUDIO], - }, - { - .ident = "Dell XPS 13", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { - .ident = "Dell XPS M140", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { } -}; - -MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); - -/* - * Probe for the presence of a supported laptop. - */ -static int __init i8k_probe(void) -{ - const struct dmi_system_id *id; - int fan, ret; - - /* - * Get DMI information - */ - if (!dmi_check_system(i8k_dmi_table)) { - if (!ignore_dmi && !force) - return -ENODEV; - - pr_info("not running on a supported Dell system.\n"); - pr_info("vendor=%s, model=%s, version=%s\n", - i8k_get_dmi_data(DMI_SYS_VENDOR), - i8k_get_dmi_data(DMI_PRODUCT_NAME), - i8k_get_dmi_data(DMI_BIOS_VERSION)); - } - - strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), - sizeof(bios_version)); - - /* - * Get SMM Dell signature - */ - if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && - i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { - pr_err("unable to get SMM Dell signature\n"); - if (!force) - return -ENODEV; - } - - /* - * Set fan multiplier and maximal fan speed from dmi config - * Values specified in module parameters override values from dmi - */ - id = dmi_first_match(i8k_dmi_table); - if (id && id->driver_data) { - const struct i8k_config_data *conf = id->driver_data; - if (!fan_mult && conf->fan_mult) - fan_mult = conf->fan_mult; - if (!fan_max && conf->fan_max) - fan_max = conf->fan_max; - } - - i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ - i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); - - if (!fan_mult) { - /* - * Autodetect fan multiplier based on nominal rpm - * If fan reports rpm value too high then set multiplier to 1 - */ - for (fan = 0; fan < 2; ++fan) { - ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); - if (ret < 0) - continue; - if (ret > I8K_FAN_MAX_RPM) - i8k_fan_mult = 1; - break; - } - } else { - /* Fan multiplier was specified in module param or in dmi */ - i8k_fan_mult = fan_mult; - } - - return 0; -} - -static int __init i8k_init(void) -{ - struct proc_dir_entry *proc_i8k; - int err; - - /* Are we running on an supported laptop? */ - if (i8k_probe()) - return -ENODEV; - - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - - err = i8k_init_hwmon(); - if (err) - goto exit_remove_proc; - - return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; -} - -static void __exit i8k_exit(void) -{ - hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); -} - -module_init(i8k_init); -module_exit(i8k_exit); diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 6c94147..1c3e458 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -155,6 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o +obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c new file mode 100644 index 0000000..2b04e4f --- /dev/null +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -0,0 +1,1007 @@ +/* + * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops. + * + * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> + * + * Hwmon integration: + * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> + * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> + * Copyright (C) 2014, 2015 Pali Rohár <pali.rohar@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/types.h> +#include <linux/init.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/dmi.h> +#include <linux/capability.h> +#include <linux/mutex.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/uaccess.h> +#include <linux/io.h> +#include <linux/sched.h> + +#include <linux/i8k.h> + +#define I8K_SMM_FN_STATUS 0x0025 +#define I8K_SMM_POWER_STATUS 0x0069 +#define I8K_SMM_SET_FAN 0x01a3 +#define I8K_SMM_GET_FAN 0x00a3 +#define I8K_SMM_GET_SPEED 0x02a3 +#define I8K_SMM_GET_FAN_TYPE 0x03a3 +#define I8K_SMM_GET_NOM_SPEED 0x04a3 +#define I8K_SMM_GET_TEMP 0x10a3 +#define I8K_SMM_GET_TEMP_TYPE 0x11a3 +#define I8K_SMM_GET_DELL_SIG1 0xfea3 +#define I8K_SMM_GET_DELL_SIG2 0xffa3 + +#define I8K_FAN_MULT 30 +#define I8K_FAN_MAX_RPM 30000 +#define I8K_MAX_TEMP 127 + +#define I8K_FN_NONE 0x00 +#define I8K_FN_UP 0x01 +#define I8K_FN_DOWN 0x02 +#define I8K_FN_MUTE 0x04 +#define I8K_FN_MASK 0x07 +#define I8K_FN_SHIFT 8 + +#define I8K_POWER_AC 0x05 +#define I8K_POWER_BATTERY 0x01 + +static DEFINE_MUTEX(i8k_mutex); +static char bios_version[4]; +static struct device *i8k_hwmon_dev; +static u32 i8k_hwmon_flags; +static uint i8k_fan_mult = I8K_FAN_MULT; +static uint i8k_pwm_mult; +static uint i8k_fan_max = I8K_FAN_HIGH; + +#define I8K_HWMON_HAVE_TEMP1 (1 << 0) +#define I8K_HWMON_HAVE_TEMP2 (1 << 1) +#define I8K_HWMON_HAVE_TEMP3 (1 << 2) +#define I8K_HWMON_HAVE_TEMP4 (1 << 3) +#define I8K_HWMON_HAVE_FAN1 (1 << 4) +#define I8K_HWMON_HAVE_FAN2 (1 << 5) + +MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); +MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("i8k"); + +static bool force; +module_param(force, bool, 0); +MODULE_PARM_DESC(force, "Force loading without checking for supported models"); + +static bool ignore_dmi; +module_param(ignore_dmi, bool, 0); +MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); + +static bool restricted; +module_param(restricted, bool, 0); +MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); + +static bool power_status; +module_param(power_status, bool, 0600); +MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); + +static uint fan_mult; +module_param(fan_mult, uint, 0); +MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); + +static uint fan_max; +module_param(fan_max, uint, 0); +MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); + +static int i8k_open_fs(struct inode *inode, struct file *file); +static long i8k_ioctl(struct file *, unsigned int, unsigned long); + +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +struct smm_regs { + unsigned int eax; + unsigned int ebx __packed; + unsigned int ecx __packed; + unsigned int edx __packed; + unsigned int esi __packed; + unsigned int edi __packed; +}; + +static inline const char *i8k_get_dmi_data(int field) +{ + const char *dmi_data = dmi_get_system_info(field); + + return dmi_data && *dmi_data ? dmi_data : "?"; +} + +/* + * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. + */ +static int i8k_smm(struct smm_regs *regs) +{ + int rc; + int eax = regs->eax; + cpumask_var_t old_mask; + + /* SMM requires CPU 0 */ + if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) + return -ENOMEM; + cpumask_copy(old_mask, ¤t->cpus_allowed); + rc = set_cpus_allowed_ptr(current, cpumask_of(0)); + if (rc) + goto out; + if (smp_processor_id() != 0) { + rc = -EBUSY; + goto out; + } + +#if defined(CONFIG_X86_64) + asm volatile("pushq %%rax\n\t" + "movl 0(%%rax),%%edx\n\t" + "pushq %%rdx\n\t" + "movl 4(%%rax),%%ebx\n\t" + "movl 8(%%rax),%%ecx\n\t" + "movl 12(%%rax),%%edx\n\t" + "movl 16(%%rax),%%esi\n\t" + "movl 20(%%rax),%%edi\n\t" + "popq %%rax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgq %%rax,(%%rsp)\n\t" + "movl %%ebx,4(%%rax)\n\t" + "movl %%ecx,8(%%rax)\n\t" + "movl %%edx,12(%%rax)\n\t" + "movl %%esi,16(%%rax)\n\t" + "movl %%edi,20(%%rax)\n\t" + "popq %%rdx\n\t" + "movl %%edx,0(%%rax)\n\t" + "pushfq\n\t" + "popq %%rax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#else + asm volatile("pushl %%eax\n\t" + "movl 0(%%eax),%%edx\n\t" + "push %%edx\n\t" + "movl 4(%%eax),%%ebx\n\t" + "movl 8(%%eax),%%ecx\n\t" + "movl 12(%%eax),%%edx\n\t" + "movl 16(%%eax),%%esi\n\t" + "movl 20(%%eax),%%edi\n\t" + "popl %%eax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgl %%eax,(%%esp)\n\t" + "movl %%ebx,4(%%eax)\n\t" + "movl %%ecx,8(%%eax)\n\t" + "movl %%edx,12(%%eax)\n\t" + "movl %%esi,16(%%eax)\n\t" + "movl %%edi,20(%%eax)\n\t" + "popl %%edx\n\t" + "movl %%edx,0(%%eax)\n\t" + "lahf\n\t" + "shrl $8,%%eax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#endif + if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) + rc = -EINVAL; + +out: + set_cpus_allowed_ptr(current, old_mask); + free_cpumask_var(old_mask); + return rc; +} + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Read the fan status. + */ +static int i8k_get_fan_status(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan speed in RPM. + */ +static int i8k_get_fan_speed(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Read the fan type. + */ +static int i8k_get_fan_type(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan nominal rpm for specific fan speed. + */ +static int i8k_get_fan_nominal_speed(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; + + regs.ebx = (fan & 0xff) | (speed << 8); + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Set the fan speed (off, low, high). Returns the new fan status. + */ +static int i8k_set_fan(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; + + speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); + regs.ebx = (fan & 0xff) | (speed << 8); + + return i8k_smm(®s) ? : i8k_get_fan_status(fan); +} + +static int i8k_get_temp_type(int sensor) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; + + regs.ebx = sensor & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the cpu temperature. + */ +static int _i8k_get_temp(int sensor) +{ + struct smm_regs regs = { + .eax = I8K_SMM_GET_TEMP, + .ebx = sensor & 0xff, + }; + + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +static int i8k_get_temp(int sensor) +{ + int temp = _i8k_get_temp(sensor); + + /* + * Sometimes the temperature sensor returns 0x99, which is out of range. + * In this case we retry (once) before returning an error. + # 1003655137 00000058 00005a4b + # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees + # 1003655139 00000054 00005c52 + */ + if (temp == 0x99) { + msleep(100); + temp = _i8k_get_temp(sensor); + } + /* + * Return -ENODATA for all invalid temperatures. + * + * Known instances are the 0x99 value as seen above as well as + * 0xc1 (193), which may be returned when trying to read the GPU + * temperature if the system supports a GPU and it is currently + * turned off. + */ + if (temp > I8K_MAX_TEMP) + return -ENODATA; + + return temp; +} + +static int i8k_get_dell_signature(int req_fn) +{ + struct smm_regs regs = { .eax = req_fn, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; +} + +static int +i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) +{ + int val = 0; + int speed; + unsigned char buff[16]; + int __user *argp = (int __user *)arg; + + if (!argp) + return -EINVAL; + + switch (cmd) { + case I8K_BIOS_VERSION: + val = (bios_version[0] << 16) | + (bios_version[1] << 8) | bios_version[2]; + break; + + case I8K_MACHINE_ID: + memset(buff, 0, 16); + strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + sizeof(buff)); + break; + + case I8K_FN_STATUS: + val = i8k_get_fn_status(); + break; + + case I8K_POWER_STATUS: + val = i8k_get_power_status(); + break; + + case I8K_GET_TEMP: + val = i8k_get_temp(0); + break; + + case I8K_GET_SPEED: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_speed(val); + break; + + case I8K_GET_FAN: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_status(val); + break; + + case I8K_SET_FAN: + if (restricted && !capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + if (copy_from_user(&speed, argp + 1, sizeof(int))) + return -EFAULT; + + val = i8k_set_fan(val, speed); + break; + + default: + return -EINVAL; + } + + if (val < 0) + return val; + + switch (cmd) { + case I8K_BIOS_VERSION: + if (copy_to_user(argp, &val, 4)) + return -EFAULT; + + break; + case I8K_MACHINE_ID: + if (copy_to_user(argp, buff, 16)) + return -EFAULT; + + break; + default: + if (copy_to_user(argp, &val, sizeof(int))) + return -EFAULT; + + break; + } + + return 0; +} + +static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) +{ + long ret; + + mutex_lock(&i8k_mutex); + ret = i8k_ioctl_unlocked(fp, cmd, arg); + mutex_unlock(&i8k_mutex); + + return ret; +} + +/* + * Print the information for /proc/i8k. + */ +static int i8k_proc_show(struct seq_file *seq, void *offset) +{ + int fn_key, cpu_temp, ac_power; + int left_fan, right_fan, left_speed, right_speed; + + cpu_temp = i8k_get_temp(0); /* 11100 µs */ + left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ + right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ + left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ + right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ + fn_key = i8k_get_fn_status(); /* 750 µs */ + if (power_status) + ac_power = i8k_get_power_status(); /* 14700 µs */ + else + ac_power = -1; + + /* + * Info: + * + * 1) Format version (this will change if format changes) + * 2) BIOS version + * 3) BIOS machine ID + * 4) Cpu temperature + * 5) Left fan status + * 6) Right fan status + * 7) Left fan speed + * 8) Right fan speed + * 9) AC power + * 10) Fn Key status + */ + return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", + I8K_PROC_FMT, + bios_version, + i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + cpu_temp, + left_fan, right_fan, left_speed, right_speed, + ac_power, fn_key); +} + +static int i8k_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, i8k_proc_show, NULL); +} + + +/* + * Hwmon interface + */ + +static ssize_t i8k_hwmon_show_temp_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "CPU", + "GPU", + "SODIMM", + "Other", + "Ambient", + "Other", + }; + int index = to_sensor_dev_attr(devattr)->index; + int type; + + type = i8k_get_temp_type(index); + if (type < 0) + return type; + if (type >= ARRAY_SIZE(labels)) + type = ARRAY_SIZE(labels) - 1; + return sprintf(buf, "%s\n", labels[type]); +} + +static ssize_t i8k_hwmon_show_temp(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int temp; + + temp = i8k_get_temp(index); + if (temp < 0) + return temp; + return sprintf(buf, "%d\n", temp * 1000); +} + +static ssize_t i8k_hwmon_show_fan_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "Processor Fan", + "Motherboard Fan", + "Video Fan", + "Power Supply Fan", + "Chipset Fan", + "Other Fan", + }; + int index = to_sensor_dev_attr(devattr)->index; + bool dock = false; + int type; + + type = i8k_get_fan_type(index); + if (type < 0) + return type; + + if (type & 0x10) { + dock = true; + type &= 0x0F; + } + + if (type >= ARRAY_SIZE(labels)) + type = (ARRAY_SIZE(labels) - 1); + + return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); +} + +static ssize_t i8k_hwmon_show_fan(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int fan_speed; + + fan_speed = i8k_get_fan_speed(index); + if (fan_speed < 0) + return fan_speed; + return sprintf(buf, "%d\n", fan_speed); +} + +static ssize_t i8k_hwmon_show_pwm(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int status; + + status = i8k_get_fan_status(index); + if (status < 0) + return -EIO; + return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); +} + +static ssize_t i8k_hwmon_set_pwm(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int index = to_sensor_dev_attr(attr)->index; + unsigned long val; + int err; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); + + mutex_lock(&i8k_mutex); + err = i8k_set_fan(index, val); + mutex_unlock(&i8k_mutex); + + return err < 0 ? -EIO : count; +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); +static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); +static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); +static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); +static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 3); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); +static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, + 1); +static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 1); + +static struct attribute *i8k_attrs[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ + &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ + &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ + &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ + &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ + &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ + &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ + &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ + &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ + &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ + &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ + &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ + &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ + &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ + NULL +}; + +static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, + int index) +{ + if (index >= 0 && index <= 1 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) + return 0; + if (index >= 2 && index <= 3 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) + return 0; + if (index >= 4 && index <= 5 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) + return 0; + if (index >= 6 && index <= 7 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) + return 0; + if (index >= 8 && index <= 10 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) + return 0; + if (index >= 11 && index <= 13 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) + return 0; + + return attr->mode; +} + +static const struct attribute_group i8k_group = { + .attrs = i8k_attrs, + .is_visible = i8k_is_visible, +}; +__ATTRIBUTE_GROUPS(i8k); + +static int __init i8k_init_hwmon(void) +{ + int err; + + i8k_hwmon_flags = 0; + + /* CPU temperature attributes, if temperature type is OK */ + err = i8k_get_temp_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; + /* check for additional temperature sensors */ + err = i8k_get_temp_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; + err = i8k_get_temp_type(2); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; + err = i8k_get_temp_type(3); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; + + /* First fan attributes, if fan type is OK */ + err = i8k_get_fan_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; + + /* Second fan attributes, if fan type is OK */ + err = i8k_get_fan_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; + + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, + i8k_groups); + if (IS_ERR(i8k_hwmon_dev)) { + err = PTR_ERR(i8k_hwmon_dev); + i8k_hwmon_dev = NULL; + pr_err("hwmon registration failed (%d)\n", err); + return err; + } + return 0; +} + +struct i8k_config_data { + uint fan_mult; + uint fan_max; +}; + +enum i8k_configs { + DELL_LATITUDE_D520, + DELL_PRECISION_490, + DELL_STUDIO, + DELL_XPS, +}; + +static const struct i8k_config_data i8k_config_data[] = { + [DELL_LATITUDE_D520] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_PRECISION_490] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_STUDIO] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, + [DELL_XPS] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, +}; + +static struct dmi_system_id i8k_dmi_table[] __initdata = { + { + .ident = "Dell Inspiron", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { + .ident = "Dell Inspiron 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude D520", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), + }, + .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], + }, + { + .ident = "Dell Latitude 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { /* UK Inspiron 6400 */ + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), + }, + }, + { + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), + }, + }, + { + .ident = "Dell Precision 490", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, + "Precision WorkStation 490"), + }, + .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], + }, + { + .ident = "Dell Precision", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), + }, + }, + { + .ident = "Dell Vostro", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), + }, + }, + { + .ident = "Dell XPS421", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), + }, + }, + { + .ident = "Dell Studio", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), + }, + .driver_data = (void *)&i8k_config_data[DELL_STUDIO], + }, + { + .ident = "Dell XPS 13", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { + .ident = "Dell XPS M140", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { } +}; + +MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); + +/* + * Probe for the presence of a supported laptop. + */ +static int __init i8k_probe(void) +{ + const struct dmi_system_id *id; + int fan, ret; + + /* + * Get DMI information + */ + if (!dmi_check_system(i8k_dmi_table)) { + if (!ignore_dmi && !force) + return -ENODEV; + + pr_info("not running on a supported Dell system.\n"); + pr_info("vendor=%s, model=%s, version=%s\n", + i8k_get_dmi_data(DMI_SYS_VENDOR), + i8k_get_dmi_data(DMI_PRODUCT_NAME), + i8k_get_dmi_data(DMI_BIOS_VERSION)); + } + + strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), + sizeof(bios_version)); + + /* + * Get SMM Dell signature + */ + if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && + i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { + pr_err("unable to get SMM Dell signature\n"); + if (!force) + return -ENODEV; + } + + /* + * Set fan multiplier and maximal fan speed from dmi config + * Values specified in module parameters override values from dmi + */ + id = dmi_first_match(i8k_dmi_table); + if (id && id->driver_data) { + const struct i8k_config_data *conf = id->driver_data; + if (!fan_mult && conf->fan_mult) + fan_mult = conf->fan_mult; + if (!fan_max && conf->fan_max) + fan_max = conf->fan_max; + } + + i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ + i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); + + if (!fan_mult) { + /* + * Autodetect fan multiplier based on nominal rpm + * If fan reports rpm value too high then set multiplier to 1 + */ + for (fan = 0; fan < 2; ++fan) { + ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); + if (ret < 0) + continue; + if (ret > I8K_FAN_MAX_RPM) + i8k_fan_mult = 1; + break; + } + } else { + /* Fan multiplier was specified in module param or in dmi */ + i8k_fan_mult = fan_mult; + } + + return 0; +} + +static int __init i8k_init(void) +{ + struct proc_dir_entry *proc_i8k; + int err; + + /* Are we running on an supported laptop? */ + if (i8k_probe()) + return -ENODEV; + + /* Register the proc entry */ + proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); + if (!proc_i8k) + return -ENOENT; + + err = i8k_init_hwmon(); + if (err) + goto exit_remove_proc; + + return 0; + + exit_remove_proc: + remove_proc_entry("i8k", NULL); + return err; +} + +static void __exit i8k_exit(void) +{ + hwmon_device_unregister(i8k_hwmon_dev); + remove_proc_entry("i8k", NULL); +} + +module_init(i8k_init); +module_exit(i8k_exit); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-03-28 10:24 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBjb21taXQgbW92ZXMgaThrIGRyaXZlciB0byBod21vbiB0cmVlIHVuZGVyIG5hbWUgZGVs bC1zbW0taHdtb24gd2hpY2ggaXMKYmV0dGVyIG5hbWUgdGhlbiBhYmJyZXZpYXRpb24gaThrLiBG b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpcyBhZGRlZCBtYWNybwpNT0RVTEVfQUxJQVMoImk4 ayIpIHNvIG1vZHByb2JlIHdpbGwgbG9hZCBkcml2ZXIgYWxzbyBvbGQgbmFtZSBpOGsuIENPTkZJ R19JOEsKY29tcGlsZSBvcHRpb24gd2FzIG5vdCBjaGFuZ2VkLgoKVGhpcyBjb21taXQgYWxzbyBh ZGRzIG1lIGFzIG1haW50YWluZXIgb2YgdGhpcyBuZXcgZGVsbC1zbW0taHdtb24gZHJpdmVyLgoK U2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgotLS0KIE1B SU5UQUlORVJTICAgICAgICAgICAgICAgICAgICB8ICAgIDMgKy0KIGRyaXZlcnMvY2hhci9NYWtl ZmlsZSAgICAgICAgICB8ICAgIDEgLQogZHJpdmVycy9jaGFyL2k4ay5jICAgICAgICAgICAgIHwg MTAwNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvaHdt b24vTWFrZWZpbGUgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21v bi5jIHwgMTAwNyArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA1IGZp bGVzIGNoYW5nZWQsIDEwMTAgaW5zZXJ0aW9ucygrKSwgMTAwNyBkZWxldGlvbnMoLSkKIGRlbGV0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2NoYXIvaThrLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01B SU5UQUlORVJTCmluZGV4IDg4YzA5Y2EuLmJmNWJiMDUgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJT CisrKyBiL01BSU5UQUlORVJTCkBAIC0zMDY0LDggKzMwNjQsOSBAQCBGOglkcml2ZXJzL3BsYXRm b3JtL3g4Ni9kZWxsLWxhcHRvcC5jCiAKIERFTEwgTEFQVE9QIFNNTSBEUklWRVIKIE06CUd1ZW50 ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KK006CVBhbGkgUm9ow6FyIDxwYWxpLnJvaGFy QGdtYWlsLmNvbT4KIFM6CU1haW50YWluZWQKLUY6CWRyaXZlcnMvY2hhci9pOGsuYworRjoJZHJp dmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCiBGOglpbmNsdWRlL3VhcGkvbGludXgvaThrLmgK IAogREVMTCBTWVNURU1TIE1BTkFHRU1FTlQgQkFTRSBEUklWRVIgKGRjZGJhcykKZGlmZiAtLWdp dCBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCBk MDZjZGUyNi4uMWQ5Y2YwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBi L2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMzYsNyArMzYsNiBAQCBlbHNlCiAgIG9iai0kKENP TkZJR19OVlJBTSkJKz0gbnZyYW0ubwogZW5kaWYKIG9iai0kKENPTkZJR19UT1NISUJBKQkJKz0g dG9zaGliYS5vCi1vYmotJChDT05GSUdfSThLKQkJKz0gaThrLm8KIG9iai0kKENPTkZJR19EUzE2 MjApCQkrPSBkczE2MjAubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTSkJCSs9IGh3X3JhbmRvbS8K IG9iai0kKENPTkZJR19QUERFVikJCSs9IHBwZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hh ci9pOGsuYyBiL2RyaXZlcnMvY2hhci9pOGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMjRjYzRlZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NoYXIvaThrLmMKKysrIC9kZXYvbnVs bApAQCAtMSwxMDA1ICswLDAgQEAKLS8qCi0gKiBpOGsuYyAtLSBMaW51eCBkcml2ZXIgZm9yIGFj Y2Vzc2luZyB0aGUgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzLgotICoKLSAqIENvcHlyaWdodCAo QykgMjAwMSAgTWFzc2ltbyBEYWwgWm90dG8gPGR6QGRlYmlhbi5vcmc+Ci0gKgotICogSHdtb24g aW50ZWdyYXRpb246Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEplYW4gRGVsdmFyZSA8amRlbHZh cmVAc3VzZS5kZT4KLSAqIENvcHlyaWdodCAoQykgMjAxMywgMjAxNCAgR3VlbnRlciBSb2VjayA8 bGludXhAcm9lY2stdXMubmV0PgotICogQ29weXJpZ2h0IChDKSAyMDE0ICBQYWxpIFJvaMOhciA8 cGFsaS5yb2hhckBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAo YXQgeW91ciBvcHRpb24pIGFueQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dy YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0 Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh bnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk ZXRhaWxzLgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBm bXQKLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5j bHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5j bHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1 ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxs aW51eC9od21vbi1zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRl IDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlIDxsaW51 eC9pOGsuaD4KLQotI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKLSNkZWZpbmUgSThL X1NNTV9QT1dFUl9TVEFUVVMJMHgwMDY5Ci0jZGVmaW5lIEk4S19TTU1fU0VUX0ZBTgkJMHgwMWEz Ci0jZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCi0jZGVmaW5lIEk4S19TTU1fR0VUX1NQ RUVECTB4MDJhMwotI2RlZmluZSBJOEtfU01NX0dFVF9GQU5fVFlQRQkweDAzYTMKLSNkZWZpbmUg SThLX1NNTV9HRVRfTk9NX1NQRUVECTB4MDRhMwotI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4 MTBhMwotI2RlZmluZSBJOEtfU01NX0dFVF9URU1QX1RZUEUJMHgxMWEzCi0jZGVmaW5lIEk4S19T TU1fR0VUX0RFTExfU0lHMQkweGZlYTMKLSNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcyCTB4 ZmZhMwotCi0jZGVmaW5lIEk4S19GQU5fTVVMVAkJMzAKLSNkZWZpbmUgSThLX0ZBTl9NQVhfUlBN CQkzMDAwMAotI2RlZmluZSBJOEtfTUFYX1RFTVAJCTEyNwotCi0jZGVmaW5lIEk4S19GTl9OT05F CQkweDAwCi0jZGVmaW5lIEk4S19GTl9VUAkJMHgwMQotI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgw MgotI2RlZmluZSBJOEtfRk5fTVVURQkJMHgwNAotI2RlZmluZSBJOEtfRk5fTUFTSwkJMHgwNwot I2RlZmluZSBJOEtfRk5fU0hJRlQJCTgKLQotI2RlZmluZSBJOEtfUE9XRVJfQUMJCTB4MDUKLSNk ZWZpbmUgSThLX1BPV0VSX0JBVFRFUlkJMHgwMQotCi1zdGF0aWMgREVGSU5FX01VVEVYKGk4a19t dXRleCk7Ci1zdGF0aWMgY2hhciBiaW9zX3ZlcnNpb25bNF07Ci1zdGF0aWMgc3RydWN0IGRldmlj ZSAqaThrX2h3bW9uX2RldjsKLXN0YXRpYyB1MzIgaThrX2h3bW9uX2ZsYWdzOwotc3RhdGljIHVp bnQgaThrX2Zhbl9tdWx0ID0gSThLX0ZBTl9NVUxUOwotc3RhdGljIHVpbnQgaThrX3B3bV9tdWx0 Owotc3RhdGljIHVpbnQgaThrX2Zhbl9tYXggPSBJOEtfRkFOX0hJR0g7Ci0KLSNkZWZpbmUgSThL X0hXTU9OX0hBVkVfVEVNUDEJKDEgPDwgMCkKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDIJ KDEgPDwgMSkKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDMJKDEgPDwgMikKLSNkZWZpbmUg SThLX0hXTU9OX0hBVkVfVEVNUDQJKDEgPDwgMykKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfRkFO MQkoMSA8PCA0KQotI2RlZmluZSBJOEtfSFdNT05fSEFWRV9GQU4yCSgxIDw8IDUpCi0KLU1PRFVM RV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOwotTU9EVUxFX0RF U0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMi KTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGJvb2wgZm9yY2U7Ci1tb2R1bGVf cGFyYW0oZm9yY2UsIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkZvcmNlIGxv YWRpbmcgd2l0aG91dCBjaGVja2luZyBmb3Igc3VwcG9ydGVkIG1vZGVscyIpOwotCi1zdGF0aWMg Ym9vbCBpZ25vcmVfZG1pOwotbW9kdWxlX3BhcmFtKGlnbm9yZV9kbWksIGJvb2wsIDApOwotTU9E VUxFX1BBUk1fREVTQyhpZ25vcmVfZG1pLCAiQ29udGludWUgcHJvYmluZyBoYXJkd2FyZSBldmVu IGlmIERNSSBkYXRhIGRvZXMgbm90IG1hdGNoIik7Ci0KLXN0YXRpYyBib29sIHJlc3RyaWN0ZWQ7 Ci1tb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJl c3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQi KTsKLQotc3RhdGljIGJvb2wgcG93ZXJfc3RhdHVzOwotbW9kdWxlX3BhcmFtKHBvd2VyX3N0YXR1 cywgYm9vbCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3N0YXR1cywgIlJlcG9ydCBw b3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7Ci0KLXN0YXRpYyB1aW50IGZhbl9tdWx0OwotbW9k dWxlX3BhcmFtKGZhbl9tdWx0LCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZmFuX211bHQs ICJGYWN0b3IgdG8gbXVsdGlwbHkgZmFuIHNwZWVkIHdpdGggKGRlZmF1bHQ6IGF1dG9kZXRlY3Qp Iik7Ci0KLXN0YXRpYyB1aW50IGZhbl9tYXg7Ci1tb2R1bGVfcGFyYW0oZmFuX21heCwgdWludCwg MCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZhbl9tYXgsICJNYXhpbXVtIGNvbmZpZ3VyYWJsZSBmYW4g c3BlZWQgKGRlZmF1bHQ6IGF1dG9kZXRlY3QpIik7Ci0KLXN0YXRpYyBpbnQgaThrX29wZW5fZnMo c3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGxvbmcgaThr X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci0KLXN0 YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4a19mb3BzID0gewotCS5vd25lcgkJ PSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpOGtfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVh ZCwKLQkubGxzZWVrCQk9IHNlcV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAot CS51bmxvY2tlZF9pb2N0bAk9IGk4a19pb2N0bCwKLX07Ci0KLXN0cnVjdCBzbW1fcmVncyB7Ci0J dW5zaWduZWQgaW50IGVheDsKLQl1bnNpZ25lZCBpbnQgZWJ4IF9fcGFja2VkOwotCXVuc2lnbmVk IGludCBlY3ggX19wYWNrZWQ7Ci0JdW5zaWduZWQgaW50IGVkeCBfX3BhY2tlZDsKLQl1bnNpZ25l ZCBpbnQgZXNpIF9fcGFja2VkOwotCXVuc2lnbmVkIGludCBlZGkgX19wYWNrZWQ7Ci19OwotCi1z dGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmk4a19nZXRfZG1pX2RhdGEoaW50IGZpZWxkKQotewot CWNvbnN0IGNoYXIgKmRtaV9kYXRhID0gZG1pX2dldF9zeXN0ZW1faW5mbyhmaWVsZCk7Ci0KLQly ZXR1cm4gZG1pX2RhdGEgJiYgKmRtaV9kYXRhID8gZG1pX2RhdGEgOiAiPyI7Ci19Ci0KLS8qCi0g KiBDYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1MuIENvZGUgcHJvdmlkZWQgYnkg Sm9uYXRoYW4gQnV6emFyZC4KLSAqLwotc3RhdGljIGludCBpOGtfc21tKHN0cnVjdCBzbW1fcmVn cyAqcmVncykKLXsKLQlpbnQgcmM7Ci0JaW50IGVheCA9IHJlZ3MtPmVheDsKLQljcHVtYXNrX3Zh cl90IG9sZF9tYXNrOwotCi0JLyogU01NIHJlcXVpcmVzIENQVSAwICovCi0JaWYgKCFhbGxvY19j cHVtYXNrX3Zhcigmb2xkX21hc2ssIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlj cHVtYXNrX2NvcHkob2xkX21hc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwotCXJjID0gc2V0 X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZigwKSk7Ci0JaWYgKHJjKQotCQln b3RvIG91dDsKLQlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApIHsKLQkJcmMgPSAtRUJVU1k7 Ci0JCWdvdG8gb3V0OwotCX0KLQotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLQlhc20gdm9s YXRpbGUoInB1c2hxICUlcmF4XG5cdCIKLQkJIm1vdmwgMCglJXJheCksJSVlZHhcblx0IgotCQki cHVzaHEgJSVyZHhcblx0IgotCQkibW92bCA0KCUlcmF4KSwlJWVieFxuXHQiCi0JCSJtb3ZsIDgo JSVyYXgpLCUlZWN4XG5cdCIKLQkJIm1vdmwgMTIoJSVyYXgpLCUlZWR4XG5cdCIKLQkJIm1vdmwg MTYoJSVyYXgpLCUlZXNpXG5cdCIKLQkJIm1vdmwgMjAoJSVyYXgpLCUlZWRpXG5cdCIKLQkJInBv cHEgJSVyYXhcblx0IgotCQkib3V0ICUlYWwsJDB4YjJcblx0IgotCQkib3V0ICUlYWwsJDB4ODRc blx0IgotCQkieGNoZ3EgJSVyYXgsKCUlcnNwKVxuXHQiCi0JCSJtb3ZsICUlZWJ4LDQoJSVyYXgp XG5cdCIKLQkJIm1vdmwgJSVlY3gsOCglJXJheClcblx0IgotCQkibW92bCAlJWVkeCwxMiglJXJh eClcblx0IgotCQkibW92bCAlJWVzaSwxNiglJXJheClcblx0IgotCQkibW92bCAlJWVkaSwyMCgl JXJheClcblx0IgotCQkicG9wcSAlJXJkeFxuXHQiCi0JCSJtb3ZsICUlZWR4LDAoJSVyYXgpXG5c dCIKLQkJInB1c2hmcVxuXHQiCi0JCSJwb3BxICUlcmF4XG5cdCIKLQkJImFuZGwgJDEsJSVlYXhc biIKLQkJOiAiPWEiKHJjKQotCQk6ICAgICJhIihyZWdzKQotCQk6ICAgICIlZWJ4IiwgIiVlY3gi LCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7Ci0jZWxzZQotCWFzbSB2b2xhdGls ZSgicHVzaGwgJSVlYXhcblx0IgotCSAgICAibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiCi0JICAg ICJwdXNoICUlZWR4XG5cdCIKLQkgICAgIm1vdmwgNCglJWVheCksJSVlYnhcblx0IgotCSAgICAi bW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiCi0JICAgICJtb3ZsIDEyKCUlZWF4KSwlJWVkeFxuXHQi Ci0JICAgICJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiCi0JICAgICJtb3ZsIDIwKCUlZWF4KSwl JWVkaVxuXHQiCi0JICAgICJwb3BsICUlZWF4XG5cdCIKLQkgICAgIm91dCAlJWFsLCQweGIyXG5c dCIKLQkgICAgIm91dCAlJWFsLCQweDg0XG5cdCIKLQkgICAgInhjaGdsICUlZWF4LCglJWVzcClc blx0IgotCSAgICAibW92bCAlJWVieCw0KCUlZWF4KVxuXHQiCi0JICAgICJtb3ZsICUlZWN4LDgo JSVlYXgpXG5cdCIKLQkgICAgIm1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIKLQkgICAgIm1vdmwg JSVlc2ksMTYoJSVlYXgpXG5cdCIKLQkgICAgIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIKLQkg ICAgInBvcGwgJSVlZHhcblx0IgotCSAgICAibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiCi0JICAg ICJsYWhmXG5cdCIKLQkgICAgInNocmwgJDgsJSVlYXhcblx0IgotCSAgICAiYW5kbCAkMSwlJWVh eFxuIgotCSAgICA6ICI9YSIocmMpCi0JICAgIDogICAgImEiKHJlZ3MpCi0JICAgIDogICAgIiVl YngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKLSNlbmRpZgot CWlmIChyYyAhPSAwIHx8IChyZWdzLT5lYXggJiAweGZmZmYpID09IDB4ZmZmZiB8fCByZWdzLT5l YXggPT0gZWF4KQotCQlyYyA9IC1FSU5WQUw7Ci0KLW91dDoKLQlzZXRfY3B1c19hbGxvd2VkX3B0 cihjdXJyZW50LCBvbGRfbWFzayk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihvbGRfbWFzayk7Ci0JcmV0 dXJuIHJjOwotfQotCi0vKgotICogUmVhZCB0aGUgRm4ga2V5IHN0YXR1cy4KLSAqLwotc3RhdGlj IGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0g eyAuZWF4ID0gSThLX1NNTV9GTl9TVEFUVVMsIH07Ci0JaW50IHJjOwotCi0JcmMgPSBpOGtfc21t KCZyZWdzKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzd2l0Y2ggKChyZWdzLmVh eCA+PiBJOEtfRk5fU0hJRlQpICYgSThLX0ZOX01BU0spIHsKLQljYXNlIEk4S19GTl9VUDoKLQkJ cmV0dXJuIEk4S19WT0xfVVA7Ci0JY2FzZSBJOEtfRk5fRE9XTjoKLQkJcmV0dXJuIEk4S19WT0xf RE9XTjsKLQljYXNlIEk4S19GTl9NVVRFOgotCQlyZXR1cm4gSThLX1ZPTF9NVVRFOwotCWRlZmF1 bHQ6Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoKLSAqIFJlYWQgdGhlIHBvd2VyIHN0YXR1cy4K LSAqLwotc3RhdGljIGludCBpOGtfZ2V0X3Bvd2VyX3N0YXR1cyh2b2lkKQotewotCXN0cnVjdCBz bW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9QT1dFUl9TVEFUVVMsIH07Ci0JaW50IHJj OwotCi0JcmMgPSBpOGtfc21tKCZyZWdzKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0K LQlyZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZikgPT0gSThLX1BPV0VSX0FDID8gSThLX0FDIDogSThL X0JBVFRFUlk7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgotICovCi1zdGF0aWMg aW50IGk4a19nZXRfZmFuX3N0YXR1cyhpbnQgZmFuKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdz ID0geyAuZWF4ID0gSThLX1NNTV9HRVRfRkFOLCB9OwotCi0JcmVncy5lYnggPSBmYW4gJiAweGZm OwotCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwotfQotCi0vKgot ICogUmVhZCB0aGUgZmFuIHNwZWVkIGluIFJQTS4KLSAqLwotc3RhdGljIGludCBpOGtfZ2V0X2Zh bl9zcGVlZChpbnQgZmFuKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThL X1NNTV9HRVRfU1BFRUQsIH07Ci0KLQlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0JcmV0dXJuIGk4 a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXggJiAweGZmZmYpICogaThrX2Zhbl9tdWx0OwotfQot Ci0vKgotICogUmVhZCB0aGUgZmFuIHR5cGUuCi0gKi8KLXN0YXRpYyBpbnQgaThrX2dldF9mYW5f dHlwZShpbnQgZmFuKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NN TV9HRVRfRkFOX1RZUEUsIH07Ci0KLQlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0JcmV0dXJuIGk4 a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBm YW4gbm9taW5hbCBycG0gZm9yIHNwZWNpZmljIGZhbiBzcGVlZC4KLSAqLwotc3RhdGljIGludCBp OGtfZ2V0X2Zhbl9ub21pbmFsX3NwZWVkKGludCBmYW4sIGludCBzcGVlZCkKLXsKLQlzdHJ1Y3Qg c21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX05PTV9TUEVFRCwgfTsKLQotCXJl Z3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwotCXJldHVybiBpOGtfc21tKCZy ZWdzKSA/IDogKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIGk4a19mYW5fbXVsdDsKLX0KLQotLyoKLSAq IFNldCB0aGUgZmFuIHNwZWVkIChvZmYsIGxvdywgaGlnaCkuIFJldHVybnMgdGhlIG5ldyBmYW4g c3RhdHVzLgotICovCi1zdGF0aWMgaW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkK LXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fU0VUX0ZBTiwgfTsK LQotCXNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+IGk4a19mYW5fbWF4KSA/IGk4 a19mYW5fbWF4IDogc3BlZWQpOwotCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8 IDgpOwotCi0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiBpOGtfZ2V0X2Zhbl9zdGF0dXMoZmFu KTsKLX0KLQotc3RhdGljIGludCBpOGtfZ2V0X3RlbXBfdHlwZShpbnQgc2Vuc29yKQotewotCXN0 cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfVEVNUF9UWVBFLCB9Owot Ci0JcmVncy5lYnggPSBzZW5zb3IgJiAweGZmOwotCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDog cmVncy5lYXggJiAweGZmOwotfQotCi0vKgotICogUmVhZCB0aGUgY3B1IHRlbXBlcmF0dXJlLgot ICovCi1zdGF0aWMgaW50IF9pOGtfZ2V0X3RlbXAoaW50IHNlbnNvcikKLXsKLQlzdHJ1Y3Qgc21t X3JlZ3MgcmVncyA9IHsKLQkJLmVheCA9IEk4S19TTU1fR0VUX1RFTVAsCi0JCS5lYnggPSBzZW5z b3IgJiAweGZmLAotCX07Ci0KLQlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4ICYg MHhmZjsKLX0KLQotc3RhdGljIGludCBpOGtfZ2V0X3RlbXAoaW50IHNlbnNvcikKLXsKLQlpbnQg dGVtcCA9IF9pOGtfZ2V0X3RlbXAoc2Vuc29yKTsKLQotCS8qCi0JICogU29tZXRpbWVzIHRoZSB0 ZW1wZXJhdHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCi0J ICogSW4gdGhpcyBjYXNlIHdlIHJldHJ5IChvbmNlKSBiZWZvcmUgcmV0dXJuaW5nIGFuIGVycm9y LgotCSAjIDEwMDM2NTUxMzcgMDAwMDAwNTggMDAwMDVhNGIKLQkgIyAxMDAzNjU1MTM4IDAwMDAw MDk5IDAwMDAzYTgwIDwtLS0gMHg5OSA9IDE1MyBkZWdyZWVzCi0JICMgMTAwMzY1NTEzOSAwMDAw MDA1NCAwMDAwNWM1MgotCSAqLwotCWlmICh0ZW1wID09IDB4OTkpIHsKLQkJbXNsZWVwKDEwMCk7 Ci0JCXRlbXAgPSBfaThrX2dldF90ZW1wKHNlbnNvcik7Ci0JfQotCS8qCi0JICogUmV0dXJuIC1F Tk9EQVRBIGZvciBhbGwgaW52YWxpZCB0ZW1wZXJhdHVyZXMuCi0JICoKLQkgKiBLbm93biBpbnN0 YW5jZXMgYXJlIHRoZSAweDk5IHZhbHVlIGFzIHNlZW4gYWJvdmUgYXMgd2VsbCBhcwotCSAqIDB4 YzEgKDE5MyksIHdoaWNoIG1heSBiZSByZXR1cm5lZCB3aGVuIHRyeWluZyB0byByZWFkIHRoZSBH UFUKLQkgKiB0ZW1wZXJhdHVyZSBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGEgR1BVIGFuZCBpdCBp cyBjdXJyZW50bHkKLQkgKiB0dXJuZWQgb2ZmLgotCSAqLwotCWlmICh0ZW1wID4gSThLX01BWF9U RU1QKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQlyZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIGlu dCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKGludCByZXFfZm4pCi17Ci0Jc3RydWN0IHNtbV9yZWdz IHJlZ3MgPSB7IC5lYXggPSByZXFfZm4sIH07Ci0JaW50IHJjOwotCi0JcmMgPSBpOGtfc21tKCZy ZWdzKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gcmVncy5lYXggPT0g MTE0NTY1MTUyNyAmJiByZWdzLmVkeCA9PSAxMTQ1MzkyMjA0ID8gMCA6IC0xOwotfQotCi1zdGF0 aWMgaW50Ci1pOGtfaW9jdGxfdW5sb2NrZWQoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQg Y21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlpbnQgdmFsID0gMDsKLQlpbnQgc3BlZWQ7Ci0J dW5zaWduZWQgY2hhciBidWZmWzE2XTsKLQlpbnQgX191c2VyICphcmdwID0gKGludCBfX3VzZXIg Kilhcmc7Ci0KLQlpZiAoIWFyZ3ApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChjbWQp IHsKLQljYXNlIEk4S19CSU9TX1ZFUlNJT046Ci0JCXZhbCA9IChiaW9zX3ZlcnNpb25bMF0gPDwg MTYpIHwKLQkJCQkoYmlvc192ZXJzaW9uWzFdIDw8IDgpIHwgYmlvc192ZXJzaW9uWzJdOwotCQli cmVhazsKLQotCWNhc2UgSThLX01BQ0hJTkVfSUQ6Ci0JCW1lbXNldChidWZmLCAwLCAxNik7Ci0J CXN0cmxjcHkoYnVmZiwgaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9TRVJJQUwpLAotCQkJ c2l6ZW9mKGJ1ZmYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk4S19GTl9TVEFUVVM6Ci0JCXZhbCA9 IGk4a19nZXRfZm5fc3RhdHVzKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfUE9XRVJfU1RBVFVT OgotCQl2YWwgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwotCQlicmVhazsKLQotCWNhc2UgSThL X0dFVF9URU1QOgotCQl2YWwgPSBpOGtfZ2V0X3RlbXAoMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJ OEtfR0VUX1NQRUVEOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGlu dCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdmFsID0gaThrX2dldF9mYW5fc3BlZWQodmFs KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk4S19HRVRfRkFOOgotCQlpZiAoY29weV9mcm9tX3VzZXIo JnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdmFsID0g aThrX2dldF9mYW5fc3RhdHVzKHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfU0VUX0ZBTjoK LQkJaWYgKHJlc3RyaWN0ZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4g LUVQRVJNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkp Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdw ICsgMSwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdmFsID0gaThrX3Nl dF9mYW4odmFsLCBzcGVlZCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5W QUw7Ci0JfQotCi0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7Ci0KLQlzd2l0Y2ggKGNtZCkg ewotCWNhc2UgSThLX0JJT1NfVkVSU0lPTjoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFs LCA0KSkKLQkJCXJldHVybiAtRUZBVUxUOwotCi0JCWJyZWFrOwotCWNhc2UgSThLX01BQ0hJTkVf SUQ6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYnVmZiwgMTYpKQotCQkJcmV0dXJuIC1FRkFV TFQ7Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFs LCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlicmVhazsKLQl9Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0cnVjdCBmaWxlICpmcCwgdW5z aWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0JbG9uZyByZXQ7Ci0KLQltdXRl eF9sb2NrKCZpOGtfbXV0ZXgpOwotCXJldCA9IGk4a19pb2N0bF91bmxvY2tlZChmcCwgY21kLCBh cmcpOwotCW11dGV4X3VubG9jaygmaThrX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8q Ci0gKiBQcmludCB0aGUgaW5mb3JtYXRpb24gZm9yIC9wcm9jL2k4ay4KLSAqLwotc3RhdGljIGlu dCBpOGtfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0J aW50IGZuX2tleSwgY3B1X3RlbXAsIGFjX3Bvd2VyOwotCWludCBsZWZ0X2ZhbiwgcmlnaHRfZmFu LCBsZWZ0X3NwZWVkLCByaWdodF9zcGVlZDsKLQotCWNwdV90ZW1wCT0gaThrX2dldF90ZW1wKDAp OwkJCS8qIDExMTAwIMK1cyAqLwotCWxlZnRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19G QU5fTEVGVCk7CS8qICAgNTgwIMK1cyAqLwotCXJpZ2h0X2Zhbgk9IGk4a19nZXRfZmFuX3N0YXR1 cyhJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgwrVzICovCi0JbGVmdF9zcGVlZAk9IGk4a19nZXRf ZmFuX3NwZWVkKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwIMK1cyAqLwotCXJpZ2h0X3NwZWVkCT0g aThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwIMK1cyAqLwotCWZuX2tl eQkJPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwkJCS8qICAgNzUwIMK1cyAqLwotCWlmIChwb3dlcl9z dGF0dXMpCi0JCWFjX3Bvd2VyID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsJCS8qIDE0NzAwIMK1 cyAqLwotCWVsc2UKLQkJYWNfcG93ZXIgPSAtMTsKLQotCS8qCi0JICogSW5mbzoKLQkgKgotCSAq IDEpICBGb3JtYXQgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykK LQkgKiAyKSAgQklPUyB2ZXJzaW9uCi0JICogMykgIEJJT1MgbWFjaGluZSBJRAotCSAqIDQpICBD cHUgdGVtcGVyYXR1cmUKLQkgKiA1KSAgTGVmdCBmYW4gc3RhdHVzCi0JICogNikgIFJpZ2h0IGZh biBzdGF0dXMKLQkgKiA3KSAgTGVmdCBmYW4gc3BlZWQKLQkgKiA4KSAgUmlnaHQgZmFuIHNwZWVk Ci0JICogOSkgIEFDIHBvd2VyCi0JICogMTApIEZuIEtleSBzdGF0dXMKLQkgKi8KLQlyZXR1cm4g c2VxX3ByaW50ZihzZXEsICIlcyAlcyAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKLQkJCSAg SThLX1BST0NfRk1ULAotCQkJICBiaW9zX3ZlcnNpb24sCi0JCQkgIGk4a19nZXRfZG1pX2RhdGEo RE1JX1BST0RVQ1RfU0VSSUFMKSwKLQkJCSAgY3B1X3RlbXAsCi0JCQkgIGxlZnRfZmFuLCByaWdo dF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkLAotCQkJICBhY19wb3dlciwgZm5fa2V5KTsK LX0KLQotc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qg ZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaThrX3Byb2Nfc2hvdywg TlVMTCk7Ci19Ci0KLQotLyoKLSAqIEh3bW9uIGludGVyZmFjZQotICovCi0KLXN0YXRpYyBzc2l6 ZV90IGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkg c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCi17Ci0J c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsYWJlbHNbXSA9IHsKLQkJIkNQVSIsCi0JCSJHUFUi LAotCQkiU09ESU1NIiwKLQkJIk90aGVyIiwKLQkJIkFtYmllbnQiLAotCQkiT3RoZXIiLAotCX07 Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQg dHlwZTsKLQotCXR5cGUgPSBpOGtfZ2V0X3RlbXBfdHlwZShpbmRleCk7Ci0JaWYgKHR5cGUgPCAw KQotCQlyZXR1cm4gdHlwZTsKLQlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKGxhYmVscykpCi0JCXR5 cGUgPSBBUlJBWV9TSVpFKGxhYmVscykgLSAxOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4i LCBsYWJlbHNbdHlwZV0pOwotfQotCi1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd190ZW1w KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2 YXR0ciwKLQkJCQkgICBjaGFyICpidWYpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9h dHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQgdGVtcDsKLQotCXRlbXAgPSBpOGtfZ2V0X3RlbXAo aW5kZXgpOwotCWlmICh0ZW1wIDwgMCkKLQkJcmV0dXJuIHRlbXA7Ci0JcmV0dXJuIHNwcmludGYo YnVmLCAiJWRcbiIsIHRlbXAgKiAxMDAwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaThrX2h3bW9u X3Nob3dfZmFuX2xhYmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGRldmljZV9h dHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkJCWNoYXIgKmJ1ZikKLXsKLQlzdGF0aWMgY29uc3QgY2hh ciAqIGNvbnN0IGxhYmVsc1tdID0gewotCQkiUHJvY2Vzc29yIEZhbiIsCi0JCSJNb3RoZXJib2Fy ZCBGYW4iLAotCQkiVmlkZW8gRmFuIiwKLQkJIlBvd2VyIFN1cHBseSBGYW4iLAotCQkiQ2hpcHNl dCBGYW4iLAotCQkiT3RoZXIgRmFuIiwKLQl9OwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZf YXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JYm9vbCBkb2NrID0gZmFsc2U7Ci0JaW50IHR5cGU7Ci0K LQl0eXBlID0gaThrX2dldF9mYW5fdHlwZShpbmRleCk7Ci0JaWYgKHR5cGUgPCAwKQotCQlyZXR1 cm4gdHlwZTsKLQotCWlmICh0eXBlICYgMHgxMCkgewotCQlkb2NrID0gdHJ1ZTsKLQkJdHlwZSAm PSAweDBGOwotCX0KLQotCWlmICh0eXBlID49IEFSUkFZX1NJWkUobGFiZWxzKSkKLQkJdHlwZSA9 IChBUlJBWV9TSVpFKGxhYmVscykgLSAxKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzJXNc biIsIChkb2NrID8gIkRvY2tpbmcgIiA6ICIiKSwgbGFiZWxzW3R5cGVdKTsKLX0KLQotc3RhdGlj IHNzaXplX3QgaThrX2h3bW9uX3Nob3dfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJCSAgY2hhciAqYnVmKQotewotCWlu dCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IGZhbl9z cGVlZDsKLQotCWZhbl9zcGVlZCA9IGk4a19nZXRfZmFuX3NwZWVkKGluZGV4KTsKLQlpZiAoZmFu X3NwZWVkIDwgMCkKLQkJcmV0dXJuIGZhbl9zcGVlZDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIl ZFxuIiwgZmFuX3NwZWVkKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfcHdt KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZh dHRyLAotCQkJCSAgY2hhciAqYnVmKQotewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0 cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGk4a19nZXRfZmFu X3N0YXR1cyhpbmRleCk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiAtRUlPOwotCXJldHVy biBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjbGFtcF92YWwoc3RhdHVzICogaThrX3B3bV9tdWx0LCAw LCAyNTUpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3NldF9wd20oc3RydWN0IGRl dmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29u c3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rl dl9hdHRyKGF0dHIpLT5pbmRleDsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgZXJyOwotCi0J ZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsK LQl2YWwgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodmFsLCBpOGtfcHdtX211bHQpLCAw LCBpOGtfZmFuX21heCk7Ci0KLQltdXRleF9sb2NrKCZpOGtfbXV0ZXgpOwotCWVyciA9IGk4a19z ZXRfZmFuKGluZGV4LCB2YWwpOwotCW11dGV4X3VubG9jaygmaThrX211dGV4KTsKLQotCXJldHVy biBlcnIgPCAwID8gLUVJTyA6IGNvdW50OwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS KHRlbXAxX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAwKTsKLXN0 YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9z aG93X3RlbXBfbGFiZWwsIE5VTEwsCi0JCQkgIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU Uih0ZW1wMl9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMSk7Ci1z dGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25f c2hvd190ZW1wX2xhYmVsLCBOVUxMLAotCQkJICAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FU VFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDIpOwot c3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19sYWJlbCwgU19JUlVHTywgaThrX2h3bW9u X3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKLQkJCSAgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9B VFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAzKTsK LXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbGFiZWwsIFNfSVJVR08sIGk4a19od21v bl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCi0JCQkgIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0Vf QVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd19mYW4sIE5VTEwsIDApOwot c3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25f c2hvd19mYW5fbGFiZWwsIE5VTEwsCi0JCQkgIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU Uihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgaThrX2h3bW9uX3Nob3dfcHdtLAotCQkJICBpOGtf aHdtb25fc2V0X3B3bSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQs IFNfSVJVR08sIGk4a19od21vbl9zaG93X2ZhbiwgTlVMTCwKLQkJCSAgMSk7Ci1zdGF0aWMgU0VO U09SX0RFVklDRV9BVFRSKGZhbjJfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2Zhbl9s YWJlbCwgTlVMTCwKLQkJCSAgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTIsIFNf SVJVR08gfCBTX0lXVVNSLCBpOGtfaHdtb25fc2hvd19wd20sCi0JCQkgIGk4a19od21vbl9zZXRf cHdtLCAxKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmk4a19hdHRyc1tdID0gewotCSZz ZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogMCAqLwotCSZzZW5z b3JfZGV2X2F0dHJfdGVtcDFfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogMSAqLwotCSZzZW5zb3Jf ZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogMiAqLwotCSZzZW5zb3JfZGV2 X2F0dHJfdGVtcDJfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogMyAqLwotCSZzZW5zb3JfZGV2X2F0 dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNCAqLwotCSZzZW5zb3JfZGV2X2F0dHJf dGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogNSAqLwotCSZzZW5zb3JfZGV2X2F0dHJfdGVt cDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNiAqLwotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRf bGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogNyAqLwotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1 dC5kZXZfYXR0ci5hdHRyLAkvKiA4ICovCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2xhYmVsLmRl dl9hdHRyLmF0dHIsCS8qIDkgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0 ciwJCS8qIDEwICovCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIs CS8qIDExICovCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8q IDEyICovCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCQkvKiAxMyAqLwot CU5VTEwKLX07Ci0KLXN0YXRpYyB1bW9kZV90IGk4a19pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0 ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgaW50IGluZGV4KQotewot CWlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IDEgJiYKLQkgICAgIShpOGtfaHdtb25fZmxhZ3Mg JiBJOEtfSFdNT05fSEFWRV9URU1QMSkpCi0JCXJldHVybiAwOwotCWlmIChpbmRleCA+PSAyICYm IGluZGV4IDw9IDMgJiYKLQkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9U RU1QMikpCi0JCXJldHVybiAwOwotCWlmIChpbmRleCA+PSA0ICYmIGluZGV4IDw9IDUgJiYKLQkg ICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9URU1QMykpCi0JCXJldHVybiAw OwotCWlmIChpbmRleCA+PSA2ICYmIGluZGV4IDw9IDcgJiYKLQkgICAgIShpOGtfaHdtb25fZmxh Z3MgJiBJOEtfSFdNT05fSEFWRV9URU1QNCkpCi0JCXJldHVybiAwOwotCWlmIChpbmRleCA+PSA4 ICYmIGluZGV4IDw9IDEwICYmCi0JICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hB VkVfRkFOMSkpCi0JCXJldHVybiAwOwotCWlmIChpbmRleCA+PSAxMSAmJiBpbmRleCA8PSAxMyAm JgotCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX0ZBTjIpKQotCQlyZXR1 cm4gMDsKLQotCXJldHVybiBhdHRyLT5tb2RlOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0 dHJpYnV0ZV9ncm91cCBpOGtfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gaThrX2F0dHJzLAotCS5pc192 aXNpYmxlID0gaThrX2lzX3Zpc2libGUsCi19OwotX19BVFRSSUJVVEVfR1JPVVBTKGk4ayk7Ci0K LXN0YXRpYyBpbnQgX19pbml0IGk4a19pbml0X2h3bW9uKHZvaWQpCi17Ci0JaW50IGVycjsKLQot CWk4a19od21vbl9mbGFncyA9IDA7Ci0KLQkvKiBDUFUgdGVtcGVyYXR1cmUgYXR0cmlidXRlcywg aWYgdGVtcGVyYXR1cmUgdHlwZSBpcyBPSyAqLwotCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDAp OwotCWlmIChlcnIgPj0gMCkKLQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RF TVAxOwotCS8qIGNoZWNrIGZvciBhZGRpdGlvbmFsIHRlbXBlcmF0dXJlIHNlbnNvcnMgKi8KLQll cnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgxKTsKLQlpZiAoZXJyID49IDApCi0JCWk4a19od21vbl9m bGFncyB8PSBJOEtfSFdNT05fSEFWRV9URU1QMjsKLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgy KTsKLQlpZiAoZXJyID49IDApCi0JCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9U RU1QMzsKLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgzKTsKLQlpZiAoZXJyID49IDApCi0JCWk4 a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9URU1QNDsKLQotCS8qIEZpcnN0IGZhbiBh dHRyaWJ1dGVzLCBpZiBmYW4gdHlwZSBpcyBPSyAqLwotCWVyciA9IGk4a19nZXRfZmFuX3R5cGUo MCk7Ci0JaWYgKGVyciA+PSAwKQotCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVf RkFOMTsKLQotCS8qIFNlY29uZCBmYW4gYXR0cmlidXRlcywgaWYgZmFuIHR5cGUgaXMgT0sgKi8K LQllcnIgPSBpOGtfZ2V0X2Zhbl90eXBlKDEpOwotCWlmIChlcnIgPj0gMCkKLQkJaThrX2h3bW9u X2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX0ZBTjI7Ci0KLQlpOGtfaHdtb25fZGV2ID0gaHdtb25f ZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKE5VTEwsICJpOGsiLCBOVUxMLAotCQkJCQkJCSAg aThrX2dyb3Vwcyk7Ci0JaWYgKElTX0VSUihpOGtfaHdtb25fZGV2KSkgewotCQllcnIgPSBQVFJf RVJSKGk4a19od21vbl9kZXYpOwotCQlpOGtfaHdtb25fZGV2ID0gTlVMTDsKLQkJcHJfZXJyKCJo d21vbiByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0J fQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgaThrX2NvbmZpZ19kYXRhIHsKLQl1aW50IGZhbl9t dWx0OwotCXVpbnQgZmFuX21heDsKLX07Ci0KLWVudW0gaThrX2NvbmZpZ3MgewotCURFTExfTEFU SVRVREVfRDUyMCwKLQlERUxMX1BSRUNJU0lPTl80OTAsCi0JREVMTF9TVFVESU8sCi0JREVMTF9Y UFMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGk4a19jb25maWdfZGF0YSBpOGtfY29uZmln X2RhdGFbXSA9IHsKLQlbREVMTF9MQVRJVFVERV9ENTIwXSA9IHsKLQkJLmZhbl9tdWx0ID0gMSwK LQkJLmZhbl9tYXggPSBJOEtfRkFOX1RVUkJPLAotCX0sCi0JW0RFTExfUFJFQ0lTSU9OXzQ5MF0g PSB7Ci0JCS5mYW5fbXVsdCA9IDEsCi0JCS5mYW5fbWF4ID0gSThLX0ZBTl9UVVJCTywKLQl9LAot CVtERUxMX1NUVURJT10gPSB7Ci0JCS5mYW5fbXVsdCA9IDEsCi0JCS5mYW5fbWF4ID0gSThLX0ZB Tl9ISUdILAotCX0sCi0JW0RFTExfWFBTXSA9IHsKLQkJLmZhbl9tdWx0ID0gMSwKLQkJLmZhbl9t YXggPSBJOEtfRkFOX0hJR0gsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1pX3N5c3RlbV9p ZCBpOGtfZG1pX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIElu c3Bpcm9uIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJE ZWxsIENvbXB1dGVyIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9u IiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIExhdGl0dWRlIiwKLQkJLm1hdGNo ZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCi0J CQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIiksCi0JCX0sCi0JfSwKLQl7 Ci0JCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDIiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9N QVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9E VUNUX05BTUUsICJJbnNwaXJvbiIpLAotCQl9LAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBM YXRpdHVkZSBENTIwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5E T1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1 ZGUgRDUyMCIpLAotCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2Rh dGFbREVMTF9MQVRJVFVERV9ENTIwXSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRlbGwgTGF0aXR1 ZGUgMiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVs bCBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIiksCi0J CX0sCi0JfSwKLQl7CS8qIFVLIEluc3Bpcm9uIDY0MDAgICovCi0JCS5pZGVudCA9ICJEZWxsIElu c3Bpcm9uIDMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwg IkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNTTA2MSIpLAot CQl9LAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBJbnNwaXJvbiAzIiwKLQkJLm1hdGNoZXMg PSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9N QVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVAwNjEiKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50 ID0gIkRlbGwgUHJlY2lzaW9uIDQ5MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERN SV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFN RSwKLQkJCQkgICJQcmVjaXNpb24gV29ya1N0YXRpb24gNDkwIiksCi0JCX0sCi0JCS5kcml2ZXJf ZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX1BSRUNJU0lPTl80OTBdLAotCX0s Ci0JewotCQkuaWRlbnQgPSAiRGVsbCBQcmVjaXNpb24iLAotCQkubWF0Y2hlcyA9IHsKLQkJCURN SV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9Q Uk9EVUNUX05BTUUsICJQcmVjaXNpb24iKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRl bGwgVm9zdHJvIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1Is ICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9zdHJvIiks Ci0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIFhQUzQyMSIsCi0JCS5tYXRjaGVzID0g ewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFU Q0goRE1JX1BST0RVQ1RfTkFNRSwgIlhQUyBMNDIxWCIpLAotCQl9LAotCX0sCi0JewotCQkuaWRl bnQgPSAiRGVsbCBTdHVkaW8iLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lT X1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJT dHVkaW8iKSwKLQkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRh W0RFTExfU1RVRElPXSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRlbGwgWFBTIDEzIiwKLQkJLm1h dGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJ CURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTMTMiKSwKLQkJfSwKLQkJLmRyaXZlcl9k YXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfWFBTXSwKLQl9LAotCXsKLQkJLmlk ZW50ID0gIkRlbGwgWFBTIE0xNDAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlf U1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUs ICJNWEMwNTEiKSwKLQkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19k YXRhW0RFTExfWFBTXSwKLQl9LAotCXsgfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShkbWks IGk4a19kbWlfdGFibGUpOwotCi0vKgotICogUHJvYmUgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIHN1 cHBvcnRlZCBsYXB0b3AuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGk4a19wcm9iZSh2b2lkKQot ewotCWNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZDsKLQlpbnQgZmFuLCByZXQ7Ci0KLQkv KgotCSAqIEdldCBETUkgaW5mb3JtYXRpb24KLQkgKi8KLQlpZiAoIWRtaV9jaGVja19zeXN0ZW0o aThrX2RtaV90YWJsZSkpIHsKLQkJaWYgKCFpZ25vcmVfZG1pICYmICFmb3JjZSkKLQkJCXJldHVy biAtRU5PREVWOwotCi0JCXByX2luZm8oIm5vdCBydW5uaW5nIG9uIGEgc3VwcG9ydGVkIERlbGwg c3lzdGVtLlxuIik7Ci0JCXByX2luZm8oInZlbmRvcj0lcywgbW9kZWw9JXMsIHZlcnNpb249JXNc biIsCi0JCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9TWVNfVkVORE9SKSwKLQkJCWk4a19nZXRfZG1p X2RhdGEoRE1JX1BST0RVQ1RfTkFNRSksCi0JCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9CSU9TX1ZF UlNJT04pKTsKLQl9Ci0KLQlzdHJsY3B5KGJpb3NfdmVyc2lvbiwgaThrX2dldF9kbWlfZGF0YShE TUlfQklPU19WRVJTSU9OKSwKLQkJc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwotCi0JLyoKLQkgKiBH ZXQgU01NIERlbGwgc2lnbmF0dXJlCi0JICovCi0JaWYgKGk4a19nZXRfZGVsbF9zaWduYXR1cmUo SThLX1NNTV9HRVRfREVMTF9TSUcxKSAmJgotCSAgICBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKEk4 S19TTU1fR0VUX0RFTExfU0lHMikpIHsKLQkJcHJfZXJyKCJ1bmFibGUgdG8gZ2V0IFNNTSBEZWxs IHNpZ25hdHVyZVxuIik7Ci0JCWlmICghZm9yY2UpCi0JCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0K LQkvKgotCSAqIFNldCBmYW4gbXVsdGlwbGllciBhbmQgbWF4aW1hbCBmYW4gc3BlZWQgZnJvbSBk bWkgY29uZmlnCi0JICogVmFsdWVzIHNwZWNpZmllZCBpbiBtb2R1bGUgcGFyYW1ldGVycyBvdmVy cmlkZSB2YWx1ZXMgZnJvbSBkbWkKLQkgKi8KLQlpZCA9IGRtaV9maXJzdF9tYXRjaChpOGtfZG1p X3RhYmxlKTsKLQlpZiAoaWQgJiYgaWQtPmRyaXZlcl9kYXRhKSB7Ci0JCWNvbnN0IHN0cnVjdCBp OGtfY29uZmlnX2RhdGEgKmNvbmYgPSBpZC0+ZHJpdmVyX2RhdGE7Ci0JCWlmICghZmFuX211bHQg JiYgY29uZi0+ZmFuX211bHQpCi0JCQlmYW5fbXVsdCA9IGNvbmYtPmZhbl9tdWx0OwotCQlpZiAo IWZhbl9tYXggJiYgY29uZi0+ZmFuX21heCkKLQkJCWZhbl9tYXggPSBjb25mLT5mYW5fbWF4Owot CX0KLQotCWk4a19mYW5fbWF4ID0gZmFuX21heCA/IDogSThLX0ZBTl9ISUdIOwkvKiBNdXN0IG5v dCBiZSAwICovCi0JaThrX3B3bV9tdWx0ID0gRElWX1JPVU5EX1VQKDI1NSwgaThrX2Zhbl9tYXgp OwotCi0JaWYgKCFmYW5fbXVsdCkgewotCQkvKgotCQkgKiBBdXRvZGV0ZWN0IGZhbiBtdWx0aXBs aWVyIGJhc2VkIG9uIG5vbWluYWwgcnBtCi0JCSAqIElmIGZhbiByZXBvcnRzIHJwbSB2YWx1ZSB0 b28gaGlnaCB0aGVuIHNldCBtdWx0aXBsaWVyIHRvIDEKLQkJICovCi0JCWZvciAoZmFuID0gMDsg ZmFuIDwgMjsgKytmYW4pIHsKLQkJCXJldCA9IGk4a19nZXRfZmFuX25vbWluYWxfc3BlZWQoZmFu LCBpOGtfZmFuX21heCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChy ZXQgPiBJOEtfRkFOX01BWF9SUE0pCi0JCQkJaThrX2Zhbl9tdWx0ID0gMTsKLQkJCWJyZWFrOwot CQl9Ci0JfSBlbHNlIHsKLQkJLyogRmFuIG11bHRpcGxpZXIgd2FzIHNwZWNpZmllZCBpbiBtb2R1 bGUgcGFyYW0gb3IgaW4gZG1pICovCi0JCWk4a19mYW5fbXVsdCA9IGZhbl9tdWx0OwotCX0KLQot CXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpOGtfaW5pdCh2b2lkKQotewotCXN0 cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pOGs7Ci0JaW50IGVycjsKLQotCS8qIEFyZSB3ZSBy dW5uaW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCi0JaWYgKGk4a19wcm9iZSgpKQotCQly ZXR1cm4gLUVOT0RFVjsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCi0JcHJvY19p OGsgPSBwcm9jX2NyZWF0ZSgiaThrIiwgMCwgTlVMTCwgJmk4a19mb3BzKTsKLQlpZiAoIXByb2Nf aThrKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWVyciA9IGk4a19pbml0X2h3bW9uKCk7Ci0JaWYg KGVycikKLQkJZ290byBleGl0X3JlbW92ZV9wcm9jOwotCi0JcmV0dXJuIDA7Ci0KLSBleGl0X3Jl bW92ZV9wcm9jOgotCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKLQlyZXR1cm4gZXJy OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaThrX2V4aXQodm9pZCkKLXsKLQlod21vbl9kZXZp Y2VfdW5yZWdpc3RlcihpOGtfaHdtb25fZGV2KTsKLQlyZW1vdmVfcHJvY19lbnRyeSgiaThrIiwg TlVMTCk7Ci19Ci0KLW1vZHVsZV9pbml0KGk4a19pbml0KTsKLW1vZHVsZV9leGl0KGk4a19leGl0 KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01h a2VmaWxlCmluZGV4IDZjOTQxNDcuLjFjM2U0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24v TWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtMTU1LDYgKzE1NSw3IEBA IG9iai0kKENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUykJKz0gdzgzbDc4NXRzLm8KIG9iai0kKENP TkZJR19TRU5TT1JTX1c4M0w3ODZORykJKz0gdzgzbDc4Nm5nLm8KIG9iai0kKENPTkZJR19TRU5T T1JTX1dNODMxWCkJKz0gd204MzF4LWh3bW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1dNODM1 MCkJKz0gd204MzUwLWh3bW9uLm8KK29iai0kKENPTkZJR19JOEspCQkrPSBkZWxsLXNtbS1od21v bi5vCiAKIG9iai0kKENPTkZJR19QTUJVUykJCSs9IHBtYnVzLwogCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9u LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwNGU0ZgotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwpAQCAtMCwwICsxLDEwMDcg QEAKKy8qCisgKiBkZWxsLXNtbS1od21vbi5jIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5n IHRoZSBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAx ICBNYXNzaW1vIERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KKyAqCisgKiBId21vbiBpbnRlZ3Jh dGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNl LmRlPgorICogQ29weXJpZ2h0IChDKSAyMDEzLCAyMDE0ICBHdWVudGVyIFJvZWNrIDxsaW51eEBy b2Vjay11cy5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMTUgIFBhbGkgUm9ow6FyIDxw YWxpLnJvaGFyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg dGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChh dCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQK KyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl dGFpbHMuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZt dAorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K KyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNs dWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNs dWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVk ZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxp bnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUg PGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4 L2k4ay5oPgorCisjZGVmaW5lIEk4S19TTU1fRk5fU1RBVFVTCTB4MDAyNQorI2RlZmluZSBJOEtf U01NX1BPV0VSX1NUQVRVUwkweDAwNjkKKyNkZWZpbmUgSThLX1NNTV9TRVRfRkFOCQkweDAxYTMK KyNkZWZpbmUgSThLX1NNTV9HRVRfRkFOCQkweDAwYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfU1BF RUQJMHgwMmEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0ZBTl9UWVBFCTB4MDNhMworI2RlZmluZSBJ OEtfU01NX0dFVF9OT01fU1BFRUQJMHgwNGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1RFTVAJMHgx MGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1RFTVBfVFlQRQkweDExYTMKKyNkZWZpbmUgSThLX1NN TV9HRVRfREVMTF9TSUcxCTB4ZmVhMworI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRzIJMHhm ZmEzCisKKyNkZWZpbmUgSThLX0ZBTl9NVUxUCQkzMAorI2RlZmluZSBJOEtfRkFOX01BWF9SUE0J CTMwMDAwCisjZGVmaW5lIEk4S19NQVhfVEVNUAkJMTI3CisKKyNkZWZpbmUgSThLX0ZOX05PTkUJ CTB4MDAKKyNkZWZpbmUgSThLX0ZOX1VQCQkweDAxCisjZGVmaW5lIEk4S19GTl9ET1dOCQkweDAy CisjZGVmaW5lIEk4S19GTl9NVVRFCQkweDA0CisjZGVmaW5lIEk4S19GTl9NQVNLCQkweDA3Cisj ZGVmaW5lIEk4S19GTl9TSElGVAkJOAorCisjZGVmaW5lIEk4S19QT1dFUl9BQwkJMHgwNQorI2Rl ZmluZSBJOEtfUE9XRVJfQkFUVEVSWQkweDAxCisKK3N0YXRpYyBERUZJTkVfTVVURVgoaThrX211 dGV4KTsKK3N0YXRpYyBjaGFyIGJpb3NfdmVyc2lvbls0XTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNl ICppOGtfaHdtb25fZGV2Oworc3RhdGljIHUzMiBpOGtfaHdtb25fZmxhZ3M7CitzdGF0aWMgdWlu dCBpOGtfZmFuX211bHQgPSBJOEtfRkFOX01VTFQ7CitzdGF0aWMgdWludCBpOGtfcHdtX211bHQ7 CitzdGF0aWMgdWludCBpOGtfZmFuX21heCA9IEk4S19GQU5fSElHSDsKKworI2RlZmluZSBJOEtf SFdNT05fSEFWRV9URU1QMQkoMSA8PCAwKQorI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1QMgko MSA8PCAxKQorI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1QMwkoMSA8PCAyKQorI2RlZmluZSBJ OEtfSFdNT05fSEFWRV9URU1QNAkoMSA8PCAzKQorI2RlZmluZSBJOEtfSFdNT05fSEFWRV9GQU4x CSgxIDw8IDQpCisjZGVmaW5lIEk4S19IV01PTl9IQVZFX0ZBTjIJKDEgPDwgNSkKKworTU9EVUxF X0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7CitNT0RVTEVfQVVU SE9SKCJQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJ UFRJT04oIkRyaXZlciBmb3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcyIpOwor TU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpOGsiKTsKKworc3RhdGljIGJv b2wgZm9yY2U7Cittb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVT Qyhmb3JjZSwgIkZvcmNlIGxvYWRpbmcgd2l0aG91dCBjaGVja2luZyBmb3Igc3VwcG9ydGVkIG1v ZGVscyIpOworCitzdGF0aWMgYm9vbCBpZ25vcmVfZG1pOworbW9kdWxlX3BhcmFtKGlnbm9yZV9k bWksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpZ25vcmVfZG1pLCAiQ29udGludWUgcHJv YmluZyBoYXJkd2FyZSBldmVuIGlmIERNSSBkYXRhIGRvZXMgbm90IG1hdGNoIik7CisKK3N0YXRp YyBib29sIHJlc3RyaWN0ZWQ7Cittb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CitN T0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURN SU4gY2FwYWJpbGl0eSBzZXQiKTsKKworc3RhdGljIGJvb2wgcG93ZXJfc3RhdHVzOworbW9kdWxl X3BhcmFtKHBvd2VyX3N0YXR1cywgYm9vbCwgMDYwMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvd2Vy X3N0YXR1cywgIlJlcG9ydCBwb3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7CisKK3N0YXRpYyB1 aW50IGZhbl9tdWx0OworbW9kdWxlX3BhcmFtKGZhbl9tdWx0LCB1aW50LCAwKTsKK01PRFVMRV9Q QVJNX0RFU0MoZmFuX211bHQsICJGYWN0b3IgdG8gbXVsdGlwbHkgZmFuIHNwZWVkIHdpdGggKGRl ZmF1bHQ6IGF1dG9kZXRlY3QpIik7CisKK3N0YXRpYyB1aW50IGZhbl9tYXg7Cittb2R1bGVfcGFy YW0oZmFuX21heCwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZhbl9tYXgsICJNYXhpbXVt IGNvbmZpZ3VyYWJsZSBmYW4gc3BlZWQgKGRlZmF1bHQ6IGF1dG9kZXRlY3QpIik7CisKK3N0YXRp YyBpbnQgaThrX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUp Oworc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5z aWduZWQgbG9uZyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4a19m b3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBpOGtfb3Blbl9mcywK KwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9 IHNpbmdsZV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bAk9IGk4a19pb2N0bCwKK307CisKK3N0 cnVjdCBzbW1fcmVncyB7CisJdW5zaWduZWQgaW50IGVheDsKKwl1bnNpZ25lZCBpbnQgZWJ4IF9f cGFja2VkOworCXVuc2lnbmVkIGludCBlY3ggX19wYWNrZWQ7CisJdW5zaWduZWQgaW50IGVkeCBf X3BhY2tlZDsKKwl1bnNpZ25lZCBpbnQgZXNpIF9fcGFja2VkOworCXVuc2lnbmVkIGludCBlZGkg X19wYWNrZWQ7Cit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmk4a19nZXRfZG1pX2Rh dGEoaW50IGZpZWxkKQoreworCWNvbnN0IGNoYXIgKmRtaV9kYXRhID0gZG1pX2dldF9zeXN0ZW1f aW5mbyhmaWVsZCk7CisKKwlyZXR1cm4gZG1pX2RhdGEgJiYgKmRtaV9kYXRhID8gZG1pX2RhdGEg OiAiPyI7Cit9CisKKy8qCisgKiBDYWxsIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1Mu IENvZGUgcHJvdmlkZWQgYnkgSm9uYXRoYW4gQnV6emFyZC4KKyAqLworc3RhdGljIGludCBpOGtf c21tKHN0cnVjdCBzbW1fcmVncyAqcmVncykKK3sKKwlpbnQgcmM7CisJaW50IGVheCA9IHJlZ3Mt PmVheDsKKwljcHVtYXNrX3Zhcl90IG9sZF9tYXNrOworCisJLyogU01NIHJlcXVpcmVzIENQVSAw ICovCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmb2xkX21hc2ssIEdGUF9LRVJORUwpKQorCQly ZXR1cm4gLUVOT01FTTsKKwljcHVtYXNrX2NvcHkob2xkX21hc2ssICZjdXJyZW50LT5jcHVzX2Fs bG93ZWQpOworCXJjID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZigw KSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDAp IHsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworI2lmIGRlZmluZWQoQ09ORklH X1g4Nl82NCkKKwlhc20gdm9sYXRpbGUoInB1c2hxICUlcmF4XG5cdCIKKwkJIm1vdmwgMCglJXJh eCksJSVlZHhcblx0IgorCQkicHVzaHEgJSVyZHhcblx0IgorCQkibW92bCA0KCUlcmF4KSwlJWVi eFxuXHQiCisJCSJtb3ZsIDgoJSVyYXgpLCUlZWN4XG5cdCIKKwkJIm1vdmwgMTIoJSVyYXgpLCUl ZWR4XG5cdCIKKwkJIm1vdmwgMTYoJSVyYXgpLCUlZXNpXG5cdCIKKwkJIm1vdmwgMjAoJSVyYXgp LCUlZWRpXG5cdCIKKwkJInBvcHEgJSVyYXhcblx0IgorCQkib3V0ICUlYWwsJDB4YjJcblx0Igor CQkib3V0ICUlYWwsJDB4ODRcblx0IgorCQkieGNoZ3EgJSVyYXgsKCUlcnNwKVxuXHQiCisJCSJt b3ZsICUlZWJ4LDQoJSVyYXgpXG5cdCIKKwkJIm1vdmwgJSVlY3gsOCglJXJheClcblx0IgorCQki bW92bCAlJWVkeCwxMiglJXJheClcblx0IgorCQkibW92bCAlJWVzaSwxNiglJXJheClcblx0Igor CQkibW92bCAlJWVkaSwyMCglJXJheClcblx0IgorCQkicG9wcSAlJXJkeFxuXHQiCisJCSJtb3Zs ICUlZWR4LDAoJSVyYXgpXG5cdCIKKwkJInB1c2hmcVxuXHQiCisJCSJwb3BxICUlcmF4XG5cdCIK KwkJImFuZGwgJDEsJSVlYXhcbiIKKwkJOiAiPWEiKHJjKQorCQk6ICAgICJhIihyZWdzKQorCQk6 ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7Cisj ZWxzZQorCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYXhcblx0IgorCSAgICAibW92bCAwKCUlZWF4 KSwlJWVkeFxuXHQiCisJICAgICJwdXNoICUlZWR4XG5cdCIKKwkgICAgIm1vdmwgNCglJWVheCks JSVlYnhcblx0IgorCSAgICAibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiCisJICAgICJtb3ZsIDEy KCUlZWF4KSwlJWVkeFxuXHQiCisJICAgICJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiCisJICAg ICJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiCisJICAgICJwb3BsICUlZWF4XG5cdCIKKwkgICAg Im91dCAlJWFsLCQweGIyXG5cdCIKKwkgICAgIm91dCAlJWFsLCQweDg0XG5cdCIKKwkgICAgInhj aGdsICUlZWF4LCglJWVzcClcblx0IgorCSAgICAibW92bCAlJWVieCw0KCUlZWF4KVxuXHQiCisJ ICAgICJtb3ZsICUlZWN4LDgoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlZHgsMTIoJSVlYXgp XG5cdCIKKwkgICAgIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlZGks MjAoJSVlYXgpXG5cdCIKKwkgICAgInBvcGwgJSVlZHhcblx0IgorCSAgICAibW92bCAlJWVkeCww KCUlZWF4KVxuXHQiCisJICAgICJsYWhmXG5cdCIKKwkgICAgInNocmwgJDgsJSVlYXhcblx0Igor CSAgICAiYW5kbCAkMSwlJWVheFxuIgorCSAgICA6ICI9YSIocmMpCisJICAgIDogICAgImEiKHJl Z3MpCisJICAgIDogICAgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJt ZW1vcnkiKTsKKyNlbmRpZgorCWlmIChyYyAhPSAwIHx8IChyZWdzLT5lYXggJiAweGZmZmYpID09 IDB4ZmZmZiB8fCByZWdzLT5lYXggPT0gZWF4KQorCQlyYyA9IC1FSU5WQUw7CisKK291dDoKKwlz ZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBvbGRfbWFzayk7CisJZnJlZV9jcHVtYXNrX3Zh cihvbGRfbWFzayk7CisJcmV0dXJuIHJjOworfQorCisvKgorICogUmVhZCB0aGUgRm4ga2V5IHN0 YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQoreworCXN0cnVj dCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9GTl9TVEFUVVMsIH07CisJaW50IHJj OworCisJcmMgPSBpOGtfc21tKCZyZWdzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisK Kwlzd2l0Y2ggKChyZWdzLmVheCA+PiBJOEtfRk5fU0hJRlQpICYgSThLX0ZOX01BU0spIHsKKwlj YXNlIEk4S19GTl9VUDoKKwkJcmV0dXJuIEk4S19WT0xfVVA7CisJY2FzZSBJOEtfRk5fRE9XTjoK KwkJcmV0dXJuIEk4S19WT0xfRE9XTjsKKwljYXNlIEk4S19GTl9NVVRFOgorCQlyZXR1cm4gSThL X1ZPTF9NVVRFOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworLyoKKyAqIFJlYWQg dGhlIHBvd2VyIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X3Bvd2VyX3N0YXR1cyh2 b2lkKQoreworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9QT1dFUl9T VEFUVVMsIH07CisJaW50IHJjOworCisJcmMgPSBpOGtfc21tKCZyZWdzKTsKKwlpZiAocmMgPCAw KQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZikgPT0gSThLX1BPV0VS X0FDID8gSThLX0FDIDogSThLX0JBVFRFUlk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBmYW4gc3Rh dHVzLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfZmFuX3N0YXR1cyhpbnQgZmFuKQoreworCXN0 cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfRkFOLCB9OworCisJcmVn cy5lYnggPSBmYW4gJiAweGZmOworCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXgg JiAweGZmOworfQorCisvKgorICogUmVhZCB0aGUgZmFuIHNwZWVkIGluIFJQTS4KKyAqLworc3Rh dGljIGludCBpOGtfZ2V0X2Zhbl9zcGVlZChpbnQgZmFuKQoreworCXN0cnVjdCBzbW1fcmVncyBy ZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQsIH07CisKKwlyZWdzLmVieCA9IGZhbiAm IDB4ZmY7CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXggJiAweGZmZmYpICog aThrX2Zhbl9tdWx0OworfQorCisvKgorICogUmVhZCB0aGUgZmFuIHR5cGUuCisgKi8KK3N0YXRp YyBpbnQgaThrX2dldF9mYW5fdHlwZShpbnQgZmFuKQoreworCXN0cnVjdCBzbW1fcmVncyByZWdz ID0geyAuZWF4ID0gSThLX1NNTV9HRVRfRkFOX1RZUEUsIH07CisKKwlyZWdzLmVieCA9IGZhbiAm IDB4ZmY7CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Cit9CisK Ky8qCisgKiBSZWFkIHRoZSBmYW4gbm9taW5hbCBycG0gZm9yIHNwZWNpZmljIGZhbiBzcGVlZC4K KyAqLworc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9ub21pbmFsX3NwZWVkKGludCBmYW4sIGludCBz cGVlZCkKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX05P TV9TUEVFRCwgfTsKKworCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwor CXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIGk4a19mYW5f bXVsdDsKK30KKworLyoKKyAqIFNldCB0aGUgZmFuIHNwZWVkIChvZmYsIGxvdywgaGlnaCkuIFJl dHVybnMgdGhlIG5ldyBmYW4gc3RhdHVzLgorICovCitzdGF0aWMgaW50IGk4a19zZXRfZmFuKGlu dCBmYW4sIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4 S19TTU1fU0VUX0ZBTiwgfTsKKworCXNwZWVkID0gKHNwZWVkIDwgMCkgPyAwIDogKChzcGVlZCA+ IGk4a19mYW5fbWF4KSA/IGk4a19mYW5fbWF4IDogc3BlZWQpOworCXJlZ3MuZWJ4ID0gKGZhbiAm IDB4ZmYpIHwgKHNwZWVkIDw8IDgpOworCisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiBpOGtf Z2V0X2Zhbl9zdGF0dXMoZmFuKTsKK30KKworc3RhdGljIGludCBpOGtfZ2V0X3RlbXBfdHlwZShp bnQgc2Vuc29yKQoreworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9H RVRfVEVNUF9UWVBFLCB9OworCisJcmVncy5lYnggPSBzZW5zb3IgJiAweGZmOworCXJldHVybiBp OGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOworfQorCisvKgorICogUmVhZCB0aGUg Y3B1IHRlbXBlcmF0dXJlLgorICovCitzdGF0aWMgaW50IF9pOGtfZ2V0X3RlbXAoaW50IHNlbnNv cikKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsKKwkJLmVheCA9IEk4S19TTU1fR0VUX1RF TVAsCisJCS5lYnggPSBzZW5zb3IgJiAweGZmLAorCX07CisKKwlyZXR1cm4gaThrX3NtbSgmcmVn cykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKK30KKworc3RhdGljIGludCBpOGtfZ2V0X3RlbXAoaW50 IHNlbnNvcikKK3sKKwlpbnQgdGVtcCA9IF9pOGtfZ2V0X3RlbXAoc2Vuc29yKTsKKworCS8qCisJ ICogU29tZXRpbWVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBp cyBvdXQgb2YgcmFuZ2UuCisJICogSW4gdGhpcyBjYXNlIHdlIHJldHJ5IChvbmNlKSBiZWZvcmUg cmV0dXJuaW5nIGFuIGVycm9yLgorCSAjIDEwMDM2NTUxMzcgMDAwMDAwNTggMDAwMDVhNGIKKwkg IyAxMDAzNjU1MTM4IDAwMDAwMDk5IDAwMDAzYTgwIDwtLS0gMHg5OSA9IDE1MyBkZWdyZWVzCisJ ICMgMTAwMzY1NTEzOSAwMDAwMDA1NCAwMDAwNWM1MgorCSAqLworCWlmICh0ZW1wID09IDB4OTkp IHsKKwkJbXNsZWVwKDEwMCk7CisJCXRlbXAgPSBfaThrX2dldF90ZW1wKHNlbnNvcik7CisJfQor CS8qCisJICogUmV0dXJuIC1FTk9EQVRBIGZvciBhbGwgaW52YWxpZCB0ZW1wZXJhdHVyZXMuCisJ ICoKKwkgKiBLbm93biBpbnN0YW5jZXMgYXJlIHRoZSAweDk5IHZhbHVlIGFzIHNlZW4gYWJvdmUg YXMgd2VsbCBhcworCSAqIDB4YzEgKDE5MyksIHdoaWNoIG1heSBiZSByZXR1cm5lZCB3aGVuIHRy eWluZyB0byByZWFkIHRoZSBHUFUKKwkgKiB0ZW1wZXJhdHVyZSBpZiB0aGUgc3lzdGVtIHN1cHBv cnRzIGEgR1BVIGFuZCBpdCBpcyBjdXJyZW50bHkKKwkgKiB0dXJuZWQgb2ZmLgorCSAqLworCWlm ICh0ZW1wID4gSThLX01BWF9URU1QKQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlyZXR1cm4gdGVt cDsKK30KKworc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKGludCByZXFfZm4pCit7 CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSByZXFfZm4sIH07CisJaW50IHJjOwor CisJcmMgPSBpOGtfc21tKCZyZWdzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwly ZXR1cm4gcmVncy5lYXggPT0gMTE0NTY1MTUyNyAmJiByZWdzLmVkeCA9PSAxMTQ1MzkyMjA0ID8g MCA6IC0xOworfQorCitzdGF0aWMgaW50CitpOGtfaW9jdGxfdW5sb2NrZWQoc3RydWN0IGZpbGUg KmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdmFsID0g MDsKKwlpbnQgc3BlZWQ7CisJdW5zaWduZWQgY2hhciBidWZmWzE2XTsKKwlpbnQgX191c2VyICph cmdwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlpZiAoIWFyZ3ApCisJCXJldHVybiAtRUlOVkFM OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEk4S19CSU9TX1ZFUlNJT046CisJCXZhbCA9IChi aW9zX3ZlcnNpb25bMF0gPDwgMTYpIHwKKwkJCQkoYmlvc192ZXJzaW9uWzFdIDw8IDgpIHwgYmlv c192ZXJzaW9uWzJdOworCQlicmVhazsKKworCWNhc2UgSThLX01BQ0hJTkVfSUQ6CisJCW1lbXNl dChidWZmLCAwLCAxNik7CisJCXN0cmxjcHkoYnVmZiwgaThrX2dldF9kbWlfZGF0YShETUlfUFJP RFVDVF9TRVJJQUwpLAorCQkJc2l6ZW9mKGJ1ZmYpKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19G Tl9TVEFUVVM6CisJCXZhbCA9IGk4a19nZXRfZm5fc3RhdHVzKCk7CisJCWJyZWFrOworCisJY2Fz ZSBJOEtfUE9XRVJfU1RBVFVTOgorCQl2YWwgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOworCQli cmVhazsKKworCWNhc2UgSThLX0dFVF9URU1QOgorCQl2YWwgPSBpOGtfZ2V0X3RlbXAoMCk7CisJ CWJyZWFrOworCisJY2FzZSBJOEtfR0VUX1NQRUVEOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnZh bCwgYXJncCwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJdmFsID0gaThr X2dldF9mYW5fc3BlZWQodmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19HRVRfRkFOOgorCQlp ZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1F RkFVTFQ7CisKKwkJdmFsID0gaThrX2dldF9mYW5fc3RhdHVzKHZhbCk7CisJCWJyZWFrOworCisJ Y2FzZSBJOEtfU0VUX0ZBTjoKKwkJaWYgKHJlc3RyaWN0ZWQgJiYgIWNhcGFibGUoQ0FQX1NZU19B RE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBh cmdwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY29weV9mcm9t X3VzZXIoJnNwZWVkLCBhcmdwICsgMSwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7 CisKKwkJdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7CisJCWJyZWFrOworCisJZGVmYXVs dDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7 CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwkJaWYgKGNvcHlf dG9fdXNlcihhcmdwLCAmdmFsLCA0KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOwor CWNhc2UgSThLX01BQ0hJTkVfSUQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgYnVmZiwgMTYp KQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGNvcHlf dG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwor CQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0 cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJ bG9uZyByZXQ7CisKKwltdXRleF9sb2NrKCZpOGtfbXV0ZXgpOworCXJldCA9IGk4a19pb2N0bF91 bmxvY2tlZChmcCwgY21kLCBhcmcpOworCW11dGV4X3VubG9jaygmaThrX211dGV4KTsKKworCXJl dHVybiByZXQ7Cit9CisKKy8qCisgKiBQcmludCB0aGUgaW5mb3JtYXRpb24gZm9yIC9wcm9jL2k4 ay4KKyAqLworc3RhdGljIGludCBpOGtfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2 b2lkICpvZmZzZXQpCit7CisJaW50IGZuX2tleSwgY3B1X3RlbXAsIGFjX3Bvd2VyOworCWludCBs ZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3NwZWVkLCByaWdodF9zcGVlZDsKKworCWNwdV90ZW1w CT0gaThrX2dldF90ZW1wKDApOwkJCS8qIDExMTAwIMK1cyAqLworCWxlZnRfZmFuCT0gaThrX2dl dF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwIMK1cyAqLworCXJpZ2h0X2Zhbgk9 IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgwrVzICovCisJbGVm dF9zcGVlZAk9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwIMK1cyAq LworCXJpZ2h0X3NwZWVkCT0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAg NTgwIMK1cyAqLworCWZuX2tleQkJPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwkJCS8qICAgNzUwIMK1 cyAqLworCWlmIChwb3dlcl9zdGF0dXMpCisJCWFjX3Bvd2VyID0gaThrX2dldF9wb3dlcl9zdGF0 dXMoKTsJCS8qIDE0NzAwIMK1cyAqLworCWVsc2UKKwkJYWNfcG93ZXIgPSAtMTsKKworCS8qCisJ ICogSW5mbzoKKwkgKgorCSAqIDEpICBGb3JtYXQgdmVyc2lvbiAodGhpcyB3aWxsIGNoYW5nZSBp ZiBmb3JtYXQgY2hhbmdlcykKKwkgKiAyKSAgQklPUyB2ZXJzaW9uCisJICogMykgIEJJT1MgbWFj aGluZSBJRAorCSAqIDQpICBDcHUgdGVtcGVyYXR1cmUKKwkgKiA1KSAgTGVmdCBmYW4gc3RhdHVz CisJICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKKwkgKiA3KSAgTGVmdCBmYW4gc3BlZWQKKwkgKiA4 KSAgUmlnaHQgZmFuIHNwZWVkCisJICogOSkgIEFDIHBvd2VyCisJICogMTApIEZuIEtleSBzdGF0 dXMKKwkgKi8KKwlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICIlcyAlcyAlcyAlZCAlZCAlZCAlZCAl ZCAlZCAlZFxuIiwKKwkJCSAgSThLX1BST0NfRk1ULAorCQkJICBiaW9zX3ZlcnNpb24sCisJCQkg IGk4a19nZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfU0VSSUFMKSwKKwkJCSAgY3B1X3RlbXAsCisJ CQkgIGxlZnRfZmFuLCByaWdodF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkLAorCQkJICBh Y19wb3dlciwgZm5fa2V5KTsKK30KKworc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5v ZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmls ZSwgaThrX3Byb2Nfc2hvdywgTlVMTCk7Cit9CisKKworLyoKKyAqIEh3bW9uIGludGVyZmFjZQor ICovCisKK3N0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwoc3RydWN0IGRl dmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJ CSBjaGFyICpidWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsYWJlbHNbXSA9IHsK KwkJIkNQVSIsCisJCSJHUFUiLAorCQkiU09ESU1NIiwKKwkJIk90aGVyIiwKKwkJIkFtYmllbnQi LAorCQkiT3RoZXIiLAorCX07CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0 dHIpLT5pbmRleDsKKwlpbnQgdHlwZTsKKworCXR5cGUgPSBpOGtfZ2V0X3RlbXBfdHlwZShpbmRl eCk7CisJaWYgKHR5cGUgPCAwKQorCQlyZXR1cm4gdHlwZTsKKwlpZiAodHlwZSA+PSBBUlJBWV9T SVpFKGxhYmVscykpCisJCXR5cGUgPSBBUlJBWV9TSVpFKGxhYmVscykgLSAxOworCXJldHVybiBz cHJpbnRmKGJ1ZiwgIiVzXG4iLCBsYWJlbHNbdHlwZV0pOworfQorCitzdGF0aWMgc3NpemVfdCBp OGtfaHdtb25fc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2 aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJaW50IGluZGV4 ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgdGVtcDsKKworCXRl bXAgPSBpOGtfZ2V0X3RlbXAoaW5kZXgpOworCWlmICh0ZW1wIDwgMCkKKwkJcmV0dXJuIHRlbXA7 CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAgKiAxMDAwKTsKK30KKworc3RhdGlj IHNzaXplX3QgaThrX2h3bW9uX3Nob3dfZmFuX2xhYmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJ CQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sK KwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxhYmVsc1tdID0geworCQkiUHJvY2Vzc29yIEZh biIsCisJCSJNb3RoZXJib2FyZCBGYW4iLAorCQkiVmlkZW8gRmFuIiwKKwkJIlBvd2VyIFN1cHBs eSBGYW4iLAorCQkiQ2hpcHNldCBGYW4iLAorCQkiT3RoZXIgRmFuIiwKKwl9OworCWludCBpbmRl eCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJYm9vbCBkb2NrID0gZmFs c2U7CisJaW50IHR5cGU7CisKKwl0eXBlID0gaThrX2dldF9mYW5fdHlwZShpbmRleCk7CisJaWYg KHR5cGUgPCAwKQorCQlyZXR1cm4gdHlwZTsKKworCWlmICh0eXBlICYgMHgxMCkgeworCQlkb2Nr ID0gdHJ1ZTsKKwkJdHlwZSAmPSAweDBGOworCX0KKworCWlmICh0eXBlID49IEFSUkFZX1NJWkUo bGFiZWxzKSkKKwkJdHlwZSA9IChBUlJBWV9TSVpFKGxhYmVscykgLSAxKTsKKworCXJldHVybiBz cHJpbnRmKGJ1ZiwgIiVzJXNcbiIsIChkb2NrID8gIkRvY2tpbmcgIiA6ICIiKSwgbGFiZWxzW3R5 cGVdKTsKK30KKworc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfZmFuKHN0cnVjdCBkZXZp Y2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAg Y2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+ aW5kZXg7CisJaW50IGZhbl9zcGVlZDsKKworCWZhbl9zcGVlZCA9IGk4a19nZXRfZmFuX3NwZWVk KGluZGV4KTsKKwlpZiAoZmFuX3NwZWVkIDwgMCkKKwkJcmV0dXJuIGZhbl9zcGVlZDsKKwlyZXR1 cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZmFuX3NwZWVkKTsKK30KKworc3RhdGljIHNzaXplX3Qg aThrX2h3bW9uX3Nob3dfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZp Y2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9 IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJaW50IHN0YXR1czsKKworCXN0 YXR1cyA9IGk4a19nZXRfZmFuX3N0YXR1cyhpbmRleCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJl dHVybiAtRUlPOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjbGFtcF92YWwoc3RhdHVz ICogaThrX3B3bV9tdWx0LCAwLCAyNTUpKTsKK30KKworc3RhdGljIHNzaXplX3QgaThrX2h3bW9u X3NldF9wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0 ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGlu ZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZh bDsKKwlpbnQgZXJyOworCisJZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVy cikKKwkJcmV0dXJuIGVycjsKKwl2YWwgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodmFs LCBpOGtfcHdtX211bHQpLCAwLCBpOGtfZmFuX21heCk7CisKKwltdXRleF9sb2NrKCZpOGtfbXV0 ZXgpOworCWVyciA9IGk4a19zZXRfZmFuKGluZGV4LCB2YWwpOworCW11dGV4X3VubG9jaygmaThr X211dGV4KTsKKworCXJldHVybiBlcnIgPCAwID8gLUVJTyA6IGNvdW50OworfQorCitzdGF0aWMg U0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190 ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbGFiZWwsIFNf SVJVR08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCisJCQkgIDApOworc3RhdGlj IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3df dGVtcCwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2xhYmVsLCBT X0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xhYmVsLCBOVUxMLAorCQkJICAxKTsKK3N0YXRp YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93 X3RlbXAsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19sYWJlbCwg U19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKKwkJCSAgMik7CitzdGF0 aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hv d190ZW1wLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbGFiZWws IFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCisJCQkgIDMpOworc3Rh dGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hv d19mYW4sIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2xhYmVsLCBT X0lSVUdPLCBpOGtfaHdtb25fc2hvd19mYW5fbGFiZWwsIE5VTEwsCisJCQkgIDApOworc3RhdGlj IFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdPIHwgU19JV1VTUiwgaThrX2h3bW9uX3No b3dfcHdtLAorCQkJICBpOGtfaHdtb25fc2V0X3B3bSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklD RV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2ZhbiwgTlVMTCwKKwkJ CSAgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfbGFiZWwsIFNfSVJVR08sIGk4 a19od21vbl9zaG93X2Zhbl9sYWJlbCwgTlVMTCwKKwkJCSAgMSk7CitzdGF0aWMgU0VOU09SX0RF VklDRV9BVFRSKHB3bTIsIFNfSVJVR08gfCBTX0lXVVNSLCBpOGtfaHdtb25fc2hvd19wd20sCisJ CQkgIGk4a19od21vbl9zZXRfcHdtLCAxKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmk4 a19hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0 ciwJLyogMCAqLworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbGFiZWwuZGV2X2F0dHIuYXR0ciwJ LyogMSAqLworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyog MiAqLworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogMyAq LworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNCAqLwor CSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogNSAqLworCSZz ZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogNiAqLworCSZzZW5z b3JfZGV2X2F0dHJfdGVtcDRfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogNyAqLworCSZzZW5zb3Jf ZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA4ICovCisJJnNlbnNvcl9kZXZf YXR0cl9mYW4xX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDkgKi8KKwkmc2Vuc29yX2Rldl9hdHRy X3B3bTEuZGV2X2F0dHIuYXR0ciwJCS8qIDEwICovCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lu cHV0LmRldl9hdHRyLmF0dHIsCS8qIDExICovCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2xhYmVs LmRldl9hdHRyLmF0dHIsCS8qIDEyICovCisJJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRy LmF0dHIsCQkvKiAxMyAqLworCU5VTEwKK307CisKK3N0YXRpYyB1bW9kZV90IGk4a19pc192aXNp YmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAg ICAgaW50IGluZGV4KQoreworCWlmIChpbmRleCA+PSAwICYmIGluZGV4IDw9IDEgJiYKKwkgICAg IShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9URU1QMSkpCisJCXJldHVybiAwOwor CWlmIChpbmRleCA+PSAyICYmIGluZGV4IDw9IDMgJiYKKwkgICAgIShpOGtfaHdtb25fZmxhZ3Mg JiBJOEtfSFdNT05fSEFWRV9URU1QMikpCisJCXJldHVybiAwOworCWlmIChpbmRleCA+PSA0ICYm IGluZGV4IDw9IDUgJiYKKwkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9U RU1QMykpCisJCXJldHVybiAwOworCWlmIChpbmRleCA+PSA2ICYmIGluZGV4IDw9IDcgJiYKKwkg ICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9URU1QNCkpCisJCXJldHVybiAw OworCWlmIChpbmRleCA+PSA4ICYmIGluZGV4IDw9IDEwICYmCisJICAgICEoaThrX2h3bW9uX2Zs YWdzICYgSThLX0hXTU9OX0hBVkVfRkFOMSkpCisJCXJldHVybiAwOworCWlmIChpbmRleCA+PSAx MSAmJiBpbmRleCA8PSAxMyAmJgorCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9I QVZFX0ZBTjIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhdHRyLT5tb2RlOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpOGtfZ3JvdXAgPSB7CisJLmF0dHJzID0g aThrX2F0dHJzLAorCS5pc192aXNpYmxlID0gaThrX2lzX3Zpc2libGUsCit9OworX19BVFRSSUJV VEVfR1JPVVBTKGk4ayk7CisKK3N0YXRpYyBpbnQgX19pbml0IGk4a19pbml0X2h3bW9uKHZvaWQp Cit7CisJaW50IGVycjsKKworCWk4a19od21vbl9mbGFncyA9IDA7CisKKwkvKiBDUFUgdGVtcGVy YXR1cmUgYXR0cmlidXRlcywgaWYgdGVtcGVyYXR1cmUgdHlwZSBpcyBPSyAqLworCWVyciA9IGk4 a19nZXRfdGVtcF90eXBlKDApOworCWlmIChlcnIgPj0gMCkKKwkJaThrX2h3bW9uX2ZsYWdzIHw9 IEk4S19IV01PTl9IQVZFX1RFTVAxOworCS8qIGNoZWNrIGZvciBhZGRpdGlvbmFsIHRlbXBlcmF0 dXJlIHNlbnNvcnMgKi8KKwllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgxKTsKKwlpZiAoZXJyID49 IDApCisJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9URU1QMjsKKwllcnIgPSBp OGtfZ2V0X3RlbXBfdHlwZSgyKTsKKwlpZiAoZXJyID49IDApCisJCWk4a19od21vbl9mbGFncyB8 PSBJOEtfSFdNT05fSEFWRV9URU1QMzsKKwllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgzKTsKKwlp ZiAoZXJyID49IDApCisJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9URU1QNDsK KworCS8qIEZpcnN0IGZhbiBhdHRyaWJ1dGVzLCBpZiBmYW4gdHlwZSBpcyBPSyAqLworCWVyciA9 IGk4a19nZXRfZmFuX3R5cGUoMCk7CisJaWYgKGVyciA+PSAwKQorCQlpOGtfaHdtb25fZmxhZ3Mg fD0gSThLX0hXTU9OX0hBVkVfRkFOMTsKKworCS8qIFNlY29uZCBmYW4gYXR0cmlidXRlcywgaWYg ZmFuIHR5cGUgaXMgT0sgKi8KKwllcnIgPSBpOGtfZ2V0X2Zhbl90eXBlKDEpOworCWlmIChlcnIg Pj0gMCkKKwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX0ZBTjI7CisKKwlpOGtf aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKE5VTEwsICJpOGsi LCBOVUxMLAorCQkJCQkJCSAgaThrX2dyb3Vwcyk7CisJaWYgKElTX0VSUihpOGtfaHdtb25fZGV2 KSkgeworCQllcnIgPSBQVFJfRVJSKGk4a19od21vbl9kZXYpOworCQlpOGtfaHdtb25fZGV2ID0g TlVMTDsKKwkJcHJfZXJyKCJod21vbiByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsIGVycik7 CisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgaThrX2NvbmZpZ19k YXRhIHsKKwl1aW50IGZhbl9tdWx0OworCXVpbnQgZmFuX21heDsKK307CisKK2VudW0gaThrX2Nv bmZpZ3MgeworCURFTExfTEFUSVRVREVfRDUyMCwKKwlERUxMX1BSRUNJU0lPTl80OTAsCisJREVM TF9TVFVESU8sCisJREVMTF9YUFMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGk4a19jb25m aWdfZGF0YSBpOGtfY29uZmlnX2RhdGFbXSA9IHsKKwlbREVMTF9MQVRJVFVERV9ENTIwXSA9IHsK KwkJLmZhbl9tdWx0ID0gMSwKKwkJLmZhbl9tYXggPSBJOEtfRkFOX1RVUkJPLAorCX0sCisJW0RF TExfUFJFQ0lTSU9OXzQ5MF0gPSB7CisJCS5mYW5fbXVsdCA9IDEsCisJCS5mYW5fbWF4ID0gSThL X0ZBTl9UVVJCTywKKwl9LAorCVtERUxMX1NUVURJT10gPSB7CisJCS5mYW5fbXVsdCA9IDEsCisJ CS5mYW5fbWF4ID0gSThLX0ZBTl9ISUdILAorCX0sCisJW0RFTExfWFBTXSA9IHsKKwkJLmZhbl9t dWx0ID0gMSwKKwkJLmZhbl9tYXggPSBJOEtfRkFOX0hJR0gsCisJfSwKK307CisKK3N0YXRpYyBz dHJ1Y3QgZG1pX3N5c3RlbV9pZCBpOGtfZG1pX3RhYmxlW10gX19pbml0ZGF0YSA9IHsKKwl7CisJ CS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0go RE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RV Q1RfTkFNRSwgIkluc3Bpcm9uIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIExh dGl0dWRlIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJE ZWxsIENvbXB1dGVyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRl IiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDIiLAorCQkubWF0 Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJ RE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJJbnNwaXJvbiIpLAorCQl9LAorCX0sCisJewor CQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBENTIwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlf TUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJP RFVDVF9OQU1FLCAiTGF0aXR1ZGUgRDUyMCIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9p ZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9MQVRJVFVERV9ENTIwXSwKKwl9LAorCXsKKwkJLmlk ZW50ID0gIkRlbGwgTGF0aXR1ZGUgMiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERN SV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFN RSwgIkxhdGl0dWRlIiksCisJCX0sCisJfSwKKwl7CS8qIFVLIEluc3Bpcm9uIDY0MDAgICovCisJ CS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRD SChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNU X05BTUUsICJNTTA2MSIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBJbnNwaXJv biAzIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxs IEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVAwNjEiKSwKKwkJfSwK Kwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgUHJlY2lzaW9uIDQ5MCIsCisJCS5tYXRjaGVzID0g eworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFU Q0goRE1JX1BST0RVQ1RfTkFNRSwKKwkJCQkgICJQcmVjaXNpb24gV29ya1N0YXRpb24gNDkwIiks CisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX1BS RUNJU0lPTl80OTBdLAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBQcmVjaXNpb24iLAorCQku bWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAor CQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQcmVjaXNpb24iKSwKKwkJfSwKKwl9LAor CXsKKwkJLmlkZW50ID0gIkRlbGwgVm9zdHJvIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFU Q0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVD VF9OQU1FLCAiVm9zdHJvIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIFhQUzQy MSIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJ bmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlhQUyBMNDIxWCIpLAorCQl9 LAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBTdHVkaW8iLAorCQkubWF0Y2hlcyA9IHsKKwkJ CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERN SV9QUk9EVUNUX05BTUUsICJTdHVkaW8iKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHZvaWQg KikmaThrX2NvbmZpZ19kYXRhW0RFTExfU1RVRElPXSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRl bGwgWFBTIDEzIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1Is ICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTMTMiKSwK KwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfWFBT XSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgWFBTIE0xNDAiLAorCQkubWF0Y2hlcyA9IHsK KwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENI KERNSV9QUk9EVUNUX05BTUUsICJNWEMwNTEiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHZv aWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfWFBTXSwKKwl9LAorCXsgfQorfTsKKworTU9EVUxF X0RFVklDRV9UQUJMRShkbWksIGk4a19kbWlfdGFibGUpOworCisvKgorICogUHJvYmUgZm9yIHRo ZSBwcmVzZW5jZSBvZiBhIHN1cHBvcnRlZCBsYXB0b3AuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0 IGk4a19wcm9iZSh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZDsKKwlp bnQgZmFuLCByZXQ7CisKKwkvKgorCSAqIEdldCBETUkgaW5mb3JtYXRpb24KKwkgKi8KKwlpZiAo IWRtaV9jaGVja19zeXN0ZW0oaThrX2RtaV90YWJsZSkpIHsKKwkJaWYgKCFpZ25vcmVfZG1pICYm ICFmb3JjZSkKKwkJCXJldHVybiAtRU5PREVWOworCisJCXByX2luZm8oIm5vdCBydW5uaW5nIG9u IGEgc3VwcG9ydGVkIERlbGwgc3lzdGVtLlxuIik7CisJCXByX2luZm8oInZlbmRvcj0lcywgbW9k ZWw9JXMsIHZlcnNpb249JXNcbiIsCisJCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9TWVNfVkVORE9S KSwKKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfTkFNRSksCisJCQlpOGtfZ2V0X2Rt aV9kYXRhKERNSV9CSU9TX1ZFUlNJT04pKTsKKwl9CisKKwlzdHJsY3B5KGJpb3NfdmVyc2lvbiwg aThrX2dldF9kbWlfZGF0YShETUlfQklPU19WRVJTSU9OKSwKKwkJc2l6ZW9mKGJpb3NfdmVyc2lv bikpOworCisJLyoKKwkgKiBHZXQgU01NIERlbGwgc2lnbmF0dXJlCisJICovCisJaWYgKGk4a19n ZXRfZGVsbF9zaWduYXR1cmUoSThLX1NNTV9HRVRfREVMTF9TSUcxKSAmJgorCSAgICBpOGtfZ2V0 X2RlbGxfc2lnbmF0dXJlKEk4S19TTU1fR0VUX0RFTExfU0lHMikpIHsKKwkJcHJfZXJyKCJ1bmFi bGUgdG8gZ2V0IFNNTSBEZWxsIHNpZ25hdHVyZVxuIik7CisJCWlmICghZm9yY2UpCisJCQlyZXR1 cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIFNldCBmYW4gbXVsdGlwbGllciBhbmQgbWF4aW1h bCBmYW4gc3BlZWQgZnJvbSBkbWkgY29uZmlnCisJICogVmFsdWVzIHNwZWNpZmllZCBpbiBtb2R1 bGUgcGFyYW1ldGVycyBvdmVycmlkZSB2YWx1ZXMgZnJvbSBkbWkKKwkgKi8KKwlpZCA9IGRtaV9m aXJzdF9tYXRjaChpOGtfZG1pX3RhYmxlKTsKKwlpZiAoaWQgJiYgaWQtPmRyaXZlcl9kYXRhKSB7 CisJCWNvbnN0IHN0cnVjdCBpOGtfY29uZmlnX2RhdGEgKmNvbmYgPSBpZC0+ZHJpdmVyX2RhdGE7 CisJCWlmICghZmFuX211bHQgJiYgY29uZi0+ZmFuX211bHQpCisJCQlmYW5fbXVsdCA9IGNvbmYt PmZhbl9tdWx0OworCQlpZiAoIWZhbl9tYXggJiYgY29uZi0+ZmFuX21heCkKKwkJCWZhbl9tYXgg PSBjb25mLT5mYW5fbWF4OworCX0KKworCWk4a19mYW5fbWF4ID0gZmFuX21heCA/IDogSThLX0ZB Tl9ISUdIOwkvKiBNdXN0IG5vdCBiZSAwICovCisJaThrX3B3bV9tdWx0ID0gRElWX1JPVU5EX1VQ KDI1NSwgaThrX2Zhbl9tYXgpOworCisJaWYgKCFmYW5fbXVsdCkgeworCQkvKgorCQkgKiBBdXRv ZGV0ZWN0IGZhbiBtdWx0aXBsaWVyIGJhc2VkIG9uIG5vbWluYWwgcnBtCisJCSAqIElmIGZhbiBy ZXBvcnRzIHJwbSB2YWx1ZSB0b28gaGlnaCB0aGVuIHNldCBtdWx0aXBsaWVyIHRvIDEKKwkJICov CisJCWZvciAoZmFuID0gMDsgZmFuIDwgMjsgKytmYW4pIHsKKwkJCXJldCA9IGk4a19nZXRfZmFu X25vbWluYWxfc3BlZWQoZmFuLCBpOGtfZmFuX21heCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlj b250aW51ZTsKKwkJCWlmIChyZXQgPiBJOEtfRkFOX01BWF9SUE0pCisJCQkJaThrX2Zhbl9tdWx0 ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogRmFuIG11bHRpcGxpZXIgd2Fz IHNwZWNpZmllZCBpbiBtb2R1bGUgcGFyYW0gb3IgaW4gZG1pICovCisJCWk4a19mYW5fbXVsdCA9 IGZhbl9tdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpOGtf aW5pdCh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pOGs7CisJaW50IGVy cjsKKworCS8qIEFyZSB3ZSBydW5uaW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCisJaWYg KGk4a19wcm9iZSgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlZ2lzdGVyIHRoZSBwcm9j IGVudHJ5ICovCisJcHJvY19pOGsgPSBwcm9jX2NyZWF0ZSgiaThrIiwgMCwgTlVMTCwgJmk4a19m b3BzKTsKKwlpZiAoIXByb2NfaThrKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWVyciA9IGk4a19p bml0X2h3bW9uKCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X3JlbW92ZV9wcm9jOworCisJcmV0 dXJuIDA7CisKKyBleGl0X3JlbW92ZV9wcm9jOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBO VUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaThrX2V4aXQodm9p ZCkKK3sKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihpOGtfaHdtb25fZGV2KTsKKwlyZW1vdmVf cHJvY19lbnRyeSgiaThrIiwgTlVMTCk7Cit9CisKK21vZHVsZV9pbml0KGk4a19pbml0KTsKK21v ZHVsZV9leGl0KGk4a19leGl0KTsKLS0gCjEuNy45LjUKCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5z b3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-28 14:31 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:31 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 03:24 AM, Pali Rohár wrote: > This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is > better name then abbreviation i8k. For backward compatibility is added macro > MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K > compile option was not changed. > > This commit also adds me as maintainer of this new dell-smm-hwmon driver. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Looks ok to me, so I'll be happy to take it for 4.1 if Greg agrees. I thought about moving the I8K configuration option as well. Not really sure what to do there. Greg, any opinion ? It would have to reside outside the HWMON block of drivers/hwmon/Kconfig if we move it. We also can drop me as explicit maintainer - I am on the hook from the hwmon side anyway, and we don't need to step on each other's foot for this driver. Thanks, Guenter > --- > MAINTAINERS | 3 +- > drivers/char/Makefile | 1 - > drivers/char/i8k.c | 1005 --------------------------------------- > drivers/hwmon/Makefile | 1 + > drivers/hwmon/dell-smm-hwmon.c | 1007 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 1010 insertions(+), 1007 deletions(-) > delete mode 100644 drivers/char/i8k.c > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > diff --git a/MAINTAINERS b/MAINTAINERS > index 88c09ca..bf5bb05 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3064,8 +3064,9 @@ F: drivers/platform/x86/dell-laptop.c > > DELL LAPTOP SMM DRIVER > M: Guenter Roeck <linux@roeck-us.net> > +M: Pali Rohár <pali.rohar@gmail.com> > S: Maintained > -F: drivers/char/i8k.c > +F: drivers/hwmon/dell-smm-hwmon.c > F: include/uapi/linux/i8k.h > > DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) > diff --git a/drivers/char/Makefile b/drivers/char/Makefile > index d06cde26..1d9cf00 100644 > --- a/drivers/char/Makefile > +++ b/drivers/char/Makefile > @@ -36,7 +36,6 @@ else > obj-$(CONFIG_NVRAM) += nvram.o > endif > obj-$(CONFIG_TOSHIBA) += toshiba.o > -obj-$(CONFIG_I8K) += i8k.o > obj-$(CONFIG_DS1620) += ds1620.o > obj-$(CONFIG_HW_RANDOM) += hw_random/ > obj-$(CONFIG_PPDEV) += ppdev.o > diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c > deleted file mode 100644 > index 24cc4ed..0000000 > --- a/drivers/char/i8k.c > +++ /dev/null > @@ -1,1005 +0,0 @@ > -/* > - * i8k.c -- Linux driver for accessing the SMM BIOS on Dell laptops. > - * > - * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> > - * > - * Hwmon integration: > - * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> > - * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> > - * Copyright (C) 2014 Pali Rohár <pali.rohar@gmail.com> > - * > - * This program is free software; you can redistribute it and/or modify it > - * under the terms of the GNU General Public License as published by the > - * Free Software Foundation; either version 2, or (at your option) any > - * later version. > - * > - * This program is distributed in the hope that it will be useful, but > - * WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - * General Public License for more details. > - */ > - > -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > - > -#include <linux/delay.h> > -#include <linux/module.h> > -#include <linux/types.h> > -#include <linux/init.h> > -#include <linux/proc_fs.h> > -#include <linux/seq_file.h> > -#include <linux/dmi.h> > -#include <linux/capability.h> > -#include <linux/mutex.h> > -#include <linux/hwmon.h> > -#include <linux/hwmon-sysfs.h> > -#include <linux/uaccess.h> > -#include <linux/io.h> > -#include <linux/sched.h> > - > -#include <linux/i8k.h> > - > -#define I8K_SMM_FN_STATUS 0x0025 > -#define I8K_SMM_POWER_STATUS 0x0069 > -#define I8K_SMM_SET_FAN 0x01a3 > -#define I8K_SMM_GET_FAN 0x00a3 > -#define I8K_SMM_GET_SPEED 0x02a3 > -#define I8K_SMM_GET_FAN_TYPE 0x03a3 > -#define I8K_SMM_GET_NOM_SPEED 0x04a3 > -#define I8K_SMM_GET_TEMP 0x10a3 > -#define I8K_SMM_GET_TEMP_TYPE 0x11a3 > -#define I8K_SMM_GET_DELL_SIG1 0xfea3 > -#define I8K_SMM_GET_DELL_SIG2 0xffa3 > - > -#define I8K_FAN_MULT 30 > -#define I8K_FAN_MAX_RPM 30000 > -#define I8K_MAX_TEMP 127 > - > -#define I8K_FN_NONE 0x00 > -#define I8K_FN_UP 0x01 > -#define I8K_FN_DOWN 0x02 > -#define I8K_FN_MUTE 0x04 > -#define I8K_FN_MASK 0x07 > -#define I8K_FN_SHIFT 8 > - > -#define I8K_POWER_AC 0x05 > -#define I8K_POWER_BATTERY 0x01 > - > -static DEFINE_MUTEX(i8k_mutex); > -static char bios_version[4]; > -static struct device *i8k_hwmon_dev; > -static u32 i8k_hwmon_flags; > -static uint i8k_fan_mult = I8K_FAN_MULT; > -static uint i8k_pwm_mult; > -static uint i8k_fan_max = I8K_FAN_HIGH; > - > -#define I8K_HWMON_HAVE_TEMP1 (1 << 0) > -#define I8K_HWMON_HAVE_TEMP2 (1 << 1) > -#define I8K_HWMON_HAVE_TEMP3 (1 << 2) > -#define I8K_HWMON_HAVE_TEMP4 (1 << 3) > -#define I8K_HWMON_HAVE_FAN1 (1 << 4) > -#define I8K_HWMON_HAVE_FAN2 (1 << 5) > - > -MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); > -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); > -MODULE_LICENSE("GPL"); > - > -static bool force; > -module_param(force, bool, 0); > -MODULE_PARM_DESC(force, "Force loading without checking for supported models"); > - > -static bool ignore_dmi; > -module_param(ignore_dmi, bool, 0); > -MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); > - > -static bool restricted; > -module_param(restricted, bool, 0); > -MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > - > -static bool power_status; > -module_param(power_status, bool, 0600); > -MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); > - > -static uint fan_mult; > -module_param(fan_mult, uint, 0); > -MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); > - > -static uint fan_max; > -module_param(fan_max, uint, 0); > -MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); > - > -static int i8k_open_fs(struct inode *inode, struct file *file); > -static long i8k_ioctl(struct file *, unsigned int, unsigned long); > - > -static const struct file_operations i8k_fops = { > - .owner = THIS_MODULE, > - .open = i8k_open_fs, > - .read = seq_read, > - .llseek = seq_lseek, > - .release = single_release, > - .unlocked_ioctl = i8k_ioctl, > -}; > - > -struct smm_regs { > - unsigned int eax; > - unsigned int ebx __packed; > - unsigned int ecx __packed; > - unsigned int edx __packed; > - unsigned int esi __packed; > - unsigned int edi __packed; > -}; > - > -static inline const char *i8k_get_dmi_data(int field) > -{ > - const char *dmi_data = dmi_get_system_info(field); > - > - return dmi_data && *dmi_data ? dmi_data : "?"; > -} > - > -/* > - * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. > - */ > -static int i8k_smm(struct smm_regs *regs) > -{ > - int rc; > - int eax = regs->eax; > - cpumask_var_t old_mask; > - > - /* SMM requires CPU 0 */ > - if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) > - return -ENOMEM; > - cpumask_copy(old_mask, ¤t->cpus_allowed); > - rc = set_cpus_allowed_ptr(current, cpumask_of(0)); > - if (rc) > - goto out; > - if (smp_processor_id() != 0) { > - rc = -EBUSY; > - goto out; > - } > - > -#if defined(CONFIG_X86_64) > - asm volatile("pushq %%rax\n\t" > - "movl 0(%%rax),%%edx\n\t" > - "pushq %%rdx\n\t" > - "movl 4(%%rax),%%ebx\n\t" > - "movl 8(%%rax),%%ecx\n\t" > - "movl 12(%%rax),%%edx\n\t" > - "movl 16(%%rax),%%esi\n\t" > - "movl 20(%%rax),%%edi\n\t" > - "popq %%rax\n\t" > - "out %%al,$0xb2\n\t" > - "out %%al,$0x84\n\t" > - "xchgq %%rax,(%%rsp)\n\t" > - "movl %%ebx,4(%%rax)\n\t" > - "movl %%ecx,8(%%rax)\n\t" > - "movl %%edx,12(%%rax)\n\t" > - "movl %%esi,16(%%rax)\n\t" > - "movl %%edi,20(%%rax)\n\t" > - "popq %%rdx\n\t" > - "movl %%edx,0(%%rax)\n\t" > - "pushfq\n\t" > - "popq %%rax\n\t" > - "andl $1,%%eax\n" > - : "=a"(rc) > - : "a"(regs) > - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); > -#else > - asm volatile("pushl %%eax\n\t" > - "movl 0(%%eax),%%edx\n\t" > - "push %%edx\n\t" > - "movl 4(%%eax),%%ebx\n\t" > - "movl 8(%%eax),%%ecx\n\t" > - "movl 12(%%eax),%%edx\n\t" > - "movl 16(%%eax),%%esi\n\t" > - "movl 20(%%eax),%%edi\n\t" > - "popl %%eax\n\t" > - "out %%al,$0xb2\n\t" > - "out %%al,$0x84\n\t" > - "xchgl %%eax,(%%esp)\n\t" > - "movl %%ebx,4(%%eax)\n\t" > - "movl %%ecx,8(%%eax)\n\t" > - "movl %%edx,12(%%eax)\n\t" > - "movl %%esi,16(%%eax)\n\t" > - "movl %%edi,20(%%eax)\n\t" > - "popl %%edx\n\t" > - "movl %%edx,0(%%eax)\n\t" > - "lahf\n\t" > - "shrl $8,%%eax\n\t" > - "andl $1,%%eax\n" > - : "=a"(rc) > - : "a"(regs) > - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); > -#endif > - if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) > - rc = -EINVAL; > - > -out: > - set_cpus_allowed_ptr(current, old_mask); > - free_cpumask_var(old_mask); > - return rc; > -} > - > -/* > - * Read the Fn key status. > - */ > -static int i8k_get_fn_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > - case I8K_FN_UP: > - return I8K_VOL_UP; > - case I8K_FN_DOWN: > - return I8K_VOL_DOWN; > - case I8K_FN_MUTE: > - return I8K_VOL_MUTE; > - default: > - return 0; > - } > -} > - > -/* > - * Read the power status. > - */ > -static int i8k_get_power_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > -} > - > -/* > - * Read the fan status. > - */ > -static int i8k_get_fan_status(int fan) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; > - > - regs.ebx = fan & 0xff; > - return i8k_smm(®s) ? : regs.eax & 0xff; > -} > - > -/* > - * Read the fan speed in RPM. > - */ > -static int i8k_get_fan_speed(int fan) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; > - > - regs.ebx = fan & 0xff; > - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; > -} > - > -/* > - * Read the fan type. > - */ > -static int i8k_get_fan_type(int fan) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; > - > - regs.ebx = fan & 0xff; > - return i8k_smm(®s) ? : regs.eax & 0xff; > -} > - > -/* > - * Read the fan nominal rpm for specific fan speed. > - */ > -static int i8k_get_fan_nominal_speed(int fan, int speed) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; > - > - regs.ebx = (fan & 0xff) | (speed << 8); > - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; > -} > - > -/* > - * Set the fan speed (off, low, high). Returns the new fan status. > - */ > -static int i8k_set_fan(int fan, int speed) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; > - > - speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); > - regs.ebx = (fan & 0xff) | (speed << 8); > - > - return i8k_smm(®s) ? : i8k_get_fan_status(fan); > -} > - > -static int i8k_get_temp_type(int sensor) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; > - > - regs.ebx = sensor & 0xff; > - return i8k_smm(®s) ? : regs.eax & 0xff; > -} > - > -/* > - * Read the cpu temperature. > - */ > -static int _i8k_get_temp(int sensor) > -{ > - struct smm_regs regs = { > - .eax = I8K_SMM_GET_TEMP, > - .ebx = sensor & 0xff, > - }; > - > - return i8k_smm(®s) ? : regs.eax & 0xff; > -} > - > -static int i8k_get_temp(int sensor) > -{ > - int temp = _i8k_get_temp(sensor); > - > - /* > - * Sometimes the temperature sensor returns 0x99, which is out of range. > - * In this case we retry (once) before returning an error. > - # 1003655137 00000058 00005a4b > - # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees > - # 1003655139 00000054 00005c52 > - */ > - if (temp == 0x99) { > - msleep(100); > - temp = _i8k_get_temp(sensor); > - } > - /* > - * Return -ENODATA for all invalid temperatures. > - * > - * Known instances are the 0x99 value as seen above as well as > - * 0xc1 (193), which may be returned when trying to read the GPU > - * temperature if the system supports a GPU and it is currently > - * turned off. > - */ > - if (temp > I8K_MAX_TEMP) > - return -ENODATA; > - > - return temp; > -} > - > -static int i8k_get_dell_signature(int req_fn) > -{ > - struct smm_regs regs = { .eax = req_fn, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; > -} > - > -static int > -i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) > -{ > - int val = 0; > - int speed; > - unsigned char buff[16]; > - int __user *argp = (int __user *)arg; > - > - if (!argp) > - return -EINVAL; > - > - switch (cmd) { > - case I8K_BIOS_VERSION: > - val = (bios_version[0] << 16) | > - (bios_version[1] << 8) | bios_version[2]; > - break; > - > - case I8K_MACHINE_ID: > - memset(buff, 0, 16); > - strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), > - sizeof(buff)); > - break; > - > - case I8K_FN_STATUS: > - val = i8k_get_fn_status(); > - break; > - > - case I8K_POWER_STATUS: > - val = i8k_get_power_status(); > - break; > - > - case I8K_GET_TEMP: > - val = i8k_get_temp(0); > - break; > - > - case I8K_GET_SPEED: > - if (copy_from_user(&val, argp, sizeof(int))) > - return -EFAULT; > - > - val = i8k_get_fan_speed(val); > - break; > - > - case I8K_GET_FAN: > - if (copy_from_user(&val, argp, sizeof(int))) > - return -EFAULT; > - > - val = i8k_get_fan_status(val); > - break; > - > - case I8K_SET_FAN: > - if (restricted && !capable(CAP_SYS_ADMIN)) > - return -EPERM; > - > - if (copy_from_user(&val, argp, sizeof(int))) > - return -EFAULT; > - > - if (copy_from_user(&speed, argp + 1, sizeof(int))) > - return -EFAULT; > - > - val = i8k_set_fan(val, speed); > - break; > - > - default: > - return -EINVAL; > - } > - > - if (val < 0) > - return val; > - > - switch (cmd) { > - case I8K_BIOS_VERSION: > - if (copy_to_user(argp, &val, 4)) > - return -EFAULT; > - > - break; > - case I8K_MACHINE_ID: > - if (copy_to_user(argp, buff, 16)) > - return -EFAULT; > - > - break; > - default: > - if (copy_to_user(argp, &val, sizeof(int))) > - return -EFAULT; > - > - break; > - } > - > - return 0; > -} > - > -static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) > -{ > - long ret; > - > - mutex_lock(&i8k_mutex); > - ret = i8k_ioctl_unlocked(fp, cmd, arg); > - mutex_unlock(&i8k_mutex); > - > - return ret; > -} > - > -/* > - * Print the information for /proc/i8k. > - */ > -static int i8k_proc_show(struct seq_file *seq, void *offset) > -{ > - int fn_key, cpu_temp, ac_power; > - int left_fan, right_fan, left_speed, right_speed; > - > - cpu_temp = i8k_get_temp(0); /* 11100 µs */ > - left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ > - right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ > - left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ > - right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ > - fn_key = i8k_get_fn_status(); /* 750 µs */ > - if (power_status) > - ac_power = i8k_get_power_status(); /* 14700 µs */ > - else > - ac_power = -1; > - > - /* > - * Info: > - * > - * 1) Format version (this will change if format changes) > - * 2) BIOS version > - * 3) BIOS machine ID > - * 4) Cpu temperature > - * 5) Left fan status > - * 6) Right fan status > - * 7) Left fan speed > - * 8) Right fan speed > - * 9) AC power > - * 10) Fn Key status > - */ > - return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", > - I8K_PROC_FMT, > - bios_version, > - i8k_get_dmi_data(DMI_PRODUCT_SERIAL), > - cpu_temp, > - left_fan, right_fan, left_speed, right_speed, > - ac_power, fn_key); > -} > - > -static int i8k_open_fs(struct inode *inode, struct file *file) > -{ > - return single_open(file, i8k_proc_show, NULL); > -} > - > - > -/* > - * Hwmon interface > - */ > - > -static ssize_t i8k_hwmon_show_temp_label(struct device *dev, > - struct device_attribute *devattr, > - char *buf) > -{ > - static const char * const labels[] = { > - "CPU", > - "GPU", > - "SODIMM", > - "Other", > - "Ambient", > - "Other", > - }; > - int index = to_sensor_dev_attr(devattr)->index; > - int type; > - > - type = i8k_get_temp_type(index); > - if (type < 0) > - return type; > - if (type >= ARRAY_SIZE(labels)) > - type = ARRAY_SIZE(labels) - 1; > - return sprintf(buf, "%s\n", labels[type]); > -} > - > -static ssize_t i8k_hwmon_show_temp(struct device *dev, > - struct device_attribute *devattr, > - char *buf) > -{ > - int index = to_sensor_dev_attr(devattr)->index; > - int temp; > - > - temp = i8k_get_temp(index); > - if (temp < 0) > - return temp; > - return sprintf(buf, "%d\n", temp * 1000); > -} > - > -static ssize_t i8k_hwmon_show_fan_label(struct device *dev, > - struct device_attribute *devattr, > - char *buf) > -{ > - static const char * const labels[] = { > - "Processor Fan", > - "Motherboard Fan", > - "Video Fan", > - "Power Supply Fan", > - "Chipset Fan", > - "Other Fan", > - }; > - int index = to_sensor_dev_attr(devattr)->index; > - bool dock = false; > - int type; > - > - type = i8k_get_fan_type(index); > - if (type < 0) > - return type; > - > - if (type & 0x10) { > - dock = true; > - type &= 0x0F; > - } > - > - if (type >= ARRAY_SIZE(labels)) > - type = (ARRAY_SIZE(labels) - 1); > - > - return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); > -} > - > -static ssize_t i8k_hwmon_show_fan(struct device *dev, > - struct device_attribute *devattr, > - char *buf) > -{ > - int index = to_sensor_dev_attr(devattr)->index; > - int fan_speed; > - > - fan_speed = i8k_get_fan_speed(index); > - if (fan_speed < 0) > - return fan_speed; > - return sprintf(buf, "%d\n", fan_speed); > -} > - > -static ssize_t i8k_hwmon_show_pwm(struct device *dev, > - struct device_attribute *devattr, > - char *buf) > -{ > - int index = to_sensor_dev_attr(devattr)->index; > - int status; > - > - status = i8k_get_fan_status(index); > - if (status < 0) > - return -EIO; > - return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); > -} > - > -static ssize_t i8k_hwmon_set_pwm(struct device *dev, > - struct device_attribute *attr, > - const char *buf, size_t count) > -{ > - int index = to_sensor_dev_attr(attr)->index; > - unsigned long val; > - int err; > - > - err = kstrtoul(buf, 10, &val); > - if (err) > - return err; > - val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); > - > - mutex_lock(&i8k_mutex); > - err = i8k_set_fan(index, val); > - mutex_unlock(&i8k_mutex); > - > - return err < 0 ? -EIO : count; > -} > - > -static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); > -static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > - 0); > -static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); > -static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > - 1); > -static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); > -static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > - 2); > -static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); > -static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > - 3); > -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); > -static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, > - 0); > -static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, > - i8k_hwmon_set_pwm, 0); > -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, > - 1); > -static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, > - 1); > -static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, > - i8k_hwmon_set_pwm, 1); > - > -static struct attribute *i8k_attrs[] = { > - &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ > - &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ > - &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ > - &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ > - &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ > - &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ > - &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ > - &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ > - &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ > - &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ > - &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ > - &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ > - &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ > - &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ > - NULL > -}; > - > -static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, > - int index) > -{ > - if (index >= 0 && index <= 1 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) > - return 0; > - if (index >= 2 && index <= 3 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) > - return 0; > - if (index >= 4 && index <= 5 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) > - return 0; > - if (index >= 6 && index <= 7 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) > - return 0; > - if (index >= 8 && index <= 10 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) > - return 0; > - if (index >= 11 && index <= 13 && > - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) > - return 0; > - > - return attr->mode; > -} > - > -static const struct attribute_group i8k_group = { > - .attrs = i8k_attrs, > - .is_visible = i8k_is_visible, > -}; > -__ATTRIBUTE_GROUPS(i8k); > - > -static int __init i8k_init_hwmon(void) > -{ > - int err; > - > - i8k_hwmon_flags = 0; > - > - /* CPU temperature attributes, if temperature type is OK */ > - err = i8k_get_temp_type(0); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; > - /* check for additional temperature sensors */ > - err = i8k_get_temp_type(1); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; > - err = i8k_get_temp_type(2); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; > - err = i8k_get_temp_type(3); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; > - > - /* First fan attributes, if fan type is OK */ > - err = i8k_get_fan_type(0); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; > - > - /* Second fan attributes, if fan type is OK */ > - err = i8k_get_fan_type(1); > - if (err >= 0) > - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > - > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, > - i8k_groups); > - if (IS_ERR(i8k_hwmon_dev)) { > - err = PTR_ERR(i8k_hwmon_dev); > - i8k_hwmon_dev = NULL; > - pr_err("hwmon registration failed (%d)\n", err); > - return err; > - } > - return 0; > -} > - > -struct i8k_config_data { > - uint fan_mult; > - uint fan_max; > -}; > - > -enum i8k_configs { > - DELL_LATITUDE_D520, > - DELL_PRECISION_490, > - DELL_STUDIO, > - DELL_XPS, > -}; > - > -static const struct i8k_config_data i8k_config_data[] = { > - [DELL_LATITUDE_D520] = { > - .fan_mult = 1, > - .fan_max = I8K_FAN_TURBO, > - }, > - [DELL_PRECISION_490] = { > - .fan_mult = 1, > - .fan_max = I8K_FAN_TURBO, > - }, > - [DELL_STUDIO] = { > - .fan_mult = 1, > - .fan_max = I8K_FAN_HIGH, > - }, > - [DELL_XPS] = { > - .fan_mult = 1, > - .fan_max = I8K_FAN_HIGH, > - }, > -}; > - > -static struct dmi_system_id i8k_dmi_table[] __initdata = { > - { > - .ident = "Dell Inspiron", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), > - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), > - }, > - }, > - { > - .ident = "Dell Latitude", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), > - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), > - }, > - }, > - { > - .ident = "Dell Inspiron 2", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), > - }, > - }, > - { > - .ident = "Dell Latitude D520", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), > - }, > - .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], > - }, > - { > - .ident = "Dell Latitude 2", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), > - }, > - }, > - { /* UK Inspiron 6400 */ > - .ident = "Dell Inspiron 3", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), > - }, > - }, > - { > - .ident = "Dell Inspiron 3", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), > - }, > - }, > - { > - .ident = "Dell Precision 490", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, > - "Precision WorkStation 490"), > - }, > - .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], > - }, > - { > - .ident = "Dell Precision", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), > - }, > - }, > - { > - .ident = "Dell Vostro", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), > - }, > - }, > - { > - .ident = "Dell XPS421", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), > - }, > - }, > - { > - .ident = "Dell Studio", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), > - }, > - .driver_data = (void *)&i8k_config_data[DELL_STUDIO], > - }, > - { > - .ident = "Dell XPS 13", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), > - }, > - .driver_data = (void *)&i8k_config_data[DELL_XPS], > - }, > - { > - .ident = "Dell XPS M140", > - .matches = { > - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > - DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), > - }, > - .driver_data = (void *)&i8k_config_data[DELL_XPS], > - }, > - { } > -}; > - > -MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); > - > -/* > - * Probe for the presence of a supported laptop. > - */ > -static int __init i8k_probe(void) > -{ > - const struct dmi_system_id *id; > - int fan, ret; > - > - /* > - * Get DMI information > - */ > - if (!dmi_check_system(i8k_dmi_table)) { > - if (!ignore_dmi && !force) > - return -ENODEV; > - > - pr_info("not running on a supported Dell system.\n"); > - pr_info("vendor=%s, model=%s, version=%s\n", > - i8k_get_dmi_data(DMI_SYS_VENDOR), > - i8k_get_dmi_data(DMI_PRODUCT_NAME), > - i8k_get_dmi_data(DMI_BIOS_VERSION)); > - } > - > - strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), > - sizeof(bios_version)); > - > - /* > - * Get SMM Dell signature > - */ > - if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && > - i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { > - pr_err("unable to get SMM Dell signature\n"); > - if (!force) > - return -ENODEV; > - } > - > - /* > - * Set fan multiplier and maximal fan speed from dmi config > - * Values specified in module parameters override values from dmi > - */ > - id = dmi_first_match(i8k_dmi_table); > - if (id && id->driver_data) { > - const struct i8k_config_data *conf = id->driver_data; > - if (!fan_mult && conf->fan_mult) > - fan_mult = conf->fan_mult; > - if (!fan_max && conf->fan_max) > - fan_max = conf->fan_max; > - } > - > - i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ > - i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); > - > - if (!fan_mult) { > - /* > - * Autodetect fan multiplier based on nominal rpm > - * If fan reports rpm value too high then set multiplier to 1 > - */ > - for (fan = 0; fan < 2; ++fan) { > - ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); > - if (ret < 0) > - continue; > - if (ret > I8K_FAN_MAX_RPM) > - i8k_fan_mult = 1; > - break; > - } > - } else { > - /* Fan multiplier was specified in module param or in dmi */ > - i8k_fan_mult = fan_mult; > - } > - > - return 0; > -} > - > -static int __init i8k_init(void) > -{ > - struct proc_dir_entry *proc_i8k; > - int err; > - > - /* Are we running on an supported laptop? */ > - if (i8k_probe()) > - return -ENODEV; > - > - /* Register the proc entry */ > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > - if (!proc_i8k) > - return -ENOENT; > - > - err = i8k_init_hwmon(); > - if (err) > - goto exit_remove_proc; > - > - return 0; > - > - exit_remove_proc: > - remove_proc_entry("i8k", NULL); > - return err; > -} > - > -static void __exit i8k_exit(void) > -{ > - hwmon_device_unregister(i8k_hwmon_dev); > - remove_proc_entry("i8k", NULL); > -} > - > -module_init(i8k_init); > -module_exit(i8k_exit); > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > index 6c94147..1c3e458 100644 > --- a/drivers/hwmon/Makefile > +++ b/drivers/hwmon/Makefile > @@ -155,6 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > +obj-$(CONFIG_I8K) += dell-smm-hwmon.o > > obj-$(CONFIG_PMBUS) += pmbus/ > > diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c > new file mode 100644 > index 0000000..2b04e4f > --- /dev/null > +++ b/drivers/hwmon/dell-smm-hwmon.c > @@ -0,0 +1,1007 @@ > +/* > + * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops. > + * > + * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> > + * > + * Hwmon integration: > + * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> > + * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> > + * Copyright (C) 2014, 2015 Pali Rohár <pali.rohar@gmail.com> > + * > + * This program is free software; you can redistribute it and/or modify it > + * under the terms of the GNU General Public License as published by the > + * Free Software Foundation; either version 2, or (at your option) any > + * later version. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + */ > + > +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > + > +#include <linux/delay.h> > +#include <linux/module.h> > +#include <linux/types.h> > +#include <linux/init.h> > +#include <linux/proc_fs.h> > +#include <linux/seq_file.h> > +#include <linux/dmi.h> > +#include <linux/capability.h> > +#include <linux/mutex.h> > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/uaccess.h> > +#include <linux/io.h> > +#include <linux/sched.h> > + > +#include <linux/i8k.h> > + > +#define I8K_SMM_FN_STATUS 0x0025 > +#define I8K_SMM_POWER_STATUS 0x0069 > +#define I8K_SMM_SET_FAN 0x01a3 > +#define I8K_SMM_GET_FAN 0x00a3 > +#define I8K_SMM_GET_SPEED 0x02a3 > +#define I8K_SMM_GET_FAN_TYPE 0x03a3 > +#define I8K_SMM_GET_NOM_SPEED 0x04a3 > +#define I8K_SMM_GET_TEMP 0x10a3 > +#define I8K_SMM_GET_TEMP_TYPE 0x11a3 > +#define I8K_SMM_GET_DELL_SIG1 0xfea3 > +#define I8K_SMM_GET_DELL_SIG2 0xffa3 > + > +#define I8K_FAN_MULT 30 > +#define I8K_FAN_MAX_RPM 30000 > +#define I8K_MAX_TEMP 127 > + > +#define I8K_FN_NONE 0x00 > +#define I8K_FN_UP 0x01 > +#define I8K_FN_DOWN 0x02 > +#define I8K_FN_MUTE 0x04 > +#define I8K_FN_MASK 0x07 > +#define I8K_FN_SHIFT 8 > + > +#define I8K_POWER_AC 0x05 > +#define I8K_POWER_BATTERY 0x01 > + > +static DEFINE_MUTEX(i8k_mutex); > +static char bios_version[4]; > +static struct device *i8k_hwmon_dev; > +static u32 i8k_hwmon_flags; > +static uint i8k_fan_mult = I8K_FAN_MULT; > +static uint i8k_pwm_mult; > +static uint i8k_fan_max = I8K_FAN_HIGH; > + > +#define I8K_HWMON_HAVE_TEMP1 (1 << 0) > +#define I8K_HWMON_HAVE_TEMP2 (1 << 1) > +#define I8K_HWMON_HAVE_TEMP3 (1 << 2) > +#define I8K_HWMON_HAVE_TEMP4 (1 << 3) > +#define I8K_HWMON_HAVE_FAN1 (1 << 4) > +#define I8K_HWMON_HAVE_FAN2 (1 << 5) > + > +MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); > +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); > +MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); > +MODULE_LICENSE("GPL"); > +MODULE_ALIAS("i8k"); > + > +static bool force; > +module_param(force, bool, 0); > +MODULE_PARM_DESC(force, "Force loading without checking for supported models"); > + > +static bool ignore_dmi; > +module_param(ignore_dmi, bool, 0); > +MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); > + > +static bool restricted; > +module_param(restricted, bool, 0); > +MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > + > +static bool power_status; > +module_param(power_status, bool, 0600); > +MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); > + > +static uint fan_mult; > +module_param(fan_mult, uint, 0); > +MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); > + > +static uint fan_max; > +module_param(fan_max, uint, 0); > +MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); > + > +static int i8k_open_fs(struct inode *inode, struct file *file); > +static long i8k_ioctl(struct file *, unsigned int, unsigned long); > + > +static const struct file_operations i8k_fops = { > + .owner = THIS_MODULE, > + .open = i8k_open_fs, > + .read = seq_read, > + .llseek = seq_lseek, > + .release = single_release, > + .unlocked_ioctl = i8k_ioctl, > +}; > + > +struct smm_regs { > + unsigned int eax; > + unsigned int ebx __packed; > + unsigned int ecx __packed; > + unsigned int edx __packed; > + unsigned int esi __packed; > + unsigned int edi __packed; > +}; > + > +static inline const char *i8k_get_dmi_data(int field) > +{ > + const char *dmi_data = dmi_get_system_info(field); > + > + return dmi_data && *dmi_data ? dmi_data : "?"; > +} > + > +/* > + * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. > + */ > +static int i8k_smm(struct smm_regs *regs) > +{ > + int rc; > + int eax = regs->eax; > + cpumask_var_t old_mask; > + > + /* SMM requires CPU 0 */ > + if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) > + return -ENOMEM; > + cpumask_copy(old_mask, ¤t->cpus_allowed); > + rc = set_cpus_allowed_ptr(current, cpumask_of(0)); > + if (rc) > + goto out; > + if (smp_processor_id() != 0) { > + rc = -EBUSY; > + goto out; > + } > + > +#if defined(CONFIG_X86_64) > + asm volatile("pushq %%rax\n\t" > + "movl 0(%%rax),%%edx\n\t" > + "pushq %%rdx\n\t" > + "movl 4(%%rax),%%ebx\n\t" > + "movl 8(%%rax),%%ecx\n\t" > + "movl 12(%%rax),%%edx\n\t" > + "movl 16(%%rax),%%esi\n\t" > + "movl 20(%%rax),%%edi\n\t" > + "popq %%rax\n\t" > + "out %%al,$0xb2\n\t" > + "out %%al,$0x84\n\t" > + "xchgq %%rax,(%%rsp)\n\t" > + "movl %%ebx,4(%%rax)\n\t" > + "movl %%ecx,8(%%rax)\n\t" > + "movl %%edx,12(%%rax)\n\t" > + "movl %%esi,16(%%rax)\n\t" > + "movl %%edi,20(%%rax)\n\t" > + "popq %%rdx\n\t" > + "movl %%edx,0(%%rax)\n\t" > + "pushfq\n\t" > + "popq %%rax\n\t" > + "andl $1,%%eax\n" > + : "=a"(rc) > + : "a"(regs) > + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); > +#else > + asm volatile("pushl %%eax\n\t" > + "movl 0(%%eax),%%edx\n\t" > + "push %%edx\n\t" > + "movl 4(%%eax),%%ebx\n\t" > + "movl 8(%%eax),%%ecx\n\t" > + "movl 12(%%eax),%%edx\n\t" > + "movl 16(%%eax),%%esi\n\t" > + "movl 20(%%eax),%%edi\n\t" > + "popl %%eax\n\t" > + "out %%al,$0xb2\n\t" > + "out %%al,$0x84\n\t" > + "xchgl %%eax,(%%esp)\n\t" > + "movl %%ebx,4(%%eax)\n\t" > + "movl %%ecx,8(%%eax)\n\t" > + "movl %%edx,12(%%eax)\n\t" > + "movl %%esi,16(%%eax)\n\t" > + "movl %%edi,20(%%eax)\n\t" > + "popl %%edx\n\t" > + "movl %%edx,0(%%eax)\n\t" > + "lahf\n\t" > + "shrl $8,%%eax\n\t" > + "andl $1,%%eax\n" > + : "=a"(rc) > + : "a"(regs) > + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); > +#endif > + if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) > + rc = -EINVAL; > + > +out: > + set_cpus_allowed_ptr(current, old_mask); > + free_cpumask_var(old_mask); > + return rc; > +} > + > +/* > + * Read the Fn key status. > + */ > +static int i8k_get_fn_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > + case I8K_FN_UP: > + return I8K_VOL_UP; > + case I8K_FN_DOWN: > + return I8K_VOL_DOWN; > + case I8K_FN_MUTE: > + return I8K_VOL_MUTE; > + default: > + return 0; > + } > +} > + > +/* > + * Read the power status. > + */ > +static int i8k_get_power_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > +} > + > +/* > + * Read the fan status. > + */ > +static int i8k_get_fan_status(int fan) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; > + > + regs.ebx = fan & 0xff; > + return i8k_smm(®s) ? : regs.eax & 0xff; > +} > + > +/* > + * Read the fan speed in RPM. > + */ > +static int i8k_get_fan_speed(int fan) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; > + > + regs.ebx = fan & 0xff; > + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; > +} > + > +/* > + * Read the fan type. > + */ > +static int i8k_get_fan_type(int fan) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; > + > + regs.ebx = fan & 0xff; > + return i8k_smm(®s) ? : regs.eax & 0xff; > +} > + > +/* > + * Read the fan nominal rpm for specific fan speed. > + */ > +static int i8k_get_fan_nominal_speed(int fan, int speed) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; > + > + regs.ebx = (fan & 0xff) | (speed << 8); > + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; > +} > + > +/* > + * Set the fan speed (off, low, high). Returns the new fan status. > + */ > +static int i8k_set_fan(int fan, int speed) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; > + > + speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); > + regs.ebx = (fan & 0xff) | (speed << 8); > + > + return i8k_smm(®s) ? : i8k_get_fan_status(fan); > +} > + > +static int i8k_get_temp_type(int sensor) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; > + > + regs.ebx = sensor & 0xff; > + return i8k_smm(®s) ? : regs.eax & 0xff; > +} > + > +/* > + * Read the cpu temperature. > + */ > +static int _i8k_get_temp(int sensor) > +{ > + struct smm_regs regs = { > + .eax = I8K_SMM_GET_TEMP, > + .ebx = sensor & 0xff, > + }; > + > + return i8k_smm(®s) ? : regs.eax & 0xff; > +} > + > +static int i8k_get_temp(int sensor) > +{ > + int temp = _i8k_get_temp(sensor); > + > + /* > + * Sometimes the temperature sensor returns 0x99, which is out of range. > + * In this case we retry (once) before returning an error. > + # 1003655137 00000058 00005a4b > + # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees > + # 1003655139 00000054 00005c52 > + */ > + if (temp == 0x99) { > + msleep(100); > + temp = _i8k_get_temp(sensor); > + } > + /* > + * Return -ENODATA for all invalid temperatures. > + * > + * Known instances are the 0x99 value as seen above as well as > + * 0xc1 (193), which may be returned when trying to read the GPU > + * temperature if the system supports a GPU and it is currently > + * turned off. > + */ > + if (temp > I8K_MAX_TEMP) > + return -ENODATA; > + > + return temp; > +} > + > +static int i8k_get_dell_signature(int req_fn) > +{ > + struct smm_regs regs = { .eax = req_fn, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; > +} > + > +static int > +i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) > +{ > + int val = 0; > + int speed; > + unsigned char buff[16]; > + int __user *argp = (int __user *)arg; > + > + if (!argp) > + return -EINVAL; > + > + switch (cmd) { > + case I8K_BIOS_VERSION: > + val = (bios_version[0] << 16) | > + (bios_version[1] << 8) | bios_version[2]; > + break; > + > + case I8K_MACHINE_ID: > + memset(buff, 0, 16); > + strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), > + sizeof(buff)); > + break; > + > + case I8K_FN_STATUS: > + val = i8k_get_fn_status(); > + break; > + > + case I8K_POWER_STATUS: > + val = i8k_get_power_status(); > + break; > + > + case I8K_GET_TEMP: > + val = i8k_get_temp(0); > + break; > + > + case I8K_GET_SPEED: > + if (copy_from_user(&val, argp, sizeof(int))) > + return -EFAULT; > + > + val = i8k_get_fan_speed(val); > + break; > + > + case I8K_GET_FAN: > + if (copy_from_user(&val, argp, sizeof(int))) > + return -EFAULT; > + > + val = i8k_get_fan_status(val); > + break; > + > + case I8K_SET_FAN: > + if (restricted && !capable(CAP_SYS_ADMIN)) > + return -EPERM; > + > + if (copy_from_user(&val, argp, sizeof(int))) > + return -EFAULT; > + > + if (copy_from_user(&speed, argp + 1, sizeof(int))) > + return -EFAULT; > + > + val = i8k_set_fan(val, speed); > + break; > + > + default: > + return -EINVAL; > + } > + > + if (val < 0) > + return val; > + > + switch (cmd) { > + case I8K_BIOS_VERSION: > + if (copy_to_user(argp, &val, 4)) > + return -EFAULT; > + > + break; > + case I8K_MACHINE_ID: > + if (copy_to_user(argp, buff, 16)) > + return -EFAULT; > + > + break; > + default: > + if (copy_to_user(argp, &val, sizeof(int))) > + return -EFAULT; > + > + break; > + } > + > + return 0; > +} > + > +static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) > +{ > + long ret; > + > + mutex_lock(&i8k_mutex); > + ret = i8k_ioctl_unlocked(fp, cmd, arg); > + mutex_unlock(&i8k_mutex); > + > + return ret; > +} > + > +/* > + * Print the information for /proc/i8k. > + */ > +static int i8k_proc_show(struct seq_file *seq, void *offset) > +{ > + int fn_key, cpu_temp, ac_power; > + int left_fan, right_fan, left_speed, right_speed; > + > + cpu_temp = i8k_get_temp(0); /* 11100 µs */ > + left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ > + right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ > + left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ > + right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ > + fn_key = i8k_get_fn_status(); /* 750 µs */ > + if (power_status) > + ac_power = i8k_get_power_status(); /* 14700 µs */ > + else > + ac_power = -1; > + > + /* > + * Info: > + * > + * 1) Format version (this will change if format changes) > + * 2) BIOS version > + * 3) BIOS machine ID > + * 4) Cpu temperature > + * 5) Left fan status > + * 6) Right fan status > + * 7) Left fan speed > + * 8) Right fan speed > + * 9) AC power > + * 10) Fn Key status > + */ > + return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", > + I8K_PROC_FMT, > + bios_version, > + i8k_get_dmi_data(DMI_PRODUCT_SERIAL), > + cpu_temp, > + left_fan, right_fan, left_speed, right_speed, > + ac_power, fn_key); > +} > + > +static int i8k_open_fs(struct inode *inode, struct file *file) > +{ > + return single_open(file, i8k_proc_show, NULL); > +} > + > + > +/* > + * Hwmon interface > + */ > + > +static ssize_t i8k_hwmon_show_temp_label(struct device *dev, > + struct device_attribute *devattr, > + char *buf) > +{ > + static const char * const labels[] = { > + "CPU", > + "GPU", > + "SODIMM", > + "Other", > + "Ambient", > + "Other", > + }; > + int index = to_sensor_dev_attr(devattr)->index; > + int type; > + > + type = i8k_get_temp_type(index); > + if (type < 0) > + return type; > + if (type >= ARRAY_SIZE(labels)) > + type = ARRAY_SIZE(labels) - 1; > + return sprintf(buf, "%s\n", labels[type]); > +} > + > +static ssize_t i8k_hwmon_show_temp(struct device *dev, > + struct device_attribute *devattr, > + char *buf) > +{ > + int index = to_sensor_dev_attr(devattr)->index; > + int temp; > + > + temp = i8k_get_temp(index); > + if (temp < 0) > + return temp; > + return sprintf(buf, "%d\n", temp * 1000); > +} > + > +static ssize_t i8k_hwmon_show_fan_label(struct device *dev, > + struct device_attribute *devattr, > + char *buf) > +{ > + static const char * const labels[] = { > + "Processor Fan", > + "Motherboard Fan", > + "Video Fan", > + "Power Supply Fan", > + "Chipset Fan", > + "Other Fan", > + }; > + int index = to_sensor_dev_attr(devattr)->index; > + bool dock = false; > + int type; > + > + type = i8k_get_fan_type(index); > + if (type < 0) > + return type; > + > + if (type & 0x10) { > + dock = true; > + type &= 0x0F; > + } > + > + if (type >= ARRAY_SIZE(labels)) > + type = (ARRAY_SIZE(labels) - 1); > + > + return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); > +} > + > +static ssize_t i8k_hwmon_show_fan(struct device *dev, > + struct device_attribute *devattr, > + char *buf) > +{ > + int index = to_sensor_dev_attr(devattr)->index; > + int fan_speed; > + > + fan_speed = i8k_get_fan_speed(index); > + if (fan_speed < 0) > + return fan_speed; > + return sprintf(buf, "%d\n", fan_speed); > +} > + > +static ssize_t i8k_hwmon_show_pwm(struct device *dev, > + struct device_attribute *devattr, > + char *buf) > +{ > + int index = to_sensor_dev_attr(devattr)->index; > + int status; > + > + status = i8k_get_fan_status(index); > + if (status < 0) > + return -EIO; > + return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); > +} > + > +static ssize_t i8k_hwmon_set_pwm(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + int index = to_sensor_dev_attr(attr)->index; > + unsigned long val; > + int err; > + > + err = kstrtoul(buf, 10, &val); > + if (err) > + return err; > + val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); > + > + mutex_lock(&i8k_mutex); > + err = i8k_set_fan(index, val); > + mutex_unlock(&i8k_mutex); > + > + return err < 0 ? -EIO : count; > +} > + > +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); > +static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > + 0); > +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); > +static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > + 1); > +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); > +static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > + 2); > +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); > +static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, > + 3); > +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); > +static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, > + 0); > +static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, > + i8k_hwmon_set_pwm, 0); > +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, > + 1); > +static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, > + 1); > +static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, > + i8k_hwmon_set_pwm, 1); > + > +static struct attribute *i8k_attrs[] = { > + &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ > + &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ > + &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ > + &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ > + &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ > + &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ > + &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ > + &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ > + &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ > + &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ > + &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ > + &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ > + &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ > + &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ > + NULL > +}; > + > +static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, > + int index) > +{ > + if (index >= 0 && index <= 1 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) > + return 0; > + if (index >= 2 && index <= 3 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) > + return 0; > + if (index >= 4 && index <= 5 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) > + return 0; > + if (index >= 6 && index <= 7 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) > + return 0; > + if (index >= 8 && index <= 10 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) > + return 0; > + if (index >= 11 && index <= 13 && > + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) > + return 0; > + > + return attr->mode; > +} > + > +static const struct attribute_group i8k_group = { > + .attrs = i8k_attrs, > + .is_visible = i8k_is_visible, > +}; > +__ATTRIBUTE_GROUPS(i8k); > + > +static int __init i8k_init_hwmon(void) > +{ > + int err; > + > + i8k_hwmon_flags = 0; > + > + /* CPU temperature attributes, if temperature type is OK */ > + err = i8k_get_temp_type(0); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; > + /* check for additional temperature sensors */ > + err = i8k_get_temp_type(1); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; > + err = i8k_get_temp_type(2); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; > + err = i8k_get_temp_type(3); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; > + > + /* First fan attributes, if fan type is OK */ > + err = i8k_get_fan_type(0); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; > + > + /* Second fan attributes, if fan type is OK */ > + err = i8k_get_fan_type(1); > + if (err >= 0) > + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > + > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, > + i8k_groups); > + if (IS_ERR(i8k_hwmon_dev)) { > + err = PTR_ERR(i8k_hwmon_dev); > + i8k_hwmon_dev = NULL; > + pr_err("hwmon registration failed (%d)\n", err); > + return err; > + } > + return 0; > +} > + > +struct i8k_config_data { > + uint fan_mult; > + uint fan_max; > +}; > + > +enum i8k_configs { > + DELL_LATITUDE_D520, > + DELL_PRECISION_490, > + DELL_STUDIO, > + DELL_XPS, > +}; > + > +static const struct i8k_config_data i8k_config_data[] = { > + [DELL_LATITUDE_D520] = { > + .fan_mult = 1, > + .fan_max = I8K_FAN_TURBO, > + }, > + [DELL_PRECISION_490] = { > + .fan_mult = 1, > + .fan_max = I8K_FAN_TURBO, > + }, > + [DELL_STUDIO] = { > + .fan_mult = 1, > + .fan_max = I8K_FAN_HIGH, > + }, > + [DELL_XPS] = { > + .fan_mult = 1, > + .fan_max = I8K_FAN_HIGH, > + }, > +}; > + > +static struct dmi_system_id i8k_dmi_table[] __initdata = { > + { > + .ident = "Dell Inspiron", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), > + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), > + }, > + }, > + { > + .ident = "Dell Latitude", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), > + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), > + }, > + }, > + { > + .ident = "Dell Inspiron 2", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), > + }, > + }, > + { > + .ident = "Dell Latitude D520", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), > + }, > + .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], > + }, > + { > + .ident = "Dell Latitude 2", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), > + }, > + }, > + { /* UK Inspiron 6400 */ > + .ident = "Dell Inspiron 3", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), > + }, > + }, > + { > + .ident = "Dell Inspiron 3", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), > + }, > + }, > + { > + .ident = "Dell Precision 490", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, > + "Precision WorkStation 490"), > + }, > + .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], > + }, > + { > + .ident = "Dell Precision", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), > + }, > + }, > + { > + .ident = "Dell Vostro", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), > + }, > + }, > + { > + .ident = "Dell XPS421", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), > + }, > + }, > + { > + .ident = "Dell Studio", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), > + }, > + .driver_data = (void *)&i8k_config_data[DELL_STUDIO], > + }, > + { > + .ident = "Dell XPS 13", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), > + }, > + .driver_data = (void *)&i8k_config_data[DELL_XPS], > + }, > + { > + .ident = "Dell XPS M140", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), > + DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), > + }, > + .driver_data = (void *)&i8k_config_data[DELL_XPS], > + }, > + { } > +}; > + > +MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); > + > +/* > + * Probe for the presence of a supported laptop. > + */ > +static int __init i8k_probe(void) > +{ > + const struct dmi_system_id *id; > + int fan, ret; > + > + /* > + * Get DMI information > + */ > + if (!dmi_check_system(i8k_dmi_table)) { > + if (!ignore_dmi && !force) > + return -ENODEV; > + > + pr_info("not running on a supported Dell system.\n"); > + pr_info("vendor=%s, model=%s, version=%s\n", > + i8k_get_dmi_data(DMI_SYS_VENDOR), > + i8k_get_dmi_data(DMI_PRODUCT_NAME), > + i8k_get_dmi_data(DMI_BIOS_VERSION)); > + } > + > + strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), > + sizeof(bios_version)); > + > + /* > + * Get SMM Dell signature > + */ > + if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && > + i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { > + pr_err("unable to get SMM Dell signature\n"); > + if (!force) > + return -ENODEV; > + } > + > + /* > + * Set fan multiplier and maximal fan speed from dmi config > + * Values specified in module parameters override values from dmi > + */ > + id = dmi_first_match(i8k_dmi_table); > + if (id && id->driver_data) { > + const struct i8k_config_data *conf = id->driver_data; > + if (!fan_mult && conf->fan_mult) > + fan_mult = conf->fan_mult; > + if (!fan_max && conf->fan_max) > + fan_max = conf->fan_max; > + } > + > + i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ > + i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); > + > + if (!fan_mult) { > + /* > + * Autodetect fan multiplier based on nominal rpm > + * If fan reports rpm value too high then set multiplier to 1 > + */ > + for (fan = 0; fan < 2; ++fan) { > + ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); > + if (ret < 0) > + continue; > + if (ret > I8K_FAN_MAX_RPM) > + i8k_fan_mult = 1; > + break; > + } > + } else { > + /* Fan multiplier was specified in module param or in dmi */ > + i8k_fan_mult = fan_mult; > + } > + > + return 0; > +} > + > +static int __init i8k_init(void) > +{ > + struct proc_dir_entry *proc_i8k; > + int err; > + > + /* Are we running on an supported laptop? */ > + if (i8k_probe()) > + return -ENODEV; > + > + /* Register the proc entry */ > + proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > + if (!proc_i8k) > + return -ENOENT; > + > + err = i8k_init_hwmon(); > + if (err) > + goto exit_remove_proc; > + > + return 0; > + > + exit_remove_proc: > + remove_proc_entry("i8k", NULL); > + return err; > +} > + > +static void __exit i8k_exit(void) > +{ > + hwmon_device_unregister(i8k_hwmon_dev); > + remove_proc_entry("i8k", NULL); > +} > + > +module_init(i8k_init); > +module_exit(i8k_exit); > ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-03-28 14:31 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:31 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDMvMjgvMjAxNSAwMzoyNCBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gVGhpcyBjb21taXQg bW92ZXMgaThrIGRyaXZlciB0byBod21vbiB0cmVlIHVuZGVyIG5hbWUgZGVsbC1zbW0taHdtb24g d2hpY2ggaXMKPiBiZXR0ZXIgbmFtZSB0aGVuIGFiYnJldmlhdGlvbiBpOGsuIEZvciBiYWNrd2Fy ZCBjb21wYXRpYmlsaXR5IGlzIGFkZGVkIG1hY3JvCj4gTU9EVUxFX0FMSUFTKCJpOGsiKSBzbyBt b2Rwcm9iZSB3aWxsIGxvYWQgZHJpdmVyIGFsc28gb2xkIG5hbWUgaThrLiBDT05GSUdfSThLCj4g Y29tcGlsZSBvcHRpb24gd2FzIG5vdCBjaGFuZ2VkLgo+Cj4gVGhpcyBjb21taXQgYWxzbyBhZGRz IG1lIGFzIG1haW50YWluZXIgb2YgdGhpcyBuZXcgZGVsbC1zbW0taHdtb24gZHJpdmVyLgo+Cj4g U2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgoKTG9va3Mg b2sgdG8gbWUsIHNvIEknbGwgYmUgaGFwcHkgdG8gdGFrZSBpdCBmb3IgNC4xIGlmIEdyZWcgYWdy ZWVzLgoKSSB0aG91Z2h0IGFib3V0IG1vdmluZyB0aGUgSThLIGNvbmZpZ3VyYXRpb24gb3B0aW9u IGFzIHdlbGwuIE5vdCByZWFsbHkgc3VyZQp3aGF0IHRvIGRvIHRoZXJlLiBHcmVnLCBhbnkgb3Bp bmlvbiA/Ckl0IHdvdWxkIGhhdmUgdG8gcmVzaWRlIG91dHNpZGUgdGhlIEhXTU9OIGJsb2NrIG9m IGRyaXZlcnMvaHdtb24vS2NvbmZpZyBpZgp3ZSBtb3ZlIGl0LgoKV2UgYWxzbyBjYW4gZHJvcCBt ZSBhcyBleHBsaWNpdCBtYWludGFpbmVyIC0gSSBhbSBvbiB0aGUgaG9vayBmcm9tIHRoZSBod21v biBzaWRlCmFueXdheSwgYW5kIHdlIGRvbid0IG5lZWQgdG8gc3RlcCBvbiBlYWNoIG90aGVyJ3Mg Zm9vdCBmb3IgdGhpcyBkcml2ZXIuCgpUaGFua3MsCkd1ZW50ZXIKCj4gLS0tCj4gICBNQUlOVEFJ TkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICAzICstCj4gICBkcml2ZXJzL2NoYXIvTWFrZWZp bGUgICAgICAgICAgfCAgICAxIC0KPiAgIGRyaXZlcnMvY2hhci9pOGsuYyAgICAgICAgICAgICB8 IDEwMDUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gICBkcml2ZXJz L2h3bW9uL01ha2VmaWxlICAgICAgICAgfCAgICAxICsKPiAgIGRyaXZlcnMvaHdtb24vZGVsbC1z bW0taHdtb24uYyB8IDEwMDcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kwo+ICAgNSBmaWxlcyBjaGFuZ2VkLCAxMDEwIGluc2VydGlvbnMoKyksIDEwMDcgZGVsZXRpb25z KC0pCj4gICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jaGFyL2k4ay5jCj4gICBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCj4KPiBkaWZmIC0tZ2l0 IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwo+IGluZGV4IDg4YzA5Y2EuLmJmNWJiMDUgMTAw NjQ0Cj4gLS0tIGEvTUFJTlRBSU5FUlMKPiArKysgYi9NQUlOVEFJTkVSUwo+IEBAIC0zMDY0LDgg KzMwNjQsOSBAQCBGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9kZWxsLWxhcHRvcC5jCj4KPiAgIERF TEwgTEFQVE9QIFNNTSBEUklWRVIKPiAgIE06CUd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVz Lm5ldD4KPiArTToJUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgo+ICAgUzoJTWFp bnRhaW5lZAo+IC1GOglkcml2ZXJzL2NoYXIvaThrLmMKPiArRjoJZHJpdmVycy9od21vbi9kZWxs LXNtbS1od21vbi5jCj4gICBGOglpbmNsdWRlL3VhcGkvbGludXgvaThrLmgKPgo+ICAgREVMTCBT WVNURU1TIE1BTkFHRU1FTlQgQkFTRSBEUklWRVIgKGRjZGJhcykKPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCj4gaW5kZXggZDA2Y2Rl MjYuLjFkOWNmMDAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCj4gKysrIGIv ZHJpdmVycy9jaGFyL01ha2VmaWxlCj4gQEAgLTM2LDcgKzM2LDYgQEAgZWxzZQo+ICAgICBvYmot JChDT05GSUdfTlZSQU0pCSs9IG52cmFtLm8KPiAgIGVuZGlmCj4gICBvYmotJChDT05GSUdfVE9T SElCQSkJCSs9IHRvc2hpYmEubwo+IC1vYmotJChDT05GSUdfSThLKQkJKz0gaThrLm8KPiAgIG9i ai0kKENPTkZJR19EUzE2MjApCQkrPSBkczE2MjAubwo+ICAgb2JqLSQoQ09ORklHX0hXX1JBTkRP TSkJCSs9IGh3X3JhbmRvbS8KPiAgIG9iai0kKENPTkZJR19QUERFVikJCSs9IHBwZGV2Lm8KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2k4ay5jIGIvZHJpdmVycy9jaGFyL2k4ay5jCj4gZGVs ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMjRjYzRlZC4uMDAwMDAwMAo+IC0tLSBhL2Ry aXZlcnMvY2hhci9pOGsuYwo+ICsrKyAvZGV2L251bGwKPiBAQCAtMSwxMDA1ICswLDAgQEAKPiAt LyoKPiAtICogaThrLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBCSU9T IG9uIERlbGwgbGFwdG9wcy4KPiAtICoKPiAtICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1v IERhbCBab3R0byA8ZHpAZGViaWFuLm9yZz4KPiAtICoKPiAtICogSHdtb24gaW50ZWdyYXRpb246 Cj4gLSAqIENvcHlyaWdodCAoQykgMjAxMSAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRl Pgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTQgIEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJv ZWNrLXVzLm5ldD4KPiAtICogQ29weXJpZ2h0IChDKSAyMDE0ICBQYWxpIFJvaMOhciA8cGFsaS5y b2hhckBnbWFpbC5jb20+Cj4gLSAqCj4gLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cj4gLSAqIHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 IHRoZQo+IC0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9y IChhdCB5b3VyIG9wdGlvbikgYW55Cj4gLSAqIGxhdGVyIHZlcnNpb24uCj4gLSAqCj4gLSAqIFRo aXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl ZnVsLCBidXQKPiAtICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgo+IC0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQo+IC0gKiBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGZvciBtb3JlIGRldGFpbHMuCj4gLSAqLwo+IC0KPiAtI2RlZmluZSBwcl9mbXQoZm10KSBL QlVJTERfTU9ETkFNRSAiOiAiIGZtdAo+IC0KPiAtI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiAtI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgo+IC0jaW5jbHVkZSA8bGludXgvZG1pLmg+Cj4g LSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9tdXRleC5o Pgo+IC0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KPiAtI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5 c2ZzLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9p by5oPgo+IC0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KPiAtCj4gLSNpbmNsdWRlIDxsaW51eC9p OGsuaD4KPiAtCj4gLSNkZWZpbmUgSThLX1NNTV9GTl9TVEFUVVMJMHgwMDI1Cj4gLSNkZWZpbmUg SThLX1NNTV9QT1dFUl9TVEFUVVMJMHgwMDY5Cj4gLSNkZWZpbmUgSThLX1NNTV9TRVRfRkFOCQkw eDAxYTMKPiAtI2RlZmluZSBJOEtfU01NX0dFVF9GQU4JCTB4MDBhMwo+IC0jZGVmaW5lIEk4S19T TU1fR0VUX1NQRUVECTB4MDJhMwo+IC0jZGVmaW5lIEk4S19TTU1fR0VUX0ZBTl9UWVBFCTB4MDNh Mwo+IC0jZGVmaW5lIEk4S19TTU1fR0VUX05PTV9TUEVFRAkweDA0YTMKPiAtI2RlZmluZSBJOEtf U01NX0dFVF9URU1QCTB4MTBhMwo+IC0jZGVmaW5lIEk4S19TTU1fR0VUX1RFTVBfVFlQRQkweDEx YTMKPiAtI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRzEJMHhmZWEzCj4gLSNkZWZpbmUgSThL X1NNTV9HRVRfREVMTF9TSUcyCTB4ZmZhMwo+IC0KPiAtI2RlZmluZSBJOEtfRkFOX01VTFQJCTMw Cj4gLSNkZWZpbmUgSThLX0ZBTl9NQVhfUlBNCQkzMDAwMAo+IC0jZGVmaW5lIEk4S19NQVhfVEVN UAkJMTI3Cj4gLQo+IC0jZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCj4gLSNkZWZpbmUgSThLX0ZO X1VQCQkweDAxCj4gLSNkZWZpbmUgSThLX0ZOX0RPV04JCTB4MDIKPiAtI2RlZmluZSBJOEtfRk5f TVVURQkJMHgwNAo+IC0jZGVmaW5lIEk4S19GTl9NQVNLCQkweDA3Cj4gLSNkZWZpbmUgSThLX0ZO X1NISUZUCQk4Cj4gLQo+IC0jZGVmaW5lIEk4S19QT1dFUl9BQwkJMHgwNQo+IC0jZGVmaW5lIEk4 S19QT1dFUl9CQVRURVJZCTB4MDEKPiAtCj4gLXN0YXRpYyBERUZJTkVfTVVURVgoaThrX211dGV4 KTsKPiAtc3RhdGljIGNoYXIgYmlvc192ZXJzaW9uWzRdOwo+IC1zdGF0aWMgc3RydWN0IGRldmlj ZSAqaThrX2h3bW9uX2RldjsKPiAtc3RhdGljIHUzMiBpOGtfaHdtb25fZmxhZ3M7Cj4gLXN0YXRp YyB1aW50IGk4a19mYW5fbXVsdCA9IEk4S19GQU5fTVVMVDsKPiAtc3RhdGljIHVpbnQgaThrX3B3 bV9tdWx0Owo+IC1zdGF0aWMgdWludCBpOGtfZmFuX21heCA9IEk4S19GQU5fSElHSDsKPiAtCj4g LSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDEJKDEgPDwgMCkKPiAtI2RlZmluZSBJOEtfSFdN T05fSEFWRV9URU1QMgkoMSA8PCAxKQo+IC0jZGVmaW5lIEk4S19IV01PTl9IQVZFX1RFTVAzCSgx IDw8IDIpCj4gLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDQJKDEgPDwgMykKPiAtI2RlZmlu ZSBJOEtfSFdNT05fSEFWRV9GQU4xCSgxIDw8IDQpCj4gLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVf RkFOMgkoMSA8PCA1KQo+IC0KPiAtTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6 QGRlYmlhbi5vcmcpIik7Cj4gLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBhY2Nlc3Np bmcgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzIik7Cj4gLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK PiAtCj4gLXN0YXRpYyBib29sIGZvcmNlOwo+IC1tb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDAp Owo+IC1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9hZGluZyB3aXRob3V0IGNoZWNr aW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7Cj4gLQo+IC1zdGF0aWMgYm9vbCBpZ25vcmVfZG1p Owo+IC1tb2R1bGVfcGFyYW0oaWdub3JlX2RtaSwgYm9vbCwgMCk7Cj4gLU1PRFVMRV9QQVJNX0RF U0MoaWdub3JlX2RtaSwgIkNvbnRpbnVlIHByb2JpbmcgaGFyZHdhcmUgZXZlbiBpZiBETUkgZGF0 YSBkb2VzIG5vdCBtYXRjaCIpOwo+IC0KPiAtc3RhdGljIGJvb2wgcmVzdHJpY3RlZDsKPiAtbW9k dWxlX3BhcmFtKHJlc3RyaWN0ZWQsIGJvb2wsIDApOwo+IC1NT0RVTEVfUEFSTV9ERVNDKHJlc3Ry aWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsK PiAtCj4gLXN0YXRpYyBib29sIHBvd2VyX3N0YXR1czsKPiAtbW9kdWxlX3BhcmFtKHBvd2VyX3N0 YXR1cywgYm9vbCwgMDYwMCk7Cj4gLU1PRFVMRV9QQVJNX0RFU0MocG93ZXJfc3RhdHVzLCAiUmVw b3J0IHBvd2VyIHN0YXR1cyBpbiAvcHJvYy9pOGsiKTsKPiAtCj4gLXN0YXRpYyB1aW50IGZhbl9t dWx0Owo+IC1tb2R1bGVfcGFyYW0oZmFuX211bHQsIHVpbnQsIDApOwo+IC1NT0RVTEVfUEFSTV9E RVNDKGZhbl9tdWx0LCAiRmFjdG9yIHRvIG11bHRpcGx5IGZhbiBzcGVlZCB3aXRoIChkZWZhdWx0 OiBhdXRvZGV0ZWN0KSIpOwo+IC0KPiAtc3RhdGljIHVpbnQgZmFuX21heDsKPiAtbW9kdWxlX3Bh cmFtKGZhbl9tYXgsIHVpbnQsIDApOwo+IC1NT0RVTEVfUEFSTV9ERVNDKGZhbl9tYXgsICJNYXhp bXVtIGNvbmZpZ3VyYWJsZSBmYW4gc3BlZWQgKGRlZmF1bHQ6IGF1dG9kZXRlY3QpIik7Cj4gLQo+ IC1zdGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxl ICpmaWxlKTsKPiAtc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVk IGludCwgdW5zaWduZWQgbG9uZyk7Cj4gLQo+IC1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3Bl cmF0aW9ucyBpOGtfZm9wcyA9IHsKPiAtCS5vd25lcgkJPSBUSElTX01PRFVMRSwKPiAtCS5vcGVu CQk9IGk4a19vcGVuX2ZzLAo+IC0JLnJlYWQJCT0gc2VxX3JlYWQsCj4gLQkubGxzZWVrCQk9IHNl cV9sc2VlaywKPiAtCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCj4gLQkudW5sb2NrZWRfaW9j dGwJPSBpOGtfaW9jdGwsCj4gLX07Cj4gLQo+IC1zdHJ1Y3Qgc21tX3JlZ3Mgewo+IC0JdW5zaWdu ZWQgaW50IGVheDsKPiAtCXVuc2lnbmVkIGludCBlYnggX19wYWNrZWQ7Cj4gLQl1bnNpZ25lZCBp bnQgZWN4IF9fcGFja2VkOwo+IC0JdW5zaWduZWQgaW50IGVkeCBfX3BhY2tlZDsKPiAtCXVuc2ln bmVkIGludCBlc2kgX19wYWNrZWQ7Cj4gLQl1bnNpZ25lZCBpbnQgZWRpIF9fcGFja2VkOwo+IC19 Owo+IC0KPiAtc3RhdGljIGlubGluZSBjb25zdCBjaGFyICppOGtfZ2V0X2RtaV9kYXRhKGludCBm aWVsZCkKPiAtewo+IC0JY29uc3QgY2hhciAqZG1pX2RhdGEgPSBkbWlfZ2V0X3N5c3RlbV9pbmZv KGZpZWxkKTsKPiAtCj4gLQlyZXR1cm4gZG1pX2RhdGEgJiYgKmRtaV9kYXRhID8gZG1pX2RhdGEg OiAiPyI7Cj4gLX0KPiAtCj4gLS8qCj4gLSAqIENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1v ZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgo+IC0gKi8KPiAtc3Rh dGljIGludCBpOGtfc21tKHN0cnVjdCBzbW1fcmVncyAqcmVncykKPiAtewo+IC0JaW50IHJjOwo+ IC0JaW50IGVheCA9IHJlZ3MtPmVheDsKPiAtCWNwdW1hc2tfdmFyX3Qgb2xkX21hc2s7Cj4gLQo+ IC0JLyogU01NIHJlcXVpcmVzIENQVSAwICovCj4gLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZv bGRfbWFzaywgR0ZQX0tFUk5FTCkpCj4gLQkJcmV0dXJuIC1FTk9NRU07Cj4gLQljcHVtYXNrX2Nv cHkob2xkX21hc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwo+IC0JcmMgPSBzZXRfY3B1c19h bGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKDApKTsKPiAtCWlmIChyYykKPiAtCQlnb3Rv IG91dDsKPiAtCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgewo+IC0JCXJjID0gLUVCVVNZ Owo+IC0JCWdvdG8gb3V0Owo+IC0JfQo+IC0KPiAtI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkK PiAtCWFzbSB2b2xhdGlsZSgicHVzaHEgJSVyYXhcblx0Igo+IC0JCSJtb3ZsIDAoJSVyYXgpLCUl ZWR4XG5cdCIKPiAtCQkicHVzaHEgJSVyZHhcblx0Igo+IC0JCSJtb3ZsIDQoJSVyYXgpLCUlZWJ4 XG5cdCIKPiAtCQkibW92bCA4KCUlcmF4KSwlJWVjeFxuXHQiCj4gLQkJIm1vdmwgMTIoJSVyYXgp LCUlZWR4XG5cdCIKPiAtCQkibW92bCAxNiglJXJheCksJSVlc2lcblx0Igo+IC0JCSJtb3ZsIDIw KCUlcmF4KSwlJWVkaVxuXHQiCj4gLQkJInBvcHEgJSVyYXhcblx0Igo+IC0JCSJvdXQgJSVhbCwk MHhiMlxuXHQiCj4gLQkJIm91dCAlJWFsLCQweDg0XG5cdCIKPiAtCQkieGNoZ3EgJSVyYXgsKCUl cnNwKVxuXHQiCj4gLQkJIm1vdmwgJSVlYngsNCglJXJheClcblx0Igo+IC0JCSJtb3ZsICUlZWN4 LDgoJSVyYXgpXG5cdCIKPiAtCQkibW92bCAlJWVkeCwxMiglJXJheClcblx0Igo+IC0JCSJtb3Zs ICUlZXNpLDE2KCUlcmF4KVxuXHQiCj4gLQkJIm1vdmwgJSVlZGksMjAoJSVyYXgpXG5cdCIKPiAt CQkicG9wcSAlJXJkeFxuXHQiCj4gLQkJIm1vdmwgJSVlZHgsMCglJXJheClcblx0Igo+IC0JCSJw dXNoZnFcblx0Igo+IC0JCSJwb3BxICUlcmF4XG5cdCIKPiAtCQkiYW5kbCAkMSwlJWVheFxuIgo+ IC0JCTogIj1hIihyYykKPiAtCQk6ICAgICJhIihyZWdzKQo+IC0JCTogICAgIiVlYngiLCAiJWVj eCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKPiAtI2Vsc2UKPiAtCWFzbSB2 b2xhdGlsZSgicHVzaGwgJSVlYXhcblx0Igo+IC0JICAgICJtb3ZsIDAoJSVlYXgpLCUlZWR4XG5c dCIKPiAtCSAgICAicHVzaCAlJWVkeFxuXHQiCj4gLQkgICAgIm1vdmwgNCglJWVheCksJSVlYnhc blx0Igo+IC0JICAgICJtb3ZsIDgoJSVlYXgpLCUlZWN4XG5cdCIKPiAtCSAgICAibW92bCAxMigl JWVheCksJSVlZHhcblx0Igo+IC0JICAgICJtb3ZsIDE2KCUlZWF4KSwlJWVzaVxuXHQiCj4gLQkg ICAgIm1vdmwgMjAoJSVlYXgpLCUlZWRpXG5cdCIKPiAtCSAgICAicG9wbCAlJWVheFxuXHQiCj4g LQkgICAgIm91dCAlJWFsLCQweGIyXG5cdCIKPiAtCSAgICAib3V0ICUlYWwsJDB4ODRcblx0Igo+ IC0JICAgICJ4Y2hnbCAlJWVheCwoJSVlc3ApXG5cdCIKPiAtCSAgICAibW92bCAlJWVieCw0KCUl ZWF4KVxuXHQiCj4gLQkgICAgIm1vdmwgJSVlY3gsOCglJWVheClcblx0Igo+IC0JICAgICJtb3Zs ICUlZWR4LDEyKCUlZWF4KVxuXHQiCj4gLQkgICAgIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5cdCIK PiAtCSAgICAibW92bCAlJWVkaSwyMCglJWVheClcblx0Igo+IC0JICAgICJwb3BsICUlZWR4XG5c dCIKPiAtCSAgICAibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiCj4gLQkgICAgImxhaGZcblx0Igo+ IC0JICAgICJzaHJsICQ4LCUlZWF4XG5cdCIKPiAtCSAgICAiYW5kbCAkMSwlJWVheFxuIgo+IC0J ICAgIDogIj1hIihyYykKPiAtCSAgICA6ICAgICJhIihyZWdzKQo+IC0JICAgIDogICAgIiVlYngi LCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKPiAtI2VuZGlmCj4g LQlpZiAocmMgIT0gMCB8fCAocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYgfHwgcmVncy0+ ZWF4ID09IGVheCkKPiAtCQlyYyA9IC1FSU5WQUw7Cj4gLQo+IC1vdXQ6Cj4gLQlzZXRfY3B1c19h bGxvd2VkX3B0cihjdXJyZW50LCBvbGRfbWFzayk7Cj4gLQlmcmVlX2NwdW1hc2tfdmFyKG9sZF9t YXNrKTsKPiAtCXJldHVybiByYzsKPiAtfQo+IC0KPiAtLyoKPiAtICogUmVhZCB0aGUgRm4ga2V5 IHN0YXR1cy4KPiAtICovCj4gLXN0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKPiAt ewo+IC0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0ZOX1NUQVRVUywg fTsKPiAtCWludCByYzsKPiAtCj4gLQlyYyA9IGk4a19zbW0oJnJlZ3MpOwo+IC0JaWYgKHJjIDwg MCkKPiAtCQlyZXR1cm4gcmM7Cj4gLQo+IC0Jc3dpdGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NI SUZUKSAmIEk4S19GTl9NQVNLKSB7Cj4gLQljYXNlIEk4S19GTl9VUDoKPiAtCQlyZXR1cm4gSThL X1ZPTF9VUDsKPiAtCWNhc2UgSThLX0ZOX0RPV046Cj4gLQkJcmV0dXJuIEk4S19WT0xfRE9XTjsK PiAtCWNhc2UgSThLX0ZOX01VVEU6Cj4gLQkJcmV0dXJuIEk4S19WT0xfTVVURTsKPiAtCWRlZmF1 bHQ6Cj4gLQkJcmV0dXJuIDA7Cj4gLQl9Cj4gLX0KPiAtCj4gLS8qCj4gLSAqIFJlYWQgdGhlIHBv d2VyIHN0YXR1cy4KPiAtICovCj4gLXN0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9p ZCkKPiAtewo+IC0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX1BPV0VS X1NUQVRVUywgfTsKPiAtCWludCByYzsKPiAtCj4gLQlyYyA9IGk4a19zbW0oJnJlZ3MpOwo+IC0J aWYgKHJjIDwgMCkKPiAtCQlyZXR1cm4gcmM7Cj4gLQo+IC0JcmV0dXJuIChyZWdzLmVheCAmIDB4 ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19BQyA6IEk4S19CQVRURVJZOwo+IC19Cj4gLQo+IC0v Kgo+IC0gKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgo+IC0gKi8KPiAtc3RhdGljIGludCBpOGtfZ2V0 X2Zhbl9zdGF0dXMoaW50IGZhbikKPiAtewo+IC0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5l YXggPSBJOEtfU01NX0dFVF9GQU4sIH07Cj4gLQo+IC0JcmVncy5lYnggPSBmYW4gJiAweGZmOwo+ IC0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Cj4gLX0KPiAtCj4g LS8qCj4gLSAqIFJlYWQgdGhlIGZhbiBzcGVlZCBpbiBSUE0uCj4gLSAqLwo+IC1zdGF0aWMgaW50 IGk4a19nZXRfZmFuX3NwZWVkKGludCBmYW4pCj4gLXsKPiAtCXN0cnVjdCBzbW1fcmVncyByZWdz ID0geyAuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQsIH07Cj4gLQo+IC0JcmVncy5lYnggPSBmYW4g JiAweGZmOwo+IC0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXggJiAweGZmZmYp ICogaThrX2Zhbl9tdWx0Owo+IC19Cj4gLQo+IC0vKgo+IC0gKiBSZWFkIHRoZSBmYW4gdHlwZS4K PiAtICovCj4gLXN0YXRpYyBpbnQgaThrX2dldF9mYW5fdHlwZShpbnQgZmFuKQo+IC17Cj4gLQlz dHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX0ZBTl9UWVBFLCB9Owo+ IC0KPiAtCXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKPiAtCXJldHVybiBpOGtfc21tKCZyZWdzKSA/ IDogcmVncy5lYXggJiAweGZmOwo+IC19Cj4gLQo+IC0vKgo+IC0gKiBSZWFkIHRoZSBmYW4gbm9t aW5hbCBycG0gZm9yIHNwZWNpZmljIGZhbiBzcGVlZC4KPiAtICovCj4gLXN0YXRpYyBpbnQgaThr X2dldF9mYW5fbm9taW5hbF9zcGVlZChpbnQgZmFuLCBpbnQgc3BlZWQpCj4gLXsKPiAtCXN0cnVj dCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfTk9NX1NQRUVELCB9Owo+IC0K PiAtCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwo+IC0JcmV0dXJuIGk4 a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXggJiAweGZmZmYpICogaThrX2Zhbl9tdWx0Owo+IC19 Cj4gLQo+IC0vKgo+IC0gKiBTZXQgdGhlIGZhbiBzcGVlZCAob2ZmLCBsb3csIGhpZ2gpLiBSZXR1 cm5zIHRoZSBuZXcgZmFuIHN0YXR1cy4KPiAtICovCj4gLXN0YXRpYyBpbnQgaThrX3NldF9mYW4o aW50IGZhbiwgaW50IHNwZWVkKQo+IC17Cj4gLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVh eCA9IEk4S19TTU1fU0VUX0ZBTiwgfTsKPiAtCj4gLQlzcGVlZCA9IChzcGVlZCA8IDApID8gMCA6 ICgoc3BlZWQgPiBpOGtfZmFuX21heCkgPyBpOGtfZmFuX21heCA6IHNwZWVkKTsKPiAtCXJlZ3Mu ZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwo+IC0KPiAtCXJldHVybiBpOGtfc21t KCZyZWdzKSA/IDogaThrX2dldF9mYW5fc3RhdHVzKGZhbik7Cj4gLX0KPiAtCj4gLXN0YXRpYyBp bnQgaThrX2dldF90ZW1wX3R5cGUoaW50IHNlbnNvcikKPiAtewo+IC0Jc3RydWN0IHNtbV9yZWdz IHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9URU1QX1RZUEUsIH07Cj4gLQo+IC0JcmVncy5l YnggPSBzZW5zb3IgJiAweGZmOwo+IC0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVh eCAmIDB4ZmY7Cj4gLX0KPiAtCj4gLS8qCj4gLSAqIFJlYWQgdGhlIGNwdSB0ZW1wZXJhdHVyZS4K PiAtICovCj4gLXN0YXRpYyBpbnQgX2k4a19nZXRfdGVtcChpbnQgc2Vuc29yKQo+IC17Cj4gLQlz dHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsKPiAtCQkuZWF4ID0gSThLX1NNTV9HRVRfVEVNUCwKPiAt CQkuZWJ4ID0gc2Vuc29yICYgMHhmZiwKPiAtCX07Cj4gLQo+IC0JcmV0dXJuIGk4a19zbW0oJnJl Z3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQgaThrX2dldF90 ZW1wKGludCBzZW5zb3IpCj4gLXsKPiAtCWludCB0ZW1wID0gX2k4a19nZXRfdGVtcChzZW5zb3Ip Owo+IC0KPiAtCS8qCj4gLQkgKiBTb21ldGltZXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciByZXR1 cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KPiAtCSAqIEluIHRoaXMgY2FzZSB3ZSBy ZXRyeSAob25jZSkgYmVmb3JlIHJldHVybmluZyBhbiBlcnJvci4KPiAtCSAjIDEwMDM2NTUxMzcg MDAwMDAwNTggMDAwMDVhNGIKPiAtCSAjIDEwMDM2NTUxMzggMDAwMDAwOTkgMDAwMDNhODAgPC0t LSAweDk5ID0gMTUzIGRlZ3JlZXMKPiAtCSAjIDEwMDM2NTUxMzkgMDAwMDAwNTQgMDAwMDVjNTIK PiAtCSAqLwo+IC0JaWYgKHRlbXAgPT0gMHg5OSkgewo+IC0JCW1zbGVlcCgxMDApOwo+IC0JCXRl bXAgPSBfaThrX2dldF90ZW1wKHNlbnNvcik7Cj4gLQl9Cj4gLQkvKgo+IC0JICogUmV0dXJuIC1F Tk9EQVRBIGZvciBhbGwgaW52YWxpZCB0ZW1wZXJhdHVyZXMuCj4gLQkgKgo+IC0JICogS25vd24g aW5zdGFuY2VzIGFyZSB0aGUgMHg5OSB2YWx1ZSBhcyBzZWVuIGFib3ZlIGFzIHdlbGwgYXMKPiAt CSAqIDB4YzEgKDE5MyksIHdoaWNoIG1heSBiZSByZXR1cm5lZCB3aGVuIHRyeWluZyB0byByZWFk IHRoZSBHUFUKPiAtCSAqIHRlbXBlcmF0dXJlIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgYSBHUFUg YW5kIGl0IGlzIGN1cnJlbnRseQo+IC0JICogdHVybmVkIG9mZi4KPiAtCSAqLwo+IC0JaWYgKHRl bXAgPiBJOEtfTUFYX1RFTVApCj4gLQkJcmV0dXJuIC1FTk9EQVRBOwo+IC0KPiAtCXJldHVybiB0 ZW1wOwo+IC19Cj4gLQo+IC1zdGF0aWMgaW50IGk4a19nZXRfZGVsbF9zaWduYXR1cmUoaW50IHJl cV9mbikKPiAtewo+IC0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSByZXFfZm4sIH07 Cj4gLQlpbnQgcmM7Cj4gLQo+IC0JcmMgPSBpOGtfc21tKCZyZWdzKTsKPiAtCWlmIChyYyA8IDAp Cj4gLQkJcmV0dXJuIHJjOwo+IC0KPiAtCXJldHVybiByZWdzLmVheCA9PSAxMTQ1NjUxNTI3ICYm IHJlZ3MuZWR4ID09IDExNDUzOTIyMDQgPyAwIDogLTE7Cj4gLX0KPiAtCj4gLXN0YXRpYyBpbnQK PiAtaThrX2lvY3RsX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwg dW5zaWduZWQgbG9uZyBhcmcpCj4gLXsKPiAtCWludCB2YWwgPSAwOwo+IC0JaW50IHNwZWVkOwo+ IC0JdW5zaWduZWQgY2hhciBidWZmWzE2XTsKPiAtCWludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9f dXNlciAqKWFyZzsKPiAtCj4gLQlpZiAoIWFyZ3ApCj4gLQkJcmV0dXJuIC1FSU5WQUw7Cj4gLQo+ IC0Jc3dpdGNoIChjbWQpIHsKPiAtCWNhc2UgSThLX0JJT1NfVkVSU0lPTjoKPiAtCQl2YWwgPSAo Ymlvc192ZXJzaW9uWzBdIDw8IDE2KSB8Cj4gLQkJCQkoYmlvc192ZXJzaW9uWzFdIDw8IDgpIHwg Ymlvc192ZXJzaW9uWzJdOwo+IC0JCWJyZWFrOwo+IC0KPiAtCWNhc2UgSThLX01BQ0hJTkVfSUQ6 Cj4gLQkJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKPiAtCQlzdHJsY3B5KGJ1ZmYsIGk4a19nZXRfZG1p X2RhdGEoRE1JX1BST0RVQ1RfU0VSSUFMKSwKPiAtCQkJc2l6ZW9mKGJ1ZmYpKTsKPiAtCQlicmVh azsKPiAtCj4gLQljYXNlIEk4S19GTl9TVEFUVVM6Cj4gLQkJdmFsID0gaThrX2dldF9mbl9zdGF0 dXMoKTsKPiAtCQlicmVhazsKPiAtCj4gLQljYXNlIEk4S19QT1dFUl9TVEFUVVM6Cj4gLQkJdmFs ID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsKPiAtCQlicmVhazsKPiAtCj4gLQljYXNlIEk4S19H RVRfVEVNUDoKPiAtCQl2YWwgPSBpOGtfZ2V0X3RlbXAoMCk7Cj4gLQkJYnJlYWs7Cj4gLQo+IC0J Y2FzZSBJOEtfR0VUX1NQRUVEOgo+IC0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBz aXplb2YoaW50KSkpCj4gLQkJCXJldHVybiAtRUZBVUxUOwo+IC0KPiAtCQl2YWwgPSBpOGtfZ2V0 X2Zhbl9zcGVlZCh2YWwpOwo+IC0JCWJyZWFrOwo+IC0KPiAtCWNhc2UgSThLX0dFVF9GQU46Cj4g LQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkKPiAtCQkJcmV0 dXJuIC1FRkFVTFQ7Cj4gLQo+IC0JCXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOwo+IC0J CWJyZWFrOwo+IC0KPiAtCWNhc2UgSThLX1NFVF9GQU46Cj4gLQkJaWYgKHJlc3RyaWN0ZWQgJiYg IWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCj4gLQkJCXJldHVybiAtRVBFUk07Cj4gLQo+IC0JCWlm IChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpCj4gLQkJCXJldHVybiAt RUZBVUxUOwo+IC0KPiAtCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwICsgMSwgc2l6 ZW9mKGludCkpKQo+IC0JCQlyZXR1cm4gLUVGQVVMVDsKPiAtCj4gLQkJdmFsID0gaThrX3NldF9m YW4odmFsLCBzcGVlZCk7Cj4gLQkJYnJlYWs7Cj4gLQo+IC0JZGVmYXVsdDoKPiAtCQlyZXR1cm4g LUVJTlZBTDsKPiAtCX0KPiAtCj4gLQlpZiAodmFsIDwgMCkKPiAtCQlyZXR1cm4gdmFsOwo+IC0K PiAtCXN3aXRjaCAoY21kKSB7Cj4gLQljYXNlIEk4S19CSU9TX1ZFUlNJT046Cj4gLQkJaWYgKGNv cHlfdG9fdXNlcihhcmdwLCAmdmFsLCA0KSkKPiAtCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gLQo+IC0J CWJyZWFrOwo+IC0JY2FzZSBJOEtfTUFDSElORV9JRDoKPiAtCQlpZiAoY29weV90b191c2VyKGFy Z3AsIGJ1ZmYsIDE2KSkKPiAtCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gLQo+IC0JCWJyZWFrOwo+IC0J ZGVmYXVsdDoKPiAtCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIHNpemVvZihpbnQpKSkK PiAtCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gLQo+IC0JCWJyZWFrOwo+IC0JfQo+IC0KPiAtCXJldHVy biAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1 bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKPiAtewo+IC0JbG9uZyByZXQ7Cj4g LQo+IC0JbXV0ZXhfbG9jaygmaThrX211dGV4KTsKPiAtCXJldCA9IGk4a19pb2N0bF91bmxvY2tl ZChmcCwgY21kLCBhcmcpOwo+IC0JbXV0ZXhfdW5sb2NrKCZpOGtfbXV0ZXgpOwo+IC0KPiAtCXJl dHVybiByZXQ7Cj4gLX0KPiAtCj4gLS8qCj4gLSAqIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3Ig L3Byb2MvaThrLgo+IC0gKi8KPiAtc3RhdGljIGludCBpOGtfcHJvY19zaG93KHN0cnVjdCBzZXFf ZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCj4gLXsKPiAtCWludCBmbl9rZXksIGNwdV90ZW1wLCBh Y19wb3dlcjsKPiAtCWludCBsZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3NwZWVkLCByaWdodF9z cGVlZDsKPiAtCj4gLQljcHVfdGVtcAk9IGk4a19nZXRfdGVtcCgwKTsJCQkvKiAxMTEwMCDCtXMg Ki8KPiAtCWxlZnRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAg NTgwIMK1cyAqLwo+IC0JcmlnaHRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fUklH SFQpOwkvKiAgIDU4MCDCtXMgKi8KPiAtCWxlZnRfc3BlZWQJPSBpOGtfZ2V0X2Zhbl9zcGVlZChJ OEtfRkFOX0xFRlQpOwkvKiAgIDU4MCDCtXMgKi8KPiAtCXJpZ2h0X3NwZWVkCT0gaThrX2dldF9m YW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwIMK1cyAqLwo+IC0JZm5fa2V5CQk9IGk4 a19nZXRfZm5fc3RhdHVzKCk7CQkJLyogICA3NTAgwrVzICovCj4gLQlpZiAocG93ZXJfc3RhdHVz KQo+IC0JCWFjX3Bvd2VyID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsJCS8qIDE0NzAwIMK1cyAq Lwo+IC0JZWxzZQo+IC0JCWFjX3Bvd2VyID0gLTE7Cj4gLQo+IC0JLyoKPiAtCSAqIEluZm86Cj4g LQkgKgo+IC0JICogMSkgIEZvcm1hdCB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1h dCBjaGFuZ2VzKQo+IC0JICogMikgIEJJT1MgdmVyc2lvbgo+IC0JICogMykgIEJJT1MgbWFjaGlu ZSBJRAo+IC0JICogNCkgIENwdSB0ZW1wZXJhdHVyZQo+IC0JICogNSkgIExlZnQgZmFuIHN0YXR1 cwo+IC0JICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKPiAtCSAqIDcpICBMZWZ0IGZhbiBzcGVlZAo+ IC0JICogOCkgIFJpZ2h0IGZhbiBzcGVlZAo+IC0JICogOSkgIEFDIHBvd2VyCj4gLQkgKiAxMCkg Rm4gS2V5IHN0YXR1cwo+IC0JICovCj4gLQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICIlcyAlcyAl cyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKPiAtCQkJICBJOEtfUFJPQ19GTVQsCj4gLQkJCSAg Ymlvc192ZXJzaW9uLAo+IC0JCQkgIGk4a19nZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfU0VSSUFM KSwKPiAtCQkJICBjcHVfdGVtcCwKPiAtCQkJICBsZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3Nw ZWVkLCByaWdodF9zcGVlZCwKPiAtCQkJICBhY19wb3dlciwgZm5fa2V5KTsKPiAtfQo+IC0KPiAt c3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAq ZmlsZSkKPiAtewo+IC0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGk4a19wcm9jX3Nob3csIE5V TEwpOwo+IC19Cj4gLQo+IC0KPiAtLyoKPiAtICogSHdtb24gaW50ZXJmYWNlCj4gLSAqLwo+IC0K PiAtc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbChzdHJ1Y3QgZGV2aWNl ICpkZXYsCj4gLQkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+IC0JCQkJ CSBjaGFyICpidWYpCj4gLXsKPiAtCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGFiZWxzW10g PSB7Cj4gLQkJIkNQVSIsCj4gLQkJIkdQVSIsCj4gLQkJIlNPRElNTSIsCj4gLQkJIk90aGVyIiwK PiAtCQkiQW1iaWVudCIsCj4gLQkJIk90aGVyIiwKPiAtCX07Cj4gLQlpbnQgaW5kZXggPSB0b19z ZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4Owo+IC0JaW50IHR5cGU7Cj4gLQo+IC0JdHlw ZSA9IGk4a19nZXRfdGVtcF90eXBlKGluZGV4KTsKPiAtCWlmICh0eXBlIDwgMCkKPiAtCQlyZXR1 cm4gdHlwZTsKPiAtCWlmICh0eXBlID49IEFSUkFZX1NJWkUobGFiZWxzKSkKPiAtCQl0eXBlID0g QVJSQVlfU0laRShsYWJlbHMpIC0gMTsKPiAtCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBs YWJlbHNbdHlwZV0pOwo+IC19Cj4gLQo+IC1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd190 ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAtCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRl ICpkZXZhdHRyLAo+IC0JCQkJICAgY2hhciAqYnVmKQo+IC17Cj4gLQlpbnQgaW5kZXggPSB0b19z ZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4Owo+IC0JaW50IHRlbXA7Cj4gLQo+IC0JdGVt cCA9IGk4a19nZXRfdGVtcChpbmRleCk7Cj4gLQlpZiAodGVtcCA8IDApCj4gLQkJcmV0dXJuIHRl bXA7Cj4gLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAqIDEwMDApOwo+IC19Cj4g LQo+IC1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd19mYW5fbGFiZWwoc3RydWN0IGRldmlj ZSAqZGV2LAo+IC0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+IC0JCQkJ CWNoYXIgKmJ1ZikKPiAtewo+IC0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsYWJlbHNbXSA9 IHsKPiAtCQkiUHJvY2Vzc29yIEZhbiIsCj4gLQkJIk1vdGhlcmJvYXJkIEZhbiIsCj4gLQkJIlZp ZGVvIEZhbiIsCj4gLQkJIlBvd2VyIFN1cHBseSBGYW4iLAo+IC0JCSJDaGlwc2V0IEZhbiIsCj4g LQkJIk90aGVyIEZhbiIsCj4gLQl9Owo+IC0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRy KGRldmF0dHIpLT5pbmRleDsKPiAtCWJvb2wgZG9jayA9IGZhbHNlOwo+IC0JaW50IHR5cGU7Cj4g LQo+IC0JdHlwZSA9IGk4a19nZXRfZmFuX3R5cGUoaW5kZXgpOwo+IC0JaWYgKHR5cGUgPCAwKQo+ IC0JCXJldHVybiB0eXBlOwo+IC0KPiAtCWlmICh0eXBlICYgMHgxMCkgewo+IC0JCWRvY2sgPSB0 cnVlOwo+IC0JCXR5cGUgJj0gMHgwRjsKPiAtCX0KPiAtCj4gLQlpZiAodHlwZSA+PSBBUlJBWV9T SVpFKGxhYmVscykpCj4gLQkJdHlwZSA9IChBUlJBWV9TSVpFKGxhYmVscykgLSAxKTsKPiAtCj4g LQlyZXR1cm4gc3ByaW50ZihidWYsICIlcyVzXG4iLCAoZG9jayA/ICJEb2NraW5nICIgOiAiIiks IGxhYmVsc1t0eXBlXSk7Cj4gLX0KPiAtCj4gLXN0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93 X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRl ICpkZXZhdHRyLAo+IC0JCQkJICBjaGFyICpidWYpCj4gLXsKPiAtCWludCBpbmRleCA9IHRvX3Nl bnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Cj4gLQlpbnQgZmFuX3NwZWVkOwo+IC0KPiAt CWZhbl9zcGVlZCA9IGk4a19nZXRfZmFuX3NwZWVkKGluZGV4KTsKPiAtCWlmIChmYW5fc3BlZWQg PCAwKQo+IC0JCXJldHVybiBmYW5fc3BlZWQ7Cj4gLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxu IiwgZmFuX3NwZWVkKTsKPiAtfQo+IC0KPiAtc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3df cHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKPiAtCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUg KmRldmF0dHIsCj4gLQkJCQkgIGNoYXIgKmJ1ZikKPiAtewo+IC0JaW50IGluZGV4ID0gdG9fc2Vu c29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKPiAtCWludCBzdGF0dXM7Cj4gLQo+IC0Jc3Rh dHVzID0gaThrX2dldF9mYW5fc3RhdHVzKGluZGV4KTsKPiAtCWlmIChzdGF0dXMgPCAwKQo+IC0J CXJldHVybiAtRUlPOwo+IC0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNsYW1wX3ZhbChz dGF0dXMgKiBpOGtfcHdtX211bHQsIDAsIDI1NSkpOwo+IC19Cj4gLQo+IC1zdGF0aWMgc3NpemVf dCBpOGtfaHdtb25fc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gLQkJCQkgc3RydWN0IGRl dmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4gLQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291 bnQpCj4gLXsKPiAtCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7 Cj4gLQl1bnNpZ25lZCBsb25nIHZhbDsKPiAtCWludCBlcnI7Cj4gLQo+IC0JZXJyID0ga3N0cnRv dWwoYnVmLCAxMCwgJnZhbCk7Cj4gLQlpZiAoZXJyKQo+IC0JCXJldHVybiBlcnI7Cj4gLQl2YWwg PSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodmFsLCBpOGtfcHdtX211bHQpLCAwLCBpOGtf ZmFuX21heCk7Cj4gLQo+IC0JbXV0ZXhfbG9jaygmaThrX211dGV4KTsKPiAtCWVyciA9IGk4a19z ZXRfZmFuKGluZGV4LCB2YWwpOwo+IC0JbXV0ZXhfdW5sb2NrKCZpOGtfbXV0ZXgpOwo+IC0KPiAt CXJldHVybiBlcnIgPCAwID8gLUVJTyA6IGNvdW50Owo+IC19Cj4gLQo+IC1zdGF0aWMgU0VOU09S X0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBO VUxMLCAwKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVH TywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKPiAtCQkJICAwKTsKPiAtc3RhdGlj IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3df dGVtcCwgTlVMTCwgMSk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbGFiZWws IFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCj4gLQkJCSAgMSk7Cj4g LXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIGk4a19od21v bl9zaG93X3RlbXAsIE5VTEwsIDIpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAz X2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xhYmVsLCBOVUxMLAo+IC0JCQkg IDIpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCBp OGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAzKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU Uih0ZW1wNF9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwK PiAtCQkJICAzKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lS VUdPLCBpOGtfaHdtb25fc2hvd19mYW4sIE5VTEwsIDApOwo+IC1zdGF0aWMgU0VOU09SX0RFVklD RV9BVFRSKGZhbjFfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2Zhbl9sYWJlbCwgTlVM TCwKPiAtCQkJICAwKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20xLCBTX0lSVUdP IHwgU19JV1VTUiwgaThrX2h3bW9uX3Nob3dfcHdtLAo+IC0JCQkgIGk4a19od21vbl9zZXRfcHdt LCAwKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBp OGtfaHdtb25fc2hvd19mYW4sIE5VTEwsCj4gLQkJCSAgMSk7Cj4gLXN0YXRpYyBTRU5TT1JfREVW SUNFX0FUVFIoZmFuMl9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuX2xhYmVsLCBO VUxMLAo+IC0JCQkgIDEpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTIsIFNfSVJV R08gfCBTX0lXVVNSLCBpOGtfaHdtb25fc2hvd19wd20sCj4gLQkJCSAgaThrX2h3bW9uX3NldF9w d20sIDEpOwo+IC0KPiAtc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmk4a19hdHRyc1tdID0gewo+ IC0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAwICovCj4g LQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDEgKi8KPiAt CSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogMiAqLwo+IC0J JnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAzICovCj4gLQkm c2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDQgKi8KPiAtCSZz ZW5zb3JfZGV2X2F0dHJfdGVtcDNfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogNSAqLwo+IC0JJnNl bnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA2ICovCj4gLQkmc2Vu c29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDcgKi8KPiAtCSZzZW5z b3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA4ICovCj4gLQkmc2Vuc29y X2Rldl9hdHRyX2ZhbjFfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogOSAqLwo+IC0JJnNlbnNvcl9k ZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCQkvKiAxMCAqLwo+IC0JJnNlbnNvcl9kZXZfYXR0 cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDExICovCj4gLQkmc2Vuc29yX2Rldl9hdHRy X2ZhbjJfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogMTIgKi8KPiAtCSZzZW5zb3JfZGV2X2F0dHJf cHdtMi5kZXZfYXR0ci5hdHRyLAkJLyogMTMgKi8KPiAtCU5VTEwKPiAtfTsKPiAtCj4gLXN0YXRp YyB1bW9kZV90IGk4a19pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0 cmlidXRlICphdHRyLAo+IC0JCQkgICAgICBpbnQgaW5kZXgpCj4gLXsKPiAtCWlmIChpbmRleCA+ PSAwICYmIGluZGV4IDw9IDEgJiYKPiAtCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01P Tl9IQVZFX1RFTVAxKSkKPiAtCQlyZXR1cm4gMDsKPiAtCWlmIChpbmRleCA+PSAyICYmIGluZGV4 IDw9IDMgJiYKPiAtCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAy KSkKPiAtCQlyZXR1cm4gMDsKPiAtCWlmIChpbmRleCA+PSA0ICYmIGluZGV4IDw9IDUgJiYKPiAt CSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAzKSkKPiAtCQlyZXR1 cm4gMDsKPiAtCWlmIChpbmRleCA+PSA2ICYmIGluZGV4IDw9IDcgJiYKPiAtCSAgICAhKGk4a19o d21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVA0KSkKPiAtCQlyZXR1cm4gMDsKPiAtCWlm IChpbmRleCA+PSA4ICYmIGluZGV4IDw9IDEwICYmCj4gLQkgICAgIShpOGtfaHdtb25fZmxhZ3Mg JiBJOEtfSFdNT05fSEFWRV9GQU4xKSkKPiAtCQlyZXR1cm4gMDsKPiAtCWlmIChpbmRleCA+PSAx MSAmJiBpbmRleCA8PSAxMyAmJgo+IC0JICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9O X0hBVkVfRkFOMikpCj4gLQkJcmV0dXJuIDA7Cj4gLQo+IC0JcmV0dXJuIGF0dHItPm1vZGU7Cj4g LX0KPiAtCj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGk4a19ncm91cCA9 IHsKPiAtCS5hdHRycyA9IGk4a19hdHRycywKPiAtCS5pc192aXNpYmxlID0gaThrX2lzX3Zpc2li bGUsCj4gLX07Cj4gLV9fQVRUUklCVVRFX0dST1VQUyhpOGspOwo+IC0KPiAtc3RhdGljIGludCBf X2luaXQgaThrX2luaXRfaHdtb24odm9pZCkKPiAtewo+IC0JaW50IGVycjsKPiAtCj4gLQlpOGtf aHdtb25fZmxhZ3MgPSAwOwo+IC0KPiAtCS8qIENQVSB0ZW1wZXJhdHVyZSBhdHRyaWJ1dGVzLCBp ZiB0ZW1wZXJhdHVyZSB0eXBlIGlzIE9LICovCj4gLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgw KTsKPiAtCWlmIChlcnIgPj0gMCkKPiAtCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hB VkVfVEVNUDE7Cj4gLQkvKiBjaGVjayBmb3IgYWRkaXRpb25hbCB0ZW1wZXJhdHVyZSBzZW5zb3Jz ICovCj4gLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgxKTsKPiAtCWlmIChlcnIgPj0gMCkKPiAt CQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfVEVNUDI7Cj4gLQllcnIgPSBpOGtf Z2V0X3RlbXBfdHlwZSgyKTsKPiAtCWlmIChlcnIgPj0gMCkKPiAtCQlpOGtfaHdtb25fZmxhZ3Mg fD0gSThLX0hXTU9OX0hBVkVfVEVNUDM7Cj4gLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgzKTsK PiAtCWlmIChlcnIgPj0gMCkKPiAtCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVf VEVNUDQ7Cj4gLQo+IC0JLyogRmlyc3QgZmFuIGF0dHJpYnV0ZXMsIGlmIGZhbiB0eXBlIGlzIE9L ICovCj4gLQllcnIgPSBpOGtfZ2V0X2Zhbl90eXBlKDApOwo+IC0JaWYgKGVyciA+PSAwKQo+IC0J CWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9GQU4xOwo+IC0KPiAtCS8qIFNlY29u ZCBmYW4gYXR0cmlidXRlcywgaWYgZmFuIHR5cGUgaXMgT0sgKi8KPiAtCWVyciA9IGk4a19nZXRf ZmFuX3R5cGUoMSk7Cj4gLQlpZiAoZXJyID49IDApCj4gLQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4 S19IV01PTl9IQVZFX0ZBTjI7Cj4gLQo+IC0JaThrX2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9y ZWdpc3Rlcl93aXRoX2dyb3VwcyhOVUxMLCAiaThrIiwgTlVMTCwKPiAtCQkJCQkJCSAgaThrX2dy b3Vwcyk7Cj4gLQlpZiAoSVNfRVJSKGk4a19od21vbl9kZXYpKSB7Cj4gLQkJZXJyID0gUFRSX0VS UihpOGtfaHdtb25fZGV2KTsKPiAtCQlpOGtfaHdtb25fZGV2ID0gTlVMTDsKPiAtCQlwcl9lcnIo Imh3bW9uIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKPiAtCQlyZXR1cm4gZXJy Owo+IC0JfQo+IC0JcmV0dXJuIDA7Cj4gLX0KPiAtCj4gLXN0cnVjdCBpOGtfY29uZmlnX2RhdGEg ewo+IC0JdWludCBmYW5fbXVsdDsKPiAtCXVpbnQgZmFuX21heDsKPiAtfTsKPiAtCj4gLWVudW0g aThrX2NvbmZpZ3Mgewo+IC0JREVMTF9MQVRJVFVERV9ENTIwLAo+IC0JREVMTF9QUkVDSVNJT05f NDkwLAo+IC0JREVMTF9TVFVESU8sCj4gLQlERUxMX1hQUywKPiAtfTsKPiAtCj4gLXN0YXRpYyBj b25zdCBzdHJ1Y3QgaThrX2NvbmZpZ19kYXRhIGk4a19jb25maWdfZGF0YVtdID0gewo+IC0JW0RF TExfTEFUSVRVREVfRDUyMF0gPSB7Cj4gLQkJLmZhbl9tdWx0ID0gMSwKPiAtCQkuZmFuX21heCA9 IEk4S19GQU5fVFVSQk8sCj4gLQl9LAo+IC0JW0RFTExfUFJFQ0lTSU9OXzQ5MF0gPSB7Cj4gLQkJ LmZhbl9tdWx0ID0gMSwKPiAtCQkuZmFuX21heCA9IEk4S19GQU5fVFVSQk8sCj4gLQl9LAo+IC0J W0RFTExfU1RVRElPXSA9IHsKPiAtCQkuZmFuX211bHQgPSAxLAo+IC0JCS5mYW5fbWF4ID0gSThL X0ZBTl9ISUdILAo+IC0JfSwKPiAtCVtERUxMX1hQU10gPSB7Cj4gLQkJLmZhbl9tdWx0ID0gMSwK PiAtCQkuZmFuX21heCA9IEk4S19GQU5fSElHSCwKPiAtCX0sCj4gLX07Cj4gLQo+IC1zdGF0aWMg c3RydWN0IGRtaV9zeXN0ZW1faWQgaThrX2RtaV90YWJsZVtdIF9faW5pdGRhdGEgPSB7Cj4gLQl7 Cj4gLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24iLAo+IC0JCS5tYXRjaGVzID0gewo+IC0JCQlE TUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCj4gLQkJCURNSV9NQVRD SChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24iKSwKPiAtCQl9LAo+IC0JfSwKPiAtCXsKPiAt CQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSIsCj4gLQkJLm1hdGNoZXMgPSB7Cj4gLQkJCURNSV9N QVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIiKSwKPiAtCQkJRE1JX01BVENIKERN SV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSIpLAo+IC0JCX0sCj4gLQl9LAo+IC0Jewo+IC0JCS5p ZGVudCA9ICJEZWxsIEluc3Bpcm9uIDIiLAo+IC0JCS5tYXRjaGVzID0gewo+IC0JCQlETUlfTUFU Q0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiAtCQkJRE1JX01BVENIKERNSV9QUk9E VUNUX05BTUUsICJJbnNwaXJvbiIpLAo+IC0JCX0sCj4gLQl9LAo+IC0Jewo+IC0JCS5pZGVudCA9 ICJEZWxsIExhdGl0dWRlIEQ1MjAiLAo+IC0JCS5tYXRjaGVzID0gewo+IC0JCQlETUlfTUFUQ0go RE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiAtCQkJRE1JX01BVENIKERNSV9QUk9EVUNU X05BTUUsICJMYXRpdHVkZSBENTIwIiksCj4gLQkJfSwKPiAtCQkuZHJpdmVyX2RhdGEgPSAodm9p ZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9MQVRJVFVERV9ENTIwXSwKPiAtCX0sCj4gLQl7Cj4g LQkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgMiIsCj4gLQkJLm1hdGNoZXMgPSB7Cj4gLQkJCURN SV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAo+IC0JCQlETUlfTUFUQ0goRE1J X1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIiksCj4gLQkJfSwKPiAtCX0sCj4gLQl7CS8qIFVLIElu c3Bpcm9uIDY0MDAgICovCj4gLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMyIsCj4gLQkJLm1h dGNoZXMgPSB7Cj4gLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAo+ IC0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1NMDYxIiksCj4gLQkJfSwKPiAtCX0s Cj4gLQl7Cj4gLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMyIsCj4gLQkJLm1hdGNoZXMgPSB7 Cj4gLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAo+IC0JCQlETUlf TUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1QMDYxIiksCj4gLQkJfSwKPiAtCX0sCj4gLQl7Cj4g LQkJLmlkZW50ID0gIkRlbGwgUHJlY2lzaW9uIDQ5MCIsCj4gLQkJLm1hdGNoZXMgPSB7Cj4gLQkJ CURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAo+IC0JCQlETUlfTUFUQ0go RE1JX1BST0RVQ1RfTkFNRSwKPiAtCQkJCSAgIlByZWNpc2lvbiBXb3JrU3RhdGlvbiA0OTAiKSwK PiAtCQl9LAo+IC0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxM X1BSRUNJU0lPTl80OTBdLAo+IC0JfSwKPiAtCXsKPiAtCQkuaWRlbnQgPSAiRGVsbCBQcmVjaXNp b24iLAo+IC0JCS5tYXRjaGVzID0gewo+IC0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJE ZWxsIEluYy4iKSwKPiAtCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQcmVjaXNpb24i KSwKPiAtCQl9LAo+IC0JfSwKPiAtCXsKPiAtCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8iLAo+IC0J CS5tYXRjaGVzID0gewo+IC0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4i KSwKPiAtCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8iKSwKPiAtCQl9LAo+ IC0JfSwKPiAtCXsKPiAtCQkuaWRlbnQgPSAiRGVsbCBYUFM0MjEiLAo+IC0JCS5tYXRjaGVzID0g ewo+IC0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiAtCQkJRE1J X01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMgTDQyMVgiKSwKPiAtCQl9LAo+IC0JfSwKPiAt CXsKPiAtCQkuaWRlbnQgPSAiRGVsbCBTdHVkaW8iLAo+IC0JCS5tYXRjaGVzID0gewo+IC0JCQlE TUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiAtCQkJRE1JX01BVENIKERN SV9QUk9EVUNUX05BTUUsICJTdHVkaW8iKSwKPiAtCQl9LAo+IC0JCS5kcml2ZXJfZGF0YSA9ICh2 b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX1NUVURJT10sCj4gLQl9LAo+IC0Jewo+IC0JCS5p ZGVudCA9ICJEZWxsIFhQUyAxMyIsCj4gLQkJLm1hdGNoZXMgPSB7Cj4gLQkJCURNSV9NQVRDSChE TUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAo+IC0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1Rf TkFNRSwgIlhQUzEzIiksCj4gLQkJfSwKPiAtCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtf Y29uZmlnX2RhdGFbREVMTF9YUFNdLAo+IC0JfSwKPiAtCXsKPiAtCQkuaWRlbnQgPSAiRGVsbCBY UFMgTTE0MCIsCj4gLQkJLm1hdGNoZXMgPSB7Cj4gLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRP UiwgIkRlbGwgSW5jLiIpLAo+IC0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1YQzA1 MSIpLAo+IC0JCX0sCj4gLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRh W0RFTExfWFBTXSwKPiAtCX0sCj4gLQl7IH0KPiAtfTsKPiAtCj4gLU1PRFVMRV9ERVZJQ0VfVEFC TEUoZG1pLCBpOGtfZG1pX3RhYmxlKTsKPiAtCj4gLS8qCj4gLSAqIFByb2JlIGZvciB0aGUgcHJl c2VuY2Ugb2YgYSBzdXBwb3J0ZWQgbGFwdG9wLgo+IC0gKi8KPiAtc3RhdGljIGludCBfX2luaXQg aThrX3Byb2JlKHZvaWQpCj4gLXsKPiAtCWNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZDsK PiAtCWludCBmYW4sIHJldDsKPiAtCj4gLQkvKgo+IC0JICogR2V0IERNSSBpbmZvcm1hdGlvbgo+ IC0JICovCj4gLQlpZiAoIWRtaV9jaGVja19zeXN0ZW0oaThrX2RtaV90YWJsZSkpIHsKPiAtCQlp ZiAoIWlnbm9yZV9kbWkgJiYgIWZvcmNlKQo+IC0JCQlyZXR1cm4gLUVOT0RFVjsKPiAtCj4gLQkJ cHJfaW5mbygibm90IHJ1bm5pbmcgb24gYSBzdXBwb3J0ZWQgRGVsbCBzeXN0ZW0uXG4iKTsKPiAt CQlwcl9pbmZvKCJ2ZW5kb3I9JXMsIG1vZGVsPSVzLCB2ZXJzaW9uPSVzXG4iLAo+IC0JCQlpOGtf Z2V0X2RtaV9kYXRhKERNSV9TWVNfVkVORE9SKSwKPiAtCQkJaThrX2dldF9kbWlfZGF0YShETUlf UFJPRFVDVF9OQU1FKSwKPiAtCQkJaThrX2dldF9kbWlfZGF0YShETUlfQklPU19WRVJTSU9OKSk7 Cj4gLQl9Cj4gLQo+IC0Jc3RybGNweShiaW9zX3ZlcnNpb24sIGk4a19nZXRfZG1pX2RhdGEoRE1J X0JJT1NfVkVSU0lPTiksCj4gLQkJc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwo+IC0KPiAtCS8qCj4g LQkgKiBHZXQgU01NIERlbGwgc2lnbmF0dXJlCj4gLQkgKi8KPiAtCWlmIChpOGtfZ2V0X2RlbGxf c2lnbmF0dXJlKEk4S19TTU1fR0VUX0RFTExfU0lHMSkgJiYKPiAtCSAgICBpOGtfZ2V0X2RlbGxf c2lnbmF0dXJlKEk4S19TTU1fR0VUX0RFTExfU0lHMikpIHsKPiAtCQlwcl9lcnIoInVuYWJsZSB0 byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKPiAtCQlpZiAoIWZvcmNlKQo+IC0JCQlyZXR1 cm4gLUVOT0RFVjsKPiAtCX0KPiAtCj4gLQkvKgo+IC0JICogU2V0IGZhbiBtdWx0aXBsaWVyIGFu ZCBtYXhpbWFsIGZhbiBzcGVlZCBmcm9tIGRtaSBjb25maWcKPiAtCSAqIFZhbHVlcyBzcGVjaWZp ZWQgaW4gbW9kdWxlIHBhcmFtZXRlcnMgb3ZlcnJpZGUgdmFsdWVzIGZyb20gZG1pCj4gLQkgKi8K PiAtCWlkID0gZG1pX2ZpcnN0X21hdGNoKGk4a19kbWlfdGFibGUpOwo+IC0JaWYgKGlkICYmIGlk LT5kcml2ZXJfZGF0YSkgewo+IC0JCWNvbnN0IHN0cnVjdCBpOGtfY29uZmlnX2RhdGEgKmNvbmYg PSBpZC0+ZHJpdmVyX2RhdGE7Cj4gLQkJaWYgKCFmYW5fbXVsdCAmJiBjb25mLT5mYW5fbXVsdCkK PiAtCQkJZmFuX211bHQgPSBjb25mLT5mYW5fbXVsdDsKPiAtCQlpZiAoIWZhbl9tYXggJiYgY29u Zi0+ZmFuX21heCkKPiAtCQkJZmFuX21heCA9IGNvbmYtPmZhbl9tYXg7Cj4gLQl9Cj4gLQo+IC0J aThrX2Zhbl9tYXggPSBmYW5fbWF4ID8gOiBJOEtfRkFOX0hJR0g7CS8qIE11c3Qgbm90IGJlIDAg Ki8KPiAtCWk4a19wd21fbXVsdCA9IERJVl9ST1VORF9VUCgyNTUsIGk4a19mYW5fbWF4KTsKPiAt Cj4gLQlpZiAoIWZhbl9tdWx0KSB7Cj4gLQkJLyoKPiAtCQkgKiBBdXRvZGV0ZWN0IGZhbiBtdWx0 aXBsaWVyIGJhc2VkIG9uIG5vbWluYWwgcnBtCj4gLQkJICogSWYgZmFuIHJlcG9ydHMgcnBtIHZh bHVlIHRvbyBoaWdoIHRoZW4gc2V0IG11bHRpcGxpZXIgdG8gMQo+IC0JCSAqLwo+IC0JCWZvciAo ZmFuID0gMDsgZmFuIDwgMjsgKytmYW4pIHsKPiAtCQkJcmV0ID0gaThrX2dldF9mYW5fbm9taW5h bF9zcGVlZChmYW4sIGk4a19mYW5fbWF4KTsKPiAtCQkJaWYgKHJldCA8IDApCj4gLQkJCQljb250 aW51ZTsKPiAtCQkJaWYgKHJldCA+IEk4S19GQU5fTUFYX1JQTSkKPiAtCQkJCWk4a19mYW5fbXVs dCA9IDE7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KPiAtCX0gZWxzZSB7Cj4gLQkJLyogRmFuIG11bHRp cGxpZXIgd2FzIHNwZWNpZmllZCBpbiBtb2R1bGUgcGFyYW0gb3IgaW4gZG1pICovCj4gLQkJaThr X2Zhbl9tdWx0ID0gZmFuX211bHQ7Cj4gLQl9Cj4gLQo+IC0JcmV0dXJuIDA7Cj4gLX0KPiAtCj4g LXN0YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCj4gLXsKPiAtCXN0cnVjdCBwcm9jX2Rp cl9lbnRyeSAqcHJvY19pOGs7Cj4gLQlpbnQgZXJyOwo+IC0KPiAtCS8qIEFyZSB3ZSBydW5uaW5n IG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCj4gLQlpZiAoaThrX3Byb2JlKCkpCj4gLQkJcmV0 dXJuIC1FTk9ERVY7Cj4gLQo+IC0JLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KPiAtCXBy b2NfaThrID0gcHJvY19jcmVhdGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9wcyk7Cj4gLQlpZiAo IXByb2NfaThrKQo+IC0JCXJldHVybiAtRU5PRU5UOwo+IC0KPiAtCWVyciA9IGk4a19pbml0X2h3 bW9uKCk7Cj4gLQlpZiAoZXJyKQo+IC0JCWdvdG8gZXhpdF9yZW1vdmVfcHJvYzsKPiAtCj4gLQly ZXR1cm4gMDsKPiAtCj4gLSBleGl0X3JlbW92ZV9wcm9jOgo+IC0JcmVtb3ZlX3Byb2NfZW50cnko Imk4ayIsIE5VTEwpOwo+IC0JcmV0dXJuIGVycjsKPiAtfQo+IC0KPiAtc3RhdGljIHZvaWQgX19l eGl0IGk4a19leGl0KHZvaWQpCj4gLXsKPiAtCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19o d21vbl9kZXYpOwo+IC0JcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOwo+IC19Cj4gLQo+ IC1tb2R1bGVfaW5pdChpOGtfaW5pdCk7Cj4gLW1vZHVsZV9leGl0KGk4a19leGl0KTsKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUK PiBpbmRleCA2Yzk0MTQ3Li4xYzNlNDU4IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFr ZWZpbGUKPiArKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4gQEAgLTE1NSw2ICsxNTUsNyBA QCBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCj4gICBvYmot JChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5vCj4gICBvYmotJChDT05G SUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCj4gICBvYmotJChDT05GSUdfU0VO U09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCj4gK29iai0kKENPTkZJR19JOEspCQkrPSBk ZWxsLXNtbS1od21vbi5vCj4KPiAgIG9iai0kKENPTkZJR19QTUJVUykJCSs9IHBtYnVzLwo+Cj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYyBiL2RyaXZlcnMvaHdt b24vZGVsbC1zbW0taHdtb24uYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MC4uMmIwNGU0Zgo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21t LWh3bW9uLmMKPiBAQCAtMCwwICsxLDEwMDcgQEAKPiArLyoKPiArICogZGVsbC1zbW0taHdtb24u YyAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIEJJT1Mgb24gRGVsbCBsYXB0 b3BzLgo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRvIDxk ekBkZWJpYW4ub3JnPgo+ICsgKgo+ICsgKiBId21vbiBpbnRlZ3JhdGlvbjoKPiArICogQ29weXJp Z2h0IChDKSAyMDExICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+Cj4gKyAqIENvcHly aWdodCAoQykgMjAxMywgMjAxNCAgR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0Pgo+ ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIDIwMTUgIFBhbGkgUm9ow6FyIDxwYWxpLnJvaGFyQGdt YWlsLmNvbT4KPiArICoKPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKPiArICogdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCj4g KyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlv dXIgb3B0aW9uKSBhbnkKPiArICogbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICogVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1 dAo+ICsgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh cnJhbnR5IG9mCj4gKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCj4gKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KPiArICovCj4gKwo+ICsjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9N T0ROQU1FICI6ICIgZm10Cj4gKwo+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L2luaXQuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L3NlcV9maWxlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Cj4gKyNp bmNsdWRlIDxsaW51eC9od21vbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4K PiArI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4g KyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgo+ICsKPiArI2luY2x1ZGUgPGxpbnV4L2k4ay5oPgo+ ICsKPiArI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKPiArI2RlZmluZSBJOEtfU01N X1BPV0VSX1NUQVRVUwkweDAwNjkKPiArI2RlZmluZSBJOEtfU01NX1NFVF9GQU4JCTB4MDFhMwo+ ICsjZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCj4gKyNkZWZpbmUgSThLX1NNTV9HRVRf U1BFRUQJMHgwMmEzCj4gKyNkZWZpbmUgSThLX1NNTV9HRVRfRkFOX1RZUEUJMHgwM2EzCj4gKyNk ZWZpbmUgSThLX1NNTV9HRVRfTk9NX1NQRUVECTB4MDRhMwo+ICsjZGVmaW5lIEk4S19TTU1fR0VU X1RFTVAJMHgxMGEzCj4gKyNkZWZpbmUgSThLX1NNTV9HRVRfVEVNUF9UWVBFCTB4MTFhMwo+ICsj ZGVmaW5lIEk4S19TTU1fR0VUX0RFTExfU0lHMQkweGZlYTMKPiArI2RlZmluZSBJOEtfU01NX0dF VF9ERUxMX1NJRzIJMHhmZmEzCj4gKwo+ICsjZGVmaW5lIEk4S19GQU5fTVVMVAkJMzAKPiArI2Rl ZmluZSBJOEtfRkFOX01BWF9SUE0JCTMwMDAwCj4gKyNkZWZpbmUgSThLX01BWF9URU1QCQkxMjcK PiArCj4gKyNkZWZpbmUgSThLX0ZOX05PTkUJCTB4MDAKPiArI2RlZmluZSBJOEtfRk5fVVAJCTB4 MDEKPiArI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgwMgo+ICsjZGVmaW5lIEk4S19GTl9NVVRFCQkw eDA0Cj4gKyNkZWZpbmUgSThLX0ZOX01BU0sJCTB4MDcKPiArI2RlZmluZSBJOEtfRk5fU0hJRlQJ CTgKPiArCj4gKyNkZWZpbmUgSThLX1BPV0VSX0FDCQkweDA1Cj4gKyNkZWZpbmUgSThLX1BPV0VS X0JBVFRFUlkJMHgwMQo+ICsKPiArc3RhdGljIERFRklORV9NVVRFWChpOGtfbXV0ZXgpOwo+ICtz dGF0aWMgY2hhciBiaW9zX3ZlcnNpb25bNF07Cj4gK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICppOGtf aHdtb25fZGV2Owo+ICtzdGF0aWMgdTMyIGk4a19od21vbl9mbGFnczsKPiArc3RhdGljIHVpbnQg aThrX2Zhbl9tdWx0ID0gSThLX0ZBTl9NVUxUOwo+ICtzdGF0aWMgdWludCBpOGtfcHdtX211bHQ7 Cj4gK3N0YXRpYyB1aW50IGk4a19mYW5fbWF4ID0gSThLX0ZBTl9ISUdIOwo+ICsKPiArI2RlZmlu ZSBJOEtfSFdNT05fSEFWRV9URU1QMQkoMSA8PCAwKQo+ICsjZGVmaW5lIEk4S19IV01PTl9IQVZF X1RFTVAyCSgxIDw8IDEpCj4gKyNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDMJKDEgPDwgMikK PiArI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1QNAkoMSA8PCAzKQo+ICsjZGVmaW5lIEk4S19I V01PTl9IQVZFX0ZBTjEJKDEgPDwgNCkKPiArI2RlZmluZSBJOEtfSFdNT05fSEFWRV9GQU4yCSgx IDw8IDUpCj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJNYXNzaW1vIERhbCBab3R0byAoZHpAZGViaWFu Lm9yZykiKTsKPiArTU9EVUxFX0FVVEhPUigiUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwu Y29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgYWNjZXNzaW5nIFNNTSBC SU9TIG9uIERlbGwgbGFwdG9wcyIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gK01PRFVM RV9BTElBUygiaThrIik7Cj4gKwo+ICtzdGF0aWMgYm9vbCBmb3JjZTsKPiArbW9kdWxlX3BhcmFt KGZvcmNlLCBib29sLCAwKTsKPiArTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkZvcmNlIGxvYWRp bmcgd2l0aG91dCBjaGVja2luZyBmb3Igc3VwcG9ydGVkIG1vZGVscyIpOwo+ICsKPiArc3RhdGlj IGJvb2wgaWdub3JlX2RtaTsKPiArbW9kdWxlX3BhcmFtKGlnbm9yZV9kbWksIGJvb2wsIDApOwo+ ICtNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9kbWksICJDb250aW51ZSBwcm9iaW5nIGhhcmR3YXJl IGV2ZW4gaWYgRE1JIGRhdGEgZG9lcyBub3QgbWF0Y2giKTsKPiArCj4gK3N0YXRpYyBib29sIHJl c3RyaWN0ZWQ7Cj4gK21vZHVsZV9wYXJhbShyZXN0cmljdGVkLCBib29sLCAwKTsKPiArTU9EVUxF X1BBUk1fREVTQyhyZXN0cmljdGVkLCAiQWxsb3cgZmFuIGNvbnRyb2wgaWYgU1lTX0FETUlOIGNh cGFiaWxpdHkgc2V0Iik7Cj4gKwo+ICtzdGF0aWMgYm9vbCBwb3dlcl9zdGF0dXM7Cj4gK21vZHVs ZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2wsIDA2MDApOwo+ICtNT0RVTEVfUEFSTV9ERVNDKHBv d2VyX3N0YXR1cywgIlJlcG9ydCBwb3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7Cj4gKwo+ICtz dGF0aWMgdWludCBmYW5fbXVsdDsKPiArbW9kdWxlX3BhcmFtKGZhbl9tdWx0LCB1aW50LCAwKTsK PiArTU9EVUxFX1BBUk1fREVTQyhmYW5fbXVsdCwgIkZhY3RvciB0byBtdWx0aXBseSBmYW4gc3Bl ZWQgd2l0aCAoZGVmYXVsdDogYXV0b2RldGVjdCkiKTsKPiArCj4gK3N0YXRpYyB1aW50IGZhbl9t YXg7Cj4gK21vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKPiArTU9EVUxFX1BBUk1fREVT QyhmYW5fbWF4LCAiTWF4aW11bSBjb25maWd1cmFibGUgZmFuIHNwZWVkIChkZWZhdWx0OiBhdXRv ZGV0ZWN0KSIpOwo+ICsKPiArc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlu b2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Cj4gK3N0YXRpYyBsb25nIGk4a19pb2N0bChzdHJ1Y3Qg ZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwo+ICsKPiArc3RhdGljIGNvbnN0 IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7Cj4gKwkub3duZXIJCT0gVEhJU19N T0RVTEUsCj4gKwkub3BlbgkJPSBpOGtfb3Blbl9mcywKPiArCS5yZWFkCQk9IHNlcV9yZWFkLAo+ ICsJLmxsc2VlawkJPSBzZXFfbHNlZWssCj4gKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAo+ ICsJLnVubG9ja2VkX2lvY3RsCT0gaThrX2lvY3RsLAo+ICt9Owo+ICsKPiArc3RydWN0IHNtbV9y ZWdzIHsKPiArCXVuc2lnbmVkIGludCBlYXg7Cj4gKwl1bnNpZ25lZCBpbnQgZWJ4IF9fcGFja2Vk Owo+ICsJdW5zaWduZWQgaW50IGVjeCBfX3BhY2tlZDsKPiArCXVuc2lnbmVkIGludCBlZHggX19w YWNrZWQ7Cj4gKwl1bnNpZ25lZCBpbnQgZXNpIF9fcGFja2VkOwo+ICsJdW5zaWduZWQgaW50IGVk aSBfX3BhY2tlZDsKPiArfTsKPiArCj4gK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaThrX2dl dF9kbWlfZGF0YShpbnQgZmllbGQpCj4gK3sKPiArCWNvbnN0IGNoYXIgKmRtaV9kYXRhID0gZG1p X2dldF9zeXN0ZW1faW5mbyhmaWVsZCk7Cj4gKwo+ICsJcmV0dXJuIGRtaV9kYXRhICYmICpkbWlf ZGF0YSA/IGRtaV9kYXRhIDogIj8iOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBDYWxsIHRoZSBTeXN0 ZW0gTWFuYWdlbWVudCBNb2RlIEJJT1MuIENvZGUgcHJvdmlkZWQgYnkgSm9uYXRoYW4gQnV6emFy ZC4KPiArICovCj4gK3N0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qgc21tX3JlZ3MgKnJlZ3MpCj4g K3sKPiArCWludCByYzsKPiArCWludCBlYXggPSByZWdzLT5lYXg7Cj4gKwljcHVtYXNrX3Zhcl90 IG9sZF9tYXNrOwo+ICsKPiArCS8qIFNNTSByZXF1aXJlcyBDUFUgMCAqLwo+ICsJaWYgKCFhbGxv Y19jcHVtYXNrX3Zhcigmb2xkX21hc2ssIEdGUF9LRVJORUwpKQo+ICsJCXJldHVybiAtRU5PTUVN Owo+ICsJY3B1bWFza19jb3B5KG9sZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKPiAr CXJjID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgY3B1bWFza19vZigwKSk7Cj4gKwlp ZiAocmMpCj4gKwkJZ290byBvdXQ7Cj4gKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApIHsK PiArCQlyYyA9IC1FQlVTWTsKPiArCQlnb3RvIG91dDsKPiArCX0KPiArCj4gKyNpZiBkZWZpbmVk KENPTkZJR19YODZfNjQpCj4gKwlhc20gdm9sYXRpbGUoInB1c2hxICUlcmF4XG5cdCIKPiArCQki bW92bCAwKCUlcmF4KSwlJWVkeFxuXHQiCj4gKwkJInB1c2hxICUlcmR4XG5cdCIKPiArCQkibW92 bCA0KCUlcmF4KSwlJWVieFxuXHQiCj4gKwkJIm1vdmwgOCglJXJheCksJSVlY3hcblx0Igo+ICsJ CSJtb3ZsIDEyKCUlcmF4KSwlJWVkeFxuXHQiCj4gKwkJIm1vdmwgMTYoJSVyYXgpLCUlZXNpXG5c dCIKPiArCQkibW92bCAyMCglJXJheCksJSVlZGlcblx0Igo+ICsJCSJwb3BxICUlcmF4XG5cdCIK PiArCQkib3V0ICUlYWwsJDB4YjJcblx0Igo+ICsJCSJvdXQgJSVhbCwkMHg4NFxuXHQiCj4gKwkJ InhjaGdxICUlcmF4LCglJXJzcClcblx0Igo+ICsJCSJtb3ZsICUlZWJ4LDQoJSVyYXgpXG5cdCIK PiArCQkibW92bCAlJWVjeCw4KCUlcmF4KVxuXHQiCj4gKwkJIm1vdmwgJSVlZHgsMTIoJSVyYXgp XG5cdCIKPiArCQkibW92bCAlJWVzaSwxNiglJXJheClcblx0Igo+ICsJCSJtb3ZsICUlZWRpLDIw KCUlcmF4KVxuXHQiCj4gKwkJInBvcHEgJSVyZHhcblx0Igo+ICsJCSJtb3ZsICUlZWR4LDAoJSVy YXgpXG5cdCIKPiArCQkicHVzaGZxXG5cdCIKPiArCQkicG9wcSAlJXJheFxuXHQiCj4gKwkJImFu ZGwgJDEsJSVlYXhcbiIKPiArCQk6ICI9YSIocmMpCj4gKwkJOiAgICAiYSIocmVncykKPiArCQk6 ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7Cj4g KyNlbHNlCj4gKwlhc20gdm9sYXRpbGUoInB1c2hsICUlZWF4XG5cdCIKPiArCSAgICAibW92bCAw KCUlZWF4KSwlJWVkeFxuXHQiCj4gKwkgICAgInB1c2ggJSVlZHhcblx0Igo+ICsJICAgICJtb3Zs IDQoJSVlYXgpLCUlZWJ4XG5cdCIKPiArCSAgICAibW92bCA4KCUlZWF4KSwlJWVjeFxuXHQiCj4g KwkgICAgIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIKPiArCSAgICAibW92bCAxNiglJWVheCks JSVlc2lcblx0Igo+ICsJICAgICJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiCj4gKwkgICAgInBv cGwgJSVlYXhcblx0Igo+ICsJICAgICJvdXQgJSVhbCwkMHhiMlxuXHQiCj4gKwkgICAgIm91dCAl JWFsLCQweDg0XG5cdCIKPiArCSAgICAieGNoZ2wgJSVlYXgsKCUlZXNwKVxuXHQiCj4gKwkgICAg Im1vdmwgJSVlYngsNCglJWVheClcblx0Igo+ICsJICAgICJtb3ZsICUlZWN4LDgoJSVlYXgpXG5c dCIKPiArCSAgICAibW92bCAlJWVkeCwxMiglJWVheClcblx0Igo+ICsJICAgICJtb3ZsICUlZXNp LDE2KCUlZWF4KVxuXHQiCj4gKwkgICAgIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIKPiArCSAg ICAicG9wbCAlJWVkeFxuXHQiCj4gKwkgICAgIm1vdmwgJSVlZHgsMCglJWVheClcblx0Igo+ICsJ ICAgICJsYWhmXG5cdCIKPiArCSAgICAic2hybCAkOCwlJWVheFxuXHQiCj4gKwkgICAgImFuZGwg JDEsJSVlYXhcbiIKPiArCSAgICA6ICI9YSIocmMpCj4gKwkgICAgOiAgICAiYSIocmVncykKPiAr CSAgICA6ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5 Iik7Cj4gKyNlbmRpZgo+ICsJaWYgKHJjICE9IDAgfHwgKHJlZ3MtPmVheCAmIDB4ZmZmZikgPT0g MHhmZmZmIHx8IHJlZ3MtPmVheCA9PSBlYXgpCj4gKwkJcmMgPSAtRUlOVkFMOwo+ICsKPiArb3V0 Ogo+ICsJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgb2xkX21hc2spOwo+ICsJZnJlZV9j cHVtYXNrX3ZhcihvbGRfbWFzayk7Cj4gKwlyZXR1cm4gcmM7Cj4gK30KPiArCj4gKy8qCj4gKyAq IFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCj4gKyAqLwo+ICtzdGF0aWMgaW50IGk4a19nZXRfZm5f c3RhdHVzKHZvaWQpCj4gK3sKPiArCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThL X1NNTV9GTl9TVEFUVVMsIH07Cj4gKwlpbnQgcmM7Cj4gKwo+ICsJcmMgPSBpOGtfc21tKCZyZWdz KTsKPiArCWlmIChyYyA8IDApCj4gKwkJcmV0dXJuIHJjOwo+ICsKPiArCXN3aXRjaCAoKHJlZ3Mu ZWF4ID4+IEk4S19GTl9TSElGVCkgJiBJOEtfRk5fTUFTSykgewo+ICsJY2FzZSBJOEtfRk5fVVA6 Cj4gKwkJcmV0dXJuIEk4S19WT0xfVVA7Cj4gKwljYXNlIEk4S19GTl9ET1dOOgo+ICsJCXJldHVy biBJOEtfVk9MX0RPV047Cj4gKwljYXNlIEk4S19GTl9NVVRFOgo+ICsJCXJldHVybiBJOEtfVk9M X01VVEU7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICt9Cj4gKwo+ICsvKgo+ ICsgKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCj4gKyAqLwo+ICtzdGF0aWMgaW50IGk4a19nZXRf cG93ZXJfc3RhdHVzKHZvaWQpCj4gK3sKPiArCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4 ID0gSThLX1NNTV9QT1dFUl9TVEFUVVMsIH07Cj4gKwlpbnQgcmM7Cj4gKwo+ICsJcmMgPSBpOGtf c21tKCZyZWdzKTsKPiArCWlmIChyYyA8IDApCj4gKwkJcmV0dXJuIHJjOwo+ICsKPiArCXJldHVy biAocmVncy5lYXggJiAweGZmKSA9PSBJOEtfUE9XRVJfQUMgPyBJOEtfQUMgOiBJOEtfQkFUVEVS WTsKPiArfQo+ICsKPiArLyoKPiArICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KPiArICovCj4gK3N0 YXRpYyBpbnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCj4gK3sKPiArCXN0cnVjdCBzbW1f cmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfRkFOLCB9Owo+ICsKPiArCXJlZ3MuZWJ4 ID0gZmFuICYgMHhmZjsKPiArCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAw eGZmOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBSZWFkIHRoZSBmYW4gc3BlZWQgaW4gUlBNLgo+ICsg Ki8KPiArc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zcGVlZChpbnQgZmFuKQo+ICt7Cj4gKwlzdHJ1 Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX1NQRUVELCB9Owo+ICsKPiAr CXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKPiArCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogKHJl Z3MuZWF4ICYgMHhmZmZmKSAqIGk4a19mYW5fbXVsdDsKPiArfQo+ICsKPiArLyoKPiArICogUmVh ZCB0aGUgZmFuIHR5cGUuCj4gKyAqLwo+ICtzdGF0aWMgaW50IGk4a19nZXRfZmFuX3R5cGUoaW50 IGZhbikKPiArewo+ICsJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dF VF9GQU5fVFlQRSwgfTsKPiArCj4gKwlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Cj4gKwlyZXR1cm4g aThrX3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKPiArfQo+ICsKPiArLyoKPiArICog UmVhZCB0aGUgZmFuIG5vbWluYWwgcnBtIGZvciBzcGVjaWZpYyBmYW4gc3BlZWQuCj4gKyAqLwo+ ICtzdGF0aWMgaW50IGk4a19nZXRfZmFuX25vbWluYWxfc3BlZWQoaW50IGZhbiwgaW50IHNwZWVk KQo+ICt7Cj4gKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX05P TV9TUEVFRCwgfTsKPiArCj4gKwlyZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChzcGVlZCA8PCA4 KTsKPiArCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIGk4 a19mYW5fbXVsdDsKPiArfQo+ICsKPiArLyoKPiArICogU2V0IHRoZSBmYW4gc3BlZWQgKG9mZiwg bG93LCBoaWdoKS4gUmV0dXJucyB0aGUgbmV3IGZhbiBzdGF0dXMuCj4gKyAqLwo+ICtzdGF0aWMg aW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkKPiArewo+ICsJc3RydWN0IHNtbV9y ZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX1NFVF9GQU4sIH07Cj4gKwo+ICsJc3BlZWQgPSAo c3BlZWQgPCAwKSA/IDAgOiAoKHNwZWVkID4gaThrX2Zhbl9tYXgpID8gaThrX2Zhbl9tYXggOiBz cGVlZCk7Cj4gKwlyZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChzcGVlZCA8PCA4KTsKPiArCj4g KwlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IGk4a19nZXRfZmFuX3N0YXR1cyhmYW4pOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IGk4a19nZXRfdGVtcF90eXBlKGludCBzZW5zb3IpCj4gK3sKPiAr CXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfVEVNUF9UWVBFLCB9 Owo+ICsKPiArCXJlZ3MuZWJ4ID0gc2Vuc29yICYgMHhmZjsKPiArCXJldHVybiBpOGtfc21tKCZy ZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBSZWFkIHRoZSBj cHUgdGVtcGVyYXR1cmUuCj4gKyAqLwo+ICtzdGF0aWMgaW50IF9pOGtfZ2V0X3RlbXAoaW50IHNl bnNvcikKPiArewo+ICsJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7Cj4gKwkJLmVheCA9IEk4S19T TU1fR0VUX1RFTVAsCj4gKwkJLmVieCA9IHNlbnNvciAmIDB4ZmYsCj4gKwl9Owo+ICsKPiArCXJl dHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgaW50IGk4a19nZXRfdGVtcChpbnQgc2Vuc29yKQo+ICt7Cj4gKwlpbnQgdGVtcCA9IF9pOGtf Z2V0X3RlbXAoc2Vuc29yKTsKPiArCj4gKwkvKgo+ICsJICogU29tZXRpbWVzIHRoZSB0ZW1wZXJh dHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCj4gKwkgKiBJ biB0aGlzIGNhc2Ugd2UgcmV0cnkgKG9uY2UpIGJlZm9yZSByZXR1cm5pbmcgYW4gZXJyb3IuCj4g KwkgIyAxMDAzNjU1MTM3IDAwMDAwMDU4IDAwMDA1YTRiCj4gKwkgIyAxMDAzNjU1MTM4IDAwMDAw MDk5IDAwMDAzYTgwIDwtLS0gMHg5OSA9IDE1MyBkZWdyZWVzCj4gKwkgIyAxMDAzNjU1MTM5IDAw MDAwMDU0IDAwMDA1YzUyCj4gKwkgKi8KPiArCWlmICh0ZW1wID09IDB4OTkpIHsKPiArCQltc2xl ZXAoMTAwKTsKPiArCQl0ZW1wID0gX2k4a19nZXRfdGVtcChzZW5zb3IpOwo+ICsJfQo+ICsJLyoK PiArCSAqIFJldHVybiAtRU5PREFUQSBmb3IgYWxsIGludmFsaWQgdGVtcGVyYXR1cmVzLgo+ICsJ ICoKPiArCSAqIEtub3duIGluc3RhbmNlcyBhcmUgdGhlIDB4OTkgdmFsdWUgYXMgc2VlbiBhYm92 ZSBhcyB3ZWxsIGFzCj4gKwkgKiAweGMxICgxOTMpLCB3aGljaCBtYXkgYmUgcmV0dXJuZWQgd2hl biB0cnlpbmcgdG8gcmVhZCB0aGUgR1BVCj4gKwkgKiB0ZW1wZXJhdHVyZSBpZiB0aGUgc3lzdGVt IHN1cHBvcnRzIGEgR1BVIGFuZCBpdCBpcyBjdXJyZW50bHkKPiArCSAqIHR1cm5lZCBvZmYuCj4g KwkgKi8KPiArCWlmICh0ZW1wID4gSThLX01BWF9URU1QKQo+ICsJCXJldHVybiAtRU5PREFUQTsK PiArCj4gKwlyZXR1cm4gdGVtcDsKPiArfQo+ICsKPiArc3RhdGljIGludCBpOGtfZ2V0X2RlbGxf c2lnbmF0dXJlKGludCByZXFfZm4pCj4gK3sKPiArCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAu ZWF4ID0gcmVxX2ZuLCB9Owo+ICsJaW50IHJjOwo+ICsKPiArCXJjID0gaThrX3NtbSgmcmVncyk7 Cj4gKwlpZiAocmMgPCAwKQo+ICsJCXJldHVybiByYzsKPiArCj4gKwlyZXR1cm4gcmVncy5lYXgg PT0gMTE0NTY1MTUyNyAmJiByZWdzLmVkeCA9PSAxMTQ1MzkyMjA0ID8gMCA6IC0xOwo+ICt9Cj4g Kwo+ICtzdGF0aWMgaW50Cj4gK2k4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVu c2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQo+ICt7Cj4gKwlpbnQgdmFsID0gMDsK PiArCWludCBzcGVlZDsKPiArCXVuc2lnbmVkIGNoYXIgYnVmZlsxNl07Cj4gKwlpbnQgX191c2Vy ICphcmdwID0gKGludCBfX3VzZXIgKilhcmc7Cj4gKwo+ICsJaWYgKCFhcmdwKQo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsKPiArCXN3aXRjaCAoY21kKSB7Cj4gKwljYXNlIEk4S19CSU9TX1ZFUlNJ T046Cj4gKwkJdmFsID0gKGJpb3NfdmVyc2lvblswXSA8PCAxNikgfAo+ICsJCQkJKGJpb3NfdmVy c2lvblsxXSA8PCA4KSB8IGJpb3NfdmVyc2lvblsyXTsKPiArCQlicmVhazsKPiArCj4gKwljYXNl IEk4S19NQUNISU5FX0lEOgo+ICsJCW1lbXNldChidWZmLCAwLCAxNik7Cj4gKwkJc3RybGNweShi dWZmLCBpOGtfZ2V0X2RtaV9kYXRhKERNSV9QUk9EVUNUX1NFUklBTCksCj4gKwkJCXNpemVvZihi dWZmKSk7Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBJOEtfRk5fU1RBVFVTOgo+ICsJCXZhbCA9 IGk4a19nZXRfZm5fc3RhdHVzKCk7Cj4gKwkJYnJlYWs7Cj4gKwo+ICsJY2FzZSBJOEtfUE9XRVJf U1RBVFVTOgo+ICsJCXZhbCA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7Cj4gKwkJYnJlYWs7Cj4g Kwo+ICsJY2FzZSBJOEtfR0VUX1RFTVA6Cj4gKwkJdmFsID0gaThrX2dldF90ZW1wKDApOwo+ICsJ CWJyZWFrOwo+ICsKPiArCWNhc2UgSThLX0dFVF9TUEVFRDoKPiArCQlpZiAoY29weV9mcm9tX3Vz ZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQo+ICsJCQlyZXR1cm4gLUVGQVVMVDsKPiArCj4g KwkJdmFsID0gaThrX2dldF9mYW5fc3BlZWQodmFsKTsKPiArCQlicmVhazsKPiArCj4gKwljYXNl IEk4S19HRVRfRkFOOgo+ICsJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2Yo aW50KSkpCj4gKwkJCXJldHVybiAtRUZBVUxUOwo+ICsKPiArCQl2YWwgPSBpOGtfZ2V0X2Zhbl9z dGF0dXModmFsKTsKPiArCQlicmVhazsKPiArCj4gKwljYXNlIEk4S19TRVRfRkFOOgo+ICsJCWlm IChyZXN0cmljdGVkICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQo+ICsJCQlyZXR1cm4gLUVQ RVJNOwo+ICsKPiArCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkp KQo+ICsJCQlyZXR1cm4gLUVGQVVMVDsKPiArCj4gKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcGVl ZCwgYXJncCArIDEsIHNpemVvZihpbnQpKSkKPiArCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gKwo+ICsJ CXZhbCA9IGk4a19zZXRfZmFuKHZhbCwgc3BlZWQpOwo+ICsJCWJyZWFrOwo+ICsKPiArCWRlZmF1 bHQ6Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaWYgKHZhbCA8IDApCj4gKwkJ cmV0dXJuIHZhbDsKPiArCj4gKwlzd2l0Y2ggKGNtZCkgewo+ICsJY2FzZSBJOEtfQklPU19WRVJT SU9OOgo+ICsJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgNCkpCj4gKwkJCXJldHVybiAt RUZBVUxUOwo+ICsKPiArCQlicmVhazsKPiArCWNhc2UgSThLX01BQ0hJTkVfSUQ6Cj4gKwkJaWYg KGNvcHlfdG9fdXNlcihhcmdwLCBidWZmLCAxNikpCj4gKwkJCXJldHVybiAtRUZBVUxUOwo+ICsK PiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFs LCBzaXplb2YoaW50KSkpCj4gKwkJCXJldHVybiAtRUZBVUxUOwo+ICsKPiArCQlicmVhazsKPiAr CX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0 cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCj4gK3sK PiArCWxvbmcgcmV0Owo+ICsKPiArCW11dGV4X2xvY2soJmk4a19tdXRleCk7Cj4gKwlyZXQgPSBp OGtfaW9jdGxfdW5sb2NrZWQoZnAsIGNtZCwgYXJnKTsKPiArCW11dGV4X3VubG9jaygmaThrX211 dGV4KTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBQcmludCB0aGUg aW5mb3JtYXRpb24gZm9yIC9wcm9jL2k4ay4KPiArICovCj4gK3N0YXRpYyBpbnQgaThrX3Byb2Nf c2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQo+ICt7Cj4gKwlpbnQgZm5f a2V5LCBjcHVfdGVtcCwgYWNfcG93ZXI7Cj4gKwlpbnQgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVm dF9zcGVlZCwgcmlnaHRfc3BlZWQ7Cj4gKwo+ICsJY3B1X3RlbXAJPSBpOGtfZ2V0X3RlbXAoMCk7 CQkJLyogMTExMDAgwrVzICovCj4gKwlsZWZ0X2Zhbgk9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtf RkFOX0xFRlQpOwkvKiAgIDU4MCDCtXMgKi8KPiArCXJpZ2h0X2Zhbgk9IGk4a19nZXRfZmFuX3N0 YXR1cyhJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgwrVzICovCj4gKwlsZWZ0X3NwZWVkCT0gaThr X2dldF9mYW5fc3BlZWQoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAgwrVzICovCj4gKwlyaWdodF9z cGVlZAk9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCDCtXMgKi8K PiArCWZuX2tleQkJPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwkJCS8qICAgNzUwIMK1cyAqLwo+ICsJ aWYgKHBvd2VyX3N0YXR1cykKPiArCQlhY19wb3dlciA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7 CQkvKiAxNDcwMCDCtXMgKi8KPiArCWVsc2UKPiArCQlhY19wb3dlciA9IC0xOwo+ICsKPiArCS8q Cj4gKwkgKiBJbmZvOgo+ICsJICoKPiArCSAqIDEpICBGb3JtYXQgdmVyc2lvbiAodGhpcyB3aWxs IGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKPiArCSAqIDIpICBCSU9TIHZlcnNpb24KPiArCSAq IDMpICBCSU9TIG1hY2hpbmUgSUQKPiArCSAqIDQpICBDcHUgdGVtcGVyYXR1cmUKPiArCSAqIDUp ICBMZWZ0IGZhbiBzdGF0dXMKPiArCSAqIDYpICBSaWdodCBmYW4gc3RhdHVzCj4gKwkgKiA3KSAg TGVmdCBmYW4gc3BlZWQKPiArCSAqIDgpICBSaWdodCBmYW4gc3BlZWQKPiArCSAqIDkpICBBQyBw b3dlcgo+ICsJICogMTApIEZuIEtleSBzdGF0dXMKPiArCSAqLwo+ICsJcmV0dXJuIHNlcV9wcmlu dGYoc2VxLCAiJXMgJXMgJXMgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCj4gKwkJCSAgSThLX1BS T0NfRk1ULAo+ICsJCQkgIGJpb3NfdmVyc2lvbiwKPiArCQkJICBpOGtfZ2V0X2RtaV9kYXRhKERN SV9QUk9EVUNUX1NFUklBTCksCj4gKwkJCSAgY3B1X3RlbXAsCj4gKwkJCSAgbGVmdF9mYW4sIHJp Z2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQsCj4gKwkJCSAgYWNfcG93ZXIsIGZuX2tl eSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgaThrX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9k ZSwgc3RydWN0IGZpbGUgKmZpbGUpCj4gK3sKPiArCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBp OGtfcHJvY19zaG93LCBOVUxMKTsKPiArfQo+ICsKPiArCj4gKy8qCj4gKyAqIEh3bW9uIGludGVy ZmFjZQo+ICsgKi8KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X3RlbXBfbGFi ZWwoc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAq ZGV2YXR0ciwKPiArCQkJCQkgY2hhciAqYnVmKQo+ICt7Cj4gKwlzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGxhYmVsc1tdID0gewo+ICsJCSJDUFUiLAo+ICsJCSJHUFUiLAo+ICsJCSJTT0RJTU0i LAo+ICsJCSJPdGhlciIsCj4gKwkJIkFtYmllbnQiLAo+ICsJCSJPdGhlciIsCj4gKwl9Owo+ICsJ aW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKPiArCWludCB0 eXBlOwo+ICsKPiArCXR5cGUgPSBpOGtfZ2V0X3RlbXBfdHlwZShpbmRleCk7Cj4gKwlpZiAodHlw ZSA8IDApCj4gKwkJcmV0dXJuIHR5cGU7Cj4gKwlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKGxhYmVs cykpCj4gKwkJdHlwZSA9IEFSUkFZX1NJWkUobGFiZWxzKSAtIDE7Cj4gKwlyZXR1cm4gc3ByaW50 ZihidWYsICIlc1xuIiwgbGFiZWxzW3R5cGVdKTsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3Qg aThrX2h3bW9uX3Nob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJCQkgICBzdHJ1Y3Qg ZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQkJCSAgIGNoYXIgKmJ1ZikKPiArewo+ICsJ aW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKPiArCWludCB0 ZW1wOwo+ICsKPiArCXRlbXAgPSBpOGtfZ2V0X3RlbXAoaW5kZXgpOwo+ICsJaWYgKHRlbXAgPCAw KQo+ICsJCXJldHVybiB0ZW1wOwo+ICsJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXAg KiAxMDAwKTsKPiArfQo+ICsKPiArc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfZmFuX2xh YmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAq ZGV2YXR0ciwKPiArCQkJCQljaGFyICpidWYpCj4gK3sKPiArCXN0YXRpYyBjb25zdCBjaGFyICog Y29uc3QgbGFiZWxzW10gPSB7Cj4gKwkJIlByb2Nlc3NvciBGYW4iLAo+ICsJCSJNb3RoZXJib2Fy ZCBGYW4iLAo+ICsJCSJWaWRlbyBGYW4iLAo+ICsJCSJQb3dlciBTdXBwbHkgRmFuIiwKPiArCQki Q2hpcHNldCBGYW4iLAo+ICsJCSJPdGhlciBGYW4iLAo+ICsJfTsKPiArCWludCBpbmRleCA9IHRv X3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Cj4gKwlib29sIGRvY2sgPSBmYWxzZTsK PiArCWludCB0eXBlOwo+ICsKPiArCXR5cGUgPSBpOGtfZ2V0X2Zhbl90eXBlKGluZGV4KTsKPiAr CWlmICh0eXBlIDwgMCkKPiArCQlyZXR1cm4gdHlwZTsKPiArCj4gKwlpZiAodHlwZSAmIDB4MTAp IHsKPiArCQlkb2NrID0gdHJ1ZTsKPiArCQl0eXBlICY9IDB4MEY7Cj4gKwl9Cj4gKwo+ICsJaWYg KHR5cGUgPj0gQVJSQVlfU0laRShsYWJlbHMpKQo+ICsJCXR5cGUgPSAoQVJSQVlfU0laRShsYWJl bHMpIC0gMSk7Cj4gKwo+ICsJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMlc1xuIiwgKGRvY2sgPyAi RG9ja2luZyAiIDogIiIpLCBsYWJlbHNbdHlwZV0pOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVf dCBpOGtfaHdtb25fc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAo+ICsJCQkJICBzdHJ1Y3Qg ZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQkJCSAgY2hhciAqYnVmKQo+ICt7Cj4gKwlp bnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4Owo+ICsJaW50IGZh bl9zcGVlZDsKPiArCj4gKwlmYW5fc3BlZWQgPSBpOGtfZ2V0X2Zhbl9zcGVlZChpbmRleCk7Cj4g KwlpZiAoZmFuX3NwZWVkIDwgMCkKPiArCQlyZXR1cm4gZmFuX3NwZWVkOwo+ICsJcmV0dXJuIHNw cmludGYoYnVmLCAiJWRcbiIsIGZhbl9zcGVlZCk7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90 IGk4a19od21vbl9zaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJCQkgIHN0cnVjdCBk ZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCQkJICBjaGFyICpidWYpCj4gK3sKPiArCWlu dCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Cj4gKwlpbnQgc3Rh dHVzOwo+ICsKPiArCXN0YXR1cyA9IGk4a19nZXRfZmFuX3N0YXR1cyhpbmRleCk7Cj4gKwlpZiAo c3RhdHVzIDwgMCkKPiArCQlyZXR1cm4gLUVJTzsKPiArCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVk XG4iLCBjbGFtcF92YWwoc3RhdHVzICogaThrX3B3bV9tdWx0LCAwLCAyNTUpKTsKPiArfQo+ICsK PiArc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3NldF9wd20oc3RydWN0IGRldmljZSAqZGV2LAo+ ICsJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAo+ICsJCQkJIGNvbnN0IGNoYXIg KmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICt7Cj4gKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0 dHIoYXR0ciktPmluZGV4Owo+ICsJdW5zaWduZWQgbG9uZyB2YWw7Cj4gKwlpbnQgZXJyOwo+ICsK PiArCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwo+ICsJaWYgKGVycikKPiArCQlyZXR1 cm4gZXJyOwo+ICsJdmFsID0gY2xhbXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHZhbCwgaThrX3B3 bV9tdWx0KSwgMCwgaThrX2Zhbl9tYXgpOwo+ICsKPiArCW11dGV4X2xvY2soJmk4a19tdXRleCk7 Cj4gKwllcnIgPSBpOGtfc2V0X2ZhbihpbmRleCwgdmFsKTsKPiArCW11dGV4X3VubG9jaygmaThr X211dGV4KTsKPiArCj4gKwlyZXR1cm4gZXJyIDwgMCA/IC1FSU8gOiBjb3VudDsKPiArfQo+ICsK PiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgaThrX2h3 bW9uX3Nob3dfdGVtcCwgTlVMTCwgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVt cDFfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCj4gKwkJ CSAgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08s IGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDEpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9B VFRSKHRlbXAyX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xhYmVsLCBOVUxM LAo+ICsJCQkgIDEpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBT X0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAyKTsKPiArc3RhdGljIFNFTlNPUl9E RVZJQ0VfQVRUUih0ZW1wM19sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJl bCwgTlVMTCwKPiArCQkJICAyKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9p bnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMyk7Cj4gK3N0YXRpYyBT RU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3Rl bXBfbGFiZWwsIE5VTEwsCj4gKwkJCSAgMyk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo ZmFuMV9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuLCBOVUxMLCAwKTsKPiArc3Rh dGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hv d19mYW5fbGFiZWwsIE5VTEwsCj4gKwkJCSAgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FU VFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsIGk4a19od21vbl9zaG93X3B3bSwKPiArCQkJICBp OGtfaHdtb25fc2V0X3B3bSwgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9p bnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuLCBOVUxMLAo+ICsJCQkgIDEpOwo+ICtz dGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9z aG93X2Zhbl9sYWJlbCwgTlVMTCwKPiArCQkJICAxKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0Vf QVRUUihwd20yLCBTX0lSVUdPIHwgU19JV1VTUiwgaThrX2h3bW9uX3Nob3dfcHdtLAo+ICsJCQkg IGk4a19od21vbl9zZXRfcHdtLCAxKTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpp OGtfYXR0cnNbXSA9IHsKPiArCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIu YXR0ciwJLyogMCAqLwo+ICsJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9sYWJlbC5kZXZfYXR0ci5h dHRyLAkvKiAxICovCj4gKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0 dHIsCS8qIDIgKi8KPiArCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbGFiZWwuZGV2X2F0dHIuYXR0 ciwJLyogMyAqLwo+ICsJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRy LAkvKiA0ICovCj4gKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2xhYmVsLmRldl9hdHRyLmF0dHIs CS8qIDUgKi8KPiArCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwJ LyogNiAqLwo+ICsJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAkv KiA3ICovCj4gKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyog OCAqLwo+ICsJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDkg Ki8KPiArCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAkJLyogMTAgKi8KPiAr CSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAxMSAqLwo+ICsJ JnNlbnNvcl9kZXZfYXR0cl9mYW4yX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDEyICovCj4gKwkm c2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwJCS8qIDEzICovCj4gKwlOVUxMCj4g K307Cj4gKwo+ICtzdGF0aWMgdW1vZGVfdCBpOGtfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAq a29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKPiArCQkJICAgICAgaW50IGluZGV4KQo+ICt7 Cj4gKwlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8PSAxICYmCj4gKwkgICAgIShpOGtfaHdtb25f ZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9URU1QMSkpCj4gKwkJcmV0dXJuIDA7Cj4gKwlpZiAoaW5k ZXggPj0gMiAmJiBpbmRleCA8PSAzICYmCj4gKwkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtf SFdNT05fSEFWRV9URU1QMikpCj4gKwkJcmV0dXJuIDA7Cj4gKwlpZiAoaW5kZXggPj0gNCAmJiBp bmRleCA8PSA1ICYmCj4gKwkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9U RU1QMykpCj4gKwkJcmV0dXJuIDA7Cj4gKwlpZiAoaW5kZXggPj0gNiAmJiBpbmRleCA8PSA3ICYm Cj4gKwkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9URU1QNCkpCj4gKwkJ cmV0dXJuIDA7Cj4gKwlpZiAoaW5kZXggPj0gOCAmJiBpbmRleCA8PSAxMCAmJgo+ICsJICAgICEo aThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hBVkVfRkFOMSkpCj4gKwkJcmV0dXJuIDA7Cj4g KwlpZiAoaW5kZXggPj0gMTEgJiYgaW5kZXggPD0gMTMgJiYKPiArCSAgICAhKGk4a19od21vbl9m bGFncyAmIEk4S19IV01PTl9IQVZFX0ZBTjIpKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCXJldHVy biBhdHRyLT5tb2RlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9n cm91cCBpOGtfZ3JvdXAgPSB7Cj4gKwkuYXR0cnMgPSBpOGtfYXR0cnMsCj4gKwkuaXNfdmlzaWJs ZSA9IGk4a19pc192aXNpYmxlLAo+ICt9Owo+ICtfX0FUVFJJQlVURV9HUk9VUFMoaThrKTsKPiAr Cj4gK3N0YXRpYyBpbnQgX19pbml0IGk4a19pbml0X2h3bW9uKHZvaWQpCj4gK3sKPiArCWludCBl cnI7Cj4gKwo+ICsJaThrX2h3bW9uX2ZsYWdzID0gMDsKPiArCj4gKwkvKiBDUFUgdGVtcGVyYXR1 cmUgYXR0cmlidXRlcywgaWYgdGVtcGVyYXR1cmUgdHlwZSBpcyBPSyAqLwo+ICsJZXJyID0gaThr X2dldF90ZW1wX3R5cGUoMCk7Cj4gKwlpZiAoZXJyID49IDApCj4gKwkJaThrX2h3bW9uX2ZsYWdz IHw9IEk4S19IV01PTl9IQVZFX1RFTVAxOwo+ICsJLyogY2hlY2sgZm9yIGFkZGl0aW9uYWwgdGVt cGVyYXR1cmUgc2Vuc29ycyAqLwo+ICsJZXJyID0gaThrX2dldF90ZW1wX3R5cGUoMSk7Cj4gKwlp ZiAoZXJyID49IDApCj4gKwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVAy Owo+ICsJZXJyID0gaThrX2dldF90ZW1wX3R5cGUoMik7Cj4gKwlpZiAoZXJyID49IDApCj4gKwkJ aThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVAzOwo+ICsJZXJyID0gaThrX2dl dF90ZW1wX3R5cGUoMyk7Cj4gKwlpZiAoZXJyID49IDApCj4gKwkJaThrX2h3bW9uX2ZsYWdzIHw9 IEk4S19IV01PTl9IQVZFX1RFTVA0Owo+ICsKPiArCS8qIEZpcnN0IGZhbiBhdHRyaWJ1dGVzLCBp ZiBmYW4gdHlwZSBpcyBPSyAqLwo+ICsJZXJyID0gaThrX2dldF9mYW5fdHlwZSgwKTsKPiArCWlm IChlcnIgPj0gMCkKPiArCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfRkFOMTsK PiArCj4gKwkvKiBTZWNvbmQgZmFuIGF0dHJpYnV0ZXMsIGlmIGZhbiB0eXBlIGlzIE9LICovCj4g KwllcnIgPSBpOGtfZ2V0X2Zhbl90eXBlKDEpOwo+ICsJaWYgKGVyciA+PSAwKQo+ICsJCWk4a19o d21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9GQU4yOwo+ICsKPiArCWk4a19od21vbl9kZXYg PSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImk4ayIsIE5VTEwsCj4g KwkJCQkJCQkgIGk4a19ncm91cHMpOwo+ICsJaWYgKElTX0VSUihpOGtfaHdtb25fZGV2KSkgewo+ ICsJCWVyciA9IFBUUl9FUlIoaThrX2h3bW9uX2Rldik7Cj4gKwkJaThrX2h3bW9uX2RldiA9IE5V TEw7Cj4gKwkJcHJfZXJyKCJod21vbiByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsIGVycik7 Cj4gKwkJcmV0dXJuIGVycjsKPiArCX0KPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdHJ1Y3Qg aThrX2NvbmZpZ19kYXRhIHsKPiArCXVpbnQgZmFuX211bHQ7Cj4gKwl1aW50IGZhbl9tYXg7Cj4g K307Cj4gKwo+ICtlbnVtIGk4a19jb25maWdzIHsKPiArCURFTExfTEFUSVRVREVfRDUyMCwKPiAr CURFTExfUFJFQ0lTSU9OXzQ5MCwKPiArCURFTExfU1RVRElPLAo+ICsJREVMTF9YUFMsCj4gK307 Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGk4a19jb25maWdfZGF0YSBpOGtfY29uZmlnX2Rh dGFbXSA9IHsKPiArCVtERUxMX0xBVElUVURFX0Q1MjBdID0gewo+ICsJCS5mYW5fbXVsdCA9IDEs Cj4gKwkJLmZhbl9tYXggPSBJOEtfRkFOX1RVUkJPLAo+ICsJfSwKPiArCVtERUxMX1BSRUNJU0lP Tl80OTBdID0gewo+ICsJCS5mYW5fbXVsdCA9IDEsCj4gKwkJLmZhbl9tYXggPSBJOEtfRkFOX1RV UkJPLAo+ICsJfSwKPiArCVtERUxMX1NUVURJT10gPSB7Cj4gKwkJLmZhbl9tdWx0ID0gMSwKPiAr CQkuZmFuX21heCA9IEk4S19GQU5fSElHSCwKPiArCX0sCj4gKwlbREVMTF9YUFNdID0gewo+ICsJ CS5mYW5fbXVsdCA9IDEsCj4gKwkJLmZhbl9tYXggPSBJOEtfRkFOX0hJR0gsCj4gKwl9LAo+ICt9 Owo+ICsKPiArc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGk4a19kbWlfdGFibGVbXSBfX2lu aXRkYXRhID0gewo+ICsJewo+ICsJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIiwKPiArCQkubWF0 Y2hlcyA9IHsKPiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciIp LAo+ICsJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIiksCj4gKwkJfSwK PiArCX0sCj4gKwl7Cj4gKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUiLAo+ICsJCS5tYXRjaGVz ID0gewo+ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIENvbXB1dGVyIiksCj4g KwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKPiArCQl9LAo+ICsJ fSwKPiArCXsKPiArCQkuaWRlbnQgPSAiRGVsbCBJbnNwaXJvbiAyIiwKPiArCQkubWF0Y2hlcyA9 IHsKPiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCj4gKwkJCURN SV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24iKSwKPiArCQl9LAo+ICsJfSwKPiAr CXsKPiArCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSBENTIwIiwKPiArCQkubWF0Y2hlcyA9IHsK PiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCj4gKwkJCURNSV9N QVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUgRDUyMCIpLAo+ICsJCX0sCj4gKwkJLmRy aXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfTEFUSVRVREVfRDUyMF0s Cj4gKwl9LAo+ICsJewo+ICsJCS5pZGVudCA9ICJEZWxsIExhdGl0dWRlIDIiLAo+ICsJCS5tYXRj aGVzID0gewo+ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiAr CQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSIpLAo+ICsJCX0sCj4gKwl9 LAo+ICsJewkvKiBVSyBJbnNwaXJvbiA2NDAwICAqLwo+ICsJCS5pZGVudCA9ICJEZWxsIEluc3Bp cm9uIDMiLAo+ICsJCS5tYXRjaGVzID0gewo+ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1Is ICJEZWxsIEluYy4iKSwKPiArCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNTTA2MSIp LAo+ICsJCX0sCj4gKwl9LAo+ICsJewo+ICsJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMiLAo+ ICsJCS5tYXRjaGVzID0gewo+ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIElu Yy4iKSwKPiArCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNUDA2MSIpLAo+ICsJCX0s Cj4gKwl9LAo+ICsJewo+ICsJCS5pZGVudCA9ICJEZWxsIFByZWNpc2lvbiA0OTAiLAo+ICsJCS5t YXRjaGVzID0gewo+ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwK PiArCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsCj4gKwkJCQkgICJQcmVjaXNpb24gV29y a1N0YXRpb24gNDkwIiksCj4gKwkJfSwKPiArCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtf Y29uZmlnX2RhdGFbREVMTF9QUkVDSVNJT05fNDkwXSwKPiArCX0sCj4gKwl7Cj4gKwkJLmlkZW50 ID0gIkRlbGwgUHJlY2lzaW9uIiwKPiArCQkubWF0Y2hlcyA9IHsKPiArCQkJRE1JX01BVENIKERN SV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCj4gKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9O QU1FLCAiUHJlY2lzaW9uIiksCj4gKwkJfSwKPiArCX0sCj4gKwl7Cj4gKwkJLmlkZW50ID0gIkRl bGwgVm9zdHJvIiwKPiArCQkubWF0Y2hlcyA9IHsKPiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVO RE9SLCAiRGVsbCBJbmMuIiksCj4gKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVm9z dHJvIiksCj4gKwkJfSwKPiArCX0sCj4gKwl7Cj4gKwkJLmlkZW50ID0gIkRlbGwgWFBTNDIxIiwK PiArCQkubWF0Y2hlcyA9IHsKPiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJ bmMuIiksCj4gKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTIEw0MjFYIiksCj4g KwkJfSwKPiArCX0sCj4gKwl7Cj4gKwkJLmlkZW50ID0gIkRlbGwgU3R1ZGlvIiwKPiArCQkubWF0 Y2hlcyA9IHsKPiArCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCj4g KwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU3R1ZGlvIiksCj4gKwkJfSwKPiArCQku ZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9TVFVESU9dLAo+ICsJ fSwKPiArCXsKPiArCQkuaWRlbnQgPSAiRGVsbCBYUFMgMTMiLAo+ICsJCS5tYXRjaGVzID0gewo+ ICsJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiArCQkJRE1JX01B VENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMxMyIpLAo+ICsJCX0sCj4gKwkJLmRyaXZlcl9kYXRh ID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfWFBTXSwKPiArCX0sCj4gKwl7Cj4gKwkJ LmlkZW50ID0gIkRlbGwgWFBTIE0xNDAiLAo+ICsJCS5tYXRjaGVzID0gewo+ICsJCQlETUlfTUFU Q0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKPiArCQkJRE1JX01BVENIKERNSV9QUk9E VUNUX05BTUUsICJNWEMwNTEiKSwKPiArCQl9LAo+ICsJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICop Jmk4a19jb25maWdfZGF0YVtERUxMX1hQU10sCj4gKwl9LAo+ICsJeyB9Cj4gK307Cj4gKwo+ICtN T0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgaThrX2RtaV90YWJsZSk7Cj4gKwo+ICsvKgo+ICsgKiBQ cm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc3VwcG9ydGVkIGxhcHRvcC4KPiArICovCj4gK3N0 YXRpYyBpbnQgX19pbml0IGk4a19wcm9iZSh2b2lkKQo+ICt7Cj4gKwljb25zdCBzdHJ1Y3QgZG1p X3N5c3RlbV9pZCAqaWQ7Cj4gKwlpbnQgZmFuLCByZXQ7Cj4gKwo+ICsJLyoKPiArCSAqIEdldCBE TUkgaW5mb3JtYXRpb24KPiArCSAqLwo+ICsJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGk4a19kbWlf dGFibGUpKSB7Cj4gKwkJaWYgKCFpZ25vcmVfZG1pICYmICFmb3JjZSkKPiArCQkJcmV0dXJuIC1F Tk9ERVY7Cj4gKwo+ICsJCXByX2luZm8oIm5vdCBydW5uaW5nIG9uIGEgc3VwcG9ydGVkIERlbGwg c3lzdGVtLlxuIik7Cj4gKwkJcHJfaW5mbygidmVuZG9yPSVzLCBtb2RlbD0lcywgdmVyc2lvbj0l c1xuIiwKPiArCQkJaThrX2dldF9kbWlfZGF0YShETUlfU1lTX1ZFTkRPUiksCj4gKwkJCWk4a19n ZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfTkFNRSksCj4gKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1J X0JJT1NfVkVSU0lPTikpOwo+ICsJfQo+ICsKPiArCXN0cmxjcHkoYmlvc192ZXJzaW9uLCBpOGtf Z2V0X2RtaV9kYXRhKERNSV9CSU9TX1ZFUlNJT04pLAo+ICsJCXNpemVvZihiaW9zX3ZlcnNpb24p KTsKPiArCj4gKwkvKgo+ICsJICogR2V0IFNNTSBEZWxsIHNpZ25hdHVyZQo+ICsJICovCj4gKwlp ZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZShJOEtfU01NX0dFVF9ERUxMX1NJRzEpICYmCj4gKwkg ICAgaThrX2dldF9kZWxsX3NpZ25hdHVyZShJOEtfU01NX0dFVF9ERUxMX1NJRzIpKSB7Cj4gKwkJ cHJfZXJyKCJ1bmFibGUgdG8gZ2V0IFNNTSBEZWxsIHNpZ25hdHVyZVxuIik7Cj4gKwkJaWYgKCFm b3JjZSkKPiArCQkJcmV0dXJuIC1FTk9ERVY7Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAqIFNldCBm YW4gbXVsdGlwbGllciBhbmQgbWF4aW1hbCBmYW4gc3BlZWQgZnJvbSBkbWkgY29uZmlnCj4gKwkg KiBWYWx1ZXMgc3BlY2lmaWVkIGluIG1vZHVsZSBwYXJhbWV0ZXJzIG92ZXJyaWRlIHZhbHVlcyBm cm9tIGRtaQo+ICsJICovCj4gKwlpZCA9IGRtaV9maXJzdF9tYXRjaChpOGtfZG1pX3RhYmxlKTsK PiArCWlmIChpZCAmJiBpZC0+ZHJpdmVyX2RhdGEpIHsKPiArCQljb25zdCBzdHJ1Y3QgaThrX2Nv bmZpZ19kYXRhICpjb25mID0gaWQtPmRyaXZlcl9kYXRhOwo+ICsJCWlmICghZmFuX211bHQgJiYg Y29uZi0+ZmFuX211bHQpCj4gKwkJCWZhbl9tdWx0ID0gY29uZi0+ZmFuX211bHQ7Cj4gKwkJaWYg KCFmYW5fbWF4ICYmIGNvbmYtPmZhbl9tYXgpCj4gKwkJCWZhbl9tYXggPSBjb25mLT5mYW5fbWF4 Owo+ICsJfQo+ICsKPiArCWk4a19mYW5fbWF4ID0gZmFuX21heCA/IDogSThLX0ZBTl9ISUdIOwkv KiBNdXN0IG5vdCBiZSAwICovCj4gKwlpOGtfcHdtX211bHQgPSBESVZfUk9VTkRfVVAoMjU1LCBp OGtfZmFuX21heCk7Cj4gKwo+ICsJaWYgKCFmYW5fbXVsdCkgewo+ICsJCS8qCj4gKwkJICogQXV0 b2RldGVjdCBmYW4gbXVsdGlwbGllciBiYXNlZCBvbiBub21pbmFsIHJwbQo+ICsJCSAqIElmIGZh biByZXBvcnRzIHJwbSB2YWx1ZSB0b28gaGlnaCB0aGVuIHNldCBtdWx0aXBsaWVyIHRvIDEKPiAr CQkgKi8KPiArCQlmb3IgKGZhbiA9IDA7IGZhbiA8IDI7ICsrZmFuKSB7Cj4gKwkJCXJldCA9IGk4 a19nZXRfZmFuX25vbWluYWxfc3BlZWQoZmFuLCBpOGtfZmFuX21heCk7Cj4gKwkJCWlmIChyZXQg PCAwKQo+ICsJCQkJY29udGludWU7Cj4gKwkJCWlmIChyZXQgPiBJOEtfRkFOX01BWF9SUE0pCj4g KwkJCQlpOGtfZmFuX211bHQgPSAxOwo+ICsJCQlicmVhazsKPiArCQl9Cj4gKwl9IGVsc2Ugewo+ ICsJCS8qIEZhbiBtdWx0aXBsaWVyIHdhcyBzcGVjaWZpZWQgaW4gbW9kdWxlIHBhcmFtIG9yIGlu IGRtaSAqLwo+ICsJCWk4a19mYW5fbXVsdCA9IGZhbl9tdWx0Owo+ICsJfQo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCBpOGtfaW5pdCh2b2lkKQo+ICt7Cj4g KwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaThrOwo+ICsJaW50IGVycjsKPiArCj4gKwkv KiBBcmUgd2UgcnVubmluZyBvbiBhbiBzdXBwb3J0ZWQgbGFwdG9wPyAqLwo+ICsJaWYgKGk4a19w cm9iZSgpKQo+ICsJCXJldHVybiAtRU5PREVWOwo+ICsKPiArCS8qIFJlZ2lzdGVyIHRoZSBwcm9j IGVudHJ5ICovCj4gKwlwcm9jX2k4ayA9IHByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThr X2ZvcHMpOwo+ICsJaWYgKCFwcm9jX2k4aykKPiArCQlyZXR1cm4gLUVOT0VOVDsKPiArCj4gKwll cnIgPSBpOGtfaW5pdF9od21vbigpOwo+ICsJaWYgKGVycikKPiArCQlnb3RvIGV4aXRfcmVtb3Zl X3Byb2M7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICsgZXhpdF9yZW1vdmVfcHJvYzoKPiArCXJl bW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIF9fZXhpdCBpOGtfZXhpdCh2b2lkKQo+ICt7Cj4gKwlod21vbl9kZXZpY2Vf dW5yZWdpc3RlcihpOGtfaHdtb25fZGV2KTsKPiArCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBO VUxMKTsKPiArfQo+ICsKPiArbW9kdWxlX2luaXQoaThrX2luaXQpOwo+ICttb2R1bGVfZXhpdChp OGtfZXhpdCk7Cj4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0 dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-28 10:24 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k interface which is needed only for old Dell Inspirion models or for userspace i8kutils package. For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- arch/x86/Kconfig | 25 +++++++++---------------- drivers/hwmon/Kconfig | 11 +++++++++++ drivers/hwmon/Makefile | 2 +- drivers/hwmon/dell-smm-hwmon.c | 20 ++++++++++++++++---- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index b7d31ca..8d0266b 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1063,24 +1063,17 @@ config TOSHIBA Say N otherwise. config I8K - tristate "Dell laptop support" - select HWMON + bool "Dell i8k legacy laptop support" + select SENSORS_DELL_SMM ---help--- - This adds a driver to safely access the System Management Mode - of the CPU on the Dell Inspiron 8000. The System Management Mode - is used to read cpu temperature and cooling fan status and to - control the fans on the I8K portables. + This options enables legacy /proc/i8k userspace interface in + dell-smm-hwmon driver. Character file /proc/i8k reports power and + hotkey status on old Dell laptops (like Dell Inspiron 8000) via + System Management Mode provided by Dell BIOS. This /proc/i8k interface + is also used by userspace package i8kutils to control laptop fans. - This driver has been tested only on the Inspiron 8000 but it may - also work with other Dell laptops. You can force loading on other - models by passing the parameter `force=1' to the module. Use at - your own risk. - - For information on utilities to make use of this driver see the - I8K Linux utilities web site at: - <http://people.debian.org/~dz/i8k/> - - Say Y if you intend to run this kernel on a Dell Inspiron 8000. + Say Y if you intend to run this kernel on old Dell laptops or want to + use userspace package i8kutils. Say N otherwise. config X86_REBOOTFIXUPS diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 110fade..86eeb7d 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 This driver provides support for the Ultra45 workstation environmental sensors. +config SENSORS_DELL_SMM + tristate "Dell laptop SMM BIOS hwmon driver" + depends ON X86 + ---help--- + This hwmon driver adds support for reporting temperature of different + sensors and controls the fans on Dell laptops via System Management + Mode provided by Dell BIOS. + + When option I8K is also enabled this driver provides legacy /proc/i8k + userspace interface for i8kutils package. + if ACPI comment "ACPI drivers" diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 1c3e458..9eec614 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -155,7 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o -obj-$(CONFIG_I8K) += dell-smm-hwmon.o +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index 2b04e4f..e9661dc 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("i8k"); @@ -93,6 +93,7 @@ static bool ignore_dmi; module_param(ignore_dmi, bool, 0); MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); +#ifdef CONFIG_I8K static bool restricted; module_param(restricted, bool, 0); MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); static bool power_status; module_param(power_status, bool, 0600); MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); +#endif static uint fan_mult; module_param(fan_mult, uint, 0); @@ -109,6 +111,7 @@ static uint fan_max; module_param(fan_max, uint, 0); MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); +#ifdef CONFIG_I8K static int i8k_open_fs(struct inode *inode, struct file *file); static long i8k_ioctl(struct file *, unsigned int, unsigned long); @@ -120,6 +123,7 @@ static const struct file_operations i8k_fops = { .release = single_release, .unlocked_ioctl = i8k_ioctl, }; +#endif struct smm_regs { unsigned int eax; @@ -220,6 +224,7 @@ out: return rc; } +#ifdef CONFIG_I8K /* * Read the Fn key status. */ @@ -258,6 +263,7 @@ static int i8k_get_power_status(void) return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; } +#endif /* * Read the fan status. @@ -378,6 +384,7 @@ static int i8k_get_dell_signature(int req_fn) return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; } +#ifdef CONFIG_I8K static int i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) { @@ -525,6 +532,7 @@ static int i8k_open_fs(struct inode *inode, struct file *file) { return single_open(file, i8k_proc_show, NULL); } +#endif /* @@ -974,17 +982,17 @@ static int __init i8k_probe(void) static int __init i8k_init(void) { - struct proc_dir_entry *proc_i8k; int err; /* Are we running on an supported laptop? */ if (i8k_probe()) return -ENODEV; +#ifdef CONFIG_I8K /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) + if (!proc_create("i8k", 0, NULL, &i8k_fops)) return -ENOENT; +#endif err = i8k_init_hwmon(); if (err) @@ -993,14 +1001,18 @@ static int __init i8k_init(void) return 0; exit_remove_proc: +#ifdef CONFIG_I8K remove_proc_entry("i8k", NULL); +#endif return err; } static void __exit i8k_exit(void) { hwmon_device_unregister(i8k_hwmon_dev); +#ifdef CONFIG_I8K remove_proc_entry("i8k", NULL); +#endif } module_init(i8k_init); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 10:24 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 10:24 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzcGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RF TExfU01NIGFuZCBDT05GSUdfSThLLgpPcHRpb24gU0VOU09SU19ERUxMX1NNTSBpcyBub3cgdXNl ZCB0byBlbmFibGUgY29tcGlsYXRpb24gb2YgZGVsbC1zbW0taHdtb24KZHJpdmVyIGFuZCBvbGQg Q09ORklHX0k4SyBvcHRpb24gdG8gZW5hYmxlIC9wcm9jL2k4ayBpbnRlcmZhY2UgaW4gZHJpdmVy LgoKU28gdGhpcyBjaGFuZ2UgYWxsb3dzIHRvIGNvbXBpbGUgZGVsbC1zbW0taHdtb24gZHJpdmVy IHdpdGhvdXQgbGVnYWN5IC9wcm9jL2k4awppbnRlcmZhY2Ugd2hpY2ggaXMgbmVlZGVkIG9ubHkg Zm9yIG9sZCBEZWxsIEluc3BpcmlvbiBtb2RlbHMgb3IgZm9yIHVzZXJzcGFjZQppOGt1dGlscyBw YWNrYWdlLgoKRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiBDT05GSUdfSThLIGlzIGVu YWJsZWQgdGhlbiBhbHNvIFNFTlNPUlNfREVMTF9TTU0KaXMgZW5hYmxlZCBhbmQgc28gZHJpdmVy IGRlbGwtc21tLWh3bW9uICh3aXRoIC9wcm9jL2k4aykgaXMgY29tcGlsZWQuCgpTaWduZWQtb2Zm LWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Ci0tLQogYXJjaC94ODYvS2Nv bmZpZyAgICAgICAgICAgICAgIHwgICAyNSArKysrKysrKystLS0tLS0tLS0tLS0tLS0tCiBkcml2 ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgfCAgIDExICsrKysrKysrKysrCiBkcml2ZXJzL2h3 bW9uL01ha2VmaWxlICAgICAgICAgfCAgICAyICstCiBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3 bW9uLmMgfCAgIDIwICsrKysrKysrKysrKysrKystLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDM3IGlu c2VydGlvbnMoKyksIDIxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25m aWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGI3ZDMxY2EuLjhkMDI2NmIgMTAwNjQ0Ci0tLSBh L2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMTA2MywyNCArMTA2 MywxNyBAQCBjb25maWcgVE9TSElCQQogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgSThL Ci0JdHJpc3RhdGUgIkRlbGwgbGFwdG9wIHN1cHBvcnQiCi0Jc2VsZWN0IEhXTU9OCisJYm9vbCAi RGVsbCBpOGsgbGVnYWN5IGxhcHRvcCBzdXBwb3J0IgorCXNlbGVjdCBTRU5TT1JTX0RFTExfU01N CiAJLS0taGVscC0tLQotCSAgVGhpcyBhZGRzIGEgZHJpdmVyIHRvIHNhZmVseSBhY2Nlc3MgdGhl IFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKLQkgIG9mIHRoZSBDUFUgb24gdGhlIERlbGwgSW5zcGly b24gODAwMC4gVGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUKLQkgIGlzIHVzZWQgdG8gcmVhZCBj cHUgdGVtcGVyYXR1cmUgYW5kIGNvb2xpbmcgZmFuIHN0YXR1cyBhbmQgdG8KLQkgIGNvbnRyb2wg dGhlIGZhbnMgb24gdGhlIEk4SyBwb3J0YWJsZXMuCisJICBUaGlzIG9wdGlvbnMgZW5hYmxlcyBs ZWdhY3kgL3Byb2MvaThrIHVzZXJzcGFjZSBpbnRlcmZhY2UgaW4KKwkgIGRlbGwtc21tLWh3bW9u IGRyaXZlci4gQ2hhcmFjdGVyIGZpbGUgL3Byb2MvaThrIHJlcG9ydHMgcG93ZXIgYW5kCisJICBo b3RrZXkgc3RhdHVzIG9uIG9sZCBEZWxsIGxhcHRvcHMgKGxpa2UgRGVsbCBJbnNwaXJvbiA4MDAw KSB2aWEKKwkgIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBCSU9TLiBU aGlzIC9wcm9jL2k4ayBpbnRlcmZhY2UKKwkgIGlzIGFsc28gdXNlZCBieSB1c2Vyc3BhY2UgcGFj a2FnZSBpOGt1dGlscyB0byBjb250cm9sIGxhcHRvcCBmYW5zLgogCi0JICBUaGlzIGRyaXZlciBo YXMgYmVlbiB0ZXN0ZWQgb25seSBvbiB0aGUgSW5zcGlyb24gODAwMCBidXQgaXQgbWF5Ci0JICBh bHNvIHdvcmsgd2l0aCBvdGhlciBEZWxsIGxhcHRvcHMuIFlvdSBjYW4gZm9yY2UgbG9hZGluZyBv biBvdGhlcgotCSAgbW9kZWxzIGJ5IHBhc3NpbmcgdGhlIHBhcmFtZXRlciBgZm9yY2U9MScgdG8g dGhlIG1vZHVsZS4gVXNlIGF0Ci0JICB5b3VyIG93biByaXNrLgotCi0JICBGb3IgaW5mb3JtYXRp b24gb24gdXRpbGl0aWVzIHRvIG1ha2UgdXNlIG9mIHRoaXMgZHJpdmVyIHNlZSB0aGUKLQkgIEk4 SyBMaW51eCB1dGlsaXRpZXMgd2ViIHNpdGUgYXQ6Ci0JICA8aHR0cDovL3Blb3BsZS5kZWJpYW4u b3JnL35kei9pOGsvPgotCi0JICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5l bCBvbiBhIERlbGwgSW5zcGlyb24gODAwMC4KKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVu IHRoaXMga2VybmVsIG9uIG9sZCBEZWxsIGxhcHRvcHMgb3Igd2FudCB0bworCSAgdXNlIHVzZXJz cGFjZSBwYWNrYWdlIGk4a3V0aWxzLgogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgWDg2 X1JFQk9PVEZJWFVQUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVy cy9od21vbi9LY29uZmlnCmluZGV4IDExMGZhZGUuLjg2ZWViN2QgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTE3MDMsNiAr MTcwMywxNyBAQCBjb25maWcgU0VOU09SU19VTFRSQTQ1CiAJICBUaGlzIGRyaXZlciBwcm92aWRl cyBzdXBwb3J0IGZvciB0aGUgVWx0cmE0NSB3b3Jrc3RhdGlvbiBlbnZpcm9ubWVudGFsCiAJICBz ZW5zb3JzLgogCitjb25maWcgU0VOU09SU19ERUxMX1NNTQorCXRyaXN0YXRlICJEZWxsIGxhcHRv cCBTTU0gQklPUyBod21vbiBkcml2ZXIiCisJZGVwZW5kcyBPTiBYODYKKwktLS1oZWxwLS0tCisJ ICBUaGlzIGh3bW9uIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJlcG9ydGluZyB0ZW1wZXJhdHVy ZSBvZiBkaWZmZXJlbnQKKwkgIHNlbnNvcnMgYW5kIGNvbnRyb2xzIHRoZSBmYW5zIG9uIERlbGwg bGFwdG9wcyB2aWEgU3lzdGVtIE1hbmFnZW1lbnQKKwkgIE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBC SU9TLgorCisJICBXaGVuIG9wdGlvbiBJOEsgaXMgYWxzbyBlbmFibGVkIHRoaXMgZHJpdmVyIHBy b3ZpZGVzIGxlZ2FjeSAvcHJvYy9pOGsKKwkgIHVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIGk4a3V0 aWxzIHBhY2thZ2UuCisKIGlmIEFDUEkKIAogY29tbWVudCAiQUNQSSBkcml2ZXJzIgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5k ZXggMWMzZTQ1OC4uOWVlYzYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQor KysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0xNTUsNyArMTU1LDcgQEAgb2JqLSQoQ09O RklHX1NFTlNPUlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubwogb2JqLSQoQ09ORklHX1NFTlNP UlNfVzgzTDc4Nk5HKQkrPSB3ODNsNzg2bmcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzFY KQkrPSB3bTgzMXgtaHdtb24ubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzUwKQkrPSB3bTgz NTAtaHdtb24ubwotb2JqLSQoQ09ORklHX0k4SykJCSs9IGRlbGwtc21tLWh3bW9uLm8KK29iai0k KENPTkZJR19TRU5TT1JTX0RFTExfU01NKQkrPSBkZWxsLXNtbS1od21vbi5vCiAKIG9iai0kKENP TkZJR19QTUJVUykJCSs9IHBtYnVzLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2RlbGwt c21tLWh3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKaW5kZXggMmIwNGU0 Zi4uZTk2NjFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCisr KyBiL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwpAQCAtODEsNyArODEsNyBAQCBzdGF0 aWMgdWludCBpOGtfZmFuX21heCA9IEk4S19GQU5fSElHSDsKIAogTU9EVUxFX0FVVEhPUigiTWFz c2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7CiBNT0RVTEVfQVVUSE9SKCJQYWxpIFJv aMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZl ciBmb3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcyIpOworTU9EVUxFX0RFU0NS SVBUSU9OKCJEZWxsIGxhcHRvcCBTTU0gQklPUyBod21vbiBkcml2ZXIiKTsKIE1PRFVMRV9MSUNF TlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygiaThrIik7CiAKQEAgLTkzLDYgKzkzLDcgQEAgc3Rh dGljIGJvb2wgaWdub3JlX2RtaTsKIG1vZHVsZV9wYXJhbShpZ25vcmVfZG1pLCBib29sLCAwKTsK IE1PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2RtaSwgIkNvbnRpbnVlIHByb2JpbmcgaGFyZHdhcmUg ZXZlbiBpZiBETUkgZGF0YSBkb2VzIG5vdCBtYXRjaCIpOwogCisjaWZkZWYgQ09ORklHX0k4Swog c3RhdGljIGJvb2wgcmVzdHJpY3RlZDsKIG1vZHVsZV9wYXJhbShyZXN0cmljdGVkLCBib29sLCAw KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVzdHJpY3RlZCwgIkFsbG93IGZhbiBjb250cm9sIGlmIFNZ U19BRE1JTiBjYXBhYmlsaXR5IHNldCIpOwpAQCAtMTAwLDYgKzEwMSw3IEBAIE1PRFVMRV9QQVJN X0RFU0MocmVzdHJpY3RlZCwgIkFsbG93IGZhbiBjb250cm9sIGlmIFNZU19BRE1JTiBjYXBhYmls aXR5IHNldCIpOwogc3RhdGljIGJvb2wgcG93ZXJfc3RhdHVzOwogbW9kdWxlX3BhcmFtKHBvd2Vy X3N0YXR1cywgYm9vbCwgMDYwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3N0YXR1cywgIlJl cG9ydCBwb3dlciBzdGF0dXMgaW4gL3Byb2MvaThrIik7CisjZW5kaWYKIAogc3RhdGljIHVpbnQg ZmFuX211bHQ7CiBtb2R1bGVfcGFyYW0oZmFuX211bHQsIHVpbnQsIDApOwpAQCAtMTA5LDYgKzEx MSw3IEBAIHN0YXRpYyB1aW50IGZhbl9tYXg7CiBtb2R1bGVfcGFyYW0oZmFuX21heCwgdWludCwg MCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZhbl9tYXgsICJNYXhpbXVtIGNvbmZpZ3VyYWJsZSBmYW4g c3BlZWQgKGRlZmF1bHQ6IGF1dG9kZXRlY3QpIik7CiAKKyNpZmRlZiBDT05GSUdfSThLCiBzdGF0 aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxl KTsKIHN0YXRpYyBsb25nIGk4a19pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVu c2lnbmVkIGxvbmcpOwogCkBAIC0xMjAsNiArMTIzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBm aWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwK IAkudW5sb2NrZWRfaW9jdGwJPSBpOGtfaW9jdGwsCiB9OworI2VuZGlmCiAKIHN0cnVjdCBzbW1f cmVncyB7CiAJdW5zaWduZWQgaW50IGVheDsKQEAgLTIyMCw2ICsyMjQsNyBAQCBvdXQ6CiAJcmV0 dXJuIHJjOwogfQogCisjaWZkZWYgQ09ORklHX0k4SwogLyoKICAqIFJlYWQgdGhlIEZuIGtleSBz dGF0dXMuCiAgKi8KQEAgLTI1OCw2ICsyNjMsNyBAQCBzdGF0aWMgaW50IGk4a19nZXRfcG93ZXJf c3RhdHVzKHZvaWQpCiAKIAlyZXR1cm4gKHJlZ3MuZWF4ICYgMHhmZikgPT0gSThLX1BPV0VSX0FD ID8gSThLX0FDIDogSThLX0JBVFRFUlk7CiB9CisjZW5kaWYKIAogLyoKICAqIFJlYWQgdGhlIGZh biBzdGF0dXMuCkBAIC0zNzgsNiArMzg0LDcgQEAgc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2ln bmF0dXJlKGludCByZXFfZm4pCiAJcmV0dXJuIHJlZ3MuZWF4ID09IDExNDU2NTE1MjcgJiYgcmVn cy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKIH0KIAorI2lmZGVmIENPTkZJR19JOEsKIHN0 YXRpYyBpbnQKIGk4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGlu dCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTI1LDYgKzUzMiw3IEBAIHN0YXRpYyBp bnQgaThrX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7 CiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGk4a19wcm9jX3Nob3csIE5VTEwpOwogfQorI2Vu ZGlmCiAKIAogLyoKQEAgLTk3NCwxNyArOTgyLDE3IEBAIHN0YXRpYyBpbnQgX19pbml0IGk4a19w cm9iZSh2b2lkKQogCiBzdGF0aWMgaW50IF9faW5pdCBpOGtfaW5pdCh2b2lkKQogewotCXN0cnVj dCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pOGs7CiAJaW50IGVycjsKIAogCS8qIEFyZSB3ZSBydW5u aW5nIG9uIGFuIHN1cHBvcnRlZCBsYXB0b3A/ICovCiAJaWYgKGk4a19wcm9iZSgpKQogCQlyZXR1 cm4gLUVOT0RFVjsKIAorI2lmZGVmIENPTkZJR19JOEsKIAkvKiBSZWdpc3RlciB0aGUgcHJvYyBl bnRyeSAqLwotCXByb2NfaThrID0gcHJvY19jcmVhdGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9w cyk7Ci0JaWYgKCFwcm9jX2k4aykKKwlpZiAoIXByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAm aThrX2ZvcHMpKQogCQlyZXR1cm4gLUVOT0VOVDsKKyNlbmRpZgogCiAJZXJyID0gaThrX2luaXRf aHdtb24oKTsKIAlpZiAoZXJyKQpAQCAtOTkzLDE0ICsxMDAxLDE4IEBAIHN0YXRpYyBpbnQgX19p bml0IGk4a19pbml0KHZvaWQpCiAJcmV0dXJuIDA7CiAKICBleGl0X3JlbW92ZV9wcm9jOgorI2lm ZGVmIENPTkZJR19JOEsKIAlyZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7CisjZW5kaWYK IAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaThrX2V4aXQodm9pZCkKIHsK IAlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihpOGtfaHdtb25fZGV2KTsKKyNpZmRlZiBDT05GSUdf SThLCiAJcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOworI2VuZGlmCiB9CiAKIG1vZHVs ZV9pbml0KGk4a19pbml0KTsKLS0gCjEuNy45LjUKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3Jz QGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-28 11:04 ` Paul Bolle -1 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 11:04 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > This driver provides support for the Ultra45 workstation environmental > sensors. > > +config SENSORS_DELL_SMM > + tristate "Dell laptop SMM BIOS hwmon driver" > + depends ON X86 How did this past your testing? > + ---help--- > + This hwmon driver adds support for reporting temperature of different > + sensors and controls the fans on Dell laptops via System Management > + Mode provided by Dell BIOS. > + > + When option I8K is also enabled this driver provides legacy /proc/i8k > + userspace interface for i8kutils package. > + Paul Bolle ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 11:04 ` Paul Bolle 0 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 11:04 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gU2F0LCAyMDE1LTAzLTI4IGF0IDExOjI0ICswMTAwLCBQYWxpIFJvaMOhciB3cm90ZToKPiAt LS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKPiArKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcK PiBAQCAtMTcwMyw2ICsxNzAzLDE3IEBAIGNvbmZpZyBTRU5TT1JTX1VMVFJBNDUKPiAgCSAgVGhp cyBkcml2ZXIgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIFVsdHJhNDUgd29ya3N0YXRpb24gZW52 aXJvbm1lbnRhbAo+ICAJICBzZW5zb3JzLgo+ICAKPiArY29uZmlnIFNFTlNPUlNfREVMTF9TTU0K PiArCXRyaXN0YXRlICJEZWxsIGxhcHRvcCBTTU0gQklPUyBod21vbiBkcml2ZXIiCj4gKwlkZXBl bmRzIE9OIFg4NgoKSG93IGRpZCB0aGlzIHBhc3QgeW91ciB0ZXN0aW5nPwoKPiArCS0tLWhlbHAt LS0KPiArCSAgVGhpcyBod21vbiBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciByZXBvcnRpbmcgdGVt cGVyYXR1cmUgb2YgZGlmZmVyZW50Cj4gKwkgIHNlbnNvcnMgYW5kIGNvbnRyb2xzIHRoZSBmYW5z IG9uIERlbGwgbGFwdG9wcyB2aWEgU3lzdGVtIE1hbmFnZW1lbnQKPiArCSAgTW9kZSBwcm92aWRl ZCBieSBEZWxsIEJJT1MuCj4gKwo+ICsJICBXaGVuIG9wdGlvbiBJOEsgaXMgYWxzbyBlbmFibGVk IHRoaXMgZHJpdmVyIHByb3ZpZGVzIGxlZ2FjeSAvcHJvYy9pOGsKPiArCSAgdXNlcnNwYWNlIGlu dGVyZmFjZSBmb3IgaThrdXRpbHMgcGFja2FnZS4KPiArIAoKClBhdWwgQm9sbGUKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxp bmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3Jz Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 11:04 ` [lm-sensors] " Paul Bolle @ 2015-03-28 12:54 ` Steven Honeyman -1 siblings, 0 replies; 86+ messages in thread From: Steven Honeyman @ 2015-03-28 12:54 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 28 March 2015 at 11:04, Paul Bolle <pebolle@tiscali.nl> wrote: > On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: >> --- a/drivers/hwmon/Kconfig >> +++ b/drivers/hwmon/Kconfig >> @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 >> This driver provides support for the Ultra45 workstation environmental >> sensors. >> >> +config SENSORS_DELL_SMM >> + tristate "Dell laptop SMM BIOS hwmon driver" >> + depends ON X86 > > How did this past your testing? > >> + ---help--- >> + This hwmon driver adds support for reporting temperature of different >> + sensors and controls the fans on Dell laptops via System Management >> + Mode provided by Dell BIOS. >> + >> + When option I8K is also enabled this driver provides legacy /proc/i8k >> + userspace interface for i8kutils package. >> + It's working OK for me (after fixing the mistake pointed out above). [Latitude e6540] ----- coretemp-isa-0000 Adapter: ISA adapter Physical id 0: +53.0°C (high = +84.0°C, crit = +100.0°C) Core 0: +51.0°C (high = +84.0°C, crit = +100.0°C) Core 1: +53.0°C (high = +84.0°C, crit = +100.0°C) i8k-virtual-0 Adapter: Virtual device Processor Fan: 3171 RPM CPU: +52.0°C Ambient: +46.0°C SODIMM: +40.0°C ----- Ambient and SODIMM look swapped - but it's probably just another Dell error. I really need to look at getting coreboot on this thing. On 28 March 2015 at 10:24, Pali Rohár <pali.rohar@gmail.com> wrote: ... > config I8K > - tristate "Dell laptop support" > - select HWMON > + bool "Dell i8k legacy laptop support" > + select SENSORS_DELL_SMM ... > +config SENSORS_DELL_SMM > + tristate "Dell laptop SMM BIOS hwmon driver" The only change I'd suggest is not to change the tristate to bool for I8K. Forcing that to bool means that SENSORS_DELL_SMM can't be compiled as a module if the user wishes to keep i8k hanging around "just in case". It'll probably annoy distro kernel packagers too. Thanks, Steven ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 12:54 ` Steven Honeyman 0 siblings, 0 replies; 86+ messages in thread From: Steven Honeyman @ 2015-03-28 12:54 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMjggTWFyY2ggMjAxNSBhdCAxMTowNCwgUGF1bCBCb2xsZSA8cGVib2xsZUB0aXNjYWxpLm5s PiB3cm90ZToKPiBPbiBTYXQsIDIwMTUtMDMtMjggYXQgMTE6MjQgKzAxMDAsIFBhbGkgUm9ow6Fy IHdyb3RlOgo+PiAtLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKPj4gKysrIGIvZHJpdmVycy9o d21vbi9LY29uZmlnCj4+IEBAIC0xNzAzLDYgKzE3MDMsMTcgQEAgY29uZmlnIFNFTlNPUlNfVUxU UkE0NQo+PiAgICAgICAgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBVbHRy YTQ1IHdvcmtzdGF0aW9uIGVudmlyb25tZW50YWwKPj4gICAgICAgICBzZW5zb3JzLgo+Pgo+PiAr Y29uZmlnIFNFTlNPUlNfREVMTF9TTU0KPj4gKyAgICAgdHJpc3RhdGUgIkRlbGwgbGFwdG9wIFNN TSBCSU9TIGh3bW9uIGRyaXZlciIKPj4gKyAgICAgZGVwZW5kcyBPTiBYODYKPgo+IEhvdyBkaWQg dGhpcyBwYXN0IHlvdXIgdGVzdGluZz8KPgo+PiArICAgICAtLS1oZWxwLS0tCj4+ICsgICAgICAg VGhpcyBod21vbiBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciByZXBvcnRpbmcgdGVtcGVyYXR1cmUg b2YgZGlmZmVyZW50Cj4+ICsgICAgICAgc2Vuc29ycyBhbmQgY29udHJvbHMgdGhlIGZhbnMgb24g RGVsbCBsYXB0b3BzIHZpYSBTeXN0ZW0gTWFuYWdlbWVudAo+PiArICAgICAgIE1vZGUgcHJvdmlk ZWQgYnkgRGVsbCBCSU9TLgo+PiArCj4+ICsgICAgICAgV2hlbiBvcHRpb24gSThLIGlzIGFsc28g ZW5hYmxlZCB0aGlzIGRyaXZlciBwcm92aWRlcyBsZWdhY3kgL3Byb2MvaThrCj4+ICsgICAgICAg dXNlcnNwYWNlIGludGVyZmFjZSBmb3IgaThrdXRpbHMgcGFja2FnZS4KPj4gKwoKSXQncyB3b3Jr aW5nIE9LIGZvciBtZSAoYWZ0ZXIgZml4aW5nIHRoZSBtaXN0YWtlIHBvaW50ZWQgb3V0IGFib3Zl KS4KCltMYXRpdHVkZSBlNjU0MF0KLS0tLS0KY29yZXRlbXAtaXNhLTAwMDAKQWRhcHRlcjogSVNB IGFkYXB0ZXIKUGh5c2ljYWwgaWQgMDogICs1My4wwrBDICAoaGlnaCA9ICs4NC4wwrBDLCBjcml0 ID0gKzEwMC4wwrBDKQpDb3JlIDA6ICAgICAgICAgKzUxLjDCsEMgIChoaWdoID0gKzg0LjDCsEMs IGNyaXQgPSArMTAwLjDCsEMpCkNvcmUgMTogICAgICAgICArNTMuMMKwQyAgKGhpZ2ggPSArODQu MMKwQywgY3JpdCA9ICsxMDAuMMKwQykKCmk4ay12aXJ0dWFsLTAKQWRhcHRlcjogVmlydHVhbCBk ZXZpY2UKUHJvY2Vzc29yIEZhbjogMzE3MSBSUE0KQ1BVOiAgICAgICAgICAgICs1Mi4wwrBDCkFt YmllbnQ6ICAgICAgICArNDYuMMKwQwpTT0RJTU06ICAgICAgICAgKzQwLjDCsEMKLS0tLS0KCkFt YmllbnQgYW5kIFNPRElNTSBsb29rIHN3YXBwZWQgLSBidXQgaXQncyBwcm9iYWJseSBqdXN0IGFu b3RoZXIgRGVsbAplcnJvci4gSSByZWFsbHkgbmVlZCB0byBsb29rIGF0IGdldHRpbmcgY29yZWJv b3Qgb24gdGhpcyB0aGluZy4KCk9uIDI4IE1hcmNoIDIwMTUgYXQgMTA6MjQsIFBhbGkgUm9ow6Fy IDxwYWxpLnJvaGFyQGdtYWlsLmNvbT4gd3JvdGU6Ci4uLgo+ICBjb25maWcgSThLCj4gLSAgICAg ICB0cmlzdGF0ZSAiRGVsbCBsYXB0b3Agc3VwcG9ydCIKPiAtICAgICAgIHNlbGVjdCBIV01PTgo+ ICsgICAgICAgYm9vbCAiRGVsbCBpOGsgbGVnYWN5IGxhcHRvcCBzdXBwb3J0Igo+ICsgICAgICAg c2VsZWN0IFNFTlNPUlNfREVMTF9TTU0KLi4uCj4gK2NvbmZpZyBTRU5TT1JTX0RFTExfU01NCj4g KyAgICAgICB0cmlzdGF0ZSAiRGVsbCBsYXB0b3AgU01NIEJJT1MgaHdtb24gZHJpdmVyIgoKVGhl IG9ubHkgY2hhbmdlIEknZCBzdWdnZXN0IGlzIG5vdCB0byBjaGFuZ2UgdGhlIHRyaXN0YXRlIHRv IGJvb2wgZm9yCkk4Sy4gRm9yY2luZyB0aGF0IHRvIGJvb2wgbWVhbnMgdGhhdCBTRU5TT1JTX0RF TExfU01NIGNhbid0IGJlCmNvbXBpbGVkIGFzIGEgbW9kdWxlIGlmIHRoZSB1c2VyIHdpc2hlcyB0 byBrZWVwIGk4ayBoYW5naW5nIGFyb3VuZAoianVzdCBpbiBjYXNlIi4gSXQnbGwgcHJvYmFibHkg YW5ub3kgZGlzdHJvIGtlcm5lbCBwYWNrYWdlcnMgdG9vLgoKClRoYW5rcywKU3RldmVuCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1h aWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5z b3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 12:54 ` [lm-sensors] " Steven Honeyman @ 2015-03-28 14:13 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:13 UTC (permalink / raw) To: Steven Honeyman, Paul Bolle Cc: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 05:54 AM, Steven Honeyman wrote: > On 28 March 2015 at 11:04, Paul Bolle <pebolle@tiscali.nl> wrote: >> On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: >>> --- a/drivers/hwmon/Kconfig >>> +++ b/drivers/hwmon/Kconfig >>> @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 >>> This driver provides support for the Ultra45 workstation environmental >>> sensors. >>> >>> +config SENSORS_DELL_SMM >>> + tristate "Dell laptop SMM BIOS hwmon driver" >>> + depends ON X86 >> >> How did this past your testing? >> >>> + ---help--- >>> + This hwmon driver adds support for reporting temperature of different >>> + sensors and controls the fans on Dell laptops via System Management >>> + Mode provided by Dell BIOS. >>> + >>> + When option I8K is also enabled this driver provides legacy /proc/i8k >>> + userspace interface for i8kutils package. >>> + > > It's working OK for me (after fixing the mistake pointed out above). > > [Latitude e6540] > ----- > coretemp-isa-0000 > Adapter: ISA adapter > Physical id 0: +53.0°C (high = +84.0°C, crit = +100.0°C) > Core 0: +51.0°C (high = +84.0°C, crit = +100.0°C) > Core 1: +53.0°C (high = +84.0°C, crit = +100.0°C) > > i8k-virtual-0 > Adapter: Virtual device > Processor Fan: 3171 RPM > CPU: +52.0°C > Ambient: +46.0°C > SODIMM: +40.0°C > ----- > > Ambient and SODIMM look swapped - but it's probably just another Dell > error. I really need to look at getting coreboot on this thing. > > On 28 March 2015 at 10:24, Pali Rohár <pali.rohar@gmail.com> wrote: > ... >> config I8K >> - tristate "Dell laptop support" >> - select HWMON >> + bool "Dell i8k legacy laptop support" >> + select SENSORS_DELL_SMM > ... >> +config SENSORS_DELL_SMM >> + tristate "Dell laptop SMM BIOS hwmon driver" > > The only change I'd suggest is not to change the tristate to bool for > I8K. Forcing that to bool means that SENSORS_DELL_SMM can't be > compiled as a module if the user wishes to keep i8k hanging around > "just in case". It'll probably annoy distro kernel packagers too. > Agreed. It also still needs to select HWMON (SENSORS_DELL_SMM is only visible if HWMON is selected). Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 14:13 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:13 UTC (permalink / raw) To: Steven Honeyman, Paul Bolle Cc: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDMvMjgvMjAxNSAwNTo1NCBBTSwgU3RldmVuIEhvbmV5bWFuIHdyb3RlOgo+IE9uIDI4IE1h cmNoIDIwMTUgYXQgMTE6MDQsIFBhdWwgQm9sbGUgPHBlYm9sbGVAdGlzY2FsaS5ubD4gd3JvdGU6 Cj4+IE9uIFNhdCwgMjAxNS0wMy0yOCBhdCAxMToyNCArMDEwMCwgUGFsaSBSb2jDoXIgd3JvdGU6 Cj4+PiAtLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKPj4+ICsrKyBiL2RyaXZlcnMvaHdtb24v S2NvbmZpZwo+Pj4gQEAgLTE3MDMsNiArMTcwMywxNyBAQCBjb25maWcgU0VOU09SU19VTFRSQTQ1 Cj4+PiAgICAgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgVWx0cmE0 NSB3b3Jrc3RhdGlvbiBlbnZpcm9ubWVudGFsCj4+PiAgICAgICAgICBzZW5zb3JzLgo+Pj4KPj4+ ICtjb25maWcgU0VOU09SU19ERUxMX1NNTQo+Pj4gKyAgICAgdHJpc3RhdGUgIkRlbGwgbGFwdG9w IFNNTSBCSU9TIGh3bW9uIGRyaXZlciIKPj4+ICsgICAgIGRlcGVuZHMgT04gWDg2Cj4+Cj4+IEhv dyBkaWQgdGhpcyBwYXN0IHlvdXIgdGVzdGluZz8KPj4KPj4+ICsgICAgIC0tLWhlbHAtLS0KPj4+ ICsgICAgICAgVGhpcyBod21vbiBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciByZXBvcnRpbmcgdGVt cGVyYXR1cmUgb2YgZGlmZmVyZW50Cj4+PiArICAgICAgIHNlbnNvcnMgYW5kIGNvbnRyb2xzIHRo ZSBmYW5zIG9uIERlbGwgbGFwdG9wcyB2aWEgU3lzdGVtIE1hbmFnZW1lbnQKPj4+ICsgICAgICAg TW9kZSBwcm92aWRlZCBieSBEZWxsIEJJT1MuCj4+PiArCj4+PiArICAgICAgIFdoZW4gb3B0aW9u IEk4SyBpcyBhbHNvIGVuYWJsZWQgdGhpcyBkcml2ZXIgcHJvdmlkZXMgbGVnYWN5IC9wcm9jL2k4 awo+Pj4gKyAgICAgICB1c2Vyc3BhY2UgaW50ZXJmYWNlIGZvciBpOGt1dGlscyBwYWNrYWdlLgo+ Pj4gKwo+Cj4gSXQncyB3b3JraW5nIE9LIGZvciBtZSAoYWZ0ZXIgZml4aW5nIHRoZSBtaXN0YWtl IHBvaW50ZWQgb3V0IGFib3ZlKS4KPgo+IFtMYXRpdHVkZSBlNjU0MF0KPiAtLS0tLQo+IGNvcmV0 ZW1wLWlzYS0wMDAwCj4gQWRhcHRlcjogSVNBIGFkYXB0ZXIKPiBQaHlzaWNhbCBpZCAwOiAgKzUz LjDCsEMgIChoaWdoID0gKzg0LjDCsEMsIGNyaXQgPSArMTAwLjDCsEMpCj4gQ29yZSAwOiAgICAg ICAgICs1MS4wwrBDICAoaGlnaCA9ICs4NC4wwrBDLCBjcml0ID0gKzEwMC4wwrBDKQo+IENvcmUg MTogICAgICAgICArNTMuMMKwQyAgKGhpZ2ggPSArODQuMMKwQywgY3JpdCA9ICsxMDAuMMKwQykK Pgo+IGk4ay12aXJ0dWFsLTAKPiBBZGFwdGVyOiBWaXJ0dWFsIGRldmljZQo+IFByb2Nlc3NvciBG YW46IDMxNzEgUlBNCj4gQ1BVOiAgICAgICAgICAgICs1Mi4wwrBDCj4gQW1iaWVudDogICAgICAg ICs0Ni4wwrBDCj4gU09ESU1NOiAgICAgICAgICs0MC4wwrBDCj4gLS0tLS0KPgo+IEFtYmllbnQg YW5kIFNPRElNTSBsb29rIHN3YXBwZWQgLSBidXQgaXQncyBwcm9iYWJseSBqdXN0IGFub3RoZXIg RGVsbAo+IGVycm9yLiBJIHJlYWxseSBuZWVkIHRvIGxvb2sgYXQgZ2V0dGluZyBjb3JlYm9vdCBv biB0aGlzIHRoaW5nLgo+Cj4gT24gMjggTWFyY2ggMjAxNSBhdCAxMDoyNCwgUGFsaSBSb2jDoXIg PHBhbGkucm9oYXJAZ21haWwuY29tPiB3cm90ZToKPiAuLi4KPj4gICBjb25maWcgSThLCj4+IC0g ICAgICAgdHJpc3RhdGUgIkRlbGwgbGFwdG9wIHN1cHBvcnQiCj4+IC0gICAgICAgc2VsZWN0IEhX TU9OCj4+ICsgICAgICAgYm9vbCAiRGVsbCBpOGsgbGVnYWN5IGxhcHRvcCBzdXBwb3J0Igo+PiAr ICAgICAgIHNlbGVjdCBTRU5TT1JTX0RFTExfU01NCj4gLi4uCj4+ICtjb25maWcgU0VOU09SU19E RUxMX1NNTQo+PiArICAgICAgIHRyaXN0YXRlICJEZWxsIGxhcHRvcCBTTU0gQklPUyBod21vbiBk cml2ZXIiCj4KPiBUaGUgb25seSBjaGFuZ2UgSSdkIHN1Z2dlc3QgaXMgbm90IHRvIGNoYW5nZSB0 aGUgdHJpc3RhdGUgdG8gYm9vbCBmb3IKPiBJOEsuIEZvcmNpbmcgdGhhdCB0byBib29sIG1lYW5z IHRoYXQgU0VOU09SU19ERUxMX1NNTSBjYW4ndCBiZQo+IGNvbXBpbGVkIGFzIGEgbW9kdWxlIGlm IHRoZSB1c2VyIHdpc2hlcyB0byBrZWVwIGk4ayBoYW5naW5nIGFyb3VuZAo+ICJqdXN0IGluIGNh c2UiLiBJdCdsbCBwcm9iYWJseSBhbm5veSBkaXN0cm8ga2VybmVsIHBhY2thZ2VycyB0b28uCj4K CkFncmVlZC4gSXQgYWxzbyBzdGlsbCBuZWVkcyB0byBzZWxlY3QgSFdNT04gKFNFTlNPUlNfREVM TF9TTU0gaXMKb25seSB2aXNpYmxlIGlmIEhXTU9OIGlzIHNlbGVjdGVkKS4KCkd1ZW50ZXIKCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3Jz IG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1z ZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 12:54 ` [lm-sensors] " Steven Honeyman @ 2015-03-28 22:00 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:00 UTC (permalink / raw) To: Steven Honeyman Cc: Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 3028 bytes --] On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: > On 28 March 2015 at 11:04, Paul Bolle <pebolle@tiscali.nl> wrote: > > On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: > >> --- a/drivers/hwmon/Kconfig > >> +++ b/drivers/hwmon/Kconfig > >> @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > >> > >> This driver provides support for the Ultra45 > >> workstation environmental sensors. > >> > >> +config SENSORS_DELL_SMM > >> + tristate "Dell laptop SMM BIOS hwmon driver" > >> + depends ON X86 > > > > How did this past your testing? > > > >> + ---help--- > >> + This hwmon driver adds support for reporting > >> temperature of different + sensors and controls the > >> fans on Dell laptops via System Management + Mode > >> provided by Dell BIOS. > >> + > >> + When option I8K is also enabled this driver > >> provides legacy /proc/i8k + userspace interface for > >> i8kutils package. > >> + > > It's working OK for me (after fixing the mistake pointed out > above). > > [Latitude e6540] > ----- > coretemp-isa-0000 > Adapter: ISA adapter > Physical id 0: +53.0°C (high = +84.0°C, crit = +100.0°C) > Core 0: +51.0°C (high = +84.0°C, crit = +100.0°C) > Core 1: +53.0°C (high = +84.0°C, crit = +100.0°C) > > i8k-virtual-0 > Adapter: Virtual device > Processor Fan: 3171 RPM > CPU: +52.0°C > Ambient: +46.0°C > SODIMM: +40.0°C > ----- > > Ambient and SODIMM look swapped - but it's probably just > another Dell error. I really need to look at getting coreboot > on this thing. > Both patches do not change any code. So there should not be any type swapped with or without my patch. Cpu type is requested via SMM in same way as it is doing old DOS executable. So there can be maybe problem in DELL SMM handler too or maybe just I did not understand correctly assembler dump of DOS executable... > On 28 March 2015 at 10:24, Pali Rohár <pali.rohar@gmail.com> > wrote: ... > > > config I8K > > > > - tristate "Dell laptop support" > > - select HWMON > > + bool "Dell i8k legacy laptop support" > > + select SENSORS_DELL_SMM > > ... > > > +config SENSORS_DELL_SMM > > + tristate "Dell laptop SMM BIOS hwmon driver" > > The only change I'd suggest is not to change the tristate to > bool for I8K. Forcing that to bool means that > SENSORS_DELL_SMM can't be compiled as a module if the user > wishes to keep i8k hanging around "just in case". It'll > probably annoy distro kernel packagers too. > > > Thanks, > Steven My idea was: SENSORS_DELL_SMM enable/disable compilation of kernel driver (ether statically link into kernel image or as external module) CONFIG_I8K just enable /proc/i8k code in SENSORS_DELL_SMM -- no additional driver, just boolean switch which has effect only iff SENSORS_DELL_SMM is Y or M -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:00 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:00 UTC (permalink / raw) To: Steven Honeyman Cc: Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 3028 bytes --] On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: > On 28 March 2015 at 11:04, Paul Bolle <pebolle@tiscali.nl> wrote: > > On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: > >> --- a/drivers/hwmon/Kconfig > >> +++ b/drivers/hwmon/Kconfig > >> @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > >> > >> This driver provides support for the Ultra45 > >> workstation environmental sensors. > >> > >> +config SENSORS_DELL_SMM > >> + tristate "Dell laptop SMM BIOS hwmon driver" > >> + depends ON X86 > > > > How did this past your testing? > > > >> + ---help--- > >> + This hwmon driver adds support for reporting > >> temperature of different + sensors and controls the > >> fans on Dell laptops via System Management + Mode > >> provided by Dell BIOS. > >> + > >> + When option I8K is also enabled this driver > >> provides legacy /proc/i8k + userspace interface for > >> i8kutils package. > >> + > > It's working OK for me (after fixing the mistake pointed out > above). > > [Latitude e6540] > ----- > coretemp-isa-0000 > Adapter: ISA adapter > Physical id 0: +53.0°C (high = +84.0°C, crit = +100.0°C) > Core 0: +51.0°C (high = +84.0°C, crit = +100.0°C) > Core 1: +53.0°C (high = +84.0°C, crit = +100.0°C) > > i8k-virtual-0 > Adapter: Virtual device > Processor Fan: 3171 RPM > CPU: +52.0°C > Ambient: +46.0°C > SODIMM: +40.0°C > ----- > > Ambient and SODIMM look swapped - but it's probably just > another Dell error. I really need to look at getting coreboot > on this thing. > Both patches do not change any code. So there should not be any type swapped with or without my patch. Cpu type is requested via SMM in same way as it is doing old DOS executable. So there can be maybe problem in DELL SMM handler too or maybe just I did not understand correctly assembler dump of DOS executable... > On 28 March 2015 at 10:24, Pali Rohár <pali.rohar@gmail.com> > wrote: ... > > > config I8K > > > > - tristate "Dell laptop support" > > - select HWMON > > + bool "Dell i8k legacy laptop support" > > + select SENSORS_DELL_SMM > > ... > > > +config SENSORS_DELL_SMM > > + tristate "Dell laptop SMM BIOS hwmon driver" > > The only change I'd suggest is not to change the tristate to > bool for I8K. Forcing that to bool means that > SENSORS_DELL_SMM can't be compiled as a module if the user > wishes to keep i8k hanging around "just in case". It'll > probably annoy distro kernel packagers too. > > > Thanks, > Steven My idea was: SENSORS_DELL_SMM enable/disable compilation of kernel driver (ether statically link into kernel image or as external module) CONFIG_I8K just enable /proc/i8k code in SENSORS_DELL_SMM -- no additional driver, just boolean switch which has effect only iff SENSORS_DELL_SMM is Y or M -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:00 ` [lm-sensors] " Pali Rohár @ 2015-03-28 22:20 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 22:20 UTC (permalink / raw) To: Pali Rohár, Steven Honeyman Cc: Paul Bolle, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 03:00 PM, Pali Rohár wrote: > On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: >> On 28 March 2015 at 11:04, Paul Bolle <pebolle@tiscali.nl> > wrote: >>> On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: >>>> --- a/drivers/hwmon/Kconfig >>>> +++ b/drivers/hwmon/Kconfig >>>> @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 >>>> >>>> This driver provides support for the Ultra45 >>>> workstation environmental sensors. >>>> >>>> +config SENSORS_DELL_SMM >>>> + tristate "Dell laptop SMM BIOS hwmon driver" >>>> + depends ON X86 >>> >>> How did this past your testing? >>> >>>> + ---help--- >>>> + This hwmon driver adds support for reporting >>>> temperature of different + sensors and controls the >>>> fans on Dell laptops via System Management + Mode >>>> provided by Dell BIOS. >>>> + >>>> + When option I8K is also enabled this driver >>>> provides legacy /proc/i8k + userspace interface for >>>> i8kutils package. >>>> + >> >> It's working OK for me (after fixing the mistake pointed out >> above). >> >> [Latitude e6540] >> ----- >> coretemp-isa-0000 >> Adapter: ISA adapter >> Physical id 0: +53.0°C (high = +84.0°C, crit = +100.0°C) >> Core 0: +51.0°C (high = +84.0°C, crit = +100.0°C) >> Core 1: +53.0°C (high = +84.0°C, crit = +100.0°C) >> >> i8k-virtual-0 >> Adapter: Virtual device >> Processor Fan: 3171 RPM >> CPU: +52.0°C >> Ambient: +46.0°C >> SODIMM: +40.0°C >> ----- >> >> Ambient and SODIMM look swapped - but it's probably just >> another Dell error. I really need to look at getting coreboot >> on this thing. >> > > Both patches do not change any code. So there should not be any > type swapped with or without my patch. > > Cpu type is requested via SMM in same way as it is doing old DOS > executable. So there can be maybe problem in DELL SMM handler too > or maybe just I did not understand correctly assembler dump of > DOS executable... > >> On 28 March 2015 at 10:24, Pali Rohár <pali.rohar@gmail.com> >> wrote: ... >> >>> config I8K >>> >>> - tristate "Dell laptop support" >>> - select HWMON >>> + bool "Dell i8k legacy laptop support" >>> + select SENSORS_DELL_SMM >> >> ... >> >>> +config SENSORS_DELL_SMM >>> + tristate "Dell laptop SMM BIOS hwmon driver" >> >> The only change I'd suggest is not to change the tristate to >> bool for I8K. Forcing that to bool means that >> SENSORS_DELL_SMM can't be compiled as a module if the user >> wishes to keep i8k hanging around "just in case". It'll >> probably annoy distro kernel packagers too. >> >> >> Thanks, >> Steven > > My idea was: > > SENSORS_DELL_SMM enable/disable compilation of kernel driver > (ether statically link into kernel image or as external module) > > CONFIG_I8K just enable /proc/i8k code in SENSORS_DELL_SMM -- no > additional driver, just boolean switch which has effect only iff > SENSORS_DELL_SMM is Y or M > Maybe that is the plan, but it is not what is happening. I8K selects SENSORS_DELL_SMM, so a boolean I8K forces SENSORS_DELL_SMM to be built into the kernel. What you suggest would work if I8K would depend on SENSORS_DELL_SMM, but then the symbols would not be backward-compatible. Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:20 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 22:20 UTC (permalink / raw) To: Pali Rohár, Steven Honeyman Cc: Paul Bolle, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDMvMjgvMjAxNSAwMzowMCBQTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gT24gU2F0dXJkYXkg MjggTWFyY2ggMjAxNSAxMzo1NDo1MSBTdGV2ZW4gSG9uZXltYW4gd3JvdGU6Cj4+IE9uIDI4IE1h cmNoIDIwMTUgYXQgMTE6MDQsIFBhdWwgQm9sbGUgPHBlYm9sbGVAdGlzY2FsaS5ubD4KPiB3cm90 ZToKPj4+IE9uIFNhdCwgMjAxNS0wMy0yOCBhdCAxMToyNCArMDEwMCwgUGFsaSBSb2jDoXIgd3Jv dGU6Cj4+Pj4gLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCj4+Pj4gKysrIGIvZHJpdmVycy9o d21vbi9LY29uZmlnCj4+Pj4gQEAgLTE3MDMsNiArMTcwMywxNyBAQCBjb25maWcgU0VOU09SU19V TFRSQTQ1Cj4+Pj4KPj4+PiAgICAgICAgICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZv ciB0aGUgVWx0cmE0NQo+Pj4+ICAgICAgICAgIHdvcmtzdGF0aW9uIGVudmlyb25tZW50YWwgc2Vu c29ycy4KPj4+Pgo+Pj4+ICtjb25maWcgU0VOU09SU19ERUxMX1NNTQo+Pj4+ICsgICAgIHRyaXN0 YXRlICJEZWxsIGxhcHRvcCBTTU0gQklPUyBod21vbiBkcml2ZXIiCj4+Pj4gKyAgICAgZGVwZW5k cyBPTiBYODYKPj4+Cj4+PiBIb3cgZGlkIHRoaXMgcGFzdCB5b3VyIHRlc3Rpbmc/Cj4+Pgo+Pj4+ ICsgICAgIC0tLWhlbHAtLS0KPj4+PiArICAgICAgIFRoaXMgaHdtb24gZHJpdmVyIGFkZHMgc3Vw cG9ydCBmb3IgcmVwb3J0aW5nCj4+Pj4gdGVtcGVyYXR1cmUgb2YgZGlmZmVyZW50ICsgICAgICAg c2Vuc29ycyBhbmQgY29udHJvbHMgdGhlCj4+Pj4gZmFucyBvbiBEZWxsIGxhcHRvcHMgdmlhIFN5 c3RlbSBNYW5hZ2VtZW50ICsgICAgICAgTW9kZQo+Pj4+IHByb3ZpZGVkIGJ5IERlbGwgQklPUy4K Pj4+PiArCj4+Pj4gKyAgICAgICBXaGVuIG9wdGlvbiBJOEsgaXMgYWxzbyBlbmFibGVkIHRoaXMg ZHJpdmVyCj4+Pj4gcHJvdmlkZXMgbGVnYWN5IC9wcm9jL2k4ayArICAgICAgIHVzZXJzcGFjZSBp bnRlcmZhY2UgZm9yCj4+Pj4gaThrdXRpbHMgcGFja2FnZS4KPj4+PiArCj4+Cj4+IEl0J3Mgd29y a2luZyBPSyBmb3IgbWUgKGFmdGVyIGZpeGluZyB0aGUgbWlzdGFrZSBwb2ludGVkIG91dAo+PiBh Ym92ZSkuCj4+Cj4+IFtMYXRpdHVkZSBlNjU0MF0KPj4gLS0tLS0KPj4gY29yZXRlbXAtaXNhLTAw MDAKPj4gQWRhcHRlcjogSVNBIGFkYXB0ZXIKPj4gUGh5c2ljYWwgaWQgMDogICs1My4wwrBDICAo aGlnaCA9ICs4NC4wwrBDLCBjcml0ID0gKzEwMC4wwrBDKQo+PiBDb3JlIDA6ICAgICAgICAgKzUx LjDCsEMgIChoaWdoID0gKzg0LjDCsEMsIGNyaXQgPSArMTAwLjDCsEMpCj4+IENvcmUgMTogICAg ICAgICArNTMuMMKwQyAgKGhpZ2ggPSArODQuMMKwQywgY3JpdCA9ICsxMDAuMMKwQykKPj4KPj4g aThrLXZpcnR1YWwtMAo+PiBBZGFwdGVyOiBWaXJ0dWFsIGRldmljZQo+PiBQcm9jZXNzb3IgRmFu OiAzMTcxIFJQTQo+PiBDUFU6ICAgICAgICAgICAgKzUyLjDCsEMKPj4gQW1iaWVudDogICAgICAg ICs0Ni4wwrBDCj4+IFNPRElNTTogICAgICAgICArNDAuMMKwQwo+PiAtLS0tLQo+Pgo+PiBBbWJp ZW50IGFuZCBTT0RJTU0gbG9vayBzd2FwcGVkIC0gYnV0IGl0J3MgcHJvYmFibHkganVzdAo+PiBh bm90aGVyIERlbGwgZXJyb3IuIEkgcmVhbGx5IG5lZWQgdG8gbG9vayBhdCBnZXR0aW5nIGNvcmVi b290Cj4+IG9uIHRoaXMgdGhpbmcuCj4+Cj4KPiBCb3RoIHBhdGNoZXMgZG8gbm90IGNoYW5nZSBh bnkgY29kZS4gU28gdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkKPiB0eXBlIHN3YXBwZWQgd2l0aCBv ciB3aXRob3V0IG15IHBhdGNoLgo+Cj4gQ3B1IHR5cGUgaXMgcmVxdWVzdGVkIHZpYSBTTU0gaW4g c2FtZSB3YXkgYXMgaXQgaXMgZG9pbmcgb2xkIERPUwo+IGV4ZWN1dGFibGUuIFNvIHRoZXJlIGNh biBiZSBtYXliZSBwcm9ibGVtIGluIERFTEwgU01NIGhhbmRsZXIgdG9vCj4gb3IgbWF5YmUganVz dCBJIGRpZCBub3QgdW5kZXJzdGFuZCBjb3JyZWN0bHkgYXNzZW1ibGVyIGR1bXAgb2YKPiBET1Mg ZXhlY3V0YWJsZS4uLgo+Cj4+IE9uIDI4IE1hcmNoIDIwMTUgYXQgMTA6MjQsIFBhbGkgUm9ow6Fy IDxwYWxpLnJvaGFyQGdtYWlsLmNvbT4KPj4gd3JvdGU6IC4uLgo+Pgo+Pj4gICBjb25maWcgSThL Cj4+Pgo+Pj4gLSAgICAgICB0cmlzdGF0ZSAiRGVsbCBsYXB0b3Agc3VwcG9ydCIKPj4+IC0gICAg ICAgc2VsZWN0IEhXTU9OCj4+PiArICAgICAgIGJvb2wgIkRlbGwgaThrIGxlZ2FjeSBsYXB0b3Ag c3VwcG9ydCIKPj4+ICsgICAgICAgc2VsZWN0IFNFTlNPUlNfREVMTF9TTU0KPj4KPj4gLi4uCj4+ Cj4+PiArY29uZmlnIFNFTlNPUlNfREVMTF9TTU0KPj4+ICsgICAgICAgdHJpc3RhdGUgIkRlbGwg bGFwdG9wIFNNTSBCSU9TIGh3bW9uIGRyaXZlciIKPj4KPj4gVGhlIG9ubHkgY2hhbmdlIEknZCBz dWdnZXN0IGlzIG5vdCB0byBjaGFuZ2UgdGhlIHRyaXN0YXRlIHRvCj4+IGJvb2wgZm9yIEk4Sy4g Rm9yY2luZyB0aGF0IHRvIGJvb2wgbWVhbnMgdGhhdAo+PiBTRU5TT1JTX0RFTExfU01NIGNhbid0 IGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGlmIHRoZSB1c2VyCj4+IHdpc2hlcyB0byBrZWVwIGk4 ayBoYW5naW5nIGFyb3VuZCAianVzdCBpbiBjYXNlIi4gSXQnbGwKPj4gcHJvYmFibHkgYW5ub3kg ZGlzdHJvIGtlcm5lbCBwYWNrYWdlcnMgdG9vLgo+Pgo+Pgo+PiBUaGFua3MsCj4+IFN0ZXZlbgo+ Cj4gTXkgaWRlYSB3YXM6Cj4KPiBTRU5TT1JTX0RFTExfU01NIGVuYWJsZS9kaXNhYmxlIGNvbXBp bGF0aW9uIG9mIGtlcm5lbCBkcml2ZXIKPiAoZXRoZXIgc3RhdGljYWxseSBsaW5rIGludG8ga2Vy bmVsIGltYWdlIG9yIGFzIGV4dGVybmFsIG1vZHVsZSkKPgo+IENPTkZJR19JOEsganVzdCBlbmFi bGUgL3Byb2MvaThrIGNvZGUgaW4gU0VOU09SU19ERUxMX1NNTSAtLSBubwo+IGFkZGl0aW9uYWwg ZHJpdmVyLCBqdXN0IGJvb2xlYW4gc3dpdGNoIHdoaWNoIGhhcyBlZmZlY3Qgb25seSBpZmYKPiBT RU5TT1JTX0RFTExfU01NIGlzIFkgb3IgTQo+CgpNYXliZSB0aGF0IGlzIHRoZSBwbGFuLCBidXQg aXQgaXMgbm90IHdoYXQgaXMgaGFwcGVuaW5nLgpJOEsgc2VsZWN0cyBTRU5TT1JTX0RFTExfU01N LCBzbyBhIGJvb2xlYW4gSThLIGZvcmNlcyBTRU5TT1JTX0RFTExfU01NCnRvIGJlIGJ1aWx0IGlu dG8gdGhlIGtlcm5lbC4KCldoYXQgeW91IHN1Z2dlc3Qgd291bGQgd29yayBpZiBJOEsgd291bGQg ZGVwZW5kIG9uIFNFTlNPUlNfREVMTF9TTU0sCmJ1dCB0aGVuIHRoZSBzeW1ib2xzIHdvdWxkIG5v dCBiZSBiYWNrd2FyZC1jb21wYXRpYmxlLgoKR3VlbnRlcgoKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNl bnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4v bGlzdGluZm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:20 ` [lm-sensors] " Guenter Roeck @ 2015-03-28 22:44 ` Paul Bolle -1 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 22:44 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors Guenter Roeck schreef op za 28-03-2015 om 15:20 [-0700]: > Maybe that is the plan, but it is not what is happening. > I8K selects SENSORS_DELL_SMM, so a boolean I8K forces SENSORS_DELL_SMM > to be built into the kernel. > > What you suggest would work if I8K would depend on SENSORS_DELL_SMM, > but then the symbols would not be backward-compatible. I haven't actually looked into this part of the patch, since as far as I'm concerned this patch is broken. Having said that, if using a second Kconfig symbol is worth the effort, perhaps there's also enough reason to break Kconfig backward compatibility. People shouldn't alter Kconfig symbols just because they can, but as far as I'm aware we're on the record to not guarantee backward compatibility for Kconfig symbols. Paul Bolle ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:44 ` Paul Bolle 0 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 22:44 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors Guenter Roeck schreef op za 28-03-2015 om 15:20 [-0700]: > Maybe that is the plan, but it is not what is happening. > I8K selects SENSORS_DELL_SMM, so a boolean I8K forces SENSORS_DELL_SMM > to be built into the kernel. > > What you suggest would work if I8K would depend on SENSORS_DELL_SMM, > but then the symbols would not be backward-compatible. I haven't actually looked into this part of the patch, since as far as I'm concerned this patch is broken. Having said that, if using a second Kconfig symbol is worth the effort, perhaps there's also enough reason to break Kconfig backward compatibility. People shouldn't alter Kconfig symbols just because they can, but as far as I'm aware we're on the record to not guarantee backward compatibility for Kconfig symbols. Paul Bolle _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:44 ` [lm-sensors] " Paul Bolle @ 2015-03-29 0:55 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-29 0:55 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 03:44 PM, Paul Bolle wrote: > Guenter Roeck schreef op za 28-03-2015 om 15:20 [-0700]: >> Maybe that is the plan, but it is not what is happening. >> I8K selects SENSORS_DELL_SMM, so a boolean I8K forces SENSORS_DELL_SMM >> to be built into the kernel. >> >> What you suggest would work if I8K would depend on SENSORS_DELL_SMM, >> but then the symbols would not be backward-compatible. > > I haven't actually looked into this part of the patch, since as far as > I'm concerned this patch is broken. > You mean beyond the "ON" and the above problem ? Can you elaborate ? Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-29 0:55 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-29 0:55 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 03:44 PM, Paul Bolle wrote: > Guenter Roeck schreef op za 28-03-2015 om 15:20 [-0700]: >> Maybe that is the plan, but it is not what is happening. >> I8K selects SENSORS_DELL_SMM, so a boolean I8K forces SENSORS_DELL_SMM >> to be built into the kernel. >> >> What you suggest would work if I8K would depend on SENSORS_DELL_SMM, >> but then the symbols would not be backward-compatible. > > I haven't actually looked into this part of the patch, since as far as > I'm concerned this patch is broken. > You mean beyond the "ON" and the above problem ? Can you elaborate ? Guenter _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-29 0:55 ` [lm-sensors] " Guenter Roeck @ 2015-03-30 8:01 ` Paul Bolle -1 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-30 8:01 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sat, 2015-03-28 at 17:55 -0700, Guenter Roeck wrote: > On 03/28/2015 03:44 PM, Paul Bolle wrote: > > I haven't actually looked into this part of the patch, since as far as > > I'm concerned this patch is broken. > > You mean beyond the "ON" and the above problem ? Can you elaborate ? No, I was talking about the ON typo. Because a patch that mainly juggles Kconfig symbols but adds a Kconfig syntax error while doing that is a broken patch. Paul Bolle ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-30 8:01 ` Paul Bolle 0 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-30 8:01 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Steven Honeyman, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sat, 2015-03-28 at 17:55 -0700, Guenter Roeck wrote: > On 03/28/2015 03:44 PM, Paul Bolle wrote: > > I haven't actually looked into this part of the patch, since as far as > > I'm concerned this patch is broken. > > You mean beyond the "ON" and the above problem ? Can you elaborate ? No, I was talking about the ON typo. Because a patch that mainly juggles Kconfig symbols but adds a Kconfig syntax error while doing that is a broken patch. Paul Bolle _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 11:04 ` [lm-sensors] " Paul Bolle @ 2015-03-28 21:55 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 21:55 UTC (permalink / raw) To: Paul Bolle Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 663 bytes --] On Saturday 28 March 2015 12:04:20 Paul Bolle wrote: > On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: > > --- a/drivers/hwmon/Kconfig > > +++ b/drivers/hwmon/Kconfig > > @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > > > > This driver provides support for the Ultra45 workstation > > environmental sensors. > > > > +config SENSORS_DELL_SMM > > + tristate "Dell laptop SMM BIOS hwmon driver" > > + depends ON X86 > > How did this past your testing? > Hello, I have tested compilation only with out of tree make command with manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K options. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 21:55 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 21:55 UTC (permalink / raw) To: Paul Bolle Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 663 bytes --] On Saturday 28 March 2015 12:04:20 Paul Bolle wrote: > On Sat, 2015-03-28 at 11:24 +0100, Pali Rohár wrote: > > --- a/drivers/hwmon/Kconfig > > +++ b/drivers/hwmon/Kconfig > > @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > > > > This driver provides support for the Ultra45 workstation > > environmental sensors. > > > > +config SENSORS_DELL_SMM > > + tristate "Dell laptop SMM BIOS hwmon driver" > > + depends ON X86 > > How did this past your testing? > Hello, I have tested compilation only with out of tree make command with manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K options. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 21:55 ` [lm-sensors] " Pali Rohár @ 2015-03-28 22:06 ` Paul Bolle -1 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 22:06 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sat, 2015-03-28 at 22:55 +0100, Pali Rohár wrote: > I have tested compilation only with out of tree make command with > manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K options. Not sure what you mean here. I can't get things past this error: drivers/hwmon/Kconfig:1721: syntax error drivers/hwmon/Kconfig:1720: invalid option make[1]: *** [oldconfig] Error 1 make: *** [oldconfig] Error 2 Thanks, Paul Bolle ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:06 ` Paul Bolle 0 siblings, 0 replies; 86+ messages in thread From: Paul Bolle @ 2015-03-28 22:06 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gU2F0LCAyMDE1LTAzLTI4IGF0IDIyOjU1ICswMTAwLCBQYWxpIFJvaMOhciB3cm90ZToKPiBJ IGhhdmUgdGVzdGVkIGNvbXBpbGF0aW9uIG9ubHkgd2l0aCBvdXQgb2YgdHJlZSBtYWtlIGNvbW1h bmQgd2l0aCAKPiBtYW51YWwgQ09ORklHX1NFTlNPUlNfREVMTF9TTU0gYW5kIENPTkZJR19JOEsg b3B0aW9ucy4KCk5vdCBzdXJlIHdoYXQgeW91IG1lYW4gaGVyZS4gSSBjYW4ndCBnZXQgdGhpbmdz IHBhc3QgdGhpcyBlcnJvcjoKICAgIGRyaXZlcnMvaHdtb24vS2NvbmZpZzoxNzIxOiBzeW50YXgg ZXJyb3IKICAgIGRyaXZlcnMvaHdtb24vS2NvbmZpZzoxNzIwOiBpbnZhbGlkIG9wdGlvbgogICAg bWFrZVsxXTogKioqIFtvbGRjb25maWddIEVycm9yIDEKICAgIG1ha2U6ICoqKiBbb2xkY29uZmln XSBFcnJvciAyCgpUaGFua3MsCgoKUGF1bCBCb2xsZQoKCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5z b3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:06 ` [lm-sensors] " Paul Bolle @ 2015-03-28 22:19 ` Steven Honeyman -1 siblings, 0 replies; 86+ messages in thread From: Steven Honeyman @ 2015-03-28 22:19 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 28 March 2015 at 22:00, Pali Rohár <pali.rohar@gmail.com> wrote: > On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: >> i8k-virtual-0 >> Adapter: Virtual device >> Processor Fan: 3171 RPM >> CPU: +52.0°C >> Ambient: +46.0°C >> SODIMM: +40.0°C >> ----- >> >> Ambient and SODIMM look swapped - but it's probably just >> another Dell error. I really need to look at getting coreboot >> on this thing. >> > > Both patches do not change any code. So there should not be any > type swapped with or without my patch. > > Cpu type is requested via SMM in same way as it is doing old DOS > executable. So there can be maybe problem in DELL SMM handler too > or maybe just I did not understand correctly assembler dump of > DOS executable... > Is there some way that I can find out for you? I've got a Windows partition somewhere, or DOS boot disk should be easy enough if this program works on new hardware. If I knew where the sensors were placed I could cool one of them. On 28 March 2015 at 22:04, Pali Rohár <pali.rohar@gmail.com> wrote: > I think that setting CONFIG_I8K to tristate (Y/M/N) does not make > sense... CONFIG_I8K just control if /proc/i8k will be compiled > into dell-smm-hwmon or not. Try and select dell-smm-hwmon as a module, with i8k enabled as well... On 28 March 2015 at 22:06, Paul Bolle <pebolle@tiscali.nl> wrote: > On Sat, 2015-03-28 at 22:55 +0100, Pali Rohár wrote: >> I have tested compilation only with out of tree make command with >> manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K options. > > Not sure what you mean here. I can't get things past this error: > drivers/hwmon/Kconfig:1721: syntax error > drivers/hwmon/Kconfig:1720: invalid option --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1705,8 +1705,8 @@ config SENSORS_DELL_SMM tristate "Dell laptop SMM BIOS hwmon driver" - depends ON X86 - ---help--- + depends on X86 + help This hwmon driver adds support for reporting temperature of different sensors and controls the fans on Dell laptops via System Management Mode provided by Dell BIOS. ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:19 ` Steven Honeyman 0 siblings, 0 replies; 86+ messages in thread From: Steven Honeyman @ 2015-03-28 22:19 UTC (permalink / raw) To: Paul Bolle Cc: Pali Rohár, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMjggTWFyY2ggMjAxNSBhdCAyMjowMCwgUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwu Y29tPiB3cm90ZToKPiBPbiBTYXR1cmRheSAyOCBNYXJjaCAyMDE1IDEzOjU0OjUxIFN0ZXZlbiBI b25leW1hbiB3cm90ZToKPj4gaThrLXZpcnR1YWwtMAo+PiBBZGFwdGVyOiBWaXJ0dWFsIGRldmlj ZQo+PiBQcm9jZXNzb3IgRmFuOiAzMTcxIFJQTQo+PiBDUFU6ICAgICAgICAgICAgKzUyLjDCsEMK Pj4gQW1iaWVudDogICAgICAgICs0Ni4wwrBDCj4+IFNPRElNTTogICAgICAgICArNDAuMMKwQwo+ PiAtLS0tLQo+Pgo+PiBBbWJpZW50IGFuZCBTT0RJTU0gbG9vayBzd2FwcGVkIC0gYnV0IGl0J3Mg cHJvYmFibHkganVzdAo+PiBhbm90aGVyIERlbGwgZXJyb3IuIEkgcmVhbGx5IG5lZWQgdG8gbG9v ayBhdCBnZXR0aW5nIGNvcmVib290Cj4+IG9uIHRoaXMgdGhpbmcuCj4+Cj4KPiBCb3RoIHBhdGNo ZXMgZG8gbm90IGNoYW5nZSBhbnkgY29kZS4gU28gdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkKPiB0 eXBlIHN3YXBwZWQgd2l0aCBvciB3aXRob3V0IG15IHBhdGNoLgo+Cj4gQ3B1IHR5cGUgaXMgcmVx dWVzdGVkIHZpYSBTTU0gaW4gc2FtZSB3YXkgYXMgaXQgaXMgZG9pbmcgb2xkIERPUwo+IGV4ZWN1 dGFibGUuIFNvIHRoZXJlIGNhbiBiZSBtYXliZSBwcm9ibGVtIGluIERFTEwgU01NIGhhbmRsZXIg dG9vCj4gb3IgbWF5YmUganVzdCBJIGRpZCBub3QgdW5kZXJzdGFuZCBjb3JyZWN0bHkgYXNzZW1i bGVyIGR1bXAgb2YKPiBET1MgZXhlY3V0YWJsZS4uLgo+CgpJcyB0aGVyZSBzb21lIHdheSB0aGF0 IEkgY2FuIGZpbmQgb3V0IGZvciB5b3U/IEkndmUgZ290IGEgV2luZG93cwpwYXJ0aXRpb24gc29t ZXdoZXJlLCBvciBET1MgYm9vdCBkaXNrIHNob3VsZCBiZSBlYXN5IGVub3VnaCBpZiB0aGlzCnBy b2dyYW0gd29ya3Mgb24gbmV3IGhhcmR3YXJlLgpJZiBJIGtuZXcgd2hlcmUgdGhlIHNlbnNvcnMg d2VyZSBwbGFjZWQgSSBjb3VsZCBjb29sIG9uZSBvZiB0aGVtLgoKCk9uIDI4IE1hcmNoIDIwMTUg YXQgMjI6MDQsIFBhbGkgUm9ow6FyIDxwYWxpLnJvaGFyQGdtYWlsLmNvbT4gd3JvdGU6Cj4gSSB0 aGluayB0aGF0IHNldHRpbmcgQ09ORklHX0k4SyB0byB0cmlzdGF0ZSAoWS9NL04pIGRvZXMgbm90 IG1ha2UKPiBzZW5zZS4uLiBDT05GSUdfSThLIGp1c3QgY29udHJvbCBpZiAvcHJvYy9pOGsgd2ls bCBiZSBjb21waWxlZAo+IGludG8gZGVsbC1zbW0taHdtb24gb3Igbm90LgoKVHJ5IGFuZCBzZWxl Y3QgZGVsbC1zbW0taHdtb24gYXMgYSBtb2R1bGUsIHdpdGggaThrIGVuYWJsZWQgYXMgd2VsbC4u LgoKCk9uIDI4IE1hcmNoIDIwMTUgYXQgMjI6MDYsIFBhdWwgQm9sbGUgPHBlYm9sbGVAdGlzY2Fs aS5ubD4gd3JvdGU6Cj4gT24gU2F0LCAyMDE1LTAzLTI4IGF0IDIyOjU1ICswMTAwLCBQYWxpIFJv aMOhciB3cm90ZToKPj4gSSBoYXZlIHRlc3RlZCBjb21waWxhdGlvbiBvbmx5IHdpdGggb3V0IG9m IHRyZWUgbWFrZSBjb21tYW5kIHdpdGgKPj4gbWFudWFsIENPTkZJR19TRU5TT1JTX0RFTExfU01N IGFuZCBDT05GSUdfSThLIG9wdGlvbnMuCj4KPiBOb3Qgc3VyZSB3aGF0IHlvdSBtZWFuIGhlcmUu IEkgY2FuJ3QgZ2V0IHRoaW5ncyBwYXN0IHRoaXMgZXJyb3I6Cj4gICAgIGRyaXZlcnMvaHdtb24v S2NvbmZpZzoxNzIxOiBzeW50YXggZXJyb3IKPiAgICAgZHJpdmVycy9od21vbi9LY29uZmlnOjE3 MjA6IGludmFsaWQgb3B0aW9uCgotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcKKysrIGIvZHJp dmVycy9od21vbi9LY29uZmlnCkBAIC0xNzA1LDggKzE3MDUsOCBAQAoKIGNvbmZpZyBTRU5TT1JT X0RFTExfU01NCiAgICAgdHJpc3RhdGUgIkRlbGwgbGFwdG9wIFNNTSBCSU9TIGh3bW9uIGRyaXZl ciIKLSAgICBkZXBlbmRzIE9OIFg4NgotICAgIC0tLWhlbHAtLS0KKyAgICBkZXBlbmRzIG9uIFg4 NgorICAgIGhlbHAKICAgICAgIFRoaXMgaHdtb24gZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgcmVw b3J0aW5nIHRlbXBlcmF0dXJlIG9mIGRpZmZlcmVudAogICAgICAgc2Vuc29ycyBhbmQgY29udHJv bHMgdGhlIGZhbnMgb24gRGVsbCBsYXB0b3BzIHZpYSBTeXN0ZW0gTWFuYWdlbWVudAogICAgICAg TW9kZSBwcm92aWRlZCBieSBEZWxsIEJJT1MuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxt LXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:19 ` [lm-sensors] " Steven Honeyman @ 2015-03-28 22:33 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:33 UTC (permalink / raw) To: Steven Honeyman Cc: Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 3284 bytes --] On Saturday 28 March 2015 23:19:04 Steven Honeyman wrote: > On 28 March 2015 at 22:00, Pali Rohár <pali.rohar@gmail.com> > wrote: > > On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: > >> i8k-virtual-0 > >> Adapter: Virtual device > >> Processor Fan: 3171 RPM > >> CPU: +52.0°C > >> Ambient: +46.0°C > >> SODIMM: +40.0°C > >> ----- > >> > >> Ambient and SODIMM look swapped - but it's probably just > >> another Dell error. I really need to look at getting > >> coreboot on this thing. > > > > Both patches do not change any code. So there should not be > > any type swapped with or without my patch. > > > > Cpu type is requested via SMM in same way as it is doing old > > DOS executable. So there can be maybe problem in DELL SMM > > handler too or maybe just I did not understand correctly > > assembler dump of DOS executable... > > Is there some way that I can find out for you? I've got a > Windows partition somewhere, or DOS boot disk should be easy > enough if this program works on new hardware. > If I knew where the sensors were placed I could cool one of > them. > Maybe DOS executable is just too old... and need to use new one. I extracted diagnostic application from BIOS package (EFI binary which show temperature in BIOS) for my laptop, but decoding instructions of this big graphic binary is beyond my power. But it looks like it calls same SMM inb/outb calls, so SMM code in BIOS handler was not changed. So if you want to fix this problem, next step is to disassemble or understand new modern EFI diag binary... I think it would be better to locate on which bus are sensors connected (smbus? isa? pci?), find out HW chips and wrote native kernel drivers for them... I scanned smbus (intel controller connected on pci) on my E6440 but there is no additional/unknown device. I have no idea where else could be sensor device connected and accessible (from SMM or kernel mode). > On 28 March 2015 at 22:04, Pali Rohár <pali.rohar@gmail.com> > wrote: > > I think that setting CONFIG_I8K to tristate (Y/M/N) does not > > make sense... CONFIG_I8K just control if /proc/i8k will be > > compiled into dell-smm-hwmon or not. > > Try and select dell-smm-hwmon as a module, with i8k enabled as > well... > Got it. > On 28 March 2015 at 22:06, Paul Bolle <pebolle@tiscali.nl> > wrote: > > On Sat, 2015-03-28 at 22:55 +0100, Pali Rohár wrote: > >> I have tested compilation only with out of tree make > >> command with manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K > >> options. > > > > Not sure what you mean here. I can't get things past this > > error: > > drivers/hwmon/Kconfig:1721: syntax error > > drivers/hwmon/Kconfig:1720: invalid option > > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -1705,8 +1705,8 @@ > > config SENSORS_DELL_SMM > tristate "Dell laptop SMM BIOS hwmon driver" > - depends ON X86 > - ---help--- > + depends on X86 > + help > This hwmon driver adds support for reporting > temperature of different sensors and controls the fans on > Dell laptops via System Management Mode provided by Dell > BIOS. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:33 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:33 UTC (permalink / raw) To: Steven Honeyman Cc: Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 3284 bytes --] On Saturday 28 March 2015 23:19:04 Steven Honeyman wrote: > On 28 March 2015 at 22:00, Pali Rohár <pali.rohar@gmail.com> > wrote: > > On Saturday 28 March 2015 13:54:51 Steven Honeyman wrote: > >> i8k-virtual-0 > >> Adapter: Virtual device > >> Processor Fan: 3171 RPM > >> CPU: +52.0°C > >> Ambient: +46.0°C > >> SODIMM: +40.0°C > >> ----- > >> > >> Ambient and SODIMM look swapped - but it's probably just > >> another Dell error. I really need to look at getting > >> coreboot on this thing. > > > > Both patches do not change any code. So there should not be > > any type swapped with or without my patch. > > > > Cpu type is requested via SMM in same way as it is doing old > > DOS executable. So there can be maybe problem in DELL SMM > > handler too or maybe just I did not understand correctly > > assembler dump of DOS executable... > > Is there some way that I can find out for you? I've got a > Windows partition somewhere, or DOS boot disk should be easy > enough if this program works on new hardware. > If I knew where the sensors were placed I could cool one of > them. > Maybe DOS executable is just too old... and need to use new one. I extracted diagnostic application from BIOS package (EFI binary which show temperature in BIOS) for my laptop, but decoding instructions of this big graphic binary is beyond my power. But it looks like it calls same SMM inb/outb calls, so SMM code in BIOS handler was not changed. So if you want to fix this problem, next step is to disassemble or understand new modern EFI diag binary... I think it would be better to locate on which bus are sensors connected (smbus? isa? pci?), find out HW chips and wrote native kernel drivers for them... I scanned smbus (intel controller connected on pci) on my E6440 but there is no additional/unknown device. I have no idea where else could be sensor device connected and accessible (from SMM or kernel mode). > On 28 March 2015 at 22:04, Pali Rohár <pali.rohar@gmail.com> > wrote: > > I think that setting CONFIG_I8K to tristate (Y/M/N) does not > > make sense... CONFIG_I8K just control if /proc/i8k will be > > compiled into dell-smm-hwmon or not. > > Try and select dell-smm-hwmon as a module, with i8k enabled as > well... > Got it. > On 28 March 2015 at 22:06, Paul Bolle <pebolle@tiscali.nl> > wrote: > > On Sat, 2015-03-28 at 22:55 +0100, Pali Rohár wrote: > >> I have tested compilation only with out of tree make > >> command with manual CONFIG_SENSORS_DELL_SMM and CONFIG_I8K > >> options. > > > > Not sure what you mean here. I can't get things past this > > error: > > drivers/hwmon/Kconfig:1721: syntax error > > drivers/hwmon/Kconfig:1720: invalid option > > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -1705,8 +1705,8 @@ > > config SENSORS_DELL_SMM > tristate "Dell laptop SMM BIOS hwmon driver" > - depends ON X86 > - ---help--- > + depends on X86 > + help > This hwmon driver adds support for reporting > temperature of different sensors and controls the fans on > Dell laptops via System Management Mode provided by Dell > BIOS. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 22:33 ` [lm-sensors] " Pali Rohár @ 2015-03-30 7:44 ` Jean Delvare -1 siblings, 0 replies; 86+ messages in thread From: Jean Delvare @ 2015-03-30 7:44 UTC (permalink / raw) To: Pali Rohár Cc: Steven Honeyman, Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sat, 28 Mar 2015 23:33:46 +0100, Pali Rohár wrote: > I think it would be better to locate on which bus are sensors > connected (smbus? isa? pci?), find out HW chips and wrote native > kernel drivers for them... > > I scanned smbus (intel controller connected on pci) on my E6440 > but there is no additional/unknown device. I have no idea where > else could be sensor device connected and accessible (from SMM or > kernel mode). As much as I hate SMM, native access to a BIOS-owned device is not a good idea, as is it dangerously racy. If anything, we are currently trying to move _away_ from native drivers on a number of systems (basically all systems where acpi_enforce_resources=lax is needed.) On x86, ideally ACPI would offer a standard interface to the hardware monitoring chip and the OS would need a single driver for all boards out there. Failing that, ACPI should provide a clean and safe way to access the chip's registers (read: some mutex to avoid concurrent access to the registers by the BIOS and the OS.) -- Jean Delvare SUSE L3 Support ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-30 7:44 ` Jean Delvare 0 siblings, 0 replies; 86+ messages in thread From: Jean Delvare @ 2015-03-30 7:44 UTC (permalink / raw) To: Pali Rohár Cc: Steven Honeyman, Paul Bolle, Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Valdis Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gU2F0LCAyOCBNYXIgMjAxNSAyMzozMzo0NiArMDEwMCwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4g SSB0aGluayBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gbG9jYXRlIG9uIHdoaWNoIGJ1cyBhcmUgc2Vu c29ycyAKPiBjb25uZWN0ZWQgKHNtYnVzPyBpc2E/IHBjaT8pLCBmaW5kIG91dCBIVyBjaGlwcyBh bmQgd3JvdGUgbmF0aXZlIAo+IGtlcm5lbCBkcml2ZXJzIGZvciB0aGVtLi4uCj4gCj4gSSBzY2Fu bmVkIHNtYnVzIChpbnRlbCBjb250cm9sbGVyIGNvbm5lY3RlZCBvbiBwY2kpIG9uIG15IEU2NDQw IAo+IGJ1dCB0aGVyZSBpcyBubyBhZGRpdGlvbmFsL3Vua25vd24gZGV2aWNlLiBJIGhhdmUgbm8g aWRlYSB3aGVyZSAKPiBlbHNlIGNvdWxkIGJlIHNlbnNvciBkZXZpY2UgY29ubmVjdGVkIGFuZCBh Y2Nlc3NpYmxlIChmcm9tIFNNTSBvciAKPiBrZXJuZWwgbW9kZSkuCgpBcyBtdWNoIGFzIEkgaGF0 ZSBTTU0sIG5hdGl2ZSBhY2Nlc3MgdG8gYSBCSU9TLW93bmVkIGRldmljZSBpcyBub3QgYQpnb29k IGlkZWEsIGFzIGlzIGl0IGRhbmdlcm91c2x5IHJhY3kuIElmIGFueXRoaW5nLCB3ZSBhcmUgY3Vy cmVudGx5CnRyeWluZyB0byBtb3ZlIF9hd2F5XyBmcm9tIG5hdGl2ZSBkcml2ZXJzIG9uIGEgbnVt YmVyIG9mIHN5c3RlbXMKKGJhc2ljYWxseSBhbGwgc3lzdGVtcyB3aGVyZSBhY3BpX2VuZm9yY2Vf cmVzb3VyY2VzPWxheCBpcyBuZWVkZWQuKQoKT24geDg2LCBpZGVhbGx5IEFDUEkgd291bGQgb2Zm ZXIgYSBzdGFuZGFyZCBpbnRlcmZhY2UgdG8gdGhlIGhhcmR3YXJlCm1vbml0b3JpbmcgY2hpcCBh bmQgdGhlIE9TIHdvdWxkIG5lZWQgYSBzaW5nbGUgZHJpdmVyIGZvciBhbGwgYm9hcmRzCm91dCB0 aGVyZS4gRmFpbGluZyB0aGF0LCBBQ1BJIHNob3VsZCBwcm92aWRlIGEgY2xlYW4gYW5kIHNhZmUg d2F5IHRvCmFjY2VzcyB0aGUgY2hpcCdzIHJlZ2lzdGVycyAocmVhZDogc29tZSBtdXRleCB0byBh dm9pZCBjb25jdXJyZW50CmFjY2VzcyB0byB0aGUgcmVnaXN0ZXJzIGJ5IHRoZSBCSU9TIGFuZCB0 aGUgT1MuKQoKLS0gCkplYW4gRGVsdmFyZQpTVVNFIEwzIFN1cHBvcnQKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0 CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21h aWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-28 14:23 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:23 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/28/2015 03:24 AM, Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/x86/Kconfig | 25 +++++++++---------------- > drivers/hwmon/Kconfig | 11 +++++++++++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 20 ++++++++++++++++---- > 4 files changed, 37 insertions(+), 21 deletions(-) > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index b7d31ca..8d0266b 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -1063,24 +1063,17 @@ config TOSHIBA > Say N otherwise. > > config I8K > - tristate "Dell laptop support" > - select HWMON > + bool "Dell i8k legacy laptop support" tristate and still "select HWMON". > + select SENSORS_DELL_SMM > ---help--- > - This adds a driver to safely access the System Management Mode > - of the CPU on the Dell Inspiron 8000. The System Management Mode > - is used to read cpu temperature and cooling fan status and to > - control the fans on the I8K portables. > + This options enables legacy /proc/i8k userspace interface in > + dell-smm-hwmon driver. Character file /proc/i8k reports power and > + hotkey status on old Dell laptops (like Dell Inspiron 8000) via > + System Management Mode provided by Dell BIOS. This /proc/i8k interface > + is also used by userspace package i8kutils to control laptop fans. > > - This driver has been tested only on the Inspiron 8000 but it may > - also work with other Dell laptops. You can force loading on other > - models by passing the parameter `force=1' to the module. Use at > - your own risk. > - > - For information on utilities to make use of this driver see the > - I8K Linux utilities web site at: > - <http://people.debian.org/~dz/i8k/> > - > - Say Y if you intend to run this kernel on a Dell Inspiron 8000. > + Say Y if you intend to run this kernel on old Dell laptops or want to > + use userspace package i8kutils. > Say N otherwise. > > config X86_REBOOTFIXUPS > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig > index 110fade..86eeb7d 100644 > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -1703,6 +1703,17 @@ config SENSORS_ULTRA45 > This driver provides support for the Ultra45 workstation environmental > sensors. > > +config SENSORS_DELL_SMM > + tristate "Dell laptop SMM BIOS hwmon driver" > + depends ON X86 Wondering as well .. .did you test this ? > + ---help--- > + This hwmon driver adds support for reporting temperature of different > + sensors and controls the fans on Dell laptops via System Management > + Mode provided by Dell BIOS. > + > + When option I8K is also enabled this driver provides legacy /proc/i8k > + userspace interface for i8kutils package. > + Please add this in alphabetic order. > if ACPI > > comment "ACPI drivers" > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > index 1c3e458..9eec614 100644 > --- a/drivers/hwmon/Makefile > +++ b/drivers/hwmon/Makefile > @@ -155,7 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > -obj-$(CONFIG_I8K) += dell-smm-hwmon.o > +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o Same here. > > obj-$(CONFIG_PMBUS) += pmbus/ > > diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c > index 2b04e4f..e9661dc 100644 > --- a/drivers/hwmon/dell-smm-hwmon.c > +++ b/drivers/hwmon/dell-smm-hwmon.c > @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; > > MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); > MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); > -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); > +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); > MODULE_LICENSE("GPL"); > MODULE_ALIAS("i8k"); > > @@ -93,6 +93,7 @@ static bool ignore_dmi; > module_param(ignore_dmi, bool, 0); > MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); > > +#ifdef CONFIG_I8K > static bool restricted; > module_param(restricted, bool, 0); > MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > static bool power_status; > module_param(power_status, bool, 0600); > MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); > +#endif > > static uint fan_mult; > module_param(fan_mult, uint, 0); > @@ -109,6 +111,7 @@ static uint fan_max; > module_param(fan_max, uint, 0); > MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); > > +#ifdef CONFIG_I8K > static int i8k_open_fs(struct inode *inode, struct file *file); > static long i8k_ioctl(struct file *, unsigned int, unsigned long); > > @@ -120,6 +123,7 @@ static const struct file_operations i8k_fops = { > .release = single_release, > .unlocked_ioctl = i8k_ioctl, > }; > +#endif > > struct smm_regs { > unsigned int eax; > @@ -220,6 +224,7 @@ out: > return rc; > } > > +#ifdef CONFIG_I8K > /* > * Read the Fn key status. > */ > @@ -258,6 +263,7 @@ static int i8k_get_power_status(void) > > return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > } > +#endif > > /* > * Read the fan status. > @@ -378,6 +384,7 @@ static int i8k_get_dell_signature(int req_fn) > return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; > } > > +#ifdef CONFIG_I8K > static int > i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) > { > @@ -525,6 +532,7 @@ static int i8k_open_fs(struct inode *inode, struct file *file) > { > return single_open(file, i8k_proc_show, NULL); > } > +#endif > > > /* > @@ -974,17 +982,17 @@ static int __init i8k_probe(void) > > static int __init i8k_init(void) > { > - struct proc_dir_entry *proc_i8k; > int err; > > /* Are we running on an supported laptop? */ > if (i8k_probe()) > return -ENODEV; > > +#ifdef CONFIG_I8K > /* Register the proc entry */ > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > - if (!proc_i8k) > + if (!proc_create("i8k", 0, NULL, &i8k_fops)) > return -ENOENT; I would prefer not to fail here but report a warning. This is no longer a fatal condition. > +#endif > > err = i8k_init_hwmon(); > if (err) > @@ -993,14 +1001,18 @@ static int __init i8k_init(void) > return 0; > > exit_remove_proc: > +#ifdef CONFIG_I8K > remove_proc_entry("i8k", NULL); > +#endif > return err; > } > > static void __exit i8k_exit(void) > { > hwmon_device_unregister(i8k_hwmon_dev); > +#ifdef CONFIG_I8K > remove_proc_entry("i8k", NULL); > +#endif > } > > module_init(i8k_init); > Can you move all the conditional functions and global variables together under a single #ifdef ? That should include functions to create the proc entries, and shim functions for the same if I8K is not configured. Also, the #ifdef would not cover the case where I8K is configured as module (there is no reason to force it to bool). You should use "#if IS_ENABLED(CONFIG_I8K)" instead. Thanks, Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 14:23 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-28 14:23 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDMvMjgvMjAxNSAwMzoyNCBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gVGhpcyBwYXRjaCBz cGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RFTExfU01NIGFuZCBD T05GSUdfSThLLgo+IE9wdGlvbiBTRU5TT1JTX0RFTExfU01NIGlzIG5vdyB1c2VkIHRvIGVuYWJs ZSBjb21waWxhdGlvbiBvZiBkZWxsLXNtbS1od21vbgo+IGRyaXZlciBhbmQgb2xkIENPTkZJR19J OEsgb3B0aW9uIHRvIGVuYWJsZSAvcHJvYy9pOGsgaW50ZXJmYWNlIGluIGRyaXZlci4KPgo+IFNv IHRoaXMgY2hhbmdlIGFsbG93cyB0byBjb21waWxlIGRlbGwtc21tLWh3bW9uIGRyaXZlciB3aXRo b3V0IGxlZ2FjeSAvcHJvYy9pOGsKPiBpbnRlcmZhY2Ugd2hpY2ggaXMgbmVlZGVkIG9ubHkgZm9y IG9sZCBEZWxsIEluc3BpcmlvbiBtb2RlbHMgb3IgZm9yIHVzZXJzcGFjZQo+IGk4a3V0aWxzIHBh Y2thZ2UuCj4KPiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIENPTkZJR19JOEsgaXMg ZW5hYmxlZCB0aGVuIGFsc28gU0VOU09SU19ERUxMX1NNTQo+IGlzIGVuYWJsZWQgYW5kIHNvIGRy aXZlciBkZWxsLXNtbS1od21vbiAod2l0aCAvcHJvYy9pOGspIGlzIGNvbXBpbGVkLgo+Cj4gU2ln bmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgo+IC0tLQo+ICAg YXJjaC94ODYvS2NvbmZpZyAgICAgICAgICAgICAgIHwgICAyNSArKysrKysrKystLS0tLS0tLS0t LS0tLS0tCj4gICBkcml2ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgfCAgIDExICsrKysrKysr KysrCj4gICBkcml2ZXJzL2h3bW9uL01ha2VmaWxlICAgICAgICAgfCAgICAyICstCj4gICBkcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMgfCAgIDIwICsrKysrKysrKysrKysrKystLS0tCj4g ICA0IGZpbGVzIGNoYW5nZWQsIDM3IGluc2VydGlvbnMoKyksIDIxIGRlbGV0aW9ucygtKQo+Cj4g ZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCj4gaW5kZXgg YjdkMzFjYS4uOGQwMjY2YiAxMDA2NDQKPiAtLS0gYS9hcmNoL3g4Ni9LY29uZmlnCj4gKysrIGIv YXJjaC94ODYvS2NvbmZpZwo+IEBAIC0xMDYzLDI0ICsxMDYzLDE3IEBAIGNvbmZpZyBUT1NISUJB Cj4gICAJICBTYXkgTiBvdGhlcndpc2UuCj4KPiAgIGNvbmZpZyBJOEsKPiAtCXRyaXN0YXRlICJE ZWxsIGxhcHRvcCBzdXBwb3J0Igo+IC0Jc2VsZWN0IEhXTU9OCj4gKwlib29sICJEZWxsIGk4ayBs ZWdhY3kgbGFwdG9wIHN1cHBvcnQiCgp0cmlzdGF0ZSBhbmQgc3RpbGwgInNlbGVjdCBIV01PTiIu Cgo+ICsJc2VsZWN0IFNFTlNPUlNfREVMTF9TTU0KPiAgIAktLS1oZWxwLS0tCj4gLQkgIFRoaXMg YWRkcyBhIGRyaXZlciB0byBzYWZlbHkgYWNjZXNzIHRoZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2Rl Cj4gLQkgIG9mIHRoZSBDUFUgb24gdGhlIERlbGwgSW5zcGlyb24gODAwMC4gVGhlIFN5c3RlbSBN YW5hZ2VtZW50IE1vZGUKPiAtCSAgaXMgdXNlZCB0byByZWFkIGNwdSB0ZW1wZXJhdHVyZSBhbmQg Y29vbGluZyBmYW4gc3RhdHVzIGFuZCB0bwo+IC0JICBjb250cm9sIHRoZSBmYW5zIG9uIHRoZSBJ OEsgcG9ydGFibGVzLgo+ICsJICBUaGlzIG9wdGlvbnMgZW5hYmxlcyBsZWdhY3kgL3Byb2MvaThr IHVzZXJzcGFjZSBpbnRlcmZhY2UgaW4KPiArCSAgZGVsbC1zbW0taHdtb24gZHJpdmVyLiBDaGFy YWN0ZXIgZmlsZSAvcHJvYy9pOGsgcmVwb3J0cyBwb3dlciBhbmQKPiArCSAgaG90a2V5IHN0YXR1 cyBvbiBvbGQgRGVsbCBsYXB0b3BzIChsaWtlIERlbGwgSW5zcGlyb24gODAwMCkgdmlhCj4gKwkg IFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBCSU9TLiBUaGlzIC9wcm9j L2k4ayBpbnRlcmZhY2UKPiArCSAgaXMgYWxzbyB1c2VkIGJ5IHVzZXJzcGFjZSBwYWNrYWdlIGk4 a3V0aWxzIHRvIGNvbnRyb2wgbGFwdG9wIGZhbnMuCj4KPiAtCSAgVGhpcyBkcml2ZXIgaGFzIGJl ZW4gdGVzdGVkIG9ubHkgb24gdGhlIEluc3Bpcm9uIDgwMDAgYnV0IGl0IG1heQo+IC0JICBhbHNv IHdvcmsgd2l0aCBvdGhlciBEZWxsIGxhcHRvcHMuIFlvdSBjYW4gZm9yY2UgbG9hZGluZyBvbiBv dGhlcgo+IC0JICBtb2RlbHMgYnkgcGFzc2luZyB0aGUgcGFyYW1ldGVyIGBmb3JjZT0xJyB0byB0 aGUgbW9kdWxlLiBVc2UgYXQKPiAtCSAgeW91ciBvd24gcmlzay4KPiAtCj4gLQkgIEZvciBpbmZv cm1hdGlvbiBvbiB1dGlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YgdGhpcyBkcml2ZXIgc2VlIHRoZQo+ IC0JICBJOEsgTGludXggdXRpbGl0aWVzIHdlYiBzaXRlIGF0Ogo+IC0JICA8aHR0cDovL3Blb3Bs ZS5kZWJpYW4ub3JnL35kei9pOGsvPgo+IC0KPiAtCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byBy dW4gdGhpcyBrZXJuZWwgb24gYSBEZWxsIEluc3Bpcm9uIDgwMDAuCj4gKwkgIFNheSBZIGlmIHlv dSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIG9sZCBEZWxsIGxhcHRvcHMgb3Igd2FudCB0 bwo+ICsJICB1c2UgdXNlcnNwYWNlIHBhY2thZ2UgaThrdXRpbHMuCj4gICAJICBTYXkgTiBvdGhl cndpc2UuCj4KPiAgIGNvbmZpZyBYODZfUkVCT09URklYVVBTCj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvaHdtb24vS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+IGluZGV4IDExMGZhZGUu Ljg2ZWViN2QgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCj4gKysrIGIvZHJp dmVycy9od21vbi9LY29uZmlnCj4gQEAgLTE3MDMsNiArMTcwMywxNyBAQCBjb25maWcgU0VOU09S U19VTFRSQTQ1Cj4gICAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgVWx0 cmE0NSB3b3Jrc3RhdGlvbiBlbnZpcm9ubWVudGFsCj4gICAJICBzZW5zb3JzLgo+Cj4gK2NvbmZp ZyBTRU5TT1JTX0RFTExfU01NCj4gKwl0cmlzdGF0ZSAiRGVsbCBsYXB0b3AgU01NIEJJT1MgaHdt b24gZHJpdmVyIgo+ICsJZGVwZW5kcyBPTiBYODYKCldvbmRlcmluZyBhcyB3ZWxsIC4uIC5kaWQg eW91IHRlc3QgdGhpcyA/Cgo+ICsJLS0taGVscC0tLQo+ICsJICBUaGlzIGh3bW9uIGRyaXZlciBh ZGRzIHN1cHBvcnQgZm9yIHJlcG9ydGluZyB0ZW1wZXJhdHVyZSBvZiBkaWZmZXJlbnQKPiArCSAg c2Vuc29ycyBhbmQgY29udHJvbHMgdGhlIGZhbnMgb24gRGVsbCBsYXB0b3BzIHZpYSBTeXN0ZW0g TWFuYWdlbWVudAo+ICsJICBNb2RlIHByb3ZpZGVkIGJ5IERlbGwgQklPUy4KPiArCj4gKwkgIFdo ZW4gb3B0aW9uIEk4SyBpcyBhbHNvIGVuYWJsZWQgdGhpcyBkcml2ZXIgcHJvdmlkZXMgbGVnYWN5 IC9wcm9jL2k4awo+ICsJICB1c2Vyc3BhY2UgaW50ZXJmYWNlIGZvciBpOGt1dGlscyBwYWNrYWdl Lgo+ICsKUGxlYXNlIGFkZCB0aGlzIGluIGFscGhhYmV0aWMgb3JkZXIuCgo+ICAgaWYgQUNQSQo+ Cj4gICBjb21tZW50ICJBQ1BJIGRyaXZlcnMiCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24v TWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4gaW5kZXggMWMzZTQ1OC4uOWVlYzYx NCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9o d21vbi9NYWtlZmlsZQo+IEBAIC0xNTUsNyArMTU1LDcgQEAgb2JqLSQoQ09ORklHX1NFTlNPUlNf VzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubwo+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4 Nk5HKQkrPSB3ODNsNzg2bmcubwo+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzFYKQkrPSB3 bTgzMXgtaHdtb24ubwo+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzUwKQkrPSB3bTgzNTAt aHdtb24ubwo+IC1vYmotJChDT05GSUdfSThLKQkJKz0gZGVsbC1zbW0taHdtb24ubwo+ICtvYmot JChDT05GSUdfU0VOU09SU19ERUxMX1NNTSkJKz0gZGVsbC1zbW0taHdtb24ubwoKU2FtZSBoZXJl LgoKPgo+ICAgb2JqLSQoQ09ORklHX1BNQlVTKQkJKz0gcG1idXMvCj4KPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1o d21vbi5jCj4gaW5kZXggMmIwNGU0Zi4uZTk2NjFkYyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2h3 bW9uL2RlbGwtc21tLWh3bW9uLmMKPiArKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9u LmMKPiBAQCAtODEsNyArODEsNyBAQCBzdGF0aWMgdWludCBpOGtfZmFuX21heCA9IEk4S19GQU5f SElHSDsKPgo+ICAgTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5v cmcpIik7Cj4gICBNT0RVTEVfQVVUSE9SKCJQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5j b20+Iik7Cj4gLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBhY2Nlc3NpbmcgU01NIEJJ T1Mgb24gRGVsbCBsYXB0b3BzIik7Cj4gK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3Ag U01NIEJJT1MgaHdtb24gZHJpdmVyIik7Cj4gICBNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gICBN T0RVTEVfQUxJQVMoImk4ayIpOwo+Cj4gQEAgLTkzLDYgKzkzLDcgQEAgc3RhdGljIGJvb2wgaWdu b3JlX2RtaTsKPiAgIG1vZHVsZV9wYXJhbShpZ25vcmVfZG1pLCBib29sLCAwKTsKPiAgIE1PRFVM RV9QQVJNX0RFU0MoaWdub3JlX2RtaSwgIkNvbnRpbnVlIHByb2JpbmcgaGFyZHdhcmUgZXZlbiBp ZiBETUkgZGF0YSBkb2VzIG5vdCBtYXRjaCIpOwo+Cj4gKyNpZmRlZiBDT05GSUdfSThLCj4gICBz dGF0aWMgYm9vbCByZXN0cmljdGVkOwo+ICAgbW9kdWxlX3BhcmFtKHJlc3RyaWN0ZWQsIGJvb2ws IDApOwo+ICAgTU9EVUxFX1BBUk1fREVTQyhyZXN0cmljdGVkLCAiQWxsb3cgZmFuIGNvbnRyb2wg aWYgU1lTX0FETUlOIGNhcGFiaWxpdHkgc2V0Iik7Cj4gQEAgLTEwMCw2ICsxMDEsNyBAQCBNT0RV TEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4g Y2FwYWJpbGl0eSBzZXQiKTsKPiAgIHN0YXRpYyBib29sIHBvd2VyX3N0YXR1czsKPiAgIG1vZHVs ZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2wsIDA2MDApOwo+ICAgTU9EVUxFX1BBUk1fREVTQyhw b3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4ayIpOwo+ICsjZW5k aWYKPgo+ICAgc3RhdGljIHVpbnQgZmFuX211bHQ7Cj4gICBtb2R1bGVfcGFyYW0oZmFuX211bHQs IHVpbnQsIDApOwo+IEBAIC0xMDksNiArMTExLDcgQEAgc3RhdGljIHVpbnQgZmFuX21heDsKPiAg IG1vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKPiAgIE1PRFVMRV9QQVJNX0RFU0MoZmFu X21heCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBzcGVlZCAoZGVmYXVsdDogYXV0b2RldGVj dCkiKTsKPgo+ICsjaWZkZWYgQ09ORklHX0k4Swo+ICAgc3RhdGljIGludCBpOGtfb3Blbl9mcyhz dHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Cj4gICBzdGF0aWMgbG9uZyBp OGtfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKPgo+ IEBAIC0xMjAsNiArMTIzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMg aThrX2ZvcHMgPSB7Cj4gICAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKPiAgIAkudW5sb2Nr ZWRfaW9jdGwJPSBpOGtfaW9jdGwsCj4gICB9Owo+ICsjZW5kaWYKPgo+ICAgc3RydWN0IHNtbV9y ZWdzIHsKPiAgIAl1bnNpZ25lZCBpbnQgZWF4Owo+IEBAIC0yMjAsNiArMjI0LDcgQEAgb3V0Ogo+ ICAgCXJldHVybiByYzsKPiAgIH0KPgo+ICsjaWZkZWYgQ09ORklHX0k4Swo+ICAgLyoKPiAgICAq IFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCj4gICAgKi8KPiBAQCAtMjU4LDYgKzI2Myw3IEBAIHN0 YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKPgo+ICAgCXJldHVybiAocmVncy5l YXggJiAweGZmKSA9PSBJOEtfUE9XRVJfQUMgPyBJOEtfQUMgOiBJOEtfQkFUVEVSWTsKPiAgIH0K PiArI2VuZGlmCj4KPiAgIC8qCj4gICAgKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgo+IEBAIC0zNzgs NiArMzg0LDcgQEAgc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKGludCByZXFfZm4p Cj4gICAJcmV0dXJuIHJlZ3MuZWF4ID09IDExNDU2NTE1MjcgJiYgcmVncy5lZHggPT0gMTE0NTM5 MjIwNCA/IDAgOiAtMTsKPiAgIH0KPgo+ICsjaWZkZWYgQ09ORklHX0k4Swo+ICAgc3RhdGljIGlu dAo+ICAgaThrX2lvY3RsX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNt ZCwgdW5zaWduZWQgbG9uZyBhcmcpCj4gICB7Cj4gQEAgLTUyNSw2ICs1MzIsNyBAQCBzdGF0aWMg aW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQo+ ICAgewo+ICAgCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBOVUxMKTsK PiAgIH0KPiArI2VuZGlmCj4KPgo+ICAgLyoKPiBAQCAtOTc0LDE3ICs5ODIsMTcgQEAgc3RhdGlj IGludCBfX2luaXQgaThrX3Byb2JlKHZvaWQpCj4KPiAgIHN0YXRpYyBpbnQgX19pbml0IGk4a19p bml0KHZvaWQpCj4gICB7Cj4gLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaThrOwo+ICAg CWludCBlcnI7Cj4KPiAgIAkvKiBBcmUgd2UgcnVubmluZyBvbiBhbiBzdXBwb3J0ZWQgbGFwdG9w PyAqLwo+ICAgCWlmIChpOGtfcHJvYmUoKSkKPiAgIAkJcmV0dXJuIC1FTk9ERVY7Cj4KPiArI2lm ZGVmIENPTkZJR19JOEsKPiAgIAkvKiBSZWdpc3RlciB0aGUgcHJvYyBlbnRyeSAqLwo+IC0JcHJv Y19pOGsgPSBwcm9jX2NyZWF0ZSgiaThrIiwgMCwgTlVMTCwgJmk4a19mb3BzKTsKPiAtCWlmICgh cHJvY19pOGspCj4gKwlpZiAoIXByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMp KQo+ICAgCQlyZXR1cm4gLUVOT0VOVDsKCkkgd291bGQgcHJlZmVyIG5vdCB0byBmYWlsIGhlcmUg YnV0IHJlcG9ydCBhIHdhcm5pbmcuClRoaXMgaXMgbm8gbG9uZ2VyIGEgZmF0YWwgY29uZGl0aW9u LgoKPiArI2VuZGlmCj4KPiAgIAllcnIgPSBpOGtfaW5pdF9od21vbigpOwo+ICAgCWlmIChlcnIp Cj4gQEAgLTk5MywxNCArMTAwMSwxOCBAQCBzdGF0aWMgaW50IF9faW5pdCBpOGtfaW5pdCh2b2lk KQo+ICAgCXJldHVybiAwOwo+Cj4gICAgZXhpdF9yZW1vdmVfcHJvYzoKPiArI2lmZGVmIENPTkZJ R19JOEsKPiAgIAlyZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7Cj4gKyNlbmRpZgo+ICAg CXJldHVybiBlcnI7Cj4gICB9Cj4KPiAgIHN0YXRpYyB2b2lkIF9fZXhpdCBpOGtfZXhpdCh2b2lk KQo+ICAgewo+ICAgCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19od21vbl9kZXYpOwo+ICsj aWZkZWYgQ09ORklHX0k4Swo+ICAgCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKPiAr I2VuZGlmCj4gICB9Cj4KPiAgIG1vZHVsZV9pbml0KGk4a19pbml0KTsKPgoKQ2FuIHlvdSBtb3Zl IGFsbCB0aGUgY29uZGl0aW9uYWwgZnVuY3Rpb25zIGFuZCBnbG9iYWwgdmFyaWFibGVzIHRvZ2V0 aGVyCnVuZGVyIGEgc2luZ2xlICNpZmRlZiA/IFRoYXQgc2hvdWxkIGluY2x1ZGUgZnVuY3Rpb25z IHRvIGNyZWF0ZSB0aGUgcHJvYwplbnRyaWVzLCBhbmQgc2hpbSBmdW5jdGlvbnMgZm9yIHRoZSBz YW1lIGlmIEk4SyBpcyBub3QgY29uZmlndXJlZC4KCkFsc28sIHRoZSAjaWZkZWYgd291bGQgbm90 IGNvdmVyIHRoZSBjYXNlIHdoZXJlIEk4SyBpcyBjb25maWd1cmVkIGFzIG1vZHVsZQoodGhlcmUg aXMgbm8gcmVhc29uIHRvIGZvcmNlIGl0IHRvIGJvb2wpLiBZb3Ugc2hvdWxkIHVzZSAiI2lmIElT X0VOQUJMRUQoQ09ORklHX0k4SykiCmluc3RlYWQuCgpUaGFua3MsCkd1ZW50ZXIKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxp bmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3Jz Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-28 14:23 ` [lm-sensors] " Guenter Roeck @ 2015-03-28 22:04 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:04 UTC (permalink / raw) To: Guenter Roeck Cc: Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 2050 bytes --] On Saturday 28 March 2015 15:23:15 Guenter Roeck wrote: > > + ---help--- > > + This hwmon driver adds support for reporting temperature > > of different + sensors and controls the fans on Dell > > laptops via System Management + Mode provided by Dell > > BIOS. > > + > > + When option I8K is also enabled this driver provides > > legacy /proc/i8k + userspace interface for i8kutils > > package. > > + > > Please add this in alphabetic order. > ok > > if ACPI > > > > comment "ACPI drivers" > > > > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > > index 1c3e458..9eec614 100644 > > --- a/drivers/hwmon/Makefile > > +++ b/drivers/hwmon/Makefile > > @@ -155,7 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += > > w83l785ts.o > > > > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > > > > -obj-$(CONFIG_I8K) += dell-smm-hwmon.o > > +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o > > Same here. > ok > > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > > - if (!proc_i8k) > > + if (!proc_create("i8k", 0, NULL, &i8k_fops)) > > > > return -ENOENT; > > I would prefer not to fail here but report a warning. > This is no longer a fatal condition. > ok, no problem > > Can you move all the conditional functions and global > variables together under a single #ifdef ? That should > include functions to create the proc entries, and shim > functions for the same if I8K is not configured. > ok, I will move procfs code to one location. > Also, the #ifdef would not cover the case where I8K is > configured as module (there is no reason to force it to > bool). You should use "#if IS_ENABLED(CONFIG_I8K)" instead. > I think that setting CONFIG_I8K to tristate (Y/M/N) does not make sense... CONFIG_I8K just control if /proc/i8k will be compiled into dell-smm-hwmon or not. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-28 22:04 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-28 22:04 UTC (permalink / raw) To: Guenter Roeck Cc: Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 2050 bytes --] On Saturday 28 March 2015 15:23:15 Guenter Roeck wrote: > > + ---help--- > > + This hwmon driver adds support for reporting temperature > > of different + sensors and controls the fans on Dell > > laptops via System Management + Mode provided by Dell > > BIOS. > > + > > + When option I8K is also enabled this driver provides > > legacy /proc/i8k + userspace interface for i8kutils > > package. > > + > > Please add this in alphabetic order. > ok > > if ACPI > > > > comment "ACPI drivers" > > > > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > > index 1c3e458..9eec614 100644 > > --- a/drivers/hwmon/Makefile > > +++ b/drivers/hwmon/Makefile > > @@ -155,7 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += > > w83l785ts.o > > > > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > > > > -obj-$(CONFIG_I8K) += dell-smm-hwmon.o > > +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o > > Same here. > ok > > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > > - if (!proc_i8k) > > + if (!proc_create("i8k", 0, NULL, &i8k_fops)) > > > > return -ENOENT; > > I would prefer not to fail here but report a warning. > This is no longer a fatal condition. > ok, no problem > > Can you move all the conditional functions and global > variables together under a single #ifdef ? That should > include functions to create the proc entries, and shim > functions for the same if I8K is not configured. > ok, I will move procfs code to one location. > Also, the #ifdef would not cover the case where I8K is > configured as module (there is no reason to force it to > bool). You should use "#if IS_ENABLED(CONFIG_I8K)" instead. > I think that setting CONFIG_I8K to tristate (Y/M/N) does not make sense... CONFIG_I8K just control if /proc/i8k will be compiled into dell-smm-hwmon or not. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár @ 2015-03-29 12:57 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c and allows to compile hwmon driver without /proc/i8k file. Pali Rohár (2): hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k MAINTAINERS | 4 +- arch/x86/Kconfig | 25 +- drivers/char/Makefile | 1 - drivers/char/i8k.c | 1005 --------------------------------------- drivers/hwmon/Kconfig | 11 + drivers/hwmon/Makefile | 1 + drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1049 insertions(+), 1023 deletions(-) delete mode 100644 drivers/char/i8k.c create mode 100644 drivers/hwmon/dell-smm-hwmon.c -- 1.7.9.5 ^ permalink raw reply [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-03-29 12:57 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzZXJpZXMgbW92ZXMgZHJpdmVycy9jaGFyL2k4ay5jIHRvIGRyaXZlcnMvaHdt b24vZGVsbC1zbW0taHdtb24uYwphbmQgYWxsb3dzIHRvIGNvbXBpbGUgaHdtb24gZHJpdmVyIHdp dGhvdXQgL3Byb2MvaThrIGZpbGUuCgpQYWxpIFJvaMOhciAoMik6CiAgaHdtb246IFJlbmFtZSBp OGsgZHJpdmVyIHRvIGRlbGwtc21tLWh3bW9uIGFuZCBtb3ZlIGl0IHRvIGh3bW9uIHRyZWUKICBo d21vbjogQWxsb3cgdG8gY29tcGlsZSBkZWxsLXNtbS1od21vbiBkcml2ZXIgd2l0aG91dCAvcHJv Yy9pOGsKCiBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICA0ICstCiBhcmNoL3g4 Ni9LY29uZmlnICAgICAgICAgICAgICAgfCAgIDI1ICstCiBkcml2ZXJzL2NoYXIvTWFrZWZpbGUg ICAgICAgICAgfCAgICAxIC0KIGRyaXZlcnMvY2hhci9pOGsuYyAgICAgICAgICAgICB8IDEwMDUg LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2h3bW9uL0tj b25maWcgICAgICAgICAgfCAgIDExICsKIGRyaXZlcnMvaHdtb24vTWFrZWZpbGUgICAgICAgICB8 ICAgIDEgKwogZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgMTAyNSArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA3IGZpbGVzIGNoYW5nZWQsIDEwNDkgaW5z ZXJ0aW9ucygrKSwgMTAyMyBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2NoYXIvaThrLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3 bW9uLmMKCi0tIAoxLjcuOS41CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3Jz Lm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5z b3Jz ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v2 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár @ 2015-03-29 12:57 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is better name then abbreviation i8k. For backward compatibility is added macro MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K compile option was not changed. This commit also adds me as maintainer of this new dell-smm-hwmon driver and remove Guenter Roeck from list who is implicit maintainer all hwmon drivers. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- MAINTAINERS | 4 +- drivers/char/Makefile | 1 - drivers/char/i8k.c | 1005 --------------------------------------- drivers/hwmon/Makefile | 1 + drivers/hwmon/dell-smm-hwmon.c | 1007 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1010 insertions(+), 1008 deletions(-) delete mode 100644 drivers/char/i8k.c create mode 100644 drivers/hwmon/dell-smm-hwmon.c diff --git a/MAINTAINERS b/MAINTAINERS index 88c09ca..e54a07e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3063,9 +3063,9 @@ S: Maintained F: drivers/platform/x86/dell-laptop.c DELL LAPTOP SMM DRIVER -M: Guenter Roeck <linux@roeck-us.net> +M: Pali Rohár <pali.rohar@gmail.com> S: Maintained -F: drivers/char/i8k.c +F: drivers/hwmon/dell-smm-hwmon.c F: include/uapi/linux/i8k.h DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) diff --git a/drivers/char/Makefile b/drivers/char/Makefile index d06cde26..1d9cf00 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -36,7 +36,6 @@ else obj-$(CONFIG_NVRAM) += nvram.o endif obj-$(CONFIG_TOSHIBA) += toshiba.o -obj-$(CONFIG_I8K) += i8k.o obj-$(CONFIG_DS1620) += ds1620.o obj-$(CONFIG_HW_RANDOM) += hw_random/ obj-$(CONFIG_PPDEV) += ppdev.o diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c deleted file mode 100644 index 24cc4ed..0000000 --- a/drivers/char/i8k.c +++ /dev/null @@ -1,1005 +0,0 @@ -/* - * i8k.c -- Linux driver for accessing the SMM BIOS on Dell laptops. - * - * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> - * - * Hwmon integration: - * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> - * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> - * Copyright (C) 2014 Pali Rohár <pali.rohar@gmail.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/delay.h> -#include <linux/module.h> -#include <linux/types.h> -#include <linux/init.h> -#include <linux/proc_fs.h> -#include <linux/seq_file.h> -#include <linux/dmi.h> -#include <linux/capability.h> -#include <linux/mutex.h> -#include <linux/hwmon.h> -#include <linux/hwmon-sysfs.h> -#include <linux/uaccess.h> -#include <linux/io.h> -#include <linux/sched.h> - -#include <linux/i8k.h> - -#define I8K_SMM_FN_STATUS 0x0025 -#define I8K_SMM_POWER_STATUS 0x0069 -#define I8K_SMM_SET_FAN 0x01a3 -#define I8K_SMM_GET_FAN 0x00a3 -#define I8K_SMM_GET_SPEED 0x02a3 -#define I8K_SMM_GET_FAN_TYPE 0x03a3 -#define I8K_SMM_GET_NOM_SPEED 0x04a3 -#define I8K_SMM_GET_TEMP 0x10a3 -#define I8K_SMM_GET_TEMP_TYPE 0x11a3 -#define I8K_SMM_GET_DELL_SIG1 0xfea3 -#define I8K_SMM_GET_DELL_SIG2 0xffa3 - -#define I8K_FAN_MULT 30 -#define I8K_FAN_MAX_RPM 30000 -#define I8K_MAX_TEMP 127 - -#define I8K_FN_NONE 0x00 -#define I8K_FN_UP 0x01 -#define I8K_FN_DOWN 0x02 -#define I8K_FN_MUTE 0x04 -#define I8K_FN_MASK 0x07 -#define I8K_FN_SHIFT 8 - -#define I8K_POWER_AC 0x05 -#define I8K_POWER_BATTERY 0x01 - -static DEFINE_MUTEX(i8k_mutex); -static char bios_version[4]; -static struct device *i8k_hwmon_dev; -static u32 i8k_hwmon_flags; -static uint i8k_fan_mult = I8K_FAN_MULT; -static uint i8k_pwm_mult; -static uint i8k_fan_max = I8K_FAN_HIGH; - -#define I8K_HWMON_HAVE_TEMP1 (1 << 0) -#define I8K_HWMON_HAVE_TEMP2 (1 << 1) -#define I8K_HWMON_HAVE_TEMP3 (1 << 2) -#define I8K_HWMON_HAVE_TEMP4 (1 << 3) -#define I8K_HWMON_HAVE_FAN1 (1 << 4) -#define I8K_HWMON_HAVE_FAN2 (1 << 5) - -MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); -MODULE_LICENSE("GPL"); - -static bool force; -module_param(force, bool, 0); -MODULE_PARM_DESC(force, "Force loading without checking for supported models"); - -static bool ignore_dmi; -module_param(ignore_dmi, bool, 0); -MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); - -static bool restricted; -module_param(restricted, bool, 0); -MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); - -static bool power_status; -module_param(power_status, bool, 0600); -MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); - -static uint fan_mult; -module_param(fan_mult, uint, 0); -MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); - -static uint fan_max; -module_param(fan_max, uint, 0); -MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); - -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - -struct smm_regs { - unsigned int eax; - unsigned int ebx __packed; - unsigned int ecx __packed; - unsigned int edx __packed; - unsigned int esi __packed; - unsigned int edi __packed; -}; - -static inline const char *i8k_get_dmi_data(int field) -{ - const char *dmi_data = dmi_get_system_info(field); - - return dmi_data && *dmi_data ? dmi_data : "?"; -} - -/* - * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. - */ -static int i8k_smm(struct smm_regs *regs) -{ - int rc; - int eax = regs->eax; - cpumask_var_t old_mask; - - /* SMM requires CPU 0 */ - if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) - return -ENOMEM; - cpumask_copy(old_mask, ¤t->cpus_allowed); - rc = set_cpus_allowed_ptr(current, cpumask_of(0)); - if (rc) - goto out; - if (smp_processor_id() != 0) { - rc = -EBUSY; - goto out; - } - -#if defined(CONFIG_X86_64) - asm volatile("pushq %%rax\n\t" - "movl 0(%%rax),%%edx\n\t" - "pushq %%rdx\n\t" - "movl 4(%%rax),%%ebx\n\t" - "movl 8(%%rax),%%ecx\n\t" - "movl 12(%%rax),%%edx\n\t" - "movl 16(%%rax),%%esi\n\t" - "movl 20(%%rax),%%edi\n\t" - "popq %%rax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgq %%rax,(%%rsp)\n\t" - "movl %%ebx,4(%%rax)\n\t" - "movl %%ecx,8(%%rax)\n\t" - "movl %%edx,12(%%rax)\n\t" - "movl %%esi,16(%%rax)\n\t" - "movl %%edi,20(%%rax)\n\t" - "popq %%rdx\n\t" - "movl %%edx,0(%%rax)\n\t" - "pushfq\n\t" - "popq %%rax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#else - asm volatile("pushl %%eax\n\t" - "movl 0(%%eax),%%edx\n\t" - "push %%edx\n\t" - "movl 4(%%eax),%%ebx\n\t" - "movl 8(%%eax),%%ecx\n\t" - "movl 12(%%eax),%%edx\n\t" - "movl 16(%%eax),%%esi\n\t" - "movl 20(%%eax),%%edi\n\t" - "popl %%eax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgl %%eax,(%%esp)\n\t" - "movl %%ebx,4(%%eax)\n\t" - "movl %%ecx,8(%%eax)\n\t" - "movl %%edx,12(%%eax)\n\t" - "movl %%esi,16(%%eax)\n\t" - "movl %%edi,20(%%eax)\n\t" - "popl %%edx\n\t" - "movl %%edx,0(%%eax)\n\t" - "lahf\n\t" - "shrl $8,%%eax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#endif - if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) - rc = -EINVAL; - -out: - set_cpus_allowed_ptr(current, old_mask); - free_cpumask_var(old_mask); - return rc; -} - -/* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* - * Read the fan status. - */ -static int i8k_get_fan_status(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan speed in RPM. - */ -static int i8k_get_fan_speed(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Read the fan type. - */ -static int i8k_get_fan_type(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan nominal rpm for specific fan speed. - */ -static int i8k_get_fan_nominal_speed(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; - - regs.ebx = (fan & 0xff) | (speed << 8); - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Set the fan speed (off, low, high). Returns the new fan status. - */ -static int i8k_set_fan(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; - - speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); - regs.ebx = (fan & 0xff) | (speed << 8); - - return i8k_smm(®s) ? : i8k_get_fan_status(fan); -} - -static int i8k_get_temp_type(int sensor) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; - - regs.ebx = sensor & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the cpu temperature. - */ -static int _i8k_get_temp(int sensor) -{ - struct smm_regs regs = { - .eax = I8K_SMM_GET_TEMP, - .ebx = sensor & 0xff, - }; - - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -static int i8k_get_temp(int sensor) -{ - int temp = _i8k_get_temp(sensor); - - /* - * Sometimes the temperature sensor returns 0x99, which is out of range. - * In this case we retry (once) before returning an error. - # 1003655137 00000058 00005a4b - # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees - # 1003655139 00000054 00005c52 - */ - if (temp == 0x99) { - msleep(100); - temp = _i8k_get_temp(sensor); - } - /* - * Return -ENODATA for all invalid temperatures. - * - * Known instances are the 0x99 value as seen above as well as - * 0xc1 (193), which may be returned when trying to read the GPU - * temperature if the system supports a GPU and it is currently - * turned off. - */ - if (temp > I8K_MAX_TEMP) - return -ENODATA; - - return temp; -} - -static int i8k_get_dell_signature(int req_fn) -{ - struct smm_regs regs = { .eax = req_fn, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; -} - -static int -i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) -{ - int val = 0; - int speed; - unsigned char buff[16]; - int __user *argp = (int __user *)arg; - - if (!argp) - return -EINVAL; - - switch (cmd) { - case I8K_BIOS_VERSION: - val = (bios_version[0] << 16) | - (bios_version[1] << 8) | bios_version[2]; - break; - - case I8K_MACHINE_ID: - memset(buff, 0, 16); - strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - sizeof(buff)); - break; - - case I8K_FN_STATUS: - val = i8k_get_fn_status(); - break; - - case I8K_POWER_STATUS: - val = i8k_get_power_status(); - break; - - case I8K_GET_TEMP: - val = i8k_get_temp(0); - break; - - case I8K_GET_SPEED: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_speed(val); - break; - - case I8K_GET_FAN: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_status(val); - break; - - case I8K_SET_FAN: - if (restricted && !capable(CAP_SYS_ADMIN)) - return -EPERM; - - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - if (copy_from_user(&speed, argp + 1, sizeof(int))) - return -EFAULT; - - val = i8k_set_fan(val, speed); - break; - - default: - return -EINVAL; - } - - if (val < 0) - return val; - - switch (cmd) { - case I8K_BIOS_VERSION: - if (copy_to_user(argp, &val, 4)) - return -EFAULT; - - break; - case I8K_MACHINE_ID: - if (copy_to_user(argp, buff, 16)) - return -EFAULT; - - break; - default: - if (copy_to_user(argp, &val, sizeof(int))) - return -EFAULT; - - break; - } - - return 0; -} - -static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) -{ - long ret; - - mutex_lock(&i8k_mutex); - ret = i8k_ioctl_unlocked(fp, cmd, arg); - mutex_unlock(&i8k_mutex); - - return ret; -} - -/* - * Print the information for /proc/i8k. - */ -static int i8k_proc_show(struct seq_file *seq, void *offset) -{ - int fn_key, cpu_temp, ac_power; - int left_fan, right_fan, left_speed, right_speed; - - cpu_temp = i8k_get_temp(0); /* 11100 µs */ - left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ - right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ - left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ - right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ - fn_key = i8k_get_fn_status(); /* 750 µs */ - if (power_status) - ac_power = i8k_get_power_status(); /* 14700 µs */ - else - ac_power = -1; - - /* - * Info: - * - * 1) Format version (this will change if format changes) - * 2) BIOS version - * 3) BIOS machine ID - * 4) Cpu temperature - * 5) Left fan status - * 6) Right fan status - * 7) Left fan speed - * 8) Right fan speed - * 9) AC power - * 10) Fn Key status - */ - return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", - I8K_PROC_FMT, - bios_version, - i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - cpu_temp, - left_fan, right_fan, left_speed, right_speed, - ac_power, fn_key); -} - -static int i8k_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, i8k_proc_show, NULL); -} - - -/* - * Hwmon interface - */ - -static ssize_t i8k_hwmon_show_temp_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "CPU", - "GPU", - "SODIMM", - "Other", - "Ambient", - "Other", - }; - int index = to_sensor_dev_attr(devattr)->index; - int type; - - type = i8k_get_temp_type(index); - if (type < 0) - return type; - if (type >= ARRAY_SIZE(labels)) - type = ARRAY_SIZE(labels) - 1; - return sprintf(buf, "%s\n", labels[type]); -} - -static ssize_t i8k_hwmon_show_temp(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int temp; - - temp = i8k_get_temp(index); - if (temp < 0) - return temp; - return sprintf(buf, "%d\n", temp * 1000); -} - -static ssize_t i8k_hwmon_show_fan_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "Processor Fan", - "Motherboard Fan", - "Video Fan", - "Power Supply Fan", - "Chipset Fan", - "Other Fan", - }; - int index = to_sensor_dev_attr(devattr)->index; - bool dock = false; - int type; - - type = i8k_get_fan_type(index); - if (type < 0) - return type; - - if (type & 0x10) { - dock = true; - type &= 0x0F; - } - - if (type >= ARRAY_SIZE(labels)) - type = (ARRAY_SIZE(labels) - 1); - - return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); -} - -static ssize_t i8k_hwmon_show_fan(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int fan_speed; - - fan_speed = i8k_get_fan_speed(index); - if (fan_speed < 0) - return fan_speed; - return sprintf(buf, "%d\n", fan_speed); -} - -static ssize_t i8k_hwmon_show_pwm(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int status; - - status = i8k_get_fan_status(index); - if (status < 0) - return -EIO; - return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); -} - -static ssize_t i8k_hwmon_set_pwm(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int index = to_sensor_dev_attr(attr)->index; - unsigned long val; - int err; - - err = kstrtoul(buf, 10, &val); - if (err) - return err; - val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); - - mutex_lock(&i8k_mutex); - err = i8k_set_fan(index, val); - mutex_unlock(&i8k_mutex); - - return err < 0 ? -EIO : count; -} - -static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); -static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); -static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); -static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 2); -static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); -static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 3); -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); -static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 0); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, - 1); -static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 1); - -static struct attribute *i8k_attrs[] = { - &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ - &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ - &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ - &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ - &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ - &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ - &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ - &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ - &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ - &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ - &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ - &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ - &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ - &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ - NULL -}; - -static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, - int index) -{ - if (index >= 0 && index <= 1 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) - return 0; - if (index >= 2 && index <= 3 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) - return 0; - if (index >= 4 && index <= 5 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) - return 0; - if (index >= 6 && index <= 7 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) - return 0; - if (index >= 8 && index <= 10 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) - return 0; - if (index >= 11 && index <= 13 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) - return 0; - - return attr->mode; -} - -static const struct attribute_group i8k_group = { - .attrs = i8k_attrs, - .is_visible = i8k_is_visible, -}; -__ATTRIBUTE_GROUPS(i8k); - -static int __init i8k_init_hwmon(void) -{ - int err; - - i8k_hwmon_flags = 0; - - /* CPU temperature attributes, if temperature type is OK */ - err = i8k_get_temp_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; - /* check for additional temperature sensors */ - err = i8k_get_temp_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; - err = i8k_get_temp_type(2); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; - err = i8k_get_temp_type(3); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; - - /* First fan attributes, if fan type is OK */ - err = i8k_get_fan_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; - - /* Second fan attributes, if fan type is OK */ - err = i8k_get_fan_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); - if (IS_ERR(i8k_hwmon_dev)) { - err = PTR_ERR(i8k_hwmon_dev); - i8k_hwmon_dev = NULL; - pr_err("hwmon registration failed (%d)\n", err); - return err; - } - return 0; -} - -struct i8k_config_data { - uint fan_mult; - uint fan_max; -}; - -enum i8k_configs { - DELL_LATITUDE_D520, - DELL_PRECISION_490, - DELL_STUDIO, - DELL_XPS, -}; - -static const struct i8k_config_data i8k_config_data[] = { - [DELL_LATITUDE_D520] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_PRECISION_490] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_STUDIO] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, - [DELL_XPS] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, -}; - -static struct dmi_system_id i8k_dmi_table[] __initdata = { - { - .ident = "Dell Inspiron", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { - .ident = "Dell Inspiron 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude D520", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), - }, - .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], - }, - { - .ident = "Dell Latitude 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { /* UK Inspiron 6400 */ - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), - }, - }, - { - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), - }, - }, - { - .ident = "Dell Precision 490", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, - "Precision WorkStation 490"), - }, - .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], - }, - { - .ident = "Dell Precision", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), - }, - }, - { - .ident = "Dell Vostro", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), - }, - }, - { - .ident = "Dell XPS421", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), - }, - }, - { - .ident = "Dell Studio", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), - }, - .driver_data = (void *)&i8k_config_data[DELL_STUDIO], - }, - { - .ident = "Dell XPS 13", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { - .ident = "Dell XPS M140", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { } -}; - -MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); - -/* - * Probe for the presence of a supported laptop. - */ -static int __init i8k_probe(void) -{ - const struct dmi_system_id *id; - int fan, ret; - - /* - * Get DMI information - */ - if (!dmi_check_system(i8k_dmi_table)) { - if (!ignore_dmi && !force) - return -ENODEV; - - pr_info("not running on a supported Dell system.\n"); - pr_info("vendor=%s, model=%s, version=%s\n", - i8k_get_dmi_data(DMI_SYS_VENDOR), - i8k_get_dmi_data(DMI_PRODUCT_NAME), - i8k_get_dmi_data(DMI_BIOS_VERSION)); - } - - strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), - sizeof(bios_version)); - - /* - * Get SMM Dell signature - */ - if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && - i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { - pr_err("unable to get SMM Dell signature\n"); - if (!force) - return -ENODEV; - } - - /* - * Set fan multiplier and maximal fan speed from dmi config - * Values specified in module parameters override values from dmi - */ - id = dmi_first_match(i8k_dmi_table); - if (id && id->driver_data) { - const struct i8k_config_data *conf = id->driver_data; - if (!fan_mult && conf->fan_mult) - fan_mult = conf->fan_mult; - if (!fan_max && conf->fan_max) - fan_max = conf->fan_max; - } - - i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ - i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); - - if (!fan_mult) { - /* - * Autodetect fan multiplier based on nominal rpm - * If fan reports rpm value too high then set multiplier to 1 - */ - for (fan = 0; fan < 2; ++fan) { - ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); - if (ret < 0) - continue; - if (ret > I8K_FAN_MAX_RPM) - i8k_fan_mult = 1; - break; - } - } else { - /* Fan multiplier was specified in module param or in dmi */ - i8k_fan_mult = fan_mult; - } - - return 0; -} - -static int __init i8k_init(void) -{ - struct proc_dir_entry *proc_i8k; - int err; - - /* Are we running on an supported laptop? */ - if (i8k_probe()) - return -ENODEV; - - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - - err = i8k_init_hwmon(); - if (err) - goto exit_remove_proc; - - return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; -} - -static void __exit i8k_exit(void) -{ - hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); -} - -module_init(i8k_init); -module_exit(i8k_exit); diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 6c94147..1c3e458 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -155,6 +155,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o +obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c new file mode 100644 index 0000000..2b04e4f --- /dev/null +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -0,0 +1,1007 @@ +/* + * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops. + * + * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> + * + * Hwmon integration: + * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> + * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> + * Copyright (C) 2014, 2015 Pali Rohár <pali.rohar@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/types.h> +#include <linux/init.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/dmi.h> +#include <linux/capability.h> +#include <linux/mutex.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/uaccess.h> +#include <linux/io.h> +#include <linux/sched.h> + +#include <linux/i8k.h> + +#define I8K_SMM_FN_STATUS 0x0025 +#define I8K_SMM_POWER_STATUS 0x0069 +#define I8K_SMM_SET_FAN 0x01a3 +#define I8K_SMM_GET_FAN 0x00a3 +#define I8K_SMM_GET_SPEED 0x02a3 +#define I8K_SMM_GET_FAN_TYPE 0x03a3 +#define I8K_SMM_GET_NOM_SPEED 0x04a3 +#define I8K_SMM_GET_TEMP 0x10a3 +#define I8K_SMM_GET_TEMP_TYPE 0x11a3 +#define I8K_SMM_GET_DELL_SIG1 0xfea3 +#define I8K_SMM_GET_DELL_SIG2 0xffa3 + +#define I8K_FAN_MULT 30 +#define I8K_FAN_MAX_RPM 30000 +#define I8K_MAX_TEMP 127 + +#define I8K_FN_NONE 0x00 +#define I8K_FN_UP 0x01 +#define I8K_FN_DOWN 0x02 +#define I8K_FN_MUTE 0x04 +#define I8K_FN_MASK 0x07 +#define I8K_FN_SHIFT 8 + +#define I8K_POWER_AC 0x05 +#define I8K_POWER_BATTERY 0x01 + +static DEFINE_MUTEX(i8k_mutex); +static char bios_version[4]; +static struct device *i8k_hwmon_dev; +static u32 i8k_hwmon_flags; +static uint i8k_fan_mult = I8K_FAN_MULT; +static uint i8k_pwm_mult; +static uint i8k_fan_max = I8K_FAN_HIGH; + +#define I8K_HWMON_HAVE_TEMP1 (1 << 0) +#define I8K_HWMON_HAVE_TEMP2 (1 << 1) +#define I8K_HWMON_HAVE_TEMP3 (1 << 2) +#define I8K_HWMON_HAVE_TEMP4 (1 << 3) +#define I8K_HWMON_HAVE_FAN1 (1 << 4) +#define I8K_HWMON_HAVE_FAN2 (1 << 5) + +MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); +MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("i8k"); + +static bool force; +module_param(force, bool, 0); +MODULE_PARM_DESC(force, "Force loading without checking for supported models"); + +static bool ignore_dmi; +module_param(ignore_dmi, bool, 0); +MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); + +static bool restricted; +module_param(restricted, bool, 0); +MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); + +static bool power_status; +module_param(power_status, bool, 0600); +MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); + +static uint fan_mult; +module_param(fan_mult, uint, 0); +MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); + +static uint fan_max; +module_param(fan_max, uint, 0); +MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); + +static int i8k_open_fs(struct inode *inode, struct file *file); +static long i8k_ioctl(struct file *, unsigned int, unsigned long); + +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +struct smm_regs { + unsigned int eax; + unsigned int ebx __packed; + unsigned int ecx __packed; + unsigned int edx __packed; + unsigned int esi __packed; + unsigned int edi __packed; +}; + +static inline const char *i8k_get_dmi_data(int field) +{ + const char *dmi_data = dmi_get_system_info(field); + + return dmi_data && *dmi_data ? dmi_data : "?"; +} + +/* + * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. + */ +static int i8k_smm(struct smm_regs *regs) +{ + int rc; + int eax = regs->eax; + cpumask_var_t old_mask; + + /* SMM requires CPU 0 */ + if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) + return -ENOMEM; + cpumask_copy(old_mask, ¤t->cpus_allowed); + rc = set_cpus_allowed_ptr(current, cpumask_of(0)); + if (rc) + goto out; + if (smp_processor_id() != 0) { + rc = -EBUSY; + goto out; + } + +#if defined(CONFIG_X86_64) + asm volatile("pushq %%rax\n\t" + "movl 0(%%rax),%%edx\n\t" + "pushq %%rdx\n\t" + "movl 4(%%rax),%%ebx\n\t" + "movl 8(%%rax),%%ecx\n\t" + "movl 12(%%rax),%%edx\n\t" + "movl 16(%%rax),%%esi\n\t" + "movl 20(%%rax),%%edi\n\t" + "popq %%rax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgq %%rax,(%%rsp)\n\t" + "movl %%ebx,4(%%rax)\n\t" + "movl %%ecx,8(%%rax)\n\t" + "movl %%edx,12(%%rax)\n\t" + "movl %%esi,16(%%rax)\n\t" + "movl %%edi,20(%%rax)\n\t" + "popq %%rdx\n\t" + "movl %%edx,0(%%rax)\n\t" + "pushfq\n\t" + "popq %%rax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#else + asm volatile("pushl %%eax\n\t" + "movl 0(%%eax),%%edx\n\t" + "push %%edx\n\t" + "movl 4(%%eax),%%ebx\n\t" + "movl 8(%%eax),%%ecx\n\t" + "movl 12(%%eax),%%edx\n\t" + "movl 16(%%eax),%%esi\n\t" + "movl 20(%%eax),%%edi\n\t" + "popl %%eax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgl %%eax,(%%esp)\n\t" + "movl %%ebx,4(%%eax)\n\t" + "movl %%ecx,8(%%eax)\n\t" + "movl %%edx,12(%%eax)\n\t" + "movl %%esi,16(%%eax)\n\t" + "movl %%edi,20(%%eax)\n\t" + "popl %%edx\n\t" + "movl %%edx,0(%%eax)\n\t" + "lahf\n\t" + "shrl $8,%%eax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#endif + if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) + rc = -EINVAL; + +out: + set_cpus_allowed_ptr(current, old_mask); + free_cpumask_var(old_mask); + return rc; +} + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Read the fan status. + */ +static int i8k_get_fan_status(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan speed in RPM. + */ +static int i8k_get_fan_speed(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Read the fan type. + */ +static int i8k_get_fan_type(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan nominal rpm for specific fan speed. + */ +static int i8k_get_fan_nominal_speed(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; + + regs.ebx = (fan & 0xff) | (speed << 8); + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Set the fan speed (off, low, high). Returns the new fan status. + */ +static int i8k_set_fan(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; + + speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); + regs.ebx = (fan & 0xff) | (speed << 8); + + return i8k_smm(®s) ? : i8k_get_fan_status(fan); +} + +static int i8k_get_temp_type(int sensor) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; + + regs.ebx = sensor & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the cpu temperature. + */ +static int _i8k_get_temp(int sensor) +{ + struct smm_regs regs = { + .eax = I8K_SMM_GET_TEMP, + .ebx = sensor & 0xff, + }; + + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +static int i8k_get_temp(int sensor) +{ + int temp = _i8k_get_temp(sensor); + + /* + * Sometimes the temperature sensor returns 0x99, which is out of range. + * In this case we retry (once) before returning an error. + # 1003655137 00000058 00005a4b + # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees + # 1003655139 00000054 00005c52 + */ + if (temp == 0x99) { + msleep(100); + temp = _i8k_get_temp(sensor); + } + /* + * Return -ENODATA for all invalid temperatures. + * + * Known instances are the 0x99 value as seen above as well as + * 0xc1 (193), which may be returned when trying to read the GPU + * temperature if the system supports a GPU and it is currently + * turned off. + */ + if (temp > I8K_MAX_TEMP) + return -ENODATA; + + return temp; +} + +static int i8k_get_dell_signature(int req_fn) +{ + struct smm_regs regs = { .eax = req_fn, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; +} + +static int +i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) +{ + int val = 0; + int speed; + unsigned char buff[16]; + int __user *argp = (int __user *)arg; + + if (!argp) + return -EINVAL; + + switch (cmd) { + case I8K_BIOS_VERSION: + val = (bios_version[0] << 16) | + (bios_version[1] << 8) | bios_version[2]; + break; + + case I8K_MACHINE_ID: + memset(buff, 0, 16); + strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + sizeof(buff)); + break; + + case I8K_FN_STATUS: + val = i8k_get_fn_status(); + break; + + case I8K_POWER_STATUS: + val = i8k_get_power_status(); + break; + + case I8K_GET_TEMP: + val = i8k_get_temp(0); + break; + + case I8K_GET_SPEED: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_speed(val); + break; + + case I8K_GET_FAN: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_status(val); + break; + + case I8K_SET_FAN: + if (restricted && !capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + if (copy_from_user(&speed, argp + 1, sizeof(int))) + return -EFAULT; + + val = i8k_set_fan(val, speed); + break; + + default: + return -EINVAL; + } + + if (val < 0) + return val; + + switch (cmd) { + case I8K_BIOS_VERSION: + if (copy_to_user(argp, &val, 4)) + return -EFAULT; + + break; + case I8K_MACHINE_ID: + if (copy_to_user(argp, buff, 16)) + return -EFAULT; + + break; + default: + if (copy_to_user(argp, &val, sizeof(int))) + return -EFAULT; + + break; + } + + return 0; +} + +static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) +{ + long ret; + + mutex_lock(&i8k_mutex); + ret = i8k_ioctl_unlocked(fp, cmd, arg); + mutex_unlock(&i8k_mutex); + + return ret; +} + +/* + * Print the information for /proc/i8k. + */ +static int i8k_proc_show(struct seq_file *seq, void *offset) +{ + int fn_key, cpu_temp, ac_power; + int left_fan, right_fan, left_speed, right_speed; + + cpu_temp = i8k_get_temp(0); /* 11100 µs */ + left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ + right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ + left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ + right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ + fn_key = i8k_get_fn_status(); /* 750 µs */ + if (power_status) + ac_power = i8k_get_power_status(); /* 14700 µs */ + else + ac_power = -1; + + /* + * Info: + * + * 1) Format version (this will change if format changes) + * 2) BIOS version + * 3) BIOS machine ID + * 4) Cpu temperature + * 5) Left fan status + * 6) Right fan status + * 7) Left fan speed + * 8) Right fan speed + * 9) AC power + * 10) Fn Key status + */ + return seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", + I8K_PROC_FMT, + bios_version, + i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + cpu_temp, + left_fan, right_fan, left_speed, right_speed, + ac_power, fn_key); +} + +static int i8k_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, i8k_proc_show, NULL); +} + + +/* + * Hwmon interface + */ + +static ssize_t i8k_hwmon_show_temp_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "CPU", + "GPU", + "SODIMM", + "Other", + "Ambient", + "Other", + }; + int index = to_sensor_dev_attr(devattr)->index; + int type; + + type = i8k_get_temp_type(index); + if (type < 0) + return type; + if (type >= ARRAY_SIZE(labels)) + type = ARRAY_SIZE(labels) - 1; + return sprintf(buf, "%s\n", labels[type]); +} + +static ssize_t i8k_hwmon_show_temp(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int temp; + + temp = i8k_get_temp(index); + if (temp < 0) + return temp; + return sprintf(buf, "%d\n", temp * 1000); +} + +static ssize_t i8k_hwmon_show_fan_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "Processor Fan", + "Motherboard Fan", + "Video Fan", + "Power Supply Fan", + "Chipset Fan", + "Other Fan", + }; + int index = to_sensor_dev_attr(devattr)->index; + bool dock = false; + int type; + + type = i8k_get_fan_type(index); + if (type < 0) + return type; + + if (type & 0x10) { + dock = true; + type &= 0x0F; + } + + if (type >= ARRAY_SIZE(labels)) + type = (ARRAY_SIZE(labels) - 1); + + return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); +} + +static ssize_t i8k_hwmon_show_fan(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int fan_speed; + + fan_speed = i8k_get_fan_speed(index); + if (fan_speed < 0) + return fan_speed; + return sprintf(buf, "%d\n", fan_speed); +} + +static ssize_t i8k_hwmon_show_pwm(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int status; + + status = i8k_get_fan_status(index); + if (status < 0) + return -EIO; + return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); +} + +static ssize_t i8k_hwmon_set_pwm(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int index = to_sensor_dev_attr(attr)->index; + unsigned long val; + int err; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); + + mutex_lock(&i8k_mutex); + err = i8k_set_fan(index, val); + mutex_unlock(&i8k_mutex); + + return err < 0 ? -EIO : count; +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); +static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); +static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); +static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); +static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 3); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); +static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, + 1); +static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 1); + +static struct attribute *i8k_attrs[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ + &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ + &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ + &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ + &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ + &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ + &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ + &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ + &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ + &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ + &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ + &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ + &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ + &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ + NULL +}; + +static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, + int index) +{ + if (index >= 0 && index <= 1 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) + return 0; + if (index >= 2 && index <= 3 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) + return 0; + if (index >= 4 && index <= 5 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) + return 0; + if (index >= 6 && index <= 7 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) + return 0; + if (index >= 8 && index <= 10 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) + return 0; + if (index >= 11 && index <= 13 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) + return 0; + + return attr->mode; +} + +static const struct attribute_group i8k_group = { + .attrs = i8k_attrs, + .is_visible = i8k_is_visible, +}; +__ATTRIBUTE_GROUPS(i8k); + +static int __init i8k_init_hwmon(void) +{ + int err; + + i8k_hwmon_flags = 0; + + /* CPU temperature attributes, if temperature type is OK */ + err = i8k_get_temp_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; + /* check for additional temperature sensors */ + err = i8k_get_temp_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; + err = i8k_get_temp_type(2); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; + err = i8k_get_temp_type(3); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; + + /* First fan attributes, if fan type is OK */ + err = i8k_get_fan_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; + + /* Second fan attributes, if fan type is OK */ + err = i8k_get_fan_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; + + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, + i8k_groups); + if (IS_ERR(i8k_hwmon_dev)) { + err = PTR_ERR(i8k_hwmon_dev); + i8k_hwmon_dev = NULL; + pr_err("hwmon registration failed (%d)\n", err); + return err; + } + return 0; +} + +struct i8k_config_data { + uint fan_mult; + uint fan_max; +}; + +enum i8k_configs { + DELL_LATITUDE_D520, + DELL_PRECISION_490, + DELL_STUDIO, + DELL_XPS, +}; + +static const struct i8k_config_data i8k_config_data[] = { + [DELL_LATITUDE_D520] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_PRECISION_490] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_STUDIO] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, + [DELL_XPS] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, +}; + +static struct dmi_system_id i8k_dmi_table[] __initdata = { + { + .ident = "Dell Inspiron", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { + .ident = "Dell Inspiron 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude D520", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), + }, + .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], + }, + { + .ident = "Dell Latitude 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { /* UK Inspiron 6400 */ + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), + }, + }, + { + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), + }, + }, + { + .ident = "Dell Precision 490", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, + "Precision WorkStation 490"), + }, + .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], + }, + { + .ident = "Dell Precision", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), + }, + }, + { + .ident = "Dell Vostro", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), + }, + }, + { + .ident = "Dell XPS421", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), + }, + }, + { + .ident = "Dell Studio", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), + }, + .driver_data = (void *)&i8k_config_data[DELL_STUDIO], + }, + { + .ident = "Dell XPS 13", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { + .ident = "Dell XPS M140", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { } +}; + +MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); + +/* + * Probe for the presence of a supported laptop. + */ +static int __init i8k_probe(void) +{ + const struct dmi_system_id *id; + int fan, ret; + + /* + * Get DMI information + */ + if (!dmi_check_system(i8k_dmi_table)) { + if (!ignore_dmi && !force) + return -ENODEV; + + pr_info("not running on a supported Dell system.\n"); + pr_info("vendor=%s, model=%s, version=%s\n", + i8k_get_dmi_data(DMI_SYS_VENDOR), + i8k_get_dmi_data(DMI_PRODUCT_NAME), + i8k_get_dmi_data(DMI_BIOS_VERSION)); + } + + strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), + sizeof(bios_version)); + + /* + * Get SMM Dell signature + */ + if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && + i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { + pr_err("unable to get SMM Dell signature\n"); + if (!force) + return -ENODEV; + } + + /* + * Set fan multiplier and maximal fan speed from dmi config + * Values specified in module parameters override values from dmi + */ + id = dmi_first_match(i8k_dmi_table); + if (id && id->driver_data) { + const struct i8k_config_data *conf = id->driver_data; + if (!fan_mult && conf->fan_mult) + fan_mult = conf->fan_mult; + if (!fan_max && conf->fan_max) + fan_max = conf->fan_max; + } + + i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ + i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); + + if (!fan_mult) { + /* + * Autodetect fan multiplier based on nominal rpm + * If fan reports rpm value too high then set multiplier to 1 + */ + for (fan = 0; fan < 2; ++fan) { + ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); + if (ret < 0) + continue; + if (ret > I8K_FAN_MAX_RPM) + i8k_fan_mult = 1; + break; + } + } else { + /* Fan multiplier was specified in module param or in dmi */ + i8k_fan_mult = fan_mult; + } + + return 0; +} + +static int __init i8k_init(void) +{ + struct proc_dir_entry *proc_i8k; + int err; + + /* Are we running on an supported laptop? */ + if (i8k_probe()) + return -ENODEV; + + /* Register the proc entry */ + proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); + if (!proc_i8k) + return -ENOENT; + + err = i8k_init_hwmon(); + if (err) + goto exit_remove_proc; + + return 0; + + exit_remove_proc: + remove_proc_entry("i8k", NULL); + return err; +} + +static void __exit i8k_exit(void) +{ + hwmon_device_unregister(i8k_hwmon_dev); + remove_proc_entry("i8k", NULL); +} + +module_init(i8k_init); +module_exit(i8k_exit); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v2 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-03-29 12:57 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBjb21taXQgbW92ZXMgaThrIGRyaXZlciB0byBod21vbiB0cmVlIHVuZGVyIG5hbWUgZGVs bC1zbW0taHdtb24gd2hpY2ggaXMKYmV0dGVyIG5hbWUgdGhlbiBhYmJyZXZpYXRpb24gaThrLiBG b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpcyBhZGRlZCBtYWNybwpNT0RVTEVfQUxJQVMoImk4 ayIpIHNvIG1vZHByb2JlIHdpbGwgbG9hZCBkcml2ZXIgYWxzbyBvbGQgbmFtZSBpOGsuIENPTkZJ R19JOEsKY29tcGlsZSBvcHRpb24gd2FzIG5vdCBjaGFuZ2VkLgoKVGhpcyBjb21taXQgYWxzbyBh ZGRzIG1lIGFzIG1haW50YWluZXIgb2YgdGhpcyBuZXcgZGVsbC1zbW0taHdtb24gZHJpdmVyIGFu ZApyZW1vdmUgR3VlbnRlciBSb2VjayBmcm9tIGxpc3Qgd2hvIGlzIGltcGxpY2l0IG1haW50YWlu ZXIgYWxsIGh3bW9uIGRyaXZlcnMuCgpTaWduZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5y b2hhckBnbWFpbC5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgIHwgICAg NCArLQogZHJpdmVycy9jaGFyL01ha2VmaWxlICAgICAgICAgIHwgICAgMSAtCiBkcml2ZXJzL2No YXIvaThrLmMgICAgICAgICAgICAgfCAxMDA1IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgIHwgICAgMSArCiBkcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMgfCAxMDA3ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTAxMCBpbnNlcnRpb25zKCspLCAx MDA4IGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2hhci9pOGsuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwoKZGlmZiAt LWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggODhjMDljYS4uZTU0YTA3ZSAx MDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMwNjMsOSArMzA2 Myw5IEBAIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtbGFwdG9w LmMKIAogREVMTCBMQVBUT1AgU01NIERSSVZFUgotTToJR3VlbnRlciBSb2VjayA8bGludXhAcm9l Y2stdXMubmV0PgorTToJUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgogUzoJTWFp bnRhaW5lZAotRjoJZHJpdmVycy9jaGFyL2k4ay5jCitGOglkcml2ZXJzL2h3bW9uL2RlbGwtc21t LWh3bW9uLmMKIEY6CWluY2x1ZGUvdWFwaS9saW51eC9pOGsuaAogCiBERUxMIFNZU1RFTVMgTUFO QUdFTUVOVCBCQVNFIERSSVZFUiAoZGNkYmFzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01h a2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IGQwNmNkZTI2Li4xZDljZjAwIDEw MDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2Vm aWxlCkBAIC0zNiw3ICszNiw2IEBAIGVsc2UKICAgb2JqLSQoQ09ORklHX05WUkFNKQkrPSBudnJh bS5vCiBlbmRpZgogb2JqLSQoQ09ORklHX1RPU0hJQkEpCQkrPSB0b3NoaWJhLm8KLW9iai0kKENP TkZJR19JOEspCQkrPSBpOGsubwogb2JqLSQoQ09ORklHX0RTMTYyMCkJCSs9IGRzMTYyMC5vCiBv YmotJChDT05GSUdfSFdfUkFORE9NKQkJKz0gaHdfcmFuZG9tLwogb2JqLSQoQ09ORklHX1BQREVW KQkJKz0gcHBkZXYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2k4ay5jIGIvZHJpdmVycy9j aGFyL2k4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNjNGVkLi4wMDAwMDAw Ci0tLSBhL2RyaXZlcnMvY2hhci9pOGsuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMDUgKzAsMCBA QAotLyoKLSAqIGk4ay5jIC0tIExpbnV4IGRyaXZlciBmb3IgYWNjZXNzaW5nIHRoZSBTTU0gQklP UyBvbiBEZWxsIGxhcHRvcHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxICBNYXNzaW1vIERh bCBab3R0byA8ZHpAZGViaWFuLm9yZz4KLSAqCi0gKiBId21vbiBpbnRlZ3JhdGlvbjoKLSAqIENv cHlyaWdodCAoQykgMjAxMSAgSmVhbiBEZWx2YXJlIDxqZGVsdmFyZUBzdXNlLmRlPgotICogQ29w eXJpZ2h0IChDKSAyMDEzLCAyMDE0ICBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+ Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgIFBhbGkgUm9ow6FyIDxwYWxpLnJvaGFyQGdtYWlsLmNv bT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55 Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V Ci0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2Rl ZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90 eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2Zz Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4K LSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4K LSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+ Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5j bHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2k4ay5oPgotCi0jZGVmaW5l IEk4S19TTU1fRk5fU1RBVFVTCTB4MDAyNQotI2RlZmluZSBJOEtfU01NX1BPV0VSX1NUQVRVUwkw eDAwNjkKLSNkZWZpbmUgSThLX1NNTV9TRVRfRkFOCQkweDAxYTMKLSNkZWZpbmUgSThLX1NNTV9H RVRfRkFOCQkweDAwYTMKLSNkZWZpbmUgSThLX1NNTV9HRVRfU1BFRUQJMHgwMmEzCi0jZGVmaW5l IEk4S19TTU1fR0VUX0ZBTl9UWVBFCTB4MDNhMwotI2RlZmluZSBJOEtfU01NX0dFVF9OT01fU1BF RUQJMHgwNGEzCi0jZGVmaW5lIEk4S19TTU1fR0VUX1RFTVAJMHgxMGEzCi0jZGVmaW5lIEk4S19T TU1fR0VUX1RFTVBfVFlQRQkweDExYTMKLSNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcxCTB4 ZmVhMwotI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRzIJMHhmZmEzCi0KLSNkZWZpbmUgSThL X0ZBTl9NVUxUCQkzMAotI2RlZmluZSBJOEtfRkFOX01BWF9SUE0JCTMwMDAwCi0jZGVmaW5lIEk4 S19NQVhfVEVNUAkJMTI3Ci0KLSNkZWZpbmUgSThLX0ZOX05PTkUJCTB4MDAKLSNkZWZpbmUgSThL X0ZOX1VQCQkweDAxCi0jZGVmaW5lIEk4S19GTl9ET1dOCQkweDAyCi0jZGVmaW5lIEk4S19GTl9N VVRFCQkweDA0Ci0jZGVmaW5lIEk4S19GTl9NQVNLCQkweDA3Ci0jZGVmaW5lIEk4S19GTl9TSElG VAkJOAotCi0jZGVmaW5lIEk4S19QT1dFUl9BQwkJMHgwNQotI2RlZmluZSBJOEtfUE9XRVJfQkFU VEVSWQkweDAxCi0KLXN0YXRpYyBERUZJTkVfTVVURVgoaThrX211dGV4KTsKLXN0YXRpYyBjaGFy IGJpb3NfdmVyc2lvbls0XTsKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICppOGtfaHdtb25fZGV2Owot c3RhdGljIHUzMiBpOGtfaHdtb25fZmxhZ3M7Ci1zdGF0aWMgdWludCBpOGtfZmFuX211bHQgPSBJ OEtfRkFOX01VTFQ7Ci1zdGF0aWMgdWludCBpOGtfcHdtX211bHQ7Ci1zdGF0aWMgdWludCBpOGtf ZmFuX21heCA9IEk4S19GQU5fSElHSDsKLQotI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1QMQko MSA8PCAwKQotI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1QMgkoMSA8PCAxKQotI2RlZmluZSBJ OEtfSFdNT05fSEFWRV9URU1QMwkoMSA8PCAyKQotI2RlZmluZSBJOEtfSFdNT05fSEFWRV9URU1Q NAkoMSA8PCAzKQotI2RlZmluZSBJOEtfSFdNT05fSEFWRV9GQU4xCSgxIDw8IDQpCi0jZGVmaW5l IEk4S19IV01PTl9IQVZFX0ZBTjIJKDEgPDwgNSkKLQotTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBE YWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBm b3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcyIpOwotTU9EVUxFX0xJQ0VOU0Uo IkdQTCIpOwotCi1zdGF0aWMgYm9vbCBmb3JjZTsKLW1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwg MCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9hZGluZyB3aXRob3V0IGNoZWNr aW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7Ci0KLXN0YXRpYyBib29sIGlnbm9yZV9kbWk7Ci1t b2R1bGVfcGFyYW0oaWdub3JlX2RtaSwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlnbm9y ZV9kbWksICJDb250aW51ZSBwcm9iaW5nIGhhcmR3YXJlIGV2ZW4gaWYgRE1JIGRhdGEgZG9lcyBu b3QgbWF0Y2giKTsKLQotc3RhdGljIGJvb2wgcmVzdHJpY3RlZDsKLW1vZHVsZV9wYXJhbShyZXN0 cmljdGVkLCBib29sLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MocmVzdHJpY3RlZCwgIkFsbG93IGZh biBjb250cm9sIGlmIFNZU19BRE1JTiBjYXBhYmlsaXR5IHNldCIpOwotCi1zdGF0aWMgYm9vbCBw b3dlcl9zdGF0dXM7Ci1tb2R1bGVfcGFyYW0ocG93ZXJfc3RhdHVzLCBib29sLCAwNjAwKTsKLU1P RFVMRV9QQVJNX0RFU0MocG93ZXJfc3RhdHVzLCAiUmVwb3J0IHBvd2VyIHN0YXR1cyBpbiAvcHJv Yy9pOGsiKTsKLQotc3RhdGljIHVpbnQgZmFuX211bHQ7Ci1tb2R1bGVfcGFyYW0oZmFuX211bHQs IHVpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhmYW5fbXVsdCwgIkZhY3RvciB0byBtdWx0aXBs eSBmYW4gc3BlZWQgd2l0aCAoZGVmYXVsdDogYXV0b2RldGVjdCkiKTsKLQotc3RhdGljIHVpbnQg ZmFuX21heDsKLW1vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RF U0MoZmFuX21heCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBzcGVlZCAoZGVmYXVsdDogYXV0 b2RldGVjdCkiKTsKLQotc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2Rl LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0IGZpbGUg KiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBm aWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5v cGVuCQk9IGk4a19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2Vx X2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0g aThrX2lvY3RsLAotfTsKLQotc3RydWN0IHNtbV9yZWdzIHsKLQl1bnNpZ25lZCBpbnQgZWF4Owot CXVuc2lnbmVkIGludCBlYnggX19wYWNrZWQ7Ci0JdW5zaWduZWQgaW50IGVjeCBfX3BhY2tlZDsK LQl1bnNpZ25lZCBpbnQgZWR4IF9fcGFja2VkOwotCXVuc2lnbmVkIGludCBlc2kgX19wYWNrZWQ7 Ci0JdW5zaWduZWQgaW50IGVkaSBfX3BhY2tlZDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3Qg Y2hhciAqaThrX2dldF9kbWlfZGF0YShpbnQgZmllbGQpCi17Ci0JY29uc3QgY2hhciAqZG1pX2Rh dGEgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKGZpZWxkKTsKLQotCXJldHVybiBkbWlfZGF0YSAmJiAq ZG1pX2RhdGEgPyBkbWlfZGF0YSA6ICI/IjsKLX0KLQotLyoKLSAqIENhbGwgdGhlIFN5c3RlbSBN YW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgot ICovCi1zdGF0aWMgaW50IGk4a19zbW0oc3RydWN0IHNtbV9yZWdzICpyZWdzKQotewotCWludCBy YzsKLQlpbnQgZWF4ID0gcmVncy0+ZWF4OwotCWNwdW1hc2tfdmFyX3Qgb2xkX21hc2s7Ci0KLQkv KiBTTU0gcmVxdWlyZXMgQ1BVIDAgKi8KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZvbGRfbWFz aywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCWNwdW1hc2tfY29weShvbGRfbWFz aywgJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCk7Ci0JcmMgPSBzZXRfY3B1c19hbGxvd2VkX3B0cihj dXJyZW50LCBjcHVtYXNrX29mKDApKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCWlmIChzbXBf cHJvY2Vzc29yX2lkKCkgIT0gMCkgewotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQot Ci0jaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQotCWFzbSB2b2xhdGlsZSgicHVzaHEgJSVyYXhc blx0IgotCQkibW92bCAwKCUlcmF4KSwlJWVkeFxuXHQiCi0JCSJwdXNocSAlJXJkeFxuXHQiCi0J CSJtb3ZsIDQoJSVyYXgpLCUlZWJ4XG5cdCIKLQkJIm1vdmwgOCglJXJheCksJSVlY3hcblx0Igot CQkibW92bCAxMiglJXJheCksJSVlZHhcblx0IgotCQkibW92bCAxNiglJXJheCksJSVlc2lcblx0 IgotCQkibW92bCAyMCglJXJheCksJSVlZGlcblx0IgotCQkicG9wcSAlJXJheFxuXHQiCi0JCSJv dXQgJSVhbCwkMHhiMlxuXHQiCi0JCSJvdXQgJSVhbCwkMHg4NFxuXHQiCi0JCSJ4Y2hncSAlJXJh eCwoJSVyc3ApXG5cdCIKLQkJIm1vdmwgJSVlYngsNCglJXJheClcblx0IgotCQkibW92bCAlJWVj eCw4KCUlcmF4KVxuXHQiCi0JCSJtb3ZsICUlZWR4LDEyKCUlcmF4KVxuXHQiCi0JCSJtb3ZsICUl ZXNpLDE2KCUlcmF4KVxuXHQiCi0JCSJtb3ZsICUlZWRpLDIwKCUlcmF4KVxuXHQiCi0JCSJwb3Bx ICUlcmR4XG5cdCIKLQkJIm1vdmwgJSVlZHgsMCglJXJheClcblx0IgotCQkicHVzaGZxXG5cdCIK LQkJInBvcHEgJSVyYXhcblx0IgotCQkiYW5kbCAkMSwlJWVheFxuIgotCQk6ICI9YSIocmMpCi0J CTogICAgImEiKHJlZ3MpCi0JCTogICAgIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAi JWVkaSIsICJtZW1vcnkiKTsKLSNlbHNlCi0JYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVheFxuXHQi Ci0JICAgICJtb3ZsIDAoJSVlYXgpLCUlZWR4XG5cdCIKLQkgICAgInB1c2ggJSVlZHhcblx0Igot CSAgICAibW92bCA0KCUlZWF4KSwlJWVieFxuXHQiCi0JICAgICJtb3ZsIDgoJSVlYXgpLCUlZWN4 XG5cdCIKLQkgICAgIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIKLQkgICAgIm1vdmwgMTYoJSVl YXgpLCUlZXNpXG5cdCIKLQkgICAgIm1vdmwgMjAoJSVlYXgpLCUlZWRpXG5cdCIKLQkgICAgInBv cGwgJSVlYXhcblx0IgotCSAgICAib3V0ICUlYWwsJDB4YjJcblx0IgotCSAgICAib3V0ICUlYWws JDB4ODRcblx0IgotCSAgICAieGNoZ2wgJSVlYXgsKCUlZXNwKVxuXHQiCi0JICAgICJtb3ZsICUl ZWJ4LDQoJSVlYXgpXG5cdCIKLQkgICAgIm1vdmwgJSVlY3gsOCglJWVheClcblx0IgotCSAgICAi bW92bCAlJWVkeCwxMiglJWVheClcblx0IgotCSAgICAibW92bCAlJWVzaSwxNiglJWVheClcblx0 IgotCSAgICAibW92bCAlJWVkaSwyMCglJWVheClcblx0IgotCSAgICAicG9wbCAlJWVkeFxuXHQi Ci0JICAgICJtb3ZsICUlZWR4LDAoJSVlYXgpXG5cdCIKLQkgICAgImxhaGZcblx0IgotCSAgICAi c2hybCAkOCwlJWVheFxuXHQiCi0JICAgICJhbmRsICQxLCUlZWF4XG4iCi0JICAgIDogIj1hIihy YykKLQkgICAgOiAgICAiYSIocmVncykKLQkgICAgOiAgICAiJWVieCIsICIlZWN4IiwgIiVlZHgi LCAiJWVzaSIsICIlZWRpIiwgIm1lbW9yeSIpOwotI2VuZGlmCi0JaWYgKHJjICE9IDAgfHwgKHJl Z3MtPmVheCAmIDB4ZmZmZikgPT0gMHhmZmZmIHx8IHJlZ3MtPmVheCA9PSBlYXgpCi0JCXJjID0g LUVJTlZBTDsKLQotb3V0OgotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG9sZF9tYXNr KTsKLQlmcmVlX2NwdW1hc2tfdmFyKG9sZF9tYXNrKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0g KiBSZWFkIHRoZSBGbiBrZXkgc3RhdHVzLgotICovCi1zdGF0aWMgaW50IGk4a19nZXRfZm5fc3Rh dHVzKHZvaWQpCi17Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0ZO X1NUQVRVUywgfTsKLQlpbnQgcmM7Ci0KLQlyYyA9IGk4a19zbW0oJnJlZ3MpOwotCWlmIChyYyA8 IDApCi0JCXJldHVybiByYzsKLQotCXN3aXRjaCAoKHJlZ3MuZWF4ID4+IEk4S19GTl9TSElGVCkg JiBJOEtfRk5fTUFTSykgewotCWNhc2UgSThLX0ZOX1VQOgotCQlyZXR1cm4gSThLX1ZPTF9VUDsK LQljYXNlIEk4S19GTl9ET1dOOgotCQlyZXR1cm4gSThLX1ZPTF9ET1dOOwotCWNhc2UgSThLX0ZO X01VVEU6Ci0JCXJldHVybiBJOEtfVk9MX01VVEU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0J fQotfQotCi0vKgotICogUmVhZCB0aGUgcG93ZXIgc3RhdHVzLgotICovCi1zdGF0aWMgaW50IGk4 a19nZXRfcG93ZXJfc3RhdHVzKHZvaWQpCi17Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5l YXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUywgfTsKLQlpbnQgcmM7Ci0KLQlyYyA9IGk4a19zbW0o JnJlZ3MpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiAocmVncy5lYXgg JiAweGZmKSA9PSBJOEtfUE9XRVJfQUMgPyBJOEtfQUMgOiBJOEtfQkFUVEVSWTsKLX0KLQotLyoK LSAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQgaThrX2dldF9mYW5fc3Rh dHVzKGludCBmYW4pCi17Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01N X0dFVF9GQU4sIH07Ci0KLQlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0JcmV0dXJuIGk4a19zbW0o JnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBmYW4gc3Bl ZWQgaW4gUlBNLgotICovCi1zdGF0aWMgaW50IGk4a19nZXRfZmFuX3NwZWVkKGludCBmYW4pCi17 Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9TUEVFRCwgfTsK LQotCXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKLQlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IChy ZWdzLmVheCAmIDB4ZmZmZikgKiBpOGtfZmFuX211bHQ7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBm YW4gdHlwZS4KLSAqLwotc3RhdGljIGludCBpOGtfZ2V0X2Zhbl90eXBlKGludCBmYW4pCi17Ci0J c3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9GQU5fVFlQRSwgfTsK LQotCXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKLQlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IHJl Z3MuZWF4ICYgMHhmZjsKLX0KLQotLyoKLSAqIFJlYWQgdGhlIGZhbiBub21pbmFsIHJwbSBmb3Ig c3BlY2lmaWMgZmFuIHNwZWVkLgotICovCi1zdGF0aWMgaW50IGk4a19nZXRfZmFuX25vbWluYWxf c3BlZWQoaW50IGZhbiwgaW50IHNwZWVkKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAu ZWF4ID0gSThLX1NNTV9HRVRfTk9NX1NQRUVELCB9OwotCi0JcmVncy5lYnggPSAoZmFuICYgMHhm ZikgfCAoc3BlZWQgPDwgOCk7Ci0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiAocmVncy5lYXgg JiAweGZmZmYpICogaThrX2Zhbl9tdWx0OwotfQotCi0vKgotICogU2V0IHRoZSBmYW4gc3BlZWQg KG9mZiwgbG93LCBoaWdoKS4gUmV0dXJucyB0aGUgbmV3IGZhbiBzdGF0dXMuCi0gKi8KLXN0YXRp YyBpbnQgaThrX3NldF9mYW4oaW50IGZhbiwgaW50IHNwZWVkKQotewotCXN0cnVjdCBzbW1fcmVn cyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9TRVRfRkFOLCB9OwotCi0Jc3BlZWQgPSAoc3BlZWQg PCAwKSA/IDAgOiAoKHNwZWVkID4gaThrX2Zhbl9tYXgpID8gaThrX2Zhbl9tYXggOiBzcGVlZCk7 Ci0JcmVncy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwgOCk7Ci0KLQlyZXR1cm4gaThr X3NtbSgmcmVncykgPyA6IGk4a19nZXRfZmFuX3N0YXR1cyhmYW4pOwotfQotCi1zdGF0aWMgaW50 IGk4a19nZXRfdGVtcF90eXBlKGludCBzZW5zb3IpCi17Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3Mg PSB7IC5lYXggPSBJOEtfU01NX0dFVF9URU1QX1RZUEUsIH07Ci0KLQlyZWdzLmVieCA9IHNlbnNv ciAmIDB4ZmY7Ci0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Ci19 Ci0KLS8qCi0gKiBSZWFkIHRoZSBjcHUgdGVtcGVyYXR1cmUuCi0gKi8KLXN0YXRpYyBpbnQgX2k4 a19nZXRfdGVtcChpbnQgc2Vuc29yKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0gewotCQku ZWF4ID0gSThLX1NNTV9HRVRfVEVNUCwKLQkJLmVieCA9IHNlbnNvciAmIDB4ZmYsCi0JfTsKLQot CXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwotfQotCi1zdGF0aWMg aW50IGk4a19nZXRfdGVtcChpbnQgc2Vuc29yKQotewotCWludCB0ZW1wID0gX2k4a19nZXRfdGVt cChzZW5zb3IpOwotCi0JLyoKLQkgKiBTb21ldGltZXMgdGhlIHRlbXBlcmF0dXJlIHNlbnNvciBy ZXR1cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KLQkgKiBJbiB0aGlzIGNhc2Ugd2Ug cmV0cnkgKG9uY2UpIGJlZm9yZSByZXR1cm5pbmcgYW4gZXJyb3IuCi0JICMgMTAwMzY1NTEzNyAw MDAwMDA1OCAwMDAwNWE0YgotCSAjIDEwMDM2NTUxMzggMDAwMDAwOTkgMDAwMDNhODAgPC0tLSAw eDk5ID0gMTUzIGRlZ3JlZXMKLQkgIyAxMDAzNjU1MTM5IDAwMDAwMDU0IDAwMDA1YzUyCi0JICov Ci0JaWYgKHRlbXAgPT0gMHg5OSkgewotCQltc2xlZXAoMTAwKTsKLQkJdGVtcCA9IF9pOGtfZ2V0 X3RlbXAoc2Vuc29yKTsKLQl9Ci0JLyoKLQkgKiBSZXR1cm4gLUVOT0RBVEEgZm9yIGFsbCBpbnZh bGlkIHRlbXBlcmF0dXJlcy4KLQkgKgotCSAqIEtub3duIGluc3RhbmNlcyBhcmUgdGhlIDB4OTkg dmFsdWUgYXMgc2VlbiBhYm92ZSBhcyB3ZWxsIGFzCi0JICogMHhjMSAoMTkzKSwgd2hpY2ggbWF5 IGJlIHJldHVybmVkIHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIEdQVQotCSAqIHRlbXBlcmF0dXJl IGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgYSBHUFUgYW5kIGl0IGlzIGN1cnJlbnRseQotCSAqIHR1 cm5lZCBvZmYuCi0JICovCi0JaWYgKHRlbXAgPiBJOEtfTUFYX1RFTVApCi0JCXJldHVybiAtRU5P REFUQTsKLQotCXJldHVybiB0ZW1wOwotfQotCi1zdGF0aWMgaW50IGk4a19nZXRfZGVsbF9zaWdu YXR1cmUoaW50IHJlcV9mbikKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IHJl cV9mbiwgfTsKLQlpbnQgcmM7Ci0KLQlyYyA9IGk4a19zbW0oJnJlZ3MpOwotCWlmIChyYyA8IDAp Ci0JCXJldHVybiByYzsKLQotCXJldHVybiByZWdzLmVheCA9PSAxMTQ1NjUxNTI3ICYmIHJlZ3Mu ZWR4ID09IDExNDUzOTIyMDQgPyAwIDogLTE7Ci19Ci0KLXN0YXRpYyBpbnQKLWk4a19pb2N0bF91 bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcg YXJnKQotewotCWludCB2YWwgPSAwOwotCWludCBzcGVlZDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZmZb MTZdOwotCWludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9fdXNlciAqKWFyZzsKLQotCWlmICghYXJn cCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSThLX0JJT1Nf VkVSU0lPTjoKLQkJdmFsID0gKGJpb3NfdmVyc2lvblswXSA8PCAxNikgfAotCQkJCShiaW9zX3Zl cnNpb25bMV0gPDwgOCkgfCBiaW9zX3ZlcnNpb25bMl07Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtf TUFDSElORV9JRDoKLQkJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKLQkJc3RybGNweShidWZmLCBpOGtf Z2V0X2RtaV9kYXRhKERNSV9QUk9EVUNUX1NFUklBTCksCi0JCQlzaXplb2YoYnVmZikpOwotCQli cmVhazsKLQotCWNhc2UgSThLX0ZOX1NUQVRVUzoKLQkJdmFsID0gaThrX2dldF9mbl9zdGF0dXMo KTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk4S19QT1dFUl9TVEFUVVM6Ci0JCXZhbCA9IGk4a19nZXRf cG93ZXJfc3RhdHVzKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfR0VUX1RFTVA6Ci0JCXZhbCA9 IGk4a19nZXRfdGVtcCgwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk4S19HRVRfU1BFRUQ6Ci0JCWlm IChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVG QVVMVDsKLQotCQl2YWwgPSBpOGtfZ2V0X2Zhbl9zcGVlZCh2YWwpOwotCQlicmVhazsKLQotCWNh c2UgSThLX0dFVF9GQU46Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2Yo aW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQl2YWwgPSBpOGtfZ2V0X2Zhbl9zdGF0dXMo dmFsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk4S19TRVRfRkFOOgotCQlpZiAocmVzdHJpY3RlZCAm JiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0KLQkJaWYgKGNv cHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkKLQkJCXJldHVybiAtRUZBVUxU OwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmc3BlZWQsIGFyZ3AgKyAxLCBzaXplb2YoaW50KSkp Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQl2YWwgPSBpOGtfc2V0X2Zhbih2YWwsIHNwZWVkKTsK LQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodmFs IDwgMCkKLQkJcmV0dXJuIHZhbDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBJOEtfQklPU19W RVJTSU9OOgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIDQpKQotCQkJcmV0dXJuIC1F RkFVTFQ7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBJOEtfTUFDSElORV9JRDoKLQkJaWYgKGNvcHlfdG9f dXNlcihhcmdwLCBidWZmLCAxNikpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlicmVhazsKLQlk ZWZhdWx0OgotCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwsIHNpemVvZihpbnQpKSkKLQkJ CXJldHVybiAtRUZBVUxUOwotCi0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNp Z25lZCBsb25nIGFyZykKLXsKLQlsb25nIHJldDsKLQotCW11dGV4X2xvY2soJmk4a19tdXRleCk7 Ci0JcmV0ID0gaThrX2lvY3RsX3VubG9ja2VkKGZwLCBjbWQsIGFyZyk7Ci0JbXV0ZXhfdW5sb2Nr KCZpOGtfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFByaW50IHRoZSBpbmZv cm1hdGlvbiBmb3IgL3Byb2MvaThrLgotICovCi1zdGF0aWMgaW50IGk4a19wcm9jX3Nob3coc3Ry dWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlpbnQgZm5fa2V5LCBjcHVfdGVt cCwgYWNfcG93ZXI7Ci0JaW50IGxlZnRfZmFuLCByaWdodF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0 X3NwZWVkOwotCi0JY3B1X3RlbXAJPSBpOGtfZ2V0X3RlbXAoMCk7CQkJLyogMTExMDAgwrVzICov Ci0JbGVmdF9mYW4JPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAg wrVzICovCi0JcmlnaHRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fUklHSFQpOwkv KiAgIDU4MCDCtXMgKi8KLQlsZWZ0X3NwZWVkCT0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9M RUZUKTsJLyogICA1ODAgwrVzICovCi0JcmlnaHRfc3BlZWQJPSBpOGtfZ2V0X2Zhbl9zcGVlZChJ OEtfRkFOX1JJR0hUKTsJLyogICA1ODAgwrVzICovCi0JZm5fa2V5CQk9IGk4a19nZXRfZm5fc3Rh dHVzKCk7CQkJLyogICA3NTAgwrVzICovCi0JaWYgKHBvd2VyX3N0YXR1cykKLQkJYWNfcG93ZXIg PSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwkJLyogMTQ3MDAgwrVzICovCi0JZWxzZQotCQlhY19w b3dlciA9IC0xOwotCi0JLyoKLQkgKiBJbmZvOgotCSAqCi0JICogMSkgIEZvcm1hdCB2ZXJzaW9u ICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQotCSAqIDIpICBCSU9TIHZlcnNp b24KLQkgKiAzKSAgQklPUyBtYWNoaW5lIElECi0JICogNCkgIENwdSB0ZW1wZXJhdHVyZQotCSAq IDUpICBMZWZ0IGZhbiBzdGF0dXMKLQkgKiA2KSAgUmlnaHQgZmFuIHN0YXR1cwotCSAqIDcpICBM ZWZ0IGZhbiBzcGVlZAotCSAqIDgpICBSaWdodCBmYW4gc3BlZWQKLQkgKiA5KSAgQUMgcG93ZXIK LQkgKiAxMCkgRm4gS2V5IHN0YXR1cwotCSAqLwotCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIiVz ICVzICVzICVkICVkICVkICVkICVkICVkICVkXG4iLAotCQkJICBJOEtfUFJPQ19GTVQsCi0JCQkg IGJpb3NfdmVyc2lvbiwKLQkJCSAgaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9TRVJJQUwp LAotCQkJICBjcHVfdGVtcCwKLQkJCSAgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVmdF9zcGVlZCwg cmlnaHRfc3BlZWQsCi0JCQkgIGFjX3Bvd2VyLCBmbl9rZXkpOwotfQotCi1zdGF0aWMgaW50IGk4 a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJl dHVybiBzaW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBOVUxMKTsKLX0KLQotCi0vKgot ICogSHdtb24gaW50ZXJmYWNlCi0gKi8KLQotc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3df dGVtcF9sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJp YnV0ZSAqZGV2YXR0ciwKLQkJCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGxhYmVsc1tdID0gewotCQkiQ1BVIiwKLQkJIkdQVSIsCi0JCSJTT0RJTU0iLAotCQki T3RoZXIiLAotCQkiQW1iaWVudCIsCi0JCSJPdGhlciIsCi0JfTsKLQlpbnQgaW5kZXggPSB0b19z ZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCB0eXBlOwotCi0JdHlwZSA9IGk4 a19nZXRfdGVtcF90eXBlKGluZGV4KTsKLQlpZiAodHlwZSA8IDApCi0JCXJldHVybiB0eXBlOwot CWlmICh0eXBlID49IEFSUkFZX1NJWkUobGFiZWxzKSkKLQkJdHlwZSA9IEFSUkFZX1NJWkUobGFi ZWxzKSAtIDE7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGxhYmVsc1t0eXBlXSk7Ci19 Ci0KLXN0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2 LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJCSAgIGNoYXIg KmJ1ZikKLXsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4 OwotCWludCB0ZW1wOwotCi0JdGVtcCA9IGk4a19nZXRfdGVtcChpbmRleCk7Ci0JaWYgKHRlbXAg PCAwKQotCQlyZXR1cm4gdGVtcDsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAq IDEwMDApOwotfQotCi1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd19mYW5fbGFiZWwoc3Ry dWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwK LQkJCQkJY2hhciAqYnVmKQotewotCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGFiZWxzW10g PSB7Ci0JCSJQcm9jZXNzb3IgRmFuIiwKLQkJIk1vdGhlcmJvYXJkIEZhbiIsCi0JCSJWaWRlbyBG YW4iLAotCQkiUG93ZXIgU3VwcGx5IEZhbiIsCi0JCSJDaGlwc2V0IEZhbiIsCi0JCSJPdGhlciBG YW4iLAotCX07Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRl eDsKLQlib29sIGRvY2sgPSBmYWxzZTsKLQlpbnQgdHlwZTsKLQotCXR5cGUgPSBpOGtfZ2V0X2Zh bl90eXBlKGluZGV4KTsKLQlpZiAodHlwZSA8IDApCi0JCXJldHVybiB0eXBlOwotCi0JaWYgKHR5 cGUgJiAweDEwKSB7Ci0JCWRvY2sgPSB0cnVlOwotCQl0eXBlICY9IDB4MEY7Ci0JfQotCi0JaWYg KHR5cGUgPj0gQVJSQVlfU0laRShsYWJlbHMpKQotCQl0eXBlID0gKEFSUkFZX1NJWkUobGFiZWxz KSAtIDEpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXMlc1xuIiwgKGRvY2sgPyAiRG9ja2lu ZyAiIDogIiIpLCBsYWJlbHNbdHlwZV0pOwotfQotCi1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25f c2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1 dGUgKmRldmF0dHIsCi0JCQkJICBjaGFyICpidWYpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29y X2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKLQlpbnQgZmFuX3NwZWVkOwotCi0JZmFuX3NwZWVk ID0gaThrX2dldF9mYW5fc3BlZWQoaW5kZXgpOwotCWlmIChmYW5fc3BlZWQgPCAwKQotCQlyZXR1 cm4gZmFuX3NwZWVkOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBmYW5fc3BlZWQpOwot fQotCi1zdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2 LAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkJICBjaGFyICpi dWYpCi17Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsK LQlpbnQgc3RhdHVzOwotCi0Jc3RhdHVzID0gaThrX2dldF9mYW5fc3RhdHVzKGluZGV4KTsKLQlp ZiAoc3RhdHVzIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRc biIsIGNsYW1wX3ZhbChzdGF0dXMgKiBpOGtfcHdtX211bHQsIDAsIDI1NSkpOwotfQotCi1zdGF0 aWMgc3NpemVfdCBpOGtfaHdtb25fc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVf dCBjb3VudCkKLXsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4 OwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG91bChidWYs IDEwLCAmdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXZhbCA9IGNsYW1wX3ZhbChE SVZfUk9VTkRfQ0xPU0VTVCh2YWwsIGk4a19wd21fbXVsdCksIDAsIGk4a19mYW5fbWF4KTsKLQot CW11dGV4X2xvY2soJmk4a19tdXRleCk7Ci0JZXJyID0gaThrX3NldF9mYW4oaW5kZXgsIHZhbCk7 Ci0JbXV0ZXhfdW5sb2NrKCZpOGtfbXV0ZXgpOwotCi0JcmV0dXJuIGVyciA8IDAgPyAtRUlPIDog Y291bnQ7Ci19Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJV R08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0Vf QVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVM TCwKLQkJCSAgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lS VUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNF X0FUVFIodGVtcDJfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5V TEwsCi0JCQkgIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19J UlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklD RV9BVFRSKHRlbXAzX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xhYmVsLCBO VUxMLAotCQkJICAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNf SVJVR08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJ Q0VfQVRUUih0ZW1wNF9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwg TlVMTCwKLQkJCSAgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfaW5wdXQsIFNf SVJVR08sIGk4a19od21vbl9zaG93X2ZhbiwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklD RV9BVFRSKGZhbjFfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2Zhbl9sYWJlbCwgTlVM TCwKLQkJCSAgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBT X0lXVVNSLCBpOGtfaHdtb25fc2hvd19wd20sCi0JCQkgIGk4a19od21vbl9zZXRfcHdtLCAwKTsK LXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9u X3Nob3dfZmFuLCBOVUxMLAotCQkJICAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFu Ml9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuX2xhYmVsLCBOVUxMLAotCQkJICAx KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIGk4 a19od21vbl9zaG93X3B3bSwKLQkJCSAgaThrX2h3bW9uX3NldF9wd20sIDEpOwotCi1zdGF0aWMg c3RydWN0IGF0dHJpYnV0ZSAqaThrX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1w MV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAwICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9s YWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAxICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1 dC5kZXZfYXR0ci5hdHRyLAkvKiAyICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5k ZXZfYXR0ci5hdHRyLAkvKiAzICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZf YXR0ci5hdHRyLAkvKiA0ICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19sYWJlbC5kZXZfYXR0 ci5hdHRyLAkvKiA1ICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5h dHRyLAkvKiA2ICovCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9sYWJlbC5kZXZfYXR0ci5hdHRy LAkvKiA3ICovCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCS8q IDggKi8KLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogOSAq LwotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRyLAkJLyogMTAgKi8KLQkmc2Vu c29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwJLyogMTEgKi8KLQkmc2Vuc29y X2Rldl9hdHRyX2ZhbjJfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogMTIgKi8KLQkmc2Vuc29yX2Rl dl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwJCS8qIDEzICovCi0JTlVMTAotfTsKLQotc3RhdGlj IHVtb2RlX3QgaThrX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRy aWJ1dGUgKmF0dHIsCi0JCQkgICAgICBpbnQgaW5kZXgpCi17Ci0JaWYgKGluZGV4ID49IDAgJiYg aW5kZXggPD0gMSAmJgotCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RF TVAxKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGluZGV4ID49IDIgJiYgaW5kZXggPD0gMyAmJgotCSAg ICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAyKSkKLQkJcmV0dXJuIDA7 Ci0JaWYgKGluZGV4ID49IDQgJiYgaW5kZXggPD0gNSAmJgotCSAgICAhKGk4a19od21vbl9mbGFn cyAmIEk4S19IV01PTl9IQVZFX1RFTVAzKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGluZGV4ID49IDYg JiYgaW5kZXggPD0gNyAmJgotCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZF X1RFTVA0KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGluZGV4ID49IDggJiYgaW5kZXggPD0gMTAgJiYK LQkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9GQU4xKSkKLQkJcmV0dXJu IDA7Ci0JaWYgKGluZGV4ID49IDExICYmIGluZGV4IDw9IDEzICYmCi0JICAgICEoaThrX2h3bW9u X2ZsYWdzICYgSThLX0hXTU9OX0hBVkVfRkFOMikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGF0 dHItPm1vZGU7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGk4a19n cm91cCA9IHsKLQkuYXR0cnMgPSBpOGtfYXR0cnMsCi0JLmlzX3Zpc2libGUgPSBpOGtfaXNfdmlz aWJsZSwKLX07Ci1fX0FUVFJJQlVURV9HUk9VUFMoaThrKTsKLQotc3RhdGljIGludCBfX2luaXQg aThrX2luaXRfaHdtb24odm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JaThrX2h3bW9uX2ZsYWdzID0g MDsKLQotCS8qIENQVSB0ZW1wZXJhdHVyZSBhdHRyaWJ1dGVzLCBpZiB0ZW1wZXJhdHVyZSB0eXBl IGlzIE9LICovCi0JZXJyID0gaThrX2dldF90ZW1wX3R5cGUoMCk7Ci0JaWYgKGVyciA+PSAwKQot CQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfVEVNUDE7Ci0JLyogY2hlY2sgZm9y IGFkZGl0aW9uYWwgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLwotCWVyciA9IGk4a19nZXRfdGVtcF90 eXBlKDEpOwotCWlmIChlcnIgPj0gMCkKLQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9I QVZFX1RFTVAyOwotCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDIpOwotCWlmIChlcnIgPj0gMCkK LQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVAzOwotCWVyciA9IGk4a19n ZXRfdGVtcF90eXBlKDMpOwotCWlmIChlcnIgPj0gMCkKLQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4 S19IV01PTl9IQVZFX1RFTVA0OwotCi0JLyogRmlyc3QgZmFuIGF0dHJpYnV0ZXMsIGlmIGZhbiB0 eXBlIGlzIE9LICovCi0JZXJyID0gaThrX2dldF9mYW5fdHlwZSgwKTsKLQlpZiAoZXJyID49IDAp Ci0JCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9GQU4xOwotCi0JLyogU2Vjb25k IGZhbiBhdHRyaWJ1dGVzLCBpZiBmYW4gdHlwZSBpcyBPSyAqLwotCWVyciA9IGk4a19nZXRfZmFu X3R5cGUoMSk7Ci0JaWYgKGVyciA+PSAwKQotCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9O X0hBVkVfRkFOMjsKLQotCWk4a19od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0 aF9ncm91cHMoTlVMTCwgImk4ayIsIE5VTEwsCi0JCQkJCQkJICBpOGtfZ3JvdXBzKTsKLQlpZiAo SVNfRVJSKGk4a19od21vbl9kZXYpKSB7Ci0JCWVyciA9IFBUUl9FUlIoaThrX2h3bW9uX2Rldik7 Ci0JCWk4a19od21vbl9kZXYgPSBOVUxMOwotCQlwcl9lcnIoImh3bW9uIHJlZ2lzdHJhdGlvbiBm YWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0K LXN0cnVjdCBpOGtfY29uZmlnX2RhdGEgewotCXVpbnQgZmFuX211bHQ7Ci0JdWludCBmYW5fbWF4 OwotfTsKLQotZW51bSBpOGtfY29uZmlncyB7Ci0JREVMTF9MQVRJVFVERV9ENTIwLAotCURFTExf UFJFQ0lTSU9OXzQ5MCwKLQlERUxMX1NUVURJTywKLQlERUxMX1hQUywKLX07Ci0KLXN0YXRpYyBj b25zdCBzdHJ1Y3QgaThrX2NvbmZpZ19kYXRhIGk4a19jb25maWdfZGF0YVtdID0gewotCVtERUxM X0xBVElUVURFX0Q1MjBdID0gewotCQkuZmFuX211bHQgPSAxLAotCQkuZmFuX21heCA9IEk4S19G QU5fVFVSQk8sCi0JfSwKLQlbREVMTF9QUkVDSVNJT05fNDkwXSA9IHsKLQkJLmZhbl9tdWx0ID0g MSwKLQkJLmZhbl9tYXggPSBJOEtfRkFOX1RVUkJPLAotCX0sCi0JW0RFTExfU1RVRElPXSA9IHsK LQkJLmZhbl9tdWx0ID0gMSwKLQkJLmZhbl9tYXggPSBJOEtfRkFOX0hJR0gsCi0JfSwKLQlbREVM TF9YUFNdID0gewotCQkuZmFuX211bHQgPSAxLAotCQkuZmFuX21heCA9IEk4S19GQU5fSElHSCwK LQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lkIGk4a19kbWlfdGFibGVbXSBf X2luaXRkYXRhID0gewotCXsKLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24iLAotCQkubWF0Y2hl cyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIiKSwKLQkJ CURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24iKSwKLQkJfSwKLQl9LAotCXsK LQkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRD SChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIiKSwKLQkJCURNSV9NQVRDSChETUlfUFJP RFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRlbGwg SW5zcGlyb24gMiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9S LCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9u IiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIExhdGl0dWRlIEQ1MjAiLAotCQku bWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAot CQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSBENTIwIiksCi0JCX0sCi0J CS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX0xBVElUVURFX0Q1 MjBdLAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSAyIiwKLQkJLm1hdGNoZXMg PSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9N QVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKLQkJfSwKLQl9LAotCXsJLyogVUsg SW5zcGlyb24gNjQwMCAgKi8KLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMyIsCi0JCS5tYXRj aGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCi0JCQlE TUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1NMDYxIiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5p ZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChE TUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05B TUUsICJNUDA2MSIpLAotCQl9LAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBQcmVjaXNpb24g NDkwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxs IEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLAotCQkJCSAgIlByZWNpc2lv biBXb3JrU3RhdGlvbiA0OTAiKSwKLQkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThr X2NvbmZpZ19kYXRhW0RFTExfUFJFQ0lTSU9OXzQ5MF0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJE ZWxsIFByZWNpc2lvbiIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVO RE9SLCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZWNp c2lvbiIpLAotCQl9LAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8iLAotCQkubWF0 Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJ RE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8iKSwKLQkJfSwKLQl9LAotCXsKLQkJ LmlkZW50ID0gIkRlbGwgWFBTNDIxIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1J X1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1F LCAiWFBTIEw0MjFYIiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIFN0dWRpbyIs Ci0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMu IiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlN0dWRpbyIpLAotCQl9LAotCQku ZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9TVFVESU9dLAotCX0s Ci0JewotCQkuaWRlbnQgPSAiRGVsbCBYUFMgMTMiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9N QVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9E VUNUX05BTUUsICJYUFMxMyIpLAotCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtf Y29uZmlnX2RhdGFbREVMTF9YUFNdLAotCX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBYUFMgTTE0 MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJ bmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1YQzA1MSIpLAotCQl9LAot CQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9YUFNdLAotCX0s Ci0JeyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgaThrX2RtaV90YWJsZSk7Ci0K LS8qCi0gKiBQcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc3VwcG9ydGVkIGxhcHRvcC4KLSAq Lwotc3RhdGljIGludCBfX2luaXQgaThrX3Byb2JlKHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IGRt aV9zeXN0ZW1faWQgKmlkOwotCWludCBmYW4sIHJldDsKLQotCS8qCi0JICogR2V0IERNSSBpbmZv cm1hdGlvbgotCSAqLwotCWlmICghZG1pX2NoZWNrX3N5c3RlbShpOGtfZG1pX3RhYmxlKSkgewot CQlpZiAoIWlnbm9yZV9kbWkgJiYgIWZvcmNlKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJcHJf aW5mbygibm90IHJ1bm5pbmcgb24gYSBzdXBwb3J0ZWQgRGVsbCBzeXN0ZW0uXG4iKTsKLQkJcHJf aW5mbygidmVuZG9yPSVzLCBtb2RlbD0lcywgdmVyc2lvbj0lc1xuIiwKLQkJCWk4a19nZXRfZG1p X2RhdGEoRE1JX1NZU19WRU5ET1IpLAotCQkJaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9O QU1FKSwKLQkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX0JJT1NfVkVSU0lPTikpOwotCX0KLQotCXN0 cmxjcHkoYmlvc192ZXJzaW9uLCBpOGtfZ2V0X2RtaV9kYXRhKERNSV9CSU9TX1ZFUlNJT04pLAot CQlzaXplb2YoYmlvc192ZXJzaW9uKSk7Ci0KLQkvKgotCSAqIEdldCBTTU0gRGVsbCBzaWduYXR1 cmUKLQkgKi8KLQlpZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZShJOEtfU01NX0dFVF9ERUxMX1NJ RzEpICYmCi0JICAgIGk4a19nZXRfZGVsbF9zaWduYXR1cmUoSThLX1NNTV9HRVRfREVMTF9TSUcy KSkgewotCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKLQkJ aWYgKCFmb3JjZSkKLQkJCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JICogU2V0IGZhbiBt dWx0aXBsaWVyIGFuZCBtYXhpbWFsIGZhbiBzcGVlZCBmcm9tIGRtaSBjb25maWcKLQkgKiBWYWx1 ZXMgc3BlY2lmaWVkIGluIG1vZHVsZSBwYXJhbWV0ZXJzIG92ZXJyaWRlIHZhbHVlcyBmcm9tIGRt aQotCSAqLwotCWlkID0gZG1pX2ZpcnN0X21hdGNoKGk4a19kbWlfdGFibGUpOwotCWlmIChpZCAm JiBpZC0+ZHJpdmVyX2RhdGEpIHsKLQkJY29uc3Qgc3RydWN0IGk4a19jb25maWdfZGF0YSAqY29u ZiA9IGlkLT5kcml2ZXJfZGF0YTsKLQkJaWYgKCFmYW5fbXVsdCAmJiBjb25mLT5mYW5fbXVsdCkK LQkJCWZhbl9tdWx0ID0gY29uZi0+ZmFuX211bHQ7Ci0JCWlmICghZmFuX21heCAmJiBjb25mLT5m YW5fbWF4KQotCQkJZmFuX21heCA9IGNvbmYtPmZhbl9tYXg7Ci0JfQotCi0JaThrX2Zhbl9tYXgg PSBmYW5fbWF4ID8gOiBJOEtfRkFOX0hJR0g7CS8qIE11c3Qgbm90IGJlIDAgKi8KLQlpOGtfcHdt X211bHQgPSBESVZfUk9VTkRfVVAoMjU1LCBpOGtfZmFuX21heCk7Ci0KLQlpZiAoIWZhbl9tdWx0 KSB7Ci0JCS8qCi0JCSAqIEF1dG9kZXRlY3QgZmFuIG11bHRpcGxpZXIgYmFzZWQgb24gbm9taW5h bCBycG0KLQkJICogSWYgZmFuIHJlcG9ydHMgcnBtIHZhbHVlIHRvbyBoaWdoIHRoZW4gc2V0IG11 bHRpcGxpZXIgdG8gMQotCQkgKi8KLQkJZm9yIChmYW4gPSAwOyBmYW4gPCAyOyArK2Zhbikgewot CQkJcmV0ID0gaThrX2dldF9mYW5fbm9taW5hbF9zcGVlZChmYW4sIGk4a19mYW5fbWF4KTsKLQkJ CWlmIChyZXQgPCAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJldCA+IEk4S19GQU5fTUFYX1JQ TSkKLQkJCQlpOGtfZmFuX211bHQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkv KiBGYW4gbXVsdGlwbGllciB3YXMgc3BlY2lmaWVkIGluIG1vZHVsZSBwYXJhbSBvciBpbiBkbWkg Ki8KLQkJaThrX2Zhbl9tdWx0ID0gZmFuX211bHQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5 ICpwcm9jX2k4azsKLQlpbnQgZXJyOwotCi0JLyogQXJlIHdlIHJ1bm5pbmcgb24gYW4gc3VwcG9y dGVkIGxhcHRvcD8gKi8KLQlpZiAoaThrX3Byb2JlKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0J LyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KLQlwcm9jX2k4ayA9IHByb2NfY3JlYXRlKCJp OGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMpOwotCWlmICghcHJvY19pOGspCi0JCXJldHVybiAtRU5P RU5UOwotCi0JZXJyID0gaThrX2luaXRfaHdtb24oKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXRf cmVtb3ZlX3Byb2M7Ci0KLQlyZXR1cm4gMDsKLQotIGV4aXRfcmVtb3ZlX3Byb2M6Ci0JcmVtb3Zl X3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lk IF9fZXhpdCBpOGtfZXhpdCh2b2lkKQotewotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19o d21vbl9kZXYpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKLX0KLQotbW9kdWxl X2luaXQoaThrX2luaXQpOwotbW9kdWxlX2V4aXQoaThrX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggNmM5NDE0 Ny4uMWMzZTQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2 ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0xNTUsNiArMTU1LDcgQEAgb2JqLSQoQ09ORklHX1NFTlNP UlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzTDc4 Nk5HKQkrPSB3ODNsNzg2bmcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzFYKQkrPSB3bTgz MXgtaHdtb24ubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzUwKQkrPSB3bTgzNTAtaHdtb24u bworb2JqLSQoQ09ORklHX0k4SykJCSs9IGRlbGwtc21tLWh3bW9uLm8KIAogb2JqLSQoQ09ORklH X1BNQlVTKQkJKz0gcG1idXMvCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0t aHdtb24uYyBiL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4yYjA0ZTRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9o d21vbi9kZWxsLXNtbS1od21vbi5jCkBAIC0wLDAgKzEsMTAwNyBAQAorLyoKKyAqIGRlbGwtc21t LWh3bW9uLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBCSU9TIG9uIERl bGwgbGFwdG9wcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRv IDxkekBkZWJpYW4ub3JnPgorICoKKyAqIEh3bW9uIGludGVncmF0aW9uOgorICogQ29weXJpZ2h0 IChDKSAyMDExICBKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CisgKiBDb3B5cmlnaHQg KEMpIDIwMTMsIDIwMTQgIEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KKyAqIENv cHlyaWdodCAoQykgMjAxNCwgMjAxNSAgUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29t PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkK KyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK KyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjZGVm aW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51 eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5 cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMu aD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgor I2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgor I2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4K KyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNs dWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSA8bGludXgvaThrLmg+CisKKyNkZWZpbmUg SThLX1NNTV9GTl9TVEFUVVMJMHgwMDI1CisjZGVmaW5lIEk4S19TTU1fUE9XRVJfU1RBVFVTCTB4 MDA2OQorI2RlZmluZSBJOEtfU01NX1NFVF9GQU4JCTB4MDFhMworI2RlZmluZSBJOEtfU01NX0dF VF9GQU4JCTB4MDBhMworI2RlZmluZSBJOEtfU01NX0dFVF9TUEVFRAkweDAyYTMKKyNkZWZpbmUg SThLX1NNTV9HRVRfRkFOX1RZUEUJMHgwM2EzCisjZGVmaW5lIEk4S19TTU1fR0VUX05PTV9TUEVF RAkweDA0YTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfVEVNUAkweDEwYTMKKyNkZWZpbmUgSThLX1NN TV9HRVRfVEVNUF9UWVBFCTB4MTFhMworI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRzEJMHhm ZWEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0RFTExfU0lHMgkweGZmYTMKKworI2RlZmluZSBJOEtf RkFOX01VTFQJCTMwCisjZGVmaW5lIEk4S19GQU5fTUFYX1JQTQkJMzAwMDAKKyNkZWZpbmUgSThL X01BWF9URU1QCQkxMjcKKworI2RlZmluZSBJOEtfRk5fTk9ORQkJMHgwMAorI2RlZmluZSBJOEtf Rk5fVVAJCTB4MDEKKyNkZWZpbmUgSThLX0ZOX0RPV04JCTB4MDIKKyNkZWZpbmUgSThLX0ZOX01V VEUJCTB4MDQKKyNkZWZpbmUgSThLX0ZOX01BU0sJCTB4MDcKKyNkZWZpbmUgSThLX0ZOX1NISUZU CQk4CisKKyNkZWZpbmUgSThLX1BPV0VSX0FDCQkweDA1CisjZGVmaW5lIEk4S19QT1dFUl9CQVRU RVJZCTB4MDEKKworc3RhdGljIERFRklORV9NVVRFWChpOGtfbXV0ZXgpOworc3RhdGljIGNoYXIg Ymlvc192ZXJzaW9uWzRdOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmk4a19od21vbl9kZXY7Citz dGF0aWMgdTMyIGk4a19od21vbl9mbGFnczsKK3N0YXRpYyB1aW50IGk4a19mYW5fbXVsdCA9IEk4 S19GQU5fTVVMVDsKK3N0YXRpYyB1aW50IGk4a19wd21fbXVsdDsKK3N0YXRpYyB1aW50IGk4a19m YW5fbWF4ID0gSThLX0ZBTl9ISUdIOworCisjZGVmaW5lIEk4S19IV01PTl9IQVZFX1RFTVAxCSgx IDw8IDApCisjZGVmaW5lIEk4S19IV01PTl9IQVZFX1RFTVAyCSgxIDw8IDEpCisjZGVmaW5lIEk4 S19IV01PTl9IQVZFX1RFTVAzCSgxIDw8IDIpCisjZGVmaW5lIEk4S19IV01PTl9IQVZFX1RFTVA0 CSgxIDw8IDMpCisjZGVmaW5lIEk4S19IV01PTl9IQVZFX0ZBTjEJKDEgPDwgNCkKKyNkZWZpbmUg SThLX0hXTU9OX0hBVkVfRkFOMgkoMSA8PCA1KQorCitNT0RVTEVfQVVUSE9SKCJNYXNzaW1vIERh bCBab3R0byAoZHpAZGViaWFuLm9yZykiKTsKK01PRFVMRV9BVVRIT1IoIlBhbGkgUm9ow6FyIDxw YWxpLnJvaGFyQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBh Y2Nlc3NpbmcgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzIik7CitNT0RVTEVfTElDRU5TRSgiR1BM Iik7CitNT0RVTEVfQUxJQVMoImk4ayIpOworCitzdGF0aWMgYm9vbCBmb3JjZTsKK21vZHVsZV9w YXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiRm9yY2UgbG9h ZGluZyB3aXRob3V0IGNoZWNraW5nIGZvciBzdXBwb3J0ZWQgbW9kZWxzIik7CisKK3N0YXRpYyBi b29sIGlnbm9yZV9kbWk7Cittb2R1bGVfcGFyYW0oaWdub3JlX2RtaSwgYm9vbCwgMCk7CitNT0RV TEVfUEFSTV9ERVNDKGlnbm9yZV9kbWksICJDb250aW51ZSBwcm9iaW5nIGhhcmR3YXJlIGV2ZW4g aWYgRE1JIGRhdGEgZG9lcyBub3QgbWF0Y2giKTsKKworc3RhdGljIGJvb2wgcmVzdHJpY3RlZDsK K21vZHVsZV9wYXJhbShyZXN0cmljdGVkLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVz dHJpY3RlZCwgIkFsbG93IGZhbiBjb250cm9sIGlmIFNZU19BRE1JTiBjYXBhYmlsaXR5IHNldCIp OworCitzdGF0aWMgYm9vbCBwb3dlcl9zdGF0dXM7Cittb2R1bGVfcGFyYW0ocG93ZXJfc3RhdHVz LCBib29sLCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfc3RhdHVzLCAiUmVwb3J0IHBv d2VyIHN0YXR1cyBpbiAvcHJvYy9pOGsiKTsKKworc3RhdGljIHVpbnQgZmFuX211bHQ7Cittb2R1 bGVfcGFyYW0oZmFuX211bHQsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYW5fbXVsdCwg IkZhY3RvciB0byBtdWx0aXBseSBmYW4gc3BlZWQgd2l0aCAoZGVmYXVsdDogYXV0b2RldGVjdCki KTsKKworc3RhdGljIHVpbnQgZmFuX21heDsKK21vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAw KTsKK01PRFVMRV9QQVJNX0RFU0MoZmFuX21heCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBz cGVlZCAoZGVmYXVsdDogYXV0b2RldGVjdCkiKTsKKworc3RhdGljIGludCBpOGtfb3Blbl9mcyhz dHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgbG9uZyBpOGtf aW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworc3Rh dGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CisJLm93bmVyCQk9 IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAorCS5yZWFkCQk9IHNlcV9yZWFk LAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJ LnVubG9ja2VkX2lvY3RsCT0gaThrX2lvY3RsLAorfTsKKworc3RydWN0IHNtbV9yZWdzIHsKKwl1 bnNpZ25lZCBpbnQgZWF4OworCXVuc2lnbmVkIGludCBlYnggX19wYWNrZWQ7CisJdW5zaWduZWQg aW50IGVjeCBfX3BhY2tlZDsKKwl1bnNpZ25lZCBpbnQgZWR4IF9fcGFja2VkOworCXVuc2lnbmVk IGludCBlc2kgX19wYWNrZWQ7CisJdW5zaWduZWQgaW50IGVkaSBfX3BhY2tlZDsKK307CisKK3N0 YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaThrX2dldF9kbWlfZGF0YShpbnQgZmllbGQpCit7CisJ Y29uc3QgY2hhciAqZG1pX2RhdGEgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKGZpZWxkKTsKKworCXJl dHVybiBkbWlfZGF0YSAmJiAqZG1pX2RhdGEgPyBkbWlfZGF0YSA6ICI/IjsKK30KKworLyoKKyAq IENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBK b25hdGhhbiBCdXp6YXJkLgorICovCitzdGF0aWMgaW50IGk4a19zbW0oc3RydWN0IHNtbV9yZWdz ICpyZWdzKQoreworCWludCByYzsKKwlpbnQgZWF4ID0gcmVncy0+ZWF4OworCWNwdW1hc2tfdmFy X3Qgb2xkX21hc2s7CisKKwkvKiBTTU0gcmVxdWlyZXMgQ1BVIDAgKi8KKwlpZiAoIWFsbG9jX2Nw dW1hc2tfdmFyKCZvbGRfbWFzaywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCWNw dW1hc2tfY29weShvbGRfbWFzaywgJmN1cnJlbnQtPmNwdXNfYWxsb3dlZCk7CisJcmMgPSBzZXRf Y3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKDApKTsKKwlpZiAocmMpCisJCWdv dG8gb3V0OworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCkgeworCQlyYyA9IC1FQlVTWTsK KwkJZ290byBvdXQ7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCWFzbSB2b2xh dGlsZSgicHVzaHEgJSVyYXhcblx0IgorCQkibW92bCAwKCUlcmF4KSwlJWVkeFxuXHQiCisJCSJw dXNocSAlJXJkeFxuXHQiCisJCSJtb3ZsIDQoJSVyYXgpLCUlZWJ4XG5cdCIKKwkJIm1vdmwgOCgl JXJheCksJSVlY3hcblx0IgorCQkibW92bCAxMiglJXJheCksJSVlZHhcblx0IgorCQkibW92bCAx NiglJXJheCksJSVlc2lcblx0IgorCQkibW92bCAyMCglJXJheCksJSVlZGlcblx0IgorCQkicG9w cSAlJXJheFxuXHQiCisJCSJvdXQgJSVhbCwkMHhiMlxuXHQiCisJCSJvdXQgJSVhbCwkMHg4NFxu XHQiCisJCSJ4Y2hncSAlJXJheCwoJSVyc3ApXG5cdCIKKwkJIm1vdmwgJSVlYngsNCglJXJheClc blx0IgorCQkibW92bCAlJWVjeCw4KCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZWR4LDEyKCUlcmF4 KVxuXHQiCisJCSJtb3ZsICUlZXNpLDE2KCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZWRpLDIwKCUl cmF4KVxuXHQiCisJCSJwb3BxICUlcmR4XG5cdCIKKwkJIm1vdmwgJSVlZHgsMCglJXJheClcblx0 IgorCQkicHVzaGZxXG5cdCIKKwkJInBvcHEgJSVyYXhcblx0IgorCQkiYW5kbCAkMSwlJWVheFxu IgorCQk6ICI9YSIocmMpCisJCTogICAgImEiKHJlZ3MpCisJCTogICAgIiVlYngiLCAiJWVjeCIs ICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKKyNlbHNlCisJYXNtIHZvbGF0aWxl KCJwdXNobCAlJWVheFxuXHQiCisJICAgICJtb3ZsIDAoJSVlYXgpLCUlZWR4XG5cdCIKKwkgICAg InB1c2ggJSVlZHhcblx0IgorCSAgICAibW92bCA0KCUlZWF4KSwlJWVieFxuXHQiCisJICAgICJt b3ZsIDgoJSVlYXgpLCUlZWN4XG5cdCIKKwkgICAgIm1vdmwgMTIoJSVlYXgpLCUlZWR4XG5cdCIK KwkgICAgIm1vdmwgMTYoJSVlYXgpLCUlZXNpXG5cdCIKKwkgICAgIm1vdmwgMjAoJSVlYXgpLCUl ZWRpXG5cdCIKKwkgICAgInBvcGwgJSVlYXhcblx0IgorCSAgICAib3V0ICUlYWwsJDB4YjJcblx0 IgorCSAgICAib3V0ICUlYWwsJDB4ODRcblx0IgorCSAgICAieGNoZ2wgJSVlYXgsKCUlZXNwKVxu XHQiCisJICAgICJtb3ZsICUlZWJ4LDQoJSVlYXgpXG5cdCIKKwkgICAgIm1vdmwgJSVlY3gsOCgl JWVheClcblx0IgorCSAgICAibW92bCAlJWVkeCwxMiglJWVheClcblx0IgorCSAgICAibW92bCAl JWVzaSwxNiglJWVheClcblx0IgorCSAgICAibW92bCAlJWVkaSwyMCglJWVheClcblx0IgorCSAg ICAicG9wbCAlJWVkeFxuXHQiCisJICAgICJtb3ZsICUlZWR4LDAoJSVlYXgpXG5cdCIKKwkgICAg ImxhaGZcblx0IgorCSAgICAic2hybCAkOCwlJWVheFxuXHQiCisJICAgICJhbmRsICQxLCUlZWF4 XG4iCisJICAgIDogIj1hIihyYykKKwkgICAgOiAgICAiYSIocmVncykKKwkgICAgOiAgICAiJWVi eCIsICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICIlZWRpIiwgIm1lbW9yeSIpOworI2VuZGlmCisJ aWYgKHJjICE9IDAgfHwgKHJlZ3MtPmVheCAmIDB4ZmZmZikgPT0gMHhmZmZmIHx8IHJlZ3MtPmVh eCA9PSBlYXgpCisJCXJjID0gLUVJTlZBTDsKKworb3V0OgorCXNldF9jcHVzX2FsbG93ZWRfcHRy KGN1cnJlbnQsIG9sZF9tYXNrKTsKKwlmcmVlX2NwdW1hc2tfdmFyKG9sZF9tYXNrKTsKKwlyZXR1 cm4gcmM7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBGbiBrZXkgc3RhdHVzLgorICovCitzdGF0aWMg aW50IGk4a19nZXRfZm5fc3RhdHVzKHZvaWQpCit7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7 IC5lYXggPSBJOEtfU01NX0ZOX1NUQVRVUywgfTsKKwlpbnQgcmM7CisKKwlyYyA9IGk4a19zbW0o JnJlZ3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXN3aXRjaCAoKHJlZ3MuZWF4 ID4+IEk4S19GTl9TSElGVCkgJiBJOEtfRk5fTUFTSykgeworCWNhc2UgSThLX0ZOX1VQOgorCQly ZXR1cm4gSThLX1ZPTF9VUDsKKwljYXNlIEk4S19GTl9ET1dOOgorCQlyZXR1cm4gSThLX1ZPTF9E T1dOOworCWNhc2UgSThLX0ZOX01VVEU6CisJCXJldHVybiBJOEtfVk9MX01VVEU7CisJZGVmYXVs dDoKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKgorICogUmVhZCB0aGUgcG93ZXIgc3RhdHVzLgor ICovCitzdGF0aWMgaW50IGk4a19nZXRfcG93ZXJfc3RhdHVzKHZvaWQpCit7CisJc3RydWN0IHNt bV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUywgfTsKKwlpbnQgcmM7 CisKKwlyYyA9IGk4a19zbW0oJnJlZ3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwor CXJldHVybiAocmVncy5lYXggJiAweGZmKSA9PSBJOEtfUE9XRVJfQUMgPyBJOEtfQUMgOiBJOEtf QkFUVEVSWTsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiBzdGF0dXMuCisgKi8KK3N0YXRpYyBp bnQgaThrX2dldF9mYW5fc3RhdHVzKGludCBmYW4pCit7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3Mg PSB7IC5lYXggPSBJOEtfU01NX0dFVF9GQU4sIH07CisKKwlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7 CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdzLmVheCAmIDB4ZmY7Cit9CisKKy8qCisg KiBSZWFkIHRoZSBmYW4gc3BlZWQgaW4gUlBNLgorICovCitzdGF0aWMgaW50IGk4a19nZXRfZmFu X3NwZWVkKGludCBmYW4pCit7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtf U01NX0dFVF9TUEVFRCwgfTsKKworCXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKKwlyZXR1cm4gaThr X3NtbSgmcmVncykgPyA6IChyZWdzLmVheCAmIDB4ZmZmZikgKiBpOGtfZmFuX211bHQ7Cit9CisK Ky8qCisgKiBSZWFkIHRoZSBmYW4gdHlwZS4KKyAqLworc3RhdGljIGludCBpOGtfZ2V0X2Zhbl90 eXBlKGludCBmYW4pCit7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01N X0dFVF9GQU5fVFlQRSwgfTsKKworCXJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKKwlyZXR1cm4gaThr X3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZh biBub21pbmFsIHJwbSBmb3Igc3BlY2lmaWMgZmFuIHNwZWVkLgorICovCitzdGF0aWMgaW50IGk4 a19nZXRfZmFuX25vbWluYWxfc3BlZWQoaW50IGZhbiwgaW50IHNwZWVkKQoreworCXN0cnVjdCBz bW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfTk9NX1NQRUVELCB9OworCisJcmVn cy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwgOCk7CisJcmV0dXJuIGk4a19zbW0oJnJl Z3MpID8gOiAocmVncy5lYXggJiAweGZmZmYpICogaThrX2Zhbl9tdWx0OworfQorCisvKgorICog U2V0IHRoZSBmYW4gc3BlZWQgKG9mZiwgbG93LCBoaWdoKS4gUmV0dXJucyB0aGUgbmV3IGZhbiBz dGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NldF9mYW4oaW50IGZhbiwgaW50IHNwZWVkKQor eworCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9TRVRfRkFOLCB9Owor CisJc3BlZWQgPSAoc3BlZWQgPCAwKSA/IDAgOiAoKHNwZWVkID4gaThrX2Zhbl9tYXgpID8gaThr X2Zhbl9tYXggOiBzcGVlZCk7CisJcmVncy5lYnggPSAoZmFuICYgMHhmZikgfCAoc3BlZWQgPDwg OCk7CisKKwlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IGk4a19nZXRfZmFuX3N0YXR1cyhmYW4p OworfQorCitzdGF0aWMgaW50IGk4a19nZXRfdGVtcF90eXBlKGludCBzZW5zb3IpCit7CisJc3Ry dWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9URU1QX1RZUEUsIH07CisK KwlyZWdzLmVieCA9IHNlbnNvciAmIDB4ZmY7CisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiBy ZWdzLmVheCAmIDB4ZmY7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBjcHUgdGVtcGVyYXR1cmUuCisg Ki8KK3N0YXRpYyBpbnQgX2k4a19nZXRfdGVtcChpbnQgc2Vuc29yKQoreworCXN0cnVjdCBzbW1f cmVncyByZWdzID0geworCQkuZWF4ID0gSThLX1NNTV9HRVRfVEVNUCwKKwkJLmVieCA9IHNlbnNv ciAmIDB4ZmYsCisJfTsKKworCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAw eGZmOworfQorCitzdGF0aWMgaW50IGk4a19nZXRfdGVtcChpbnQgc2Vuc29yKQoreworCWludCB0 ZW1wID0gX2k4a19nZXRfdGVtcChzZW5zb3IpOworCisJLyoKKwkgKiBTb21ldGltZXMgdGhlIHRl bXBlcmF0dXJlIHNlbnNvciByZXR1cm5zIDB4OTksIHdoaWNoIGlzIG91dCBvZiByYW5nZS4KKwkg KiBJbiB0aGlzIGNhc2Ugd2UgcmV0cnkgKG9uY2UpIGJlZm9yZSByZXR1cm5pbmcgYW4gZXJyb3Iu CisJICMgMTAwMzY1NTEzNyAwMDAwMDA1OCAwMDAwNWE0YgorCSAjIDEwMDM2NTUxMzggMDAwMDAw OTkgMDAwMDNhODAgPC0tLSAweDk5ID0gMTUzIGRlZ3JlZXMKKwkgIyAxMDAzNjU1MTM5IDAwMDAw MDU0IDAwMDA1YzUyCisJICovCisJaWYgKHRlbXAgPT0gMHg5OSkgeworCQltc2xlZXAoMTAwKTsK KwkJdGVtcCA9IF9pOGtfZ2V0X3RlbXAoc2Vuc29yKTsKKwl9CisJLyoKKwkgKiBSZXR1cm4gLUVO T0RBVEEgZm9yIGFsbCBpbnZhbGlkIHRlbXBlcmF0dXJlcy4KKwkgKgorCSAqIEtub3duIGluc3Rh bmNlcyBhcmUgdGhlIDB4OTkgdmFsdWUgYXMgc2VlbiBhYm92ZSBhcyB3ZWxsIGFzCisJICogMHhj MSAoMTkzKSwgd2hpY2ggbWF5IGJlIHJldHVybmVkIHdoZW4gdHJ5aW5nIHRvIHJlYWQgdGhlIEdQ VQorCSAqIHRlbXBlcmF0dXJlIGlmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgYSBHUFUgYW5kIGl0IGlz IGN1cnJlbnRseQorCSAqIHR1cm5lZCBvZmYuCisJICovCisJaWYgKHRlbXAgPiBJOEtfTUFYX1RF TVApCisJCXJldHVybiAtRU5PREFUQTsKKworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW50 IGk4a19nZXRfZGVsbF9zaWduYXR1cmUoaW50IHJlcV9mbikKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3Mg cmVncyA9IHsgLmVheCA9IHJlcV9mbiwgfTsKKwlpbnQgcmM7CisKKwlyYyA9IGk4a19zbW0oJnJl Z3MpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCXJldHVybiByZWdzLmVheCA9PSAx MTQ1NjUxNTI3ICYmIHJlZ3MuZWR4ID09IDExNDUzOTIyMDQgPyAwIDogLTE7Cit9CisKK3N0YXRp YyBpbnQKK2k4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBj bWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB2YWwgPSAwOworCWludCBzcGVlZDsKKwl1 bnNpZ25lZCBjaGFyIGJ1ZmZbMTZdOworCWludCBfX3VzZXIgKmFyZ3AgPSAoaW50IF9fdXNlciAq KWFyZzsKKworCWlmICghYXJncCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNtZCkg eworCWNhc2UgSThLX0JJT1NfVkVSU0lPTjoKKwkJdmFsID0gKGJpb3NfdmVyc2lvblswXSA8PCAx NikgfAorCQkJCShiaW9zX3ZlcnNpb25bMV0gPDwgOCkgfCBiaW9zX3ZlcnNpb25bMl07CisJCWJy ZWFrOworCisJY2FzZSBJOEtfTUFDSElORV9JRDoKKwkJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKKwkJ c3RybGNweShidWZmLCBpOGtfZ2V0X2RtaV9kYXRhKERNSV9QUk9EVUNUX1NFUklBTCksCisJCQlz aXplb2YoYnVmZikpOworCQlicmVhazsKKworCWNhc2UgSThLX0ZOX1NUQVRVUzoKKwkJdmFsID0g aThrX2dldF9mbl9zdGF0dXMoKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19QT1dFUl9TVEFUVVM6 CisJCXZhbCA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CisJCWJyZWFrOworCisJY2FzZSBJOEtf R0VUX1RFTVA6CisJCXZhbCA9IGk4a19nZXRfdGVtcCgwKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4 S19HRVRfU1BFRUQ6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50 KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl2YWwgPSBpOGtfZ2V0X2Zhbl9zcGVlZCh2YWwp OworCQlicmVhazsKKworCWNhc2UgSThLX0dFVF9GQU46CisJCWlmIChjb3B5X2Zyb21fdXNlcigm dmFsLCBhcmdwLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl2YWwgPSBp OGtfZ2V0X2Zhbl9zdGF0dXModmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19TRVRfRkFOOgor CQlpZiAocmVzdHJpY3RlZCAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAt RVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkK KwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3BlZWQsIGFyZ3Ag KyAxLCBzaXplb2YoaW50KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl2YWwgPSBpOGtfc2V0 X2Zhbih2YWwsIHNwZWVkKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZB TDsKKwl9CisKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCXN3aXRjaCAoY21kKSB7 CisJY2FzZSBJOEtfQklPU19WRVJTSU9OOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWws IDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJY2FzZSBJOEtfTUFDSElORV9J RDoKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBidWZmLCAxNikpCisJCQlyZXR1cm4gLUVGQVVM VDsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWws IHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWJyZWFrOworCX0KKworCXJl dHVybiAwOworfQorCitzdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0IGZpbGUgKmZwLCB1bnNp Z25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlsb25nIHJldDsKKworCW11dGV4 X2xvY2soJmk4a19tdXRleCk7CisJcmV0ID0gaThrX2lvY3RsX3VubG9ja2VkKGZwLCBjbWQsIGFy Zyk7CisJbXV0ZXhfdW5sb2NrKCZpOGtfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoK KyAqIFByaW50IHRoZSBpbmZvcm1hdGlvbiBmb3IgL3Byb2MvaThrLgorICovCitzdGF0aWMgaW50 IGk4a19wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKK3sKKwlp bnQgZm5fa2V5LCBjcHVfdGVtcCwgYWNfcG93ZXI7CisJaW50IGxlZnRfZmFuLCByaWdodF9mYW4s IGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkOworCisJY3B1X3RlbXAJPSBpOGtfZ2V0X3RlbXAoMCk7 CQkJLyogMTExMDAgwrVzICovCisJbGVmdF9mYW4JPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZB Tl9MRUZUKTsJLyogICA1ODAgwrVzICovCisJcmlnaHRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVz KEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCDCtXMgKi8KKwlsZWZ0X3NwZWVkCT0gaThrX2dldF9m YW5fc3BlZWQoSThLX0ZBTl9MRUZUKTsJLyogICA1ODAgwrVzICovCisJcmlnaHRfc3BlZWQJPSBp OGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX1JJR0hUKTsJLyogICA1ODAgwrVzICovCisJZm5fa2V5 CQk9IGk4a19nZXRfZm5fc3RhdHVzKCk7CQkJLyogICA3NTAgwrVzICovCisJaWYgKHBvd2VyX3N0 YXR1cykKKwkJYWNfcG93ZXIgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwkJLyogMTQ3MDAgwrVz ICovCisJZWxzZQorCQlhY19wb3dlciA9IC0xOworCisJLyoKKwkgKiBJbmZvOgorCSAqCisJICog MSkgIEZvcm1hdCB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQor CSAqIDIpICBCSU9TIHZlcnNpb24KKwkgKiAzKSAgQklPUyBtYWNoaW5lIElECisJICogNCkgIENw dSB0ZW1wZXJhdHVyZQorCSAqIDUpICBMZWZ0IGZhbiBzdGF0dXMKKwkgKiA2KSAgUmlnaHQgZmFu IHN0YXR1cworCSAqIDcpICBMZWZ0IGZhbiBzcGVlZAorCSAqIDgpICBSaWdodCBmYW4gc3BlZWQK KwkgKiA5KSAgQUMgcG93ZXIKKwkgKiAxMCkgRm4gS2V5IHN0YXR1cworCSAqLworCXJldHVybiBz ZXFfcHJpbnRmKHNlcSwgIiVzICVzICVzICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkJICBJ OEtfUFJPQ19GTVQsCisJCQkgIGJpb3NfdmVyc2lvbiwKKwkJCSAgaThrX2dldF9kbWlfZGF0YShE TUlfUFJPRFVDVF9TRVJJQUwpLAorCQkJICBjcHVfdGVtcCwKKwkJCSAgbGVmdF9mYW4sIHJpZ2h0 X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQsCisJCQkgIGFjX3Bvd2VyLCBmbl9rZXkpOwor fQorCitzdGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBm aWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBO VUxMKTsKK30KKworCisvKgorICogSHdtb24gaW50ZXJmYWNlCisgKi8KKworc3RhdGljIHNzaXpl X3QgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBz dHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZikKK3sKKwlz dGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxhYmVsc1tdID0geworCQkiQ1BVIiwKKwkJIkdQVSIs CisJCSJTT0RJTU0iLAorCQkiT3RoZXIiLAorCQkiQW1iaWVudCIsCisJCSJPdGhlciIsCisJfTsK KwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCB0 eXBlOworCisJdHlwZSA9IGk4a19nZXRfdGVtcF90eXBlKGluZGV4KTsKKwlpZiAodHlwZSA8IDAp CisJCXJldHVybiB0eXBlOworCWlmICh0eXBlID49IEFSUkFZX1NJWkUobGFiZWxzKSkKKwkJdHlw ZSA9IEFSUkFZX1NJWkUobGFiZWxzKSAtIDE7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIs IGxhYmVsc1t0eXBlXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X3RlbXAo c3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZh dHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0 dHIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wOworCisJdGVtcCA9IGk4a19nZXRfdGVtcChp bmRleCk7CisJaWYgKHRlbXAgPCAwKQorCQlyZXR1cm4gdGVtcDsKKwlyZXR1cm4gc3ByaW50Zihi dWYsICIlZFxuIiwgdGVtcCAqIDEwMDApOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfaHdtb25f c2hvd19mYW5fbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0 dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0YXRpYyBjb25zdCBjaGFy ICogY29uc3QgbGFiZWxzW10gPSB7CisJCSJQcm9jZXNzb3IgRmFuIiwKKwkJIk1vdGhlcmJvYXJk IEZhbiIsCisJCSJWaWRlbyBGYW4iLAorCQkiUG93ZXIgU3VwcGx5IEZhbiIsCisJCSJDaGlwc2V0 IEZhbiIsCisJCSJPdGhlciBGYW4iLAorCX07CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9h dHRyKGRldmF0dHIpLT5pbmRleDsKKwlib29sIGRvY2sgPSBmYWxzZTsKKwlpbnQgdHlwZTsKKwor CXR5cGUgPSBpOGtfZ2V0X2Zhbl90eXBlKGluZGV4KTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVy biB0eXBlOworCisJaWYgKHR5cGUgJiAweDEwKSB7CisJCWRvY2sgPSB0cnVlOworCQl0eXBlICY9 IDB4MEY7CisJfQorCisJaWYgKHR5cGUgPj0gQVJSQVlfU0laRShsYWJlbHMpKQorCQl0eXBlID0g KEFSUkFZX1NJWkUobGFiZWxzKSAtIDEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMlc1xu IiwgKGRvY2sgPyAiRG9ja2luZyAiIDogIiIpLCBsYWJlbHNbdHlwZV0pOworfQorCitzdGF0aWMg c3NpemVfdCBpOGtfaHdtb25fc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3Ry dWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJaW50 IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgZmFuX3Nw ZWVkOworCisJZmFuX3NwZWVkID0gaThrX2dldF9mYW5fc3BlZWQoaW5kZXgpOworCWlmIChmYW5f c3BlZWQgPCAwKQorCQlyZXR1cm4gZmFuX3NwZWVkOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVk XG4iLCBmYW5fc3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd19wd20o c3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0 dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRy KGRldmF0dHIpLT5pbmRleDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaThrX2dldF9mYW5f c3RhdHVzKGluZGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJu IHNwcmludGYoYnVmLCAiJWRcbiIsIGNsYW1wX3ZhbChzdGF0dXMgKiBpOGtfcHdtX211bHQsIDAs IDI1NSkpOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2V0X3B3bShzdHJ1Y3QgZGV2 aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25z dCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2 X2F0dHIoYXR0ciktPmluZGV4OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnI7CisKKwll cnIgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwor CXZhbCA9IGNsYW1wX3ZhbChESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIGk4a19wd21fbXVsdCksIDAs IGk4a19mYW5fbWF4KTsKKworCW11dGV4X2xvY2soJmk4a19tdXRleCk7CisJZXJyID0gaThrX3Nl dF9mYW4oaW5kZXgsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpOGtfbXV0ZXgpOworCisJcmV0dXJu IGVyciA8IDAgPyAtRUlPIDogY291bnQ7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo dGVtcDFfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDApOworc3Rh dGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3No b3dfdGVtcF9sYWJlbCwgTlVMTCwKKwkJCSAgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS KHRlbXAyX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAxKTsKK3N0 YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9z aG93X3RlbXBfbGFiZWwsIE5VTEwsCisJCQkgIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU Uih0ZW1wM19pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMik7Citz dGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25f c2hvd190ZW1wX2xhYmVsLCBOVUxMLAorCQkJICAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FU VFIodGVtcDRfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDMpOwor c3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9u X3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKKwkJCSAgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9B VFRSKGZhbjFfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2ZhbiwgTlVMTCwgMCk7Citz dGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9z aG93X2Zhbl9sYWJlbCwgTlVMTCwKKwkJCSAgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS KHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBpOGtfaHdtb25fc2hvd19wd20sCisJCQkgIGk4a19o d21vbl9zZXRfcHdtLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9pbnB1dCwg U19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuLCBOVUxMLAorCQkJICAxKTsKK3N0YXRpYyBTRU5T T1JfREVWSUNFX0FUVFIoZmFuMl9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuX2xh YmVsLCBOVUxMLAorCQkJICAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19J UlVHTyB8IFNfSVdVU1IsIGk4a19od21vbl9zaG93X3B3bSwKKwkJCSAgaThrX2h3bW9uX3NldF9w d20sIDEpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaThrX2F0dHJzW10gPSB7CisJJnNl bnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAwICovCisJJnNlbnNv cl9kZXZfYXR0cl90ZW1wMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAxICovCisJJnNlbnNvcl9k ZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAyICovCisJJnNlbnNvcl9kZXZf YXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAzICovCisJJnNlbnNvcl9kZXZfYXR0 cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0ICovCisJJnNlbnNvcl9kZXZfYXR0cl90 ZW1wM19sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiA1ICovCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1w NF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA2ICovCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9s YWJlbC5kZXZfYXR0ci5hdHRyLAkvKiA3ICovCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0 LmRldl9hdHRyLmF0dHIsCS8qIDggKi8KKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbGFiZWwuZGV2 X2F0dHIuYXR0ciwJLyogOSAqLworCSZzZW5zb3JfZGV2X2F0dHJfcHdtMS5kZXZfYXR0ci5hdHRy LAkJLyogMTAgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwJ LyogMTEgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyog MTIgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0ciwJCS8qIDEzICovCisJ TlVMTAorfTsKKworc3RhdGljIHVtb2RlX3QgaThrX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3Qg KmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBpbnQgaW5kZXgpCit7CisJ aWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gMSAmJgorCSAgICAhKGk4a19od21vbl9mbGFncyAm IEk4S19IV01PTl9IQVZFX1RFTVAxKSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDIgJiYg aW5kZXggPD0gMyAmJgorCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RF TVAyKSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDQgJiYgaW5kZXggPD0gNSAmJgorCSAg ICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAzKSkKKwkJcmV0dXJuIDA7 CisJaWYgKGluZGV4ID49IDYgJiYgaW5kZXggPD0gNyAmJgorCSAgICAhKGk4a19od21vbl9mbGFn cyAmIEk4S19IV01PTl9IQVZFX1RFTVA0KSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDgg JiYgaW5kZXggPD0gMTAgJiYKKwkgICAgIShpOGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFW RV9GQU4xKSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDExICYmIGluZGV4IDw9IDEzICYm CisJICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hBVkVfRkFOMikpCisJCXJldHVy biAwOworCisJcmV0dXJuIGF0dHItPm1vZGU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0 cmlidXRlX2dyb3VwIGk4a19ncm91cCA9IHsKKwkuYXR0cnMgPSBpOGtfYXR0cnMsCisJLmlzX3Zp c2libGUgPSBpOGtfaXNfdmlzaWJsZSwKK307CitfX0FUVFJJQlVURV9HUk9VUFMoaThrKTsKKwor c3RhdGljIGludCBfX2luaXQgaThrX2luaXRfaHdtb24odm9pZCkKK3sKKwlpbnQgZXJyOworCisJ aThrX2h3bW9uX2ZsYWdzID0gMDsKKworCS8qIENQVSB0ZW1wZXJhdHVyZSBhdHRyaWJ1dGVzLCBp ZiB0ZW1wZXJhdHVyZSB0eXBlIGlzIE9LICovCisJZXJyID0gaThrX2dldF90ZW1wX3R5cGUoMCk7 CisJaWYgKGVyciA+PSAwKQorCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfVEVN UDE7CisJLyogY2hlY2sgZm9yIGFkZGl0aW9uYWwgdGVtcGVyYXR1cmUgc2Vuc29ycyAqLworCWVy ciA9IGk4a19nZXRfdGVtcF90eXBlKDEpOworCWlmIChlcnIgPj0gMCkKKwkJaThrX2h3bW9uX2Zs YWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVAyOworCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDIp OworCWlmIChlcnIgPj0gMCkKKwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RF TVAzOworCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDMpOworCWlmIChlcnIgPj0gMCkKKwkJaThr X2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVA0OworCisJLyogRmlyc3QgZmFuIGF0 dHJpYnV0ZXMsIGlmIGZhbiB0eXBlIGlzIE9LICovCisJZXJyID0gaThrX2dldF9mYW5fdHlwZSgw KTsKKwlpZiAoZXJyID49IDApCisJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9G QU4xOworCisJLyogU2Vjb25kIGZhbiBhdHRyaWJ1dGVzLCBpZiBmYW4gdHlwZSBpcyBPSyAqLwor CWVyciA9IGk4a19nZXRfZmFuX3R5cGUoMSk7CisJaWYgKGVyciA+PSAwKQorCQlpOGtfaHdtb25f ZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfRkFOMjsKKworCWk4a19od21vbl9kZXYgPSBod21vbl9k ZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImk4ayIsIE5VTEwsCisJCQkJCQkJICBp OGtfZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGk4a19od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9F UlIoaThrX2h3bW9uX2Rldik7CisJCWk4a19od21vbl9kZXYgPSBOVUxMOworCQlwcl9lcnIoImh3 bW9uIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9 CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpOGtfY29uZmlnX2RhdGEgeworCXVpbnQgZmFuX211 bHQ7CisJdWludCBmYW5fbWF4OworfTsKKworZW51bSBpOGtfY29uZmlncyB7CisJREVMTF9MQVRJ VFVERV9ENTIwLAorCURFTExfUFJFQ0lTSU9OXzQ5MCwKKwlERUxMX1NUVURJTywKKwlERUxMX1hQ UywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaThrX2NvbmZpZ19kYXRhIGk4a19jb25maWdf ZGF0YVtdID0geworCVtERUxMX0xBVElUVURFX0Q1MjBdID0geworCQkuZmFuX211bHQgPSAxLAor CQkuZmFuX21heCA9IEk4S19GQU5fVFVSQk8sCisJfSwKKwlbREVMTF9QUkVDSVNJT05fNDkwXSA9 IHsKKwkJLmZhbl9tdWx0ID0gMSwKKwkJLmZhbl9tYXggPSBJOEtfRkFOX1RVUkJPLAorCX0sCisJ W0RFTExfU1RVRElPXSA9IHsKKwkJLmZhbl9tdWx0ID0gMSwKKwkJLmZhbl9tYXggPSBJOEtfRkFO X0hJR0gsCisJfSwKKwlbREVMTF9YUFNdID0geworCQkuZmFuX211bHQgPSAxLAorCQkuZmFuX21h eCA9IEk4S19GQU5fSElHSCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBkbWlfc3lzdGVtX2lk IGk4a19kbWlfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsKKwkJLmlkZW50ID0gIkRlbGwgSW5z cGlyb24iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRl bGwgQ29tcHV0ZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSW5zcGlyb24i KSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUiLAorCQkubWF0Y2hl cyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIiKSwKKwkJ CURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKKwkJfSwKKwl9LAorCXsK KwkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01B VENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RV Q1RfTkFNRSwgIkluc3Bpcm9uIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIExh dGl0dWRlIEQ1MjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRP UiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVk ZSBENTIwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0 YVtERUxMX0xBVElUVURFX0Q1MjBdLAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVk ZSAyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxs IEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwKKwkJ fSwKKwl9LAorCXsJLyogVUsgSW5zcGlyb24gNjQwMCAgKi8KKwkJLmlkZW50ID0gIkRlbGwgSW5z cGlyb24gMyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAi RGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1NMDYxIiksCisJ CX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMiLAorCQkubWF0Y2hlcyA9 IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01B VENIKERNSV9QUk9EVUNUX05BTUUsICJNUDA2MSIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQg PSAiRGVsbCBQcmVjaXNpb24gNDkwIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1J X1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1F LAorCQkJCSAgIlByZWNpc2lvbiBXb3JrU3RhdGlvbiA0OTAiKSwKKwkJfSwKKwkJLmRyaXZlcl9k YXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfUFJFQ0lTSU9OXzQ5MF0sCisJfSwK Kwl7CisJCS5pZGVudCA9ICJEZWxsIFByZWNpc2lvbiIsCisJCS5tYXRjaGVzID0geworCQkJRE1J X01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BS T0RVQ1RfTkFNRSwgIlByZWNpc2lvbiIpLAorCQl9LAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVs bCBWb3N0cm8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwg IkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWb3N0cm8iKSwK KwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgWFBTNDIxIiwKKwkJLm1hdGNoZXMgPSB7 CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRD SChETUlfUFJPRFVDVF9OQU1FLCAiWFBTIEw0MjFYIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVu dCA9ICJEZWxsIFN0dWRpbyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNf VkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlN0 dWRpbyIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFb REVMTF9TVFVESU9dLAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBYUFMgMTMiLAorCQkubWF0 Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJ RE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMxMyIpLAorCQl9LAorCQkuZHJpdmVyX2Rh dGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9YUFNdLAorCX0sCisJeworCQkuaWRl bnQgPSAiRGVsbCBYUFMgTTE0MCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9T WVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwg Ik1YQzA1MSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2Rh dGFbREVMTF9YUFNdLAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwg aThrX2RtaV90YWJsZSk7CisKKy8qCisgKiBQcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc3Vw cG9ydGVkIGxhcHRvcC4KKyAqLworc3RhdGljIGludCBfX2luaXQgaThrX3Byb2JlKHZvaWQpCit7 CisJY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkOworCWludCBmYW4sIHJldDsKKworCS8q CisJICogR2V0IERNSSBpbmZvcm1hdGlvbgorCSAqLworCWlmICghZG1pX2NoZWNrX3N5c3RlbShp OGtfZG1pX3RhYmxlKSkgeworCQlpZiAoIWlnbm9yZV9kbWkgJiYgIWZvcmNlKQorCQkJcmV0dXJu IC1FTk9ERVY7CisKKwkJcHJfaW5mbygibm90IHJ1bm5pbmcgb24gYSBzdXBwb3J0ZWQgRGVsbCBz eXN0ZW0uXG4iKTsKKwkJcHJfaW5mbygidmVuZG9yPSVzLCBtb2RlbD0lcywgdmVyc2lvbj0lc1xu IiwKKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX1NZU19WRU5ET1IpLAorCQkJaThrX2dldF9kbWlf ZGF0YShETUlfUFJPRFVDVF9OQU1FKSwKKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX0JJT1NfVkVS U0lPTikpOworCX0KKworCXN0cmxjcHkoYmlvc192ZXJzaW9uLCBpOGtfZ2V0X2RtaV9kYXRhKERN SV9CSU9TX1ZFUlNJT04pLAorCQlzaXplb2YoYmlvc192ZXJzaW9uKSk7CisKKwkvKgorCSAqIEdl dCBTTU0gRGVsbCBzaWduYXR1cmUKKwkgKi8KKwlpZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZShJ OEtfU01NX0dFVF9ERUxMX1NJRzEpICYmCisJICAgIGk4a19nZXRfZGVsbF9zaWduYXR1cmUoSThL X1NNTV9HRVRfREVMTF9TSUcyKSkgeworCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgU01NIERlbGwg c2lnbmF0dXJlXG4iKTsKKwkJaWYgKCFmb3JjZSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKwor CS8qCisJICogU2V0IGZhbiBtdWx0aXBsaWVyIGFuZCBtYXhpbWFsIGZhbiBzcGVlZCBmcm9tIGRt aSBjb25maWcKKwkgKiBWYWx1ZXMgc3BlY2lmaWVkIGluIG1vZHVsZSBwYXJhbWV0ZXJzIG92ZXJy aWRlIHZhbHVlcyBmcm9tIGRtaQorCSAqLworCWlkID0gZG1pX2ZpcnN0X21hdGNoKGk4a19kbWlf dGFibGUpOworCWlmIChpZCAmJiBpZC0+ZHJpdmVyX2RhdGEpIHsKKwkJY29uc3Qgc3RydWN0IGk4 a19jb25maWdfZGF0YSAqY29uZiA9IGlkLT5kcml2ZXJfZGF0YTsKKwkJaWYgKCFmYW5fbXVsdCAm JiBjb25mLT5mYW5fbXVsdCkKKwkJCWZhbl9tdWx0ID0gY29uZi0+ZmFuX211bHQ7CisJCWlmICgh ZmFuX21heCAmJiBjb25mLT5mYW5fbWF4KQorCQkJZmFuX21heCA9IGNvbmYtPmZhbl9tYXg7CisJ fQorCisJaThrX2Zhbl9tYXggPSBmYW5fbWF4ID8gOiBJOEtfRkFOX0hJR0g7CS8qIE11c3Qgbm90 IGJlIDAgKi8KKwlpOGtfcHdtX211bHQgPSBESVZfUk9VTkRfVVAoMjU1LCBpOGtfZmFuX21heCk7 CisKKwlpZiAoIWZhbl9tdWx0KSB7CisJCS8qCisJCSAqIEF1dG9kZXRlY3QgZmFuIG11bHRpcGxp ZXIgYmFzZWQgb24gbm9taW5hbCBycG0KKwkJICogSWYgZmFuIHJlcG9ydHMgcnBtIHZhbHVlIHRv byBoaWdoIHRoZW4gc2V0IG11bHRpcGxpZXIgdG8gMQorCQkgKi8KKwkJZm9yIChmYW4gPSAwOyBm YW4gPCAyOyArK2ZhbikgeworCQkJcmV0ID0gaThrX2dldF9mYW5fbm9taW5hbF9zcGVlZChmYW4s IGk4a19mYW5fbWF4KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJl dCA+IEk4S19GQU5fTUFYX1JQTSkKKwkJCQlpOGtfZmFuX211bHQgPSAxOworCQkJYnJlYWs7CisJ CX0KKwl9IGVsc2UgeworCQkvKiBGYW4gbXVsdGlwbGllciB3YXMgc3BlY2lmaWVkIGluIG1vZHVs ZSBwYXJhbSBvciBpbiBkbWkgKi8KKwkJaThrX2Zhbl9tdWx0ID0gZmFuX211bHQ7CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCit7CisJc3Ry dWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKKwlpbnQgZXJyOworCisJLyogQXJlIHdlIHJ1 bm5pbmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KKwlpZiAoaThrX3Byb2JlKCkpCisJCXJl dHVybiAtRU5PREVWOworCisJLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KKwlwcm9jX2k4 ayA9IHByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMpOworCWlmICghcHJvY19p OGspCisJCXJldHVybiAtRU5PRU5UOworCisJZXJyID0gaThrX2luaXRfaHdtb24oKTsKKwlpZiAo ZXJyKQorCQlnb3RvIGV4aXRfcmVtb3ZlX3Byb2M7CisKKwlyZXR1cm4gMDsKKworIGV4aXRfcmVt b3ZlX3Byb2M6CisJcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpOGtfZXhpdCh2b2lkKQoreworCWh3bW9uX2Rldmlj ZV91bnJlZ2lzdGVyKGk4a19od21vbl9kZXYpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBO VUxMKTsKK30KKworbW9kdWxlX2luaXQoaThrX2luaXQpOworbW9kdWxlX2V4aXQoaThrX2V4aXQp OwotLSAKMS43LjkuNQoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcK aHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v2 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár @ 2015-03-29 12:57 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k interface which is needed only for old Dell Inspirion models or for userspace i8kutils package. For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- arch/x86/Kconfig | 25 +++---- drivers/hwmon/Kconfig | 11 +++ drivers/hwmon/Makefile | 2 +- drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ 4 files changed, 106 insertions(+), 82 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index b7d31ca..0f73afd 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1063,24 +1063,19 @@ config TOSHIBA Say N otherwise. config I8K - tristate "Dell laptop support" + tristate "Dell i8k legacy laptop support" select HWMON + select SENSORS_DELL_SMM ---help--- - This adds a driver to safely access the System Management Mode - of the CPU on the Dell Inspiron 8000. The System Management Mode - is used to read cpu temperature and cooling fan status and to - control the fans on the I8K portables. + This option enables legacy /proc/i8k userspace interface in hwmon + dell-smm-hwmon driver. Character file /proc/i8k reports bios version, + temperature and allows controlling fan speeds of Dell laptops via + System Management Mode. For old Dell laptops (like Dell Inspiron 8000) + it reports also power and hotkey status. For fan speed control is + needed userspace package i8kutils. - This driver has been tested only on the Inspiron 8000 but it may - also work with other Dell laptops. You can force loading on other - models by passing the parameter `force=1' to the module. Use at - your own risk. - - For information on utilities to make use of this driver see the - I8K Linux utilities web site at: - <http://people.debian.org/~dz/i8k/> - - Say Y if you intend to run this kernel on a Dell Inspiron 8000. + Say Y if you intend to run this kernel on old Dell laptops or want to + use userspace package i8kutils. Say N otherwise. config X86_REBOOTFIXUPS diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 110fade..9090790 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -371,6 +371,17 @@ config SENSORS_DS1621 This driver can also be built as a module. If so, the module will be called ds1621. +config SENSORS_DELL_SMM + tristate "Dell laptop SMM BIOS hwmon driver" + depends on X86 && DMI + help + This hwmon driver adds support for reporting temperature of different + sensors and controls the fans on Dell laptops via System Management + Mode provided by Dell BIOS. + + When option I8K is also enabled this driver provides legacy /proc/i8k + userspace interface for i8kutils package. + config SENSORS_DA9052_ADC tristate "Dialog DA9052/DA9053 ADC" depends on PMIC_DA9052 diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 1c3e458..89a00e9 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o obj-$(CONFIG_SENSORS_DME1737) += dme1737.o obj-$(CONFIG_SENSORS_DS620) += ds620.o obj-$(CONFIG_SENSORS_DS1621) += ds1621.o @@ -155,7 +156,6 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o -obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index 2b04e4f..378793a 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("i8k"); @@ -93,6 +93,7 @@ static bool ignore_dmi; module_param(ignore_dmi, bool, 0); MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); +#if IS_ENABLED(CONFIG_I8K) static bool restricted; module_param(restricted, bool, 0); MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); static bool power_status; module_param(power_status, bool, 0600); MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); +#endif static uint fan_mult; module_param(fan_mult, uint, 0); @@ -109,18 +111,6 @@ static uint fan_max; module_param(fan_max, uint, 0); MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - struct smm_regs { unsigned int eax; unsigned int ebx __packed; @@ -221,45 +211,6 @@ out: } /* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* * Read the fan status. */ static int i8k_get_fan_status(int fan) @@ -378,6 +329,51 @@ static int i8k_get_dell_signature(int req_fn) return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; } +#if IS_ENABLED(CONFIG_I8K) + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Procfs interface + */ + static int i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) { @@ -526,6 +522,37 @@ static int i8k_open_fs(struct inode *inode, struct file *file) return single_open(file, i8k_proc_show, NULL); } +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +static void __init i8k_init_procfs(void) +{ + /* Register the proc entry */ + proc_create("i8k", 0, NULL, &i8k_fops); +} + +static void __exit i8k_exit_procfs(void) +{ + remove_proc_entry("i8k", NULL); +} + +#else + +static inline void __init i8k_init_procfs(void) +{ +} + +static inline void __exit i8k_exit_procfs(void) +{ +} + +#endif /* * Hwmon interface @@ -748,8 +775,8 @@ static int __init i8k_init_hwmon(void) if (err >= 0) i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell-smm", + NULL, i8k_groups); if (IS_ERR(i8k_hwmon_dev)) { err = PTR_ERR(i8k_hwmon_dev); i8k_hwmon_dev = NULL; @@ -974,33 +1001,24 @@ static int __init i8k_probe(void) static int __init i8k_init(void) { - struct proc_dir_entry *proc_i8k; int err; /* Are we running on an supported laptop? */ if (i8k_probe()) return -ENODEV; - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - err = i8k_init_hwmon(); if (err) - goto exit_remove_proc; + return err; + i8k_init_procfs(); return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; } static void __exit i8k_exit(void) { hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); + i8k_exit_procfs(); } module_init(i8k_init); -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v2 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-03-29 12:57 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-03-29 12:57 UTC (permalink / raw) To: Guenter Roeck, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzcGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RF TExfU01NIGFuZCBDT05GSUdfSThLLgpPcHRpb24gU0VOU09SU19ERUxMX1NNTSBpcyBub3cgdXNl ZCB0byBlbmFibGUgY29tcGlsYXRpb24gb2YgZGVsbC1zbW0taHdtb24KZHJpdmVyIGFuZCBvbGQg Q09ORklHX0k4SyBvcHRpb24gdG8gZW5hYmxlIC9wcm9jL2k4ayBpbnRlcmZhY2UgaW4gZHJpdmVy LgoKU28gdGhpcyBjaGFuZ2UgYWxsb3dzIHRvIGNvbXBpbGUgZGVsbC1zbW0taHdtb24gZHJpdmVy IHdpdGhvdXQgbGVnYWN5IC9wcm9jL2k4awppbnRlcmZhY2Ugd2hpY2ggaXMgbmVlZGVkIG9ubHkg Zm9yIG9sZCBEZWxsIEluc3BpcmlvbiBtb2RlbHMgb3IgZm9yIHVzZXJzcGFjZQppOGt1dGlscyBw YWNrYWdlLgoKRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiBDT05GSUdfSThLIGlzIGVu YWJsZWQgdGhlbiBhbHNvIFNFTlNPUlNfREVMTF9TTU0KaXMgZW5hYmxlZCBhbmQgc28gZHJpdmVy IGRlbGwtc21tLWh3bW9uICh3aXRoIC9wcm9jL2k4aykgaXMgY29tcGlsZWQuCgpTaWduZWQtb2Zm LWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Ci0tLQogYXJjaC94ODYvS2Nv bmZpZyAgICAgICAgICAgICAgIHwgICAyNSArKystLS0tCiBkcml2ZXJzL2h3bW9uL0tjb25maWcg ICAgICAgICAgfCAgIDExICsrKwogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgIHwgICAg MiArLQogZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgIDE1MCArKysrKysrKysrKysr KysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDEwNiBpbnNlcnRp b25zKCspLCA4MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIv YXJjaC94ODYvS2NvbmZpZwppbmRleCBiN2QzMWNhLi4wZjczYWZkIDEwMDY0NAotLS0gYS9hcmNo L3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEwNjMsMjQgKzEwNjMsMTkg QEAgY29uZmlnIFRPU0hJQkEKIAkgIFNheSBOIG90aGVyd2lzZS4KIAogY29uZmlnIEk4SwotCXRy aXN0YXRlICJEZWxsIGxhcHRvcCBzdXBwb3J0IgorCXRyaXN0YXRlICJEZWxsIGk4ayBsZWdhY3kg bGFwdG9wIHN1cHBvcnQiCiAJc2VsZWN0IEhXTU9OCisJc2VsZWN0IFNFTlNPUlNfREVMTF9TTU0K IAktLS1oZWxwLS0tCi0JICBUaGlzIGFkZHMgYSBkcml2ZXIgdG8gc2FmZWx5IGFjY2VzcyB0aGUg U3lzdGVtIE1hbmFnZW1lbnQgTW9kZQotCSAgb2YgdGhlIENQVSBvbiB0aGUgRGVsbCBJbnNwaXJv biA4MDAwLiBUaGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQotCSAgaXMgdXNlZCB0byByZWFkIGNw dSB0ZW1wZXJhdHVyZSBhbmQgY29vbGluZyBmYW4gc3RhdHVzIGFuZCB0bwotCSAgY29udHJvbCB0 aGUgZmFucyBvbiB0aGUgSThLIHBvcnRhYmxlcy4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGVn YWN5IC9wcm9jL2k4ayB1c2Vyc3BhY2UgaW50ZXJmYWNlIGluIGh3bW9uCisJICBkZWxsLXNtbS1o d21vbiBkcml2ZXIuIENoYXJhY3RlciBmaWxlIC9wcm9jL2k4ayByZXBvcnRzIGJpb3MgdmVyc2lv biwKKwkgIHRlbXBlcmF0dXJlIGFuZCBhbGxvd3MgY29udHJvbGxpbmcgZmFuIHNwZWVkcyBvZiBE ZWxsIGxhcHRvcHMgdmlhCisJICBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlLiBGb3Igb2xkIERlbGwg bGFwdG9wcyAobGlrZSBEZWxsIEluc3Bpcm9uIDgwMDApCisJICBpdCByZXBvcnRzIGFsc28gcG93 ZXIgYW5kIGhvdGtleSBzdGF0dXMuIEZvciBmYW4gc3BlZWQgY29udHJvbCBpcworCSAgbmVlZGVk IHVzZXJzcGFjZSBwYWNrYWdlIGk4a3V0aWxzLgogCi0JICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0 ZXN0ZWQgb25seSBvbiB0aGUgSW5zcGlyb24gODAwMCBidXQgaXQgbWF5Ci0JICBhbHNvIHdvcmsg d2l0aCBvdGhlciBEZWxsIGxhcHRvcHMuIFlvdSBjYW4gZm9yY2UgbG9hZGluZyBvbiBvdGhlcgot CSAgbW9kZWxzIGJ5IHBhc3NpbmcgdGhlIHBhcmFtZXRlciBgZm9yY2U9MScgdG8gdGhlIG1vZHVs ZS4gVXNlIGF0Ci0JICB5b3VyIG93biByaXNrLgotCi0JICBGb3IgaW5mb3JtYXRpb24gb24gdXRp bGl0aWVzIHRvIG1ha2UgdXNlIG9mIHRoaXMgZHJpdmVyIHNlZSB0aGUKLQkgIEk4SyBMaW51eCB1 dGlsaXRpZXMgd2ViIHNpdGUgYXQ6Ci0JICA8aHR0cDovL3Blb3BsZS5kZWJpYW4ub3JnL35kei9p OGsvPgotCi0JICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIERl bGwgSW5zcGlyb24gODAwMC4KKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2Vy bmVsIG9uIG9sZCBEZWxsIGxhcHRvcHMgb3Igd2FudCB0bworCSAgdXNlIHVzZXJzcGFjZSBwYWNr YWdlIGk4a3V0aWxzLgogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgWDg2X1JFQk9PVEZJ WFVQUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9L Y29uZmlnCmluZGV4IDExMGZhZGUuLjkwOTA3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24v S2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTM3MSw2ICszNzEsMTcgQEAg Y29uZmlnIFNFTlNPUlNfRFMxNjIxCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBh cyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBkczE2MjEu CiAKK2NvbmZpZyBTRU5TT1JTX0RFTExfU01NCisJdHJpc3RhdGUgIkRlbGwgbGFwdG9wIFNNTSBC SU9TIGh3bW9uIGRyaXZlciIKKwlkZXBlbmRzIG9uIFg4NiAmJiBETUkKKwloZWxwCisJICBUaGlz IGh3bW9uIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJlcG9ydGluZyB0ZW1wZXJhdHVyZSBvZiBk aWZmZXJlbnQKKwkgIHNlbnNvcnMgYW5kIGNvbnRyb2xzIHRoZSBmYW5zIG9uIERlbGwgbGFwdG9w cyB2aWEgU3lzdGVtIE1hbmFnZW1lbnQKKwkgIE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBCSU9TLgor CisJICBXaGVuIG9wdGlvbiBJOEsgaXMgYWxzbyBlbmFibGVkIHRoaXMgZHJpdmVyIHByb3ZpZGVz IGxlZ2FjeSAvcHJvYy9pOGsKKwkgIHVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIGk4a3V0aWxzIHBh Y2thZ2UuCisKIGNvbmZpZyBTRU5TT1JTX0RBOTA1Ml9BREMKIAl0cmlzdGF0ZSAiRGlhbG9nIERB OTA1Mi9EQTkwNTMgQURDIgogCWRlcGVuZHMgb24gUE1JQ19EQTkwNTIKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDFjM2U0 NTguLjg5YTAwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJp dmVycy9od21vbi9NYWtlZmlsZQpAQCAtNDksNiArNDksNyBAQCBvYmotJChDT05GSUdfU0VOU09S U19BVFhQMSkJKz0gYXR4cDEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQ09SRVRFTVApCSs9IGNv cmV0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RBOTA1Ml9BREMpKz0gZGE5MDUyLWh3bW9u Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RBOTA1NSkrPSBkYTkwNTUtaHdtb24ubworb2JqLSQo Q09ORklHX1NFTlNPUlNfREVMTF9TTU0pCSs9IGRlbGwtc21tLWh3bW9uLm8KIG9iai0kKENPTkZJ R19TRU5TT1JTX0RNRTE3MzcpCSs9IGRtZTE3Mzcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRFM2 MjApCSs9IGRzNjIwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8K QEAgLTE1NSw3ICsxNTYsNiBAQCBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4 M2w3ODV0cy5vCiBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5v CiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChD T05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCi1vYmotJChDT05GSUdfSThL KQkJKz0gZGVsbC1zbW0taHdtb24ubwogCiBvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8K IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9o d21vbi9kZWxsLXNtbS1od21vbi5jCmluZGV4IDJiMDRlNGYuLjM3ODc5M2EgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwt c21tLWh3bW9uLmMKQEAgLTgxLDcgKzgxLDcgQEAgc3RhdGljIHVpbnQgaThrX2Zhbl9tYXggPSBJ OEtfRkFOX0hJR0g7CiAKIE1PRFVMRV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJp YW4ub3JnKSIpOwogTU9EVUxFX0FVVEhPUigiUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwu Y29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklP UyBvbiBEZWxsIGxhcHRvcHMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgU01N IEJJT1MgaHdtb24gZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJ QVMoImk4ayIpOwogCkBAIC05Myw2ICs5Myw3IEBAIHN0YXRpYyBib29sIGlnbm9yZV9kbWk7CiBt b2R1bGVfcGFyYW0oaWdub3JlX2RtaSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlnbm9y ZV9kbWksICJDb250aW51ZSBwcm9iaW5nIGhhcmR3YXJlIGV2ZW4gaWYgRE1JIGRhdGEgZG9lcyBu b3QgbWF0Y2giKTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0k4SykKIHN0YXRpYyBib29sIHJl c3RyaWN0ZWQ7CiBtb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFS TV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJp bGl0eSBzZXQiKTsKQEAgLTEwMCw2ICsxMDEsNyBAQCBNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0 ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKIHN0 YXRpYyBib29sIHBvd2VyX3N0YXR1czsKIG1vZHVsZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2ws IDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3Rh dHVzIGluIC9wcm9jL2k4ayIpOworI2VuZGlmCiAKIHN0YXRpYyB1aW50IGZhbl9tdWx0OwogbW9k dWxlX3BhcmFtKGZhbl9tdWx0LCB1aW50LCAwKTsKQEAgLTEwOSwxOCArMTExLDYgQEAgc3RhdGlj IHVpbnQgZmFuX21heDsKIG1vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKIE1PRFVMRV9Q QVJNX0RFU0MoZmFuX21heCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBzcGVlZCAoZGVmYXVs dDogYXV0b2RldGVjdCkiKTsKIAotc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUg Kmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0 IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGNvbnN0IHN0 cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxF LAotCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJ CT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lv Y3RsCT0gaThrX2lvY3RsLAotfTsKLQogc3RydWN0IHNtbV9yZWdzIHsKIAl1bnNpZ25lZCBpbnQg ZWF4OwogCXVuc2lnbmVkIGludCBlYnggX19wYWNrZWQ7CkBAIC0yMjEsNDUgKzIxMSw2IEBAIG91 dDoKIH0KIAogLyoKLSAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQg aThrX2dldF9mbl9zdGF0dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVh eCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OwotCWludCByYzsKLQotCXJjID0gaThrX3NtbSgmcmVn cyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0Jc3dpdGNoICgocmVncy5lYXggPj4g SThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7Ci0JY2FzZSBJOEtfRk5fVVA6Ci0JCXJldHVy biBJOEtfVk9MX1VQOwotCWNhc2UgSThLX0ZOX0RPV046Ci0JCXJldHVybiBJOEtfVk9MX0RPV047 Ci0JY2FzZSBJOEtfRk5fTVVURToKLQkJcmV0dXJuIEk4S19WT0xfTVVURTsKLQlkZWZhdWx0Ogot CQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCi0gKi8K LXN0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3Jl Z3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTLCB9OwotCWludCByYzsKLQot CXJjID0gaThrX3NtbSgmcmVncyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0 dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19BQyA6IEk4S19CQVRU RVJZOwotfQotCi0vKgogICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KICAqLwogc3RhdGljIGludCBp OGtfZ2V0X2Zhbl9zdGF0dXMoaW50IGZhbikKQEAgLTM3OCw2ICszMjksNTEgQEAgc3RhdGljIGlu dCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKGludCByZXFfZm4pCiAJcmV0dXJuIHJlZ3MuZWF4ID09 IDExNDU2NTE1MjcgJiYgcmVncy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKIH0KIAorI2lm IElTX0VOQUJMRUQoQ09ORklHX0k4SykKKworLyoKKyAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMu CisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3Qgc21t X3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OworCWludCByYzsKKwor CXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc3dp dGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisJY2FzZSBJ OEtfRk5fVVA6CisJCXJldHVybiBJOEtfVk9MX1VQOworCWNhc2UgSThLX0ZOX0RPV046CisJCXJl dHVybiBJOEtfVk9MX0RPV047CisJY2FzZSBJOEtfRk5fTVVURToKKwkJcmV0dXJuIEk4S19WT0xf TVVURTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBw b3dlciBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkK K3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVT LCB9OworCWludCByYzsKKworCXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJ cmV0dXJuIHJjOworCisJcmV0dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/ IEk4S19BQyA6IEk4S19CQVRURVJZOworfQorCisvKgorICogUHJvY2ZzIGludGVyZmFjZQorICov CisKIHN0YXRpYyBpbnQKIGk4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2ln bmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTI2LDYgKzUyMiwzNyBAQCBz dGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpm aWxlKQogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBOVUxMKTsKIH0K IAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CisJLm93 bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAorCS5yZWFkCQk9IHNl cV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVh c2UsCisJLnVubG9ja2VkX2lvY3RsCT0gaThrX2lvY3RsLAorfTsKKworc3RhdGljIHZvaWQgX19p bml0IGk4a19pbml0X3Byb2Nmcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5 ICovCisJcHJvY19jcmVhdGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9wcyk7Cit9CisKK3N0YXRp YyB2b2lkIF9fZXhpdCBpOGtfZXhpdF9wcm9jZnModm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRy eSgiaThrIiwgTlVMTCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQg aThrX2luaXRfcHJvY2ZzKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQg aThrX2V4aXRfcHJvY2ZzKHZvaWQpCit7Cit9CisKKyNlbmRpZgogCiAvKgogICogSHdtb24gaW50 ZXJmYWNlCkBAIC03NDgsOCArNzc1LDggQEAgc3RhdGljIGludCBfX2luaXQgaThrX2luaXRfaHdt b24odm9pZCkKIAlpZiAoZXJyID49IDApCiAJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05f SEFWRV9GQU4yOwogCi0JaThrX2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRo X2dyb3VwcyhOVUxMLCAiaThrIiwgTlVMTCwKLQkJCQkJCQkgIGk4a19ncm91cHMpOworCWk4a19o d21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImRlbGwt c21tIiwKKwkJCQkJCQkgIE5VTEwsIGk4a19ncm91cHMpOwogCWlmIChJU19FUlIoaThrX2h3bW9u X2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihpOGtfaHdtb25fZGV2KTsKIAkJaThrX2h3bW9uX2Rl diA9IE5VTEw7CkBAIC05NzQsMzMgKzEwMDEsMjQgQEAgc3RhdGljIGludCBfX2luaXQgaThrX3By b2JlKHZvaWQpCiAKIHN0YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0 IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKIAlpbnQgZXJyOwogCiAJLyogQXJlIHdlIHJ1bm5p bmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KIAlpZiAoaThrX3Byb2JlKCkpCiAJCXJldHVy biAtRU5PREVWOwogCi0JLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KLQlwcm9jX2k4ayA9 IHByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMpOwotCWlmICghcHJvY19pOGsp Ci0JCXJldHVybiAtRU5PRU5UOwotCiAJZXJyID0gaThrX2luaXRfaHdtb24oKTsKIAlpZiAoZXJy KQotCQlnb3RvIGV4aXRfcmVtb3ZlX3Byb2M7CisJCXJldHVybiBlcnI7CiAKKwlpOGtfaW5pdF9w cm9jZnMoKTsKIAlyZXR1cm4gMDsKLQotIGV4aXRfcmVtb3ZlX3Byb2M6Ci0JcmVtb3ZlX3Byb2Nf ZW50cnkoImk4ayIsIE5VTEwpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhp dCBpOGtfZXhpdCh2b2lkKQogewogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19od21vbl9k ZXYpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKKwlpOGtfZXhpdF9wcm9jZnMo KTsKIH0KIAogbW9kdWxlX2luaXQoaThrX2luaXQpOwotLSAKMS43LjkuNQoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBs aXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3Jn L21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár @ 2015-04-28 12:38 ` Greg Kroah-Hartman -1 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-28 12:38 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sun, Mar 29, 2015 at 02:57:39PM +0200, Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/x86/Kconfig | 25 +++---- > drivers/hwmon/Kconfig | 11 +++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ > 4 files changed, 106 insertions(+), 82 deletions(-) This doesn't apply to 4.1-rc1, so I can't apply this series now. Can you respin it and resend? thanks, greg k-h ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-04-28 12:38 ` Greg Kroah-Hartman 0 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-28 12:38 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Sun, Mar 29, 2015 at 02:57:39PM +0200, Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/x86/Kconfig | 25 +++---- > drivers/hwmon/Kconfig | 11 +++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ > 4 files changed, 106 insertions(+), 82 deletions(-) This doesn't apply to 4.1-rc1, so I can't apply this series now. Can you respin it and resend? thanks, greg k-h _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-04-28 12:38 ` [lm-sensors] " Greg Kroah-Hartman @ 2015-04-29 11:41 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-29 11:41 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is better name then abbreviation i8k. For backward compatibility is added macro MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K compile option was not changed. This commit also adds me as maintainer of this new dell-smm-hwmon driver and remove Guenter Roeck from list who is implicit maintainer all hwmon drivers. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- MAINTAINERS | 4 +- drivers/char/Makefile | 1 - drivers/char/i8k.c | 1007 --------------------------------------- drivers/hwmon/Makefile | 1 + drivers/hwmon/dell-smm-hwmon.c | 1009 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1012 insertions(+), 1010 deletions(-) delete mode 100644 drivers/char/i8k.c create mode 100644 drivers/hwmon/dell-smm-hwmon.c diff --git a/MAINTAINERS b/MAINTAINERS index 2e5bbc0..014c15f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3077,9 +3077,9 @@ S: Maintained F: drivers/platform/x86/dell-smo8800.c DELL LAPTOP SMM DRIVER -M: Guenter Roeck <linux@roeck-us.net> +M: Pali Rohár <pali.rohar@gmail.com> S: Maintained -F: drivers/char/i8k.c +F: drivers/hwmon/dell-smm-hwmon.c F: include/uapi/linux/i8k.h DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) diff --git a/drivers/char/Makefile b/drivers/char/Makefile index d06cde26..1d9cf00 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -36,7 +36,6 @@ else obj-$(CONFIG_NVRAM) += nvram.o endif obj-$(CONFIG_TOSHIBA) += toshiba.o -obj-$(CONFIG_I8K) += i8k.o obj-$(CONFIG_DS1620) += ds1620.o obj-$(CONFIG_HW_RANDOM) += hw_random/ obj-$(CONFIG_PPDEV) += ppdev.o diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c deleted file mode 100644 index a43048b..0000000 --- a/drivers/char/i8k.c +++ /dev/null @@ -1,1007 +0,0 @@ -/* - * i8k.c -- Linux driver for accessing the SMM BIOS on Dell laptops. - * - * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> - * - * Hwmon integration: - * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> - * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> - * Copyright (C) 2014 Pali Rohár <pali.rohar@gmail.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - */ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/delay.h> -#include <linux/module.h> -#include <linux/types.h> -#include <linux/init.h> -#include <linux/proc_fs.h> -#include <linux/seq_file.h> -#include <linux/dmi.h> -#include <linux/capability.h> -#include <linux/mutex.h> -#include <linux/hwmon.h> -#include <linux/hwmon-sysfs.h> -#include <linux/uaccess.h> -#include <linux/io.h> -#include <linux/sched.h> - -#include <linux/i8k.h> - -#define I8K_SMM_FN_STATUS 0x0025 -#define I8K_SMM_POWER_STATUS 0x0069 -#define I8K_SMM_SET_FAN 0x01a3 -#define I8K_SMM_GET_FAN 0x00a3 -#define I8K_SMM_GET_SPEED 0x02a3 -#define I8K_SMM_GET_FAN_TYPE 0x03a3 -#define I8K_SMM_GET_NOM_SPEED 0x04a3 -#define I8K_SMM_GET_TEMP 0x10a3 -#define I8K_SMM_GET_TEMP_TYPE 0x11a3 -#define I8K_SMM_GET_DELL_SIG1 0xfea3 -#define I8K_SMM_GET_DELL_SIG2 0xffa3 - -#define I8K_FAN_MULT 30 -#define I8K_FAN_MAX_RPM 30000 -#define I8K_MAX_TEMP 127 - -#define I8K_FN_NONE 0x00 -#define I8K_FN_UP 0x01 -#define I8K_FN_DOWN 0x02 -#define I8K_FN_MUTE 0x04 -#define I8K_FN_MASK 0x07 -#define I8K_FN_SHIFT 8 - -#define I8K_POWER_AC 0x05 -#define I8K_POWER_BATTERY 0x01 - -static DEFINE_MUTEX(i8k_mutex); -static char bios_version[4]; -static struct device *i8k_hwmon_dev; -static u32 i8k_hwmon_flags; -static uint i8k_fan_mult = I8K_FAN_MULT; -static uint i8k_pwm_mult; -static uint i8k_fan_max = I8K_FAN_HIGH; - -#define I8K_HWMON_HAVE_TEMP1 (1 << 0) -#define I8K_HWMON_HAVE_TEMP2 (1 << 1) -#define I8K_HWMON_HAVE_TEMP3 (1 << 2) -#define I8K_HWMON_HAVE_TEMP4 (1 << 3) -#define I8K_HWMON_HAVE_FAN1 (1 << 4) -#define I8K_HWMON_HAVE_FAN2 (1 << 5) - -MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); -MODULE_LICENSE("GPL"); - -static bool force; -module_param(force, bool, 0); -MODULE_PARM_DESC(force, "Force loading without checking for supported models"); - -static bool ignore_dmi; -module_param(ignore_dmi, bool, 0); -MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); - -static bool restricted; -module_param(restricted, bool, 0); -MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); - -static bool power_status; -module_param(power_status, bool, 0600); -MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); - -static uint fan_mult; -module_param(fan_mult, uint, 0); -MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); - -static uint fan_max; -module_param(fan_max, uint, 0); -MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); - -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - -struct smm_regs { - unsigned int eax; - unsigned int ebx __packed; - unsigned int ecx __packed; - unsigned int edx __packed; - unsigned int esi __packed; - unsigned int edi __packed; -}; - -static inline const char *i8k_get_dmi_data(int field) -{ - const char *dmi_data = dmi_get_system_info(field); - - return dmi_data && *dmi_data ? dmi_data : "?"; -} - -/* - * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. - */ -static int i8k_smm(struct smm_regs *regs) -{ - int rc; - int eax = regs->eax; - cpumask_var_t old_mask; - - /* SMM requires CPU 0 */ - if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) - return -ENOMEM; - cpumask_copy(old_mask, ¤t->cpus_allowed); - rc = set_cpus_allowed_ptr(current, cpumask_of(0)); - if (rc) - goto out; - if (smp_processor_id() != 0) { - rc = -EBUSY; - goto out; - } - -#if defined(CONFIG_X86_64) - asm volatile("pushq %%rax\n\t" - "movl 0(%%rax),%%edx\n\t" - "pushq %%rdx\n\t" - "movl 4(%%rax),%%ebx\n\t" - "movl 8(%%rax),%%ecx\n\t" - "movl 12(%%rax),%%edx\n\t" - "movl 16(%%rax),%%esi\n\t" - "movl 20(%%rax),%%edi\n\t" - "popq %%rax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgq %%rax,(%%rsp)\n\t" - "movl %%ebx,4(%%rax)\n\t" - "movl %%ecx,8(%%rax)\n\t" - "movl %%edx,12(%%rax)\n\t" - "movl %%esi,16(%%rax)\n\t" - "movl %%edi,20(%%rax)\n\t" - "popq %%rdx\n\t" - "movl %%edx,0(%%rax)\n\t" - "pushfq\n\t" - "popq %%rax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#else - asm volatile("pushl %%eax\n\t" - "movl 0(%%eax),%%edx\n\t" - "push %%edx\n\t" - "movl 4(%%eax),%%ebx\n\t" - "movl 8(%%eax),%%ecx\n\t" - "movl 12(%%eax),%%edx\n\t" - "movl 16(%%eax),%%esi\n\t" - "movl 20(%%eax),%%edi\n\t" - "popl %%eax\n\t" - "out %%al,$0xb2\n\t" - "out %%al,$0x84\n\t" - "xchgl %%eax,(%%esp)\n\t" - "movl %%ebx,4(%%eax)\n\t" - "movl %%ecx,8(%%eax)\n\t" - "movl %%edx,12(%%eax)\n\t" - "movl %%esi,16(%%eax)\n\t" - "movl %%edi,20(%%eax)\n\t" - "popl %%edx\n\t" - "movl %%edx,0(%%eax)\n\t" - "lahf\n\t" - "shrl $8,%%eax\n\t" - "andl $1,%%eax\n" - : "=a"(rc) - : "a"(regs) - : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); -#endif - if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) - rc = -EINVAL; - -out: - set_cpus_allowed_ptr(current, old_mask); - free_cpumask_var(old_mask); - return rc; -} - -/* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* - * Read the fan status. - */ -static int i8k_get_fan_status(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan speed in RPM. - */ -static int i8k_get_fan_speed(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Read the fan type. - */ -static int i8k_get_fan_type(int fan) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; - - regs.ebx = fan & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the fan nominal rpm for specific fan speed. - */ -static int i8k_get_fan_nominal_speed(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; - - regs.ebx = (fan & 0xff) | (speed << 8); - return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; -} - -/* - * Set the fan speed (off, low, high). Returns the new fan status. - */ -static int i8k_set_fan(int fan, int speed) -{ - struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; - - speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); - regs.ebx = (fan & 0xff) | (speed << 8); - - return i8k_smm(®s) ? : i8k_get_fan_status(fan); -} - -static int i8k_get_temp_type(int sensor) -{ - struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; - - regs.ebx = sensor & 0xff; - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -/* - * Read the cpu temperature. - */ -static int _i8k_get_temp(int sensor) -{ - struct smm_regs regs = { - .eax = I8K_SMM_GET_TEMP, - .ebx = sensor & 0xff, - }; - - return i8k_smm(®s) ? : regs.eax & 0xff; -} - -static int i8k_get_temp(int sensor) -{ - int temp = _i8k_get_temp(sensor); - - /* - * Sometimes the temperature sensor returns 0x99, which is out of range. - * In this case we retry (once) before returning an error. - # 1003655137 00000058 00005a4b - # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees - # 1003655139 00000054 00005c52 - */ - if (temp == 0x99) { - msleep(100); - temp = _i8k_get_temp(sensor); - } - /* - * Return -ENODATA for all invalid temperatures. - * - * Known instances are the 0x99 value as seen above as well as - * 0xc1 (193), which may be returned when trying to read the GPU - * temperature if the system supports a GPU and it is currently - * turned off. - */ - if (temp > I8K_MAX_TEMP) - return -ENODATA; - - return temp; -} - -static int i8k_get_dell_signature(int req_fn) -{ - struct smm_regs regs = { .eax = req_fn, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; -} - -static int -i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) -{ - int val = 0; - int speed; - unsigned char buff[16]; - int __user *argp = (int __user *)arg; - - if (!argp) - return -EINVAL; - - switch (cmd) { - case I8K_BIOS_VERSION: - val = (bios_version[0] << 16) | - (bios_version[1] << 8) | bios_version[2]; - break; - - case I8K_MACHINE_ID: - memset(buff, 0, 16); - strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - sizeof(buff)); - break; - - case I8K_FN_STATUS: - val = i8k_get_fn_status(); - break; - - case I8K_POWER_STATUS: - val = i8k_get_power_status(); - break; - - case I8K_GET_TEMP: - val = i8k_get_temp(0); - break; - - case I8K_GET_SPEED: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_speed(val); - break; - - case I8K_GET_FAN: - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - val = i8k_get_fan_status(val); - break; - - case I8K_SET_FAN: - if (restricted && !capable(CAP_SYS_ADMIN)) - return -EPERM; - - if (copy_from_user(&val, argp, sizeof(int))) - return -EFAULT; - - if (copy_from_user(&speed, argp + 1, sizeof(int))) - return -EFAULT; - - val = i8k_set_fan(val, speed); - break; - - default: - return -EINVAL; - } - - if (val < 0) - return val; - - switch (cmd) { - case I8K_BIOS_VERSION: - if (copy_to_user(argp, &val, 4)) - return -EFAULT; - - break; - case I8K_MACHINE_ID: - if (copy_to_user(argp, buff, 16)) - return -EFAULT; - - break; - default: - if (copy_to_user(argp, &val, sizeof(int))) - return -EFAULT; - - break; - } - - return 0; -} - -static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) -{ - long ret; - - mutex_lock(&i8k_mutex); - ret = i8k_ioctl_unlocked(fp, cmd, arg); - mutex_unlock(&i8k_mutex); - - return ret; -} - -/* - * Print the information for /proc/i8k. - */ -static int i8k_proc_show(struct seq_file *seq, void *offset) -{ - int fn_key, cpu_temp, ac_power; - int left_fan, right_fan, left_speed, right_speed; - - cpu_temp = i8k_get_temp(0); /* 11100 µs */ - left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ - right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ - left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ - right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ - fn_key = i8k_get_fn_status(); /* 750 µs */ - if (power_status) - ac_power = i8k_get_power_status(); /* 14700 µs */ - else - ac_power = -1; - - /* - * Info: - * - * 1) Format version (this will change if format changes) - * 2) BIOS version - * 3) BIOS machine ID - * 4) Cpu temperature - * 5) Left fan status - * 6) Right fan status - * 7) Left fan speed - * 8) Right fan speed - * 9) AC power - * 10) Fn Key status - */ - seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", - I8K_PROC_FMT, - bios_version, - i8k_get_dmi_data(DMI_PRODUCT_SERIAL), - cpu_temp, - left_fan, right_fan, left_speed, right_speed, - ac_power, fn_key); - - return 0; -} - -static int i8k_open_fs(struct inode *inode, struct file *file) -{ - return single_open(file, i8k_proc_show, NULL); -} - - -/* - * Hwmon interface - */ - -static ssize_t i8k_hwmon_show_temp_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "CPU", - "GPU", - "SODIMM", - "Other", - "Ambient", - "Other", - }; - int index = to_sensor_dev_attr(devattr)->index; - int type; - - type = i8k_get_temp_type(index); - if (type < 0) - return type; - if (type >= ARRAY_SIZE(labels)) - type = ARRAY_SIZE(labels) - 1; - return sprintf(buf, "%s\n", labels[type]); -} - -static ssize_t i8k_hwmon_show_temp(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int temp; - - temp = i8k_get_temp(index); - if (temp < 0) - return temp; - return sprintf(buf, "%d\n", temp * 1000); -} - -static ssize_t i8k_hwmon_show_fan_label(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - static const char * const labels[] = { - "Processor Fan", - "Motherboard Fan", - "Video Fan", - "Power Supply Fan", - "Chipset Fan", - "Other Fan", - }; - int index = to_sensor_dev_attr(devattr)->index; - bool dock = false; - int type; - - type = i8k_get_fan_type(index); - if (type < 0) - return type; - - if (type & 0x10) { - dock = true; - type &= 0x0F; - } - - if (type >= ARRAY_SIZE(labels)) - type = (ARRAY_SIZE(labels) - 1); - - return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); -} - -static ssize_t i8k_hwmon_show_fan(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int fan_speed; - - fan_speed = i8k_get_fan_speed(index); - if (fan_speed < 0) - return fan_speed; - return sprintf(buf, "%d\n", fan_speed); -} - -static ssize_t i8k_hwmon_show_pwm(struct device *dev, - struct device_attribute *devattr, - char *buf) -{ - int index = to_sensor_dev_attr(devattr)->index; - int status; - - status = i8k_get_fan_status(index); - if (status < 0) - return -EIO; - return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); -} - -static ssize_t i8k_hwmon_set_pwm(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ - int index = to_sensor_dev_attr(attr)->index; - unsigned long val; - int err; - - err = kstrtoul(buf, 10, &val); - if (err) - return err; - val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); - - mutex_lock(&i8k_mutex); - err = i8k_set_fan(index, val); - mutex_unlock(&i8k_mutex); - - return err < 0 ? -EIO : count; -} - -static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); -static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); -static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); -static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 2); -static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); -static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, - 3); -static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); -static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 0); -static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 0); -static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, - 1); -static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, - 1); -static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, - i8k_hwmon_set_pwm, 1); - -static struct attribute *i8k_attrs[] = { - &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ - &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ - &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ - &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ - &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ - &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ - &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ - &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ - &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ - &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ - &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ - &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ - &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ - &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ - NULL -}; - -static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, - int index) -{ - if (index >= 0 && index <= 1 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) - return 0; - if (index >= 2 && index <= 3 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) - return 0; - if (index >= 4 && index <= 5 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) - return 0; - if (index >= 6 && index <= 7 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) - return 0; - if (index >= 8 && index <= 10 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) - return 0; - if (index >= 11 && index <= 13 && - !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) - return 0; - - return attr->mode; -} - -static const struct attribute_group i8k_group = { - .attrs = i8k_attrs, - .is_visible = i8k_is_visible, -}; -__ATTRIBUTE_GROUPS(i8k); - -static int __init i8k_init_hwmon(void) -{ - int err; - - i8k_hwmon_flags = 0; - - /* CPU temperature attributes, if temperature type is OK */ - err = i8k_get_temp_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; - /* check for additional temperature sensors */ - err = i8k_get_temp_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; - err = i8k_get_temp_type(2); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; - err = i8k_get_temp_type(3); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; - - /* First fan attributes, if fan type is OK */ - err = i8k_get_fan_type(0); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; - - /* Second fan attributes, if fan type is OK */ - err = i8k_get_fan_type(1); - if (err >= 0) - i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); - if (IS_ERR(i8k_hwmon_dev)) { - err = PTR_ERR(i8k_hwmon_dev); - i8k_hwmon_dev = NULL; - pr_err("hwmon registration failed (%d)\n", err); - return err; - } - return 0; -} - -struct i8k_config_data { - uint fan_mult; - uint fan_max; -}; - -enum i8k_configs { - DELL_LATITUDE_D520, - DELL_PRECISION_490, - DELL_STUDIO, - DELL_XPS, -}; - -static const struct i8k_config_data i8k_config_data[] = { - [DELL_LATITUDE_D520] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_PRECISION_490] = { - .fan_mult = 1, - .fan_max = I8K_FAN_TURBO, - }, - [DELL_STUDIO] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, - [DELL_XPS] = { - .fan_mult = 1, - .fan_max = I8K_FAN_HIGH, - }, -}; - -static struct dmi_system_id i8k_dmi_table[] __initdata = { - { - .ident = "Dell Inspiron", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { - .ident = "Dell Inspiron 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), - }, - }, - { - .ident = "Dell Latitude D520", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), - }, - .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], - }, - { - .ident = "Dell Latitude 2", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), - }, - }, - { /* UK Inspiron 6400 */ - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), - }, - }, - { - .ident = "Dell Inspiron 3", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), - }, - }, - { - .ident = "Dell Precision 490", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, - "Precision WorkStation 490"), - }, - .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], - }, - { - .ident = "Dell Precision", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), - }, - }, - { - .ident = "Dell Vostro", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), - }, - }, - { - .ident = "Dell XPS421", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), - }, - }, - { - .ident = "Dell Studio", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), - }, - .driver_data = (void *)&i8k_config_data[DELL_STUDIO], - }, - { - .ident = "Dell XPS 13", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { - .ident = "Dell XPS M140", - .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), - DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), - }, - .driver_data = (void *)&i8k_config_data[DELL_XPS], - }, - { } -}; - -MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); - -/* - * Probe for the presence of a supported laptop. - */ -static int __init i8k_probe(void) -{ - const struct dmi_system_id *id; - int fan, ret; - - /* - * Get DMI information - */ - if (!dmi_check_system(i8k_dmi_table)) { - if (!ignore_dmi && !force) - return -ENODEV; - - pr_info("not running on a supported Dell system.\n"); - pr_info("vendor=%s, model=%s, version=%s\n", - i8k_get_dmi_data(DMI_SYS_VENDOR), - i8k_get_dmi_data(DMI_PRODUCT_NAME), - i8k_get_dmi_data(DMI_BIOS_VERSION)); - } - - strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), - sizeof(bios_version)); - - /* - * Get SMM Dell signature - */ - if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && - i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { - pr_err("unable to get SMM Dell signature\n"); - if (!force) - return -ENODEV; - } - - /* - * Set fan multiplier and maximal fan speed from dmi config - * Values specified in module parameters override values from dmi - */ - id = dmi_first_match(i8k_dmi_table); - if (id && id->driver_data) { - const struct i8k_config_data *conf = id->driver_data; - if (!fan_mult && conf->fan_mult) - fan_mult = conf->fan_mult; - if (!fan_max && conf->fan_max) - fan_max = conf->fan_max; - } - - i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ - i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); - - if (!fan_mult) { - /* - * Autodetect fan multiplier based on nominal rpm - * If fan reports rpm value too high then set multiplier to 1 - */ - for (fan = 0; fan < 2; ++fan) { - ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); - if (ret < 0) - continue; - if (ret > I8K_FAN_MAX_RPM) - i8k_fan_mult = 1; - break; - } - } else { - /* Fan multiplier was specified in module param or in dmi */ - i8k_fan_mult = fan_mult; - } - - return 0; -} - -static int __init i8k_init(void) -{ - struct proc_dir_entry *proc_i8k; - int err; - - /* Are we running on an supported laptop? */ - if (i8k_probe()) - return -ENODEV; - - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - - err = i8k_init_hwmon(); - if (err) - goto exit_remove_proc; - - return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; -} - -static void __exit i8k_exit(void) -{ - hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); -} - -module_init(i8k_init); -module_exit(i8k_exit); diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index b4a40f1..51533ac 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -156,6 +156,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o +obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c new file mode 100644 index 0000000..65d314b --- /dev/null +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -0,0 +1,1009 @@ +/* + * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops. + * + * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> + * + * Hwmon integration: + * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> + * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> + * Copyright (C) 2014, 2015 Pali Rohár <pali.rohar@gmail.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include <linux/delay.h> +#include <linux/module.h> +#include <linux/types.h> +#include <linux/init.h> +#include <linux/proc_fs.h> +#include <linux/seq_file.h> +#include <linux/dmi.h> +#include <linux/capability.h> +#include <linux/mutex.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/uaccess.h> +#include <linux/io.h> +#include <linux/sched.h> + +#include <linux/i8k.h> + +#define I8K_SMM_FN_STATUS 0x0025 +#define I8K_SMM_POWER_STATUS 0x0069 +#define I8K_SMM_SET_FAN 0x01a3 +#define I8K_SMM_GET_FAN 0x00a3 +#define I8K_SMM_GET_SPEED 0x02a3 +#define I8K_SMM_GET_FAN_TYPE 0x03a3 +#define I8K_SMM_GET_NOM_SPEED 0x04a3 +#define I8K_SMM_GET_TEMP 0x10a3 +#define I8K_SMM_GET_TEMP_TYPE 0x11a3 +#define I8K_SMM_GET_DELL_SIG1 0xfea3 +#define I8K_SMM_GET_DELL_SIG2 0xffa3 + +#define I8K_FAN_MULT 30 +#define I8K_FAN_MAX_RPM 30000 +#define I8K_MAX_TEMP 127 + +#define I8K_FN_NONE 0x00 +#define I8K_FN_UP 0x01 +#define I8K_FN_DOWN 0x02 +#define I8K_FN_MUTE 0x04 +#define I8K_FN_MASK 0x07 +#define I8K_FN_SHIFT 8 + +#define I8K_POWER_AC 0x05 +#define I8K_POWER_BATTERY 0x01 + +static DEFINE_MUTEX(i8k_mutex); +static char bios_version[4]; +static struct device *i8k_hwmon_dev; +static u32 i8k_hwmon_flags; +static uint i8k_fan_mult = I8K_FAN_MULT; +static uint i8k_pwm_mult; +static uint i8k_fan_max = I8K_FAN_HIGH; + +#define I8K_HWMON_HAVE_TEMP1 (1 << 0) +#define I8K_HWMON_HAVE_TEMP2 (1 << 1) +#define I8K_HWMON_HAVE_TEMP3 (1 << 2) +#define I8K_HWMON_HAVE_TEMP4 (1 << 3) +#define I8K_HWMON_HAVE_FAN1 (1 << 4) +#define I8K_HWMON_HAVE_FAN2 (1 << 5) + +MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); +MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("i8k"); + +static bool force; +module_param(force, bool, 0); +MODULE_PARM_DESC(force, "Force loading without checking for supported models"); + +static bool ignore_dmi; +module_param(ignore_dmi, bool, 0); +MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); + +static bool restricted; +module_param(restricted, bool, 0); +MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); + +static bool power_status; +module_param(power_status, bool, 0600); +MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); + +static uint fan_mult; +module_param(fan_mult, uint, 0); +MODULE_PARM_DESC(fan_mult, "Factor to multiply fan speed with (default: autodetect)"); + +static uint fan_max; +module_param(fan_max, uint, 0); +MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); + +static int i8k_open_fs(struct inode *inode, struct file *file); +static long i8k_ioctl(struct file *, unsigned int, unsigned long); + +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +struct smm_regs { + unsigned int eax; + unsigned int ebx __packed; + unsigned int ecx __packed; + unsigned int edx __packed; + unsigned int esi __packed; + unsigned int edi __packed; +}; + +static inline const char *i8k_get_dmi_data(int field) +{ + const char *dmi_data = dmi_get_system_info(field); + + return dmi_data && *dmi_data ? dmi_data : "?"; +} + +/* + * Call the System Management Mode BIOS. Code provided by Jonathan Buzzard. + */ +static int i8k_smm(struct smm_regs *regs) +{ + int rc; + int eax = regs->eax; + cpumask_var_t old_mask; + + /* SMM requires CPU 0 */ + if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) + return -ENOMEM; + cpumask_copy(old_mask, ¤t->cpus_allowed); + rc = set_cpus_allowed_ptr(current, cpumask_of(0)); + if (rc) + goto out; + if (smp_processor_id() != 0) { + rc = -EBUSY; + goto out; + } + +#if defined(CONFIG_X86_64) + asm volatile("pushq %%rax\n\t" + "movl 0(%%rax),%%edx\n\t" + "pushq %%rdx\n\t" + "movl 4(%%rax),%%ebx\n\t" + "movl 8(%%rax),%%ecx\n\t" + "movl 12(%%rax),%%edx\n\t" + "movl 16(%%rax),%%esi\n\t" + "movl 20(%%rax),%%edi\n\t" + "popq %%rax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgq %%rax,(%%rsp)\n\t" + "movl %%ebx,4(%%rax)\n\t" + "movl %%ecx,8(%%rax)\n\t" + "movl %%edx,12(%%rax)\n\t" + "movl %%esi,16(%%rax)\n\t" + "movl %%edi,20(%%rax)\n\t" + "popq %%rdx\n\t" + "movl %%edx,0(%%rax)\n\t" + "pushfq\n\t" + "popq %%rax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#else + asm volatile("pushl %%eax\n\t" + "movl 0(%%eax),%%edx\n\t" + "push %%edx\n\t" + "movl 4(%%eax),%%ebx\n\t" + "movl 8(%%eax),%%ecx\n\t" + "movl 12(%%eax),%%edx\n\t" + "movl 16(%%eax),%%esi\n\t" + "movl 20(%%eax),%%edi\n\t" + "popl %%eax\n\t" + "out %%al,$0xb2\n\t" + "out %%al,$0x84\n\t" + "xchgl %%eax,(%%esp)\n\t" + "movl %%ebx,4(%%eax)\n\t" + "movl %%ecx,8(%%eax)\n\t" + "movl %%edx,12(%%eax)\n\t" + "movl %%esi,16(%%eax)\n\t" + "movl %%edi,20(%%eax)\n\t" + "popl %%edx\n\t" + "movl %%edx,0(%%eax)\n\t" + "lahf\n\t" + "shrl $8,%%eax\n\t" + "andl $1,%%eax\n" + : "=a"(rc) + : "a"(regs) + : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); +#endif + if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) + rc = -EINVAL; + +out: + set_cpus_allowed_ptr(current, old_mask); + free_cpumask_var(old_mask); + return rc; +} + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Read the fan status. + */ +static int i8k_get_fan_status(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan speed in RPM. + */ +static int i8k_get_fan_speed(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_SPEED, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Read the fan type. + */ +static int i8k_get_fan_type(int fan) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_FAN_TYPE, }; + + regs.ebx = fan & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the fan nominal rpm for specific fan speed. + */ +static int i8k_get_fan_nominal_speed(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_NOM_SPEED, }; + + regs.ebx = (fan & 0xff) | (speed << 8); + return i8k_smm(®s) ? : (regs.eax & 0xffff) * i8k_fan_mult; +} + +/* + * Set the fan speed (off, low, high). Returns the new fan status. + */ +static int i8k_set_fan(int fan, int speed) +{ + struct smm_regs regs = { .eax = I8K_SMM_SET_FAN, }; + + speed = (speed < 0) ? 0 : ((speed > i8k_fan_max) ? i8k_fan_max : speed); + regs.ebx = (fan & 0xff) | (speed << 8); + + return i8k_smm(®s) ? : i8k_get_fan_status(fan); +} + +static int i8k_get_temp_type(int sensor) +{ + struct smm_regs regs = { .eax = I8K_SMM_GET_TEMP_TYPE, }; + + regs.ebx = sensor & 0xff; + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +/* + * Read the cpu temperature. + */ +static int _i8k_get_temp(int sensor) +{ + struct smm_regs regs = { + .eax = I8K_SMM_GET_TEMP, + .ebx = sensor & 0xff, + }; + + return i8k_smm(®s) ? : regs.eax & 0xff; +} + +static int i8k_get_temp(int sensor) +{ + int temp = _i8k_get_temp(sensor); + + /* + * Sometimes the temperature sensor returns 0x99, which is out of range. + * In this case we retry (once) before returning an error. + # 1003655137 00000058 00005a4b + # 1003655138 00000099 00003a80 <--- 0x99 = 153 degrees + # 1003655139 00000054 00005c52 + */ + if (temp == 0x99) { + msleep(100); + temp = _i8k_get_temp(sensor); + } + /* + * Return -ENODATA for all invalid temperatures. + * + * Known instances are the 0x99 value as seen above as well as + * 0xc1 (193), which may be returned when trying to read the GPU + * temperature if the system supports a GPU and it is currently + * turned off. + */ + if (temp > I8K_MAX_TEMP) + return -ENODATA; + + return temp; +} + +static int i8k_get_dell_signature(int req_fn) +{ + struct smm_regs regs = { .eax = req_fn, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; +} + +static int +i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) +{ + int val = 0; + int speed; + unsigned char buff[16]; + int __user *argp = (int __user *)arg; + + if (!argp) + return -EINVAL; + + switch (cmd) { + case I8K_BIOS_VERSION: + val = (bios_version[0] << 16) | + (bios_version[1] << 8) | bios_version[2]; + break; + + case I8K_MACHINE_ID: + memset(buff, 0, 16); + strlcpy(buff, i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + sizeof(buff)); + break; + + case I8K_FN_STATUS: + val = i8k_get_fn_status(); + break; + + case I8K_POWER_STATUS: + val = i8k_get_power_status(); + break; + + case I8K_GET_TEMP: + val = i8k_get_temp(0); + break; + + case I8K_GET_SPEED: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_speed(val); + break; + + case I8K_GET_FAN: + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + val = i8k_get_fan_status(val); + break; + + case I8K_SET_FAN: + if (restricted && !capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(&val, argp, sizeof(int))) + return -EFAULT; + + if (copy_from_user(&speed, argp + 1, sizeof(int))) + return -EFAULT; + + val = i8k_set_fan(val, speed); + break; + + default: + return -EINVAL; + } + + if (val < 0) + return val; + + switch (cmd) { + case I8K_BIOS_VERSION: + if (copy_to_user(argp, &val, 4)) + return -EFAULT; + + break; + case I8K_MACHINE_ID: + if (copy_to_user(argp, buff, 16)) + return -EFAULT; + + break; + default: + if (copy_to_user(argp, &val, sizeof(int))) + return -EFAULT; + + break; + } + + return 0; +} + +static long i8k_ioctl(struct file *fp, unsigned int cmd, unsigned long arg) +{ + long ret; + + mutex_lock(&i8k_mutex); + ret = i8k_ioctl_unlocked(fp, cmd, arg); + mutex_unlock(&i8k_mutex); + + return ret; +} + +/* + * Print the information for /proc/i8k. + */ +static int i8k_proc_show(struct seq_file *seq, void *offset) +{ + int fn_key, cpu_temp, ac_power; + int left_fan, right_fan, left_speed, right_speed; + + cpu_temp = i8k_get_temp(0); /* 11100 µs */ + left_fan = i8k_get_fan_status(I8K_FAN_LEFT); /* 580 µs */ + right_fan = i8k_get_fan_status(I8K_FAN_RIGHT); /* 580 µs */ + left_speed = i8k_get_fan_speed(I8K_FAN_LEFT); /* 580 µs */ + right_speed = i8k_get_fan_speed(I8K_FAN_RIGHT); /* 580 µs */ + fn_key = i8k_get_fn_status(); /* 750 µs */ + if (power_status) + ac_power = i8k_get_power_status(); /* 14700 µs */ + else + ac_power = -1; + + /* + * Info: + * + * 1) Format version (this will change if format changes) + * 2) BIOS version + * 3) BIOS machine ID + * 4) Cpu temperature + * 5) Left fan status + * 6) Right fan status + * 7) Left fan speed + * 8) Right fan speed + * 9) AC power + * 10) Fn Key status + */ + seq_printf(seq, "%s %s %s %d %d %d %d %d %d %d\n", + I8K_PROC_FMT, + bios_version, + i8k_get_dmi_data(DMI_PRODUCT_SERIAL), + cpu_temp, + left_fan, right_fan, left_speed, right_speed, + ac_power, fn_key); + + return 0; +} + +static int i8k_open_fs(struct inode *inode, struct file *file) +{ + return single_open(file, i8k_proc_show, NULL); +} + + +/* + * Hwmon interface + */ + +static ssize_t i8k_hwmon_show_temp_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "CPU", + "GPU", + "SODIMM", + "Other", + "Ambient", + "Other", + }; + int index = to_sensor_dev_attr(devattr)->index; + int type; + + type = i8k_get_temp_type(index); + if (type < 0) + return type; + if (type >= ARRAY_SIZE(labels)) + type = ARRAY_SIZE(labels) - 1; + return sprintf(buf, "%s\n", labels[type]); +} + +static ssize_t i8k_hwmon_show_temp(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int temp; + + temp = i8k_get_temp(index); + if (temp < 0) + return temp; + return sprintf(buf, "%d\n", temp * 1000); +} + +static ssize_t i8k_hwmon_show_fan_label(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + static const char * const labels[] = { + "Processor Fan", + "Motherboard Fan", + "Video Fan", + "Power Supply Fan", + "Chipset Fan", + "Other Fan", + }; + int index = to_sensor_dev_attr(devattr)->index; + bool dock = false; + int type; + + type = i8k_get_fan_type(index); + if (type < 0) + return type; + + if (type & 0x10) { + dock = true; + type &= 0x0F; + } + + if (type >= ARRAY_SIZE(labels)) + type = (ARRAY_SIZE(labels) - 1); + + return sprintf(buf, "%s%s\n", (dock ? "Docking " : ""), labels[type]); +} + +static ssize_t i8k_hwmon_show_fan(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int fan_speed; + + fan_speed = i8k_get_fan_speed(index); + if (fan_speed < 0) + return fan_speed; + return sprintf(buf, "%d\n", fan_speed); +} + +static ssize_t i8k_hwmon_show_pwm(struct device *dev, + struct device_attribute *devattr, + char *buf) +{ + int index = to_sensor_dev_attr(devattr)->index; + int status; + + status = i8k_get_fan_status(index); + if (status < 0) + return -EIO; + return sprintf(buf, "%d\n", clamp_val(status * i8k_pwm_mult, 0, 255)); +} + +static ssize_t i8k_hwmon_set_pwm(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int index = to_sensor_dev_attr(attr)->index; + unsigned long val; + int err; + + err = kstrtoul(buf, 10, &val); + if (err) + return err; + val = clamp_val(DIV_ROUND_CLOSEST(val, i8k_pwm_mult), 0, i8k_fan_max); + + mutex_lock(&i8k_mutex); + err = i8k_set_fan(index, val); + mutex_unlock(&i8k_mutex); + + return err < 0 ? -EIO : count; +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 0); +static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 1); +static SENSOR_DEVICE_ATTR(temp2_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 2); +static SENSOR_DEVICE_ATTR(temp3_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 2); +static SENSOR_DEVICE_ATTR(temp4_input, S_IRUGO, i8k_hwmon_show_temp, NULL, 3); +static SENSOR_DEVICE_ATTR(temp4_label, S_IRUGO, i8k_hwmon_show_temp_label, NULL, + 3); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, i8k_hwmon_show_fan, NULL, 0); +static SENSOR_DEVICE_ATTR(fan1_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 0); +static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 0); +static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, i8k_hwmon_show_fan, NULL, + 1); +static SENSOR_DEVICE_ATTR(fan2_label, S_IRUGO, i8k_hwmon_show_fan_label, NULL, + 1); +static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR, i8k_hwmon_show_pwm, + i8k_hwmon_set_pwm, 1); + +static struct attribute *i8k_attrs[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, /* 0 */ + &sensor_dev_attr_temp1_label.dev_attr.attr, /* 1 */ + &sensor_dev_attr_temp2_input.dev_attr.attr, /* 2 */ + &sensor_dev_attr_temp2_label.dev_attr.attr, /* 3 */ + &sensor_dev_attr_temp3_input.dev_attr.attr, /* 4 */ + &sensor_dev_attr_temp3_label.dev_attr.attr, /* 5 */ + &sensor_dev_attr_temp4_input.dev_attr.attr, /* 6 */ + &sensor_dev_attr_temp4_label.dev_attr.attr, /* 7 */ + &sensor_dev_attr_fan1_input.dev_attr.attr, /* 8 */ + &sensor_dev_attr_fan1_label.dev_attr.attr, /* 9 */ + &sensor_dev_attr_pwm1.dev_attr.attr, /* 10 */ + &sensor_dev_attr_fan2_input.dev_attr.attr, /* 11 */ + &sensor_dev_attr_fan2_label.dev_attr.attr, /* 12 */ + &sensor_dev_attr_pwm2.dev_attr.attr, /* 13 */ + NULL +}; + +static umode_t i8k_is_visible(struct kobject *kobj, struct attribute *attr, + int index) +{ + if (index >= 0 && index <= 1 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP1)) + return 0; + if (index >= 2 && index <= 3 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP2)) + return 0; + if (index >= 4 && index <= 5 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP3)) + return 0; + if (index >= 6 && index <= 7 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_TEMP4)) + return 0; + if (index >= 8 && index <= 10 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN1)) + return 0; + if (index >= 11 && index <= 13 && + !(i8k_hwmon_flags & I8K_HWMON_HAVE_FAN2)) + return 0; + + return attr->mode; +} + +static const struct attribute_group i8k_group = { + .attrs = i8k_attrs, + .is_visible = i8k_is_visible, +}; +__ATTRIBUTE_GROUPS(i8k); + +static int __init i8k_init_hwmon(void) +{ + int err; + + i8k_hwmon_flags = 0; + + /* CPU temperature attributes, if temperature type is OK */ + err = i8k_get_temp_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP1; + /* check for additional temperature sensors */ + err = i8k_get_temp_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP2; + err = i8k_get_temp_type(2); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP3; + err = i8k_get_temp_type(3); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_TEMP4; + + /* First fan attributes, if fan type is OK */ + err = i8k_get_fan_type(0); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN1; + + /* Second fan attributes, if fan type is OK */ + err = i8k_get_fan_type(1); + if (err >= 0) + i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; + + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, + i8k_groups); + if (IS_ERR(i8k_hwmon_dev)) { + err = PTR_ERR(i8k_hwmon_dev); + i8k_hwmon_dev = NULL; + pr_err("hwmon registration failed (%d)\n", err); + return err; + } + return 0; +} + +struct i8k_config_data { + uint fan_mult; + uint fan_max; +}; + +enum i8k_configs { + DELL_LATITUDE_D520, + DELL_PRECISION_490, + DELL_STUDIO, + DELL_XPS, +}; + +static const struct i8k_config_data i8k_config_data[] = { + [DELL_LATITUDE_D520] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_PRECISION_490] = { + .fan_mult = 1, + .fan_max = I8K_FAN_TURBO, + }, + [DELL_STUDIO] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, + [DELL_XPS] = { + .fan_mult = 1, + .fan_max = I8K_FAN_HIGH, + }, +}; + +static struct dmi_system_id i8k_dmi_table[] __initdata = { + { + .ident = "Dell Inspiron", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { + .ident = "Dell Inspiron 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron"), + }, + }, + { + .ident = "Dell Latitude D520", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D520"), + }, + .driver_data = (void *)&i8k_config_data[DELL_LATITUDE_D520], + }, + { + .ident = "Dell Latitude 2", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"), + }, + }, + { /* UK Inspiron 6400 */ + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MM061"), + }, + }, + { + .ident = "Dell Inspiron 3", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MP061"), + }, + }, + { + .ident = "Dell Precision 490", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, + "Precision WorkStation 490"), + }, + .driver_data = (void *)&i8k_config_data[DELL_PRECISION_490], + }, + { + .ident = "Dell Precision", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Precision"), + }, + }, + { + .ident = "Dell Vostro", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro"), + }, + }, + { + .ident = "Dell XPS421", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"), + }, + }, + { + .ident = "Dell Studio", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Studio"), + }, + .driver_data = (void *)&i8k_config_data[DELL_STUDIO], + }, + { + .ident = "Dell XPS 13", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS13"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { + .ident = "Dell XPS M140", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "MXC051"), + }, + .driver_data = (void *)&i8k_config_data[DELL_XPS], + }, + { } +}; + +MODULE_DEVICE_TABLE(dmi, i8k_dmi_table); + +/* + * Probe for the presence of a supported laptop. + */ +static int __init i8k_probe(void) +{ + const struct dmi_system_id *id; + int fan, ret; + + /* + * Get DMI information + */ + if (!dmi_check_system(i8k_dmi_table)) { + if (!ignore_dmi && !force) + return -ENODEV; + + pr_info("not running on a supported Dell system.\n"); + pr_info("vendor=%s, model=%s, version=%s\n", + i8k_get_dmi_data(DMI_SYS_VENDOR), + i8k_get_dmi_data(DMI_PRODUCT_NAME), + i8k_get_dmi_data(DMI_BIOS_VERSION)); + } + + strlcpy(bios_version, i8k_get_dmi_data(DMI_BIOS_VERSION), + sizeof(bios_version)); + + /* + * Get SMM Dell signature + */ + if (i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG1) && + i8k_get_dell_signature(I8K_SMM_GET_DELL_SIG2)) { + pr_err("unable to get SMM Dell signature\n"); + if (!force) + return -ENODEV; + } + + /* + * Set fan multiplier and maximal fan speed from dmi config + * Values specified in module parameters override values from dmi + */ + id = dmi_first_match(i8k_dmi_table); + if (id && id->driver_data) { + const struct i8k_config_data *conf = id->driver_data; + if (!fan_mult && conf->fan_mult) + fan_mult = conf->fan_mult; + if (!fan_max && conf->fan_max) + fan_max = conf->fan_max; + } + + i8k_fan_max = fan_max ? : I8K_FAN_HIGH; /* Must not be 0 */ + i8k_pwm_mult = DIV_ROUND_UP(255, i8k_fan_max); + + if (!fan_mult) { + /* + * Autodetect fan multiplier based on nominal rpm + * If fan reports rpm value too high then set multiplier to 1 + */ + for (fan = 0; fan < 2; ++fan) { + ret = i8k_get_fan_nominal_speed(fan, i8k_fan_max); + if (ret < 0) + continue; + if (ret > I8K_FAN_MAX_RPM) + i8k_fan_mult = 1; + break; + } + } else { + /* Fan multiplier was specified in module param or in dmi */ + i8k_fan_mult = fan_mult; + } + + return 0; +} + +static int __init i8k_init(void) +{ + struct proc_dir_entry *proc_i8k; + int err; + + /* Are we running on an supported laptop? */ + if (i8k_probe()) + return -ENODEV; + + /* Register the proc entry */ + proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); + if (!proc_i8k) + return -ENOENT; + + err = i8k_init_hwmon(); + if (err) + goto exit_remove_proc; + + return 0; + + exit_remove_proc: + remove_proc_entry("i8k", NULL); + return err; +} + +static void __exit i8k_exit(void) +{ + hwmon_device_unregister(i8k_hwmon_dev); + remove_proc_entry("i8k", NULL); +} + +module_init(i8k_init); +module_exit(i8k_exit); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-04-29 11:41 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-29 11:41 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBjb21taXQgbW92ZXMgaThrIGRyaXZlciB0byBod21vbiB0cmVlIHVuZGVyIG5hbWUgZGVs bC1zbW0taHdtb24gd2hpY2ggaXMKYmV0dGVyIG5hbWUgdGhlbiBhYmJyZXZpYXRpb24gaThrLiBG b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpcyBhZGRlZCBtYWNybwpNT0RVTEVfQUxJQVMoImk4 ayIpIHNvIG1vZHByb2JlIHdpbGwgbG9hZCBkcml2ZXIgYWxzbyBvbGQgbmFtZSBpOGsuIENPTkZJ R19JOEsKY29tcGlsZSBvcHRpb24gd2FzIG5vdCBjaGFuZ2VkLgoKVGhpcyBjb21taXQgYWxzbyBh ZGRzIG1lIGFzIG1haW50YWluZXIgb2YgdGhpcyBuZXcgZGVsbC1zbW0taHdtb24gZHJpdmVyIGFu ZApyZW1vdmUgR3VlbnRlciBSb2VjayBmcm9tIGxpc3Qgd2hvIGlzIGltcGxpY2l0IG1haW50YWlu ZXIgYWxsIGh3bW9uIGRyaXZlcnMuCgpTaWduZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5y b2hhckBnbWFpbC5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgIHwgICAg NCArLQogZHJpdmVycy9jaGFyL01ha2VmaWxlICAgICAgICAgIHwgICAgMSAtCiBkcml2ZXJzL2No YXIvaThrLmMgICAgICAgICAgICAgfCAxMDA3IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgIHwgICAgMSArCiBkcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMgfCAxMDA5ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTAxMiBpbnNlcnRpb25zKCspLCAx MDEwIGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2hhci9pOGsuYwog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwoKZGlmZiAt LWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMmU1YmJjMC4uMDE0YzE1ZiAx MDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTMwNzcsOSArMzA3 Nyw5IEBAIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvcGxhdGZvcm0veDg2L2RlbGwtc21vODgw MC5jCiAKIERFTEwgTEFQVE9QIFNNTSBEUklWRVIKLU06CUd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJv ZWNrLXVzLm5ldD4KK006CVBhbGkgUm9ow6FyIDxwYWxpLnJvaGFyQGdtYWlsLmNvbT4KIFM6CU1h aW50YWluZWQKLUY6CWRyaXZlcnMvY2hhci9pOGsuYworRjoJZHJpdmVycy9od21vbi9kZWxsLXNt bS1od21vbi5jCiBGOglpbmNsdWRlL3VhcGkvbGludXgvaThrLmgKIAogREVMTCBTWVNURU1TIE1B TkFHRU1FTlQgQkFTRSBEUklWRVIgKGRjZGJhcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9N YWtlZmlsZSBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQppbmRleCBkMDZjZGUyNi4uMWQ5Y2YwMCAx MDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtl ZmlsZQpAQCAtMzYsNyArMzYsNiBAQCBlbHNlCiAgIG9iai0kKENPTkZJR19OVlJBTSkJKz0gbnZy YW0ubwogZW5kaWYKIG9iai0kKENPTkZJR19UT1NISUJBKQkJKz0gdG9zaGliYS5vCi1vYmotJChD T05GSUdfSThLKQkJKz0gaThrLm8KIG9iai0kKENPTkZJR19EUzE2MjApCQkrPSBkczE2MjAubwog b2JqLSQoQ09ORklHX0hXX1JBTkRPTSkJCSs9IGh3X3JhbmRvbS8KIG9iai0kKENPTkZJR19QUERF VikJCSs9IHBwZGV2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pOGsuYyBiL2RyaXZlcnMv Y2hhci9pOGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzMDQ4Yi4uMDAwMDAw MAotLS0gYS9kcml2ZXJzL2NoYXIvaThrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA3ICswLDAg QEAKLS8qCi0gKiBpOGsuYyAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIEJJ T1Mgb24gRGVsbCBsYXB0b3BzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFzc2ltbyBE YWwgWm90dG8gPGR6QGRlYmlhbi5vcmc+Ci0gKgotICogSHdtb24gaW50ZWdyYXRpb246Ci0gKiBD b3B5cmlnaHQgKEMpIDIwMTEgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KLSAqIENv cHlyaWdodCAoQykgMjAxMywgMjAxNCAgR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0 PgotICogQ29weXJpZ2h0IChDKSAyMDE0ICBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5j b20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO VQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNk ZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxp bnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgv dHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19m cy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+ Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+ Ci0jaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5o PgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2lu Y2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pOGsuaD4KLQotI2RlZmlu ZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKLSNkZWZpbmUgSThLX1NNTV9QT1dFUl9TVEFUVVMJ MHgwMDY5Ci0jZGVmaW5lIEk4S19TTU1fU0VUX0ZBTgkJMHgwMWEzCi0jZGVmaW5lIEk4S19TTU1f R0VUX0ZBTgkJMHgwMGEzCi0jZGVmaW5lIEk4S19TTU1fR0VUX1NQRUVECTB4MDJhMwotI2RlZmlu ZSBJOEtfU01NX0dFVF9GQU5fVFlQRQkweDAzYTMKLSNkZWZpbmUgSThLX1NNTV9HRVRfTk9NX1NQ RUVECTB4MDRhMwotI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4MTBhMwotI2RlZmluZSBJOEtf U01NX0dFVF9URU1QX1RZUEUJMHgxMWEzCi0jZGVmaW5lIEk4S19TTU1fR0VUX0RFTExfU0lHMQkw eGZlYTMKLSNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcyCTB4ZmZhMwotCi0jZGVmaW5lIEk4 S19GQU5fTVVMVAkJMzAKLSNkZWZpbmUgSThLX0ZBTl9NQVhfUlBNCQkzMDAwMAotI2RlZmluZSBJ OEtfTUFYX1RFTVAJCTEyNwotCi0jZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCi0jZGVmaW5lIEk4 S19GTl9VUAkJMHgwMQotI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgwMgotI2RlZmluZSBJOEtfRk5f TVVURQkJMHgwNAotI2RlZmluZSBJOEtfRk5fTUFTSwkJMHgwNwotI2RlZmluZSBJOEtfRk5fU0hJ RlQJCTgKLQotI2RlZmluZSBJOEtfUE9XRVJfQUMJCTB4MDUKLSNkZWZpbmUgSThLX1BPV0VSX0JB VFRFUlkJMHgwMQotCi1zdGF0aWMgREVGSU5FX01VVEVYKGk4a19tdXRleCk7Ci1zdGF0aWMgY2hh ciBiaW9zX3ZlcnNpb25bNF07Ci1zdGF0aWMgc3RydWN0IGRldmljZSAqaThrX2h3bW9uX2RldjsK LXN0YXRpYyB1MzIgaThrX2h3bW9uX2ZsYWdzOwotc3RhdGljIHVpbnQgaThrX2Zhbl9tdWx0ID0g SThLX0ZBTl9NVUxUOwotc3RhdGljIHVpbnQgaThrX3B3bV9tdWx0Owotc3RhdGljIHVpbnQgaThr X2Zhbl9tYXggPSBJOEtfRkFOX0hJR0g7Ci0KLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDEJ KDEgPDwgMCkKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDIJKDEgPDwgMSkKLSNkZWZpbmUg SThLX0hXTU9OX0hBVkVfVEVNUDMJKDEgPDwgMikKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVN UDQJKDEgPDwgMykKLSNkZWZpbmUgSThLX0hXTU9OX0hBVkVfRkFOMQkoMSA8PCA0KQotI2RlZmlu ZSBJOEtfSFdNT05fSEFWRV9GQU4yCSgxIDw8IDUpCi0KLU1PRFVMRV9BVVRIT1IoIk1hc3NpbW8g RGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIg Zm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMiKTsKLU1PRFVMRV9MSUNFTlNF KCJHUEwiKTsKLQotc3RhdGljIGJvb2wgZm9yY2U7Ci1tb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2ws IDApOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZSwgIkZvcmNlIGxvYWRpbmcgd2l0aG91dCBjaGVj a2luZyBmb3Igc3VwcG9ydGVkIG1vZGVscyIpOwotCi1zdGF0aWMgYm9vbCBpZ25vcmVfZG1pOwot bW9kdWxlX3BhcmFtKGlnbm9yZV9kbWksIGJvb2wsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpZ25v cmVfZG1pLCAiQ29udGludWUgcHJvYmluZyBoYXJkd2FyZSBldmVuIGlmIERNSSBkYXRhIGRvZXMg bm90IG1hdGNoIik7Ci0KLXN0YXRpYyBib29sIHJlc3RyaWN0ZWQ7Ci1tb2R1bGVfcGFyYW0ocmVz dHJpY3RlZCwgYm9vbCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBm YW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKLQotc3RhdGljIGJvb2wg cG93ZXJfc3RhdHVzOwotbW9kdWxlX3BhcmFtKHBvd2VyX3N0YXR1cywgYm9vbCwgMDYwMCk7Ci1N T0RVTEVfUEFSTV9ERVNDKHBvd2VyX3N0YXR1cywgIlJlcG9ydCBwb3dlciBzdGF0dXMgaW4gL3By b2MvaThrIik7Ci0KLXN0YXRpYyB1aW50IGZhbl9tdWx0OwotbW9kdWxlX3BhcmFtKGZhbl9tdWx0 LCB1aW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZmFuX211bHQsICJGYWN0b3IgdG8gbXVsdGlw bHkgZmFuIHNwZWVkIHdpdGggKGRlZmF1bHQ6IGF1dG9kZXRlY3QpIik7Ci0KLXN0YXRpYyB1aW50 IGZhbl9tYXg7Ci1tb2R1bGVfcGFyYW0oZmFuX21heCwgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9E RVNDKGZhbl9tYXgsICJNYXhpbXVtIGNvbmZpZ3VyYWJsZSBmYW4gc3BlZWQgKGRlZmF1bHQ6IGF1 dG9kZXRlY3QpIik7Ci0KLXN0YXRpYyBpbnQgaThrX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9k ZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIGxvbmcgaThrX2lvY3RsKHN0cnVjdCBmaWxl ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qg ZmlsZV9vcGVyYXRpb25zIGk4a19mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQku b3BlbgkJPSBpOGtfb3Blbl9mcywKLQkucmVhZAkJPSBzZXFfcmVhZCwKLQkubGxzZWVrCQk9IHNl cV9sc2VlaywKLQkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAotCS51bmxvY2tlZF9pb2N0bAk9 IGk4a19pb2N0bCwKLX07Ci0KLXN0cnVjdCBzbW1fcmVncyB7Ci0JdW5zaWduZWQgaW50IGVheDsK LQl1bnNpZ25lZCBpbnQgZWJ4IF9fcGFja2VkOwotCXVuc2lnbmVkIGludCBlY3ggX19wYWNrZWQ7 Ci0JdW5zaWduZWQgaW50IGVkeCBfX3BhY2tlZDsKLQl1bnNpZ25lZCBpbnQgZXNpIF9fcGFja2Vk OwotCXVuc2lnbmVkIGludCBlZGkgX19wYWNrZWQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIGNvbnN0 IGNoYXIgKmk4a19nZXRfZG1pX2RhdGEoaW50IGZpZWxkKQotewotCWNvbnN0IGNoYXIgKmRtaV9k YXRhID0gZG1pX2dldF9zeXN0ZW1faW5mbyhmaWVsZCk7Ci0KLQlyZXR1cm4gZG1pX2RhdGEgJiYg KmRtaV9kYXRhID8gZG1pX2RhdGEgOiAiPyI7Ci19Ci0KLS8qCi0gKiBDYWxsIHRoZSBTeXN0ZW0g TWFuYWdlbWVudCBNb2RlIEJJT1MuIENvZGUgcHJvdmlkZWQgYnkgSm9uYXRoYW4gQnV6emFyZC4K LSAqLwotc3RhdGljIGludCBpOGtfc21tKHN0cnVjdCBzbW1fcmVncyAqcmVncykKLXsKLQlpbnQg cmM7Ci0JaW50IGVheCA9IHJlZ3MtPmVheDsKLQljcHVtYXNrX3Zhcl90IG9sZF9tYXNrOwotCi0J LyogU01NIHJlcXVpcmVzIENQVSAwICovCi0JaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigmb2xkX21h c2ssIEdGUF9LRVJORUwpKQotCQlyZXR1cm4gLUVOT01FTTsKLQljcHVtYXNrX2NvcHkob2xkX21h c2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOwotCXJjID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIo Y3VycmVudCwgY3B1bWFza19vZigwKSk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQlpZiAoc21w X3Byb2Nlc3Nvcl9pZCgpICE9IDApIHsKLQkJcmMgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0K LQotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKLQlhc20gdm9sYXRpbGUoInB1c2hxICUlcmF4 XG5cdCIKLQkJIm1vdmwgMCglJXJheCksJSVlZHhcblx0IgotCQkicHVzaHEgJSVyZHhcblx0Igot CQkibW92bCA0KCUlcmF4KSwlJWVieFxuXHQiCi0JCSJtb3ZsIDgoJSVyYXgpLCUlZWN4XG5cdCIK LQkJIm1vdmwgMTIoJSVyYXgpLCUlZWR4XG5cdCIKLQkJIm1vdmwgMTYoJSVyYXgpLCUlZXNpXG5c dCIKLQkJIm1vdmwgMjAoJSVyYXgpLCUlZWRpXG5cdCIKLQkJInBvcHEgJSVyYXhcblx0IgotCQki b3V0ICUlYWwsJDB4YjJcblx0IgotCQkib3V0ICUlYWwsJDB4ODRcblx0IgotCQkieGNoZ3EgJSVy YXgsKCUlcnNwKVxuXHQiCi0JCSJtb3ZsICUlZWJ4LDQoJSVyYXgpXG5cdCIKLQkJIm1vdmwgJSVl Y3gsOCglJXJheClcblx0IgotCQkibW92bCAlJWVkeCwxMiglJXJheClcblx0IgotCQkibW92bCAl JWVzaSwxNiglJXJheClcblx0IgotCQkibW92bCAlJWVkaSwyMCglJXJheClcblx0IgotCQkicG9w cSAlJXJkeFxuXHQiCi0JCSJtb3ZsICUlZWR4LDAoJSVyYXgpXG5cdCIKLQkJInB1c2hmcVxuXHQi Ci0JCSJwb3BxICUlcmF4XG5cdCIKLQkJImFuZGwgJDEsJSVlYXhcbiIKLQkJOiAiPWEiKHJjKQot CQk6ICAgICJhIihyZWdzKQotCQk6ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwg IiVlZGkiLCAibWVtb3J5Iik7Ci0jZWxzZQotCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYXhcblx0 IgotCSAgICAibW92bCAwKCUlZWF4KSwlJWVkeFxuXHQiCi0JICAgICJwdXNoICUlZWR4XG5cdCIK LQkgICAgIm1vdmwgNCglJWVheCksJSVlYnhcblx0IgotCSAgICAibW92bCA4KCUlZWF4KSwlJWVj eFxuXHQiCi0JICAgICJtb3ZsIDEyKCUlZWF4KSwlJWVkeFxuXHQiCi0JICAgICJtb3ZsIDE2KCUl ZWF4KSwlJWVzaVxuXHQiCi0JICAgICJtb3ZsIDIwKCUlZWF4KSwlJWVkaVxuXHQiCi0JICAgICJw b3BsICUlZWF4XG5cdCIKLQkgICAgIm91dCAlJWFsLCQweGIyXG5cdCIKLQkgICAgIm91dCAlJWFs LCQweDg0XG5cdCIKLQkgICAgInhjaGdsICUlZWF4LCglJWVzcClcblx0IgotCSAgICAibW92bCAl JWVieCw0KCUlZWF4KVxuXHQiCi0JICAgICJtb3ZsICUlZWN4LDgoJSVlYXgpXG5cdCIKLQkgICAg Im1vdmwgJSVlZHgsMTIoJSVlYXgpXG5cdCIKLQkgICAgIm1vdmwgJSVlc2ksMTYoJSVlYXgpXG5c dCIKLQkgICAgIm1vdmwgJSVlZGksMjAoJSVlYXgpXG5cdCIKLQkgICAgInBvcGwgJSVlZHhcblx0 IgotCSAgICAibW92bCAlJWVkeCwwKCUlZWF4KVxuXHQiCi0JICAgICJsYWhmXG5cdCIKLQkgICAg InNocmwgJDgsJSVlYXhcblx0IgotCSAgICAiYW5kbCAkMSwlJWVheFxuIgotCSAgICA6ICI9YSIo cmMpCi0JICAgIDogICAgImEiKHJlZ3MpCi0JICAgIDogICAgIiVlYngiLCAiJWVjeCIsICIlZWR4 IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKLSNlbmRpZgotCWlmIChyYyAhPSAwIHx8IChy ZWdzLT5lYXggJiAweGZmZmYpID09IDB4ZmZmZiB8fCByZWdzLT5lYXggPT0gZWF4KQotCQlyYyA9 IC1FSU5WQUw7Ci0KLW91dDoKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBvbGRfbWFz ayk7Ci0JZnJlZV9jcHVtYXNrX3ZhcihvbGRfbWFzayk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgot ICogUmVhZCB0aGUgRm4ga2V5IHN0YXR1cy4KLSAqLwotc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0 YXR1cyh2b2lkKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9G Tl9TVEFUVVMsIH07Ci0JaW50IHJjOwotCi0JcmMgPSBpOGtfc21tKCZyZWdzKTsKLQlpZiAocmMg PCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlzd2l0Y2ggKChyZWdzLmVheCA+PiBJOEtfRk5fU0hJRlQp ICYgSThLX0ZOX01BU0spIHsKLQljYXNlIEk4S19GTl9VUDoKLQkJcmV0dXJuIEk4S19WT0xfVVA7 Ci0JY2FzZSBJOEtfRk5fRE9XTjoKLQkJcmV0dXJuIEk4S19WT0xfRE9XTjsKLQljYXNlIEk4S19G Tl9NVVRFOgotCQlyZXR1cm4gSThLX1ZPTF9NVVRFOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwot CX0KLX0KLQotLyoKLSAqIFJlYWQgdGhlIHBvd2VyIHN0YXR1cy4KLSAqLwotc3RhdGljIGludCBp OGtfZ2V0X3Bvd2VyX3N0YXR1cyh2b2lkKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAu ZWF4ID0gSThLX1NNTV9QT1dFUl9TVEFUVVMsIH07Ci0JaW50IHJjOwotCi0JcmMgPSBpOGtfc21t KCZyZWdzKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gKHJlZ3MuZWF4 ICYgMHhmZikgPT0gSThLX1BPV0VSX0FDID8gSThLX0FDIDogSThLX0JBVFRFUlk7Ci19Ci0KLS8q Ci0gKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgotICovCi1zdGF0aWMgaW50IGk4a19nZXRfZmFuX3N0 YXR1cyhpbnQgZmFuKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NN TV9HRVRfRkFOLCB9OwotCi0JcmVncy5lYnggPSBmYW4gJiAweGZmOwotCXJldHVybiBpOGtfc21t KCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwotfQotCi0vKgotICogUmVhZCB0aGUgZmFuIHNw ZWVkIGluIFJQTS4KLSAqLwotc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zcGVlZChpbnQgZmFuKQot ewotCXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfU1BFRUQsIH07 Ci0KLQlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiAo cmVncy5lYXggJiAweGZmZmYpICogaThrX2Zhbl9tdWx0OwotfQotCi0vKgotICogUmVhZCB0aGUg ZmFuIHR5cGUuCi0gKi8KLXN0YXRpYyBpbnQgaThrX2dldF9mYW5fdHlwZShpbnQgZmFuKQotewot CXN0cnVjdCBzbW1fcmVncyByZWdzID0geyAuZWF4ID0gSThLX1NNTV9HRVRfRkFOX1RZUEUsIH07 Ci0KLQlyZWdzLmVieCA9IGZhbiAmIDB4ZmY7Ci0JcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiBy ZWdzLmVheCAmIDB4ZmY7Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBmYW4gbm9taW5hbCBycG0gZm9y IHNwZWNpZmljIGZhbiBzcGVlZC4KLSAqLwotc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9ub21pbmFs X3NwZWVkKGludCBmYW4sIGludCBzcGVlZCkKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsg LmVheCA9IEk4S19TTU1fR0VUX05PTV9TUEVFRCwgfTsKLQotCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4 ZmYpIHwgKHNwZWVkIDw8IDgpOwotCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogKHJlZ3MuZWF4 ICYgMHhmZmZmKSAqIGk4a19mYW5fbXVsdDsKLX0KLQotLyoKLSAqIFNldCB0aGUgZmFuIHNwZWVk IChvZmYsIGxvdywgaGlnaCkuIFJldHVybnMgdGhlIG5ldyBmYW4gc3RhdHVzLgotICovCi1zdGF0 aWMgaW50IGk4a19zZXRfZmFuKGludCBmYW4sIGludCBzcGVlZCkKLXsKLQlzdHJ1Y3Qgc21tX3Jl Z3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fU0VUX0ZBTiwgfTsKLQotCXNwZWVkID0gKHNwZWVk IDwgMCkgPyAwIDogKChzcGVlZCA+IGk4a19mYW5fbWF4KSA/IGk4a19mYW5fbWF4IDogc3BlZWQp OwotCXJlZ3MuZWJ4ID0gKGZhbiAmIDB4ZmYpIHwgKHNwZWVkIDw8IDgpOwotCi0JcmV0dXJuIGk4 a19zbW0oJnJlZ3MpID8gOiBpOGtfZ2V0X2Zhbl9zdGF0dXMoZmFuKTsKLX0KLQotc3RhdGljIGlu dCBpOGtfZ2V0X3RlbXBfdHlwZShpbnQgc2Vuc29yKQotewotCXN0cnVjdCBzbW1fcmVncyByZWdz ID0geyAuZWF4ID0gSThLX1NNTV9HRVRfVEVNUF9UWVBFLCB9OwotCi0JcmVncy5lYnggPSBzZW5z b3IgJiAweGZmOwotCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOwot fQotCi0vKgotICogUmVhZCB0aGUgY3B1IHRlbXBlcmF0dXJlLgotICovCi1zdGF0aWMgaW50IF9p OGtfZ2V0X3RlbXAoaW50IHNlbnNvcikKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsKLQkJ LmVheCA9IEk4S19TTU1fR0VUX1RFTVAsCi0JCS5lYnggPSBzZW5zb3IgJiAweGZmLAotCX07Ci0K LQlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKLX0KLQotc3RhdGlj IGludCBpOGtfZ2V0X3RlbXAoaW50IHNlbnNvcikKLXsKLQlpbnQgdGVtcCA9IF9pOGtfZ2V0X3Rl bXAoc2Vuc29yKTsKLQotCS8qCi0JICogU29tZXRpbWVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3Ig cmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCi0JICogSW4gdGhpcyBjYXNlIHdl IHJldHJ5IChvbmNlKSBiZWZvcmUgcmV0dXJuaW5nIGFuIGVycm9yLgotCSAjIDEwMDM2NTUxMzcg MDAwMDAwNTggMDAwMDVhNGIKLQkgIyAxMDAzNjU1MTM4IDAwMDAwMDk5IDAwMDAzYTgwIDwtLS0g MHg5OSA9IDE1MyBkZWdyZWVzCi0JICMgMTAwMzY1NTEzOSAwMDAwMDA1NCAwMDAwNWM1MgotCSAq LwotCWlmICh0ZW1wID09IDB4OTkpIHsKLQkJbXNsZWVwKDEwMCk7Ci0JCXRlbXAgPSBfaThrX2dl dF90ZW1wKHNlbnNvcik7Ci0JfQotCS8qCi0JICogUmV0dXJuIC1FTk9EQVRBIGZvciBhbGwgaW52 YWxpZCB0ZW1wZXJhdHVyZXMuCi0JICoKLQkgKiBLbm93biBpbnN0YW5jZXMgYXJlIHRoZSAweDk5 IHZhbHVlIGFzIHNlZW4gYWJvdmUgYXMgd2VsbCBhcwotCSAqIDB4YzEgKDE5MyksIHdoaWNoIG1h eSBiZSByZXR1cm5lZCB3aGVuIHRyeWluZyB0byByZWFkIHRoZSBHUFUKLQkgKiB0ZW1wZXJhdHVy ZSBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIGEgR1BVIGFuZCBpdCBpcyBjdXJyZW50bHkKLQkgKiB0 dXJuZWQgb2ZmLgotCSAqLwotCWlmICh0ZW1wID4gSThLX01BWF9URU1QKQotCQlyZXR1cm4gLUVO T0RBVEE7Ci0KLQlyZXR1cm4gdGVtcDsKLX0KLQotc3RhdGljIGludCBpOGtfZ2V0X2RlbGxfc2ln bmF0dXJlKGludCByZXFfZm4pCi17Ci0Jc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBy ZXFfZm4sIH07Ci0JaW50IHJjOwotCi0JcmMgPSBpOGtfc21tKCZyZWdzKTsKLQlpZiAocmMgPCAw KQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gcmVncy5lYXggPT0gMTE0NTY1MTUyNyAmJiByZWdz LmVkeCA9PSAxMTQ1MzkyMjA0ID8gMCA6IC0xOwotfQotCi1zdGF0aWMgaW50Ci1pOGtfaW9jdGxf dW5sb2NrZWQoc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25n IGFyZykKLXsKLQlpbnQgdmFsID0gMDsKLQlpbnQgc3BlZWQ7Ci0JdW5zaWduZWQgY2hhciBidWZm WzE2XTsKLQlpbnQgX191c2VyICphcmdwID0gKGludCBfX3VzZXIgKilhcmc7Ci0KLQlpZiAoIWFy Z3ApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIEk4S19CSU9T X1ZFUlNJT046Ci0JCXZhbCA9IChiaW9zX3ZlcnNpb25bMF0gPDwgMTYpIHwKLQkJCQkoYmlvc192 ZXJzaW9uWzFdIDw8IDgpIHwgYmlvc192ZXJzaW9uWzJdOwotCQlicmVhazsKLQotCWNhc2UgSThL X01BQ0hJTkVfSUQ6Ci0JCW1lbXNldChidWZmLCAwLCAxNik7Ci0JCXN0cmxjcHkoYnVmZiwgaThr X2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9TRVJJQUwpLAotCQkJc2l6ZW9mKGJ1ZmYpKTsKLQkJ YnJlYWs7Ci0KLQljYXNlIEk4S19GTl9TVEFUVVM6Ci0JCXZhbCA9IGk4a19nZXRfZm5fc3RhdHVz KCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfUE9XRVJfU1RBVFVTOgotCQl2YWwgPSBpOGtfZ2V0 X3Bvd2VyX3N0YXR1cygpOwotCQlicmVhazsKLQotCWNhc2UgSThLX0dFVF9URU1QOgotCQl2YWwg PSBpOGtfZ2V0X3RlbXAoMCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfR0VUX1NQRUVEOgotCQlp ZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1F RkFVTFQ7Ci0KLQkJdmFsID0gaThrX2dldF9mYW5fc3BlZWQodmFsKTsKLQkJYnJlYWs7Ci0KLQlj YXNlIEk4S19HRVRfRkFOOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9m KGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdmFsID0gaThrX2dldF9mYW5fc3RhdHVz KHZhbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJOEtfU0VUX0ZBTjoKLQkJaWYgKHJlc3RyaWN0ZWQg JiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCi0JCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmIChj b3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVM VDsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIoJnNwZWVkLCBhcmdwICsgMSwgc2l6ZW9mKGludCkp KQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJdmFsID0gaThrX3NldF9mYW4odmFsLCBzcGVlZCk7 Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHZh bCA8IDApCi0JCXJldHVybiB2YWw7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgSThLX0JJT1Nf VkVSU0lPTjoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCA0KSkKLQkJCXJldHVybiAt RUZBVUxUOwotCi0JCWJyZWFrOwotCWNhc2UgSThLX01BQ0hJTkVfSUQ6Ci0JCWlmIChjb3B5X3Rv X3VzZXIoYXJncCwgYnVmZiwgMTYpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJYnJlYWs7Ci0J ZGVmYXVsdDoKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCBzaXplb2YoaW50KSkpCi0J CQlyZXR1cm4gLUVGQVVMVDsKLQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Rh dGljIGxvbmcgaThrX2lvY3RsKHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwgdW5z aWduZWQgbG9uZyBhcmcpCi17Ci0JbG9uZyByZXQ7Ci0KLQltdXRleF9sb2NrKCZpOGtfbXV0ZXgp OwotCXJldCA9IGk4a19pb2N0bF91bmxvY2tlZChmcCwgY21kLCBhcmcpOwotCW11dGV4X3VubG9j aygmaThrX211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBQcmludCB0aGUgaW5m b3JtYXRpb24gZm9yIC9wcm9jL2k4ay4KLSAqLwotc3RhdGljIGludCBpOGtfcHJvY19zaG93KHN0 cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0JaW50IGZuX2tleSwgY3B1X3Rl bXAsIGFjX3Bvd2VyOwotCWludCBsZWZ0X2ZhbiwgcmlnaHRfZmFuLCBsZWZ0X3NwZWVkLCByaWdo dF9zcGVlZDsKLQotCWNwdV90ZW1wCT0gaThrX2dldF90ZW1wKDApOwkJCS8qIDExMTAwIMK1cyAq LwotCWxlZnRfZmFuCT0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAgNTgw IMK1cyAqLwotCXJpZ2h0X2Zhbgk9IGk4a19nZXRfZmFuX3N0YXR1cyhJOEtfRkFOX1JJR0hUKTsJ LyogICA1ODAgwrVzICovCi0JbGVmdF9zcGVlZAk9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5f TEVGVCk7CS8qICAgNTgwIMK1cyAqLwotCXJpZ2h0X3NwZWVkCT0gaThrX2dldF9mYW5fc3BlZWQo SThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwIMK1cyAqLwotCWZuX2tleQkJPSBpOGtfZ2V0X2ZuX3N0 YXR1cygpOwkJCS8qICAgNzUwIMK1cyAqLwotCWlmIChwb3dlcl9zdGF0dXMpCi0JCWFjX3Bvd2Vy ID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsJCS8qIDE0NzAwIMK1cyAqLwotCWVsc2UKLQkJYWNf cG93ZXIgPSAtMTsKLQotCS8qCi0JICogSW5mbzoKLQkgKgotCSAqIDEpICBGb3JtYXQgdmVyc2lv biAodGhpcyB3aWxsIGNoYW5nZSBpZiBmb3JtYXQgY2hhbmdlcykKLQkgKiAyKSAgQklPUyB2ZXJz aW9uCi0JICogMykgIEJJT1MgbWFjaGluZSBJRAotCSAqIDQpICBDcHUgdGVtcGVyYXR1cmUKLQkg KiA1KSAgTGVmdCBmYW4gc3RhdHVzCi0JICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKLQkgKiA3KSAg TGVmdCBmYW4gc3BlZWQKLQkgKiA4KSAgUmlnaHQgZmFuIHNwZWVkCi0JICogOSkgIEFDIHBvd2Vy Ci0JICogMTApIEZuIEtleSBzdGF0dXMKLQkgKi8KLQlzZXFfcHJpbnRmKHNlcSwgIiVzICVzICVz ICVkICVkICVkICVkICVkICVkICVkXG4iLAotCQkgICBJOEtfUFJPQ19GTVQsCi0JCSAgIGJpb3Nf dmVyc2lvbiwKLQkJICAgaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9TRVJJQUwpLAotCQkg ICBjcHVfdGVtcCwKLQkJICAgbGVmdF9mYW4sIHJpZ2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRf c3BlZWQsCi0JCSAgIGFjX3Bvd2VyLCBmbl9rZXkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgaThrX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUp Ci17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGk4a19wcm9jX3Nob3csIE5VTEwpOwotfQot Ci0KLS8qCi0gKiBId21vbiBpbnRlcmZhY2UKLSAqLwotCi1zdGF0aWMgc3NpemVfdCBpOGtfaHdt b25fc2hvd190ZW1wX2xhYmVsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJIHN0cnVjdCBkZXZp Y2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJCQkgY2hhciAqYnVmKQotewotCXN0YXRpYyBjb25z dCBjaGFyICogY29uc3QgbGFiZWxzW10gPSB7Ci0JCSJDUFUiLAotCQkiR1BVIiwKLQkJIlNPRElN TSIsCi0JCSJPdGhlciIsCi0JCSJBbWJpZW50IiwKLQkJIk90aGVyIiwKLQl9OwotCWludCBpbmRl eCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0JaW50IHR5cGU7Ci0KLQl0 eXBlID0gaThrX2dldF90ZW1wX3R5cGUoaW5kZXgpOwotCWlmICh0eXBlIDwgMCkKLQkJcmV0dXJu IHR5cGU7Ci0JaWYgKHR5cGUgPj0gQVJSQVlfU0laRShsYWJlbHMpKQotCQl0eXBlID0gQVJSQVlf U0laRShsYWJlbHMpIC0gMTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgbGFiZWxzW3R5 cGVdKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfdGVtcChzdHJ1Y3QgZGV2 aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkJ ICAgY2hhciAqYnVmKQotewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRy KS0+aW5kZXg7Ci0JaW50IHRlbXA7Ci0KLQl0ZW1wID0gaThrX2dldF90ZW1wKGluZGV4KTsKLQlp ZiAodGVtcCA8IDApCi0JCXJldHVybiB0ZW1wOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4i LCB0ZW1wICogMTAwMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X2Zhbl9s YWJlbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpk ZXZhdHRyLAotCQkJCQljaGFyICpidWYpCi17Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBs YWJlbHNbXSA9IHsKLQkJIlByb2Nlc3NvciBGYW4iLAotCQkiTW90aGVyYm9hcmQgRmFuIiwKLQkJ IlZpZGVvIEZhbiIsCi0JCSJQb3dlciBTdXBwbHkgRmFuIiwKLQkJIkNoaXBzZXQgRmFuIiwKLQkJ Ik90aGVyIEZhbiIsCi0JfTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0 ciktPmluZGV4OwotCWJvb2wgZG9jayA9IGZhbHNlOwotCWludCB0eXBlOwotCi0JdHlwZSA9IGk4 a19nZXRfZmFuX3R5cGUoaW5kZXgpOwotCWlmICh0eXBlIDwgMCkKLQkJcmV0dXJuIHR5cGU7Ci0K LQlpZiAodHlwZSAmIDB4MTApIHsKLQkJZG9jayA9IHRydWU7Ci0JCXR5cGUgJj0gMHgwRjsKLQl9 Ci0KLQlpZiAodHlwZSA+PSBBUlJBWV9TSVpFKGxhYmVscykpCi0JCXR5cGUgPSAoQVJSQVlfU0la RShsYWJlbHMpIC0gMSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlcyVzXG4iLCAoZG9jayA/ ICJEb2NraW5nICIgOiAiIiksIGxhYmVsc1t0eXBlXSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGk4 a19od21vbl9zaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNl X2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCQkgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgaW5kZXggPSB0 b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCWludCBmYW5fc3BlZWQ7Ci0KLQlm YW5fc3BlZWQgPSBpOGtfZ2V0X2Zhbl9zcGVlZChpbmRleCk7Ci0JaWYgKGZhbl9zcGVlZCA8IDAp Ci0JCXJldHVybiBmYW5fc3BlZWQ7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGZhbl9z cGVlZCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zaG93X3B3bShzdHJ1Y3QgZGV2 aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCQkg IGNoYXIgKmJ1ZikKLXsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cikt PmluZGV4OwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoaW5k ZXgpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gc3ByaW50Zihi dWYsICIlZFxuIiwgY2xhbXBfdmFsKHN0YXR1cyAqIGk4a19wd21fbXVsdCwgMCwgMjU1KSk7Ci19 Ci0KLXN0YXRpYyBzc2l6ZV90IGk4a19od21vbl9zZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwK LQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJIGNvbnN0IGNoYXIgKmJ1 Ziwgc2l6ZV90IGNvdW50KQotewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRy KS0+aW5kZXg7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0 b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0JdmFsID0gY2xh bXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHZhbCwgaThrX3B3bV9tdWx0KSwgMCwgaThrX2Zhbl9t YXgpOwotCi0JbXV0ZXhfbG9jaygmaThrX211dGV4KTsKLQllcnIgPSBpOGtfc2V0X2ZhbihpbmRl eCwgdmFsKTsKLQltdXRleF91bmxvY2soJmk4a19tdXRleCk7Ci0KLQlyZXR1cm4gZXJyIDwgMCA/ IC1FSU8gOiBjb3VudDsKLX0KLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1 dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09S X0RFVklDRV9BVFRSKHRlbXAxX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xh YmVsLCBOVUxMLAotCQkJICAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5w dXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXAsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNP Ul9ERVZJQ0VfQVRUUih0ZW1wMl9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9s YWJlbCwgTlVMTCwKLQkJCSAgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lu cHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1wLCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5T T1JfREVWSUNFX0FUVFIodGVtcDNfbGFiZWwsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXBf bGFiZWwsIE5VTEwsCi0JCQkgIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9p bnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcCwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VO U09SX0RFVklDRV9BVFRSKHRlbXA0X2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1w X2xhYmVsLCBOVUxMLAotCQkJICAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9p bnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5T T1JfREVWSUNFX0FUVFIoZmFuMV9sYWJlbCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuX2xh YmVsLCBOVUxMLAotCQkJICAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19J UlVHTyB8IFNfSVdVU1IsIGk4a19od21vbl9zaG93X3B3bSwKLQkJCSAgaThrX2h3bW9uX3NldF9w d20sIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX2lucHV0LCBTX0lSVUdPLCBp OGtfaHdtb25fc2hvd19mYW4sIE5VTEwsCi0JCQkgIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0Vf QVRUUihmYW4yX2xhYmVsLCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd19mYW5fbGFiZWwsIE5VTEws Ci0JCQkgIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20yLCBTX0lSVUdPIHwgU19J V1VTUiwgaThrX2h3bW9uX3Nob3dfcHdtLAotCQkJICBpOGtfaHdtb25fc2V0X3B3bSwgMSk7Ci0K LXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppOGtfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9h dHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDAgKi8KLQkmc2Vuc29yX2Rldl9hdHRy X3RlbXAxX2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDEgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3Rl bXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDIgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAy X2xhYmVsLmRldl9hdHRyLmF0dHIsCS8qIDMgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lu cHV0LmRldl9hdHRyLmF0dHIsCS8qIDQgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2xhYmVs LmRldl9hdHRyLmF0dHIsCS8qIDUgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRl dl9hdHRyLmF0dHIsCS8qIDYgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2xhYmVsLmRldl9h dHRyLmF0dHIsCS8qIDcgKi8KLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIu YXR0ciwJLyogOCAqLwotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9sYWJlbC5kZXZfYXR0ci5hdHRy LAkvKiA5ICovCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCQkvKiAxMCAq LwotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAxMSAqLwot CSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAxMiAqLwotCSZz ZW5zb3JfZGV2X2F0dHJfcHdtMi5kZXZfYXR0ci5hdHRyLAkJLyogMTMgKi8KLQlOVUxMCi19Owot Ci1zdGF0aWMgdW1vZGVfdCBpOGtfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3Ry dWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGludCBpbmRleCkKLXsKLQlpZiAoaW5kZXgg Pj0gMCAmJiBpbmRleCA8PSAxICYmCi0JICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9O X0hBVkVfVEVNUDEpKQotCQlyZXR1cm4gMDsKLQlpZiAoaW5kZXggPj0gMiAmJiBpbmRleCA8PSAz ICYmCi0JICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hBVkVfVEVNUDIpKQotCQly ZXR1cm4gMDsKLQlpZiAoaW5kZXggPj0gNCAmJiBpbmRleCA8PSA1ICYmCi0JICAgICEoaThrX2h3 bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hBVkVfVEVNUDMpKQotCQlyZXR1cm4gMDsKLQlpZiAoaW5k ZXggPj0gNiAmJiBpbmRleCA8PSA3ICYmCi0JICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hX TU9OX0hBVkVfVEVNUDQpKQotCQlyZXR1cm4gMDsKLQlpZiAoaW5kZXggPj0gOCAmJiBpbmRleCA8 PSAxMCAmJgotCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX0ZBTjEpKQot CQlyZXR1cm4gMDsKLQlpZiAoaW5kZXggPj0gMTEgJiYgaW5kZXggPD0gMTMgJiYKLQkgICAgIShp OGtfaHdtb25fZmxhZ3MgJiBJOEtfSFdNT05fSEFWRV9GQU4yKSkKLQkJcmV0dXJuIDA7Ci0KLQly ZXR1cm4gYXR0ci0+bW9kZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3Jv dXAgaThrX2dyb3VwID0gewotCS5hdHRycyA9IGk4a19hdHRycywKLQkuaXNfdmlzaWJsZSA9IGk4 a19pc192aXNpYmxlLAotfTsKLV9fQVRUUklCVVRFX0dST1VQUyhpOGspOwotCi1zdGF0aWMgaW50 IF9faW5pdCBpOGtfaW5pdF9od21vbih2b2lkKQotewotCWludCBlcnI7Ci0KLQlpOGtfaHdtb25f ZmxhZ3MgPSAwOwotCi0JLyogQ1BVIHRlbXBlcmF0dXJlIGF0dHJpYnV0ZXMsIGlmIHRlbXBlcmF0 dXJlIHR5cGUgaXMgT0sgKi8KLQllcnIgPSBpOGtfZ2V0X3RlbXBfdHlwZSgwKTsKLQlpZiAoZXJy ID49IDApCi0JCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9URU1QMTsKLQkvKiBj aGVjayBmb3IgYWRkaXRpb25hbCB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCi0JZXJyID0gaThrX2dl dF90ZW1wX3R5cGUoMSk7Ci0JaWYgKGVyciA+PSAwKQotCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThL X0hXTU9OX0hBVkVfVEVNUDI7Ci0JZXJyID0gaThrX2dldF90ZW1wX3R5cGUoMik7Ci0JaWYgKGVy ciA+PSAwKQotCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfVEVNUDM7Ci0JZXJy ID0gaThrX2dldF90ZW1wX3R5cGUoMyk7Ci0JaWYgKGVyciA+PSAwKQotCQlpOGtfaHdtb25fZmxh Z3MgfD0gSThLX0hXTU9OX0hBVkVfVEVNUDQ7Ci0KLQkvKiBGaXJzdCBmYW4gYXR0cmlidXRlcywg aWYgZmFuIHR5cGUgaXMgT0sgKi8KLQllcnIgPSBpOGtfZ2V0X2Zhbl90eXBlKDApOwotCWlmIChl cnIgPj0gMCkKLQkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX0ZBTjE7Ci0KLQkv KiBTZWNvbmQgZmFuIGF0dHJpYnV0ZXMsIGlmIGZhbiB0eXBlIGlzIE9LICovCi0JZXJyID0gaThr X2dldF9mYW5fdHlwZSgxKTsKLQlpZiAoZXJyID49IDApCi0JCWk4a19od21vbl9mbGFncyB8PSBJ OEtfSFdNT05fSEFWRV9GQU4yOwotCi0JaThrX2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdp c3Rlcl93aXRoX2dyb3VwcyhOVUxMLCAiaThrIiwgTlVMTCwKLQkJCQkJCQkgIGk4a19ncm91cHMp OwotCWlmIChJU19FUlIoaThrX2h3bW9uX2RldikpIHsKLQkJZXJyID0gUFRSX0VSUihpOGtfaHdt b25fZGV2KTsKLQkJaThrX2h3bW9uX2RldiA9IE5VTEw7Ci0JCXByX2VycigiaHdtb24gcmVnaXN0 cmF0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4g MDsKLX0KLQotc3RydWN0IGk4a19jb25maWdfZGF0YSB7Ci0JdWludCBmYW5fbXVsdDsKLQl1aW50 IGZhbl9tYXg7Ci19OwotCi1lbnVtIGk4a19jb25maWdzIHsKLQlERUxMX0xBVElUVURFX0Q1MjAs Ci0JREVMTF9QUkVDSVNJT05fNDkwLAotCURFTExfU1RVRElPLAotCURFTExfWFBTLAotfTsKLQot c3RhdGljIGNvbnN0IHN0cnVjdCBpOGtfY29uZmlnX2RhdGEgaThrX2NvbmZpZ19kYXRhW10gPSB7 Ci0JW0RFTExfTEFUSVRVREVfRDUyMF0gPSB7Ci0JCS5mYW5fbXVsdCA9IDEsCi0JCS5mYW5fbWF4 ID0gSThLX0ZBTl9UVVJCTywKLQl9LAotCVtERUxMX1BSRUNJU0lPTl80OTBdID0gewotCQkuZmFu X211bHQgPSAxLAotCQkuZmFuX21heCA9IEk4S19GQU5fVFVSQk8sCi0JfSwKLQlbREVMTF9TVFVE SU9dID0gewotCQkuZmFuX211bHQgPSAxLAotCQkuZmFuX21heCA9IEk4S19GQU5fSElHSCwKLQl9 LAotCVtERUxMX1hQU10gPSB7Ci0JCS5mYW5fbXVsdCA9IDEsCi0JCS5mYW5fbWF4ID0gSThLX0ZB Tl9ISUdILAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgaThrX2RtaV90 YWJsZVtdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkuaWRlbnQgPSAiRGVsbCBJbnNwaXJvbiIsCi0J CS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRl ciIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJJbnNwaXJvbiIpLAotCQl9LAot CX0sCi0JewotCQkuaWRlbnQgPSAiRGVsbCBMYXRpdHVkZSIsCi0JCS5tYXRjaGVzID0gewotCQkJ RE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBDb21wdXRlciIpLAotCQkJRE1JX01BVENI KERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSIpLAotCQl9LAotCX0sCi0JewotCQkuaWRlbnQg PSAiRGVsbCBJbnNwaXJvbiAyIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZ U19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAi SW5zcGlyb24iKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRlbGwgTGF0aXR1ZGUgRDUy MCIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJ bmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkxhdGl0dWRlIEQ1MjAiKSwK LQkJfSwKLQkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfTEFU SVRVREVfRDUyMF0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIExhdGl0dWRlIDIiLAotCQku bWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAot CQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSIpLAotCQl9LAotCX0sCi0J ewkvKiBVSyBJbnNwaXJvbiA2NDAwICAqLwotCQkuaWRlbnQgPSAiRGVsbCBJbnNwaXJvbiAzIiwK LQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4i KSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTU0wNjEiKSwKLQkJfSwKLQl9LAot CXsKLQkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMyIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1J X01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BS T0RVQ1RfTkFNRSwgIk1QMDYxIiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIFBy ZWNpc2lvbiA0OTAiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRP UiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsCi0JCQkJICAi UHJlY2lzaW9uIFdvcmtTdGF0aW9uIDQ5MCIpLAotCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodm9p ZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9QUkVDSVNJT05fNDkwXSwKLQl9LAotCXsKLQkJLmlk ZW50ID0gIkRlbGwgUHJlY2lzaW9uIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1J X1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1F LCAiUHJlY2lzaW9uIiksCi0JCX0sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIFZvc3RybyIs Ci0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMu IiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZvc3RybyIpLAotCQl9LAotCX0s Ci0JewotCQkuaWRlbnQgPSAiRGVsbCBYUFM0MjEiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9N QVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9E VUNUX05BTUUsICJYUFMgTDQyMVgiKSwKLQkJfSwKLQl9LAotCXsKLQkJLmlkZW50ID0gIkRlbGwg U3R1ZGlvIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJE ZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU3R1ZGlvIiksCi0J CX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX1NUVURJ T10sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxsIFhQUyAxMyIsCi0JCS5tYXRjaGVzID0gewot CQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCi0JCQlETUlfTUFUQ0go RE1JX1BST0RVQ1RfTkFNRSwgIlhQUzEzIiksCi0JCX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lk ICopJmk4a19jb25maWdfZGF0YVtERUxMX1hQU10sCi0JfSwKLQl7Ci0JCS5pZGVudCA9ICJEZWxs IFhQUyBNMTQwIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1Is ICJEZWxsIEluYy4iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTVhDMDUxIiks Ci0JCX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmk4a19jb25maWdfZGF0YVtERUxMX1hQ U10sCi0JfSwKLQl7IH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBpOGtfZG1pX3Rh YmxlKTsKLQotLyoKLSAqIFByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBzdXBwb3J0ZWQgbGFw dG9wLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBpOGtfcHJvYmUodm9pZCkKLXsKLQljb25zdCBz dHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQ7Ci0JaW50IGZhbiwgcmV0OwotCi0JLyoKLQkgKiBHZXQg RE1JIGluZm9ybWF0aW9uCi0JICovCi0JaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGk4a19kbWlfdGFi bGUpKSB7Ci0JCWlmICghaWdub3JlX2RtaSAmJiAhZm9yY2UpCi0JCQlyZXR1cm4gLUVOT0RFVjsK LQotCQlwcl9pbmZvKCJub3QgcnVubmluZyBvbiBhIHN1cHBvcnRlZCBEZWxsIHN5c3RlbS5cbiIp OwotCQlwcl9pbmZvKCJ2ZW5kb3I9JXMsIG1vZGVsPSVzLCB2ZXJzaW9uPSVzXG4iLAotCQkJaThr X2dldF9kbWlfZGF0YShETUlfU1lTX1ZFTkRPUiksCi0JCQlpOGtfZ2V0X2RtaV9kYXRhKERNSV9Q Uk9EVUNUX05BTUUpLAotCQkJaThrX2dldF9kbWlfZGF0YShETUlfQklPU19WRVJTSU9OKSk7Ci0J fQotCi0Jc3RybGNweShiaW9zX3ZlcnNpb24sIGk4a19nZXRfZG1pX2RhdGEoRE1JX0JJT1NfVkVS U0lPTiksCi0JCXNpemVvZihiaW9zX3ZlcnNpb24pKTsKLQotCS8qCi0JICogR2V0IFNNTSBEZWxs IHNpZ25hdHVyZQotCSAqLwotCWlmIChpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKEk4S19TTU1fR0VU X0RFTExfU0lHMSkgJiYKLQkgICAgaThrX2dldF9kZWxsX3NpZ25hdHVyZShJOEtfU01NX0dFVF9E RUxMX1NJRzIpKSB7Ci0JCXByX2VycigidW5hYmxlIHRvIGdldCBTTU0gRGVsbCBzaWduYXR1cmVc biIpOwotCQlpZiAoIWZvcmNlKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyoKLQkgKiBT ZXQgZmFuIG11bHRpcGxpZXIgYW5kIG1heGltYWwgZmFuIHNwZWVkIGZyb20gZG1pIGNvbmZpZwot CSAqIFZhbHVlcyBzcGVjaWZpZWQgaW4gbW9kdWxlIHBhcmFtZXRlcnMgb3ZlcnJpZGUgdmFsdWVz IGZyb20gZG1pCi0JICovCi0JaWQgPSBkbWlfZmlyc3RfbWF0Y2goaThrX2RtaV90YWJsZSk7Ci0J aWYgKGlkICYmIGlkLT5kcml2ZXJfZGF0YSkgewotCQljb25zdCBzdHJ1Y3QgaThrX2NvbmZpZ19k YXRhICpjb25mID0gaWQtPmRyaXZlcl9kYXRhOwotCQlpZiAoIWZhbl9tdWx0ICYmIGNvbmYtPmZh bl9tdWx0KQotCQkJZmFuX211bHQgPSBjb25mLT5mYW5fbXVsdDsKLQkJaWYgKCFmYW5fbWF4ICYm IGNvbmYtPmZhbl9tYXgpCi0JCQlmYW5fbWF4ID0gY29uZi0+ZmFuX21heDsKLQl9Ci0KLQlpOGtf ZmFuX21heCA9IGZhbl9tYXggPyA6IEk4S19GQU5fSElHSDsJLyogTXVzdCBub3QgYmUgMCAqLwot CWk4a19wd21fbXVsdCA9IERJVl9ST1VORF9VUCgyNTUsIGk4a19mYW5fbWF4KTsKLQotCWlmICgh ZmFuX211bHQpIHsKLQkJLyoKLQkJICogQXV0b2RldGVjdCBmYW4gbXVsdGlwbGllciBiYXNlZCBv biBub21pbmFsIHJwbQotCQkgKiBJZiBmYW4gcmVwb3J0cyBycG0gdmFsdWUgdG9vIGhpZ2ggdGhl biBzZXQgbXVsdGlwbGllciB0byAxCi0JCSAqLwotCQlmb3IgKGZhbiA9IDA7IGZhbiA8IDI7ICsr ZmFuKSB7Ci0JCQlyZXQgPSBpOGtfZ2V0X2Zhbl9ub21pbmFsX3NwZWVkKGZhbiwgaThrX2Zhbl9t YXgpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmV0ID4gSThLX0ZB Tl9NQVhfUlBNKQotCQkJCWk4a19mYW5fbXVsdCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxz ZSB7Ci0JCS8qIEZhbiBtdWx0aXBsaWVyIHdhcyBzcGVjaWZpZWQgaW4gbW9kdWxlIHBhcmFtIG9y IGluIGRtaSAqLwotCQlpOGtfZmFuX211bHQgPSBmYW5fbXVsdDsKLQl9Ci0KLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIGludCBfX2luaXQgaThrX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3QgcHJvY19k aXJfZW50cnkgKnByb2NfaThrOwotCWludCBlcnI7Ci0KLQkvKiBBcmUgd2UgcnVubmluZyBvbiBh biBzdXBwb3J0ZWQgbGFwdG9wPyAqLwotCWlmIChpOGtfcHJvYmUoKSkKLQkJcmV0dXJuIC1FTk9E RVY7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvYyBlbnRyeSAqLwotCXByb2NfaThrID0gcHJvY19j cmVhdGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9wcyk7Ci0JaWYgKCFwcm9jX2k4aykKLQkJcmV0 dXJuIC1FTk9FTlQ7Ci0KLQllcnIgPSBpOGtfaW5pdF9od21vbigpOwotCWlmIChlcnIpCi0JCWdv dG8gZXhpdF9yZW1vdmVfcHJvYzsKLQotCXJldHVybiAwOwotCi0gZXhpdF9yZW1vdmVfcHJvYzoK LQlyZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3Rh dGljIHZvaWQgX19leGl0IGk4a19leGl0KHZvaWQpCi17Ci0JaHdtb25fZGV2aWNlX3VucmVnaXN0 ZXIoaThrX2h3bW9uX2Rldik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwpOwotfQot Ci1tb2R1bGVfaW5pdChpOGtfaW5pdCk7Ci1tb2R1bGVfZXhpdChpOGtfZXhpdCk7CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRl eCBiNGE0MGYxLi41MTUzM2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisr KyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTE1Niw2ICsxNTYsNyBAQCBvYmotJChDT05G SUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCiBvYmotJChDT05GSUdfU0VOU09S U19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgp CSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1 MC1od21vbi5vCitvYmotJChDT05GSUdfSThLKQkJKz0gZGVsbC1zbW0taHdtb24ubwogCiBvYmot JChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9k ZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDMxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKQEAgLTAsMCArMSwxMDA5IEBACisvKgorICog ZGVsbC1zbW0taHdtb24uYyAtLSBMaW51eCBkcml2ZXIgZm9yIGFjY2Vzc2luZyB0aGUgU01NIEJJ T1Mgb24gRGVsbCBsYXB0b3BzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFzc2ltbyBE YWwgWm90dG8gPGR6QGRlYmlhbi5vcmc+CisgKgorICogSHdtb24gaW50ZWdyYXRpb246CisgKiBD b3B5cmlnaHQgKEMpIDIwMTEgIEplYW4gRGVsdmFyZSA8amRlbHZhcmVAc3VzZS5kZT4KKyAqIENv cHlyaWdodCAoQykgMjAxMywgMjAxNCAgR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0 PgorICogQ29weXJpZ2h0IChDKSAyMDE0LCAyMDE1ICBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBn bWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRp b24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICov CisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1 ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8 bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgv cHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgv ZG1pLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L211 dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1z eXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5o PgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pOGsuaD4KKwor I2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKKyNkZWZpbmUgSThLX1NNTV9QT1dFUl9T VEFUVVMJMHgwMDY5CisjZGVmaW5lIEk4S19TTU1fU0VUX0ZBTgkJMHgwMWEzCisjZGVmaW5lIEk4 S19TTU1fR0VUX0ZBTgkJMHgwMGEzCisjZGVmaW5lIEk4S19TTU1fR0VUX1NQRUVECTB4MDJhMwor I2RlZmluZSBJOEtfU01NX0dFVF9GQU5fVFlQRQkweDAzYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRf Tk9NX1NQRUVECTB4MDRhMworI2RlZmluZSBJOEtfU01NX0dFVF9URU1QCTB4MTBhMworI2RlZmlu ZSBJOEtfU01NX0dFVF9URU1QX1RZUEUJMHgxMWEzCisjZGVmaW5lIEk4S19TTU1fR0VUX0RFTExf U0lHMQkweGZlYTMKKyNkZWZpbmUgSThLX1NNTV9HRVRfREVMTF9TSUcyCTB4ZmZhMworCisjZGVm aW5lIEk4S19GQU5fTVVMVAkJMzAKKyNkZWZpbmUgSThLX0ZBTl9NQVhfUlBNCQkzMDAwMAorI2Rl ZmluZSBJOEtfTUFYX1RFTVAJCTEyNworCisjZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCisjZGVm aW5lIEk4S19GTl9VUAkJMHgwMQorI2RlZmluZSBJOEtfRk5fRE9XTgkJMHgwMgorI2RlZmluZSBJ OEtfRk5fTVVURQkJMHgwNAorI2RlZmluZSBJOEtfRk5fTUFTSwkJMHgwNworI2RlZmluZSBJOEtf Rk5fU0hJRlQJCTgKKworI2RlZmluZSBJOEtfUE9XRVJfQUMJCTB4MDUKKyNkZWZpbmUgSThLX1BP V0VSX0JBVFRFUlkJMHgwMQorCitzdGF0aWMgREVGSU5FX01VVEVYKGk4a19tdXRleCk7CitzdGF0 aWMgY2hhciBiaW9zX3ZlcnNpb25bNF07CitzdGF0aWMgc3RydWN0IGRldmljZSAqaThrX2h3bW9u X2RldjsKK3N0YXRpYyB1MzIgaThrX2h3bW9uX2ZsYWdzOworc3RhdGljIHVpbnQgaThrX2Zhbl9t dWx0ID0gSThLX0ZBTl9NVUxUOworc3RhdGljIHVpbnQgaThrX3B3bV9tdWx0Oworc3RhdGljIHVp bnQgaThrX2Zhbl9tYXggPSBJOEtfRkFOX0hJR0g7CisKKyNkZWZpbmUgSThLX0hXTU9OX0hBVkVf VEVNUDEJKDEgPDwgMCkKKyNkZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDIJKDEgPDwgMSkKKyNk ZWZpbmUgSThLX0hXTU9OX0hBVkVfVEVNUDMJKDEgPDwgMikKKyNkZWZpbmUgSThLX0hXTU9OX0hB VkVfVEVNUDQJKDEgPDwgMykKKyNkZWZpbmUgSThLX0hXTU9OX0hBVkVfRkFOMQkoMSA8PCA0KQor I2RlZmluZSBJOEtfSFdNT05fSEFWRV9GQU4yCSgxIDw8IDUpCisKK01PRFVMRV9BVVRIT1IoIk1h c3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOworTU9EVUxFX0FVVEhPUigiUGFsaSBS b2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2 ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRvcHMiKTsKK01PRFVMRV9MSUNF TlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaThrIik7CisKK3N0YXRpYyBib29sIGZvcmNlOwor bW9kdWxlX3BhcmFtKGZvcmNlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJG b3JjZSBsb2FkaW5nIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHN1cHBvcnRlZCBtb2RlbHMiKTsKKwor c3RhdGljIGJvb2wgaWdub3JlX2RtaTsKK21vZHVsZV9wYXJhbShpZ25vcmVfZG1pLCBib29sLCAw KTsKK01PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2RtaSwgIkNvbnRpbnVlIHByb2JpbmcgaGFyZHdh cmUgZXZlbiBpZiBETUkgZGF0YSBkb2VzIG5vdCBtYXRjaCIpOworCitzdGF0aWMgYm9vbCByZXN0 cmljdGVkOworbW9kdWxlX3BhcmFtKHJlc3RyaWN0ZWQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1f REVTQyhyZXN0cmljdGVkLCAiQWxsb3cgZmFuIGNvbnRyb2wgaWYgU1lTX0FETUlOIGNhcGFiaWxp dHkgc2V0Iik7CisKK3N0YXRpYyBib29sIHBvd2VyX3N0YXR1czsKK21vZHVsZV9wYXJhbShwb3dl cl9zdGF0dXMsIGJvb2wsIDA2MDApOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJS ZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4ayIpOworCitzdGF0aWMgdWludCBmYW5fbXVs dDsKK21vZHVsZV9wYXJhbShmYW5fbXVsdCwgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZh bl9tdWx0LCAiRmFjdG9yIHRvIG11bHRpcGx5IGZhbiBzcGVlZCB3aXRoIChkZWZhdWx0OiBhdXRv ZGV0ZWN0KSIpOworCitzdGF0aWMgdWludCBmYW5fbWF4OworbW9kdWxlX3BhcmFtKGZhbl9tYXgs IHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYW5fbWF4LCAiTWF4aW11bSBjb25maWd1cmFi bGUgZmFuIHNwZWVkIChkZWZhdWx0OiBhdXRvZGV0ZWN0KSIpOworCitzdGF0aWMgaW50IGk4a19v cGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBs b25nIGk4a19pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcp OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpOGtfZm9wcyA9IHsKKwku b3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gaThrX29wZW5fZnMsCisJLnJlYWQJCT0g c2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVs ZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBpOGtfaW9jdGwsCit9OworCitzdHJ1Y3Qgc21tX3Jl Z3MgeworCXVuc2lnbmVkIGludCBlYXg7CisJdW5zaWduZWQgaW50IGVieCBfX3BhY2tlZDsKKwl1 bnNpZ25lZCBpbnQgZWN4IF9fcGFja2VkOworCXVuc2lnbmVkIGludCBlZHggX19wYWNrZWQ7CisJ dW5zaWduZWQgaW50IGVzaSBfX3BhY2tlZDsKKwl1bnNpZ25lZCBpbnQgZWRpIF9fcGFja2VkOwor fTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICppOGtfZ2V0X2RtaV9kYXRhKGludCBmaWVs ZCkKK3sKKwljb25zdCBjaGFyICpkbWlfZGF0YSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oZmllbGQp OworCisJcmV0dXJuIGRtaV9kYXRhICYmICpkbWlfZGF0YSA/IGRtaV9kYXRhIDogIj8iOworfQor CisvKgorICogQ2FsbCB0aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBCSU9TLiBDb2RlIHByb3Zp ZGVkIGJ5IEpvbmF0aGFuIEJ1enphcmQuCisgKi8KK3N0YXRpYyBpbnQgaThrX3NtbShzdHJ1Y3Qg c21tX3JlZ3MgKnJlZ3MpCit7CisJaW50IHJjOworCWludCBlYXggPSByZWdzLT5lYXg7CisJY3B1 bWFza192YXJfdCBvbGRfbWFzazsKKworCS8qIFNNTSByZXF1aXJlcyBDUFUgMCAqLworCWlmICgh YWxsb2NfY3B1bWFza192YXIoJm9sZF9tYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9N RU07CisJY3B1bWFza19jb3B5KG9sZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKKwly YyA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoMCkpOworCWlmIChy YykKKwkJZ290byBvdXQ7CisJaWYgKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKSB7CisJCXJjID0g LUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpCisJ YXNtIHZvbGF0aWxlKCJwdXNocSAlJXJheFxuXHQiCisJCSJtb3ZsIDAoJSVyYXgpLCUlZWR4XG5c dCIKKwkJInB1c2hxICUlcmR4XG5cdCIKKwkJIm1vdmwgNCglJXJheCksJSVlYnhcblx0IgorCQki bW92bCA4KCUlcmF4KSwlJWVjeFxuXHQiCisJCSJtb3ZsIDEyKCUlcmF4KSwlJWVkeFxuXHQiCisJ CSJtb3ZsIDE2KCUlcmF4KSwlJWVzaVxuXHQiCisJCSJtb3ZsIDIwKCUlcmF4KSwlJWVkaVxuXHQi CisJCSJwb3BxICUlcmF4XG5cdCIKKwkJIm91dCAlJWFsLCQweGIyXG5cdCIKKwkJIm91dCAlJWFs LCQweDg0XG5cdCIKKwkJInhjaGdxICUlcmF4LCglJXJzcClcblx0IgorCQkibW92bCAlJWVieCw0 KCUlcmF4KVxuXHQiCisJCSJtb3ZsICUlZWN4LDgoJSVyYXgpXG5cdCIKKwkJIm1vdmwgJSVlZHgs MTIoJSVyYXgpXG5cdCIKKwkJIm1vdmwgJSVlc2ksMTYoJSVyYXgpXG5cdCIKKwkJIm1vdmwgJSVl ZGksMjAoJSVyYXgpXG5cdCIKKwkJInBvcHEgJSVyZHhcblx0IgorCQkibW92bCAlJWVkeCwwKCUl cmF4KVxuXHQiCisJCSJwdXNoZnFcblx0IgorCQkicG9wcSAlJXJheFxuXHQiCisJCSJhbmRsICQx LCUlZWF4XG4iCisJCTogIj1hIihyYykKKwkJOiAgICAiYSIocmVncykKKwkJOiAgICAiJWVieCIs ICIlZWN4IiwgIiVlZHgiLCAiJWVzaSIsICIlZWRpIiwgIm1lbW9yeSIpOworI2Vsc2UKKwlhc20g dm9sYXRpbGUoInB1c2hsICUlZWF4XG5cdCIKKwkgICAgIm1vdmwgMCglJWVheCksJSVlZHhcblx0 IgorCSAgICAicHVzaCAlJWVkeFxuXHQiCisJICAgICJtb3ZsIDQoJSVlYXgpLCUlZWJ4XG5cdCIK KwkgICAgIm1vdmwgOCglJWVheCksJSVlY3hcblx0IgorCSAgICAibW92bCAxMiglJWVheCksJSVl ZHhcblx0IgorCSAgICAibW92bCAxNiglJWVheCksJSVlc2lcblx0IgorCSAgICAibW92bCAyMCgl JWVheCksJSVlZGlcblx0IgorCSAgICAicG9wbCAlJWVheFxuXHQiCisJICAgICJvdXQgJSVhbCwk MHhiMlxuXHQiCisJICAgICJvdXQgJSVhbCwkMHg4NFxuXHQiCisJICAgICJ4Y2hnbCAlJWVheCwo JSVlc3ApXG5cdCIKKwkgICAgIm1vdmwgJSVlYngsNCglJWVheClcblx0IgorCSAgICAibW92bCAl JWVjeCw4KCUlZWF4KVxuXHQiCisJICAgICJtb3ZsICUlZWR4LDEyKCUlZWF4KVxuXHQiCisJICAg ICJtb3ZsICUlZXNpLDE2KCUlZWF4KVxuXHQiCisJICAgICJtb3ZsICUlZWRpLDIwKCUlZWF4KVxu XHQiCisJICAgICJwb3BsICUlZWR4XG5cdCIKKwkgICAgIm1vdmwgJSVlZHgsMCglJWVheClcblx0 IgorCSAgICAibGFoZlxuXHQiCisJICAgICJzaHJsICQ4LCUlZWF4XG5cdCIKKwkgICAgImFuZGwg JDEsJSVlYXhcbiIKKwkgICAgOiAiPWEiKHJjKQorCSAgICA6ICAgICJhIihyZWdzKQorCSAgICA6 ICAgICIlZWJ4IiwgIiVlY3giLCAiJWVkeCIsICIlZXNpIiwgIiVlZGkiLCAibWVtb3J5Iik7Cisj ZW5kaWYKKwlpZiAocmMgIT0gMCB8fCAocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYgfHwg cmVncy0+ZWF4ID09IGVheCkKKwkJcmMgPSAtRUlOVkFMOworCitvdXQ6CisJc2V0X2NwdXNfYWxs b3dlZF9wdHIoY3VycmVudCwgb2xkX21hc2spOworCWZyZWVfY3B1bWFza192YXIob2xkX21hc2sp OworCXJldHVybiByYzsKK30KKworLyoKKyAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCisgKi8K K3N0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3Mg cmVncyA9IHsgLmVheCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OworCWludCByYzsKKworCXJjID0g aThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoICgo cmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisJY2FzZSBJOEtfRk5f VVA6CisJCXJldHVybiBJOEtfVk9MX1VQOworCWNhc2UgSThLX0ZOX0RPV046CisJCXJldHVybiBJ OEtfVk9MX0RPV047CisJY2FzZSBJOEtfRk5fTVVURToKKwkJcmV0dXJuIEk4S19WT0xfTVVURTsK KwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwb3dlciBz dGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKK3sKKwlz dHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTLCB9Owor CWludCByYzsKKworCXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJu IHJjOworCisJcmV0dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19B QyA6IEk4S19CQVRURVJZOworfQorCisvKgorICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KKyAqLwor c3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zdGF0dXMoaW50IGZhbikKK3sKKwlzdHJ1Y3Qgc21tX3Jl Z3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX0ZBTiwgfTsKKworCXJlZ3MuZWJ4ID0gZmFu ICYgMHhmZjsKKwlyZXR1cm4gaThrX3NtbSgmcmVncykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKK30K KworLyoKKyAqIFJlYWQgdGhlIGZhbiBzcGVlZCBpbiBSUE0uCisgKi8KK3N0YXRpYyBpbnQgaThr X2dldF9mYW5fc3BlZWQoaW50IGZhbikKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVh eCA9IEk4S19TTU1fR0VUX1NQRUVELCB9OworCisJcmVncy5lYnggPSBmYW4gJiAweGZmOworCXJl dHVybiBpOGtfc21tKCZyZWdzKSA/IDogKHJlZ3MuZWF4ICYgMHhmZmZmKSAqIGk4a19mYW5fbXVs dDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZhbiB0eXBlLgorICovCitzdGF0aWMgaW50IGk4a19n ZXRfZmFuX3R5cGUoaW50IGZhbikKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9 IEk4S19TTU1fR0VUX0ZBTl9UWVBFLCB9OworCisJcmVncy5lYnggPSBmYW4gJiAweGZmOworCXJl dHVybiBpOGtfc21tKCZyZWdzKSA/IDogcmVncy5lYXggJiAweGZmOworfQorCisvKgorICogUmVh ZCB0aGUgZmFuIG5vbWluYWwgcnBtIGZvciBzcGVjaWZpYyBmYW4gc3BlZWQuCisgKi8KK3N0YXRp YyBpbnQgaThrX2dldF9mYW5fbm9taW5hbF9zcGVlZChpbnQgZmFuLCBpbnQgc3BlZWQpCit7CisJ c3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX0dFVF9OT01fU1BFRUQsIH07 CisKKwlyZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChzcGVlZCA8PCA4KTsKKwlyZXR1cm4gaThr X3NtbSgmcmVncykgPyA6IChyZWdzLmVheCAmIDB4ZmZmZikgKiBpOGtfZmFuX211bHQ7Cit9CisK Ky8qCisgKiBTZXQgdGhlIGZhbiBzcGVlZCAob2ZmLCBsb3csIGhpZ2gpLiBSZXR1cm5zIHRoZSBu ZXcgZmFuIHN0YXR1cy4KKyAqLworc3RhdGljIGludCBpOGtfc2V0X2ZhbihpbnQgZmFuLCBpbnQg c3BlZWQpCit7CisJc3RydWN0IHNtbV9yZWdzIHJlZ3MgPSB7IC5lYXggPSBJOEtfU01NX1NFVF9G QU4sIH07CisKKwlzcGVlZCA9IChzcGVlZCA8IDApID8gMCA6ICgoc3BlZWQgPiBpOGtfZmFuX21h eCkgPyBpOGtfZmFuX21heCA6IHNwZWVkKTsKKwlyZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChz cGVlZCA8PCA4KTsKKworCXJldHVybiBpOGtfc21tKCZyZWdzKSA/IDogaThrX2dldF9mYW5fc3Rh dHVzKGZhbik7Cit9CisKK3N0YXRpYyBpbnQgaThrX2dldF90ZW1wX3R5cGUoaW50IHNlbnNvcikK K3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fR0VUX1RFTVBfVFlQ RSwgfTsKKworCXJlZ3MuZWJ4ID0gc2Vuc29yICYgMHhmZjsKKwlyZXR1cm4gaThrX3NtbSgmcmVn cykgPyA6IHJlZ3MuZWF4ICYgMHhmZjsKK30KKworLyoKKyAqIFJlYWQgdGhlIGNwdSB0ZW1wZXJh dHVyZS4KKyAqLworc3RhdGljIGludCBfaThrX2dldF90ZW1wKGludCBzZW5zb3IpCit7CisJc3Ry dWN0IHNtbV9yZWdzIHJlZ3MgPSB7CisJCS5lYXggPSBJOEtfU01NX0dFVF9URU1QLAorCQkuZWJ4 ID0gc2Vuc29yICYgMHhmZiwKKwl9OworCisJcmV0dXJuIGk4a19zbW0oJnJlZ3MpID8gOiByZWdz LmVheCAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgaThrX2dldF90ZW1wKGludCBzZW5zb3IpCit7 CisJaW50IHRlbXAgPSBfaThrX2dldF90ZW1wKHNlbnNvcik7CisKKwkvKgorCSAqIFNvbWV0aW1l cyB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yIHJldHVybnMgMHg5OSwgd2hpY2ggaXMgb3V0IG9mIHJh bmdlLgorCSAqIEluIHRoaXMgY2FzZSB3ZSByZXRyeSAob25jZSkgYmVmb3JlIHJldHVybmluZyBh biBlcnJvci4KKwkgIyAxMDAzNjU1MTM3IDAwMDAwMDU4IDAwMDA1YTRiCisJICMgMTAwMzY1NTEz OCAwMDAwMDA5OSAwMDAwM2E4MCA8LS0tIDB4OTkgPSAxNTMgZGVncmVlcworCSAjIDEwMDM2NTUx MzkgMDAwMDAwNTQgMDAwMDVjNTIKKwkgKi8KKwlpZiAodGVtcCA9PSAweDk5KSB7CisJCW1zbGVl cCgxMDApOworCQl0ZW1wID0gX2k4a19nZXRfdGVtcChzZW5zb3IpOworCX0KKwkvKgorCSAqIFJl dHVybiAtRU5PREFUQSBmb3IgYWxsIGludmFsaWQgdGVtcGVyYXR1cmVzLgorCSAqCisJICogS25v d24gaW5zdGFuY2VzIGFyZSB0aGUgMHg5OSB2YWx1ZSBhcyBzZWVuIGFib3ZlIGFzIHdlbGwgYXMK KwkgKiAweGMxICgxOTMpLCB3aGljaCBtYXkgYmUgcmV0dXJuZWQgd2hlbiB0cnlpbmcgdG8gcmVh ZCB0aGUgR1BVCisJICogdGVtcGVyYXR1cmUgaWYgdGhlIHN5c3RlbSBzdXBwb3J0cyBhIEdQVSBh bmQgaXQgaXMgY3VycmVudGx5CisJICogdHVybmVkIG9mZi4KKwkgKi8KKwlpZiAodGVtcCA+IEk4 S19NQVhfVEVNUCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0 YXRpYyBpbnQgaThrX2dldF9kZWxsX3NpZ25hdHVyZShpbnQgcmVxX2ZuKQoreworCXN0cnVjdCBz bW1fcmVncyByZWdzID0geyAuZWF4ID0gcmVxX2ZuLCB9OworCWludCByYzsKKworCXJjID0gaThr X3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJlZ3Mu ZWF4ID09IDExNDU2NTE1MjcgJiYgcmVncy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKK30K Kworc3RhdGljIGludAoraThrX2lvY3RsX3VubG9ja2VkKHN0cnVjdCBmaWxlICpmcCwgdW5zaWdu ZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbCA9IDA7CisJaW50IHNw ZWVkOworCXVuc2lnbmVkIGNoYXIgYnVmZlsxNl07CisJaW50IF9fdXNlciAqYXJncCA9IChpbnQg X191c2VyICopYXJnOworCisJaWYgKCFhcmdwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRj aCAoY21kKSB7CisJY2FzZSBJOEtfQklPU19WRVJTSU9OOgorCQl2YWwgPSAoYmlvc192ZXJzaW9u WzBdIDw8IDE2KSB8CisJCQkJKGJpb3NfdmVyc2lvblsxXSA8PCA4KSB8IGJpb3NfdmVyc2lvblsy XTsKKwkJYnJlYWs7CisKKwljYXNlIEk4S19NQUNISU5FX0lEOgorCQltZW1zZXQoYnVmZiwgMCwg MTYpOworCQlzdHJsY3B5KGJ1ZmYsIGk4a19nZXRfZG1pX2RhdGEoRE1JX1BST0RVQ1RfU0VSSUFM KSwKKwkJCXNpemVvZihidWZmKSk7CisJCWJyZWFrOworCisJY2FzZSBJOEtfRk5fU1RBVFVTOgor CQl2YWwgPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOworCQlicmVhazsKKworCWNhc2UgSThLX1BPV0VS X1NUQVRVUzoKKwkJdmFsID0gaThrX2dldF9wb3dlcl9zdGF0dXMoKTsKKwkJYnJlYWs7CisKKwlj YXNlIEk4S19HRVRfVEVNUDoKKwkJdmFsID0gaThrX2dldF90ZW1wKDApOworCQlicmVhazsKKwor CWNhc2UgSThLX0dFVF9TUEVFRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGFyZ3AsIHNp emVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXZhbCA9IGk4a19nZXRfZmFuX3Nw ZWVkKHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBJOEtfR0VUX0ZBTjoKKwkJaWYgKGNvcHlfZnJv bV91c2VyKCZ2YWwsIGFyZ3AsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJ CXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOworCQlicmVhazsKKworCWNhc2UgSThLX1NF VF9GQU46CisJCWlmIChyZXN0cmljdGVkICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJ cmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9m KGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcGVl ZCwgYXJncCArIDEsIHNpemVvZihpbnQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXZhbCA9 IGk4a19zZXRfZmFuKHZhbCwgc3BlZWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVy biAtRUlOVkFMOworCX0KKworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJc3dpdGNo IChjbWQpIHsKKwljYXNlIEk4S19CSU9TX1ZFUlNJT046CisJCWlmIChjb3B5X3RvX3VzZXIoYXJn cCwgJnZhbCwgNCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlicmVhazsKKwljYXNlIEk4S19N QUNISU5FX0lEOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGJ1ZmYsIDE2KSkKKwkJCXJldHVy biAtRUZBVUxUOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChjb3B5X3RvX3VzZXIoYXJn cCwgJnZhbCwgc2l6ZW9mKGludCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGk4a19pb2N0bChzdHJ1Y3QgZmlsZSAq ZnAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWxvbmcgcmV0Owor CisJbXV0ZXhfbG9jaygmaThrX211dGV4KTsKKwlyZXQgPSBpOGtfaW9jdGxfdW5sb2NrZWQoZnAs IGNtZCwgYXJnKTsKKwltdXRleF91bmxvY2soJmk4a19tdXRleCk7CisKKwlyZXR1cm4gcmV0Owor fQorCisvKgorICogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvciAvcHJvYy9pOGsuCisgKi8KK3N0 YXRpYyBpbnQgaThrX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0 KQoreworCWludCBmbl9rZXksIGNwdV90ZW1wLCBhY19wb3dlcjsKKwlpbnQgbGVmdF9mYW4sIHJp Z2h0X2ZhbiwgbGVmdF9zcGVlZCwgcmlnaHRfc3BlZWQ7CisKKwljcHVfdGVtcAk9IGk4a19nZXRf dGVtcCgwKTsJCQkvKiAxMTEwMCDCtXMgKi8KKwlsZWZ0X2Zhbgk9IGk4a19nZXRfZmFuX3N0YXR1 cyhJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCDCtXMgKi8KKwlyaWdodF9mYW4JPSBpOGtfZ2V0X2Zh bl9zdGF0dXMoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwIMK1cyAqLworCWxlZnRfc3BlZWQJPSBp OGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCDCtXMgKi8KKwlyaWdodF9z cGVlZAk9IGk4a19nZXRfZmFuX3NwZWVkKEk4S19GQU5fUklHSFQpOwkvKiAgIDU4MCDCtXMgKi8K Kwlmbl9rZXkJCT0gaThrX2dldF9mbl9zdGF0dXMoKTsJCQkvKiAgIDc1MCDCtXMgKi8KKwlpZiAo cG93ZXJfc3RhdHVzKQorCQlhY19wb3dlciA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CQkvKiAx NDcwMCDCtXMgKi8KKwllbHNlCisJCWFjX3Bvd2VyID0gLTE7CisKKwkvKgorCSAqIEluZm86CisJ ICoKKwkgKiAxKSAgRm9ybWF0IHZlcnNpb24gKHRoaXMgd2lsbCBjaGFuZ2UgaWYgZm9ybWF0IGNo YW5nZXMpCisJICogMikgIEJJT1MgdmVyc2lvbgorCSAqIDMpICBCSU9TIG1hY2hpbmUgSUQKKwkg KiA0KSAgQ3B1IHRlbXBlcmF0dXJlCisJICogNSkgIExlZnQgZmFuIHN0YXR1cworCSAqIDYpICBS aWdodCBmYW4gc3RhdHVzCisJICogNykgIExlZnQgZmFuIHNwZWVkCisJICogOCkgIFJpZ2h0IGZh biBzcGVlZAorCSAqIDkpICBBQyBwb3dlcgorCSAqIDEwKSBGbiBLZXkgc3RhdHVzCisJICovCisJ c2VxX3ByaW50ZihzZXEsICIlcyAlcyAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJICAg SThLX1BST0NfRk1ULAorCQkgICBiaW9zX3ZlcnNpb24sCisJCSAgIGk4a19nZXRfZG1pX2RhdGEo RE1JX1BST0RVQ1RfU0VSSUFMKSwKKwkJICAgY3B1X3RlbXAsCisJCSAgIGxlZnRfZmFuLCByaWdo dF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkLAorCQkgICBhY19wb3dlciwgZm5fa2V5KTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAq aW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBp OGtfcHJvY19zaG93LCBOVUxMKTsKK30KKworCisvKgorICogSHdtb24gaW50ZXJmYWNlCisgKi8K Kworc3RhdGljIHNzaXplX3QgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbChzdHJ1Y3QgZGV2aWNl ICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJIGNo YXIgKmJ1ZikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxhYmVsc1tdID0geworCQki Q1BVIiwKKwkJIkdQVSIsCisJCSJTT0RJTU0iLAorCQkiT3RoZXIiLAorCQkiQW1iaWVudCIsCisJ CSJPdGhlciIsCisJfTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cikt PmluZGV4OworCWludCB0eXBlOworCisJdHlwZSA9IGk4a19nZXRfdGVtcF90eXBlKGluZGV4KTsK KwlpZiAodHlwZSA8IDApCisJCXJldHVybiB0eXBlOworCWlmICh0eXBlID49IEFSUkFZX1NJWkUo bGFiZWxzKSkKKwkJdHlwZSA9IEFSUkFZX1NJWkUobGFiZWxzKSAtIDE7CisJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJXNcbiIsIGxhYmVsc1t0eXBlXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGk4a19o d21vbl9zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2Vf YXR0cmlidXRlICpkZXZhdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0 b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCWludCB0ZW1wOworCisJdGVtcCA9 IGk4a19nZXRfdGVtcChpbmRleCk7CisJaWYgKHRlbXAgPCAwKQorCQlyZXR1cm4gdGVtcDsKKwly ZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAqIDEwMDApOworfQorCitzdGF0aWMgc3Np emVfdCBpOGtfaHdtb25fc2hvd19mYW5fbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlz dHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0 YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGFiZWxzW10gPSB7CisJCSJQcm9jZXNzb3IgRmFuIiwK KwkJIk1vdGhlcmJvYXJkIEZhbiIsCisJCSJWaWRlbyBGYW4iLAorCQkiUG93ZXIgU3VwcGx5IEZh biIsCisJCSJDaGlwc2V0IEZhbiIsCisJCSJPdGhlciBGYW4iLAorCX07CisJaW50IGluZGV4ID0g dG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlib29sIGRvY2sgPSBmYWxzZTsK KwlpbnQgdHlwZTsKKworCXR5cGUgPSBpOGtfZ2V0X2Zhbl90eXBlKGluZGV4KTsKKwlpZiAodHlw ZSA8IDApCisJCXJldHVybiB0eXBlOworCisJaWYgKHR5cGUgJiAweDEwKSB7CisJCWRvY2sgPSB0 cnVlOworCQl0eXBlICY9IDB4MEY7CisJfQorCisJaWYgKHR5cGUgPj0gQVJSQVlfU0laRShsYWJl bHMpKQorCQl0eXBlID0gKEFSUkFZX1NJWkUobGFiZWxzKSAtIDEpOworCisJcmV0dXJuIHNwcmlu dGYoYnVmLCAiJXMlc1xuIiwgKGRvY2sgPyAiRG9ja2luZyAiIDogIiIpLCBsYWJlbHNbdHlwZV0p OworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2hvd19mYW4oc3RydWN0IGRldmljZSAq ZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICBjaGFy ICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRl eDsKKwlpbnQgZmFuX3NwZWVkOworCisJZmFuX3NwZWVkID0gaThrX2dldF9mYW5fc3BlZWQoaW5k ZXgpOworCWlmIChmYW5fc3BlZWQgPCAwKQorCQlyZXR1cm4gZmFuX3NwZWVkOworCXJldHVybiBz cHJpbnRmKGJ1ZiwgIiVkXG4iLCBmYW5fc3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtf aHdtb25fc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9h dHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJICBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9f c2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVz ID0gaThrX2dldF9mYW5fc3RhdHVzKGluZGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJu IC1FSU87CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNsYW1wX3ZhbChzdGF0dXMgKiBp OGtfcHdtX211bHQsIDAsIDI1NSkpOworfQorCitzdGF0aWMgc3NpemVfdCBpOGtfaHdtb25fc2V0 X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICph dHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXgg PSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXVuc2lnbmVkIGxvbmcgdmFsOwor CWludCBlcnI7CisKKwllcnIgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyKQor CQlyZXR1cm4gZXJyOworCXZhbCA9IGNsYW1wX3ZhbChESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIGk4 a19wd21fbXVsdCksIDAsIGk4a19mYW5fbWF4KTsKKworCW11dGV4X2xvY2soJmk4a19tdXRleCk7 CisJZXJyID0gaThrX3NldF9mYW4oaW5kZXgsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpOGtfbXV0 ZXgpOworCisJcmV0dXJuIGVyciA8IDAgPyAtRUlPIDogY291bnQ7Cit9CisKK3N0YXRpYyBTRU5T T1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3RlbXAs IE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9sYWJlbCwgU19JUlVH TywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKKwkJCSAgMCk7CitzdGF0aWMgU0VO U09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBpOGtfaHdtb25fc2hvd190ZW1w LCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbGFiZWwsIFNfSVJV R08sIGk4a19od21vbl9zaG93X3RlbXBfbGFiZWwsIE5VTEwsCisJCQkgIDEpOworc3RhdGljIFNF TlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfdGVt cCwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2xhYmVsLCBTX0lS VUdPLCBpOGtfaHdtb25fc2hvd190ZW1wX2xhYmVsLCBOVUxMLAorCQkJICAyKTsKK3N0YXRpYyBT RU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X3Rl bXAsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9sYWJlbCwgU19J UlVHTywgaThrX2h3bW9uX3Nob3dfdGVtcF9sYWJlbCwgTlVMTCwKKwkJCSAgMyk7CitzdGF0aWMg U0VOU09SX0RFVklDRV9BVFRSKGZhbjFfaW5wdXQsIFNfSVJVR08sIGk4a19od21vbl9zaG93X2Zh biwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjFfbGFiZWwsIFNfSVJV R08sIGk4a19od21vbl9zaG93X2Zhbl9sYWJlbCwgTlVMTCwKKwkJCSAgMCk7CitzdGF0aWMgU0VO U09SX0RFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLCBpOGtfaHdtb25fc2hvd19w d20sCisJCQkgIGk4a19od21vbl9zZXRfcHdtLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FU VFIoZmFuMl9pbnB1dCwgU19JUlVHTywgaThrX2h3bW9uX3Nob3dfZmFuLCBOVUxMLAorCQkJICAx KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9sYWJlbCwgU19JUlVHTywgaThrX2h3 bW9uX3Nob3dfZmFuX2xhYmVsLCBOVUxMLAorCQkJICAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNF X0FUVFIocHdtMiwgU19JUlVHTyB8IFNfSVdVU1IsIGk4a19od21vbl9zaG93X3B3bSwKKwkJCSAg aThrX2h3bW9uX3NldF9wd20sIDEpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaThrX2F0 dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAkv KiAwICovCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAx ICovCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiAyICov CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiAzICovCisJ JnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0ICovCisJJnNl bnNvcl9kZXZfYXR0cl90ZW1wM19sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiA1ICovCisJJnNlbnNv cl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA2ICovCisJJnNlbnNvcl9k ZXZfYXR0cl90ZW1wNF9sYWJlbC5kZXZfYXR0ci5hdHRyLAkvKiA3ICovCisJJnNlbnNvcl9kZXZf YXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDggKi8KKwkmc2Vuc29yX2Rldl9hdHRy X2ZhbjFfbGFiZWwuZGV2X2F0dHIuYXR0ciwJLyogOSAqLworCSZzZW5zb3JfZGV2X2F0dHJfcHdt MS5kZXZfYXR0ci5hdHRyLAkJLyogMTAgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfaW5wdXQu ZGV2X2F0dHIuYXR0ciwJLyogMTEgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbGFiZWwuZGV2 X2F0dHIuYXR0ciwJLyogMTIgKi8KKwkmc2Vuc29yX2Rldl9hdHRyX3B3bTIuZGV2X2F0dHIuYXR0 ciwJCS8qIDEzICovCisJTlVMTAorfTsKKworc3RhdGljIHVtb2RlX3QgaThrX2lzX3Zpc2libGUo c3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBp bnQgaW5kZXgpCit7CisJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gMSAmJgorCSAgICAhKGk4 a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAxKSkKKwkJcmV0dXJuIDA7CisJaWYg KGluZGV4ID49IDIgJiYgaW5kZXggPD0gMyAmJgorCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4 S19IV01PTl9IQVZFX1RFTVAyKSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDQgJiYgaW5k ZXggPD0gNSAmJgorCSAgICAhKGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVAz KSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDYgJiYgaW5kZXggPD0gNyAmJgorCSAgICAh KGk4a19od21vbl9mbGFncyAmIEk4S19IV01PTl9IQVZFX1RFTVA0KSkKKwkJcmV0dXJuIDA7CisJ aWYgKGluZGV4ID49IDggJiYgaW5kZXggPD0gMTAgJiYKKwkgICAgIShpOGtfaHdtb25fZmxhZ3Mg JiBJOEtfSFdNT05fSEFWRV9GQU4xKSkKKwkJcmV0dXJuIDA7CisJaWYgKGluZGV4ID49IDExICYm IGluZGV4IDw9IDEzICYmCisJICAgICEoaThrX2h3bW9uX2ZsYWdzICYgSThLX0hXTU9OX0hBVkVf RkFOMikpCisJCXJldHVybiAwOworCisJcmV0dXJuIGF0dHItPm1vZGU7Cit9CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGk4a19ncm91cCA9IHsKKwkuYXR0cnMgPSBpOGtf YXR0cnMsCisJLmlzX3Zpc2libGUgPSBpOGtfaXNfdmlzaWJsZSwKK307CitfX0FUVFJJQlVURV9H Uk9VUFMoaThrKTsKKworc3RhdGljIGludCBfX2luaXQgaThrX2luaXRfaHdtb24odm9pZCkKK3sK KwlpbnQgZXJyOworCisJaThrX2h3bW9uX2ZsYWdzID0gMDsKKworCS8qIENQVSB0ZW1wZXJhdHVy ZSBhdHRyaWJ1dGVzLCBpZiB0ZW1wZXJhdHVyZSB0eXBlIGlzIE9LICovCisJZXJyID0gaThrX2dl dF90ZW1wX3R5cGUoMCk7CisJaWYgKGVyciA+PSAwKQorCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThL X0hXTU9OX0hBVkVfVEVNUDE7CisJLyogY2hlY2sgZm9yIGFkZGl0aW9uYWwgdGVtcGVyYXR1cmUg c2Vuc29ycyAqLworCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDEpOworCWlmIChlcnIgPj0gMCkK KwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVAyOworCWVyciA9IGk4a19n ZXRfdGVtcF90eXBlKDIpOworCWlmIChlcnIgPj0gMCkKKwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4 S19IV01PTl9IQVZFX1RFTVAzOworCWVyciA9IGk4a19nZXRfdGVtcF90eXBlKDMpOworCWlmIChl cnIgPj0gMCkKKwkJaThrX2h3bW9uX2ZsYWdzIHw9IEk4S19IV01PTl9IQVZFX1RFTVA0OworCisJ LyogRmlyc3QgZmFuIGF0dHJpYnV0ZXMsIGlmIGZhbiB0eXBlIGlzIE9LICovCisJZXJyID0gaThr X2dldF9mYW5fdHlwZSgwKTsKKwlpZiAoZXJyID49IDApCisJCWk4a19od21vbl9mbGFncyB8PSBJ OEtfSFdNT05fSEFWRV9GQU4xOworCisJLyogU2Vjb25kIGZhbiBhdHRyaWJ1dGVzLCBpZiBmYW4g dHlwZSBpcyBPSyAqLworCWVyciA9IGk4a19nZXRfZmFuX3R5cGUoMSk7CisJaWYgKGVyciA+PSAw KQorCQlpOGtfaHdtb25fZmxhZ3MgfD0gSThLX0hXTU9OX0hBVkVfRkFOMjsKKworCWk4a19od21v bl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImk4ayIsIE5V TEwsCisJCQkJCQkJICBpOGtfZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGk4a19od21vbl9kZXYpKSB7 CisJCWVyciA9IFBUUl9FUlIoaThrX2h3bW9uX2Rldik7CisJCWk4a19od21vbl9kZXYgPSBOVUxM OworCQlwcl9lcnIoImh3bW9uIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJ cmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpOGtfY29uZmlnX2RhdGEg eworCXVpbnQgZmFuX211bHQ7CisJdWludCBmYW5fbWF4OworfTsKKworZW51bSBpOGtfY29uZmln cyB7CisJREVMTF9MQVRJVFVERV9ENTIwLAorCURFTExfUFJFQ0lTSU9OXzQ5MCwKKwlERUxMX1NU VURJTywKKwlERUxMX1hQUywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaThrX2NvbmZpZ19k YXRhIGk4a19jb25maWdfZGF0YVtdID0geworCVtERUxMX0xBVElUVURFX0Q1MjBdID0geworCQku ZmFuX211bHQgPSAxLAorCQkuZmFuX21heCA9IEk4S19GQU5fVFVSQk8sCisJfSwKKwlbREVMTF9Q UkVDSVNJT05fNDkwXSA9IHsKKwkJLmZhbl9tdWx0ID0gMSwKKwkJLmZhbl9tYXggPSBJOEtfRkFO X1RVUkJPLAorCX0sCisJW0RFTExfU1RVRElPXSA9IHsKKwkJLmZhbl9tdWx0ID0gMSwKKwkJLmZh bl9tYXggPSBJOEtfRkFOX0hJR0gsCisJfSwKKwlbREVMTF9YUFNdID0geworCQkuZmFuX211bHQg PSAxLAorCQkuZmFuX21heCA9IEk4S19GQU5fSElHSCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVj dCBkbWlfc3lzdGVtX2lkIGk4a19kbWlfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsKKwkJLmlk ZW50ID0gIkRlbGwgSW5zcGlyb24iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlf U1lTX1ZFTkRPUiwgIkRlbGwgQ29tcHV0ZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9O QU1FLCAiSW5zcGlyb24iKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgTGF0aXR1 ZGUiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwg Q29tcHV0ZXIiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiTGF0aXR1ZGUiKSwK KwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgSW5zcGlyb24gMiIsCisJCS5tYXRjaGVz ID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlf TUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIiksCisJCX0sCisJfSwKKwl7CisJCS5p ZGVudCA9ICJEZWxsIExhdGl0dWRlIEQ1MjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRD SChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNU X05BTUUsICJMYXRpdHVkZSBENTIwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICop Jmk4a19jb25maWdfZGF0YVtERUxMX0xBVElUVURFX0Q1MjBdLAorCX0sCisJeworCQkuaWRlbnQg PSAiRGVsbCBMYXRpdHVkZSAyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZ U19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAi TGF0aXR1ZGUiKSwKKwkJfSwKKwl9LAorCXsJLyogVUsgSW5zcGlyb24gNjQwMCAgKi8KKwkJLmlk ZW50ID0gIkRlbGwgSW5zcGlyb24gMyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERN SV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFN RSwgIk1NMDYxIiksCisJCX0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIEluc3Bpcm9uIDMi LAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5j LiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJNUDA2MSIpLAorCQl9LAorCX0s CisJeworCQkuaWRlbnQgPSAiRGVsbCBQcmVjaXNpb24gNDkwIiwKKwkJLm1hdGNoZXMgPSB7CisJ CQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4iKSwKKwkJCURNSV9NQVRDSChE TUlfUFJPRFVDVF9OQU1FLAorCQkJCSAgIlByZWNpc2lvbiBXb3JrU3RhdGlvbiA0OTAiKSwKKwkJ fSwKKwkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmaThrX2NvbmZpZ19kYXRhW0RFTExfUFJFQ0lT SU9OXzQ5MF0sCisJfSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIFByZWNpc2lvbiIsCisJCS5tYXRj aGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlE TUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlByZWNpc2lvbiIpLAorCQl9LAorCX0sCisJewor CQkuaWRlbnQgPSAiRGVsbCBWb3N0cm8iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChE TUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05B TUUsICJWb3N0cm8iKSwKKwkJfSwKKwl9LAorCXsKKwkJLmlkZW50ID0gIkRlbGwgWFBTNDIxIiwK KwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYy4i KSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTIEw0MjFYIiksCisJCX0sCisJ fSwKKwl7CisJCS5pZGVudCA9ICJEZWxsIFN0dWRpbyIsCisJCS5tYXRjaGVzID0geworCQkJRE1J X01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BS T0RVQ1RfTkFNRSwgIlN0dWRpbyIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZp OGtfY29uZmlnX2RhdGFbREVMTF9TVFVESU9dLAorCX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBY UFMgMTMiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRl bGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJYUFMxMyIpLAorCQl9 LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZpOGtfY29uZmlnX2RhdGFbREVMTF9YUFNdLAor CX0sCisJeworCQkuaWRlbnQgPSAiRGVsbCBYUFMgTTE0MCIsCisJCS5tYXRjaGVzID0geworCQkJ RE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1J X1BST0RVQ1RfTkFNRSwgIk1YQzA1MSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodm9pZCAq KSZpOGtfY29uZmlnX2RhdGFbREVMTF9YUFNdLAorCX0sCisJeyB9Cit9OworCitNT0RVTEVfREVW SUNFX1RBQkxFKGRtaSwgaThrX2RtaV90YWJsZSk7CisKKy8qCisgKiBQcm9iZSBmb3IgdGhlIHBy ZXNlbmNlIG9mIGEgc3VwcG9ydGVkIGxhcHRvcC4KKyAqLworc3RhdGljIGludCBfX2luaXQgaThr X3Byb2JlKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkOworCWludCBm YW4sIHJldDsKKworCS8qCisJICogR2V0IERNSSBpbmZvcm1hdGlvbgorCSAqLworCWlmICghZG1p X2NoZWNrX3N5c3RlbShpOGtfZG1pX3RhYmxlKSkgeworCQlpZiAoIWlnbm9yZV9kbWkgJiYgIWZv cmNlKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJcHJfaW5mbygibm90IHJ1bm5pbmcgb24gYSBz dXBwb3J0ZWQgRGVsbCBzeXN0ZW0uXG4iKTsKKwkJcHJfaW5mbygidmVuZG9yPSVzLCBtb2RlbD0l cywgdmVyc2lvbj0lc1xuIiwKKwkJCWk4a19nZXRfZG1pX2RhdGEoRE1JX1NZU19WRU5ET1IpLAor CQkJaThrX2dldF9kbWlfZGF0YShETUlfUFJPRFVDVF9OQU1FKSwKKwkJCWk4a19nZXRfZG1pX2Rh dGEoRE1JX0JJT1NfVkVSU0lPTikpOworCX0KKworCXN0cmxjcHkoYmlvc192ZXJzaW9uLCBpOGtf Z2V0X2RtaV9kYXRhKERNSV9CSU9TX1ZFUlNJT04pLAorCQlzaXplb2YoYmlvc192ZXJzaW9uKSk7 CisKKwkvKgorCSAqIEdldCBTTU0gRGVsbCBzaWduYXR1cmUKKwkgKi8KKwlpZiAoaThrX2dldF9k ZWxsX3NpZ25hdHVyZShJOEtfU01NX0dFVF9ERUxMX1NJRzEpICYmCisJICAgIGk4a19nZXRfZGVs bF9zaWduYXR1cmUoSThLX1NNTV9HRVRfREVMTF9TSUcyKSkgeworCQlwcl9lcnIoInVuYWJsZSB0 byBnZXQgU01NIERlbGwgc2lnbmF0dXJlXG4iKTsKKwkJaWYgKCFmb3JjZSkKKwkJCXJldHVybiAt RU5PREVWOworCX0KKworCS8qCisJICogU2V0IGZhbiBtdWx0aXBsaWVyIGFuZCBtYXhpbWFsIGZh biBzcGVlZCBmcm9tIGRtaSBjb25maWcKKwkgKiBWYWx1ZXMgc3BlY2lmaWVkIGluIG1vZHVsZSBw YXJhbWV0ZXJzIG92ZXJyaWRlIHZhbHVlcyBmcm9tIGRtaQorCSAqLworCWlkID0gZG1pX2ZpcnN0 X21hdGNoKGk4a19kbWlfdGFibGUpOworCWlmIChpZCAmJiBpZC0+ZHJpdmVyX2RhdGEpIHsKKwkJ Y29uc3Qgc3RydWN0IGk4a19jb25maWdfZGF0YSAqY29uZiA9IGlkLT5kcml2ZXJfZGF0YTsKKwkJ aWYgKCFmYW5fbXVsdCAmJiBjb25mLT5mYW5fbXVsdCkKKwkJCWZhbl9tdWx0ID0gY29uZi0+ZmFu X211bHQ7CisJCWlmICghZmFuX21heCAmJiBjb25mLT5mYW5fbWF4KQorCQkJZmFuX21heCA9IGNv bmYtPmZhbl9tYXg7CisJfQorCisJaThrX2Zhbl9tYXggPSBmYW5fbWF4ID8gOiBJOEtfRkFOX0hJ R0g7CS8qIE11c3Qgbm90IGJlIDAgKi8KKwlpOGtfcHdtX211bHQgPSBESVZfUk9VTkRfVVAoMjU1 LCBpOGtfZmFuX21heCk7CisKKwlpZiAoIWZhbl9tdWx0KSB7CisJCS8qCisJCSAqIEF1dG9kZXRl Y3QgZmFuIG11bHRpcGxpZXIgYmFzZWQgb24gbm9taW5hbCBycG0KKwkJICogSWYgZmFuIHJlcG9y dHMgcnBtIHZhbHVlIHRvbyBoaWdoIHRoZW4gc2V0IG11bHRpcGxpZXIgdG8gMQorCQkgKi8KKwkJ Zm9yIChmYW4gPSAwOyBmYW4gPCAyOyArK2ZhbikgeworCQkJcmV0ID0gaThrX2dldF9mYW5fbm9t aW5hbF9zcGVlZChmYW4sIGk4a19mYW5fbWF4KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWNvbnRp bnVlOworCQkJaWYgKHJldCA+IEk4S19GQU5fTUFYX1JQTSkKKwkJCQlpOGtfZmFuX211bHQgPSAx OworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGYW4gbXVsdGlwbGllciB3YXMgc3Bl Y2lmaWVkIGluIG1vZHVsZSBwYXJhbSBvciBpbiBkbWkgKi8KKwkJaThrX2Zhbl9tdWx0ID0gZmFu X211bHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGk4a19pbml0 KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKKwlpbnQgZXJyOwor CisJLyogQXJlIHdlIHJ1bm5pbmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KKwlpZiAoaThr X3Byb2JlKCkpCisJCXJldHVybiAtRU5PREVWOworCisJLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50 cnkgKi8KKwlwcm9jX2k4ayA9IHByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMp OworCWlmICghcHJvY19pOGspCisJCXJldHVybiAtRU5PRU5UOworCisJZXJyID0gaThrX2luaXRf aHdtb24oKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfcmVtb3ZlX3Byb2M7CisKKwlyZXR1cm4g MDsKKworIGV4aXRfcmVtb3ZlX3Byb2M6CisJcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5VTEwp OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBpOGtfZXhpdCh2b2lkKQor eworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19od21vbl9kZXYpOworCXJlbW92ZV9wcm9j X2VudHJ5KCJpOGsiLCBOVUxMKTsKK30KKworbW9kdWxlX2luaXQoaThrX2luaXQpOworbW9kdWxl X2V4aXQoaThrX2V4aXQpOwotLSAKMS43LjEwLjQKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3Jz QGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár @ 2015-04-29 11:41 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-29 11:41 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k interface which is needed only for old Dell Inspirion models or for userspace i8kutils package. For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- arch/x86/Kconfig | 25 +++---- drivers/hwmon/Kconfig | 11 +++ drivers/hwmon/Makefile | 2 +- drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ 4 files changed, 106 insertions(+), 82 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 226d569..7b756b3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1055,24 +1055,19 @@ config TOSHIBA Say N otherwise. config I8K - tristate "Dell laptop support" + tristate "Dell i8k legacy laptop support" select HWMON + select SENSORS_DELL_SMM ---help--- - This adds a driver to safely access the System Management Mode - of the CPU on the Dell Inspiron 8000. The System Management Mode - is used to read cpu temperature and cooling fan status and to - control the fans on the I8K portables. + This option enables legacy /proc/i8k userspace interface in hwmon + dell-smm-hwmon driver. Character file /proc/i8k reports bios version, + temperature and allows controlling fan speeds of Dell laptops via + System Management Mode. For old Dell laptops (like Dell Inspiron 8000) + it reports also power and hotkey status. For fan speed control is + needed userspace package i8kutils. - This driver has been tested only on the Inspiron 8000 but it may - also work with other Dell laptops. You can force loading on other - models by passing the parameter `force=1' to the module. Use at - your own risk. - - For information on utilities to make use of this driver see the - I8K Linux utilities web site at: - <http://people.debian.org/~dz/i8k/> - - Say Y if you intend to run this kernel on a Dell Inspiron 8000. + Say Y if you intend to run this kernel on old Dell laptops or want to + use userspace package i8kutils. Say N otherwise. config X86_REBOOTFIXUPS diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 25d9e72..714f92a 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -371,6 +371,17 @@ config SENSORS_DS1621 This driver can also be built as a module. If so, the module will be called ds1621. +config SENSORS_DELL_SMM + tristate "Dell laptop SMM BIOS hwmon driver" + depends on X86 && DMI + help + This hwmon driver adds support for reporting temperature of different + sensors and controls the fans on Dell laptops via System Management + Mode provided by Dell BIOS. + + When option I8K is also enabled this driver provides legacy /proc/i8k + userspace interface for i8kutils package. + config SENSORS_DA9052_ADC tristate "Dialog DA9052/DA9053 ADC" depends on PMIC_DA9052 diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 51533ac..6cacd0f 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o obj-$(CONFIG_SENSORS_DME1737) += dme1737.o obj-$(CONFIG_SENSORS_DS620) += ds620.o obj-$(CONFIG_SENSORS_DS1621) += ds1621.o @@ -156,7 +157,6 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o -obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index 65d314b..2a80882 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("i8k"); @@ -93,6 +93,7 @@ static bool ignore_dmi; module_param(ignore_dmi, bool, 0); MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); +#if IS_ENABLED(CONFIG_I8K) static bool restricted; module_param(restricted, bool, 0); MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); static bool power_status; module_param(power_status, bool, 0600); MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); +#endif static uint fan_mult; module_param(fan_mult, uint, 0); @@ -109,18 +111,6 @@ static uint fan_max; module_param(fan_max, uint, 0); MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - struct smm_regs { unsigned int eax; unsigned int ebx __packed; @@ -221,45 +211,6 @@ out: } /* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* * Read the fan status. */ static int i8k_get_fan_status(int fan) @@ -378,6 +329,51 @@ static int i8k_get_dell_signature(int req_fn) return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; } +#if IS_ENABLED(CONFIG_I8K) + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Procfs interface + */ + static int i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) { @@ -528,6 +524,37 @@ static int i8k_open_fs(struct inode *inode, struct file *file) return single_open(file, i8k_proc_show, NULL); } +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +static void __init i8k_init_procfs(void) +{ + /* Register the proc entry */ + proc_create("i8k", 0, NULL, &i8k_fops); +} + +static void __exit i8k_exit_procfs(void) +{ + remove_proc_entry("i8k", NULL); +} + +#else + +static inline void __init i8k_init_procfs(void) +{ +} + +static inline void __exit i8k_exit_procfs(void) +{ +} + +#endif /* * Hwmon interface @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) if (err >= 0) i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell-smm", + NULL, i8k_groups); if (IS_ERR(i8k_hwmon_dev)) { err = PTR_ERR(i8k_hwmon_dev); i8k_hwmon_dev = NULL; @@ -976,33 +1003,24 @@ static int __init i8k_probe(void) static int __init i8k_init(void) { - struct proc_dir_entry *proc_i8k; int err; /* Are we running on an supported laptop? */ if (i8k_probe()) return -ENODEV; - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - err = i8k_init_hwmon(); if (err) - goto exit_remove_proc; + return err; + i8k_init_procfs(); return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; } static void __exit i8k_exit(void) { hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); + i8k_exit_procfs(); } module_init(i8k_init); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-04-29 11:41 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-29 11:41 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzcGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RF TExfU01NIGFuZCBDT05GSUdfSThLLgpPcHRpb24gU0VOU09SU19ERUxMX1NNTSBpcyBub3cgdXNl ZCB0byBlbmFibGUgY29tcGlsYXRpb24gb2YgZGVsbC1zbW0taHdtb24KZHJpdmVyIGFuZCBvbGQg Q09ORklHX0k4SyBvcHRpb24gdG8gZW5hYmxlIC9wcm9jL2k4ayBpbnRlcmZhY2UgaW4gZHJpdmVy LgoKU28gdGhpcyBjaGFuZ2UgYWxsb3dzIHRvIGNvbXBpbGUgZGVsbC1zbW0taHdtb24gZHJpdmVy IHdpdGhvdXQgbGVnYWN5IC9wcm9jL2k4awppbnRlcmZhY2Ugd2hpY2ggaXMgbmVlZGVkIG9ubHkg Zm9yIG9sZCBEZWxsIEluc3BpcmlvbiBtb2RlbHMgb3IgZm9yIHVzZXJzcGFjZQppOGt1dGlscyBw YWNrYWdlLgoKRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiBDT05GSUdfSThLIGlzIGVu YWJsZWQgdGhlbiBhbHNvIFNFTlNPUlNfREVMTF9TTU0KaXMgZW5hYmxlZCBhbmQgc28gZHJpdmVy IGRlbGwtc21tLWh3bW9uICh3aXRoIC9wcm9jL2k4aykgaXMgY29tcGlsZWQuCgpTaWduZWQtb2Zm LWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Ci0tLQogYXJjaC94ODYvS2Nv bmZpZyAgICAgICAgICAgICAgIHwgICAyNSArKystLS0tCiBkcml2ZXJzL2h3bW9uL0tjb25maWcg ICAgICAgICAgfCAgIDExICsrKwogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgIHwgICAg MiArLQogZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgIDE1MCArKysrKysrKysrKysr KysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDEwNiBpbnNlcnRp b25zKCspLCA4MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIv YXJjaC94ODYvS2NvbmZpZwppbmRleCAyMjZkNTY5Li43Yjc1NmIzIDEwMDY0NAotLS0gYS9hcmNo L3g4Ni9LY29uZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEwNTUsMjQgKzEwNTUsMTkg QEAgY29uZmlnIFRPU0hJQkEKIAkgIFNheSBOIG90aGVyd2lzZS4KIAogY29uZmlnIEk4SwotCXRy aXN0YXRlICJEZWxsIGxhcHRvcCBzdXBwb3J0IgorCXRyaXN0YXRlICJEZWxsIGk4ayBsZWdhY3kg bGFwdG9wIHN1cHBvcnQiCiAJc2VsZWN0IEhXTU9OCisJc2VsZWN0IFNFTlNPUlNfREVMTF9TTU0K IAktLS1oZWxwLS0tCi0JICBUaGlzIGFkZHMgYSBkcml2ZXIgdG8gc2FmZWx5IGFjY2VzcyB0aGUg U3lzdGVtIE1hbmFnZW1lbnQgTW9kZQotCSAgb2YgdGhlIENQVSBvbiB0aGUgRGVsbCBJbnNwaXJv biA4MDAwLiBUaGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQotCSAgaXMgdXNlZCB0byByZWFkIGNw dSB0ZW1wZXJhdHVyZSBhbmQgY29vbGluZyBmYW4gc3RhdHVzIGFuZCB0bwotCSAgY29udHJvbCB0 aGUgZmFucyBvbiB0aGUgSThLIHBvcnRhYmxlcy4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGVn YWN5IC9wcm9jL2k4ayB1c2Vyc3BhY2UgaW50ZXJmYWNlIGluIGh3bW9uCisJICBkZWxsLXNtbS1o d21vbiBkcml2ZXIuIENoYXJhY3RlciBmaWxlIC9wcm9jL2k4ayByZXBvcnRzIGJpb3MgdmVyc2lv biwKKwkgIHRlbXBlcmF0dXJlIGFuZCBhbGxvd3MgY29udHJvbGxpbmcgZmFuIHNwZWVkcyBvZiBE ZWxsIGxhcHRvcHMgdmlhCisJICBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlLiBGb3Igb2xkIERlbGwg bGFwdG9wcyAobGlrZSBEZWxsIEluc3Bpcm9uIDgwMDApCisJICBpdCByZXBvcnRzIGFsc28gcG93 ZXIgYW5kIGhvdGtleSBzdGF0dXMuIEZvciBmYW4gc3BlZWQgY29udHJvbCBpcworCSAgbmVlZGVk IHVzZXJzcGFjZSBwYWNrYWdlIGk4a3V0aWxzLgogCi0JICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0 ZXN0ZWQgb25seSBvbiB0aGUgSW5zcGlyb24gODAwMCBidXQgaXQgbWF5Ci0JICBhbHNvIHdvcmsg d2l0aCBvdGhlciBEZWxsIGxhcHRvcHMuIFlvdSBjYW4gZm9yY2UgbG9hZGluZyBvbiBvdGhlcgot CSAgbW9kZWxzIGJ5IHBhc3NpbmcgdGhlIHBhcmFtZXRlciBgZm9yY2U9MScgdG8gdGhlIG1vZHVs ZS4gVXNlIGF0Ci0JICB5b3VyIG93biByaXNrLgotCi0JICBGb3IgaW5mb3JtYXRpb24gb24gdXRp bGl0aWVzIHRvIG1ha2UgdXNlIG9mIHRoaXMgZHJpdmVyIHNlZSB0aGUKLQkgIEk4SyBMaW51eCB1 dGlsaXRpZXMgd2ViIHNpdGUgYXQ6Ci0JICA8aHR0cDovL3Blb3BsZS5kZWJpYW4ub3JnL35kei9p OGsvPgotCi0JICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIERl bGwgSW5zcGlyb24gODAwMC4KKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2Vy bmVsIG9uIG9sZCBEZWxsIGxhcHRvcHMgb3Igd2FudCB0bworCSAgdXNlIHVzZXJzcGFjZSBwYWNr YWdlIGk4a3V0aWxzLgogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgWDg2X1JFQk9PVEZJ WFVQUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9L Y29uZmlnCmluZGV4IDI1ZDllNzIuLjcxNGY5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24v S2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTM3MSw2ICszNzEsMTcgQEAg Y29uZmlnIFNFTlNPUlNfRFMxNjIxCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBh cyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBkczE2MjEu CiAKK2NvbmZpZyBTRU5TT1JTX0RFTExfU01NCisJdHJpc3RhdGUgIkRlbGwgbGFwdG9wIFNNTSBC SU9TIGh3bW9uIGRyaXZlciIKKwlkZXBlbmRzIG9uIFg4NiAmJiBETUkKKwloZWxwCisJICBUaGlz IGh3bW9uIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIHJlcG9ydGluZyB0ZW1wZXJhdHVyZSBvZiBk aWZmZXJlbnQKKwkgIHNlbnNvcnMgYW5kIGNvbnRyb2xzIHRoZSBmYW5zIG9uIERlbGwgbGFwdG9w cyB2aWEgU3lzdGVtIE1hbmFnZW1lbnQKKwkgIE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBCSU9TLgor CisJICBXaGVuIG9wdGlvbiBJOEsgaXMgYWxzbyBlbmFibGVkIHRoaXMgZHJpdmVyIHByb3ZpZGVz IGxlZ2FjeSAvcHJvYy9pOGsKKwkgIHVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIGk4a3V0aWxzIHBh Y2thZ2UuCisKIGNvbmZpZyBTRU5TT1JTX0RBOTA1Ml9BREMKIAl0cmlzdGF0ZSAiRGlhbG9nIERB OTA1Mi9EQTkwNTMgQURDIgogCWRlcGVuZHMgb24gUE1JQ19EQTkwNTIKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDUxNTMz YWMuLjZjYWNkMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJp dmVycy9od21vbi9NYWtlZmlsZQpAQCAtNDksNiArNDksNyBAQCBvYmotJChDT05GSUdfU0VOU09S U19BVFhQMSkJKz0gYXR4cDEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQ09SRVRFTVApCSs9IGNv cmV0ZW1wLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RBOTA1Ml9BREMpKz0gZGE5MDUyLWh3bW9u Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RBOTA1NSkrPSBkYTkwNTUtaHdtb24ubworb2JqLSQo Q09ORklHX1NFTlNPUlNfREVMTF9TTU0pCSs9IGRlbGwtc21tLWh3bW9uLm8KIG9iai0kKENPTkZJ R19TRU5TT1JTX0RNRTE3MzcpCSs9IGRtZTE3Mzcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRFM2 MjApCSs9IGRzNjIwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8K QEAgLTE1Niw3ICsxNTcsNiBAQCBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4 M2w3ODV0cy5vCiBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5v CiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChD T05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCi1vYmotJChDT05GSUdfSThL KQkJKz0gZGVsbC1zbW0taHdtb24ubwogCiBvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8K IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9o d21vbi9kZWxsLXNtbS1od21vbi5jCmluZGV4IDY1ZDMxNGIuLjJhODA4ODIgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwt c21tLWh3bW9uLmMKQEAgLTgxLDcgKzgxLDcgQEAgc3RhdGljIHVpbnQgaThrX2Zhbl9tYXggPSBJ OEtfRkFOX0hJR0g7CiAKIE1PRFVMRV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJp YW4ub3JnKSIpOwogTU9EVUxFX0FVVEhPUigiUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwu Y29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklP UyBvbiBEZWxsIGxhcHRvcHMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgU01N IEJJT1MgaHdtb24gZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJ QVMoImk4ayIpOwogCkBAIC05Myw2ICs5Myw3IEBAIHN0YXRpYyBib29sIGlnbm9yZV9kbWk7CiBt b2R1bGVfcGFyYW0oaWdub3JlX2RtaSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlnbm9y ZV9kbWksICJDb250aW51ZSBwcm9iaW5nIGhhcmR3YXJlIGV2ZW4gaWYgRE1JIGRhdGEgZG9lcyBu b3QgbWF0Y2giKTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0k4SykKIHN0YXRpYyBib29sIHJl c3RyaWN0ZWQ7CiBtb2R1bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFS TV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJp bGl0eSBzZXQiKTsKQEAgLTEwMCw2ICsxMDEsNyBAQCBNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0 ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKIHN0 YXRpYyBib29sIHBvd2VyX3N0YXR1czsKIG1vZHVsZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2ws IDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3Rh dHVzIGluIC9wcm9jL2k4ayIpOworI2VuZGlmCiAKIHN0YXRpYyB1aW50IGZhbl9tdWx0OwogbW9k dWxlX3BhcmFtKGZhbl9tdWx0LCB1aW50LCAwKTsKQEAgLTEwOSwxOCArMTExLDYgQEAgc3RhdGlj IHVpbnQgZmFuX21heDsKIG1vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKIE1PRFVMRV9Q QVJNX0RFU0MoZmFuX21heCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBzcGVlZCAoZGVmYXVs dDogYXV0b2RldGVjdCkiKTsKIAotc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUg Kmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0 IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGNvbnN0IHN0 cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxF LAotCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJ CT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lv Y3RsCT0gaThrX2lvY3RsLAotfTsKLQogc3RydWN0IHNtbV9yZWdzIHsKIAl1bnNpZ25lZCBpbnQg ZWF4OwogCXVuc2lnbmVkIGludCBlYnggX19wYWNrZWQ7CkBAIC0yMjEsNDUgKzIxMSw2IEBAIG91 dDoKIH0KIAogLyoKLSAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQg aThrX2dldF9mbl9zdGF0dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVh eCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OwotCWludCByYzsKLQotCXJjID0gaThrX3NtbSgmcmVn cyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0Jc3dpdGNoICgocmVncy5lYXggPj4g SThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7Ci0JY2FzZSBJOEtfRk5fVVA6Ci0JCXJldHVy biBJOEtfVk9MX1VQOwotCWNhc2UgSThLX0ZOX0RPV046Ci0JCXJldHVybiBJOEtfVk9MX0RPV047 Ci0JY2FzZSBJOEtfRk5fTVVURToKLQkJcmV0dXJuIEk4S19WT0xfTVVURTsKLQlkZWZhdWx0Ogot CQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCi0gKi8K LXN0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3Jl Z3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTLCB9OwotCWludCByYzsKLQot CXJjID0gaThrX3NtbSgmcmVncyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0 dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19BQyA6IEk4S19CQVRU RVJZOwotfQotCi0vKgogICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KICAqLwogc3RhdGljIGludCBp OGtfZ2V0X2Zhbl9zdGF0dXMoaW50IGZhbikKQEAgLTM3OCw2ICszMjksNTEgQEAgc3RhdGljIGlu dCBpOGtfZ2V0X2RlbGxfc2lnbmF0dXJlKGludCByZXFfZm4pCiAJcmV0dXJuIHJlZ3MuZWF4ID09 IDExNDU2NTE1MjcgJiYgcmVncy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKIH0KIAorI2lm IElTX0VOQUJMRUQoQ09ORklHX0k4SykKKworLyoKKyAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMu CisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3Qgc21t X3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OworCWludCByYzsKKwor CXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc3dp dGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisJY2FzZSBJ OEtfRk5fVVA6CisJCXJldHVybiBJOEtfVk9MX1VQOworCWNhc2UgSThLX0ZOX0RPV046CisJCXJl dHVybiBJOEtfVk9MX0RPV047CisJY2FzZSBJOEtfRk5fTVVURToKKwkJcmV0dXJuIEk4S19WT0xf TVVURTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBw b3dlciBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkK K3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVT LCB9OworCWludCByYzsKKworCXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJ cmV0dXJuIHJjOworCisJcmV0dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/ IEk4S19BQyA6IEk4S19CQVRURVJZOworfQorCisvKgorICogUHJvY2ZzIGludGVyZmFjZQorICov CisKIHN0YXRpYyBpbnQKIGk4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2ln bmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTI4LDYgKzUyNCwzNyBAQCBz dGF0aWMgaW50IGk4a19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpm aWxlKQogCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBOVUxMKTsKIH0K IAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CisJLm93 bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAorCS5yZWFkCQk9IHNl cV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVh c2UsCisJLnVubG9ja2VkX2lvY3RsCT0gaThrX2lvY3RsLAorfTsKKworc3RhdGljIHZvaWQgX19p bml0IGk4a19pbml0X3Byb2Nmcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5 ICovCisJcHJvY19jcmVhdGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9wcyk7Cit9CisKK3N0YXRp YyB2b2lkIF9fZXhpdCBpOGtfZXhpdF9wcm9jZnModm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRy eSgiaThrIiwgTlVMTCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQg aThrX2luaXRfcHJvY2ZzKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQg aThrX2V4aXRfcHJvY2ZzKHZvaWQpCit7Cit9CisKKyNlbmRpZgogCiAvKgogICogSHdtb24gaW50 ZXJmYWNlCkBAIC03NTAsOCArNzc3LDggQEAgc3RhdGljIGludCBfX2luaXQgaThrX2luaXRfaHdt b24odm9pZCkKIAlpZiAoZXJyID49IDApCiAJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05f SEFWRV9GQU4yOwogCi0JaThrX2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRo X2dyb3VwcyhOVUxMLCAiaThrIiwgTlVMTCwKLQkJCQkJCQkgIGk4a19ncm91cHMpOworCWk4a19o d21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImRlbGwt c21tIiwKKwkJCQkJCQkgIE5VTEwsIGk4a19ncm91cHMpOwogCWlmIChJU19FUlIoaThrX2h3bW9u X2RldikpIHsKIAkJZXJyID0gUFRSX0VSUihpOGtfaHdtb25fZGV2KTsKIAkJaThrX2h3bW9uX2Rl diA9IE5VTEw7CkBAIC05NzYsMzMgKzEwMDMsMjQgQEAgc3RhdGljIGludCBfX2luaXQgaThrX3By b2JlKHZvaWQpCiAKIHN0YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0 IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKIAlpbnQgZXJyOwogCiAJLyogQXJlIHdlIHJ1bm5p bmcgb24gYW4gc3VwcG9ydGVkIGxhcHRvcD8gKi8KIAlpZiAoaThrX3Byb2JlKCkpCiAJCXJldHVy biAtRU5PREVWOwogCi0JLyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KLQlwcm9jX2k4ayA9 IHByb2NfY3JlYXRlKCJpOGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMpOwotCWlmICghcHJvY19pOGsp Ci0JCXJldHVybiAtRU5PRU5UOwotCiAJZXJyID0gaThrX2luaXRfaHdtb24oKTsKIAlpZiAoZXJy KQotCQlnb3RvIGV4aXRfcmVtb3ZlX3Byb2M7CisJCXJldHVybiBlcnI7CiAKKwlpOGtfaW5pdF9w cm9jZnMoKTsKIAlyZXR1cm4gMDsKLQotIGV4aXRfcmVtb3ZlX3Byb2M6Ci0JcmVtb3ZlX3Byb2Nf ZW50cnkoImk4ayIsIE5VTEwpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhp dCBpOGtfZXhpdCh2b2lkKQogewogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19od21vbl9k ZXYpOwotCXJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKKwlpOGtfZXhpdF9wcm9jZnMo KTsKIH0KIAogbW9kdWxlX2luaXQoaThrX2luaXQpOwotLSAKMS43LjEwLjQKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcg bGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár @ 2015-06-27 11:34 ` Gabriele Mazzotta -1 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 11:34 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors Hi Pali, I've just noticed an issue with this patch. See the comment here below. Gabriele On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/x86/Kconfig | 25 +++---- > drivers/hwmon/Kconfig | 11 +++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ > 4 files changed, 106 insertions(+), 82 deletions(-) > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 226d569..7b756b3 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -1055,24 +1055,19 @@ config TOSHIBA > Say N otherwise. > > config I8K > - tristate "Dell laptop support" > + tristate "Dell i8k legacy laptop support" > select HWMON > + select SENSORS_DELL_SMM > ---help--- > - This adds a driver to safely access the System Management Mode > - of the CPU on the Dell Inspiron 8000. The System Management Mode > - is used to read cpu temperature and cooling fan status and to > - control the fans on the I8K portables. > + This option enables legacy /proc/i8k userspace interface in hwmon > + dell-smm-hwmon driver. Character file /proc/i8k reports bios version, > + temperature and allows controlling fan speeds of Dell laptops via > + System Management Mode. For old Dell laptops (like Dell Inspiron 8000) > + it reports also power and hotkey status. For fan speed control is > + needed userspace package i8kutils. > > - This driver has been tested only on the Inspiron 8000 but it may > - also work with other Dell laptops. You can force loading on other > - models by passing the parameter `force=1' to the module. Use at > - your own risk. > - > - For information on utilities to make use of this driver see the > - I8K Linux utilities web site at: > - <http://people.debian.org/~dz/i8k/> > - > - Say Y if you intend to run this kernel on a Dell Inspiron 8000. > + Say Y if you intend to run this kernel on old Dell laptops or want to > + use userspace package i8kutils. > Say N otherwise. > > config X86_REBOOTFIXUPS > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig > index 25d9e72..714f92a 100644 > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -371,6 +371,17 @@ config SENSORS_DS1621 > This driver can also be built as a module. If so, the module > will be called ds1621. > > +config SENSORS_DELL_SMM > + tristate "Dell laptop SMM BIOS hwmon driver" > + depends on X86 && DMI > + help > + This hwmon driver adds support for reporting temperature of different > + sensors and controls the fans on Dell laptops via System Management > + Mode provided by Dell BIOS. > + > + When option I8K is also enabled this driver provides legacy /proc/i8k > + userspace interface for i8kutils package. > + > config SENSORS_DA9052_ADC > tristate "Dialog DA9052/DA9053 ADC" > depends on PMIC_DA9052 > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > index 51533ac..6cacd0f 100644 > --- a/drivers/hwmon/Makefile > +++ b/drivers/hwmon/Makefile > @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o > obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o > obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o > obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o > +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o > obj-$(CONFIG_SENSORS_DME1737) += dme1737.o > obj-$(CONFIG_SENSORS_DS620) += ds620.o > obj-$(CONFIG_SENSORS_DS1621) += ds1621.o > @@ -156,7 +157,6 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > -obj-$(CONFIG_I8K) += dell-smm-hwmon.o > > obj-$(CONFIG_PMBUS) += pmbus/ > > diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c > index 65d314b..2a80882 100644 > --- a/drivers/hwmon/dell-smm-hwmon.c > +++ b/drivers/hwmon/dell-smm-hwmon.c > @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; > > MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); > MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); > -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); > +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); > MODULE_LICENSE("GPL"); > MODULE_ALIAS("i8k"); > > @@ -93,6 +93,7 @@ static bool ignore_dmi; > module_param(ignore_dmi, bool, 0); > MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); > > +#if IS_ENABLED(CONFIG_I8K) > static bool restricted; > module_param(restricted, bool, 0); > MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > static bool power_status; > module_param(power_status, bool, 0600); > MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); > +#endif > > static uint fan_mult; > module_param(fan_mult, uint, 0); > @@ -109,18 +111,6 @@ static uint fan_max; > module_param(fan_max, uint, 0); > MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); > > -static int i8k_open_fs(struct inode *inode, struct file *file); > -static long i8k_ioctl(struct file *, unsigned int, unsigned long); > - > -static const struct file_operations i8k_fops = { > - .owner = THIS_MODULE, > - .open = i8k_open_fs, > - .read = seq_read, > - .llseek = seq_lseek, > - .release = single_release, > - .unlocked_ioctl = i8k_ioctl, > -}; > - > struct smm_regs { > unsigned int eax; > unsigned int ebx __packed; > @@ -221,45 +211,6 @@ out: > } > > /* > - * Read the Fn key status. > - */ > -static int i8k_get_fn_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > - case I8K_FN_UP: > - return I8K_VOL_UP; > - case I8K_FN_DOWN: > - return I8K_VOL_DOWN; > - case I8K_FN_MUTE: > - return I8K_VOL_MUTE; > - default: > - return 0; > - } > -} > - > -/* > - * Read the power status. > - */ > -static int i8k_get_power_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > -} > - > -/* > * Read the fan status. > */ > static int i8k_get_fan_status(int fan) > @@ -378,6 +329,51 @@ static int i8k_get_dell_signature(int req_fn) > return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; > } > > +#if IS_ENABLED(CONFIG_I8K) > + > +/* > + * Read the Fn key status. > + */ > +static int i8k_get_fn_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > + case I8K_FN_UP: > + return I8K_VOL_UP; > + case I8K_FN_DOWN: > + return I8K_VOL_DOWN; > + case I8K_FN_MUTE: > + return I8K_VOL_MUTE; > + default: > + return 0; > + } > +} > + > +/* > + * Read the power status. > + */ > +static int i8k_get_power_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > +} > + > +/* > + * Procfs interface > + */ > + > static int > i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) > { > @@ -528,6 +524,37 @@ static int i8k_open_fs(struct inode *inode, struct file *file) > return single_open(file, i8k_proc_show, NULL); > } > > +static const struct file_operations i8k_fops = { > + .owner = THIS_MODULE, > + .open = i8k_open_fs, > + .read = seq_read, > + .llseek = seq_lseek, > + .release = single_release, > + .unlocked_ioctl = i8k_ioctl, > +}; > + > +static void __init i8k_init_procfs(void) > +{ > + /* Register the proc entry */ > + proc_create("i8k", 0, NULL, &i8k_fops); > +} > + > +static void __exit i8k_exit_procfs(void) > +{ > + remove_proc_entry("i8k", NULL); > +} > + > +#else > + > +static inline void __init i8k_init_procfs(void) > +{ > +} > + > +static inline void __exit i8k_exit_procfs(void) > +{ > +} > + > +#endif > > /* > * Hwmon interface > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > if (err >= 0) > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, > - i8k_groups); > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell-smm", > + NULL, i8k_groups); dell-smm is not a valid name, see hwmon_device_register_with_groups() for more info (dash not allowed). Because of this, the driver can't be loaded. > if (IS_ERR(i8k_hwmon_dev)) { > err = PTR_ERR(i8k_hwmon_dev); > i8k_hwmon_dev = NULL; > @@ -976,33 +1003,24 @@ static int __init i8k_probe(void) > > static int __init i8k_init(void) > { > - struct proc_dir_entry *proc_i8k; > int err; > > /* Are we running on an supported laptop? */ > if (i8k_probe()) > return -ENODEV; > > - /* Register the proc entry */ > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > - if (!proc_i8k) > - return -ENOENT; > - > err = i8k_init_hwmon(); > if (err) > - goto exit_remove_proc; > + return err; > > + i8k_init_procfs(); > return 0; > - > - exit_remove_proc: > - remove_proc_entry("i8k", NULL); > - return err; > } > > static void __exit i8k_exit(void) > { > hwmon_device_unregister(i8k_hwmon_dev); > - remove_proc_entry("i8k", NULL); > + i8k_exit_procfs(); > } > > module_init(i8k_init); > ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-06-27 11:34 ` Gabriele Mazzotta 0 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 11:34 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors Hi Pali, I've just noticed an issue with this patch. See the comment here below. Gabriele On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/x86/Kconfig | 25 +++---- > drivers/hwmon/Kconfig | 11 +++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ > 4 files changed, 106 insertions(+), 82 deletions(-) > > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 226d569..7b756b3 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -1055,24 +1055,19 @@ config TOSHIBA > Say N otherwise. > > config I8K > - tristate "Dell laptop support" > + tristate "Dell i8k legacy laptop support" > select HWMON > + select SENSORS_DELL_SMM > ---help--- > - This adds a driver to safely access the System Management Mode > - of the CPU on the Dell Inspiron 8000. The System Management Mode > - is used to read cpu temperature and cooling fan status and to > - control the fans on the I8K portables. > + This option enables legacy /proc/i8k userspace interface in hwmon > + dell-smm-hwmon driver. Character file /proc/i8k reports bios version, > + temperature and allows controlling fan speeds of Dell laptops via > + System Management Mode. For old Dell laptops (like Dell Inspiron 8000) > + it reports also power and hotkey status. For fan speed control is > + needed userspace package i8kutils. > > - This driver has been tested only on the Inspiron 8000 but it may > - also work with other Dell laptops. You can force loading on other > - models by passing the parameter `force=1' to the module. Use at > - your own risk. > - > - For information on utilities to make use of this driver see the > - I8K Linux utilities web site at: > - <http://people.debian.org/~dz/i8k/> > - > - Say Y if you intend to run this kernel on a Dell Inspiron 8000. > + Say Y if you intend to run this kernel on old Dell laptops or want to > + use userspace package i8kutils. > Say N otherwise. > > config X86_REBOOTFIXUPS > diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig > index 25d9e72..714f92a 100644 > --- a/drivers/hwmon/Kconfig > +++ b/drivers/hwmon/Kconfig > @@ -371,6 +371,17 @@ config SENSORS_DS1621 > This driver can also be built as a module. If so, the module > will be called ds1621. > > +config SENSORS_DELL_SMM > + tristate "Dell laptop SMM BIOS hwmon driver" > + depends on X86 && DMI > + help > + This hwmon driver adds support for reporting temperature of different > + sensors and controls the fans on Dell laptops via System Management > + Mode provided by Dell BIOS. > + > + When option I8K is also enabled this driver provides legacy /proc/i8k > + userspace interface for i8kutils package. > + > config SENSORS_DA9052_ADC > tristate "Dialog DA9052/DA9053 ADC" > depends on PMIC_DA9052 > diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile > index 51533ac..6cacd0f 100644 > --- a/drivers/hwmon/Makefile > +++ b/drivers/hwmon/Makefile > @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o > obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o > obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o > obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o > +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o > obj-$(CONFIG_SENSORS_DME1737) += dme1737.o > obj-$(CONFIG_SENSORS_DS620) += ds620.o > obj-$(CONFIG_SENSORS_DS1621) += ds1621.o > @@ -156,7 +157,6 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o > obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o > obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o > obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o > -obj-$(CONFIG_I8K) += dell-smm-hwmon.o > > obj-$(CONFIG_PMBUS) += pmbus/ > > diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c > index 65d314b..2a80882 100644 > --- a/drivers/hwmon/dell-smm-hwmon.c > +++ b/drivers/hwmon/dell-smm-hwmon.c > @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; > > MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); > MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); > -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); > +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); > MODULE_LICENSE("GPL"); > MODULE_ALIAS("i8k"); > > @@ -93,6 +93,7 @@ static bool ignore_dmi; > module_param(ignore_dmi, bool, 0); > MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); > > +#if IS_ENABLED(CONFIG_I8K) > static bool restricted; > module_param(restricted, bool, 0); > MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); > static bool power_status; > module_param(power_status, bool, 0600); > MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); > +#endif > > static uint fan_mult; > module_param(fan_mult, uint, 0); > @@ -109,18 +111,6 @@ static uint fan_max; > module_param(fan_max, uint, 0); > MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); > > -static int i8k_open_fs(struct inode *inode, struct file *file); > -static long i8k_ioctl(struct file *, unsigned int, unsigned long); > - > -static const struct file_operations i8k_fops = { > - .owner = THIS_MODULE, > - .open = i8k_open_fs, > - .read = seq_read, > - .llseek = seq_lseek, > - .release = single_release, > - .unlocked_ioctl = i8k_ioctl, > -}; > - > struct smm_regs { > unsigned int eax; > unsigned int ebx __packed; > @@ -221,45 +211,6 @@ out: > } > > /* > - * Read the Fn key status. > - */ > -static int i8k_get_fn_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > - case I8K_FN_UP: > - return I8K_VOL_UP; > - case I8K_FN_DOWN: > - return I8K_VOL_DOWN; > - case I8K_FN_MUTE: > - return I8K_VOL_MUTE; > - default: > - return 0; > - } > -} > - > -/* > - * Read the power status. > - */ > -static int i8k_get_power_status(void) > -{ > - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > - int rc; > - > - rc = i8k_smm(®s); > - if (rc < 0) > - return rc; > - > - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > -} > - > -/* > * Read the fan status. > */ > static int i8k_get_fan_status(int fan) > @@ -378,6 +329,51 @@ static int i8k_get_dell_signature(int req_fn) > return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; > } > > +#if IS_ENABLED(CONFIG_I8K) > + > +/* > + * Read the Fn key status. > + */ > +static int i8k_get_fn_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { > + case I8K_FN_UP: > + return I8K_VOL_UP; > + case I8K_FN_DOWN: > + return I8K_VOL_DOWN; > + case I8K_FN_MUTE: > + return I8K_VOL_MUTE; > + default: > + return 0; > + } > +} > + > +/* > + * Read the power status. > + */ > +static int i8k_get_power_status(void) > +{ > + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; > + int rc; > + > + rc = i8k_smm(®s); > + if (rc < 0) > + return rc; > + > + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; > +} > + > +/* > + * Procfs interface > + */ > + > static int > i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) > { > @@ -528,6 +524,37 @@ static int i8k_open_fs(struct inode *inode, struct file *file) > return single_open(file, i8k_proc_show, NULL); > } > > +static const struct file_operations i8k_fops = { > + .owner = THIS_MODULE, > + .open = i8k_open_fs, > + .read = seq_read, > + .llseek = seq_lseek, > + .release = single_release, > + .unlocked_ioctl = i8k_ioctl, > +}; > + > +static void __init i8k_init_procfs(void) > +{ > + /* Register the proc entry */ > + proc_create("i8k", 0, NULL, &i8k_fops); > +} > + > +static void __exit i8k_exit_procfs(void) > +{ > + remove_proc_entry("i8k", NULL); > +} > + > +#else > + > +static inline void __init i8k_init_procfs(void) > +{ > +} > + > +static inline void __exit i8k_exit_procfs(void) > +{ > +} > + > +#endif > > /* > * Hwmon interface > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > if (err >= 0) > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, > - i8k_groups); > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell-smm", > + NULL, i8k_groups); dell-smm is not a valid name, see hwmon_device_register_with_groups() for more info (dash not allowed). Because of this, the driver can't be loaded. > if (IS_ERR(i8k_hwmon_dev)) { > err = PTR_ERR(i8k_hwmon_dev); > i8k_hwmon_dev = NULL; > @@ -976,33 +1003,24 @@ static int __init i8k_probe(void) > > static int __init i8k_init(void) > { > - struct proc_dir_entry *proc_i8k; > int err; > > /* Are we running on an supported laptop? */ > if (i8k_probe()) > return -ENODEV; > > - /* Register the proc entry */ > - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); > - if (!proc_i8k) > - return -ENOENT; > - > err = i8k_init_hwmon(); > if (err) > - goto exit_remove_proc; > + return err; > > + i8k_init_procfs(); > return 0; > - > - exit_remove_proc: > - remove_proc_entry("i8k", NULL); > - return err; > } > > static void __exit i8k_exit(void) > { > hwmon_device_unregister(i8k_hwmon_dev); > - remove_proc_entry("i8k", NULL); > + i8k_exit_procfs(); > } > > module_init(i8k_init); > _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-06-27 11:34 ` [lm-sensors] " Gabriele Mazzotta @ 2015-06-27 12:47 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-06-27 12:47 UTC (permalink / raw) To: Gabriele Mazzotta Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 1084 bytes --] On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > Hi Pali, > > I've just noticed an issue with this patch. See the comment here > below. > > Gabriele > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > if (err >= 0) > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", > > NULL, - i8k_groups); > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > "dell-smm", + NULL, i8k_groups); > > dell-smm is not a valid name, see hwmon_device_register_with_groups() > for more info (dash not allowed). Because of this, the driver can't > be loaded. > How it is possible? It worked fine on my tested dell machine... And now I see, I probably tested this change with older kernel version (ubuntu/3.13) which did not have that check for invalid characters... Renaming dell-smm to dell_smm should fix this problem, right? -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-06-27 12:47 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-06-27 12:47 UTC (permalink / raw) To: Gabriele Mazzotta Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 1084 bytes --] On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > Hi Pali, > > I've just noticed an issue with this patch. See the comment here > below. > > Gabriele > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > if (err >= 0) > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", > > NULL, - i8k_groups); > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > "dell-smm", + NULL, i8k_groups); > > dell-smm is not a valid name, see hwmon_device_register_with_groups() > for more info (dash not allowed). Because of this, the driver can't > be loaded. > How it is possible? It worked fine on my tested dell machine... And now I see, I probably tested this change with older kernel version (ubuntu/3.13) which did not have that check for invalid characters... Renaming dell-smm to dell_smm should fix this problem, right? -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-06-27 12:47 ` [lm-sensors] " Pali Rohár @ 2015-06-27 12:55 ` Gabriele Mazzotta -1 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 12:55 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > Hi Pali, > > > > I've just noticed an issue with this patch. See the comment here > > below. > > > > Gabriele > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > if (err >= 0) > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", > > > NULL, - i8k_groups); > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > "dell-smm", + NULL, i8k_groups); > > > > dell-smm is not a valid name, see hwmon_device_register_with_groups() > > for more info (dash not allowed). Because of this, the driver can't > > be loaded. > > > > How it is possible? It worked fine on my tested dell machine... > > And now I see, I probably tested this change with older kernel version > (ubuntu/3.13) which did not have that check for invalid characters... > > Renaming dell-smm to dell_smm should fix this problem, right? Yes, everything works just fine with the underscore. ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-06-27 12:55 ` Gabriele Mazzotta 0 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 12:55 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > Hi Pali, > > > > I've just noticed an issue with this patch. See the comment here > > below. > > > > Gabriele > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > if (err >= 0) > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", > > > NULL, - i8k_groups); > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > "dell-smm", + NULL, i8k_groups); > > > > dell-smm is not a valid name, see hwmon_device_register_with_groups() > > for more info (dash not allowed). Because of this, the driver can't > > be loaded. > > > > How it is possible? It worked fine on my tested dell machine... > > And now I see, I probably tested this change with older kernel version > (ubuntu/3.13) which did not have that check for invalid characters... > > Renaming dell-smm to dell_smm should fix this problem, right? Yes, everything works just fine with the underscore. _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-06-27 12:55 ` [lm-sensors] " Gabriele Mazzotta @ 2015-06-27 13:01 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-06-27 13:01 UTC (permalink / raw) To: Gabriele Mazzotta Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 1427 bytes --] On Saturday 27 June 2015 14:55:40 Gabriele Mazzotta wrote: > On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > > Hi Pali, > > > > > > I've just noticed an issue with this patch. See the comment here > > > below. > > > > > > Gabriele > > > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > > > if (err >= 0) > > > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > "i8k", NULL, - i8k_groups); > > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > "dell-smm", + NULL, i8k_groups); > > > > > > dell-smm is not a valid name, see > > > hwmon_device_register_with_groups() for more info (dash not > > > allowed). Because of this, the driver can't be loaded. > > > > How it is possible? It worked fine on my tested dell machine... > > > > And now I see, I probably tested this change with older kernel > > version (ubuntu/3.13) which did not have that check for invalid > > characters... > > > > Renaming dell-smm to dell_smm should fix this problem, right? > > Yes, everything works just fine with the underscore. Ok, will you send patch for this small fix? -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-06-27 13:01 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-06-27 13:01 UTC (permalink / raw) To: Gabriele Mazzotta Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 1427 bytes --] On Saturday 27 June 2015 14:55:40 Gabriele Mazzotta wrote: > On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > > Hi Pali, > > > > > > I've just noticed an issue with this patch. See the comment here > > > below. > > > > > > Gabriele > > > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > > > if (err >= 0) > > > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > "i8k", NULL, - i8k_groups); > > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > "dell-smm", + NULL, i8k_groups); > > > > > > dell-smm is not a valid name, see > > > hwmon_device_register_with_groups() for more info (dash not > > > allowed). Because of this, the driver can't be loaded. > > > > How it is possible? It worked fine on my tested dell machine... > > > > And now I see, I probably tested this change with older kernel > > version (ubuntu/3.13) which did not have that check for invalid > > characters... > > > > Renaming dell-smm to dell_smm should fix this problem, right? > > Yes, everything works just fine with the underscore. Ok, will you send patch for this small fix? -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-06-27 13:01 ` [lm-sensors] " Pali Rohár @ 2015-06-27 13:21 ` Gabriele Mazzotta -1 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 13:21 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors On Saturday 27 June 2015 15:01:34 Pali Rohár wrote: > On Saturday 27 June 2015 14:55:40 Gabriele Mazzotta wrote: > > On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > > > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > > > Hi Pali, > > > > > > > > I've just noticed an issue with this patch. See the comment here > > > > below. > > > > > > > > Gabriele > > > > > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > > > > > if (err >= 0) > > > > > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > > "i8k", NULL, - i8k_groups); > > > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > > "dell-smm", + NULL, i8k_groups); > > > > > > > > dell-smm is not a valid name, see > > > > hwmon_device_register_with_groups() for more info (dash not > > > > allowed). Because of this, the driver can't be loaded. > > > > > > How it is possible? It worked fine on my tested dell machine... > > > > > > And now I see, I probably tested this change with older kernel > > > version (ubuntu/3.13) which did not have that check for invalid > > > characters... > > > > > > Renaming dell-smm to dell_smm should fix this problem, right? > > > > Yes, everything works just fine with the underscore. > > Ok, will you send patch for this small fix? OK, I'll do it shortly. ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-06-27 13:21 ` Gabriele Mazzotta 0 siblings, 0 replies; 86+ messages in thread From: Gabriele Mazzotta @ 2015-06-27 13:21 UTC (permalink / raw) To: Pali Rohár Cc: Greg Kroah-Hartman, Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, linux-kernel, lm-sensors On Saturday 27 June 2015 15:01:34 Pali Rohár wrote: > On Saturday 27 June 2015 14:55:40 Gabriele Mazzotta wrote: > > On Saturday 27 June 2015 14:47:16 Pali Rohár wrote: > > > On Saturday 27 June 2015 13:34:30 Gabriele Mazzotta wrote: > > > > Hi Pali, > > > > > > > > I've just noticed an issue with this patch. See the comment here > > > > below. > > > > > > > > Gabriele > > > > > > > > On Wednesday 29 April 2015 13:41:26 Pali Rohár wrote: > > > > > @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) > > > > > > > > > > if (err >= 0) > > > > > > > > > > i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; > > > > > > > > > > - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > > "i8k", NULL, - i8k_groups); > > > > > + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, > > > > > "dell-smm", + NULL, i8k_groups); > > > > > > > > dell-smm is not a valid name, see > > > > hwmon_device_register_with_groups() for more info (dash not > > > > allowed). Because of this, the driver can't be loaded. > > > > > > How it is possible? It worked fine on my tested dell machine... > > > > > > And now I see, I probably tested this change with older kernel > > > version (ubuntu/3.13) which did not have that check for invalid > > > characters... > > > > > > Renaming dell-smm to dell_smm should fix this problem, right? > > > > Yes, everything works just fine with the underscore. > > Ok, will you send patch for this small fix? OK, I'll do it shortly. _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár @ 2015-04-29 12:07 ` Greg Kroah-Hartman -1 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-29 12:07 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Wed, Apr 29, 2015 at 01:41:25PM +0200, Pali Rohár wrote: > This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is > better name then abbreviation i8k. For backward compatibility is added macro > MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K > compile option was not changed. > > This commit also adds me as maintainer of this new dell-smm-hwmon driver and > remove Guenter Roeck from list who is implicit maintainer all hwmon drivers. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > MAINTAINERS | 4 +- > drivers/char/Makefile | 1 - > drivers/char/i8k.c | 1007 --------------------------------------- > drivers/hwmon/Makefile | 1 + > drivers/hwmon/dell-smm-hwmon.c | 1009 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 1012 insertions(+), 1010 deletions(-) > delete mode 100644 drivers/char/i8k.c > create mode 100644 drivers/hwmon/dell-smm-hwmon.c In the future, please create patches with -M to show the file is moved, which makes it much easier to review. thanks, greg k-h ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-04-29 12:07 ` Greg Kroah-Hartman 0 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-29 12:07 UTC (permalink / raw) To: Pali Rohár Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Wed, Apr 29, 2015 at 01:41:25PM +0200, Pali Rohár wrote: > This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is > better name then abbreviation i8k. For backward compatibility is added macro > MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K > compile option was not changed. > > This commit also adds me as maintainer of this new dell-smm-hwmon driver and > remove Guenter Roeck from list who is implicit maintainer all hwmon drivers. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > MAINTAINERS | 4 +- > drivers/char/Makefile | 1 - > drivers/char/i8k.c | 1007 --------------------------------------- > drivers/hwmon/Makefile | 1 + > drivers/hwmon/dell-smm-hwmon.c | 1009 ++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 1012 insertions(+), 1010 deletions(-) > delete mode 100644 drivers/char/i8k.c > create mode 100644 drivers/hwmon/dell-smm-hwmon.c In the future, please create patches with -M to show the file is moved, which makes it much easier to review. thanks, greg k-h _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár @ 2015-03-31 3:32 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-31 3:32 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 03/29/2015 05:57 AM, Pali Rohár wrote: > This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > and allows to compile hwmon driver without /proc/i8k file. > > Pali Rohár (2): > hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > MAINTAINERS | 4 +- > arch/x86/Kconfig | 25 +- > drivers/char/Makefile | 1 - > drivers/char/i8k.c | 1005 --------------------------------------- > drivers/hwmon/Kconfig | 11 + > drivers/hwmon/Makefile | 1 + > drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > 7 files changed, 1049 insertions(+), 1023 deletions(-) > delete mode 100644 drivers/char/i8k.c > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > I am ok with the series and would take it for 4.1 if Greg agrees. Greg, any comments ? Thanks, Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-03-31 3:32 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-03-31 3:32 UTC (permalink / raw) To: Pali Rohár, Arnd Bergmann, Greg Kroah-Hartman, Jean Delvare Cc: Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDMvMjkvMjAxNSAwNTo1NyBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gVGhpcyBwYXRjaCBz ZXJpZXMgbW92ZXMgZHJpdmVycy9jaGFyL2k4ay5jIHRvIGRyaXZlcnMvaHdtb24vZGVsbC1zbW0t aHdtb24uYwo+IGFuZCBhbGxvd3MgdG8gY29tcGlsZSBod21vbiBkcml2ZXIgd2l0aG91dCAvcHJv Yy9pOGsgZmlsZS4KPgo+IFBhbGkgUm9ow6FyICgyKToKPiAgICBod21vbjogUmVuYW1lIGk4ayBk cml2ZXIgdG8gZGVsbC1zbW0taHdtb24gYW5kIG1vdmUgaXQgdG8gaHdtb24gdHJlZQo+ICAgIGh3 bW9uOiBBbGxvdyB0byBjb21waWxlIGRlbGwtc21tLWh3bW9uIGRyaXZlciB3aXRob3V0IC9wcm9j L2k4awo+Cj4gICBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICA0ICstCj4gICBh cmNoL3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgfCAgIDI1ICstCj4gICBkcml2ZXJzL2NoYXIv TWFrZWZpbGUgICAgICAgICAgfCAgICAxIC0KPiAgIGRyaXZlcnMvY2hhci9pOGsuYyAgICAgICAg ICAgICB8IDEwMDUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gICBk cml2ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgfCAgIDExICsKPiAgIGRyaXZlcnMvaHdtb24v TWFrZWZpbGUgICAgICAgICB8ICAgIDEgKwo+ICAgZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21v bi5jIHwgMTAyNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gICA3 IGZpbGVzIGNoYW5nZWQsIDEwNDkgaW5zZXJ0aW9ucygrKSwgMTAyMyBkZWxldGlvbnMoLSkKPiAg IGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2NoYXIvaThrLmMKPiAgIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKPgpJIGFtIG9rIHdpdGggdGhlIHNl cmllcyBhbmQgd291bGQgdGFrZSBpdCBmb3IgNC4xIGlmIEdyZWcgYWdyZWVzLgoKR3JlZywgYW55 IGNvbW1lbnRzID8KClRoYW5rcywKR3VlbnRlcgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNA bG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGlu Zm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-03-31 3:32 ` [lm-sensors] " Guenter Roeck @ 2015-03-31 13:56 ` Greg Kroah-Hartman -1 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-03-31 13:56 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > On 03/29/2015 05:57 AM, Pali Rohár wrote: > >This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > >and allows to compile hwmon driver without /proc/i8k file. > > > >Pali Rohár (2): > > hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > > MAINTAINERS | 4 +- > > arch/x86/Kconfig | 25 +- > > drivers/char/Makefile | 1 - > > drivers/char/i8k.c | 1005 --------------------------------------- > > drivers/hwmon/Kconfig | 11 + > > drivers/hwmon/Makefile | 1 + > > drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > 7 files changed, 1049 insertions(+), 1023 deletions(-) > > delete mode 100644 drivers/char/i8k.c > > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > I am ok with the series and would take it for 4.1 if Greg agrees. > > Greg, any comments ? Let me review it, it's in my queue... ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-03-31 13:56 ` Greg Kroah-Hartman 0 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-03-31 13:56 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > On 03/29/2015 05:57 AM, Pali Rohár wrote: > >This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > >and allows to compile hwmon driver without /proc/i8k file. > > > >Pali Rohár (2): > > hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > > MAINTAINERS | 4 +- > > arch/x86/Kconfig | 25 +- > > drivers/char/Makefile | 1 - > > drivers/char/i8k.c | 1005 --------------------------------------- > > drivers/hwmon/Kconfig | 11 + > > drivers/hwmon/Makefile | 1 + > > drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > 7 files changed, 1049 insertions(+), 1023 deletions(-) > > delete mode 100644 drivers/char/i8k.c > > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > I am ok with the series and would take it for 4.1 if Greg agrees. > > Greg, any comments ? Let me review it, it's in my queue... _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-03-31 13:56 ` [lm-sensors] " Greg Kroah-Hartman @ 2015-04-09 14:02 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-09 14:02 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > On 03/29/2015 05:57 AM, Pali Rohár wrote: > > >This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > >and allows to compile hwmon driver without /proc/i8k file. > > > > > >Pali Rohár (2): > > > hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > > hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > > > > MAINTAINERS | 4 +- > > > arch/x86/Kconfig | 25 +- > > > drivers/char/Makefile | 1 - > > > drivers/char/i8k.c | 1005 --------------------------------------- > > > drivers/hwmon/Kconfig | 11 + > > > drivers/hwmon/Makefile | 1 + > > > drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > > 7 files changed, 1049 insertions(+), 1023 deletions(-) > > > delete mode 100644 drivers/char/i8k.c > > > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > > > I am ok with the series and would take it for 4.1 if Greg agrees. > > > > Greg, any comments ? > > Let me review it, it's in my queue... Hi Greg! Have you looked at it? -- Pali Rohár pali.rohar@gmail.com ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-09 14:02 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-09 14:02 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gVHVlc2RheSAzMSBNYXJjaCAyMDE1IDE1OjU2OjAxIEdyZWcgS3JvYWgtSGFydG1hbiB3cm90 ZToKPiBPbiBNb24sIE1hciAzMCwgMjAxNSBhdCAwODozMjozNlBNIC0wNzAwLCBHdWVudGVyIFJv ZWNrIHdyb3RlOgo+ID4gT24gMDMvMjkvMjAxNSAwNTo1NyBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6 Cj4gPiA+VGhpcyBwYXRjaCBzZXJpZXMgbW92ZXMgZHJpdmVycy9jaGFyL2k4ay5jIHRvIGRyaXZl cnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwo+ID4gPmFuZCBhbGxvd3MgdG8gY29tcGlsZSBod21v biBkcml2ZXIgd2l0aG91dCAvcHJvYy9pOGsgZmlsZS4KPiA+ID4KPiA+ID5QYWxpIFJvaMOhciAo Mik6Cj4gPiA+ICAgaHdtb246IFJlbmFtZSBpOGsgZHJpdmVyIHRvIGRlbGwtc21tLWh3bW9uIGFu ZCBtb3ZlIGl0IHRvIGh3bW9uIHRyZWUKPiA+ID4gICBod21vbjogQWxsb3cgdG8gY29tcGlsZSBk ZWxsLXNtbS1od21vbiBkcml2ZXIgd2l0aG91dCAvcHJvYy9pOGsKPiA+ID4KPiA+ID4gIE1BSU5U QUlORVJTICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KPiA+ID4gIGFyY2gveDg2L0tjb25m aWcgICAgICAgICAgICAgICB8ICAgMjUgKy0KPiA+ID4gIGRyaXZlcnMvY2hhci9NYWtlZmlsZSAg ICAgICAgICB8ICAgIDEgLQo+ID4gPiAgZHJpdmVycy9jaGFyL2k4ay5jICAgICAgICAgICAgIHwg MTAwNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ID4gIGRyaXZl cnMvaHdtb24vS2NvbmZpZyAgICAgICAgICB8ICAgMTEgKwo+ID4gPiAgZHJpdmVycy9od21vbi9N YWtlZmlsZSAgICAgICAgIHwgICAgMSArCj4gPiA+ICBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3 bW9uLmMgfCAxMDI1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiA+ ID4gIDcgZmlsZXMgY2hhbmdlZCwgMTA0OSBpbnNlcnRpb25zKCspLCAxMDIzIGRlbGV0aW9ucygt KQo+ID4gPiAgZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvY2hhci9pOGsuYwo+ID4gPiAgY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwo+ID4gPgo+ID4g SSBhbSBvayB3aXRoIHRoZSBzZXJpZXMgYW5kIHdvdWxkIHRha2UgaXQgZm9yIDQuMSBpZiBHcmVn IGFncmVlcy4KPiA+IAo+ID4gR3JlZywgYW55IGNvbW1lbnRzID8KPiAKPiBMZXQgbWUgcmV2aWV3 IGl0LCBpdCdzIGluIG15IHF1ZXVlLi4uCgpIaSBHcmVnISBIYXZlIHlvdSBsb29rZWQgYXQgaXQ/ CgotLSAKUGFsaSBSb2jDoXIKcGFsaS5yb2hhckBnbWFpbC5jb20KCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0Cmxt LXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxt YW4vbGlzdGluZm8vbG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-09 14:02 ` [lm-sensors] " Pali Rohár @ 2015-04-21 13:30 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-21 13:30 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > > On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > > On 03/29/2015 05:57 AM, Pali Rohár wrote: > > > >This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > > >and allows to compile hwmon driver without /proc/i8k file. > > > > > > > >Pali Rohár (2): > > > > hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > > > hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > > > > > > MAINTAINERS | 4 +- > > > > arch/x86/Kconfig | 25 +- > > > > drivers/char/Makefile | 1 - > > > > drivers/char/i8k.c | 1005 --------------------------------------- > > > > drivers/hwmon/Kconfig | 11 + > > > > drivers/hwmon/Makefile | 1 + > > > > drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > > > 7 files changed, 1049 insertions(+), 1023 deletions(-) > > > > delete mode 100644 drivers/char/i8k.c > > > > create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > > > > > I am ok with the series and would take it for 4.1 if Greg agrees. > > > > > > Greg, any comments ? > > > > Let me review it, it's in my queue... > > Hi Greg! Have you looked at it? > Greg & Guenter: ping. Will you include it into 4.1? -- Pali Rohár pali.rohar@gmail.com ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-21 13:30 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-21 13:30 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gVGh1cnNkYXkgMDkgQXByaWwgMjAxNSAxNjowMjoyNCBQYWxpIFJvaMOhciB3cm90ZToKPiBP biBUdWVzZGF5IDMxIE1hcmNoIDIwMTUgMTU6NTY6MDEgR3JlZyBLcm9haC1IYXJ0bWFuIHdyb3Rl Ogo+ID4gT24gTW9uLCBNYXIgMzAsIDIwMTUgYXQgMDg6MzI6MzZQTSAtMDcwMCwgR3VlbnRlciBS b2VjayB3cm90ZToKPiA+ID4gT24gMDMvMjkvMjAxNSAwNTo1NyBBTSwgUGFsaSBSb2jDoXIgd3Jv dGU6Cj4gPiA+ID5UaGlzIHBhdGNoIHNlcmllcyBtb3ZlcyBkcml2ZXJzL2NoYXIvaThrLmMgdG8g ZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCj4gPiA+ID5hbmQgYWxsb3dzIHRvIGNvbXBp bGUgaHdtb24gZHJpdmVyIHdpdGhvdXQgL3Byb2MvaThrIGZpbGUuCj4gPiA+ID4KPiA+ID4gPlBh bGkgUm9ow6FyICgyKToKPiA+ID4gPiAgIGh3bW9uOiBSZW5hbWUgaThrIGRyaXZlciB0byBkZWxs LXNtbS1od21vbiBhbmQgbW92ZSBpdCB0byBod21vbiB0cmVlCj4gPiA+ID4gICBod21vbjogQWxs b3cgdG8gY29tcGlsZSBkZWxsLXNtbS1od21vbiBkcml2ZXIgd2l0aG91dCAvcHJvYy9pOGsKPiA+ ID4gPgo+ID4gPiA+ICBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICA0ICstCj4g PiA+ID4gIGFyY2gveDg2L0tjb25maWcgICAgICAgICAgICAgICB8ICAgMjUgKy0KPiA+ID4gPiAg ZHJpdmVycy9jaGFyL01ha2VmaWxlICAgICAgICAgIHwgICAgMSAtCj4gPiA+ID4gIGRyaXZlcnMv Y2hhci9pOGsuYyAgICAgICAgICAgICB8IDEwMDUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCj4gPiA+ID4gIGRyaXZlcnMvaHdtb24vS2NvbmZpZyAgICAgICAgICB8ICAg MTEgKwo+ID4gPiA+ICBkcml2ZXJzL2h3bW9uL01ha2VmaWxlICAgICAgICAgfCAgICAxICsKPiA+ ID4gPiAgZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgMTAyNSArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiA+ID4gIDcgZmlsZXMgY2hhbmdlZCwgMTA0 OSBpbnNlcnRpb25zKCspLCAxMDIzIGRlbGV0aW9ucygtKQo+ID4gPiA+ICBkZWxldGUgbW9kZSAx MDA2NDQgZHJpdmVycy9jaGFyL2k4ay5jCj4gPiA+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKPiA+ID4gPgo+ID4gPiBJIGFtIG9rIHdpdGggdGhl IHNlcmllcyBhbmQgd291bGQgdGFrZSBpdCBmb3IgNC4xIGlmIEdyZWcgYWdyZWVzLgo+ID4gPiAK PiA+ID4gR3JlZywgYW55IGNvbW1lbnRzID8KPiA+IAo+ID4gTGV0IG1lIHJldmlldyBpdCwgaXQn cyBpbiBteSBxdWV1ZS4uLgo+IAo+IEhpIEdyZWchIEhhdmUgeW91IGxvb2tlZCBhdCBpdD8KPiAK CkdyZWcgJiBHdWVudGVyOiBwaW5nLiBXaWxsIHlvdSBpbmNsdWRlIGl0IGludG8gNC4xPwoKLS0g ClBhbGkgUm9ow6FyCnBhbGkucm9oYXJAZ21haWwuY29tCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5z b3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-21 13:30 ` [lm-sensors] " Pali Rohár @ 2015-04-21 13:40 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-04-21 13:40 UTC (permalink / raw) To: Pali Rohár, Greg Kroah-Hartman Cc: Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On 04/21/2015 06:30 AM, Pali Rohár wrote: > On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: >> On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: >>> On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: >>>> On 03/29/2015 05:57 AM, Pali Rohár wrote: >>>>> This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c >>>>> and allows to compile hwmon driver without /proc/i8k file. >>>>> >>>>> Pali Rohár (2): >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k >>>>> >>>>> MAINTAINERS | 4 +- >>>>> arch/x86/Kconfig | 25 +- >>>>> drivers/char/Makefile | 1 - >>>>> drivers/char/i8k.c | 1005 --------------------------------------- >>>>> drivers/hwmon/Kconfig | 11 + >>>>> drivers/hwmon/Makefile | 1 + >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) >>>>> delete mode 100644 drivers/char/i8k.c >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c >>>>> >>>> I am ok with the series and would take it for 4.1 if Greg agrees. >>>> >>>> Greg, any comments ? >>> >>> Let me review it, it's in my queue... >> >> Hi Greg! Have you looked at it? >> > > Greg & Guenter: ping. Will you include it into 4.1? > I don't see it in Greg's pull request, so presumably no (unless I missed it). Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-21 13:40 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-04-21 13:40 UTC (permalink / raw) To: Pali Rohár, Greg Kroah-Hartman Cc: Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors T24gMDQvMjEvMjAxNSAwNjozMCBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gT24gVGh1cnNkYXkg MDkgQXByaWwgMjAxNSAxNjowMjoyNCBQYWxpIFJvaMOhciB3cm90ZToKPj4gT24gVHVlc2RheSAz MSBNYXJjaCAyMDE1IDE1OjU2OjAxIEdyZWcgS3JvYWgtSGFydG1hbiB3cm90ZToKPj4+IE9uIE1v biwgTWFyIDMwLCAyMDE1IGF0IDA4OjMyOjM2UE0gLTA3MDAsIEd1ZW50ZXIgUm9lY2sgd3JvdGU6 Cj4+Pj4gT24gMDMvMjkvMjAxNSAwNTo1NyBBTSwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4+Pj4+IFRo aXMgcGF0Y2ggc2VyaWVzIG1vdmVzIGRyaXZlcnMvY2hhci9pOGsuYyB0byBkcml2ZXJzL2h3bW9u L2RlbGwtc21tLWh3bW9uLmMKPj4+Pj4gYW5kIGFsbG93cyB0byBjb21waWxlIGh3bW9uIGRyaXZl ciB3aXRob3V0IC9wcm9jL2k4ayBmaWxlLgo+Pj4+Pgo+Pj4+PiBQYWxpIFJvaMOhciAoMik6Cj4+ Pj4+ICAgIGh3bW9uOiBSZW5hbWUgaThrIGRyaXZlciB0byBkZWxsLXNtbS1od21vbiBhbmQgbW92 ZSBpdCB0byBod21vbiB0cmVlCj4+Pj4+ICAgIGh3bW9uOiBBbGxvdyB0byBjb21waWxlIGRlbGwt c21tLWh3bW9uIGRyaXZlciB3aXRob3V0IC9wcm9jL2k4awo+Pj4+Pgo+Pj4+PiAgIE1BSU5UQUlO RVJTICAgICAgICAgICAgICAgICAgICB8ICAgIDQgKy0KPj4+Pj4gICBhcmNoL3g4Ni9LY29uZmln ICAgICAgICAgICAgICAgfCAgIDI1ICstCj4+Pj4+ICAgZHJpdmVycy9jaGFyL01ha2VmaWxlICAg ICAgICAgIHwgICAgMSAtCj4+Pj4+ICAgZHJpdmVycy9jaGFyL2k4ay5jICAgICAgICAgICAgIHwg MTAwNSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+Pj4gICBkcml2 ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAgfCAgIDExICsKPj4+Pj4gICBkcml2ZXJzL2h3bW9u L01ha2VmaWxlICAgICAgICAgfCAgICAxICsKPj4+Pj4gICBkcml2ZXJzL2h3bW9uL2RlbGwtc21t LWh3bW9uLmMgfCAxMDI1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK Pj4+Pj4gICA3IGZpbGVzIGNoYW5nZWQsIDEwNDkgaW5zZXJ0aW9ucygrKSwgMTAyMyBkZWxldGlv bnMoLSkKPj4+Pj4gICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9jaGFyL2k4ay5jCj4+Pj4+ ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwo+Pj4+ Pgo+Pj4+IEkgYW0gb2sgd2l0aCB0aGUgc2VyaWVzIGFuZCB3b3VsZCB0YWtlIGl0IGZvciA0LjEg aWYgR3JlZyBhZ3JlZXMuCj4+Pj4KPj4+PiBHcmVnLCBhbnkgY29tbWVudHMgPwo+Pj4KPj4+IExl dCBtZSByZXZpZXcgaXQsIGl0J3MgaW4gbXkgcXVldWUuLi4KPj4KPj4gSGkgR3JlZyEgSGF2ZSB5 b3UgbG9va2VkIGF0IGl0Pwo+Pgo+Cj4gR3JlZyAmIEd1ZW50ZXI6IHBpbmcuIFdpbGwgeW91IGlu Y2x1ZGUgaXQgaW50byA0LjE/Cj4KSSBkb24ndCBzZWUgaXQgaW4gR3JlZydzIHB1bGwgcmVxdWVz dCwgc28gcHJlc3VtYWJseSBubyAodW5sZXNzIEkgbWlzc2VkIGl0KS4KCkd1ZW50ZXIKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1h aWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5z b3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-21 13:40 ` [lm-sensors] " Guenter Roeck @ 2015-04-21 13:52 ` Greg Kroah-Hartman -1 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-21 13:52 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > On 04/21/2015 06:30 AM, Pali Rohár wrote: > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > >>>>>and allows to compile hwmon driver without /proc/i8k file. > >>>>> > >>>>>Pali Rohár (2): > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > >>>>> > >>>>> MAINTAINERS | 4 +- > >>>>> arch/x86/Kconfig | 25 +- > >>>>> drivers/char/Makefile | 1 - > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > >>>>> drivers/hwmon/Kconfig | 11 + > >>>>> drivers/hwmon/Makefile | 1 + > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > >>>>> delete mode 100644 drivers/char/i8k.c > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > >>>>> > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > >>>> > >>>>Greg, any comments ? > >>> > >>>Let me review it, it's in my queue... > >> > >>Hi Greg! Have you looked at it? > >> > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). No, I missed it for this rc cycle, sorry. If you want to include it in yours, by all means please do so. thanks, greg k-h ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-21 13:52 ` Greg Kroah-Hartman 0 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-21 13:52 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > On 04/21/2015 06:30 AM, Pali Rohár wrote: > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > >>>>>and allows to compile hwmon driver without /proc/i8k file. > >>>>> > >>>>>Pali Rohár (2): > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > >>>>> > >>>>> MAINTAINERS | 4 +- > >>>>> arch/x86/Kconfig | 25 +- > >>>>> drivers/char/Makefile | 1 - > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > >>>>> drivers/hwmon/Kconfig | 11 + > >>>>> drivers/hwmon/Makefile | 1 + > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > >>>>> delete mode 100644 drivers/char/i8k.c > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > >>>>> > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > >>>> > >>>>Greg, any comments ? > >>> > >>>Let me review it, it's in my queue... > >> > >>Hi Greg! Have you looked at it? > >> > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). No, I missed it for this rc cycle, sorry. If you want to include it in yours, by all means please do so. thanks, greg k-h _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-21 13:52 ` [lm-sensors] " Greg Kroah-Hartman @ 2015-04-21 15:24 ` Guenter Roeck -1 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-04-21 15:24 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman wrote: > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > >>>>>and allows to compile hwmon driver without /proc/i8k file. > > >>>>> > > >>>>>Pali Rohár (2): > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > >>>>> > > >>>>> MAINTAINERS | 4 +- > > >>>>> arch/x86/Kconfig | 25 +- > > >>>>> drivers/char/Makefile | 1 - > > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > > >>>>> drivers/hwmon/Kconfig | 11 + > > >>>>> drivers/hwmon/Makefile | 1 + > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > > >>>>> delete mode 100644 drivers/char/i8k.c > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > >>>>> > > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > > >>>> > > >>>>Greg, any comments ? > > >>> > > >>>Let me review it, it's in my queue... > > >> > > >>Hi Greg! Have you looked at it? > > >> > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). > > No, I missed it for this rc cycle, sorry. If you want to include it in > yours, by all means please do so. > Too late; I sent my pull request early last week. Also, since I don't have the patch in my queue, it would not follow my own process, and I really dislike doing that. Guenter ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-21 15:24 ` Guenter Roeck 0 siblings, 0 replies; 86+ messages in thread From: Guenter Roeck @ 2015-04-21 15:24 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman wrote: > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > >>>>>and allows to compile hwmon driver without /proc/i8k file. > > >>>>> > > >>>>>Pali Rohár (2): > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > >>>>> > > >>>>> MAINTAINERS | 4 +- > > >>>>> arch/x86/Kconfig | 25 +- > > >>>>> drivers/char/Makefile | 1 - > > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > > >>>>> drivers/hwmon/Kconfig | 11 + > > >>>>> drivers/hwmon/Makefile | 1 + > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > > >>>>> delete mode 100644 drivers/char/i8k.c > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > >>>>> > > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > > >>>> > > >>>>Greg, any comments ? > > >>> > > >>>Let me review it, it's in my queue... > > >> > > >>Hi Greg! Have you looked at it? > > >> > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). > > No, I missed it for this rc cycle, sorry. If you want to include it in > yours, by all means please do so. > Too late; I sent my pull request early last week. Also, since I don't have the patch in my queue, it would not follow my own process, and I really dislike doing that. Guenter _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-21 15:24 ` [lm-sensors] " Guenter Roeck @ 2015-04-21 15:30 ` Greg Kroah-Hartman -1 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-21 15:30 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 08:24:00AM -0700, Guenter Roeck wrote: > On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman wrote: > > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > > >>>>>and allows to compile hwmon driver without /proc/i8k file. > > > >>>>> > > > >>>>>Pali Rohár (2): > > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > >>>>> > > > >>>>> MAINTAINERS | 4 +- > > > >>>>> arch/x86/Kconfig | 25 +- > > > >>>>> drivers/char/Makefile | 1 - > > > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > > > >>>>> drivers/hwmon/Kconfig | 11 + > > > >>>>> drivers/hwmon/Makefile | 1 + > > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > > > >>>>> delete mode 100644 drivers/char/i8k.c > > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > >>>>> > > > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > > > >>>> > > > >>>>Greg, any comments ? > > > >>> > > > >>>Let me review it, it's in my queue... > > > >> > > > >>Hi Greg! Have you looked at it? > > > >> > > > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). > > > > No, I missed it for this rc cycle, sorry. If you want to include it in > > yours, by all means please do so. > > > Too late; I sent my pull request early last week. Also, since I don't have > the patch in my queue, it would not follow my own process, and I really > dislike doing that. Ok, as this is "just" a rename, I'll see about doing it for -rc2, that way we avoid the merge issues. thanks, greg k-h ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-21 15:30 ` Greg Kroah-Hartman 0 siblings, 0 replies; 86+ messages in thread From: Greg Kroah-Hartman @ 2015-04-21 15:30 UTC (permalink / raw) To: Guenter Roeck Cc: Pali Rohár, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors On Tue, Apr 21, 2015 at 08:24:00AM -0700, Guenter Roeck wrote: > On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman wrote: > > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck wrote: > > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman wrote: > > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter Roeck wrote: > > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > > >>>>>This patch series moves drivers/char/i8k.c to drivers/hwmon/dell-smm-hwmon.c > > > >>>>>and allows to compile hwmon driver without /proc/i8k file. > > > >>>>> > > > >>>>>Pali Rohár (2): > > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree > > > >>>>> hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k > > > >>>>> > > > >>>>> MAINTAINERS | 4 +- > > > >>>>> arch/x86/Kconfig | 25 +- > > > >>>>> drivers/char/Makefile | 1 - > > > >>>>> drivers/char/i8k.c | 1005 --------------------------------------- > > > >>>>> drivers/hwmon/Kconfig | 11 + > > > >>>>> drivers/hwmon/Makefile | 1 + > > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 ++++++++++++++++++++++++++++++++++++++++ > > > >>>>> 7 files changed, 1049 insertions(+), 1023 deletions(-) > > > >>>>> delete mode 100644 drivers/char/i8k.c > > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > >>>>> > > > >>>>I am ok with the series and would take it for 4.1 if Greg agrees. > > > >>>> > > > >>>>Greg, any comments ? > > > >>> > > > >>>Let me review it, it's in my queue... > > > >> > > > >>Hi Greg! Have you looked at it? > > > >> > > > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > > > I don't see it in Greg's pull request, so presumably no (unless I missed it). > > > > No, I missed it for this rc cycle, sorry. If you want to include it in > > yours, by all means please do so. > > > Too late; I sent my pull request early last week. Also, since I don't have > the patch in my queue, it would not follow my own process, and I really > dislike doing that. Ok, as this is "just" a rename, I'll see about doing it for -rc2, that way we avoid the merge issues. thanks, greg k-h _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c 2015-04-21 15:30 ` [lm-sensors] " Greg Kroah-Hartman @ 2015-04-27 18:39 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-27 18:39 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1: Type: Text/Plain, Size: 2778 bytes --] On Tuesday 21 April 2015 17:30:16 Greg Kroah-Hartman wrote: > On Tue, Apr 21, 2015 at 08:24:00AM -0700, Guenter Roeck wrote: > > On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman > > wrote: > > > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck > > > wrote: > > > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman > > > > >>wrote: > > > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter > > > > >>>Roeck wrote: > > > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > > > >>>>>This patch series moves drivers/char/i8k.c to > > > > >>>>>drivers/hwmon/dell-smm-hwmon.c and allows to > > > > >>>>>compile hwmon driver without /proc/i8k file. > > > > >>>>> > > > > >>>>>Pali Rohár (2): > > > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and > > > > >>>>> move it to hwmon tree hwmon: Allow to compile > > > > >>>>> dell-smm-hwmon driver without /proc/i8k > > > > >>>>> > > > > >>>>> MAINTAINERS | 4 +- > > > > >>>>> arch/x86/Kconfig | 25 +- > > > > >>>>> drivers/char/Makefile | 1 - > > > > >>>>> drivers/char/i8k.c | 1005 > > > > >>>>> --------------------------------------- > > > > >>>>> drivers/hwmon/Kconfig | 11 + > > > > >>>>> drivers/hwmon/Makefile | 1 + > > > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 > > > > >>>>> ++++++++++++++++++++++++++++++++++++++++ 7 files > > > > >>>>> changed, 1049 insertions(+), 1023 deletions(-) > > > > >>>>> delete mode 100644 drivers/char/i8k.c > > > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > > >>>> > > > > >>>>I am ok with the series and would take it for 4.1 if > > > > >>>>Greg agrees. > > > > >>>> > > > > >>>>Greg, any comments ? > > > > >>> > > > > >>>Let me review it, it's in my queue... > > > > >> > > > > >>Hi Greg! Have you looked at it? > > > > > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > > > > I don't see it in Greg's pull request, so presumably no > > > > (unless I missed it). > > > > > > No, I missed it for this rc cycle, sorry. If you want to > > > include it in yours, by all means please do so. > > > > Too late; I sent my pull request early last week. Also, > > since I don't have the patch in my queue, it would not > > follow my own process, and I really dislike doing that. > > Ok, as this is "just" a rename, I'll see about doing it for > -rc2, that way we avoid the merge issues. > > thanks, > > greg k-h Hi Greg, -rc1 was released. Do not forget to include it for -rc2 pull request. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c @ 2015-04-27 18:39 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-04-27 18:39 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Guenter Roeck, Arnd Bergmann, Jean Delvare, Steven Honeyman, Valdis.Kletnieks, Jochen Eisinger, Gabriele Mazzotta, linux-kernel, lm-sensors [-- Attachment #1.1: Type: Text/Plain, Size: 2778 bytes --] On Tuesday 21 April 2015 17:30:16 Greg Kroah-Hartman wrote: > On Tue, Apr 21, 2015 at 08:24:00AM -0700, Guenter Roeck wrote: > > On Tue, Apr 21, 2015 at 03:52:06PM +0200, Greg Kroah-Hartman > > wrote: > > > On Tue, Apr 21, 2015 at 06:40:57AM -0700, Guenter Roeck > > > wrote: > > > > On 04/21/2015 06:30 AM, Pali Rohár wrote: > > > > >On Thursday 09 April 2015 16:02:24 Pali Rohár wrote: > > > > >>On Tuesday 31 March 2015 15:56:01 Greg Kroah-Hartman > > > > >>wrote: > > > > >>>On Mon, Mar 30, 2015 at 08:32:36PM -0700, Guenter > > > > >>>Roeck wrote: > > > > >>>>On 03/29/2015 05:57 AM, Pali Rohár wrote: > > > > >>>>>This patch series moves drivers/char/i8k.c to > > > > >>>>>drivers/hwmon/dell-smm-hwmon.c and allows to > > > > >>>>>compile hwmon driver without /proc/i8k file. > > > > >>>>> > > > > >>>>>Pali Rohár (2): > > > > >>>>> hwmon: Rename i8k driver to dell-smm-hwmon and > > > > >>>>> move it to hwmon tree hwmon: Allow to compile > > > > >>>>> dell-smm-hwmon driver without /proc/i8k > > > > >>>>> > > > > >>>>> MAINTAINERS | 4 +- > > > > >>>>> arch/x86/Kconfig | 25 +- > > > > >>>>> drivers/char/Makefile | 1 - > > > > >>>>> drivers/char/i8k.c | 1005 > > > > >>>>> --------------------------------------- > > > > >>>>> drivers/hwmon/Kconfig | 11 + > > > > >>>>> drivers/hwmon/Makefile | 1 + > > > > >>>>> drivers/hwmon/dell-smm-hwmon.c | 1025 > > > > >>>>> ++++++++++++++++++++++++++++++++++++++++ 7 files > > > > >>>>> changed, 1049 insertions(+), 1023 deletions(-) > > > > >>>>> delete mode 100644 drivers/char/i8k.c > > > > >>>>> create mode 100644 drivers/hwmon/dell-smm-hwmon.c > > > > >>>> > > > > >>>>I am ok with the series and would take it for 4.1 if > > > > >>>>Greg agrees. > > > > >>>> > > > > >>>>Greg, any comments ? > > > > >>> > > > > >>>Let me review it, it's in my queue... > > > > >> > > > > >>Hi Greg! Have you looked at it? > > > > > > > > > >Greg & Guenter: ping. Will you include it into 4.1? > > > > > > > > I don't see it in Greg's pull request, so presumably no > > > > (unless I missed it). > > > > > > No, I missed it for this rc cycle, sorry. If you want to > > > include it in yours, by all means please do so. > > > > Too late; I sent my pull request early last week. Also, > > since I don't have the patch in my queue, it would not > > follow my own process, and I really dislike doing that. > > Ok, as this is "just" a rename, I'll see about doing it for > -rc2, that way we avoid the merge issues. > > thanks, > > greg k-h Hi Greg, -rc1 was released. Do not forget to include it for -rc2 pull request. -- Pali Rohár pali.rohar@gmail.com [-- Attachment #1.2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 198 bytes --] [-- Attachment #2: Type: text/plain, Size: 153 bytes --] _______________________________________________ lm-sensors mailing list lm-sensors@lm-sensors.org http://lists.lm-sensors.org/mailman/listinfo/lm-sensors ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár @ 2015-05-14 11:16 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-14 11:16 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: linux-kernel, lm-sensors, Pali Rohár This commit moves i8k driver to hwmon tree under name dell-smm-hwmon which is better name then abbreviation i8k. For backward compatibility is added macro MODULE_ALIAS("i8k") so modprobe will load driver also old name i8k. CONFIG_I8K compile option was not changed. This commit also adds me as maintainer of this new dell-smm-hwmon driver and remove Guenter Roeck from list who is implicit maintainer all hwmon drivers. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- MAINTAINERS | 4 ++-- drivers/char/Makefile | 1 - drivers/hwmon/Makefile | 1 + drivers/{char/i8k.c => hwmon/dell-smm-hwmon.c} | 6 ++++-- 4 files changed, 7 insertions(+), 5 deletions(-) rename drivers/{char/i8k.c => hwmon/dell-smm-hwmon.c} (99%) diff --git a/MAINTAINERS b/MAINTAINERS index 2e5bbc0..014c15f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3077,9 +3077,9 @@ S: Maintained F: drivers/platform/x86/dell-smo8800.c DELL LAPTOP SMM DRIVER -M: Guenter Roeck <linux@roeck-us.net> +M: Pali Rohár <pali.rohar@gmail.com> S: Maintained -F: drivers/char/i8k.c +F: drivers/hwmon/dell-smm-hwmon.c F: include/uapi/linux/i8k.h DELL SYSTEMS MANAGEMENT BASE DRIVER (dcdbas) diff --git a/drivers/char/Makefile b/drivers/char/Makefile index d06cde26..1d9cf00 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile @@ -36,7 +36,6 @@ else obj-$(CONFIG_NVRAM) += nvram.o endif obj-$(CONFIG_TOSHIBA) += toshiba.o -obj-$(CONFIG_I8K) += i8k.o obj-$(CONFIG_DS1620) += ds1620.o obj-$(CONFIG_HW_RANDOM) += hw_random/ obj-$(CONFIG_PPDEV) += ppdev.o diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index b4a40f1..51533ac 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -156,6 +156,7 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o +obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/char/i8k.c b/drivers/hwmon/dell-smm-hwmon.c similarity index 99% rename from drivers/char/i8k.c rename to drivers/hwmon/dell-smm-hwmon.c index a43048b..65d314b 100644 --- a/drivers/char/i8k.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -1,12 +1,12 @@ /* - * i8k.c -- Linux driver for accessing the SMM BIOS on Dell laptops. + * dell-smm-hwmon.c -- Linux driver for accessing the SMM BIOS on Dell laptops. * * Copyright (C) 2001 Massimo Dal Zotto <dz@debian.org> * * Hwmon integration: * Copyright (C) 2011 Jean Delvare <jdelvare@suse.de> * Copyright (C) 2013, 2014 Guenter Roeck <linux@roeck-us.net> - * Copyright (C) 2014 Pali Rohár <pali.rohar@gmail.com> + * Copyright (C) 2014, 2015 Pali Rohár <pali.rohar@gmail.com> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -80,8 +80,10 @@ static uint i8k_fan_max = I8K_FAN_HIGH; #define I8K_HWMON_HAVE_FAN2 (1 << 5) MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); +MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("i8k"); static bool force; module_param(force, bool, 0); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree @ 2015-05-14 11:16 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-14 11:16 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: linux-kernel, lm-sensors, Pali Rohár VGhpcyBjb21taXQgbW92ZXMgaThrIGRyaXZlciB0byBod21vbiB0cmVlIHVuZGVyIG5hbWUgZGVs bC1zbW0taHdtb24gd2hpY2ggaXMKYmV0dGVyIG5hbWUgdGhlbiBhYmJyZXZpYXRpb24gaThrLiBG b3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpcyBhZGRlZCBtYWNybwpNT0RVTEVfQUxJQVMoImk4 ayIpIHNvIG1vZHByb2JlIHdpbGwgbG9hZCBkcml2ZXIgYWxzbyBvbGQgbmFtZSBpOGsuIENPTkZJ R19JOEsKY29tcGlsZSBvcHRpb24gd2FzIG5vdCBjaGFuZ2VkLgoKVGhpcyBjb21taXQgYWxzbyBh ZGRzIG1lIGFzIG1haW50YWluZXIgb2YgdGhpcyBuZXcgZGVsbC1zbW0taHdtb24gZHJpdmVyIGFu ZApyZW1vdmUgR3VlbnRlciBSb2VjayBmcm9tIGxpc3Qgd2hvIGlzIGltcGxpY2l0IG1haW50YWlu ZXIgYWxsIGh3bW9uIGRyaXZlcnMuCgpTaWduZWQtb2ZmLWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5y b2hhckBnbWFpbC5jb20+Ci0tLQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8ICAgIDQgKystLQogZHJpdmVycy9jaGFyL01ha2VmaWxlICAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgLQogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgICAg ICAgICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy97Y2hhci9pOGsuYyA9PiBod21vbi9kZWxs LXNtbS1od21vbi5jfSB8ICAgIDYgKysrKy0tCiA0IGZpbGVzIGNoYW5nZWQsIDcgaW5zZXJ0aW9u cygrKSwgNSBkZWxldGlvbnMoLSkKIHJlbmFtZSBkcml2ZXJzL3tjaGFyL2k4ay5jID0+IGh3bW9u L2RlbGwtc21tLWh3bW9uLmN9ICg5OSUpCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlO VEFJTkVSUwppbmRleCAyZTViYmMwLi4wMTRjMTVmIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUwor KysgYi9NQUlOVEFJTkVSUwpAQCAtMzA3Nyw5ICszMDc3LDkgQEAgUzoJTWFpbnRhaW5lZAogRjoJ ZHJpdmVycy9wbGF0Zm9ybS94ODYvZGVsbC1zbW84ODAwLmMKIAogREVMTCBMQVBUT1AgU01NIERS SVZFUgotTToJR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgorTToJUGFsaSBSb2jD oXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgogUzoJTWFpbnRhaW5lZAotRjoJZHJpdmVycy9jaGFy L2k4ay5jCitGOglkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKIEY6CWluY2x1ZGUvdWFw aS9saW51eC9pOGsuaAogCiBERUxMIFNZU1RFTVMgTUFOQUdFTUVOVCBCQVNFIERSSVZFUiAoZGNk YmFzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01h a2VmaWxlCmluZGV4IGQwNmNkZTI2Li4xZDljZjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIv TWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC0zNiw3ICszNiw2IEBAIGVs c2UKICAgb2JqLSQoQ09ORklHX05WUkFNKQkrPSBudnJhbS5vCiBlbmRpZgogb2JqLSQoQ09ORklH X1RPU0hJQkEpCQkrPSB0b3NoaWJhLm8KLW9iai0kKENPTkZJR19JOEspCQkrPSBpOGsubwogb2Jq LSQoQ09ORklHX0RTMTYyMCkJCSs9IGRzMTYyMC5vCiBvYmotJChDT05GSUdfSFdfUkFORE9NKQkJ Kz0gaHdfcmFuZG9tLwogb2JqLSQoQ09ORklHX1BQREVWKQkJKz0gcHBkZXYubwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXgg YjRhNDBmMS4uNTE1MzNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysg Yi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0xNTYsNiArMTU2LDcgQEAgb2JqLSQoQ09ORklH X1NFTlNPUlNfVzgzTDc4NVRTKQkrPSB3ODNsNzg1dHMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNf VzgzTDc4Nk5HKQkrPSB3ODNsNzg2bmcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzFYKQkr PSB3bTgzMXgtaHdtb24ubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzUwKQkrPSB3bTgzNTAt aHdtb24ubworb2JqLSQoQ09ORklHX0k4SykJCSs9IGRlbGwtc21tLWh3bW9uLm8KIAogb2JqLSQo Q09ORklHX1BNQlVTKQkJKz0gcG1idXMvCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pOGsu YyBiL2RyaXZlcnMvaHdtb24vZGVsbC1zbW0taHdtb24uYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpy ZW5hbWUgZnJvbSBkcml2ZXJzL2NoYXIvaThrLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vZGVs bC1zbW0taHdtb24uYwppbmRleCBhNDMwNDhiLi42NWQzMTRiIDEwMDY0NAotLS0gYS9kcml2ZXJz L2NoYXIvaThrLmMKKysrIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jCkBAIC0xLDEy ICsxLDEyIEBACiAvKgotICogaThrLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhl IFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcy4KKyAqIGRlbGwtc21tLWh3bW9uLmMgLS0gTGludXgg ZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcy4KICAqCiAg KiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hc3NpbW8gRGFsIFpvdHRvIDxkekBkZWJpYW4ub3JnPgog ICoKICAqIEh3bW9uIGludGVncmF0aW9uOgogICogQ29weXJpZ2h0IChDKSAyMDExICBKZWFuIERl bHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIDIwMTQgIEd1 ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KLSAqIENvcHlyaWdodCAoQykgMjAxNCAg UGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE0 LCAyMDE1ICBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+CiAgKgogICogVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtODAsOCArODAsMTAgQEAgc3RhdGljIHVpbnQg aThrX2Zhbl9tYXggPSBJOEtfRkFOX0hJR0g7CiAjZGVmaW5lIEk4S19IV01PTl9IQVZFX0ZBTjIJ KDEgPDwgNSkKIAogTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5v cmcpIik7CitNT0RVTEVfQVVUSE9SKCJQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+ Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgYWNjZXNzaW5nIFNNTSBCSU9TIG9u IERlbGwgbGFwdG9wcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJp OGsiKTsKIAogc3RhdGljIGJvb2wgZm9yY2U7CiBtb2R1bGVfcGFyYW0oZm9yY2UsIGJvb2wsIDAp OwotLSAKMS43LjEwLjQKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3Jn Cmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-05-14 11:16 ` [lm-sensors] " Pali Rohár @ 2015-05-14 11:16 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-14 11:16 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: linux-kernel, lm-sensors, Pali Rohár This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k interface which is needed only for old Dell Inspirion models or for userspace i8kutils package. For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- changes since v2: - removed depends on DMI --- arch/x86/Kconfig | 25 +++---- drivers/hwmon/Kconfig | 11 +++ drivers/hwmon/Makefile | 2 +- drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ 4 files changed, 106 insertions(+), 82 deletions(-) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 226d569..7b756b3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1055,24 +1055,19 @@ config TOSHIBA Say N otherwise. config I8K - tristate "Dell laptop support" + tristate "Dell i8k legacy laptop support" select HWMON + select SENSORS_DELL_SMM ---help--- - This adds a driver to safely access the System Management Mode - of the CPU on the Dell Inspiron 8000. The System Management Mode - is used to read cpu temperature and cooling fan status and to - control the fans on the I8K portables. + This option enables legacy /proc/i8k userspace interface in hwmon + dell-smm-hwmon driver. Character file /proc/i8k reports bios version, + temperature and allows controlling fan speeds of Dell laptops via + System Management Mode. For old Dell laptops (like Dell Inspiron 8000) + it reports also power and hotkey status. For fan speed control is + needed userspace package i8kutils. - This driver has been tested only on the Inspiron 8000 but it may - also work with other Dell laptops. You can force loading on other - models by passing the parameter `force=1' to the module. Use at - your own risk. - - For information on utilities to make use of this driver see the - I8K Linux utilities web site at: - <http://people.debian.org/~dz/i8k/> - - Say Y if you intend to run this kernel on a Dell Inspiron 8000. + Say Y if you intend to run this kernel on old Dell laptops or want to + use userspace package i8kutils. Say N otherwise. config X86_REBOOTFIXUPS diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 25d9e72..bc9d90b1 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -371,6 +371,17 @@ config SENSORS_DS1621 This driver can also be built as a module. If so, the module will be called ds1621. +config SENSORS_DELL_SMM + tristate "Dell laptop SMM BIOS hwmon driver" + depends on X86 + help + This hwmon driver adds support for reporting temperature of different + sensors and controls the fans on Dell laptops via System Management + Mode provided by Dell BIOS. + + When option I8K is also enabled this driver provides legacy /proc/i8k + userspace interface for i8kutils package. + config SENSORS_DA9052_ADC tristate "Dialog DA9052/DA9053 ADC" depends on PMIC_DA9052 diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 51533ac..6cacd0f 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -49,6 +49,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o +obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o obj-$(CONFIG_SENSORS_DME1737) += dme1737.o obj-$(CONFIG_SENSORS_DS620) += ds620.o obj-$(CONFIG_SENSORS_DS1621) += ds1621.o @@ -156,7 +157,6 @@ obj-$(CONFIG_SENSORS_W83L785TS) += w83l785ts.o obj-$(CONFIG_SENSORS_W83L786NG) += w83l786ng.o obj-$(CONFIG_SENSORS_WM831X) += wm831x-hwmon.o obj-$(CONFIG_SENSORS_WM8350) += wm8350-hwmon.o -obj-$(CONFIG_I8K) += dell-smm-hwmon.o obj-$(CONFIG_PMBUS) += pmbus/ diff --git a/drivers/hwmon/dell-smm-hwmon.c b/drivers/hwmon/dell-smm-hwmon.c index 65d314b..2a80882 100644 --- a/drivers/hwmon/dell-smm-hwmon.c +++ b/drivers/hwmon/dell-smm-hwmon.c @@ -81,7 +81,7 @@ static uint i8k_fan_max = I8K_FAN_HIGH; MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); MODULE_AUTHOR("Pali Rohár <pali.rohar@gmail.com>"); -MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops"); +MODULE_DESCRIPTION("Dell laptop SMM BIOS hwmon driver"); MODULE_LICENSE("GPL"); MODULE_ALIAS("i8k"); @@ -93,6 +93,7 @@ static bool ignore_dmi; module_param(ignore_dmi, bool, 0); MODULE_PARM_DESC(ignore_dmi, "Continue probing hardware even if DMI data does not match"); +#if IS_ENABLED(CONFIG_I8K) static bool restricted; module_param(restricted, bool, 0); MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); @@ -100,6 +101,7 @@ MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set"); static bool power_status; module_param(power_status, bool, 0600); MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k"); +#endif static uint fan_mult; module_param(fan_mult, uint, 0); @@ -109,18 +111,6 @@ static uint fan_max; module_param(fan_max, uint, 0); MODULE_PARM_DESC(fan_max, "Maximum configurable fan speed (default: autodetect)"); -static int i8k_open_fs(struct inode *inode, struct file *file); -static long i8k_ioctl(struct file *, unsigned int, unsigned long); - -static const struct file_operations i8k_fops = { - .owner = THIS_MODULE, - .open = i8k_open_fs, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, - .unlocked_ioctl = i8k_ioctl, -}; - struct smm_regs { unsigned int eax; unsigned int ebx __packed; @@ -221,45 +211,6 @@ out: } /* - * Read the Fn key status. - */ -static int i8k_get_fn_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { - case I8K_FN_UP: - return I8K_VOL_UP; - case I8K_FN_DOWN: - return I8K_VOL_DOWN; - case I8K_FN_MUTE: - return I8K_VOL_MUTE; - default: - return 0; - } -} - -/* - * Read the power status. - */ -static int i8k_get_power_status(void) -{ - struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; - int rc; - - rc = i8k_smm(®s); - if (rc < 0) - return rc; - - return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; -} - -/* * Read the fan status. */ static int i8k_get_fan_status(int fan) @@ -378,6 +329,51 @@ static int i8k_get_dell_signature(int req_fn) return regs.eax == 1145651527 && regs.edx == 1145392204 ? 0 : -1; } +#if IS_ENABLED(CONFIG_I8K) + +/* + * Read the Fn key status. + */ +static int i8k_get_fn_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_FN_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + switch ((regs.eax >> I8K_FN_SHIFT) & I8K_FN_MASK) { + case I8K_FN_UP: + return I8K_VOL_UP; + case I8K_FN_DOWN: + return I8K_VOL_DOWN; + case I8K_FN_MUTE: + return I8K_VOL_MUTE; + default: + return 0; + } +} + +/* + * Read the power status. + */ +static int i8k_get_power_status(void) +{ + struct smm_regs regs = { .eax = I8K_SMM_POWER_STATUS, }; + int rc; + + rc = i8k_smm(®s); + if (rc < 0) + return rc; + + return (regs.eax & 0xff) == I8K_POWER_AC ? I8K_AC : I8K_BATTERY; +} + +/* + * Procfs interface + */ + static int i8k_ioctl_unlocked(struct file *fp, unsigned int cmd, unsigned long arg) { @@ -528,6 +524,37 @@ static int i8k_open_fs(struct inode *inode, struct file *file) return single_open(file, i8k_proc_show, NULL); } +static const struct file_operations i8k_fops = { + .owner = THIS_MODULE, + .open = i8k_open_fs, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, + .unlocked_ioctl = i8k_ioctl, +}; + +static void __init i8k_init_procfs(void) +{ + /* Register the proc entry */ + proc_create("i8k", 0, NULL, &i8k_fops); +} + +static void __exit i8k_exit_procfs(void) +{ + remove_proc_entry("i8k", NULL); +} + +#else + +static inline void __init i8k_init_procfs(void) +{ +} + +static inline void __exit i8k_exit_procfs(void) +{ +} + +#endif /* * Hwmon interface @@ -750,8 +777,8 @@ static int __init i8k_init_hwmon(void) if (err >= 0) i8k_hwmon_flags |= I8K_HWMON_HAVE_FAN2; - i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "i8k", NULL, - i8k_groups); + i8k_hwmon_dev = hwmon_device_register_with_groups(NULL, "dell-smm", + NULL, i8k_groups); if (IS_ERR(i8k_hwmon_dev)) { err = PTR_ERR(i8k_hwmon_dev); i8k_hwmon_dev = NULL; @@ -976,33 +1003,24 @@ static int __init i8k_probe(void) static int __init i8k_init(void) { - struct proc_dir_entry *proc_i8k; int err; /* Are we running on an supported laptop? */ if (i8k_probe()) return -ENODEV; - /* Register the proc entry */ - proc_i8k = proc_create("i8k", 0, NULL, &i8k_fops); - if (!proc_i8k) - return -ENOENT; - err = i8k_init_hwmon(); if (err) - goto exit_remove_proc; + return err; + i8k_init_procfs(); return 0; - - exit_remove_proc: - remove_proc_entry("i8k", NULL); - return err; } static void __exit i8k_exit(void) { hwmon_device_unregister(i8k_hwmon_dev); - remove_proc_entry("i8k", NULL); + i8k_exit_procfs(); } module_init(i8k_init); -- 1.7.10.4 ^ permalink raw reply related [flat|nested] 86+ messages in thread
* [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-05-14 11:16 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-14 11:16 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck Cc: linux-kernel, lm-sensors, Pali Rohár VGhpcyBwYXRjaCBzcGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RF TExfU01NIGFuZCBDT05GSUdfSThLLgpPcHRpb24gU0VOU09SU19ERUxMX1NNTSBpcyBub3cgdXNl ZCB0byBlbmFibGUgY29tcGlsYXRpb24gb2YgZGVsbC1zbW0taHdtb24KZHJpdmVyIGFuZCBvbGQg Q09ORklHX0k4SyBvcHRpb24gdG8gZW5hYmxlIC9wcm9jL2k4ayBpbnRlcmZhY2UgaW4gZHJpdmVy LgoKU28gdGhpcyBjaGFuZ2UgYWxsb3dzIHRvIGNvbXBpbGUgZGVsbC1zbW0taHdtb24gZHJpdmVy IHdpdGhvdXQgbGVnYWN5IC9wcm9jL2k4awppbnRlcmZhY2Ugd2hpY2ggaXMgbmVlZGVkIG9ubHkg Zm9yIG9sZCBEZWxsIEluc3BpcmlvbiBtb2RlbHMgb3IgZm9yIHVzZXJzcGFjZQppOGt1dGlscyBw YWNrYWdlLgoKRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2hlbiBDT05GSUdfSThLIGlzIGVu YWJsZWQgdGhlbiBhbHNvIFNFTlNPUlNfREVMTF9TTU0KaXMgZW5hYmxlZCBhbmQgc28gZHJpdmVy IGRlbGwtc21tLWh3bW9uICh3aXRoIC9wcm9jL2k4aykgaXMgY29tcGlsZWQuCgpTaWduZWQtb2Zm LWJ5OiBQYWxpIFJvaMOhciA8cGFsaS5yb2hhckBnbWFpbC5jb20+Ci0tLQpjaGFuZ2VzIHNpbmNl IHYyOgogLSByZW1vdmVkIGRlcGVuZHMgb24gRE1JCi0tLQogYXJjaC94ODYvS2NvbmZpZyAgICAg ICAgICAgICAgIHwgICAyNSArKystLS0tCiBkcml2ZXJzL2h3bW9uL0tjb25maWcgICAgICAgICAg fCAgIDExICsrKwogZHJpdmVycy9od21vbi9NYWtlZmlsZSAgICAgICAgIHwgICAgMiArLQogZHJp dmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIHwgIDE1MCArKysrKysrKysrKysrKysrKysrKysr LS0tLS0tLS0tLS0tLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDEwNiBpbnNlcnRpb25zKCspLCA4 MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LY29uZmlnIGIvYXJjaC94ODYv S2NvbmZpZwppbmRleCAyMjZkNTY5Li43Yjc1NmIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9LY29u ZmlnCisrKyBiL2FyY2gveDg2L0tjb25maWcKQEAgLTEwNTUsMjQgKzEwNTUsMTkgQEAgY29uZmln IFRPU0hJQkEKIAkgIFNheSBOIG90aGVyd2lzZS4KIAogY29uZmlnIEk4SwotCXRyaXN0YXRlICJE ZWxsIGxhcHRvcCBzdXBwb3J0IgorCXRyaXN0YXRlICJEZWxsIGk4ayBsZWdhY3kgbGFwdG9wIHN1 cHBvcnQiCiAJc2VsZWN0IEhXTU9OCisJc2VsZWN0IFNFTlNPUlNfREVMTF9TTU0KIAktLS1oZWxw LS0tCi0JICBUaGlzIGFkZHMgYSBkcml2ZXIgdG8gc2FmZWx5IGFjY2VzcyB0aGUgU3lzdGVtIE1h bmFnZW1lbnQgTW9kZQotCSAgb2YgdGhlIENQVSBvbiB0aGUgRGVsbCBJbnNwaXJvbiA4MDAwLiBU aGUgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZQotCSAgaXMgdXNlZCB0byByZWFkIGNwdSB0ZW1wZXJh dHVyZSBhbmQgY29vbGluZyBmYW4gc3RhdHVzIGFuZCB0bwotCSAgY29udHJvbCB0aGUgZmFucyBv biB0aGUgSThLIHBvcnRhYmxlcy4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgbGVnYWN5IC9wcm9j L2k4ayB1c2Vyc3BhY2UgaW50ZXJmYWNlIGluIGh3bW9uCisJICBkZWxsLXNtbS1od21vbiBkcml2 ZXIuIENoYXJhY3RlciBmaWxlIC9wcm9jL2k4ayByZXBvcnRzIGJpb3MgdmVyc2lvbiwKKwkgIHRl bXBlcmF0dXJlIGFuZCBhbGxvd3MgY29udHJvbGxpbmcgZmFuIHNwZWVkcyBvZiBEZWxsIGxhcHRv cHMgdmlhCisJICBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlLiBGb3Igb2xkIERlbGwgbGFwdG9wcyAo bGlrZSBEZWxsIEluc3Bpcm9uIDgwMDApCisJICBpdCByZXBvcnRzIGFsc28gcG93ZXIgYW5kIGhv dGtleSBzdGF0dXMuIEZvciBmYW4gc3BlZWQgY29udHJvbCBpcworCSAgbmVlZGVkIHVzZXJzcGFj ZSBwYWNrYWdlIGk4a3V0aWxzLgogCi0JICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgb25s eSBvbiB0aGUgSW5zcGlyb24gODAwMCBidXQgaXQgbWF5Ci0JICBhbHNvIHdvcmsgd2l0aCBvdGhl ciBEZWxsIGxhcHRvcHMuIFlvdSBjYW4gZm9yY2UgbG9hZGluZyBvbiBvdGhlcgotCSAgbW9kZWxz IGJ5IHBhc3NpbmcgdGhlIHBhcmFtZXRlciBgZm9yY2U9MScgdG8gdGhlIG1vZHVsZS4gVXNlIGF0 Ci0JICB5b3VyIG93biByaXNrLgotCi0JICBGb3IgaW5mb3JtYXRpb24gb24gdXRpbGl0aWVzIHRv IG1ha2UgdXNlIG9mIHRoaXMgZHJpdmVyIHNlZSB0aGUKLQkgIEk4SyBMaW51eCB1dGlsaXRpZXMg d2ViIHNpdGUgYXQ6Ci0JICA8aHR0cDovL3Blb3BsZS5kZWJpYW4ub3JnL35kei9pOGsvPgotCi0J ICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCBvbiBhIERlbGwgSW5zcGly b24gODAwMC4KKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIG9uIG9s ZCBEZWxsIGxhcHRvcHMgb3Igd2FudCB0bworCSAgdXNlIHVzZXJzcGFjZSBwYWNrYWdlIGk4a3V0 aWxzLgogCSAgU2F5IE4gb3RoZXJ3aXNlLgogCiBjb25maWcgWDg2X1JFQk9PVEZJWFVQUwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmlu ZGV4IDI1ZDllNzIuLmJjOWQ5MGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL0tjb25maWcK KysrIGIvZHJpdmVycy9od21vbi9LY29uZmlnCkBAIC0zNzEsNiArMzcxLDE3IEBAIGNvbmZpZyBT RU5TT1JTX0RTMTYyMQogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1 bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgZHMxNjIxLgogCitjb25m aWcgU0VOU09SU19ERUxMX1NNTQorCXRyaXN0YXRlICJEZWxsIGxhcHRvcCBTTU0gQklPUyBod21v biBkcml2ZXIiCisJZGVwZW5kcyBvbiBYODYKKwloZWxwCisJICBUaGlzIGh3bW9uIGRyaXZlciBh ZGRzIHN1cHBvcnQgZm9yIHJlcG9ydGluZyB0ZW1wZXJhdHVyZSBvZiBkaWZmZXJlbnQKKwkgIHNl bnNvcnMgYW5kIGNvbnRyb2xzIHRoZSBmYW5zIG9uIERlbGwgbGFwdG9wcyB2aWEgU3lzdGVtIE1h bmFnZW1lbnQKKwkgIE1vZGUgcHJvdmlkZWQgYnkgRGVsbCBCSU9TLgorCisJICBXaGVuIG9wdGlv biBJOEsgaXMgYWxzbyBlbmFibGVkIHRoaXMgZHJpdmVyIHByb3ZpZGVzIGxlZ2FjeSAvcHJvYy9p OGsKKwkgIHVzZXJzcGFjZSBpbnRlcmZhY2UgZm9yIGk4a3V0aWxzIHBhY2thZ2UuCisKIGNvbmZp ZyBTRU5TT1JTX0RBOTA1Ml9BREMKIAl0cmlzdGF0ZSAiRGlhbG9nIERBOTA1Mi9EQTkwNTMgQURD IgogCWRlcGVuZHMgb24gUE1JQ19EQTkwNTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFr ZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IDUxNTMzYWMuLjZjYWNkMGYgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtl ZmlsZQpAQCAtNDksNiArNDksNyBAQCBvYmotJChDT05GSUdfU0VOU09SU19BVFhQMSkJKz0gYXR4 cDEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQ09SRVRFTVApCSs9IGNvcmV0ZW1wLm8KIG9iai0k KENPTkZJR19TRU5TT1JTX0RBOTA1Ml9BREMpKz0gZGE5MDUyLWh3bW9uLm8KIG9iai0kKENPTkZJ R19TRU5TT1JTX0RBOTA1NSkrPSBkYTkwNTUtaHdtb24ubworb2JqLSQoQ09ORklHX1NFTlNPUlNf REVMTF9TTU0pCSs9IGRlbGwtc21tLWh3bW9uLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0RNRTE3 MzcpCSs9IGRtZTE3Mzcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfRFM2MjApCSs9IGRzNjIwLm8K IG9iai0kKENPTkZJR19TRU5TT1JTX0RTMTYyMSkJKz0gZHMxNjIxLm8KQEAgLTE1Niw3ICsxNTcs NiBAQCBvYmotJChDT05GSUdfU0VOU09SU19XODNMNzg1VFMpCSs9IHc4M2w3ODV0cy5vCiBvYmot JChDT05GSUdfU0VOU09SU19XODNMNzg2TkcpCSs9IHc4M2w3ODZuZy5vCiBvYmotJChDT05GSUdf U0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19X TTgzNTApCSs9IHdtODM1MC1od21vbi5vCi1vYmotJChDT05GSUdfSThLKQkJKz0gZGVsbC1zbW0t aHdtb24ubwogCiBvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8KIApkaWZmIC0tZ2l0IGEv ZHJpdmVycy9od21vbi9kZWxsLXNtbS1od21vbi5jIGIvZHJpdmVycy9od21vbi9kZWxsLXNtbS1o d21vbi5jCmluZGV4IDY1ZDMxNGIuLjJhODA4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24v ZGVsbC1zbW0taHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3bW9uLmMKQEAg LTgxLDcgKzgxLDcgQEAgc3RhdGljIHVpbnQgaThrX2Zhbl9tYXggPSBJOEtfRkFOX0hJR0g7CiAK IE1PRFVMRV9BVVRIT1IoIk1hc3NpbW8gRGFsIFpvdHRvIChkekBkZWJpYW4ub3JnKSIpOwogTU9E VUxFX0FVVEhPUigiUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPiIpOwotTU9EVUxF X0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGFjY2Vzc2luZyBTTU0gQklPUyBvbiBEZWxsIGxhcHRv cHMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGVsbCBsYXB0b3AgU01NIEJJT1MgaHdtb24gZHJp dmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoImk4ayIpOwogCkBA IC05Myw2ICs5Myw3IEBAIHN0YXRpYyBib29sIGlnbm9yZV9kbWk7CiBtb2R1bGVfcGFyYW0oaWdu b3JlX2RtaSwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlnbm9yZV9kbWksICJDb250aW51 ZSBwcm9iaW5nIGhhcmR3YXJlIGV2ZW4gaWYgRE1JIGRhdGEgZG9lcyBub3QgbWF0Y2giKTsKIAor I2lmIElTX0VOQUJMRUQoQ09ORklHX0k4SykKIHN0YXRpYyBib29sIHJlc3RyaWN0ZWQ7CiBtb2R1 bGVfcGFyYW0ocmVzdHJpY3RlZCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0 ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKQEAg LTEwMCw2ICsxMDEsNyBAQCBNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4g Y29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKIHN0YXRpYyBib29sIHBvd2Vy X3N0YXR1czsKIG1vZHVsZV9wYXJhbShwb3dlcl9zdGF0dXMsIGJvb2wsIDA2MDApOwogTU9EVUxF X1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4 ayIpOworI2VuZGlmCiAKIHN0YXRpYyB1aW50IGZhbl9tdWx0OwogbW9kdWxlX3BhcmFtKGZhbl9t dWx0LCB1aW50LCAwKTsKQEAgLTEwOSwxOCArMTExLDYgQEAgc3RhdGljIHVpbnQgZmFuX21heDsK IG1vZHVsZV9wYXJhbShmYW5fbWF4LCB1aW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmFuX21h eCwgIk1heGltdW0gY29uZmlndXJhYmxlIGZhbiBzcGVlZCAoZGVmYXVsdDogYXV0b2RldGVjdCki KTsKIAotc3RhdGljIGludCBpOGtfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qg ZmlsZSAqZmlsZSk7Ci1zdGF0aWMgbG9uZyBpOGtfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWdu ZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJh dGlvbnMgaThrX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IGk4 a19vcGVuX2ZzLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAot CS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi0JLnVubG9ja2VkX2lvY3RsCT0gaThrX2lvY3Rs LAotfTsKLQogc3RydWN0IHNtbV9yZWdzIHsKIAl1bnNpZ25lZCBpbnQgZWF4OwogCXVuc2lnbmVk IGludCBlYnggX19wYWNrZWQ7CkBAIC0yMjEsNDUgKzIxMSw2IEBAIG91dDoKIH0KIAogLyoKLSAq IFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQgaThrX2dldF9mbl9zdGF0 dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fRk5f U1RBVFVTLCB9OwotCWludCByYzsKLQotCXJjID0gaThrX3NtbSgmcmVncyk7Ci0JaWYgKHJjIDwg MCkKLQkJcmV0dXJuIHJjOwotCi0Jc3dpdGNoICgocmVncy5lYXggPj4gSThLX0ZOX1NISUZUKSAm IEk4S19GTl9NQVNLKSB7Ci0JY2FzZSBJOEtfRk5fVVA6Ci0JCXJldHVybiBJOEtfVk9MX1VQOwot CWNhc2UgSThLX0ZOX0RPV046Ci0JCXJldHVybiBJOEtfVk9MX0RPV047Ci0JY2FzZSBJOEtfRk5f TVVURToKLQkJcmV0dXJuIEk4S19WT0xfTVVURTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9 Ci19Ci0KLS8qCi0gKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCi0gKi8KLXN0YXRpYyBpbnQgaThr X2dldF9wb3dlcl9zdGF0dXModm9pZCkKLXsKLQlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsgLmVh eCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTLCB9OwotCWludCByYzsKLQotCXJjID0gaThrX3NtbSgm cmVncyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIChyZWdzLmVheCAm IDB4ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19BQyA6IEk4S19CQVRURVJZOwotfQotCi0vKgog ICogUmVhZCB0aGUgZmFuIHN0YXR1cy4KICAqLwogc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zdGF0 dXMoaW50IGZhbikKQEAgLTM3OCw2ICszMjksNTEgQEAgc3RhdGljIGludCBpOGtfZ2V0X2RlbGxf c2lnbmF0dXJlKGludCByZXFfZm4pCiAJcmV0dXJuIHJlZ3MuZWF4ID09IDExNDU2NTE1MjcgJiYg cmVncy5lZHggPT0gMTE0NTM5MjIwNCA/IDAgOiAtMTsKIH0KIAorI2lmIElTX0VOQUJMRUQoQ09O RklHX0k4SykKKworLyoKKyAqIFJlYWQgdGhlIEZuIGtleSBzdGF0dXMuCisgKi8KK3N0YXRpYyBp bnQgaThrX2dldF9mbl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3Qgc21tX3JlZ3MgcmVncyA9IHsg LmVheCA9IEk4S19TTU1fRk5fU1RBVFVTLCB9OworCWludCByYzsKKworCXJjID0gaThrX3NtbSgm cmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc3dpdGNoICgocmVncy5lYXgg Pj4gSThLX0ZOX1NISUZUKSAmIEk4S19GTl9NQVNLKSB7CisJY2FzZSBJOEtfRk5fVVA6CisJCXJl dHVybiBJOEtfVk9MX1VQOworCWNhc2UgSThLX0ZOX0RPV046CisJCXJldHVybiBJOEtfVk9MX0RP V047CisJY2FzZSBJOEtfRk5fTVVURToKKwkJcmV0dXJuIEk4S19WT0xfTVVURTsKKwlkZWZhdWx0 OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCisg Ki8KK3N0YXRpYyBpbnQgaThrX2dldF9wb3dlcl9zdGF0dXModm9pZCkKK3sKKwlzdHJ1Y3Qgc21t X3JlZ3MgcmVncyA9IHsgLmVheCA9IEk4S19TTU1fUE9XRVJfU1RBVFVTLCB9OworCWludCByYzsK KworCXJjID0gaThrX3NtbSgmcmVncyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJ cmV0dXJuIChyZWdzLmVheCAmIDB4ZmYpID09IEk4S19QT1dFUl9BQyA/IEk4S19BQyA6IEk4S19C QVRURVJZOworfQorCisvKgorICogUHJvY2ZzIGludGVyZmFjZQorICovCisKIHN0YXRpYyBpbnQK IGk4a19pb2N0bF91bmxvY2tlZChzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsIHVu c2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTI4LDYgKzUyNCwzNyBAQCBzdGF0aWMgaW50IGk4a19v cGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogCXJldHVybiBz aW5nbGVfb3BlbihmaWxlLCBpOGtfcHJvY19zaG93LCBOVUxMKTsKIH0KIAorc3RhdGljIGNvbnN0 IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaThrX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9E VUxFLAorCS5vcGVuCQk9IGk4a19vcGVuX2ZzLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNl ZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLnVubG9ja2Vk X2lvY3RsCT0gaThrX2lvY3RsLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGk4a19pbml0X3By b2Nmcyh2b2lkKQoreworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCisJcHJvY19jcmVh dGUoImk4ayIsIDAsIE5VTEwsICZpOGtfZm9wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBp OGtfZXhpdF9wcm9jZnModm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiaThrIiwgTlVMTCk7 Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgaThrX2luaXRfcHJvY2Zz KHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgaThrX2V4aXRfcHJvY2Zz KHZvaWQpCit7Cit9CisKKyNlbmRpZgogCiAvKgogICogSHdtb24gaW50ZXJmYWNlCkBAIC03NTAs OCArNzc3LDggQEAgc3RhdGljIGludCBfX2luaXQgaThrX2luaXRfaHdtb24odm9pZCkKIAlpZiAo ZXJyID49IDApCiAJCWk4a19od21vbl9mbGFncyB8PSBJOEtfSFdNT05fSEFWRV9GQU4yOwogCi0J aThrX2h3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhOVUxMLCAi aThrIiwgTlVMTCwKLQkJCQkJCQkgIGk4a19ncm91cHMpOworCWk4a19od21vbl9kZXYgPSBod21v bl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoTlVMTCwgImRlbGwtc21tIiwKKwkJCQkJCQkg IE5VTEwsIGk4a19ncm91cHMpOwogCWlmIChJU19FUlIoaThrX2h3bW9uX2RldikpIHsKIAkJZXJy ID0gUFRSX0VSUihpOGtfaHdtb25fZGV2KTsKIAkJaThrX2h3bW9uX2RldiA9IE5VTEw7CkBAIC05 NzYsMzMgKzEwMDMsMjQgQEAgc3RhdGljIGludCBfX2luaXQgaThrX3Byb2JlKHZvaWQpCiAKIHN0 YXRpYyBpbnQgX19pbml0IGk4a19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5 ICpwcm9jX2k4azsKIAlpbnQgZXJyOwogCiAJLyogQXJlIHdlIHJ1bm5pbmcgb24gYW4gc3VwcG9y dGVkIGxhcHRvcD8gKi8KIAlpZiAoaThrX3Byb2JlKCkpCiAJCXJldHVybiAtRU5PREVWOwogCi0J LyogUmVnaXN0ZXIgdGhlIHByb2MgZW50cnkgKi8KLQlwcm9jX2k4ayA9IHByb2NfY3JlYXRlKCJp OGsiLCAwLCBOVUxMLCAmaThrX2ZvcHMpOwotCWlmICghcHJvY19pOGspCi0JCXJldHVybiAtRU5P RU5UOwotCiAJZXJyID0gaThrX2luaXRfaHdtb24oKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4aXRf cmVtb3ZlX3Byb2M7CisJCXJldHVybiBlcnI7CiAKKwlpOGtfaW5pdF9wcm9jZnMoKTsKIAlyZXR1 cm4gMDsKLQotIGV4aXRfcmVtb3ZlX3Byb2M6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImk4ayIsIE5V TEwpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpOGtfZXhpdCh2b2lk KQogewogCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGk4a19od21vbl9kZXYpOwotCXJlbW92ZV9w cm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKKwlpOGtfZXhpdF9wcm9jZnMoKTsKIH0KIAogbW9kdWxl X2luaXQoaThrX2luaXQpOwotLSAKMS43LjEwLjQKCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxpbmcgbGlzdApsbS1zZW5zb3Jz QGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xtLXNlbnNvcnM ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k 2015-05-14 11:16 ` [lm-sensors] " Pali Rohár @ 2015-05-21 11:42 ` Pali Rohár -1 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-21 11:42 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck; +Cc: linux-kernel, lm-sensors On Thursday 14 May 2015 13:16:37 Pali Rohár wrote: > This patch splits CONFIG_I8K compile option to SENSORS_DELL_SMM and CONFIG_I8K. > Option SENSORS_DELL_SMM is now used to enable compilation of dell-smm-hwmon > driver and old CONFIG_I8K option to enable /proc/i8k interface in driver. > > So this change allows to compile dell-smm-hwmon driver without legacy /proc/i8k > interface which is needed only for old Dell Inspirion models or for userspace > i8kutils package. > > For backward compatibility when CONFIG_I8K is enabled then also SENSORS_DELL_SMM > is enabled and so driver dell-smm-hwmon (with /proc/i8k) is compiled. > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > changes since v2: > - removed depends on DMI > --- > arch/x86/Kconfig | 25 +++---- > drivers/hwmon/Kconfig | 11 +++ > drivers/hwmon/Makefile | 2 +- > drivers/hwmon/dell-smm-hwmon.c | 150 ++++++++++++++++++++++------------------ > 4 files changed, 106 insertions(+), 82 deletions(-) > Greg, can you finally apply this patch series? -- Pali Rohár pali.rohar@gmail.com ^ permalink raw reply [flat|nested] 86+ messages in thread
* Re: [lm-sensors] [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k @ 2015-05-21 11:42 ` Pali Rohár 0 siblings, 0 replies; 86+ messages in thread From: Pali Rohár @ 2015-05-21 11:42 UTC (permalink / raw) To: Greg Kroah-Hartman, Guenter Roeck; +Cc: linux-kernel, lm-sensors T24gVGh1cnNkYXkgMTQgTWF5IDIwMTUgMTM6MTY6MzcgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gVGhp cyBwYXRjaCBzcGxpdHMgQ09ORklHX0k4SyBjb21waWxlIG9wdGlvbiB0byBTRU5TT1JTX0RFTExf U01NIGFuZCBDT05GSUdfSThLLgo+IE9wdGlvbiBTRU5TT1JTX0RFTExfU01NIGlzIG5vdyB1c2Vk IHRvIGVuYWJsZSBjb21waWxhdGlvbiBvZiBkZWxsLXNtbS1od21vbgo+IGRyaXZlciBhbmQgb2xk IENPTkZJR19JOEsgb3B0aW9uIHRvIGVuYWJsZSAvcHJvYy9pOGsgaW50ZXJmYWNlIGluIGRyaXZl ci4KPiAKPiBTbyB0aGlzIGNoYW5nZSBhbGxvd3MgdG8gY29tcGlsZSBkZWxsLXNtbS1od21vbiBk cml2ZXIgd2l0aG91dCBsZWdhY3kgL3Byb2MvaThrCj4gaW50ZXJmYWNlIHdoaWNoIGlzIG5lZWRl ZCBvbmx5IGZvciBvbGQgRGVsbCBJbnNwaXJpb24gbW9kZWxzIG9yIGZvciB1c2Vyc3BhY2UKPiBp OGt1dGlscyBwYWNrYWdlLgo+IAo+IEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gQ09O RklHX0k4SyBpcyBlbmFibGVkIHRoZW4gYWxzbyBTRU5TT1JTX0RFTExfU01NCj4gaXMgZW5hYmxl ZCBhbmQgc28gZHJpdmVyIGRlbGwtc21tLWh3bW9uICh3aXRoIC9wcm9jL2k4aykgaXMgY29tcGls ZWQuCj4gCj4gU2lnbmVkLW9mZi1ieTogUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29t Pgo+IC0tLQo+IGNoYW5nZXMgc2luY2UgdjI6Cj4gIC0gcmVtb3ZlZCBkZXBlbmRzIG9uIERNSQo+ IC0tLQo+ICBhcmNoL3g4Ni9LY29uZmlnICAgICAgICAgICAgICAgfCAgIDI1ICsrKy0tLS0KPiAg ZHJpdmVycy9od21vbi9LY29uZmlnICAgICAgICAgIHwgICAxMSArKysKPiAgZHJpdmVycy9od21v bi9NYWtlZmlsZSAgICAgICAgIHwgICAgMiArLQo+ICBkcml2ZXJzL2h3bW9uL2RlbGwtc21tLWh3 bW9uLmMgfCAgMTUwICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KPiAg NCBmaWxlcyBjaGFuZ2VkLCAxMDYgaW5zZXJ0aW9ucygrKSwgODIgZGVsZXRpb25zKC0pCj4gCgpH cmVnLCBjYW4geW91IGZpbmFsbHkgYXBwbHkgdGhpcyBwYXRjaCBzZXJpZXM/CgotLSAKUGFsaSBS b2jDoXIKcGFsaS5yb2hhckBnbWFpbC5jb20KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0t c2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8v bG0tc2Vuc29ycw= ^ permalink raw reply [flat|nested] 86+ messages in thread
end of thread, other threads:[~2015-06-27 13:22 UTC | newest] Thread overview: 86+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-03-28 10:24 [PATCH 0/2] i8k.c => dell-smm-hwmon.c Pali Rohár 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár 2015-03-28 10:24 ` [PATCH 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree Pali Rohár 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár 2015-03-28 14:31 ` Guenter Roeck 2015-03-28 14:31 ` [lm-sensors] " Guenter Roeck 2015-03-28 10:24 ` [PATCH 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k Pali Rohár 2015-03-28 10:24 ` [lm-sensors] " Pali Rohár 2015-03-28 11:04 ` Paul Bolle 2015-03-28 11:04 ` [lm-sensors] " Paul Bolle 2015-03-28 12:54 ` Steven Honeyman 2015-03-28 12:54 ` [lm-sensors] " Steven Honeyman 2015-03-28 14:13 ` Guenter Roeck 2015-03-28 14:13 ` [lm-sensors] " Guenter Roeck 2015-03-28 22:00 ` Pali Rohár 2015-03-28 22:00 ` [lm-sensors] " Pali Rohár 2015-03-28 22:20 ` Guenter Roeck 2015-03-28 22:20 ` [lm-sensors] " Guenter Roeck 2015-03-28 22:44 ` Paul Bolle 2015-03-28 22:44 ` [lm-sensors] " Paul Bolle 2015-03-29 0:55 ` Guenter Roeck 2015-03-29 0:55 ` [lm-sensors] " Guenter Roeck 2015-03-30 8:01 ` Paul Bolle 2015-03-30 8:01 ` [lm-sensors] " Paul Bolle 2015-03-28 21:55 ` Pali Rohár 2015-03-28 21:55 ` [lm-sensors] " Pali Rohár 2015-03-28 22:06 ` Paul Bolle 2015-03-28 22:06 ` [lm-sensors] " Paul Bolle 2015-03-28 22:19 ` Steven Honeyman 2015-03-28 22:19 ` [lm-sensors] " Steven Honeyman 2015-03-28 22:33 ` Pali Rohár 2015-03-28 22:33 ` [lm-sensors] " Pali Rohár 2015-03-30 7:44 ` Jean Delvare 2015-03-30 7:44 ` [lm-sensors] " Jean Delvare 2015-03-28 14:23 ` Guenter Roeck 2015-03-28 14:23 ` [lm-sensors] " Guenter Roeck 2015-03-28 22:04 ` Pali Rohár 2015-03-28 22:04 ` [lm-sensors] " Pali Rohár 2015-03-29 12:57 ` [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c Pali Rohár 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár 2015-03-29 12:57 ` [PATCH v2 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree Pali Rohár 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár 2015-03-29 12:57 ` [PATCH v2 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k Pali Rohár 2015-03-29 12:57 ` [lm-sensors] " Pali Rohár 2015-04-28 12:38 ` Greg Kroah-Hartman 2015-04-28 12:38 ` [lm-sensors] " Greg Kroah-Hartman 2015-04-29 11:41 ` [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree Pali Rohár 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár 2015-04-29 11:41 ` [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k Pali Rohár 2015-04-29 11:41 ` [lm-sensors] " Pali Rohár 2015-06-27 11:34 ` Gabriele Mazzotta 2015-06-27 11:34 ` [lm-sensors] " Gabriele Mazzotta 2015-06-27 12:47 ` Pali Rohár 2015-06-27 12:47 ` [lm-sensors] " Pali Rohár 2015-06-27 12:55 ` Gabriele Mazzotta 2015-06-27 12:55 ` [lm-sensors] " Gabriele Mazzotta 2015-06-27 13:01 ` Pali Rohár 2015-06-27 13:01 ` [lm-sensors] " Pali Rohár 2015-06-27 13:21 ` Gabriele Mazzotta 2015-06-27 13:21 ` [lm-sensors] " Gabriele Mazzotta 2015-04-29 12:07 ` [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree Greg Kroah-Hartman 2015-04-29 12:07 ` [lm-sensors] " Greg Kroah-Hartman 2015-03-31 3:32 ` [PATCH v2 0/2] i8k.c => dell-smm-hwmon.c Guenter Roeck 2015-03-31 3:32 ` [lm-sensors] " Guenter Roeck 2015-03-31 13:56 ` Greg Kroah-Hartman 2015-03-31 13:56 ` [lm-sensors] " Greg Kroah-Hartman 2015-04-09 14:02 ` Pali Rohár 2015-04-09 14:02 ` [lm-sensors] " Pali Rohár 2015-04-21 13:30 ` Pali Rohár 2015-04-21 13:30 ` [lm-sensors] " Pali Rohár 2015-04-21 13:40 ` Guenter Roeck 2015-04-21 13:40 ` [lm-sensors] " Guenter Roeck 2015-04-21 13:52 ` Greg Kroah-Hartman 2015-04-21 13:52 ` [lm-sensors] " Greg Kroah-Hartman 2015-04-21 15:24 ` Guenter Roeck 2015-04-21 15:24 ` [lm-sensors] " Guenter Roeck 2015-04-21 15:30 ` Greg Kroah-Hartman 2015-04-21 15:30 ` [lm-sensors] " Greg Kroah-Hartman 2015-04-27 18:39 ` Pali Rohár 2015-04-27 18:39 ` [lm-sensors] " Pali Rohár 2015-05-14 11:16 [PATCH v3 1/2] hwmon: Rename i8k driver to dell-smm-hwmon and move it to hwmon tree Pali Rohár 2015-05-14 11:16 ` [lm-sensors] " Pali Rohár 2015-05-14 11:16 ` [PATCH v3 2/2] hwmon: Allow to compile dell-smm-hwmon driver without /proc/i8k Pali Rohár 2015-05-14 11:16 ` [lm-sensors] " Pali Rohár 2015-05-21 11:42 ` Pali Rohár 2015-05-21 11:42 ` [lm-sensors] " Pali Rohár
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.