From patchwork Tue Apr 29 00:36:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 885999 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (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 E815E17A2E2; Tue, 29 Apr 2025 00:36:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745886989; cv=none; b=IQZRBvYsKtUhwGJ+e4hU8JNERcyKnRYKNtudUhkDPCK+hOnDn6lrLFfe7cLWsXnk6b1VgoA5KLvcChYX92TOLhJeyGEA5SROC7F2f0ExD1tPVad/EDVAZN1yoEvETH3RKguCqi1r7E1YZiOuyj2RfXAOKTPkaqOJAWNbzZBpqkM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745886989; c=relaxed/simple; bh=KRZF4AimC4ir70M6J+ICGlCcbbzHC9tV5OlMioEtp7o=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=f+vE8DcandhLTtq18BxI5+Da/t+joSnAxaWi8JRYQZ8uNhNA1nwthCj0uHoqg9LwDSPjlY2U8B103ZU6/Sp6rDqr7aZtJ5MdzMaLXyYHT4+4pMKS9Job6u6FzPFABfgTaS54FYwexAMG5rzlNb1SpL7Nf2uJK9lq32ht1tJS7YA= 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=VjWNSKdg; arc=none smtp.client-ip=212.227.17.22 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="VjWNSKdg" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745886978; x=1746491778; i=w_armin@gmx.de; bh=VGRq0MaqT5yVpxK/8Ryqn4LVg8ze7XpG9UtDh6/J4UU=; 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=VjWNSKdgZ6TrfpQPgS+UzcSx1SVx3HqP2MJ9XYW1aw/Ejup/WhQK1die3D/iwcgc k+pvi8HztQI7rljGdGu0v+xXRVaAMkGYT84eIDhjQGJy8LFPpz2/JcT0F7b6DWGaR EchNaIKns+LtZWPhwlClewSw0LBNFfKQU1iz8ptTxtiFT9dgrXDIgxJiXlsDqjqR8 YgSfGzTm5MnEHwisWixzKjc9F1OgowpLcDqL0RFExa5EzrDg1Re9/wQ9ZhqtZ6kjZ 3rirCZ4wHQLjRRd0R/ZvtXpIiSGecgoFtnvuHJrRHmNXCFRivGA9t2tPOIzC45Wg8 p7SPqxTvL+nEItxUMg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1M2O2Q-1uDOiC0xwM-00C7yM; Tue, 29 Apr 2025 02:36:18 +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 v2 1/4] power: supply: core: Add additional health status values Date: Tue, 29 Apr 2025 02:36:03 +0200 Message-Id: <20250429003606.303870-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:pdHDwMJ1+w0c4m6E6Wqxh/4mKPhG107SCRtPqrJUYYzltsf+xTl o1iLhupyEXzg9xmLNbKTRTkrvDpqZzPeX/vSwUtyJheaG44qgTZmLgm5TnFYYp9vbqMnqBX xnCi+V3kM0s+Pni1sHUDq6dILHk+yL2nGTgOYNVh5iVVVtiXhmhQI/Uy+gALC330IHilUtG hd04nU4YHKic9gLh4+kPw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:EfjctNjd2Y8=;F+rIxBWIZSKLzrunzhA2aa52RAg 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 TMbCjyKIMfPoPjy2JIMBGhXoj6xiV3mcBp 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 --- Changes since v1: - rename "Fuse blown" to "Blown fuse" - rename "Cell imbalanced" to "Cell imbalance" --- 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..be8be54b183d 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", "Blown fuse", "Cell imbalance" 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..2703ed1dd943 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_BLOWN_FUSE] = "Blown fuse", + [POWER_SUPPLY_HEALTH_CELL_IMBALANCE] = "Cell imbalance", }; static const char * const POWER_SUPPLY_TECHNOLOGY_TEXT[] = { diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 888824592953..69df3a452918 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_BLOWN_FUSE, + POWER_SUPPLY_HEALTH_CELL_IMBALANCE, }; enum { From patchwork Tue Apr 29 00:36:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Armin Wolf X-Patchwork-Id: 885998 Received: from mout.gmx.net (mout.gmx.net [212.227.17.22]) (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 3EF7C1B0430; Tue, 29 Apr 2025 00:36:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.22 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745886999; cv=none; b=O+NZfaVvz6UZMgEmgF9mcd5kHHClIOjkktDuyIx9BIAKw1k/8BQXtPm9kKOfJgf/2oloY+tU/TBj6i8YZAL1szWCLfXp03AtyoklboGtcfakszwA/mwpHADZCmemAuTBDJr9g2pTe+o1LzP+OvoyYN+kxgLIlsIlG2AQm8Movf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745886999; c=relaxed/simple; bh=VyAaQCwVTKyodHJbWRjjuyUH6q3W1KuHvM58oNnwBqY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=I4iq/PdqRz2elQAUZuu8Vfbhar1gEMWhbqRfixluCwFmz7e/5hUrdl4FufXvpaBugyPumeK7V3g/XwfKlhR3RToCM/Dm9Q7L7UKmgvNY9wIH/p49zrkwxnVkVXTGKAJHhhSrIaHcTHgTmt10iSISCEFi7MMRfEy++Rk1yJki8ig= 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=bsKvdV1x; arc=none smtp.client-ip=212.227.17.22 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="bsKvdV1x" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.de; s=s31663417; t=1745886985; x=1746491785; i=w_armin@gmx.de; bh=9Y2WQZ77zZCI4KFEbSyvqglWHM2SvgIsYOScYy2OBxs=; 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=bsKvdV1xY0ERV8GTqjS2/I7Rv2vXX2rqt+GAoCJA05Lt+vocH0MryefS8Xwu6BbZ Q3Sx/wGWsOnjdK0l8Bn+NaqSeUcvNxy6MYO+Xtuxg6ftW8wxzPZICl0Ok7vSCJaT3 I/v+Am0xpD6+jzsbY9MzTTUS8JQ4L7Ki5+WyKVeCKZ1QVL3E6ReN+YY6hlgTP+/wC fsE6JsP8L6bsGDvJhk6wJ9HaGyLk53rzNszAvKmTRwmlPNuDL7lQ3ztOe0fTuZ64r yK1FeXO7iXQzkCw6E/KhaModpVLG6d2v+d6YsG5XEOHD5i11hIX5R8qTFN/GR21nk uMTL7q53//Ha4kL4Fw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from mx-amd-b650.fritz.box ([87.177.78.219]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MGyxX-1uEnlb2rUh-00AUOd; Tue, 29 Apr 2025 02:36:24 +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 v2 4/4] platform/x86: dell-ddv: Expose the battery health to userspace Date: Tue, 29 Apr 2025 02:36:06 +0200 Message-Id: <20250429003606.303870-4-W_Armin@gmx.de> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250429003606.303870-1-W_Armin@gmx.de> References: <20250429003606.303870-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:QDUPF2bWhumT0YXmQVYjFCcbqylL2H/aMBOY5pvk+5mgRilIw4R T1Gs9KeKKNbOXTT6lABMCGHIe6LYFjBDBZTrJQvVSuQej+mVoNKkBl42Ef3tIs9shAjdBDL zpVY076K+KaAyoqQumSzrutJvN31noTnpwwDK8Ekww9QojvdpFXI/NyExGswjBX0D6jJimp yjWmIfUd5n8qp/4HpJz2Q== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:odmEQe451D4=;qBGKT834AgQ51PkQU9kdOhBWDbZ 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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..cb4e0c1b908e 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_BLOWN_FUSE; + return 0; + case MA_PERMANENT_FAILURE_CELL_IMBALANCE: + val->intval = POWER_SUPPLY_HEALTH_CELL_IMBALANCE; + 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,