From patchwork Fri Apr 25 23:15:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 885235 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D831A2980C0; Fri, 25 Apr 2025 23:15:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622940; cv=none; b=GQpAzCqDmBmJM+DhtSkCMB7+bknAMdeDq+3d6Y8k9BOCxYDxNMBd7XVJaVKE6CLts12U7Uy3F6pLxyYDnOLWjZLajzu3G1VD2thmws53tJ7sVaGJPeYwPNmGOvWQBor3T7HrviuCmeyjDmwnK6NexALvqi7XbSPWVtxG5uFFwD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622940; c=relaxed/simple; bh=sJvI5DDnIiRQGnkFxKkn+Cxq4BV8tpxPwmogGrRJ2iU=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=FcVemyKzTHWSpQW9PU8JsquJhtijxhVMg8p+XE8ws4TlATPlQt9uzGvE9nTrGFo9C3+M4KqsSg+ZZR2wrFA88F9AQ6zFSXyB1fG1Ufutwl+FXIWJ05lvq+cvK3i1eTzKHbaDCNYfTmdX/9p1VcCPuv0V6kdZOOe7sZlkauPkqv4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=jRUyLRPX; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="jRUyLRPX" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745622925; x=1746227725; i=w_armin@gmx.de; bh=0rUv43ETiMFe1enqLd91Ly5onlIfjRxpLnkIvgpn2VY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id: MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=jRUyLRPXfQKY9gFmlq+9qJKDGl2GwDXb2rdAhsSu8iKHiVsooKgva93hGfZk2D6r 1KGRAEgAhXMbt/CoKUBdQHv5WSelAz59pbyxO17a62ZpqSnaJlmB71uQZ01OvQsCz 2lWuQPDfJi9LUMJp9hZygDeDHPNHDaj7xrXGYVARChqCS75+adUWZeCk7cBwjM59n 602/W0A70vK4jvv12TC4CmCtRJMaEy+NxJcl68g3dqYQ8eJ+M3aszJfvOn8HEBzv9 hyWYKQ+WShiPLk82Zt5xAohie+1Mn5yAhrsWd3mHl15F8D6LZX3ofxiJKH7BgRnW1 6b10oxCAsxXZ7XjiXA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MFsUv-1uJCJW0nlP-002ARP; Sat, 26 Apr 2025 01:15:25 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com Cc: sre@kernel.org, platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/4] power: supply: core: Add additional health status values Date: Sat, 26 Apr 2025 01:15:15 +0200 Message-Id: <20250425231518.16125-1-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:6T8llgOJu3W46o/D8JtsZVrp5ZCggKDQ2iqZnGMoMjiYgHVW5UJ VCHP8NradG+Lcm0tcpGYmjM3jQP5cpymOUUZ6WGFebWyO4XSCKSwQVNmGmGZvg1emJC2wJz Z7fzKM6cksNMSuF8For7bYUP6AvR1RUfthfNAS3FiqCF2ruseHwYm8+wHXXQP/mT1R5Pi6Z IyhjaOeAg/7LX9D7B8teg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:k3znlxVlhyU=;hT8vuGbdE23+x1n6qDCFeTMXuk+ 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 Some batteries can signal when an internal fuse was blown. In such a case POWER_SUPPLY_HEALTH_DEAD is too vague for userspace applications to perform meaningful diagnostics. Additionally some batteries can also signal when some of their internal cells are imbalanced. In such a case returning POWER_SUPPLY_HEALTH_UNSPEC_FAILURE is again too vague for userspace applications to perform meaningful diagnostics. Add new health status values for both cases. Signed-off-by: Armin Wolf --- Documentation/ABI/testing/sysfs-class-power | 2 +- drivers/power/supply/power_supply_sysfs.c | 2 ++ include/linux/power_supply.h | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-class-power b/Documentation/ABI/testing/sysfs-class-power index 2a5c1a09a28f..e84a7349f55f 100644 --- a/Documentation/ABI/testing/sysfs-class-power +++ b/Documentation/ABI/testing/sysfs-class-power @@ -456,7 +456,7 @@ Description: "Over voltage", "Under voltage", "Unspecified failure", "Cold", "Watchdog timer expire", "Safety timer expire", "Over current", "Calibration required", "Warm", - "Cool", "Hot", "No battery" + "Cool", "Hot", "No battery", "Fuse blown", "Cell imbalanced" What: /sys/class/power_supply//precharge_current Date: June 2017 diff --git a/drivers/power/supply/power_supply_sysfs.c b/drivers/power/supply/power_supply_sysfs.c index edb058c19c9c..3a9c9cf55b30 100644 --- a/drivers/power/supply/power_supply_sysfs.c +++ b/drivers/power/supply/power_supply_sysfs.c @@ -110,6 +110,8 @@ static const char * const POWER_SUPPLY_HEALTH_TEXT[] = { [POWER_SUPPLY_HEALTH_COOL] = "Cool", [POWER_SUPPLY_HEALTH_HOT] = "Hot", [POWER_SUPPLY_HEALTH_NO_BATTERY] = "No battery", + [POWER_SUPPLY_HEALTH_FUSE_BLOWN] = "Fuse blown", + [POWER_SUPPLY_HEALTH_CELL_IMBALANCED] = "Cell imbalanced", }; static const char * const POWER_SUPPLY_TECHNOLOGY_TEXT[] = { diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 888824592953..36454df14bc4 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -71,6 +71,8 @@ enum { POWER_SUPPLY_HEALTH_COOL, POWER_SUPPLY_HEALTH_HOT, POWER_SUPPLY_HEALTH_NO_BATTERY, + POWER_SUPPLY_HEALTH_FUSE_BLOWN, + POWER_SUPPLY_HEALTH_CELL_IMBALANCED, }; enum { From patchwork Fri Apr 25 23:15:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 885236 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB2B7297A51; Fri, 25 Apr 2025 23:15:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.19 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622933; cv=none; b=bSJm16E0HJDBkYyxYv1BJBUtUh9aD598HyxTCHx+C7KEIooA2O7nYoFuPXPBPWzGDPUCP1xixQoqyQ2skv119GJrIoxl6AOZmEfhZliIFZ6TQhtb/6FgEatudBJwj2RerAPnd4NBR0HzspIbaviKZT//k8OBlu46ZOWimulcNZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622933; c=relaxed/simple; bh=B1bGCnb0p0EausLCfNDFBg5v1GfoFoL2EjWsSCjsRyY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=CZDAiMwcBpe93LFNsoqV75i2++XpNlL6Gabp0F5atOPSUZ/HArTlXoDOE34XxYuTRTh1bzKlOIo9KEaDOc2NWYn6SBnlMhV5Av5iER1quiBlRc5q2i3ZALM9x5o+eE8xucjSYuxI3L5xfSchRW71AfUlIxb9iAMX1GdASIuwnuM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=eIP9t2hU; arc=none smtp.client-ip=212.227.15.19 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="eIP9t2hU" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745622927; x=1746227727; i=w_armin@gmx.de; bh=kp0fA/Y9blrQcx5RK3lNRwlX0u7H+VQ9eRNUaAdnd9g=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=eIP9t2hUoMJDGMFP4Mweih39u53yweFXcvQQsh6kfaOrh/uNjUjEbZiaqwrOrjNk hVGh50cJi6if9zMKVu1vkyiBOhB0tS2pRoAXj5deW7PMnq5rUSAySkVBMBuZWaJ8o hymv2miMbUSFiXRHaJ5SggK06N0exQ3msTmM/8XMfodb7dro7ibdT88LNADt7IL6m uGfDSKQoe3mN9zvRWLviaLc6zh37XJiORYSCTlhknIZuD3RtYdXIZgmg9JQH0oY+5 9PVfiAENM4xBHquxVq82CZAMFljiLnsPLRdlSm9zV0OE+dt+NAxbq16+7cNTSV7Zx ylw2vrlQ65XpHfOXFQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MPGW7-1uRU3O2Io9-00S0V5; Sat, 26 Apr 2025 01:15:27 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com Cc: sre@kernel.org, platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/4] platform/x86: dell-ddv: Implement the battery matching algorithm Date: Sat, 26 Apr 2025 01:15:16 +0200 Message-Id: <20250425231518.16125-2-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250425231518.16125-1-W_Armin@gmx.de> References: <20250425231518.16125-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:lbGfmQUP8rggWftFOjnne6fH8S9YfhL6ebzupkQOu/NmCxe+GgQ CPB7AadMCnQheG3GnVvUztFFv3omYDbnV70IS8ODPRMAQc8UaGtrD/FJV8YdIvpDZPFed+a cO9ZlTD5RG+t1yG990KyZjlP76y3iUkgVGJmMKQepvlP32V70SWqqQsXFF4ZQeBDuaT2INo cl/6LXEfgOlWC2w/ayZ/A== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:83YDHOblOio=;u8YmvK2AiwStFlcdr8K+LeXk8iR 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 Since commit db0a507cb24d ("ACPICA: Update integer-to-hex-string conversions") the battery serial number is no longer distorted, allowing us to finally implement the battery matching algorithm. The battery matchign algorithm is necessary when translating between ACPI batteries and the associated indices used by the WMI interface based on the battery serial number. Since this serial number can only be retrieved when the battery is present we cannot perform the initial translation inside dell_wmi_ddv_add_battery() because the ACPI battery might be absent at this point in time. Introduce dell_wmi_ddv_battery_translate() which implements the battery matching algorithm and replaces dell_wmi_ddv_battery_index(). Also implement a translation cache for caching previous translations between ACPI batteries and indices. This is necessary because performing a translation can be very expensive. Tested on a Dell Inspiron 3505. Signed-off-by: Armin Wolf --- Documentation/wmi/devices/dell-wmi-ddv.rst | 8 -- drivers/platform/x86/dell/dell-wmi-ddv.c | 101 ++++++++++++++++++--- 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/Documentation/wmi/devices/dell-wmi-ddv.rst b/Documentation/wmi/devices/dell-wmi-ddv.rst index e0c20af30948..f10a623acca1 100644 --- a/Documentation/wmi/devices/dell-wmi-ddv.rst +++ b/Documentation/wmi/devices/dell-wmi-ddv.rst @@ -260,14 +260,6 @@ Some machines like the Dell Inspiron 3505 only support a single battery and thus ignore the battery index. Because of this the driver depends on the ACPI battery hook mechanism to discover batteries. -.. note:: - The ACPI battery matching algorithm currently used inside the driver is - outdated and does not match the algorithm described above. The reasons for - this are differences in the handling of the ToHexString() ACPI opcode between - Linux and Windows, which distorts the serial number of ACPI batteries on many - machines. Until this issue is resolved, the driver cannot use the above - algorithm. - Reverse-Engineering the DDV WMI interface ========================================= diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c index f27739da380f..711639001be4 100644 --- a/drivers/platform/x86/dell/dell-wmi-ddv.c +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c @@ -39,6 +39,9 @@ #define DELL_DDV_SUPPORTED_VERSION_MAX 3 #define DELL_DDV_GUID "8A42EA14-4F2A-FD45-6422-0087F7A7E608" +/* Battery indices 1, 2 and 3 */ +#define DELL_DDV_NUM_BATTERIES 3 + #define DELL_EPPID_LENGTH 20 #define DELL_EPPID_EXT_LENGTH 23 @@ -105,6 +108,8 @@ struct dell_wmi_ddv_sensors { struct dell_wmi_ddv_data { struct acpi_battery_hook hook; struct device_attribute eppid_attr; + struct mutex translation_cache_lock; /* Protects the translation cache */ + struct power_supply *translation_cache[DELL_DDV_NUM_BATTERIES]; struct dell_wmi_ddv_sensors fans; struct dell_wmi_ddv_sensors temps; struct wmi_device *wdev; @@ -639,15 +644,78 @@ static int dell_wmi_ddv_hwmon_add(struct dell_wmi_ddv_data *data) return ret; } -static int dell_wmi_ddv_battery_index(struct acpi_device *acpi_dev, u32 *index) +static int dell_wmi_ddv_battery_translate(struct dell_wmi_ddv_data *data, + struct power_supply *battery, u32 *index) { - const char *uid_str; + u32 serial_dec, serial_hex, serial; + union power_supply_propval val; + int ret; + + guard(mutex)(&data->translation_cache_lock); + + for (int i = 0; i < ARRAY_SIZE(data->translation_cache); i++) { + if (data->translation_cache[i] == battery) { + dev_dbg(&data->wdev->dev, "Translation cache hit for battery index %u\n", + i + 1); + *index = i + 1; + return 0; + } + } + + dev_dbg(&data->wdev->dev, "Translation cache miss\n"); + + /* Perform a translation between a ACPI battery and a battery index */ + + ret = power_supply_get_property(battery, POWER_SUPPLY_PROP_SERIAL_NUMBER, &val); + if (ret < 0) + return ret; + + /* + * Some devices display the serial number of the ACPI battery (string!) as a decimal + * number while other devices display it as a hexadecimal number. Because of this we + * have to check both cases. + */ + ret = kstrtou32(val.strval, 16, &serial_hex); + if (ret < 0) + return ret; /* Should never fail */ + + ret = kstrtou32(val.strval, 10, &serial_dec); + if (ret < 0) + serial_dec = 0; /* Can fail, thus we only mark serial_dec as invalid */ + + for (int i = 0; i < ARRAY_SIZE(data->translation_cache); i++) { + ret = dell_wmi_ddv_query_integer(data->wdev, DELL_DDV_BATTERY_SERIAL_NUMBER, i + 1, + &serial); + if (ret < 0) + return ret; - uid_str = acpi_device_uid(acpi_dev); - if (!uid_str) - return -ENODEV; + /* A serial number of 0 signals that this index is not associated with a battery */ + if (!serial) + continue; - return kstrtou32(uid_str, 10, index); + if (serial == serial_dec || serial == serial_hex) { + dev_dbg(&data->wdev->dev, "Translation cache update for battery index %u\n", + i + 1); + data->translation_cache[i] = battery; + *index = i + 1; + return 0; + } + } + + return -ENODEV; +} + +static void dell_wmi_battery_invalidate(struct dell_wmi_ddv_data *data, + struct power_supply *battery) +{ + guard(mutex)(&data->translation_cache_lock); + + for (int i = 0; i < ARRAY_SIZE(data->translation_cache); i++) { + if (data->translation_cache[i] == battery) { + data->translation_cache[i] = NULL; + return; + } + } } static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, char *buf) @@ -657,7 +725,7 @@ static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, cha u32 index; int ret; - ret = dell_wmi_ddv_battery_index(to_acpi_device(dev->parent), &index); + ret = dell_wmi_ddv_battery_translate(data, to_power_supply(dev), &index); if (ret < 0) return ret; @@ -684,7 +752,7 @@ static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct powe u32 index, value; int ret; - ret = dell_wmi_ddv_battery_index(to_acpi_device(psy->dev.parent), &index); + ret = dell_wmi_ddv_battery_translate(data, psy, &index); if (ret < 0) return ret; @@ -719,13 +787,12 @@ static const struct power_supply_ext dell_wmi_ddv_extension = { static int dell_wmi_ddv_add_battery(struct power_supply *battery, struct acpi_battery_hook *hook) { struct dell_wmi_ddv_data *data = container_of(hook, struct dell_wmi_ddv_data, hook); - u32 index; int ret; - /* Return 0 instead of error to avoid being unloaded */ - ret = dell_wmi_ddv_battery_index(to_acpi_device(battery->dev.parent), &index); - if (ret < 0) - return 0; + /* + * We cannot do the battery matching here since the battery might be absent, preventing + * us from reading the serial number. + */ ret = device_create_file(&battery->dev, &data->eppid_attr); if (ret < 0) @@ -749,11 +816,19 @@ static int dell_wmi_ddv_remove_battery(struct power_supply *battery, struct acpi device_remove_file(&battery->dev, &data->eppid_attr); power_supply_unregister_extension(battery, &dell_wmi_ddv_extension); + dell_wmi_battery_invalidate(data, battery); + return 0; } static int dell_wmi_ddv_battery_add(struct dell_wmi_ddv_data *data) { + int ret; + + ret = devm_mutex_init(&data->wdev->dev, &data->translation_cache_lock); + if (ret < 0) + return ret; + data->hook.name = "Dell DDV Battery Extension"; data->hook.add_battery = dell_wmi_ddv_add_battery; data->hook.remove_battery = dell_wmi_ddv_remove_battery; From patchwork Fri Apr 25 23:15:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 884701 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D49462973C9; Fri, 25 Apr 2025 23:15:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622942; cv=none; b=E5GaI6TOiBWj/ETrqcs8s8cni91AW9cyA3ptC5Qm/qgHRjqjGmSdGw5jy2D3MCOHU5dPUFf0/XT4jMbukgBYYiPMiNSDa35k4YkkmpAeaB8WDtYYYzEwLbvy2SEXDHnyFnAB4+FSHEoD/0Q3VnH6/nYCQxLHn3vhbCLQJczc5N8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622942; c=relaxed/simple; bh=2G13UdckMVoNWyQ2KkNbIsqMt2eJ/selT3Q4mTX/i9M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Wjfnw/pr3S20WTTMozBklNs4vtT072nrgiqLVR9zN2XXYYRUCdmMBXWSOgQ4bYSSbQ9jr8FhRnUCwQffa9E1GqUTUSz6CtRCVH6/L0Zydnx0en5oU9H9twfqbj/uJWIrZRIMWZ/oGMWbrceu0kCzlfhe8KmUR/0TuJtteDQYzPE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=GmhBLh9y; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="GmhBLh9y" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745622929; x=1746227729; i=w_armin@gmx.de; bh=g9WnqqVjdggWi2YjHHXf4QuvT/xttrq0L//6veEdl2w=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=GmhBLh9y+Lx4LXXZmffR61yna+dFhQw7Y7nS10sBrobSMmq4OAfo8nsWRUg9rSU6 JzmikJTjrFbM49VECjkIrLYXS8ajHY/ctDP0qVdhXqTCqAyE+1euVeyXKlTFlUv80 +Qa/ji7xx+e+F7uNrzyM1BNyX5AoXfkJbl+dKy8l0Ssfqy6hFJCCbG+qWIs/V71UC hd5O/8+FdNs8C7/0a7xTu3k2qZ2RrDwmjSw57iTESyd4LIHLFuIR3ek6manZlDe4+ GgEpTFbjtTaJdyXqlyPwVYPPyUpotgLwWx//pRvMAx7m+1gzQ18gG4a55Wkoch2G/ R747PtQPAegnkv4Fkg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1M72sP-1uAMbm0Y6Z-00AtPm; Sat, 26 Apr 2025 01:15:29 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com Cc: sre@kernel.org, platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/4] platform/x86: dell-ddv: Expose the battery manufacture date to userspace Date: Sat, 26 Apr 2025 01:15:17 +0200 Message-Id: <20250425231518.16125-3-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250425231518.16125-1-W_Armin@gmx.de> References: <20250425231518.16125-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:9Fl5XihV7tB/KzPDEMJfnthSOvmMjmbqtsEJYWwJpnRoGwbxeQV jbt/krKFD6nIRqYhcmg8T0h8Kkh0xt26J8q2YoZkVZxtEqD8oeb/uzk/fh3jRnmLFgzG0eE RqqxRvUAXNTOcpgo0AWd7FBz5sZBP+9cyUjVDKSg+WFIIN4706I+vfQiFxTQjVeB7A83Afe Gkl76k49XqsIWH399K+qA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:LZQ3ipiIRCY=;/u8YtIKroiqxdGz3C58soq7gwSI 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 xSO+7GFk+WQZj7t41Q35/Hd2qGbNoY/c2U The manufacture date of a given battery is exposed over the Dell DDV WMI interface using the "BatteryManufactureDate" WMI method. The resulting data contains the manufacture date of the battery encoded inside a 16-bit value as described in the Smart Battery Data Specification. Expose this value to userspace using the power supply extension interface. Tested on a Dell Inspiron 3505. Signed-off-by: Armin Wolf --- Documentation/wmi/devices/dell-wmi-ddv.rst | 3 -- drivers/platform/x86/dell/dell-wmi-ddv.c | 58 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Documentation/wmi/devices/dell-wmi-ddv.rst b/Documentation/wmi/devices/dell-wmi-ddv.rst index f10a623acca1..41c553d5c77d 100644 --- a/Documentation/wmi/devices/dell-wmi-ddv.rst +++ b/Documentation/wmi/devices/dell-wmi-ddv.rst @@ -118,9 +118,6 @@ The date is encoded in the following manner: - bits 5 to 8 contain the manufacture month. - bits 9 to 15 contain the manufacture year biased by 1980. -.. note:: - The data format needs to be verified on more machines. - WMI method BatterySerialNumber() -------------------------------- diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c index 711639001be4..8bd3ff76bb91 100644 --- a/drivers/platform/x86/dell/dell-wmi-ddv.c +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c @@ -8,6 +8,7 @@ #define pr_format(fmt) KBUILD_MODNAME ": " fmt #include +#include #include #include #include @@ -42,6 +43,10 @@ /* Battery indices 1, 2 and 3 */ #define DELL_DDV_NUM_BATTERIES 3 +#define SBS_MANUFACTURE_YEAR_MASK GENMASK(15, 9) +#define SBS_MANUFACTURE_MONTH_MASK GENMASK(8, 5) +#define SBS_MANUFACTURE_DAY_MASK GENMASK(4, 0) + #define DELL_EPPID_LENGTH 20 #define DELL_EPPID_EXT_LENGTH 23 @@ -744,6 +749,52 @@ static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, cha return ret; } +static int dell_wmi_ddv_get_manufacture_date(struct dell_wmi_ddv_data *data, u32 index, + enum power_supply_property psp, + union power_supply_propval *val) +{ + u16 year, month, day; + u32 value; + int ret; + + ret = dell_wmi_ddv_query_integer(data->wdev, DELL_DDV_BATTERY_MANUFACTURE_DATE, + index, &value); + + if (ret < 0) + return ret; + + if (value > U16_MAX) + return -ENXIO; + + /* + * Some devices report a invalid manufacture date value + * like 0.0.1980. Because of this we have to check the + * whole value before exposing parts of it to user space. + */ + year = FIELD_GET(SBS_MANUFACTURE_YEAR_MASK, value) + 1980; + month = FIELD_GET(SBS_MANUFACTURE_MONTH_MASK, value); + if (month < 1 || month > 12) + return -ENODATA; + + day = FIELD_GET(SBS_MANUFACTURE_DAY_MASK, value); + if (day < 1 || day > 31) + return -ENODATA; + + switch (psp) { + case POWER_SUPPLY_PROP_MANUFACTURE_YEAR: + val->intval = year; + return 0; + case POWER_SUPPLY_PROP_MANUFACTURE_MONTH: + val->intval = month; + return 0; + case POWER_SUPPLY_PROP_MANUFACTURE_DAY: + val->intval = day; + return 0; + default: + return -EINVAL; + } +} + static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct power_supply_ext *ext, void *drvdata, enum power_supply_property psp, union power_supply_propval *val) @@ -768,6 +819,10 @@ static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct powe */ val->intval = value - 2732; return 0; + case POWER_SUPPLY_PROP_MANUFACTURE_YEAR: + case POWER_SUPPLY_PROP_MANUFACTURE_MONTH: + case POWER_SUPPLY_PROP_MANUFACTURE_DAY: + return dell_wmi_ddv_get_manufacture_date(data, index, psp, val); default: return -EINVAL; } @@ -775,6 +830,9 @@ static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct powe static const enum power_supply_property dell_wmi_ddv_properties[] = { POWER_SUPPLY_PROP_TEMP, + POWER_SUPPLY_PROP_MANUFACTURE_YEAR, + POWER_SUPPLY_PROP_MANUFACTURE_MONTH, + POWER_SUPPLY_PROP_MANUFACTURE_DAY, }; static const struct power_supply_ext dell_wmi_ddv_extension = { From patchwork Fri Apr 25 23:15:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 884702 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AEF7E2973C9; Fri, 25 Apr 2025 23:15:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622935; cv=none; b=q5niglJjDHPySYULJmJehPJeqVw2K9VkXFXRtI2v88LzU94ea8cmjmbkUxMpfoxXvrlw8IvR72smANOCiMkWzPU5fX5kcK18Bo/KUw7LbILrYejydWvBWwZF1hDnWqfBEMdL1iUyAxPdXt+bpfpoKa6bM4HRlUDe97Kh3KjYXEs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745622935; c=relaxed/simple; bh=agqt7GnsgWdQqfpoBb27a5IyqsFathLz81XGrlkmILY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sNttKxpqLKurX/dueOV9amDlRim0frVFxnYC30Xl2RTeFbErp9d6PA1ooG7XtVTuYzKLFM0PSHYc7DFQH2045ldRay7028tECfW/9/9TBcK7I0fn9ma7dZ1ClNnXm8JTro1EXRuj9jAH4E7G0kWVKIhkMOgYigmr2LrBhVV+gI0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de; spf=pass smtp.mailfrom=gmx.de; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b=YybSCcCA; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.de header.i=w_armin@gmx.de header.b="YybSCcCA" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745622930; x=1746227730; i=w_armin@gmx.de; bh=xnsMDjvgPbdTHpCKWeLTgevixuKms/TZceRGSNGM+5M=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=YybSCcCAHDmN+kb2nHGMaOmO0+d7/4ejIItT72BhgojCDmyYwNUo5PDYo+hS29Sw yt+CbZ54Zl4UBM1wosSzokmHthXtgcJrIH+DtJqm4LRF61/O9CoyX47ZGjia2cVuT w12+mcsg/BHDFIv4+LC2Pky5XHQTNEspFdGxrCRbtErmalBL/gqe1Yti/ylFpmM/h h3SER6mWVkJXpttscm6tEYmEsuMfl7bxxymlmCu5vWlFDoutIOA1T/ruZlO7Te+EK /w5jzBcb6UX+n+GhJtGA4TL4ztNEqpNbQq7FHBY14ocI2w9y7miKzW4JZAbuuUlQW mo1Mwqy7Cc3rKIKhsQ== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1N7zFZ-1vDUn32c1j-00twSs; Sat, 26 Apr 2025 01:15:30 +0200 From: Armin Wolf To: hdegoede@redhat.com, ilpo.jarvinen@linux.intel.com Cc: sre@kernel.org, platform-driver-x86@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 4/4] platform/x86: dell-ddv: Expose the battery health to userspace Date: Sat, 26 Apr 2025 01:15:18 +0200 Message-Id: <20250425231518.16125-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250425231518.16125-1-W_Armin@gmx.de> References: <20250425231518.16125-1-W_Armin@gmx.de> Precedence: bulk X-Mailing-List: linux-pm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:luIGGYBE1oVn85a1evF4PHaV+C2uYLVTGZIr8ypz32JaV29xHQ3 HG2MUes+xZr8NvO/qbH1osZK6SOUbBskobhtqw1/yZ8IHfba+CEPfO39wzIOOjflCd99pPH H8932SkYWCkWBCI8uMlw8fXMS60y/t7W8sLuuxux4JT2U1yVZoEro9wMl8Wd2ctf6D6oS6e A8xfNB80UcXxrHGPDbAzQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:J2DJt2bBbqU=;4cXlNlSmtG1aQCH/aKnK1LSrx2Z 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 The health of a given battery is exposed over the Dell DDV WMI interface using the "BatteryManufactureAceess" WMI method. The resulting data contains, among other data, the health status of the battery. Expose this value to userspace using the power supply extension interface. Tested on a Dell Inspiron 3505. Signed-off-by: Armin Wolf --- Documentation/wmi/devices/dell-wmi-ddv.rst | 35 ++++++++- drivers/platform/x86/dell/dell-wmi-ddv.c | 89 ++++++++++++++++++++++ 2 files changed, 123 insertions(+), 1 deletion(-) diff --git a/Documentation/wmi/devices/dell-wmi-ddv.rst b/Documentation/wmi/devices/dell-wmi-ddv.rst index 41c553d5c77d..109d4c5c922e 100644 --- a/Documentation/wmi/devices/dell-wmi-ddv.rst +++ b/Documentation/wmi/devices/dell-wmi-ddv.rst @@ -150,7 +150,40 @@ Returns the voltage flow of the battery in mV as an u16. WMI method BatteryManufactureAccess() ------------------------------------- -Returns a manufacture-defined value as an u16. +Returns the health status of the battery as a u16. +The health status encoded in the following manner: + + - the third nibble contains the general failure mode + - the fourth nibble contains the specific failure code + +Valid failure modes are: + + - permanent failure (``0x9``) + - overheat failure (``0xa``) + - overcurrent failure (``0xb``) + +All other failure modes are to be considered normal. + +The following failure codes are valid for a permanent failure: + + - fuse blown (``0x0``) + - cell imbalance (``0x1``) + - overvoltage (``0x2``) + - fet failure (``0x3``) + +The last two bits of the failure code are to be ignored when the battery +signals a permanent failure. + +The following failure codes a valid for a overheat failure: + + - overheat at start of charging (``0x5``) + - overheat during charging (``0x7``) + - overheat during discharging (``0x8``) + +The following failure codes are valid for a overcurrent failure: + + - overcurrent during charging (``0x6``) + - overcurrent during discharging (``0xb``) WMI method BatteryRelativeStateOfCharge() ----------------------------------------- diff --git a/drivers/platform/x86/dell/dell-wmi-ddv.c b/drivers/platform/x86/dell/dell-wmi-ddv.c index 8bd3ff76bb91..59e1a8e9f8c8 100644 --- a/drivers/platform/x86/dell/dell-wmi-ddv.c +++ b/drivers/platform/x86/dell/dell-wmi-ddv.c @@ -47,6 +47,26 @@ #define SBS_MANUFACTURE_MONTH_MASK GENMASK(8, 5) #define SBS_MANUFACTURE_DAY_MASK GENMASK(4, 0) +#define MA_FAILURE_MODE_MASK GENMASK(11, 8) +#define MA_FAILURE_MODE_PERMANENT 0x9 +#define MA_FAILURE_MODE_OVERHEAT 0xA +#define MA_FAILURE_MODE_OVERCURRENT 0xB + +#define MA_PERMANENT_FAILURE_CODE_MASK GENMASK(13, 12) +#define MA_PERMANENT_FAILURE_FUSE_BLOWN 0x0 +#define MA_PERMANENT_FAILURE_CELL_IMBALANCE 0x1 +#define MA_PERMANENT_FAILURE_OVERVOLTAGE 0x2 +#define MA_PERMANENT_FAILURE_FET_FAILURE 0x3 + +#define MA_OVERHEAT_FAILURE_CODE_MASK GENMASK(15, 12) +#define MA_OVERHEAT_FAILURE_START 0x5 +#define MA_OVERHEAT_FAILURE_CHARGING 0x7 +#define MA_OVERHEAT_FAILURE_DISCHARGING 0x8 + +#define MA_OVERCURRENT_FAILURE_CODE_MASK GENMASK(15, 12) +#define MA_OVERCURRENT_FAILURE_CHARGING 0x6 +#define MA_OVERCURRENT_FAILURE_DISCHARGING 0xB + #define DELL_EPPID_LENGTH 20 #define DELL_EPPID_EXT_LENGTH 23 @@ -749,6 +769,72 @@ static ssize_t eppid_show(struct device *dev, struct device_attribute *attr, cha return ret; } +static int dell_wmi_ddv_get_health(struct dell_wmi_ddv_data *data, u32 index, + union power_supply_propval *val) +{ + u32 value, code; + int ret; + + ret = dell_wmi_ddv_query_integer(data->wdev, DELL_DDV_BATTERY_MANUFACTURER_ACCESS, index, + &value); + if (ret < 0) + return ret; + + switch (FIELD_GET(MA_FAILURE_MODE_MASK, value)) { + case MA_FAILURE_MODE_PERMANENT: + code = FIELD_GET(MA_PERMANENT_FAILURE_CODE_MASK, value); + switch (code) { + case MA_PERMANENT_FAILURE_FUSE_BLOWN: + val->intval = POWER_SUPPLY_HEALTH_FUSE_BLOWN; + return 0; + case MA_PERMANENT_FAILURE_CELL_IMBALANCE: + val->intval = POWER_SUPPLY_HEALTH_CELL_IMBALANCED; + return 0; + case MA_PERMANENT_FAILURE_OVERVOLTAGE: + val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + return 0; + case MA_PERMANENT_FAILURE_FET_FAILURE: + val->intval = POWER_SUPPLY_HEALTH_DEAD; + return 0; + default: + dev_notice_once(&data->wdev->dev, "Unknown permanent failure code %u\n", + code); + val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; + return 0; + } + case MA_FAILURE_MODE_OVERHEAT: + code = FIELD_GET(MA_OVERHEAT_FAILURE_CODE_MASK, value); + switch (code) { + case MA_OVERHEAT_FAILURE_START: + case MA_OVERHEAT_FAILURE_CHARGING: + case MA_OVERHEAT_FAILURE_DISCHARGING: + val->intval = POWER_SUPPLY_HEALTH_OVERHEAT; + return 0; + default: + dev_notice_once(&data->wdev->dev, "Unknown overheat failure code %u\n", + code); + val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; + return 0; + } + case MA_FAILURE_MODE_OVERCURRENT: + code = FIELD_GET(MA_OVERCURRENT_FAILURE_CODE_MASK, value); + switch (code) { + case MA_OVERCURRENT_FAILURE_CHARGING: + case MA_OVERCURRENT_FAILURE_DISCHARGING: + val->intval = POWER_SUPPLY_HEALTH_OVERCURRENT; + return 0; + default: + dev_notice_once(&data->wdev->dev, "Unknown overcurrent failure code %u\n", + code); + val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; + return 0; + } + default: + val->intval = POWER_SUPPLY_HEALTH_GOOD; + return 0; + } +} + static int dell_wmi_ddv_get_manufacture_date(struct dell_wmi_ddv_data *data, u32 index, enum power_supply_property psp, union power_supply_propval *val) @@ -808,6 +894,8 @@ static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct powe return ret; switch (psp) { + case POWER_SUPPLY_PROP_HEALTH: + return dell_wmi_ddv_get_health(data, index, val); case POWER_SUPPLY_PROP_TEMP: ret = dell_wmi_ddv_query_integer(data->wdev, DELL_DDV_BATTERY_TEMPERATURE, index, &value); @@ -829,6 +917,7 @@ static int dell_wmi_ddv_get_property(struct power_supply *psy, const struct powe } static const enum power_supply_property dell_wmi_ddv_properties[] = { + POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_MANUFACTURE_YEAR, POWER_SUPPLY_PROP_MANUFACTURE_MONTH,