Commit c7891884 authored by Armin Wolf's avatar Armin Wolf Committed by Hans de Goede

platform/x86: dell-ddv: Warn if ePPID has a suspicious length

On some systems (like the Dell Inspiron 3505), the acpi operation
region holding the ePPID string is two bytes too short, causing
acpi functions like ToString() to omit the last two bytes.
This does not happen on Windows, supposedly due to their implementation
of ToString() ignoring buffer boundaries.
Inform users if the ePPID length differs from the Dell specification
so they can complain to Dell to fix their BIOS.

Tested on a Dell Inspiron 3505.
Signed-off-by: default avatarArmin Wolf <W_Armin@gmx.de>
Link: https://lore.kernel.org/r/20221102212336.380257-2-W_Armin@gmx.deReviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 84fa20c2
...@@ -10,12 +10,14 @@ ...@@ -10,12 +10,14 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/dev_printk.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/kstrtox.h> #include <linux/kstrtox.h>
#include <linux/math.h> #include <linux/math.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/limits.h> #include <linux/limits.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/printk.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/sysfs.h> #include <linux/sysfs.h>
#include <linux/wmi.h> #include <linux/wmi.h>
...@@ -27,6 +29,9 @@ ...@@ -27,6 +29,9 @@
#define DELL_DDV_SUPPORTED_INTERFACE 2 #define DELL_DDV_SUPPORTED_INTERFACE 2
#define DELL_DDV_GUID "8A42EA14-4F2A-FD45-6422-0087F7A7E608" #define DELL_DDV_GUID "8A42EA14-4F2A-FD45-6422-0087F7A7E608"
#define DELL_EPPID_LENGTH 20
#define DELL_EPPID_EXT_LENGTH 23
enum dell_ddv_method { enum dell_ddv_method {
DELL_DDV_BATTERY_DESIGN_CAPACITY = 0x01, DELL_DDV_BATTERY_DESIGN_CAPACITY = 0x01,
DELL_DDV_BATTERY_FULL_CHARGE_CAPACITY = 0x02, DELL_DDV_BATTERY_FULL_CHARGE_CAPACITY = 0x02,
...@@ -196,6 +201,10 @@ static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, cha ...@@ -196,6 +201,10 @@ static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, cha
if (ret < 0) if (ret < 0)
return ret; return ret;
if (obj->string.length != DELL_EPPID_LENGTH && obj->string.length != DELL_EPPID_EXT_LENGTH)
dev_info_once(&data->wdev->dev, FW_INFO "Suspicious ePPID length (%d)\n",
obj->string.length);
ret = sysfs_emit(buf, "%s\n", obj->string.pointer); ret = sysfs_emit(buf, "%s\n", obj->string.pointer);
kfree(obj); kfree(obj);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment