From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0E741BE251; Sat, 29 Mar 2025 07:32:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233581; cv=none; b=HpoJXPztI2dcziMS/2w+AxcxCISPccPybdpUs1nuK53KU0g5zFRhiI5xXO8zRJMx7HjbYYN1Ho6lwsU8BQx5V2oL89vucd5BFmZVLADDgUJz8RiMYZzOdABn8zwv65pa4HapFZlzxhkLFi1tGqCJ3fcfK7fY+Kd1qDRvRSABMCo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233581; c=relaxed/simple; bh=SIjn55+8i4nP2Ou/1nvbjV5uMb/aJaClwoP40B/blXA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d7F9sRB6Qrbz7m4ZSszD++5sFQA7V1t6SIdt2aRezJPC7qnk2nGzUSlw0OuC478+GsA60ERuXScYS4G7epGgFhu67alfe4SLlPT+eavkrTByA1CuOsZDyNk3dr1MGDmsUPKKEWuC4wr4wvb6ZYXqGHMS9WxJnSZwa++u3+tF4Uw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GEmoCjBq; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GEmoCjBq" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-22580c9ee0aso63011935ad.2; Sat, 29 Mar 2025 00:32:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233579; x=1743838379; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=akEwumnhR/FSOTou0EqvfVhmLsUZjGHsqsaUnofdLME=; b=GEmoCjBqqd/CrpBzv6T7t98Zk/g5cphoutAdB4UAVQuDnbNtkZ4rGDRUn+64f7vVQY SD3oGzg2Y/NEI85+75X4sROWaawIGfDxmfXMdpNYYSTCloUKmidYNxt/kWG/xG6c1ZyO F/uK/CQdxctTRoRmZud/mKF1tggZkaTnNRNdEOpq/7xRQtooxxZjuism+ae+2900Cox1 ch18UY7BBVieF099v9nH93SWtubNmzyB5Uk77Zk8ot3+c+lSgqR1KvOaxECdRO6/lASi qlZpz3wrCe6yBmTLFqsba5LQb1IbKOop3c6Qx5yGcXj6gMWu+1jWNk/FpKcLDha4fcEP AjEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233579; x=1743838379; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=akEwumnhR/FSOTou0EqvfVhmLsUZjGHsqsaUnofdLME=; b=dGa4xfZuPupxWCSu0Ld8VEACwgte7ErJR6m8ZOXqBhQGjx7W7XdplDWSwhVLpbMNBV y2ebFAq0H+TAIlBCVxC5lzDieemzeniM1F1ho77QEKfblxrG+sJ0RQ4lnFBT+hk4BOJ9 iRV7XUrBc24tbqvsGKxm4YELbEmLSLuOENY4FzjGQDzdivLn1xqZVY2p+LfQEGStODV7 PhShgGQh1b0Km83K9c1gTgVLnKD2t+KvkaoVGYVnNY/LDsZJUm8qJLjEhamEJxgbec3C 9oprJnHJpWSEnoQ0j83ot2c2G8Zjw5ECvvO2rpUUlM+ZaCuf8C3utiuHFU3t44lXEvl1 Udmg== X-Forwarded-Encrypted: i=1; AJvYcCWBbVJjl4YRCsaECEfGZuw3d2xurSo75IPnklqQ5GQgg5SU1w/QYBT0kxj/3Ig6KPzzjFLkLAffMaXaQ5qrhqTqu5IlIg==@vger.kernel.org, AJvYcCWgMpwuuDG9GyGnfBzsz8K/laXdt7r8ra/xbsgwZ8UcHmoUos6HhGSoQFojrk7eFfQKZqMDz81nGPLtT/E=@vger.kernel.org X-Gm-Message-State: AOJu0YzXDddKPO1Z/Bqflh2r8qaF/r67Wtn0sLiMFduoQ4P8XRPqobWB bvmEP/6sSR9FQfDh5lHfAhE1x4Emt3IUHY5VA4aLYOj0mTceWFdGHlfSVw== X-Gm-Gg: ASbGnctz4dMtclRWdRsLYgbCf0vlnZLs8lWYxGIGTrB5d3vTN57KVrcD4WEqrh7l2ri wUIsBxX+3z9BYO3Rb8G7gE3KEs0n8hJ049maGIgQWffEh4hA20a//t8uckZPLduUCmB6JIuq2wr URIQbFoua4FiwUbKatc7FHW3JGSnMUHJYpPhEnAqKectE09sEod/ZvaEkQ9/Wv8MJ4h2StFWyQG g9zVxwMrPaMt2+3pQRaJ92UlxemZCPtFRYCUtG4TU8c880iq5qvPwmUesgXpaty4zqTGZd6HYGh ZFdVwoyeShf3/5kSNtpjNQjUmy6AtcvhcuexwDU71Ni9 X-Google-Smtp-Source: AGHT+IEbUPApoYPJpdvnrfodpT7VWiVCPybzLgP7OXq2lIYciu/dx/VxySRSEMu9qRHjaqzuy+eLaw== X-Received: by 2002:a17:903:234b:b0:223:47b4:aaf8 with SMTP id d9443c01a7336-2292fa15fc7mr24088575ad.52.1743233578888; Sat, 29 Mar 2025 00:32:58 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.32.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:32:58 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:18 -0300 Subject: [PATCH v7 01/12] platform/x86: alienware-wmi-wmax: Rename thermal related symbols Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-1-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 The "thermal" features of the WMAX WMI device are only present on the host device if the ACPI _UID is "AWCC". Replace WMAX prefixes with "AWCC" to reflect this relationship. Thermal profiles with WMAX_PROFILE_BASIC prefix are also renamed to WMAX_PROFILE_LEGACY because they are only supported in older versions of this WMI device. Finally, shorten enum defines for AWCC operations from WMAX_OPERATION_* to AWCC_OP_*. Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 173 +++++++++++++--------= ---- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 3d3014b5adf046c94c1ebf39a0e28a92622b40d6..ed70e12d73d7fe5d89f3364c536= 7820bf47e3c1e 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -24,16 +24,17 @@ #define WMAX_METHOD_DEEP_SLEEP_STATUS 0x0C #define WMAX_METHOD_BRIGHTNESS 0x3 #define WMAX_METHOD_ZONE_CONTROL 0x4 -#define WMAX_METHOD_THERMAL_INFORMATION 0x14 -#define WMAX_METHOD_THERMAL_CONTROL 0x15 -#define WMAX_METHOD_GAME_SHIFT_STATUS 0x25 =20 -#define WMAX_THERMAL_MODE_GMODE 0xAB +#define AWCC_METHOD_THERMAL_INFORMATION 0x14 +#define AWCC_METHOD_THERMAL_CONTROL 0x15 +#define AWCC_METHOD_GAME_SHIFT_STATUS 0x25 =20 -#define WMAX_FAILURE_CODE 0xFFFFFFFF -#define WMAX_THERMAL_TABLE_MASK GENMASK(7, 4) -#define WMAX_THERMAL_MODE_MASK GENMASK(3, 0) -#define WMAX_SENSOR_ID_MASK BIT(8) +#define AWCC_THERMAL_MODE_GMODE 0xAB + +#define AWCC_FAILURE_CODE 0xFFFFFFFF +#define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) +#define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) +#define AWCC_SENSOR_ID_MASK BIT(8) =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -151,38 +152,38 @@ static const struct dmi_system_id awcc_dmi_table[] __= initconst =3D { }, }; =20 -enum WMAX_THERMAL_INFORMATION_OPERATIONS { - WMAX_OPERATION_SYS_DESCRIPTION =3D 0x02, - WMAX_OPERATION_LIST_IDS =3D 0x03, - WMAX_OPERATION_CURRENT_PROFILE =3D 0x0B, +enum AWCC_THERMAL_INFORMATION_OPERATIONS { + AWCC_OP_GET_SYSTEM_DESCRIPTION =3D 0x02, + AWCC_OP_GET_RESOURCE_ID =3D 0x03, + AWCC_OP_GET_CURRENT_PROFILE =3D 0x0B, }; =20 -enum WMAX_THERMAL_CONTROL_OPERATIONS { - WMAX_OPERATION_ACTIVATE_PROFILE =3D 0x01, +enum AWCC_THERMAL_CONTROL_OPERATIONS { + AWCC_OP_ACTIVATE_PROFILE =3D 0x01, }; =20 -enum WMAX_GAME_SHIFT_STATUS_OPERATIONS { - WMAX_OPERATION_TOGGLE_GAME_SHIFT =3D 0x01, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS =3D 0x02, +enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { + AWCC_OP_TOGGLE_GAME_SHIFT =3D 0x01, + AWCC_OP_GET_GAME_SHIFT_STATUS =3D 0x02, }; =20 -enum WMAX_THERMAL_TABLES { - WMAX_THERMAL_TABLE_BASIC =3D 0x90, - WMAX_THERMAL_TABLE_USTT =3D 0xA0, +enum AWCC_THERMAL_TABLES { + AWCC_THERMAL_TABLE_LEGACY =3D 0x90, + AWCC_THERMAL_TABLE_USTT =3D 0xA0, }; =20 -enum wmax_thermal_mode { - THERMAL_MODE_USTT_BALANCED, - THERMAL_MODE_USTT_BALANCED_PERFORMANCE, - THERMAL_MODE_USTT_COOL, - THERMAL_MODE_USTT_QUIET, - THERMAL_MODE_USTT_PERFORMANCE, - THERMAL_MODE_USTT_LOW_POWER, - THERMAL_MODE_BASIC_QUIET, - THERMAL_MODE_BASIC_BALANCED, - THERMAL_MODE_BASIC_BALANCED_PERFORMANCE, - THERMAL_MODE_BASIC_PERFORMANCE, - THERMAL_MODE_LAST, +enum awcc_thermal_profile { + AWCC_PROFILE_USTT_BALANCED, + AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, + AWCC_PROFILE_USTT_COOL, + AWCC_PROFILE_USTT_QUIET, + AWCC_PROFILE_USTT_PERFORMANCE, + AWCC_PROFILE_USTT_LOW_POWER, + AWCC_PROFILE_LEGACY_QUIET, + AWCC_PROFILE_LEGACY_BALANCED, + AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE, + AWCC_PROFILE_LEGACY_PERFORMANCE, + AWCC_PROFILE_LAST, }; =20 struct wmax_led_args { @@ -210,20 +211,20 @@ struct wmax_u32_args { struct awcc_priv { struct wmi_device *wdev; struct device *ppdev; - enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; + enum awcc_thermal_profile supported_thermal_profiles[PLATFORM_PROFILE_LAS= T]; }; =20 -static const enum platform_profile_option wmax_mode_to_platform_profile[TH= ERMAL_MODE_LAST] =3D { - [THERMAL_MODE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, - [THERMAL_MODE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, - [THERMAL_MODE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, - [THERMAL_MODE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, - [THERMAL_MODE_BASIC_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_BASIC_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_P= ERFORMANCE, - [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, +static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { + [AWCC_PROFILE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, + [AWCC_PROFILE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, + [AWCC_PROFILE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, + [AWCC_PROFILE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, + [AWCC_PROFILE_LEGACY_QUIET] =3D PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_LEGACY_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_= PERFORMANCE, + [AWCC_PROFILE_LEGACY_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, }; =20 static struct awcc_quirks *awcc; @@ -444,26 +445,26 @@ const struct attribute_group wmax_deepsleep_attribute= _group =3D { * Thermal Profile control * - Provides thermal profile control through the Platform Profile API */ -static bool is_wmax_thermal_code(u32 code) +static bool is_awcc_thermal_mode(u32 code) { - if (code & WMAX_SENSOR_ID_MASK) + if (code & AWCC_SENSOR_ID_MASK) return false; =20 - if ((code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_LAST) + if ((code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LAST) return false; =20 - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_BASIC && - (code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_BASIC_QUIET) + if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_LEGACY && + (code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LEGACY_QUIET) return true; =20 - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_USTT && - (code & WMAX_THERMAL_MODE_MASK) <=3D THERMAL_MODE_USTT_LOW_POWER) + if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_USTT && + (code & AWCC_THERMAL_MODE_MASK) <=3D AWCC_PROFILE_USTT_LOW_POWER) return true; =20 return false; } =20 -static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, +static int awcc_thermal_information(struct wmi_device *wdev, u8 operation, u8 arg, u32 *out_data) { struct wmax_u32_args in_args =3D { @@ -474,21 +475,21 @@ static int wmax_thermal_information(struct wmi_device= *wdev, u8 operation, }; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; =20 - if (*out_data =3D=3D WMAX_FAILURE_CODE) + if (*out_data =3D=3D AWCC_FAILURE_CODE) return -EBADRQC; =20 return 0; } =20 -static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) +static int awcc_thermal_control(struct wmi_device *wdev, u8 profile) { struct wmax_u32_args in_args =3D { - .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, + .operation =3D AWCC_OP_ACTIVATE_PROFILE, .arg1 =3D profile, .arg2 =3D 0, .arg3 =3D 0, @@ -496,18 +497,18 @@ static int wmax_thermal_control(struct wmi_device *wd= ev, u8 profile) u32 out_data; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &in_args, sizeof(in_args), &out_data); if (ret) return ret; =20 - if (out_data =3D=3D WMAX_FAILURE_CODE) + if (out_data =3D=3D AWCC_FAILURE_CODE) return -EBADRQC; =20 return 0; } =20 -static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, +static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, u32 *out_data) { struct wmax_u32_args in_args =3D { @@ -518,46 +519,46 @@ static int wmax_game_shift_status(struct wmi_device *= wdev, u8 operation, }; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; =20 - if (*out_data =3D=3D WMAX_FAILURE_CODE) + if (*out_data =3D=3D AWCC_FAILURE_CODE) return -EOPNOTSUPP; =20 return 0; } =20 -static int thermal_profile_get(struct device *dev, - enum platform_profile_option *profile) +static int awcc_platform_profile_get(struct device *dev, + enum platform_profile_option *profile) { struct awcc_priv *priv =3D dev_get_drvdata(dev); u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFI= LE, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, 0, &out_data); =20 if (ret < 0) return ret; =20 - if (out_data =3D=3D WMAX_THERMAL_MODE_GMODE) { + if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { *profile =3D PLATFORM_PROFILE_PERFORMANCE; return 0; } =20 - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) return -ENODATA; =20 - out_data &=3D WMAX_THERMAL_MODE_MASK; - *profile =3D wmax_mode_to_platform_profile[out_data]; + out_data &=3D AWCC_THERMAL_MODE_MASK; + *profile =3D awcc_mode_to_platform_profile[out_data]; =20 return 0; } =20 -static int thermal_profile_set(struct device *dev, - enum platform_profile_option profile) +static int awcc_platform_profile_set(struct device *dev, + enum platform_profile_option profile) { struct awcc_priv *priv =3D dev_get_drvdata(dev); =20 @@ -565,8 +566,8 @@ static int thermal_profile_set(struct device *dev, u32 gmode_status; int ret; =20 - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + ret =3D awcc_game_shift_status(priv->wdev, + AWCC_OP_GET_GAME_SHIFT_STATUS, &gmode_status); =20 if (ret < 0) @@ -574,8 +575,8 @@ static int thermal_profile_set(struct device *dev, =20 if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_TOGGLE_GAME_SHIFT, + ret =3D awcc_game_shift_status(priv->wdev, + AWCC_OP_TOGGLE_GAME_SHIFT, &gmode_status); =20 if (ret < 0) @@ -583,21 +584,21 @@ static int thermal_profile_set(struct device *dev, } } =20 - return wmax_thermal_control(priv->wdev, + return awcc_thermal_control(priv->wdev, priv->supported_thermal_profiles[profile]); } =20 -static int thermal_profile_probe(void *drvdata, unsigned long *choices) +static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) { enum platform_profile_option profile; struct awcc_priv *priv =3D drvdata; - enum wmax_thermal_mode mode; + enum awcc_thermal_profile mode; u8 sys_desc[4]; u32 first_mode; u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_SYS_DESCRIPTI= ON, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTI= ON, 0, (u32 *) &sys_desc); if (ret < 0) return ret; @@ -605,7 +606,7 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) first_mode =3D sys_desc[0] + sys_desc[1]; =20 for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_LIST_IDS, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID, i + first_mode, &out_data); =20 if (ret =3D=3D -EIO) @@ -614,11 +615,11 @@ static int thermal_profile_probe(void *drvdata, unsig= ned long *choices) if (ret =3D=3D -EBADRQC) break; =20 - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) continue; =20 - mode =3D out_data & WMAX_THERMAL_MODE_MASK; - profile =3D wmax_mode_to_platform_profile[mode]; + mode =3D out_data & AWCC_THERMAL_MODE_MASK; + profile =3D awcc_mode_to_platform_profile[mode]; priv->supported_thermal_profiles[profile] =3D out_data; =20 set_bit(profile, choices); @@ -629,7 +630,7 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) =20 if (awcc->gmode) { priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D - WMAX_THERMAL_MODE_GMODE; + AWCC_THERMAL_MODE_GMODE; =20 set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } @@ -638,9 +639,9 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) } =20 static const struct platform_profile_ops awcc_platform_profile_ops =3D { - .probe =3D thermal_profile_probe, - .profile_get =3D thermal_profile_get, - .profile_set =3D thermal_profile_set, + .probe =3D awcc_platform_profile_probe, + .profile_get =3D awcc_platform_profile_get, + .profile_set =3D awcc_platform_profile_set, }; =20 static int awcc_platform_profile_init(struct wmi_device *wdev) --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 197861C4609; Sat, 29 Mar 2025 07:33:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233583; cv=none; b=gJJWFuge+IG1qqsqkcUZ74nCljwtXsTMmq8l6t/HTJXGmYlMGOxkgBeZoIPRBA4/6ULOVFwWla/arQQWiH4DKWoSTWpgOg5t/lHlD49jU6M3N9+WcBFibNi5XEJkB4FZf7zyKL6KvZXN6NCMWrwErhnsSLRhJLOqDb20QZMBdQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233583; c=relaxed/simple; bh=ATkgHyh6kAu1cPNPrpR84y8/RB4MmJZ/qDOHMtR/6Uk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ehKNoylzER+MrXeKG9k6rr+saKK6mLWM3XQrrP1N3J6a6TtOQ9+Rf6OnXcY2iJga7j7HnDjHGQVpkNVRwTVidLNwX1B4526wiKkeDhf0lJjF5CqLijCE26efaeW1MO7Kk+09/wdHnqf+wuTBerMkfla/v8LrRAGtxnOamUTWoi0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cQYombgT; arc=none smtp.client-ip=209.85.214.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cQYombgT" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2243803b776so26570865ad.0; Sat, 29 Mar 2025 00:33:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233581; x=1743838381; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=X94Wn4jXJlBDIK6nkAvx3Ra3AzwCgwminFT7JbpZY1U=; b=cQYombgTCps9q19kPCly7zn1bCY+yazxu/Vh6vU2HInb4SnbLHzh4lBfdk3IULKDg3 qyBTXxYBLRs+Q0IWuOU9U2yZ79WNXWx0BjrFRdeELpIUiiSPKSxTZX4phWhXme+bmVQJ Ut4UcxzHZa43fQ/43AIgK5ddv3Bjwg4mvQF/2GrOXBiix50Ixh4+HnA04AG4eYqCLNoY x9c85LQDHfr6n1ainW3gKAN0GAGyjs7/VHMzFstcVEO4nF41Gj3lnGOk4PyvTkPOB5E2 HAaLEfVJc5QnydT+hXAfNtr/nAr6EV7h0opXzKOUT04hjdMbsG8gye+Vy1q2xEVpHcVv LvBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233581; x=1743838381; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=X94Wn4jXJlBDIK6nkAvx3Ra3AzwCgwminFT7JbpZY1U=; b=qq49Crw3mqo/pu0TfaIXeNGbyn330RhoRwvczLE6DnuuZUpWqPEckMFJJt7o4aXwO5 YPzZl7z65akhdJ467cwthZ3VZgAz4MTw6GVwgMUoMiYD/1j7X+wlZacBrlqXY6bzFOlk oqYHEFBOgtFMW/8BjQ5sgLgq8I95U6KjBsbZVAzdYuAYUmkJgpXjDuQL779vhfNj4jcY pqAEnVDctepgzJb/nW4ZHL3NyX3K4mRQ632rtZ4Gmg7PtpEmARLi6NYvaciD5Dy1U08K pRZtUnoqheyPRBdvFbOlTsojNazN69v9BIgr6GCdfUKuEVW4y0nARKp20Nb+yRlDDzIu U2/A== X-Forwarded-Encrypted: i=1; AJvYcCVqpcsLnnkNayNZVay3jCrSHK1n+c4zB/QLmJ4AS3dBg/XPSe1Eedr61hgGUyVYyHzvLKEA7wWgApBE4+0=@vger.kernel.org, AJvYcCXnfpYJQUJim8sNzxhHk9QpO5M/MHc/F5JIBvwsIz18ZZOC8SfT3zHdk88whZyCXvo8VPbiJ2RKsWkRGS9i11w/frqp6A==@vger.kernel.org X-Gm-Message-State: AOJu0YxS7YkFrC706CY1oiV3SMEAp4LpaEqRJekYGlC+cgrv4ig5VK6H jBaoFBbSDp7+wcU4mHNck2pWhz+9CfoOnHcrGa7sei4ID91+VF23 X-Gm-Gg: ASbGncvVkY+DoSTe3BTnDv8N2pWrmKS15sGDuu+VaL3DEfHUpBwzFVyEDMcBMfZwcvW DJFqGTYcQsPjStKHx0/6HYVUOZ6H+ivaXVDJY1xBMfTj85ea4COVbKjHOXTNNeGV2/weMCfHlXJ TVoBY+lvGHOWKCHlaqG4A5vP2lq50C6pqMgVZ890q5RNmnaEByja00vy3jXM9glF2bicgAjHSVb QYxd0k8GnfbtJW+GpyQmLsassHxgiyIsno/WJNufAd7pB+rZgyBu7W1SLpvLGNMBqcJD2WTvqIG FDkPoAUepECP3qrRPKGSRMTFvgvKEd0jgamdHKX3/nfX X-Google-Smtp-Source: AGHT+IGVJSPSkxnymoT1GsBYRA7J0h38PJ/kLxumqSXjvLhNKKTQvpqtx4xjjHOPyQS0/naSEE4bVg== X-Received: by 2002:a17:902:daca:b0:223:6180:1bea with SMTP id d9443c01a7336-2292f9e601emr28261305ad.37.1743233581261; Sat, 29 Mar 2025 00:33:01 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.32.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:01 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:19 -0300 Subject: [PATCH v7 02/12] platform/x86: alienware-wmi-wmax: Improve ID processing Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-2-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Rename AWCC_SENSOR_ID_MASK to AWCC_SENSOR_ID_FLAG and reorder the ID processing defines in a more logical manner. Then replace their use in bitwise operations with FIELD_GET(). The latter also involves dropping the AWCC_SENSOR_ID_FLAG check inside is_awcc_thermal_mode() in favor of extracting the first byte out of IDs obtained with AWCC_OP_GET_RESOURCE_ID. This is also a requirement to add support for Alienware Aurora desktops. While at it, also rename is_awcc_thermal_mode() to is_awcc_thermal_profile_id(). Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 38 ++++++++++++++--------= ---- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index ed70e12d73d7fe5d89f3364c5367820bf47e3c1e..66755ff21933297568a5262726c= 05bc60fef56db 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -32,9 +32,11 @@ #define AWCC_THERMAL_MODE_GMODE 0xAB =20 #define AWCC_FAILURE_CODE 0xFFFFFFFF -#define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) + +#define AWCC_SENSOR_ID_FLAG BIT(8) #define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) -#define AWCC_SENSOR_ID_MASK BIT(8) +#define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) +#define AWCC_RESOURCE_ID_MASK GENMASK(7, 0) =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -168,8 +170,8 @@ enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { }; =20 enum AWCC_THERMAL_TABLES { - AWCC_THERMAL_TABLE_LEGACY =3D 0x90, - AWCC_THERMAL_TABLE_USTT =3D 0xA0, + AWCC_THERMAL_TABLE_LEGACY =3D 0x9, + AWCC_THERMAL_TABLE_USTT =3D 0xA, }; =20 enum awcc_thermal_profile { @@ -445,20 +447,18 @@ const struct attribute_group wmax_deepsleep_attribute= _group =3D { * Thermal Profile control * - Provides thermal profile control through the Platform Profile API */ -static bool is_awcc_thermal_mode(u32 code) +static bool is_awcc_thermal_profile_id(u8 code) { - if (code & AWCC_SENSOR_ID_MASK) + u8 table =3D FIELD_GET(AWCC_THERMAL_TABLE_MASK, code); + u8 mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, code); + + if (mode >=3D AWCC_PROFILE_LAST) return false; =20 - if ((code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LAST) - return false; - - if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_LEGACY && - (code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LEGACY_QUIET) + if (table =3D=3D AWCC_THERMAL_TABLE_LEGACY && mode >=3D AWCC_PROFILE_LEGA= CY_QUIET) return true; =20 - if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_USTT && - (code & AWCC_THERMAL_MODE_MASK) <=3D AWCC_PROFILE_USTT_LOW_POWER) + if (table =3D=3D AWCC_THERMAL_TABLE_USTT && mode <=3D AWCC_PROFILE_USTT_L= OW_POWER) return true; =20 return false; @@ -548,10 +548,10 @@ static int awcc_platform_profile_get(struct device *d= ev, return 0; } =20 - if (!is_awcc_thermal_mode(out_data)) + if (!is_awcc_thermal_profile_id(out_data)) return -ENODATA; =20 - out_data &=3D AWCC_THERMAL_MODE_MASK; + out_data =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, out_data); *profile =3D awcc_mode_to_platform_profile[out_data]; =20 return 0; @@ -597,6 +597,7 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) u32 first_mode; u32 out_data; int ret; + u8 id; =20 ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTI= ON, 0, (u32 *) &sys_desc); @@ -615,12 +616,13 @@ static int awcc_platform_profile_probe(void *drvdata,= unsigned long *choices) if (ret =3D=3D -EBADRQC) break; =20 - if (!is_awcc_thermal_mode(out_data)) + id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); + if (!is_awcc_thermal_profile_id(id)) continue; =20 - mode =3D out_data & AWCC_THERMAL_MODE_MASK; + mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile =3D awcc_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] =3D out_data; + priv->supported_thermal_profiles[profile] =3D id; =20 set_bit(profile, choices); } --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6FBBC1C5F18; Sat, 29 Mar 2025 07:33:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233586; cv=none; b=G9CDPsgwzHNYVU8vmV7VSzgEPOWhLa9NPmGz+hjcD6zfGUDe6lr3O0kXOaBDHImwjZVaAPHaiKZ78wjM62eCzTrizzVTNVJ26C9a+cpoEGlpqqRlPUVHiHe6RDLl0jvfyPjd36h2fP5L/dKaUwEKhedrvf0KismzxSnh2dXna84= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233586; c=relaxed/simple; bh=2KOJGb3TfQNpBEipaaFsJun53GcQ7/CJSWvqGaTayvE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O9loOi9nsQz6WN/6QqQ273WxIMH7VKlQWyTVqcWCVMcbFOwpo4CgSfKBr7mGBPu3DkpxEM4DHgfAt88/2GazqckDhLOTsVQoPvvf37N4Oj/5PEnKCQvZ/xxorEckDin+1ykapPKOro4bufQA1cAaqANoxsi74T11fTcgm7vf5kk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=cevqm/JJ; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cevqm/JJ" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2260c915749so43143915ad.3; Sat, 29 Mar 2025 00:33:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233584; x=1743838384; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=If3OzlJA+J+w/N9kAYOqkCq+CjhXIVRXJITXcSQtINY=; b=cevqm/JJn6sdJzLDYygJUm+69WtQIjhAbfWCXQGq4ka6Dfv77k+Avohofu/SG2PpJM IUtzVWeCy2YdAy4dYZ2u7YPJDVPQameVHcj5FMM3TFYF2fNgEiZNBo/0fUkTl2VdU4MP XMdkjAcOCGZG2ZpEI0BdpjAoPOVYPq4PXeYCTRhtb7jNSrk2SOlhtWKZCszffmLuWOWY CWN9WEVfT8+o7v7geoSri9WGIQje1JVwZgHNLpcmhSXAR+WcfayGZBxqdKujf7E5ahLt J4Aicx/MTe2Ir9B5zJ6f5wwizcjO2528zakdJRGu/u5wqeIalY+jYQ1vkuc49pyJIvR+ q2+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233584; x=1743838384; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=If3OzlJA+J+w/N9kAYOqkCq+CjhXIVRXJITXcSQtINY=; b=t5BgZNWNjZVs/Hf3d9IQlKzqGldWBFZfTgPAc3/D6f+Y/c84ENnKKvwJKgJ6VoMX06 gWX4jM0UhAaGYNR2gRjAkFIWbSUX6L3Ghf69ByBWq1vLvWRr6PbForgoGXiRBqp7Jzp0 eRu21gsS2kBxmRsnpdZUzkE8lnXUeJ5z31jehssqQQOG7htMjQvR2/OI6ZFkqc0NHqEd 5iMFrHFQu8KtB/IwWSxTCF2UJ8RLVL8UWvyWhZdll28yFNJyx31gBuOGblYbfSPKJIxx vvkI7vuuZeUEoW860PXHvQSbgmLf7XXUcHF6XnvjsakDgz9att7x9Df38GGR/b7A9xjv 0bjQ== X-Forwarded-Encrypted: i=1; AJvYcCUT3Q88NN64F3lDdEL9a4mwyiw7sEMdqo/M8zaw8ytw6uaxlBnJxxFxh6NIeZAlq6Ey3a2RScgHmiPWgqM081y4IuYULg==@vger.kernel.org, AJvYcCVoYyF7Oi8HrBVxkanG7sPBNTJTOpgdXoPy2XjStq6ENgMyQ7quwm2FQX+jNpGj9NbZpWW4vW8u7tdGdBw=@vger.kernel.org X-Gm-Message-State: AOJu0Yy37h2zn+DhB/y5Hiwpprl08IPAUrnVO1LEwAIRonTnLYeteiIA MQofQSk2BYkccxo0Nmoxnx0dq41mlNotG1/Uw/JlTQR1L41iOELhoww9tw== X-Gm-Gg: ASbGncu9ugowe8iaHTHODfMJkrOzp6mtmur25kDfxbMsxR7Tp7NsoAwWtjStviBPdny hgWemGM/FZOJcmKdM3kXjVoZufH6vHpHilGREwuX5/5uZkSoRc1m3GoYpLLB1NSkQY05HHlpzUb vhsvXZ1sZx0BROY2JQxRE3i2wPxCAPsOVa2nNr27uzeyDPuVz2jP1136XvTn9IxdEq62GEVrRdT /x7z3hzvoUFsmyu3bwVZnkqp6oK2U55aoon7vod9OOIRq+vNB/K2FI+VMA0lGmUcbR+xulZuHkc flZtxP04p0G1uNnzfYCUnBJMB4HOlykydLjAdeW4szc5duigzouObN4= X-Google-Smtp-Source: AGHT+IEMV+ijW5j60am+44nMCggZe76hy5amvMXwrB4x3BvSQqqoNOAATNcfHmVzGPJU8R+jkLK5hQ== X-Received: by 2002:a17:902:d583:b0:216:7926:8d69 with SMTP id d9443c01a7336-2292fa0258fmr31311185ad.47.1743233583614; Sat, 29 Mar 2025 00:33:03 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:03 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:20 -0300 Subject: [PATCH v7 03/12] platform/x86: alienware-wmi-wmax: Improve internal AWCC API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-3-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Inline all AWCC WMI helper methods and directly return the newly introduced awcc_wmi_command() helper to simplify implementation. Drop awcc_thermal_control() in favor of awcc_op_activate_profile(). Add awcc_op_get_resource_id(), awcc_op_get_current_profile() and a new failure code. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 130 ++++++++++++++++-----= ---- 1 file changed, 84 insertions(+), 46 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 66755ff21933297568a5262726c05bc60fef56db..c0831c069e366c52b5bc6dcf799= 6c7b21f4c089d 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -32,6 +32,7 @@ #define AWCC_THERMAL_MODE_GMODE 0xAB =20 #define AWCC_FAILURE_CODE 0xFFFFFFFF +#define AWCC_FAILURE_CODE_2 0xFFFFFFFE =20 #define AWCC_SENSOR_ID_FLAG BIT(8) #define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) @@ -444,8 +445,7 @@ const struct attribute_group wmax_deepsleep_attribute_g= roup =3D { }; =20 /* - * Thermal Profile control - * - Provides thermal profile control through the Platform Profile API + * AWCC Helpers */ static bool is_awcc_thermal_profile_id(u8 code) { @@ -464,72 +464,115 @@ static bool is_awcc_thermal_profile_id(u8 code) return false; } =20 -static int awcc_thermal_information(struct wmi_device *wdev, u8 operation, - u8 arg, u32 *out_data) +static int awcc_wmi_command(struct wmi_device *wdev, u32 method_id, + struct wmax_u32_args *args, u32 *out) { - struct wmax_u32_args in_args =3D { - .operation =3D operation, - .arg1 =3D arg, - .arg2 =3D 0, - .arg3 =3D 0, - }; int ret; =20 - ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, - &in_args, sizeof(in_args), out_data); - if (ret < 0) + ret =3D alienware_wmi_command(wdev, method_id, args, sizeof(*args), out); + if (ret) return ret; =20 - if (*out_data =3D=3D AWCC_FAILURE_CODE) + if (*out =3D=3D AWCC_FAILURE_CODE || *out =3D=3D AWCC_FAILURE_CODE_2) return -EBADRQC; =20 return 0; } =20 -static int awcc_thermal_control(struct wmi_device *wdev, u8 profile) +static int awcc_thermal_information(struct wmi_device *wdev, u8 operation,= u8 arg, + u32 *out) { - struct wmax_u32_args in_args =3D { - .operation =3D AWCC_OP_ACTIVATE_PROFILE, - .arg1 =3D profile, + struct wmax_u32_args args =3D { + .operation =3D operation, + .arg1 =3D arg, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); +} + +static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, + u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D operation, + .arg1 =3D 0, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &args, out); +} + +/** + * awcc_op_get_resource_id - Get the resource ID at a given index + * @wdev: AWCC WMI device + * @index: Index + * @out: Value returned by the WMI call + * + * Get the resource ID at a given @index. Resource IDs are listed in the + * following order: + * + * - Fan IDs + * - Sensor IDs + * - Unknown IDs + * - Thermal Profile IDs + * + * The total number of IDs of a given type can be obtained with + * AWCC_OP_GET_SYSTEM_DESCRIPTION. + * + * Return: 0 on success, -errno on failure + */ +static int awcc_op_get_resource_id(struct wmi_device *wdev, u8 index, u8 *= out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_RESOURCE_ID, + .arg1 =3D index, .arg2 =3D 0, .arg3 =3D 0, }; u32 out_data; int ret; =20 - ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, - &in_args, sizeof(in_args), &out_data); + ret =3D awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, &o= ut_data); if (ret) return ret; =20 - if (out_data =3D=3D AWCC_FAILURE_CODE) - return -EBADRQC; + *out =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); =20 return 0; } =20 -static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, - u32 *out_data) +static int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) { - struct wmax_u32_args in_args =3D { - .operation =3D operation, + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_CURRENT_PROFILE, .arg1 =3D 0, .arg2 =3D 0, .arg3 =3D 0, }; - int ret; =20 - ret =3D alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, - &in_args, sizeof(in_args), out_data); - if (ret < 0) - return ret; - - if (*out_data =3D=3D AWCC_FAILURE_CODE) - return -EOPNOTSUPP; - - return 0; + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); } =20 +static int awcc_op_activate_profile(struct wmi_device *wdev, u8 profile) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_ACTIVATE_PROFILE, + .arg1 =3D profile, + .arg2 =3D 0, + .arg3 =3D 0, + }; + u32 out; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); +} + +/* + * Thermal Profile control + * - Provides thermal profile control through the Platform Profile API + */ static int awcc_platform_profile_get(struct device *dev, enum platform_profile_option *profile) { @@ -537,10 +580,8 @@ static int awcc_platform_profile_get(struct device *de= v, u32 out_data; int ret; =20 - ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, - 0, &out_data); - - if (ret < 0) + ret =3D awcc_op_get_current_profile(priv->wdev, &out_data); + if (ret) return ret; =20 if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { @@ -584,8 +625,8 @@ static int awcc_platform_profile_set(struct device *dev, } } =20 - return awcc_thermal_control(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, + priv->supported_thermal_profiles[profile]); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -595,7 +636,6 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) enum awcc_thermal_profile mode; u8 sys_desc[4]; u32 first_mode; - u32 out_data; int ret; u8 id; =20 @@ -607,8 +647,7 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) first_mode =3D sys_desc[0] + sys_desc[1]; =20 for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID, - i + first_mode, &out_data); + ret =3D awcc_op_get_resource_id(priv->wdev, i + first_mode, &id); =20 if (ret =3D=3D -EIO) return ret; @@ -616,7 +655,6 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) if (ret =3D=3D -EBADRQC) break; =20 - id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); if (!is_awcc_thermal_profile_id(id)) continue; =20 --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E00C01CCEE0; Sat, 29 Mar 2025 07:33:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233588; cv=none; b=oeg76VAELmYD1w2MEqolUu5Q/MCeIxaaF3hqOBp82+Om6fV0ET4rd+5SFMERc7t7r1Gbpv1zPmooi+zdNxQV4wsvCJrRkzNLSrSeahKY+5F1qIGcHfLjxs487tET6yiBK8BP/YL/T5+lOSWIChiO5v2EzhCgNi3QoFprgjxzWs0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233588; c=relaxed/simple; bh=xIuiJDxeW0O/sMuAJB93UTQkJwwWyiSYYKGC7w3qZgI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Daqn5DviQ3RHdioQpaJl/qW6P3bACeGUB2eVPX9CjHs6gED0Iqm6Gd+v0gwj7wJSbaeoGUiJrSbB9wh1fDtjBfAiXt0ull+aX6nLWzHQQ3ELcBYl57Jc8dnhoe036Pkd5Zax5Sxw9bKP+/hmhNWQSeQiXfvJBcgGl1lTj6vdtnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nShqXdGw; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nShqXdGw" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-22409077c06so87809475ad.1; Sat, 29 Mar 2025 00:33:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233586; x=1743838386; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=hGlH08n70UCTP2pPy+HTCD4e8STPbVESuWCDYyWINJ4=; b=nShqXdGwAzUR7kSWcBcLHRK4wFyZYY0H2TMW8yHmDOF7z401pGjZVQSoApdo7+T1do ag16CXNM3XEmuz416iSecGu4jYE39igbIrxqVplZfn1H3f8uaWkwQUIRSvWxr7orqIid zcQK9Bhbo+Uevhg54Tj/oCUHhKTk9Y1pDv0T2Ud52c7n8fDWhs9iByNF8RMhWm/BAYcw kXDCKxSr1F8eEhfz2EhBrY0X7lpSBR2BBHV/azcKLNvxEBXyT1QpryAaca9fdagr5nvh 1CDXRgN4e/DsKZZjRIKFlE1gcesaP6UHP/yvlvKcb2Son2+2yZ2u3xTnWwKeouoYqQTv TG/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233586; x=1743838386; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hGlH08n70UCTP2pPy+HTCD4e8STPbVESuWCDYyWINJ4=; b=X4uxuGonVeZEECdPTenjqlXijjJcKBViK74LVBxn/ktbxvtv9k8BbNnZEW8Y5Ps9aG yfdBb4oHg/0dc8kfa4KGX2ev43ncifvxIzLlIAczjMXCC0rM9w5qbxy+TVDPAVmu9TMK HVyNPg4nBnSoZpgS//24V4tOVJ1Pey+aKefYoXaspEcQ1u9gEpjCqorK8VjbSA5icp1q YVL9K/4j0XHuP64hK61nCI2AnHSN4aMFnftsEpmlQ5+8VlpnirkOfUOWoo22yFHoJ4td h31c9esXl5xwv10oHahwhRAUzE/c1wyZcHDA8hXByosqrZ/e0fVuMNzzmI8yw3te2Q5J r9HA== X-Forwarded-Encrypted: i=1; AJvYcCWqsW4bSR0nWCsO2ncjmkjWgqlwEKc/u1ujPb2SN0gZkXgBn7EOc422nihwpmJPSKR/Q99NkcMDcddnfLsfjb0T4dGPog==@vger.kernel.org, AJvYcCWwVe6GjZBGLYYDnFZTaCNCLvPwOVsmjTk4JKcYxDQLW4szBEaB5qpYLg+SskmCaf4C/mahWz4/rUxv7MY=@vger.kernel.org X-Gm-Message-State: AOJu0YzgI90K05nHZ3cI1H8+8IpgS3vZexraXYDNIJNlwjZA1xQF9HNu 52ZHgFUcZHHVbYt2XrD+SZneZOha48yAjsr8aqSZqS29BIxD66cx X-Gm-Gg: ASbGncv9LyblXz7SnYRfu7GVM9MgzqlCbVRjduWycOJBesV+g53ik/Hdf3W76kmCPLx f7mq++jwaRxtKbKZdU5qmj16L5YrEXZryjhZYgyT4RvW3XqKAfUYgaQErk7wLpXJMVMM8WUVQh1 qLSU2HeZzOeabT4pHHDysqnE8pE++3Hpl5cJW6WixRIVtw4zqB9/01qFWLk5iJWxlUacJzLZNQq LajTQunlXSPGUYv7fIcZ/NMWAxFyVDjf4uWVA0G7J1C1V9w77NxzUJ1e1jQYJUTRWDUD3B5EYdm yjAEqYjJHnyggzGsXIZFATRPxcMyW3rhoh8peGDt1Cnf X-Google-Smtp-Source: AGHT+IEZ8pOEjq6fw34fxltHTDLxl56ip7RCIbysgC4oOPJFwcTd3eYr/JFZOq2yKX9V85q2bXBzvA== X-Received: by 2002:a17:902:d548:b0:223:6254:b4ba with SMTP id d9443c01a7336-2292f961fefmr27214485ad.13.1743233585984; Sat, 29 Mar 2025 00:33:05 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:05 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:21 -0300 Subject: [PATCH v7 04/12] platform/x86: alienware-wmi-wmax: Modify supported_thermal_profiles[] Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-4-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Rename supported_thermal_profiles[] -> supported_profiles[] and change it's type to u8 because it stores AWCC thermal IDs. Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index c0831c069e366c52b5bc6dcf7996c7b21f4c089d..dd7a17619e38b32a5be6daf44ef= baa8d224f304d 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -214,7 +214,7 @@ struct wmax_u32_args { struct awcc_priv { struct wmi_device *wdev; struct device *ppdev; - enum awcc_thermal_profile supported_thermal_profiles[PLATFORM_PROFILE_LAS= T]; + u8 supported_profiles[PLATFORM_PROFILE_LAST]; }; =20 static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { @@ -625,8 +625,7 @@ static int awcc_platform_profile_set(struct device *dev, } } =20 - return awcc_op_activate_profile(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, priv->supported_profiles[prof= ile]); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -660,7 +659,7 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) =20 mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile =3D awcc_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] =3D id; + priv->supported_profiles[profile] =3D id; =20 set_bit(profile, choices); } @@ -669,7 +668,7 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) return -ENODEV; =20 if (awcc->gmode) { - priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D + priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D AWCC_THERMAL_MODE_GMODE; =20 set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CBA1B1D5AB8; Sat, 29 Mar 2025 07:33:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233590; cv=none; b=YgwSnIasVwHCTDLF8yKdD8AAEwv0hnBem0tJHSL6ZSks5dDu9KHxa0qEk4dRdqmwVBdXc5vGizMzDEiAqpBNv13sXHpA5tDH4wM8zW1XhChaP/j2hqwP5hJiSFazE7qBf1giTAsX0cDYkUXGP6qbVsLF37k1lmNQOzwyMhhcvgE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233590; c=relaxed/simple; bh=VcgaSGlp2//fUsGH0TlUzixOVNLQ73JOn3EvZ/CH1FI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nhvbIwfhZhcm9Bw3v+XMq5nOFWq+AN9Gnl9pOe7upi5BnKKbzSq3dS1vAEXmkCuG+uKXp/HB95x0VgBiJchsCLGSRg2+MtLM4iHBucXfMcl9ogixnJIgznQWo2DNK29oP+kheQ1MMWrncIoN+jdAcuUCTEAYWTvJS4jTHc2k5a8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=FNoXvPlK; arc=none smtp.client-ip=209.85.214.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FNoXvPlK" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-227914acd20so62584735ad.1; Sat, 29 Mar 2025 00:33:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233588; x=1743838388; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=pPQ2wgB/QHLk3d3quX542tAD7K4cxjHyvVNK1jD2ymE=; b=FNoXvPlKsqR+hIJCNhwzgS4jZL5Inh0N1MtEVhnuLnp5wDEw/4s+xOpGc8fKq52RCm PJWHebn4Y5TYyaINzWxi69wnSAqb1VwcmNLilr1L9V3QajUNxIwfC+bTF2h21xGq6+ed pTOGcBzaGTsnTqRN2SpIsC+LNscj0Q0vKHHhvy78MuTiAkQ4lau+UgVwmBiUpmqpIcOI w4ohI306TRIucjt8IXeIuxXqzk1+QoBNeI0W2Ms27jp77VLUhXiC+eAUQiEjSnu6DgO6 TxUwbn9GOI7zYOkRrdvZBN3PuQ2Q1sJzDX+iPPg/K1QA8JSU1unU/SEUZhk/nRxlJPmL S+Fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233588; x=1743838388; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pPQ2wgB/QHLk3d3quX542tAD7K4cxjHyvVNK1jD2ymE=; b=h+z1NBs0u0fLLS17I4VIZNc0Eq/U5ttGzON4usYmYabAA13/e9IDlIrrtBB+vM42qr 3+baXFB1n1atg+XbtpwRBtVlyFWyFb81TnOSq3U43kSq9mGYzGsPjS6ofntOLZkE0QSM HKlCJFbFB80J2VHXVe2ZmuxlUT6tzCsA6FWp8psFbBwHq6nZuUiO/wq2kc3WKtGZXMfj WbqSVK75xzCsfKpaTxTP66J94kzFEMXPRV/KyJRHpoKW7TZXFKilmSF2kqWULGISceQq cvH2F4NZDBA1m0cnBAsg/h2XRZheYxsnN077f+RoM6nOmPKIBvLCS2rmHjU52R9SkHfe fD4A== X-Forwarded-Encrypted: i=1; AJvYcCUrrAEnw2FpSZL4JzD+HiLq8vM2fy/6NUOh1nkBPylDwq8+qIyTzYg3YKZG0TPH/BY/EI6HD7OejlovZzp0C99NlyBhNw==@vger.kernel.org, AJvYcCVukxzheCTCNj8AxEeVBg+MJ+ULfqQEpo1FCCbxjvrNOHWrz6E5mnQ5PIesFjW3KabYowBHYc5NZNc302A=@vger.kernel.org X-Gm-Message-State: AOJu0YzVd1bbrtXXLdOCzaqBxM1dqymJeHoczVGb5UByGkAnias4vfp0 RNBMbcNn//eS8z1yFSyaWHbwYSv3UQnuo4reRqDbU3FkcXXyotSA X-Gm-Gg: ASbGncs3Wcjmrd8ONE4EggCCb+gvHEWopleUd+bSyl/Otxs6PhGCa0CK6xz71Yt6Ybs UTNa1k97abQwhicIauaT+CDMnhF2bnSYDRs1JJ+4dlcuP9Dqk+ceVD70by15aZcY9rMmvkX9sYC wlAsW3ENMl6E+awsFJWJXfRjJDuYUpzkSzBxgBIcebdLZv8Q2AYI+ZHeJtMajnDZ58/5mscCm7M 7Taq4qnu71c7c56MaMXgrcREoumiZlJxBw1N+rGbsDJbXOUZ6DF+kDIAdRMx8rv/RwDV/Djj0o5 PuuvnuTMKnPnU7h3h3BEVs8BcnE9graDMa4J3M0wqNtY X-Google-Smtp-Source: AGHT+IHm582aKb7fSU1i5isdeEVlaCcikF+jMqhtwFuclB5srx4o7D5Vo3uYJLdRMwvTeukT4+xvag== X-Received: by 2002:a17:902:d4c9:b0:223:607c:1d99 with SMTP id d9443c01a7336-2292e918e21mr35795285ad.0.1743233588121; Sat, 29 Mar 2025 00:33:08 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:07 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:22 -0300 Subject: [PATCH v7 05/12] platform/x86: alienware-wmi-wmax: Improve platform profile probe Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-5-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Get and store the AWCC system description in alienware_awcc_setup() instead of awcc_platform_profile_probe() and get the correct offset by iterating through each member of the system_description. Then add a debug message for unmatched profiles and replace set_bit() with it's non-atomic version __set_bit() because the choices bitmap only belongs to this thread. In the process also check for a malformed system description by defining an arbitrary limit of resource count. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 63 +++++++++++++++++++---= ---- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index dd7a17619e38b32a5be6daf44efbaa8d224f304d..cd4234a282cbd3c480a77801c28= 2c3e786fc4a9c 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -8,6 +8,7 @@ =20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include #include #include @@ -39,6 +40,9 @@ #define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) #define AWCC_RESOURCE_ID_MASK GENMASK(7, 0) =20 +/* Arbitrary limit based on supported models */ +#define AWCC_MAX_RES_COUNT 16 + static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); MODULE_PARM_DESC(force_platform_profile, "Forces auto-detecting thermal pr= ofiles without checking if WMI thermal backend is available"); @@ -213,6 +217,17 @@ struct wmax_u32_args { =20 struct awcc_priv { struct wmi_device *wdev; + union { + u32 system_description; + struct { + u8 fan_count; + u8 temp_count; + u8 unknown_count; + u8 profile_count; + }; + u8 res_count[4]; + }; + struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; }; @@ -633,35 +648,37 @@ static int awcc_platform_profile_probe(void *drvdata,= unsigned long *choices) enum platform_profile_option profile; struct awcc_priv *priv =3D drvdata; enum awcc_thermal_profile mode; - u8 sys_desc[4]; - u32 first_mode; + u8 id, offset =3D 0; int ret; - u8 id; =20 - ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTI= ON, - 0, (u32 *) &sys_desc); - if (ret < 0) - return ret; - - first_mode =3D sys_desc[0] + sys_desc[1]; - - for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D awcc_op_get_resource_id(priv->wdev, i + first_mode, &id); + /* + * Thermal profile IDs are listed last at offset + * fan_count + temp_count + unknown_count + */ + for (unsigned int i =3D 0; i < ARRAY_SIZE(priv->res_count) - 1; i++) + offset +=3D priv->res_count[i]; =20 + for (unsigned int i =3D 0; i < priv->profile_count; i++) { + ret =3D awcc_op_get_resource_id(priv->wdev, i + offset, &id); if (ret =3D=3D -EIO) return ret; - + /* + * Some devices report an incorrect number of thermal profiles + * so the resource ID list may end prematurely + */ if (ret =3D=3D -EBADRQC) break; =20 - if (!is_awcc_thermal_profile_id(id)) + if (!is_awcc_thermal_profile_id(id)) { + dev_dbg(&priv->wdev->dev, "Unmapped thermal profile ID 0x%02x\n", id); continue; + } =20 mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile =3D awcc_mode_to_platform_profile[mode]; priv->supported_profiles[profile] =3D id; =20 - set_bit(profile, choices); + __set_bit(profile, choices); } =20 if (bitmap_empty(choices, PLATFORM_PROFILE_LAST)) @@ -671,7 +688,7 @@ static int awcc_platform_profile_probe(void *drvdata, u= nsigned long *choices) priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D AWCC_THERMAL_MODE_GMODE; =20 - set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); + __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } =20 return 0; @@ -702,6 +719,20 @@ static int alienware_awcc_setup(struct wmi_device *wde= v) if (!priv) return -ENOMEM; =20 + ret =3D awcc_thermal_information(wdev, AWCC_OP_GET_SYSTEM_DESCRIPTION, + 0, &priv->system_description); + if (ret < 0) + return ret; + + /* Sanity check */ + for (unsigned int i =3D 0; i < ARRAY_SIZE(priv->res_count); i++) { + if (priv->res_count[i] > AWCC_MAX_RES_COUNT) { + dev_err(&wdev->dev, "Malformed system description: 0x%08x\n", + priv->system_description); + return -ENXIO; + } + } + priv->wdev =3D wdev; dev_set_drvdata(&wdev->dev, priv); =20 --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4F5E71D7E3E; Sat, 29 Mar 2025 07:33:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233592; cv=none; b=koQA4r2lsBk2kv8MyKhUgsnhuzqw4mhU1YiU0qa5AL5mP9kUp0rZKODxdozg8sxgGQCu4XEUG3oyWLEi+Yh87/16H7LpZSusro+0zb8JufFQ7GX4k1bcUrKuuoqGAl02L35yX1WQL0lUCc/V7y231eonXVlq/G6UgZwCWMpllFQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233592; c=relaxed/simple; bh=QsWoyW1XS4m6Bd4r88tABkYNjT7y5g2Ky+C1X3Iu05k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ju6AXCIfEzv/wbsNj4AfJD8dJGBi0wCQgHDQ5l3f2nTvQpDspScUK5xy5k8+tpeS34qWAfq5xupsh0OWvSjgFWSsQ6BSVuSWJpqx/n+sKSYSvdk0JFztumJAFOYuMr4JW5+F8A8n/C3GzktTeMG7l8jDDWKjzZ6nF3mpxgLett8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mtWRxW8q; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mtWRxW8q" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-227a8cdd241so21496585ad.3; Sat, 29 Mar 2025 00:33:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233591; x=1743838391; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=cN5sVvQlZvDQ4uyq+1qDztNQT0cZNR4FxP0i2F4LalM=; b=mtWRxW8qGoqwKSb5i2zPV5VsTFWHhBJU+tQcWhSzF1BFfzvrjYxBMAtVV4miEGi+Bi /2YRwK9t3zNWhTmfFk28MmSksjkr0wPFu1l8gDT90ld3yW0bFY5UXhYg5JguYs6vWudQ Tgv3lpoRYIUFjqV4ma6kPg1e7ppmlge6y2A7g55GG++t5JS1y79jqiofmuxQ68M0M+ZE HVB6s0/RcB6ZDQSpgVtTnQmcr8SWGdZppNb+x8awRB2skCe0fQkAMS7YWuycEnl6N6EU rlKRdug0dy4XqBOIpj7Q5aSaS61IxkKcEVxHqp8hgJn/iH2dkVNT2L9RTTjoK4r7FTfw ORbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233591; x=1743838391; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cN5sVvQlZvDQ4uyq+1qDztNQT0cZNR4FxP0i2F4LalM=; b=fg6PHKX0e8S4nKeBMnZLYP8bDeZnzlza5KSimD+aruY++lu8eUR/te8q2lKC8gw3Ab ZMNHNh3HG1Bi18PX16SrhvFIMfEgsdav9w7Ri2gnvj4QnImkKeNlbl2DxFZ3AiuJJ1XW IFyLCA+9b80/zUKt6Xxta2VRP0+eJkHcJhz0M8n4Nf/cizfi584byk6tqv8RSR1jnLHx T4sXi1TspJM8wte5lS/QCLf0TrjH3Ztf1DMW/Of7cwq6w5crLzGH2AAPRqFADRMCEDXl BAW5NpO13YISzyzpPw6Q5EZLhqiVXuiCnQCGNbUGSnzwXPpqS+ZVEwkbyOp9PyLmRc0w Kaqw== X-Forwarded-Encrypted: i=1; AJvYcCVLlk+UYivNnxuBF/kmHZKZ/8eu7CxRB+KZ54n6mRfJpAGjcwhcl2eooUfZrudbsacNFxcwbsiCu9SqPnQ=@vger.kernel.org, AJvYcCWHzeCNnTrOAGxcfCUCd1kne8ulN9faC3Dvt3Kg6s+dPJMrUFZMWaZlGjF8QaKecqa7SZaEsISyi6fuCs4RrhCzIIJidg==@vger.kernel.org X-Gm-Message-State: AOJu0YyDr1g8G98DE5lo7skgH1SDLk29VaQVJcsliTVngm89ykgY0XGG uVpJLYm+5CmxJXsFTJVKg1xytB8ipdW9a5ygdOKLmVD2CKrSpoPD X-Gm-Gg: ASbGnctV7CDqcFdgIlK4RqzzwNK/WM+198UBSRKdoUO41ePZ+jJWO3uw4/5TtuAnw7/ BeAq03pmkMN9aqAqVRqiqO7AKgipBlplcEad12N88pg5kBoCYiLGEJiPtesMX9B2nfokxaC4oD6 /WMP+FpCWfukYYM827ZAV5LG0Pgo74ZdyLEcd808SfZFk1dx1cxraCorDLTj4oUZKTB7gp62D8c VzuZoUDqaqAKu4FiwtoAVbxdtE8oMJS6P4NlvSdetGE064vRpnKX/TdjBXxd+VTwXVhFJlvgH6G 4uHkOJs46MVshlCcqxEu7FqXxQpOXXg1FtsvGdYGfjGg X-Google-Smtp-Source: AGHT+IGhUsOkR9unrfcrbycTL5Ld5lHyW+wGhmOo/hH+o/oYYC6/PZbPQROSr0ywadTVy+e4nooz2A== X-Received: by 2002:a17:902:ebc6:b0:224:c76:5e57 with SMTP id d9443c01a7336-2292f9e8652mr31278955ad.39.1743233590460; Sat, 29 Mar 2025 00:33:10 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:10 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:23 -0300 Subject: [PATCH v7 06/12] platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-6-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support a "custom" thermal profile. In some models this profile signals user-space that the user wants to manually control the fans, which are always unlocked. In other models it actually unlocks manual fan control. Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index cd4234a282cbd3c480a77801c282c3e786fc4a9c..5bf8264a1063b7d3310100d0edb= fd0b9447dbe74 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -30,8 +30,6 @@ #define AWCC_METHOD_THERMAL_CONTROL 0x15 #define AWCC_METHOD_GAME_SHIFT_STATUS 0x25 =20 -#define AWCC_THERMAL_MODE_GMODE 0xAB - #define AWCC_FAILURE_CODE 0xFFFFFFFF #define AWCC_FAILURE_CODE_2 0xFFFFFFFE =20 @@ -179,6 +177,11 @@ enum AWCC_THERMAL_TABLES { AWCC_THERMAL_TABLE_USTT =3D 0xA, }; =20 +enum AWCC_SPECIAL_THERMAL_CODES { + AWCC_SPECIAL_PROFILE_CUSTOM =3D 0x00, + AWCC_SPECIAL_PROFILE_GMODE =3D 0xAB, +}; + enum awcc_thermal_profile { AWCC_PROFILE_USTT_BALANCED, AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, @@ -599,9 +602,15 @@ static int awcc_platform_profile_get(struct device *de= v, if (ret) return ret; =20 - if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { + switch (out_data) { + case AWCC_SPECIAL_PROFILE_CUSTOM: + *profile =3D PLATFORM_PROFILE_CUSTOM; + return 0; + case AWCC_SPECIAL_PROFILE_GMODE: *profile =3D PLATFORM_PROFILE_PERFORMANCE; return 0; + default: + break; } =20 if (!is_awcc_thermal_profile_id(out_data)) @@ -686,11 +695,17 @@ static int awcc_platform_profile_probe(void *drvdata,= unsigned long *choices) =20 if (awcc->gmode) { priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D - AWCC_THERMAL_MODE_GMODE; + AWCC_SPECIAL_PROFILE_GMODE; =20 __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } =20 + /* Every model supports the "custom" profile */ + priv->supported_profiles[PLATFORM_PROFILE_CUSTOM] =3D + AWCC_SPECIAL_PROFILE_CUSTOM; + + __set_bit(PLATFORM_PROFILE_CUSTOM, choices); + return 0; } =20 --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 979AB1DD9D1; Sat, 29 Mar 2025 07:33:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233597; cv=none; b=X5y2TsFQeecmK/ZAqIV9RCdN+KGgOEkZneD9urtSUnD5DZxYDH16yUT1xTM9ed4J4gu6gKTWpyNe+BiIrV8Gp4tohRq4HRsF48lLeOHKQJs41F8M/vxCmWBrKsGSsy6Crp7imjUt/l2EU8onZJvAYlQYQfG+ci1IukwN5pkVFqs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233597; c=relaxed/simple; bh=tJPI6XY8+qOQsPMgCyIx1Nc0CbBjtIKADrwfxDwCSnQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DylrgFReFboWsmWTwMxZ5xiji+XTB7fJzappWQG4o3kGdoG07rhRMQBpZnnKEmpdWVGXfueP8z+dpJlAQ/ho8f6ZojbDbZwQVnMHGqbLVGGMfSHHq8ufnya4LrUsFx8Z/2FG+FYL49jLxsMcB4AqPpS1yOZWzS3Rch+eQG8VLOE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bVIUE8pJ; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bVIUE8pJ" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2279915e06eso64214965ad.1; Sat, 29 Mar 2025 00:33:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233594; x=1743838394; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=+CzCk/+ZEkmYsZI5nEA5+PmPUTVAVE2lnIBa7jr4QLY=; b=bVIUE8pJlSGsC771FQZRAPiRGVPv+IRlW7F8sFDwFU5xqnYJifi5iyqtXrXdJAlrV9 4Jmo2Rid+i6u7nVIwW+71F86m29JrEPCpb9+d4Ha50/qAm53prQD/pgO2hQj5d9XV+Zo kAuBxxxljDkQvrBCQSLc1P1aws5QArrbMLlVSUTNvFvTlA9sFSCVIoxNMrx4Kqn8lScT NdSr0pndorT90t/1SA0lgAFg7vb8wPHnWa3Yd8Gp4xzjxQ0WtF+tIrrXuJv2SvfDVqyr 7L2+xLtwwE9xQaHh4dFi/noEcTrGR2Buj4UxnsqVoy5rh8OT4E2dEMFAuuIhU9u62sw0 MnRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233594; x=1743838394; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+CzCk/+ZEkmYsZI5nEA5+PmPUTVAVE2lnIBa7jr4QLY=; b=OQ2Wob1SgE3iS1Nut2skW9wCkZLb6uGrdsyGbINrpqI3uCgNP5E6b+cLEshyNPaY6F noI+ALjnEeItf32lQBRUEWnoV9cZaLtxu3wmuEbFfchQCirwJWDTqqGDUMRI5gihlHZT CT2iXBuKHA0A+WP52WWKK4f2p9tUn0PFghPOtEuz7xU3xxNePSVzLby0rNGZUyvL7KlE DxNjzqmWL2UfIRHtcYf2aWz5puArFf+ZqQ+cdlECe7qN/QHq8+git2QNmGC2riS6cmJJ 8AwHsP4IfIfuPP17o/FyhPePsnOocpbrQ4ah7ihsjGhTCuIs/CJhmcUZDSSfjYnVGQup /0nw== X-Forwarded-Encrypted: i=1; AJvYcCU1pEdGJNLbK5fwQBgXBO4UbzeSq5eJdfHfoBrz/JiXowb/CQFYljQI2dEY3fJ+9WF5PXhMTsbSCSm2BjbNp/Gap/54tQ==@vger.kernel.org, AJvYcCWs5yZXDMtuEh9nGxLobVwUIY07UvjuuOj6z3P6nqf9CtHju9TmwRLCkGPdqDELtNL9/TkCFYCeZ8kt2Ejm@vger.kernel.org, AJvYcCXYVwo+LZWM/tPVIx9CldlX6aTrNaqfSAuk9IKuPRrYGpX6zsfNaRoodgzvE0YAKjVeVH+EfWxJfOGE5w==@vger.kernel.org X-Gm-Message-State: AOJu0YxDh7mqB7TpFCfiahgbIxbfHJxPFJPnDOa40Jce+9uaeOVrElfw 6rDQOgurQzd4NAZ5lTw6CPtwgCxeqCTF2/msmbHcPBGI8CyemV7x X-Gm-Gg: ASbGncsC0ItoumREY3B5o+sJ/pADZ3Sn1HLK3AX5+Eawg2QJQkC559GKk1rlpE0+M7f 6lu0rqmmKcKlMDWC49yXxUaDM0mNWsKUSUJnz8gN1FKKVLx1JqM+M8U6rIlHeUJCkyxiQd0Maue GYnTOFNT7xetSRj6r7MaKqnnAY79n+ZY7BNO2puMC+wilAxJUvQ5JBqPRXkp3jW3osOaEWWA9AD J9PPh8klzU4U5HuAnXGTlc9wwsWOuqwspZeb2eUxzjwGAdh+204iZ0okZ8a+R+iYQVlsoA2Jg99 eF4XJLY7xNl8vRAhw4qVqeTbCx76orV5CSVvX1F3yH1f X-Google-Smtp-Source: AGHT+IGlZBnBaps8SptGLe5hwUJwqD1sitC4IcUnJ11+3QvFWpylhvP+6zc4Nn9rUXarj/rKVvgI1w== X-Received: by 2002:a17:902:d2d1:b0:223:f9a4:3fa8 with SMTP id d9443c01a7336-2292f95d8bdmr27841645ad.19.1743233593499; Sat, 29 Mar 2025 00:33:13 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:13 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:24 -0300 Subject: [PATCH v7 07/12] platform/x86: alienware-wmi-wmax: Add HWMON support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-7-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support monitoring fan speed and temperature sensors. Expose this feature through the HWMON interface. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/dell/alienware-wmi-wmax.c | 396 +++++++++++++++++++++= ++++ 2 files changed, 397 insertions(+) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/= Kconfig index f8a0dffcaab7c3b423472c5b9093011334a698c8..f7107b0c55f27c9be70f50b36dd= 2e7bab42a6960 100644 --- a/drivers/platform/x86/dell/Kconfig +++ b/drivers/platform/x86/dell/Kconfig @@ -22,6 +22,7 @@ config ALIENWARE_WMI depends on DMI depends on LEDS_CLASS depends on NEW_LEDS + depends on HWMON help This is a driver for controlling Alienware WMI driven features. =20 diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 5bf8264a1063b7d3310100d0edbfd0b9447dbe74..3fe0ac006657874614f906f1292= 751ffae213c48 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -10,10 +10,13 @@ =20 #include #include +#include #include #include +#include #include #include +#include #include #include "alienware-wmi.h" =20 @@ -26,6 +29,7 @@ #define WMAX_METHOD_BRIGHTNESS 0x3 #define WMAX_METHOD_ZONE_CONTROL 0x4 =20 +#define AWCC_METHOD_GET_FAN_SENSORS 0x13 #define AWCC_METHOD_THERMAL_INFORMATION 0x14 #define AWCC_METHOD_THERMAL_CONTROL 0x15 #define AWCC_METHOD_GAME_SHIFT_STATUS 0x25 @@ -40,6 +44,12 @@ =20 /* Arbitrary limit based on supported models */ #define AWCC_MAX_RES_COUNT 16 +#define AWCC_ID_BITMAP_SIZE (U8_MAX + 1) +#define AWCC_ID_BITMAP_LONGS BITS_TO_LONGS(AWCC_ID_BITMAP_SIZE) + +static bool force_hwmon; +module_param_unsafe(force_hwmon, bool, 0); +MODULE_PARM_DESC(force_hwmon, "Force probing for HWMON support without che= cking if the WMI backend is available"); =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -50,16 +60,19 @@ module_param_unsafe(force_gmode, bool, 0); MODULE_PARM_DESC(force_gmode, "Forces G-Mode when performance profile is s= elected"); =20 struct awcc_quirks { + bool hwmon; bool pprof; bool gmode; }; =20 static struct awcc_quirks g_series_quirks =3D { + .hwmon =3D true, .pprof =3D true, .gmode =3D true, }; =20 static struct awcc_quirks generic_quirks =3D { + .hwmon =3D true, .pprof =3D true, .gmode =3D false, }; @@ -157,9 +170,18 @@ static const struct dmi_system_id awcc_dmi_table[] __i= nitconst =3D { }, }; =20 +enum AWCC_GET_FAN_SENSORS_OPERATIONS { + AWCC_OP_GET_TOTAL_FAN_TEMPS =3D 0x01, + AWCC_OP_GET_FAN_TEMP_ID =3D 0x02, +}; + enum AWCC_THERMAL_INFORMATION_OPERATIONS { AWCC_OP_GET_SYSTEM_DESCRIPTION =3D 0x02, AWCC_OP_GET_RESOURCE_ID =3D 0x03, + AWCC_OP_GET_TEMPERATURE =3D 0x04, + AWCC_OP_GET_FAN_RPM =3D 0x05, + AWCC_OP_GET_FAN_MIN_RPM =3D 0x08, + AWCC_OP_GET_FAN_MAX_RPM =3D 0x09, AWCC_OP_GET_CURRENT_PROFILE =3D 0x0B, }; =20 @@ -182,6 +204,11 @@ enum AWCC_SPECIAL_THERMAL_CODES { AWCC_SPECIAL_PROFILE_GMODE =3D 0xAB, }; =20 +enum AWCC_TEMP_SENSOR_TYPES { + AWCC_TEMP_SENSOR_CPU =3D 0x01, + AWCC_TEMP_SENSOR_GPU =3D 0x06, +}; + enum awcc_thermal_profile { AWCC_PROFILE_USTT_BALANCED, AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, @@ -218,6 +245,14 @@ struct wmax_u32_args { u8 arg3; }; =20 +struct awcc_fan_data { + unsigned long auto_channels_temp; + const char *label; + u32 min_rpm; + u32 max_rpm; + u8 id; +}; + struct awcc_priv { struct wmi_device *wdev; union { @@ -233,6 +268,10 @@ struct awcc_priv { =20 struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; + + struct device *hwdev; + struct awcc_fan_data **fan_data; + unsigned long temp_sensors[AWCC_ID_BITMAP_LONGS]; }; =20 static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { @@ -497,6 +536,19 @@ static int awcc_wmi_command(struct wmi_device *wdev, u= 32 method_id, return 0; } =20 +static int awcc_get_fan_sensors(struct wmi_device *wdev, u8 operation, + u8 fan_id, u8 index, u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D operation, + .arg1 =3D fan_id, + .arg2 =3D index, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_GET_FAN_SENSORS, &args, out); +} + static int awcc_thermal_information(struct wmi_device *wdev, u8 operation,= u8 arg, u32 *out) { @@ -562,6 +614,30 @@ static int awcc_op_get_resource_id(struct wmi_device *= wdev, u8 index, u8 *out) return 0; } =20 +static int awcc_op_get_fan_rpm(struct wmi_device *wdev, u8 fan_id, u32 *ou= t) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_FAN_RPM, + .arg1 =3D fan_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); +} + +static int awcc_op_get_temperature(struct wmi_device *wdev, u8 temp_id, u3= 2 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_TEMPERATURE, + .arg1 =3D temp_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); +} + static int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) { struct wmax_u32_args args =3D { @@ -587,6 +663,313 @@ static int awcc_op_activate_profile(struct wmi_device= *wdev, u8 profile) return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); } =20 +/* + * HWMON + * - Provides temperature and fan speed monitoring as well as manual fan + * control + */ +static umode_t awcc_hwmon_is_visible(const void *drvdata, enum hwmon_senso= r_types type, + u32 attr, int channel) +{ + const struct awcc_priv *priv =3D drvdata; + unsigned int temp_count; + + switch (type) { + case hwmon_temp: + temp_count =3D bitmap_weight(priv->temp_sensors, AWCC_ID_BITMAP_SIZE); + + return channel < temp_count ? 0444 : 0; + case hwmon_fan: + return channel < priv->fan_count ? 0444 : 0; + case hwmon_pwm: + return channel < priv->fan_count ? 0444 : 0; + default: + return 0; + } +} + +static int awcc_hwmon_read(struct device *dev, enum hwmon_sensor_types typ= e, + u32 attr, int channel, long *val) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + const struct awcc_fan_data *fan; + u32 state; + int ret; + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (attr) { + case hwmon_temp_input: + ret =3D awcc_op_get_temperature(priv->wdev, temp, &state); + if (ret) + return ret; + + *val =3D state * MILLIDEGREE_PER_DEGREE; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_fan: + fan =3D priv->fan_data[channel]; + + switch (attr) { + case hwmon_fan_input: + ret =3D awcc_op_get_fan_rpm(priv->wdev, fan->id, &state); + if (ret) + return ret; + + *val =3D state; + break; + case hwmon_fan_min: + *val =3D fan->min_rpm; + break; + case hwmon_fan_max: + *val =3D fan->max_rpm; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_pwm: + fan =3D priv->fan_data[channel]; + + switch (attr) { + case hwmon_pwm_auto_channels_temp: + *val =3D fan->auto_channels_temp; + break; + default: + return -EOPNOTSUPP; + } + + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_ty= pes type, + u32 attr, int channel, const char **str) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (temp) { + case AWCC_TEMP_SENSOR_CPU: + *str =3D "CPU"; + break; + case AWCC_TEMP_SENSOR_GPU: + *str =3D "GPU"; + break; + default: + *str =3D "Unknown"; + break; + } + + break; + case hwmon_fan: + *str =3D priv->fan_data[channel]->label; + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static const struct hwmon_ops awcc_hwmon_ops =3D { + .is_visible =3D awcc_hwmon_is_visible, + .read =3D awcc_hwmon_read, + .read_string =3D awcc_hwmon_read_string, +}; + +static const struct hwmon_channel_info * const awcc_hwmon_info[] =3D { + HWMON_CHANNEL_INFO(temp, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT + ), + HWMON_CHANNEL_INFO(fan, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX + ), + HWMON_CHANNEL_INFO(pwm, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP + ), + NULL +}; + +static const struct hwmon_chip_info awcc_hwmon_chip_info =3D { + .ops =3D &awcc_hwmon_ops, + .info =3D awcc_hwmon_info, +}; + +static int awcc_hwmon_temps_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + unsigned int i; + int ret; + u8 id; + + for (i =3D 0; i < priv->temp_count; i++) { + /* + * Temperature sensors IDs are listed after the fan IDs at + * offset `fan_count` + */ + ret =3D awcc_op_get_resource_id(wdev, i + priv->fan_count, &id); + if (ret) + return ret; + + __set_bit(id, priv->temp_sensors); + } + + return 0; +} + +static char *awcc_get_fan_label(struct device *dev, u32 temp_count, u8 tem= p_id) +{ + char *label; + + switch (temp_count) { + case 0: + label =3D "Independent Fan"; + break; + case 1: + switch (temp_id) { + case AWCC_TEMP_SENSOR_CPU: + label =3D "Processor Fan"; + break; + case AWCC_TEMP_SENSOR_GPU: + label =3D "Video Fan"; + break; + default: + label =3D "Unknown Fan"; + break; + } + + break; + default: + label =3D "Shared Fan"; + break; + } + + return label; +} + +static int awcc_hwmon_fans_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + unsigned long fan_temps[AWCC_ID_BITMAP_LONGS]; + unsigned long gather[AWCC_ID_BITMAP_LONGS]; + u32 min_rpm, max_rpm, temp_count, temp_id; + struct awcc_fan_data *fan_data; + unsigned int i, j; + char *label; + int ret; + u8 id; + + for (i =3D 0; i < priv->fan_count; i++) { + fan_data =3D devm_kzalloc(&wdev->dev, sizeof(*fan_data), GFP_KERNEL); + if (!fan_data) + return -ENOMEM; + + /* + * Fan IDs are listed first at offset 0 + */ + ret =3D awcc_op_get_resource_id(wdev, i, &id); + if (ret) + return ret; + + ret =3D awcc_thermal_information(wdev, AWCC_OP_GET_FAN_MIN_RPM, id, + &min_rpm); + if (ret) + return ret; + + ret =3D awcc_thermal_information(wdev, AWCC_OP_GET_FAN_MAX_RPM, id, + &max_rpm); + if (ret) + return ret; + + ret =3D awcc_get_fan_sensors(wdev, AWCC_OP_GET_TOTAL_FAN_TEMPS, id, + 0, &temp_count); + if (ret) + return ret; + + for (j =3D 0; j < temp_count; j++) { + ret =3D awcc_get_fan_sensors(wdev, AWCC_OP_GET_FAN_TEMP_ID, + id, j, &temp_id); + if (ret) + break; + + temp_id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, temp_id); + __set_bit(temp_id, fan_temps); + } + + label =3D awcc_get_fan_label(&wdev->dev, temp_count, temp_id); + if (!label) + return -ENOMEM; + + fan_data->id =3D id; + fan_data->min_rpm =3D min_rpm; + fan_data->max_rpm =3D max_rpm; + fan_data->label =3D label; + bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE= ); + bitmap_copy(&fan_data->auto_channels_temp, gather, BITS_PER_LONG); + priv->fan_data[i] =3D fan_data; + + bitmap_zero(fan_temps, AWCC_ID_BITMAP_SIZE); + } + + return 0; +} + +static int awcc_hwmon_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + int ret; + + priv->fan_data =3D devm_kcalloc(&wdev->dev, priv->fan_count, + sizeof(*priv->fan_data), GFP_KERNEL); + if (!priv->fan_data) + return -ENOMEM; + + ret =3D awcc_hwmon_temps_init(wdev); + if (ret) + return ret; + + ret =3D awcc_hwmon_fans_init(wdev); + if (ret) + return ret; + + priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", priv, + &awcc_hwmon_chip_info, NULL); + + return PTR_ERR_OR_ZERO(priv->hwdev); +} + /* * Thermal Profile control * - Provides thermal profile control through the Platform Profile API @@ -751,6 +1134,12 @@ static int alienware_awcc_setup(struct wmi_device *wd= ev) priv->wdev =3D wdev; dev_set_drvdata(&wdev->dev, priv); =20 + if (awcc->hwmon) { + ret =3D awcc_hwmon_init(wdev); + if (ret) + return ret; + } + if (awcc->pprof) { ret =3D awcc_platform_profile_init(wdev); if (ret) @@ -831,6 +1220,13 @@ int __init alienware_wmax_wmi_init(void) if (id) awcc =3D id->driver_data; =20 + if (force_hwmon) { + if (!awcc) + awcc =3D &empty_quirks; + + awcc->hwmon =3D true; + } + if (force_platform_profile) { if (!awcc) awcc =3D &empty_quirks; --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 880D31A2645; Sat, 29 Mar 2025 07:33:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233599; cv=none; b=MavvFu5twQCFcx4T8iaK2XSxWd/HDEktBSmJik3alaxEnjyVS6t1FpI4jU58Q97HFn0Wpwtx5RwQOwyI1jl3WOBrYx/+n3xZRZ8HYSk92wn17xikdq+YC5RJTNr8VZnniefNhH74vZpmtX+8zCpShWbTJ4oVo8mIDVtwAAUxprQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233599; c=relaxed/simple; bh=bE6GWgQGK0ROa75RwFSbYgWnzUSnToqDvz6ktr+Sy+w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NiBZpY63xGmR5RiTGOjrgav7+BqzUmNC69Ie80ydPAaCmCUXKQDRfYrMLOUAAqh1sYTBAXzw7kxhZDmj7vhd7Bv1gNtBTj7d5kMSfx75kL0SCVTFSCJlOtqaAyaZER1eUrRIASqvYRLb9FT5tXnjYhe1PRnxY7avr3jgofLZLkM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=fD1D1vtq; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="fD1D1vtq" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2239c066347so68280255ad.2; Sat, 29 Mar 2025 00:33:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233597; x=1743838397; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4MtBGS2/x8T2jLqD9M8LJcRz60Pri7ZLNfNVI2fVXvs=; b=fD1D1vtqSOttdTcoUEX/WwlcQZxn2VF53zpRNgsnbdq08am4oqvrXVuEA2nGg8oa9i KWu3C05JlbRfNZZtYM3GT4zvEOaqIoIFL7H7BhtSdMc5JTtNMDCfmMu/3cn5fHsMQC+e ASd+ag7mG5oXvxOFzwH/0htx0owK9YoYFHeGhlWAoTe5a5nL3IlifjISp6b0AuVEttSd tZaX+Fz+Za98WGClYGkNh+icpbziWmZRA+AjBhz60oWI+r2c+VPMEOa3c/8Twaf/I0DK 32z/JfELgTNoYkrx550CTPDlkEE6vnSDl6F0N2FS/xHGsQjzbtza/ZPIKK3BkZ6C7/1G vN9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233597; x=1743838397; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4MtBGS2/x8T2jLqD9M8LJcRz60Pri7ZLNfNVI2fVXvs=; b=f4ka8ROa2TVzx2XKeCTG40cw0hMKais/tLk+Qo+iqxu1yA89dIjunQWSnxYBUCdcjh 6t9T7rgOcX827mpIPb42WtguonInQl3Hu3zF0EKPr3ofDA/VqDjxBNfGXObgGphDAl8a eSow2KZXahwyauMxJ7ctuWgkae+T7zkfZC63qR9D1M/HKU5zIGezkCnhQDbPmCNoML32 yuOVyvJfp64+AAhazAT0Pf1SAQKLWyujRynXAryiUyZezcuEcX89Fx5Ioo/twq8eEYjn ZCaL07pAC41dFIue3/YFItlxZys6VO1SfOQnoMp4Ub+NgsNL+AXP/lCipXMOxDo+2An7 mIGA== X-Forwarded-Encrypted: i=1; AJvYcCVbhyc12BnqQNR29kNWoGevybDqvYsjOm1zb933ANWTEoaRbzrPpIHTuq4GCzEe1mA02fh6XtPzw2wMmA==@vger.kernel.org, AJvYcCVqxV2eMQLUTj9lYcNVGCAR0pm8dfBOihbIABrzfLaXCnCRk7mmLCKk5QBmAHSGQBL4pL+PjXxHY0WBCIM5@vger.kernel.org, AJvYcCXWo4LDjbwlkhNAsyO8+uSAbQQzwGw//iaqkvyOaphlC2OdWehoN4IqlXyJHQLfWoyCb7zil1F3wAJVY9GhAxcDHN29gQ==@vger.kernel.org X-Gm-Message-State: AOJu0Yy475qvNpzgCX4Zl972uSvk9rdIuF62CqJ4OvJEtTpHbQXj9opd U8OwtMHMZuUgXz8rb3voKiHDX94J7/OJooSReWgqDAv7tTV/vNkd X-Gm-Gg: ASbGnctIVX4zvLFq4ns/mSeel720+vEPAUlFR/ANSx0tTxmxZWEZwAEh/B7hKGeVugD P50P/J1Daiz0+5goFiiX7PjBeIveW+a/lJby6wbvj/iuj7yrdITm0IpVfIMe9Cw1NKo6YYLNi9r 9O/iRYL6+Bk04fZLTle+Dn2xbFGnafHtqOALfx7VS5x1mv6MfYK3kEb5pZcGGABso/KRB3HPj+l CBn6u9WX0yJwVYaDHe6SBvc37YwGyqxYJaPOQ3MK39REEEkrwvs0Igm6pBZEmVstIBaMGKuxmMt gDsqVJqYx5lKsYu9lhTM60g2F0z4ZTspa7u65uZQ7ZVI X-Google-Smtp-Source: AGHT+IG7MoE24TOeBqZdX4inNurMY9P3FdclyKLQwUe1o8MigWfim1krViuF+sZyb3ZDkT38wdfhEw== X-Received: by 2002:a17:902:db01:b0:215:8809:b3b7 with SMTP id d9443c01a7336-2292f946440mr31205625ad.7.1743233596538; Sat, 29 Mar 2025 00:33:16 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:16 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:25 -0300 Subject: [PATCH v7 08/12] platform/x86: alienware-wmi-wmax: Add support for manual fan control Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-8-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support a way of manually controlling fans. The PWM duty cycle of a fan can't be controlled directly. Instead the AWCC interface let's us tune a fan `boost` value, which has the following empirically discovered, approximate behavior over the PWM value: pwm =3D pwm_base + (fan_boost / 255) * (pwm_max - pwm_base) Where the pwm_base is the locked PWM value controlled by the FW and fan_boost is a value between 0 and 255. Expose this fan_boost knob as a custom HWMON attribute. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 174 +++++++++++++++++++++= +++- 1 file changed, 172 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 3fe0ac006657874614f906f1292751ffae213c48..6caf3470d7e15e87540b7d933ad= 74e9877d6ebab 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -14,8 +14,12 @@ #include #include #include +#include +#include +#include #include #include +#include #include #include #include "alienware-wmi.h" @@ -183,10 +187,12 @@ enum AWCC_THERMAL_INFORMATION_OPERATIONS { AWCC_OP_GET_FAN_MIN_RPM =3D 0x08, AWCC_OP_GET_FAN_MAX_RPM =3D 0x09, AWCC_OP_GET_CURRENT_PROFILE =3D 0x0B, + AWCC_OP_GET_FAN_BOOST =3D 0x0C, }; =20 enum AWCC_THERMAL_CONTROL_OPERATIONS { AWCC_OP_ACTIVATE_PROFILE =3D 0x01, + AWCC_OP_SET_FAN_BOOST =3D 0x02, }; =20 enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { @@ -250,6 +256,7 @@ struct awcc_fan_data { const char *label; u32 min_rpm; u32 max_rpm; + u8 suspend_cache; u8 id; }; =20 @@ -638,6 +645,18 @@ static int awcc_op_get_temperature(struct wmi_device *= wdev, u8 temp_id, u32 *out return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); } =20 +static int awcc_op_get_fan_boost(struct wmi_device *wdev, u8 fan_id, u32 *= out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_FAN_BOOST, + .arg1 =3D fan_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out= ); +} + static int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) { struct wmax_u32_args args =3D { @@ -663,6 +682,19 @@ static int awcc_op_activate_profile(struct wmi_device = *wdev, u8 profile) return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); } =20 +static int awcc_op_set_fan_boost(struct wmi_device *wdev, u8 fan_id, u8 bo= ost) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_SET_FAN_BOOST, + .arg1 =3D fan_id, + .arg2 =3D boost, + .arg3 =3D 0, + }; + u32 out; + + return awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); +} + /* * HWMON * - Provides temperature and fan speed monitoring as well as manual fan @@ -827,6 +859,81 @@ static const struct hwmon_chip_info awcc_hwmon_chip_in= fo =3D { .info =3D awcc_hwmon_info, }; =20 +static ssize_t fan_boost_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + int index =3D to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan =3D priv->fan_data[index]; + u32 boost; + int ret; + + ret =3D awcc_op_get_fan_boost(priv->wdev, fan->id, &boost); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", boost); +} + +static ssize_t fan_boost_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t count) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + int index =3D to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan =3D priv->fan_data[index]; + unsigned long val; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret) + return ret; + + ret =3D awcc_op_set_fan_boost(priv->wdev, fan->id, clamp_val(val, 0, 255)= ); + + return ret ? ret : count; +} + +static SENSOR_DEVICE_ATTR_RW(fan1_boost, fan_boost, 0); +static SENSOR_DEVICE_ATTR_RW(fan2_boost, fan_boost, 1); +static SENSOR_DEVICE_ATTR_RW(fan3_boost, fan_boost, 2); +static SENSOR_DEVICE_ATTR_RW(fan4_boost, fan_boost, 3); +static SENSOR_DEVICE_ATTR_RW(fan5_boost, fan_boost, 4); +static SENSOR_DEVICE_ATTR_RW(fan6_boost, fan_boost, 5); + +static umode_t fan_boost_attr_visible(struct kobject *kobj, struct attribu= te *attr, int n) +{ + struct awcc_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return n < priv->fan_count ? attr->mode : 0; +} + +static bool fan_boost_group_visible(struct kobject *kobj) +{ + return true; +} + +DEFINE_SYSFS_GROUP_VISIBLE(fan_boost); + +static struct attribute *fan_boost_attrs[] =3D { + &sensor_dev_attr_fan1_boost.dev_attr.attr, + &sensor_dev_attr_fan2_boost.dev_attr.attr, + &sensor_dev_attr_fan3_boost.dev_attr.attr, + &sensor_dev_attr_fan4_boost.dev_attr.attr, + &sensor_dev_attr_fan5_boost.dev_attr.attr, + &sensor_dev_attr_fan6_boost.dev_attr.attr, + NULL +}; + +static const struct attribute_group fan_boost_group =3D { + .attrs =3D fan_boost_attrs, + .is_visible =3D SYSFS_GROUP_VISIBLE(fan_boost), +}; + +static const struct attribute_group *awcc_hwmon_groups[] =3D { + &fan_boost_group, + NULL +}; + static int awcc_hwmon_temps_init(struct wmi_device *wdev) { struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); @@ -964,12 +1071,56 @@ static int awcc_hwmon_init(struct wmi_device *wdev) if (ret) return ret; =20 - priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", priv, - &awcc_hwmon_chip_info, NULL); + priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", + priv, &awcc_hwmon_chip_info, + awcc_hwmon_groups); =20 return PTR_ERR_OR_ZERO(priv->hwdev); } =20 +static void awcc_hwmon_suspend(struct device *dev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + u32 boost; + int ret; + + for (i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_FAN_BOOST, + fan->id, &boost); + if (ret) + dev_err(dev, "Failed to store Fan %u boost while suspending\n", i); + + fan->suspend_cache =3D ret ? 0 : clamp_val(boost, 0, 255); + + awcc_op_set_fan_boost(priv->wdev, fan->id, 0); + if (ret) + dev_err(dev, "Failed to set Fan %u boost to 0 while suspending\n", i); + } +} + +static void awcc_hwmon_resume(struct device *dev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + int ret; + + for (i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + if (!fan->suspend_cache) + continue; + + ret =3D awcc_op_set_fan_boost(priv->wdev, fan->id, fan->suspend_cache); + if (ret) + dev_err(dev, "Failed to restore Fan %u boost while resuming\n", i); + } +} + /* * Thermal Profile control * - Provides thermal profile control through the Platform Profile API @@ -1196,6 +1347,24 @@ static int wmax_wmi_probe(struct wmi_device *wdev, c= onst void *context) return ret; } =20 +static int wmax_wmi_suspend(struct device *dev) +{ + if (awcc->hwmon) + awcc_hwmon_suspend(dev); + + return 0; +} + +static int wmax_wmi_resume(struct device *dev) +{ + if (awcc->hwmon) + awcc_hwmon_resume(dev); + + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(wmax_wmi_pm_ops, wmax_wmi_suspend, wmax_wm= i_resume); + static const struct wmi_device_id alienware_wmax_device_id_table[] =3D { { WMAX_CONTROL_GUID, NULL }, { }, @@ -1206,6 +1375,7 @@ static struct wmi_driver alienware_wmax_wmi_driver = =3D { .driver =3D { .name =3D "alienware-wmi-wmax", .probe_type =3D PROBE_PREFER_ASYNCHRONOUS, + .pm =3D pm_sleep_ptr(&wmax_wmi_pm_ops), }, .id_table =3D alienware_wmax_device_id_table, .probe =3D wmax_wmi_probe, --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F27371DE3AA; Sat, 29 Mar 2025 07:33:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233601; cv=none; b=BJEfpB0WgIM8aajVK1ASjf4ePZ5/V8igQQ1TDLc0Cxg1kxPMk/w0p6LwpiRixAClyUQmK1hR815dNqQk6gOE23jT9evdgS9iB6XWL7N8qKZOhRrpJmM1OYfp6GAprLuS9e+Dhh8D7Dtokg+PdawndjYfJMbxMSUpEC832yxim40= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233601; c=relaxed/simple; bh=ggUHYZAQ/F2EB/vDjA3YNXT/j4PnfZVt5E4Sr0rzvrk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rjjVhceCFTlrYnAMZwTybM3KRBDl5MRVx5awKASpGFxeIXgxsOLCYa26bYnoG7FoC/ihfbn0Ho/x6y9rG5TOrksK9cbOX+dzlxWZJ9RctCMexOcrFZDRMQwuhTJxw+IfGlHW/zbhEdFPNPgQgEp/wsqxV0/17uaPugbmK4kigU0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XuM9GjPE; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XuM9GjPE" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-224019ad9edso23694415ad.1; Sat, 29 Mar 2025 00:33:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233599; x=1743838399; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=JWhFsh+9qCiKGqocw+5Jw++txcRn+H2RuV9iB960vv0=; b=XuM9GjPEB3s7TYK1qYK417nszbomgo0RlJhVrwCY7jjIwhUSSo/s3ceKo2AN86Em9n SzHRBHPEcrPU6vWtIEYMmdh5bFKeqC/5w0ZEZa5/yUbO2BfY85lAURJbOACx4runlf/r K8/6lsx4yCXZzrw0hi3nEHR4qM46/PD17GNetAQWMCLh/HYsH6RLSIQHIHDKjSuwIuLa rQlgYiaxoodyAvT4+rLWGUtvVypmYv38a1Q5OOMcGWxQYsok0r3bQB3J3XBH7WmsOWPE DsPamwf6CrDmPzrXe85k1rBGTPpc7HWWh6k8G81K7deFjpRpYyO1/6N0k/V6X+WaUuJk Tx0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233599; x=1743838399; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JWhFsh+9qCiKGqocw+5Jw++txcRn+H2RuV9iB960vv0=; b=ILAz7TRpcPEmCuj7hFb5d02eOxVlwxqcugK7wt8uIOBCWo1mTYYWowEeeg097yexvg qCwWD8IF9iwEhaJ2sY+OjGqbp4ZRj2qiFtjx0yRaEQEe0AF42WwxkumrGArf4fS9vLnF RlbD+lqzBKCaTaHq+Kh6WIM8TSo1Q9/edX9Bp9twwp7TcXckOwn2giO9SiO2naHZMgXV mbaKR/VEoNLvnxE+G1u2HfPwjwyFgPNm5pqINEb+cHx96gYHksCsI9RHjRh7ejrTzGOF LbORib+RRrpuioXAHiO7HjEoH4yibg6mX2k6eCMh/8n28ygFe1VILkNNQyYmmAZx+rRk z+qg== X-Forwarded-Encrypted: i=1; AJvYcCUdIAVHL7N4v8PfNu3YclrO5hZgwAR52uXfDyZft8x/4yJyuJs1cOf6MxxONwdNONwOfzJfE2IjZfrbYi8=@vger.kernel.org, AJvYcCWV5zqWPThehxwwIFOz0S12Ve5kK/ODapnwMVw4G4VEfUR3sc0qOJkrmJeJdnsbqow13oe3fEuDUXo5SE9OaoxcLfYCxQ==@vger.kernel.org X-Gm-Message-State: AOJu0YygQx1xAdzoTr6sTTNtdkL1H3U7Ekc/YEdkk8ONRRddpwSKLqPa wnf2k002OVSH2ftku99vEmTT59BNqYsi1rrWmrTaCIRJBIGyEZaw X-Gm-Gg: ASbGncuZbLUecvE+JjeU+Ehr3H/NBww1gDoBfESgdmzeI5zOl4HHfZqwFCcFOVrh14w 4j/8kH2MA3X5hQK6nE3J8nfcvXoo14hjJlkjTrbGcM1TXJCkO6n5tRPoT7AfcvbqszX5jXMso/r qfpX9rjCsOvuPp0admd6F5KvcqHc91WJpzmuim1ilEE/8wwaR6O+lXAJAHEdxHFsHfuobs6gnh6 WKiftGWklvMQM8hfpjlYz2Fculr6XGJcQVfMdEB21zPOhmyUCdSLGZTmyBb6m+8Dwo93jOTO++p mfX+ynYPfI1ia/cXeBNTKoiQpoyCL9iVHjRp7p3toYcXuQqGZmKYmaU= X-Google-Smtp-Source: AGHT+IFfgjZDYwZLLYvjQ8WtIUjPjJxfnwr5GJ9xJamdaHy4Qj9ulq8T43yUy++SigKOp6SdsIj2Bw== X-Received: by 2002:a17:902:f709:b0:224:7a4:b2a with SMTP id d9443c01a7336-2292f942aa8mr36389425ad.11.1743233598871; Sat, 29 Mar 2025 00:33:18 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:18 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:26 -0300 Subject: [PATCH v7 09/12] platform/x86: alienware-wmi-wmax: Add a DebugFS interface Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-9-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add a debugfs interface which exposes thermal private data. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 90 ++++++++++++++++++++++= ++++ 1 file changed, 90 insertions(+) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 6caf3470d7e15e87540b7d933ad74e9877d6ebab..faeddfe3b79e0aa51e7c8c6b23a= a4ac5c7218706 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +21,7 @@ #include #include #include +#include #include #include #include "alienware-wmi.h" @@ -1259,6 +1261,92 @@ static int awcc_platform_profile_init(struct wmi_dev= ice *wdev) return PTR_ERR_OR_ZERO(priv->ppdev); } =20 +/* + * DebugFS + */ +static int awcc_debugfs_system_description_read(struct seq_file *seq, void= *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + + seq_printf(seq, "0x%08x\n", priv->system_description); + + return 0; +} + +static int awcc_debugfs_hwmon_data_read(struct seq_file *seq, void *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + const struct awcc_fan_data *fan; + unsigned int bit; + + seq_printf(seq, "Number of fans: %u\n", priv->fan_count); + seq_printf(seq, "Number of temperature sensors: %u\n\n", priv->temp_count= ); + + for (u32 i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + seq_printf(seq, "Fan %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", fan->id); + seq_printf(seq, " Related temperature sensors bitmap: %lu\n", + fan->auto_channels_temp); + } + + seq_puts(seq, "\nTemperature sensor IDs:\n"); + for_each_set_bit(bit, priv->temp_sensors, AWCC_ID_BITMAP_SIZE) + seq_printf(seq, " 0x%02x\n", bit); + + return 0; +} + +static int awcc_debugfs_pprof_data_read(struct seq_file *seq, void *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + + seq_printf(seq, "Number of thermal profiles: %u\n\n", priv->profile_count= ); + + for (u32 i =3D 0; i < PLATFORM_PROFILE_LAST; i++) { + if (!priv->supported_profiles[i]) + continue; + + seq_printf(seq, "Platform profile %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", priv->supported_profiles[i]); + } + + return 0; +} + +static void awcc_debugfs_remove(void *data) +{ + struct dentry *root =3D data; + + debugfs_remove(root); +} + +static void awcc_debugfs_init(struct wmi_device *wdev) +{ + struct dentry *root; + char name[64]; + + scnprintf(name, sizeof(name), "%s-%s", "alienware-wmi", dev_name(&wdev->d= ev)); + root =3D debugfs_create_dir(name, NULL); + + debugfs_create_devm_seqfile(&wdev->dev, "system_description", root, + awcc_debugfs_system_description_read); + + if (awcc->hwmon) + debugfs_create_devm_seqfile(&wdev->dev, "hwmon_data", root, + awcc_debugfs_hwmon_data_read); + + if (awcc->pprof) + debugfs_create_devm_seqfile(&wdev->dev, "pprof_data", root, + awcc_debugfs_pprof_data_read); + + devm_add_action_or_reset(&wdev->dev, awcc_debugfs_remove, root); +} + static int alienware_awcc_setup(struct wmi_device *wdev) { struct awcc_priv *priv; @@ -1297,6 +1385,8 @@ static int alienware_awcc_setup(struct wmi_device *wd= ev) return ret; } =20 + awcc_debugfs_init(wdev); + return 0; } =20 --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 812621DE4F0; Sat, 29 Mar 2025 07:33:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233604; cv=none; b=JRPPg467h4txZ+dfr4dU0UUYttxOTNLpE4IgUkE1onBKJ92bqrjA1Sep5euFxS44Kk+j3Cjyr4ZU8JbEX4JFlb8/o5gv2XqyieLaXHUWLSLKA1I1ccsNR/3WV2wIcV4F4wnhsTAJWKsqB1Pivpczfx+y2uYcX/VHyOVfkwiiN5g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233604; c=relaxed/simple; bh=sVhr8UiHfIh9SPN27Aphg+9ClMZK0o8fMPvbdIhP6Q0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a9I7kYMj4IPE6s33/gJNWKzRDus2gkRp2akf6PqO9nZIwSK/zEJcwQbeNiZyzPxlSgj6Pt8pzFO91iMPiQWknwxrazOyNyVFCJxWBEUZvXsXZWXDyPV977RPBq3e7ECCgtEMBgxh3Up0U7iyH+1+zsfvOuedNhetSXvst/Ivrwk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KGS4qOjO; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KGS4qOjO" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2243803b776so26574805ad.0; Sat, 29 Mar 2025 00:33:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233602; x=1743838402; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=D2U+U4Um9DunZlPZfJt6bx1dZvj4MaD6xkCfLVbbxw0=; b=KGS4qOjOIaFdjuuzOxLu4RPVKDxK0yVMvf3aKhHUu6LwQEJBOreZJzr3xTIOKmRhj7 +/9qi58LF0nAQHP8qHvHbIMKNrngnE48KZta2YuY4U3D4uopVNNZB9//yO6qVnY6Y6ub 2Vr7VEriD8l+Z3UnADzoBw3ZfBqEblZXu/Xfh3p/V8CrficH2tZtnBcd+kALxdgvnCRp KWeCAzREOgGLI6HXaEzWYpRZi39b/RU3hPPxi5gML3qDTlyfmu61mBMWRq8DdeU/7Pb+ qSy1eyP0o0IU0XNYuTUNogNLVW3Lxmt7bGOO6tXeaK/WBE+26SUalT2CkdhHeKwoRh7A PnyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233602; x=1743838402; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=D2U+U4Um9DunZlPZfJt6bx1dZvj4MaD6xkCfLVbbxw0=; b=TTPRVPiw2ehU29J550EKs33zskeogGUx2cEEtLOF0NiRrIqllsKzfluyYg+I53TfRn kUqowk3VCmgXRNI+UrJMwxgO+ZUb0ann9DbnrNd1z+fgExO9kNYwjNPlhwmKRs71/alj VfCFbl6NOeY+8aSMPQLZUl8PKnuXEo5spkh6zT6YlcGRAXMnixgBFIiUitOSAr4ygdaO 6mSvtulS6bWb5jHtFzbnKl7NTyXGNycF1ViDoM8Uz1uIoq8xF/AfTQDK/n5Uhop+UPfI MwBjEZWb/m8apfCJcwg+tD6MOTMadN1xEb3nZUgQmc9RuNVgHu8GXUJENXHZAOcrfDAm 0uFA== X-Forwarded-Encrypted: i=1; AJvYcCV5iu731u/JF3BV/VeL1s/CVlR3Hl2CfwZntH+V1+C4xE9aWRoRZfQ3YdoRtnXPycE5w7txtSkho9/szZ4=@vger.kernel.org, AJvYcCXivvjnrdKsuwh0ggHdKhqs303qlr0+RuPwHK6jfZnPnhAKhP/B8VwDsH2VBeSuVsslEuD0sFeFsNXTa0uOJkqSDTzAnw==@vger.kernel.org X-Gm-Message-State: AOJu0Ywh6XF1Z+Il6HchHEJ24onn5y/llCa5owAsODsDD2T2NXMRR/4C ANme1xv5tUtT6ExDpC7Jc87c3QBrZdXCIpgunRMJX07FTI35o0Wt X-Gm-Gg: ASbGncsb59dMby1jM0VYVgW+AxgsR8uTPTbayA+NDQK/2pkJVyP1YViLUkLuGtsm7cK x05WOEBs3TXbhODyNBq/th7VMyMoPtQX/M0Pbj4Q9Lel/Vpm05spt1YEVXfxwfzhX/OBqhVgrNf 0BUDPZOMDmuOCK1v2TSwN8sWBNfrZh2z1WOji0jgWJLI4m9hAIbyuW6xx3cf2DcB7dCnE1P2XcO SFVhsHfv5l22iXLxRGf6c9V8qPFZuOBU+OOF65wbS60TIM4u/eVIsLNXyWwPZaBDQOOJBw5eqyl 80aIOdWxnO/YDnYS+3EDef4Uum0W5lLOYBjdvWCKfBYIgabetasPIOA= X-Google-Smtp-Source: AGHT+IHLFRze2MJaFp7PXIQvjkn6s/Sdz2MfqgYhA0q3Nm5Au/42+02vToDOGUIhuZ5g30nMkdU/ow== X-Received: by 2002:a17:902:8a87:b0:223:517a:d2a3 with SMTP id d9443c01a7336-2292f95d884mr25089985ad.17.1743233601471; Sat, 29 Mar 2025 00:33:21 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:21 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:27 -0300 Subject: [PATCH v7 10/12] Documentation: wmi: Improve and update alienware-wmi documentation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-10-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Bagas Sanjaya X-Mailer: b4 0.14.2 Use tables to describe method operations instead of using pseudo-code. Drop unknown method descriptions to avoid redundancy. Drop GPIO section as it is currently irrelevant to this driver. Update Thermal_Information method documentation. Add one more helpful developer to the kudos section. Reviewed-by: Armin Wolf Reviewed-by: Bagas Sanjaya Signed-off-by: Kurt Borja --- Documentation/wmi/devices/alienware-wmi.rst | 383 +++++++++---------------= ---- 1 file changed, 117 insertions(+), 266 deletions(-) diff --git a/Documentation/wmi/devices/alienware-wmi.rst b/Documentation/wm= i/devices/alienware-wmi.rst index ddc5e561960e05fc7cffe700d7d278e32ff2e7b2..79238051b18bc5de9b502325017= cd5c5fcf41748 100644 --- a/Documentation/wmi/devices/alienware-wmi.rst +++ b/Documentation/wmi/devices/alienware-wmi.rst @@ -11,7 +11,7 @@ The WMI device WMAX has been implemented for many Alienwa= re and Dell's G-Series models. Throughout these models, two implementations have been identified.= The first one, used by older systems, deals with HDMI, brightness, RGB, amplif= ier and deep sleep control. The second one used by newer systems deals primari= ly -with thermal, overclocking, and GPIO control. +with thermal control and overclocking. =20 It is suspected that the latter is used by Alienware Command Center (AWCC)= to manage manufacturer predefined thermal profiles. The alienware-wmi driver @@ -69,9 +69,6 @@ data using the `bmfdec `_= utility: [WmiMethodId(164), Implemented, read, write, Description("Tobii Camera = Power Off.")] void TobiiCameraPowerOff([out] uint32 argr); }; =20 -Some of these methods get quite intricate so we will describe them using -pseudo-code that vaguely resembles the original ASL code. - Methods not described in the following document have unknown behavior. =20 Argument Structure @@ -87,175 +84,133 @@ ID 0xA0, the argument you would pass to the method is= 0xA001. Thermal Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 +WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------- + ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Get the number of temperature | - Byte 1: Fan = ID | +| | sensors related with a fan ID | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get the temperature sensor IDs | - Byte 1: Fan = ID | +| | related to a fan sensor ID | - Byte 2: Inde= x | ++--------------------+------------------------------------+---------------= -----+ + WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x01: - argr =3D 1 - - if BYTE_0(arg2) =3D=3D 0x02: - argr =3D SYSTEM_DESCRIPTION - - if BYTE_0(arg2) =3D=3D 0x03: - if BYTE_1(arg2) =3D=3D 0x00: - argr =3D FAN_ID_0 - - if BYTE_1(arg2) =3D=3D 0x01: - argr =3D FAN_ID_1 - - if BYTE_1(arg2) =3D=3D 0x02: - argr =3D FAN_ID_2 - - if BYTE_1(arg2) =3D=3D 0x03: - argr =3D FAN_ID_3 - - if BYTE_1(arg2) =3D=3D 0x04: - argr =3D SENSOR_ID_CPU | 0x0100 - - if BYTE_1(arg2) =3D=3D 0x05: - argr =3D SENSOR_ID_GPU | 0x0100 - - if BYTE_1(arg2) =3D=3D 0x06: - argr =3D THERMAL_MODE_QUIET_ID - - if BYTE_1(arg2) =3D=3D 0x07: - argr =3D THERMAL_MODE_BALANCED_ID - - if BYTE_1(arg2) =3D=3D 0x08: - argr =3D THERMAL_MODE_BALANCED_PERFORMANCE_ID - - if BYTE_1(arg2) =3D=3D 0x09: - argr =3D THERMAL_MODE_PERFORMANCE_ID - - if BYTE_1(arg2) =3D=3D 0x0A: - argr =3D THERMAL_MODE_LOW_POWER_ID - - if BYTE_1(arg2) =3D=3D 0x0B: - argr =3D THERMAL_MODE_GMODE_ID - - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x04: - if is_valid_sensor(BYTE_1(arg2)): - argr =3D SENSOR_TEMP_C - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x05: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_RPM() - - if BYTE_0(arg2) =3D=3D 0x06: - skip - - if BYTE_0(arg2) =3D=3D 0x07: - argr =3D 0 - - If BYTE_0(arg2) =3D=3D 0x08: - if is_valid_fan(BYTE_1(arg2)): - argr =3D 0 - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x09: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_UNKNOWN_STAT_0() - - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x0A: - argr =3D THERMAL_MODE_BALANCED_ID - - if BYTE_0(arg2) =3D=3D 0x0B: - argr =3D CURRENT_THERMAL_MODE() - - if BYTE_0(arg2) =3D=3D 0x0C: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_UNKNOWN_STAT_1() - else: - argr =3D 0xFFFFFFFF - -Operation 0x02 returns a *system description* buffer with the following -structure: - -:: - - out[0] -> Number of fans - out[1] -> Number of sensors - out[2] -> 0x00 - out[3] -> Number of thermal modes - -Operation 0x03 list all available fan IDs, sensor IDs and thermal profile -codes in order, but different models may have different number of fans and -thermal profiles. These are the known ranges: - -* Fan IDs: from 2 up to 4 -* Sensor IDs: 2 -* Thermal profile codes: from 1 up to 7 - -In total BYTE_1(ARG2) may range from 0x5 up to 0xD depending on the model. ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Unknown. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get system description number with | - None = | +| | the following structure: | = | +| | | = | +| | - Byte 0: Number of fans | = | +| | - Byte 1: Number of temperature | = | +| | sensors | = | +| | - Byte 2: Unknown | = | +| | - Byte 3: Number of thermal | = | +| | profiles | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x03 | List an ID or resource at a given | - Byte 1: Inde= x | +| | index. Fan IDs, temperature IDs, | = | +| | unknown IDs and thermal profile | = | +| | IDs are listed in that exact | = | +| | order. | = | +| | | = | +| | Operation 0x02 is used to know | = | +| | which indexes map to which | = | +| | resources. | = | +| | | = | +| | **Returns:** ID at a given index | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x04 | Get the current temperature for a | - Byte 1: Sens= or | +| | given temperature sensor. | ID = | ++--------------------+------------------------------------+---------------= -----+ +| 0x05 | Get the current RPM for a given | - Byte 1: Fan = ID | +| | fan. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x06 | Get fan speed percentage. (not | - Byte 1: Fan = ID | +| | implemented in every model) | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x07 | Unknown. | - Unknown = | ++--------------------+------------------------------------+---------------= -----+ +| 0x08 | Get minimum RPM for a given FAN | - Byte 1: Fan = ID | +| | ID. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x09 | Get maximum RPM for a given FAN | - Byte 1: Fan = ID | +| | ID. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0A | Get balanced thermal profile ID. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0B | Get current thermal profile ID. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0C | Get current `boost` value for a | - Byte 1: Fan = ID | +| | given fan ID. | = | ++--------------------+------------------------------------+---------------= -----+ =20 WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x01: - if is_valid_thermal_profile(BYTE_1(arg2)): - SET_THERMAL_PROFILE(BYTE_1(arg2)) - argr =3D 0 - - if BYTE_0(arg2) =3D=3D 0x02: - if is_valid_fan(BYTE_1(arg2)): - SET_FAN_SPEED_MULTIPLIER(BYTE_2(arg2)) - argr =3D 0 - else: - argr =3D 0xFFFFFFFF - -.. note:: - While you can manually change the fan speed multiplier with this method, - Dell's BIOS tends to overwrite this changes anyway. ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Activate a given thermal profile. | - Byte 1: Ther= mal | +| | | profile ID = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Set a `boost` value for a given | - Byte 1: Fan = ID | +| | fan ID. | - Byte 2: Boos= t | ++--------------------+------------------------------------+---------------= -----+ =20 These are the known thermal profile codes: =20 -:: ++------------------------------+----------+------+ +| Thermal Profile | Type | ID | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+ +| Custom | Special | 0x00 | ++------------------------------+----------+------+ +| G-Mode | Special | 0xAB | ++------------------------------+----------+------+ +| Quiet | Legacy | 0x96 | ++------------------------------+----------+------+ +| Balanced | Legacy | 0x97 | ++------------------------------+----------+------+ +| Balanced Performance | Legacy | 0x98 | ++------------------------------+----------+------+ +| Performance | Legacy | 0x99 | ++------------------------------+----------+------+ +| Balanced | USTT | 0xA0 | ++------------------------------+----------+------+ +| Balanced Performance | USTT | 0xA1 | ++------------------------------+----------+------+ +| Cool | USTT | 0xA2 | ++------------------------------+----------+------+ +| Quiet | USTT | 0xA3 | ++------------------------------+----------+------+ +| Performance | USTT | 0xA4 | ++------------------------------+----------+------+ +| Low Power | USTT | 0xA5 | ++------------------------------+----------+------+ =20 - CUSTOM 0x00 +If a model supports the User Selectable Thermal Tables (USTT) profiles, it= will +not support the Legacy profiles and vice-versa. =20 - BALANCED_USTT 0xA0 - BALANCED_PERFORMANCE_USTT 0xA1 - COOL_USTT 0xA2 - QUIET_USTT 0xA3 - PERFORMANCE_USTT 0xA4 - LOW_POWER_USTT 0xA5 - - QUIET 0x96 - BALANCED 0x97 - BALANCED_PERFORMANCE 0x98 - PERFORMANCE 0x99 - - GMODE 0xAB - -Usually if a model doesn't support the first four profiles they will suppo= rt -the User Selectable Thermal Tables (USTT) profiles and vice-versa. - -GMODE replaces PERFORMANCE in G-Series laptops. +Every model supports the CUSTOM (0x00) thermal profile. GMODE replaces +PERFORMANCE in G-Series laptops. =20 WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x1: - TOGGLE_GAME_SHIFT() - argr =3D GET_GAME_SHIFT_STATUS() - - if BYTE_0(arg2) =3D=3D 0x2: - argr =3D GET_GAME_SHIFT_STATUS() ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Toggle *Game Shift*. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get *Game Shift* status. | - None = | ++--------------------+------------------------------------+---------------= -----+ =20 Game Shift Status does not change the fan speed profile but it could be so= me sort of CPU/GPU power profile. Benchmarks have not been done. @@ -267,131 +222,27 @@ Thermal_Information does not list it. G-key on Dell's G-Series laptops also changes Game Shift status, so both a= re directly related. =20 -WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0x1: - if is_valid_fan(BYTE_1(arg2)): - argr =3D 1 - else: - argr =3D 0 - - if BYTE_0(arg2) =3D=3D 0x2: - if is_valid_fan(BYTE_1(arg2)): - if BYTE_2(arg2) =3D=3D 0: - argr =3D=3D SENSOR_ID - else - argr =3D=3D 0xFFFFFFFF - else: - argr =3D 0 - Overclocking Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -.. warning:: - These methods have not been tested and are only partially reverse - engineered. - -WMI method Return_OverclockingReport([out] uint32 argr) -------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - -WMI method Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - -WMI method Clear_OCFailSafeFlag([out] uint32 argr) --------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - - WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 AWCC supports memory overclocking, but this method is very intricate and h= as not been deciphered yet. =20 -GPIO methods -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - -These methods are probably related to some kind of firmware update system, -through a GPIO device. - -.. warning:: - These methods have not been tested and are only partially reverse - engineered. - -WMI method FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0: - if BYTE_1(arg2) =3D=3D 1: - SET_PIN_A_HIGH() - else: - SET_PIN_A_LOW() - - if BYTE_0(arg2) =3D=3D 1: - if BYTE_1(arg2) =3D=3D 1: - SET_PIN_B_HIGH() - - else: - SET_PIN_B_LOW() - - else: - argr =3D 1 - -WMI method ReadTotalofGPIOs([out] uint32 argr) ----------------------------------------------- - -:: - - argr =3D 0x02 - -WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0: - argr =3D PIN_A_STATUS - - if BYTE_0(arg2) =3D=3D 1: - argr =3D PIN_B_STATUS - Other information Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 WMI method ReadChassisColor([out] uint32 argr) ---------------------------------------------- =20 -:: - - argr =3D CHASSIS_COLOR_ID +Returns the chassis color internal ID. =20 Acknowledgements =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -Kudos to `AlexIII `_ for documenting -and testing available thermal profile codes. +Kudos to `AlexIII `_ and +`T-Troll `_ for documenting and +testing some of this device's functionality, making it possible to general= ize +this driver. --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ED5601A9B5D; Sat, 29 Mar 2025 07:33:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233606; cv=none; b=fYVWzRrW4QFzCaHxEEKnmRCz9HNpxgYC7zxqm1DseHAfKC3jPx9NKjll3w5fd3w3MsKt0folPuzIOd74at98O9tyo0wqEToo34cPT+Gai0ZDCpz/ODTd9Gx9YIHwbGpbCJ7Lx9P0cajfGg5H2aFddxIqAYkZmro1fPE8zul78wM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233606; c=relaxed/simple; bh=Wttbwf1qV9FkOAwZsZnHe3ht6eCg76dmLcsoliUV8TM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XoUFNYT9xlgfZkOrIt/Wrq+AFqMtO3up/TCnFSUROJZ4sLCY/vc8HbPMDX5kvuRDAHR1E3JV8tuybVYLUcoNAZ7wbE7yJZ8devE9YiL9wwbuWon9Q6eu/sXjjkUi7fx93EnsUOGYtupCA1jWJsplnFL9gM7MZfiUR2FPw1Za8/I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=aXErEoVZ; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="aXErEoVZ" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-223f4c06e9fso55855055ad.1; Sat, 29 Mar 2025 00:33:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233604; x=1743838404; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=66/dFtobVlZnfecHkzTdkjMJ/nih8n5UjXlW1QS1iPU=; b=aXErEoVZpzLxnLRo+oTKIF5YiKa91rj00udJPRXge0Rk9lYR3+L/a4BdZsQRsssjKt c0eeguuxrNs+kpzAPDqB6km/Yz+1kzWIdPSFt3vS0GvnuHsAdxJj45kpD99h3EfBggBx 3/cqX+qBeiPtnUwlULzF+Z9uACIcgONFf50dZ6G2kN1ijXKxPnSk7LM6bLRHpWSA4nlc tog5aK/ivmgUnAbMdVDBWXSW3fPW43LEcws1fS0/4WXjPJYspVIQNPQQEhVEyElUGquB A0v+1kBa6YB/A1f5dE03ssItPnDRBcEAPQfdmCpZs0i5cz09nJS0lqWvKGVETQxd9CMl fcfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233604; x=1743838404; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=66/dFtobVlZnfecHkzTdkjMJ/nih8n5UjXlW1QS1iPU=; b=Wm0Pa3gIKT5xJ+/K+CTemyF6jS41LwPETLSIeajDSplVLd1/CiuktoQ4HAAd2e5E6D 7rpwRFJsoPV7+527J4opd/+vNNJY8vx2ruB1sKNmKd4JCHrKZ3Y3da/KIxpPWz7VdaoD HVhS2UyKjS3yirFwhMLguO+9yHmx21KtrGwwBq3AjqA8cq4z1KfxqpRrFwKSzvDEI82I WiOM6CzPjzTIFt6KqnOpId44+zzF+B+p9gP5WC3LVEWVfSu2YIJGPamnusxAIVjCtDS3 cBxVMNjpbddJGAoIHOBPoXAdWFMjWH5dSvrAcKNvHvMHp/UnMU9+e2P8j1biYS7Susek HcTg== X-Forwarded-Encrypted: i=1; AJvYcCUNI17Uhtw7Bxhgv4a6pRvK7/In/ZYTvAqcOM6w2sccsNnfM9PBRRMbSKEoBVlJkFT6Yvbm2/J4c3CtsCQ=@vger.kernel.org, AJvYcCVRxsIS0+3GPbDws6Z6/qyR79w4/UH//7wEnP+id5jcgXS3i1RcPlIzwYvBRXT6RpjZ7Ryre+EzpLITHOJFTAtH2Tapsw==@vger.kernel.org X-Gm-Message-State: AOJu0YzBLTbiGDNwC700jOICRaCB5hWLxZzirBhYsW9BISY8EXXspfqa O0pVJONI3t7GVKfyTF3oQnh1yR14Boe94ShBbCij7tvQCv1gl7mI X-Gm-Gg: ASbGnctMDdcteZnJr4wjOFbgw6k3OKTrnu9ZBZk9btKzrJC8oAeMf5fJvcb3n+M8J1H Bgbw7l1F4hkjRHb8cO0JHlCqbuv0BKoxs+ZBThkoZVYJ8ROEI7v6U3qaxc89kOtNSb+8kOzGa27 qln/vUTvaVAijXu/P/ajHvUfy6B0aA2HNM5Ax+u+HODT751fVfpwJrM5CZtRetDs/YTPOioznI7 LGmr4ZWBdMxL3cbpXB2j1RyXfFKf4bNeh5UbsiCpeBS9DfQoJLOCBqLxNI/oY6VHH3SqJk32SBd TppmZzreMnVKcPBR5k2pfRp7Tj/RYGdqfX4eFkKnQqhi X-Google-Smtp-Source: AGHT+IGhtrmBus5qDkI6Rlyz4umhU+UKmeAxGgqmPIudkb741Fpwso/1TmASDcOVJUAmesyoH4fZQg== X-Received: by 2002:a17:902:da88:b0:215:58be:334e with SMTP id d9443c01a7336-2292ee792f4mr31066565ad.10.1743233603891; Sat, 29 Mar 2025 00:33:23 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:23 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:28 -0300 Subject: [PATCH v7 11/12] Documentation: admin-guide: laptops: Add documentation for alienware-wmi Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-11-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add driver admin-guide documentation for the alienware-wmi driver. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- .../admin-guide/laptops/alienware-wmi.rst | 127 +++++++++++++++++= ++++ Documentation/admin-guide/laptops/index.rst | 1 + MAINTAINERS | 1 + 3 files changed, 129 insertions(+) diff --git a/Documentation/admin-guide/laptops/alienware-wmi.rst b/Document= ation/admin-guide/laptops/alienware-wmi.rst new file mode 100644 index 0000000000000000000000000000000000000000..27a32a8057da837b49c16f94ac5= 8eef4b6fc8ea9 --- /dev/null +++ b/Documentation/admin-guide/laptops/alienware-wmi.rst @@ -0,0 +1,127 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Alienware WMI Driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Kurt Borja + +This is a driver for the "WMAX" WMI device, which is found in most Dell ga= ming +laptops and controls various special features. + +Before the launch of M-Series laptops (~2018), the "WMAX" device controlled +basic RGB lighting, deep sleep mode, HDMI mode and amplifier status. + +Later, this device was completely repurpused. Now it mostly deals with the= rmal +profiles, sensor monitoring and overclocking. This interface is named "AWC= C" and +is known to be used by the AWCC OEM application to control these features. + +The alienware-wmi driver controls both interfaces. + +AWCC Interface +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +WMI device documentation: Documentation/wmi/devices/alienware-wmi.rst + +Supported devices +----------------- + +- Alienware M-Series laptops +- Alienware X-Series laptops +- Alienware Aurora Desktops +- Dell G-Series laptops + +If you believe your device supports the AWCC interface and you don't have = any of +the features described in this document, try the following alienware-wmi m= odule +parameters: + +- ``force_platform_profile=3D1``: Forces probing for platform profile supp= ort +- ``force_hwmon=3D1``: Forces probing for HWMON support + +If the module loads successfully with these parameters, consider submittin= g a +patch adding your model to the ``awcc_dmi_table`` located in +``drivers/platform/x86/dell/alienware-wmi-wmax.c`` or contacting the maint= ainer +for further guidance. + +Status +------ + +The following features are currently supported: + +- :ref:`Platform Profile `: + + - Thermal profile control + + - G-Mode toggling + +- :ref:`HWMON `: + + - Sensor monitoring + + - Manual fan control + +.. _platform-profile: + +Platform Profile +---------------- + +The AWCC interface exposes various firmware defined thermal profiles. Thes= e are +exposed to user-space through the Platform Profile class interface. Refer = to +:ref:`sysfs-class-platform-profile ` +for more information. + +The name of the platform-profile class device exported by this driver is +"alienware-wmi" and it's path can be found with: + +:: + + grep -l "alienware-wmi" /sys/class/platform-profile/platform-profile-*/na= me | sed 's|/[^/]*$||' + +If the device supports G-Mode, it is also toggled when selecting the +``performance`` profile. + +.. note:: + You may set the ``force_gmode`` module parameter to always try to toggl= e this + feature, without checking if your model supports it. + +.. _hwmon: + +HWMON +----- + +The AWCC interface also supports sensor monitoring and manual fan control.= Both +of these features are exposed to user-space through the HWMON interface. + +The name of the hwmon class device exported by this driver is "alienware_w= mi" +and it's path can be found with: + +:: + + grep -l "alienware_wmi" /sys/class/hwmon/hwmon*/name | sed 's|/[^/]*$||' + +Sensor monitoring is done through the standard HWMON interface. Refer to +:ref:`sysfs-class-hwmon ` for more +information. + +Manual fan control on the other hand, is not exposed directly by the AWCC +interface. Instead it let's us control a fan `boost` value. This `boost` v= alue +has the following aproximate behavior over the fan pwm: + +:: + + pwm =3D pwm_base + (fan_boost / 255) * (pwm_max - pwm_base) + +Due to the above behavior, the fan `boost` control is exposed to user-space +through the following, custom hwmon sysfs attribute: + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +Name Perm Description +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +fan[1-4]_boost RW Fan boost value. + + Integer value between 0 and 255 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + +.. note:: + In some devices, manual fan control only works reliably if the ``custom= `` + platform profile is selected. diff --git a/Documentation/admin-guide/laptops/index.rst b/Documentation/ad= min-guide/laptops/index.rst index e71c8984c23e43ca7cd6373b88803354dff6bc60..db842b629303c1bcf02646204d5= 1938f9bd4043e 100644 --- a/Documentation/admin-guide/laptops/index.rst +++ b/Documentation/admin-guide/laptops/index.rst @@ -7,6 +7,7 @@ Laptop Drivers .. toctree:: :maxdepth: 1 =20 + alienware-wmi asus-laptop disk-shock-protection laptop-mode diff --git a/MAINTAINERS b/MAINTAINERS index 1cd25139cc58a0ea05c759caa3a00fd557e16459..8304c6fddfeed0fc4c26bcab767= f401c413c9589 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -797,6 +797,7 @@ M: Kurt Borja L: platform-driver-x86@vger.kernel.org L: Dell.Client.Kernel@dell.com S: Maintained +F: Documentation/admin-guide/laptops/alienware-wmi.rst F: Documentation/wmi/devices/alienware-wmi.rst F: drivers/platform/x86/dell/alienware-wmi* =20 --=20 2.49.0 From nobody Wed Dec 17 07:06:17 2025 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 202F81DF256; Sat, 29 Mar 2025 07:33:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233608; cv=none; b=gQNnr4PDjHG4RtgeA6nOZTFfUhp/+2B0bWdMzXIFHtsMcfrS50aGgQTUkdBELph8l0vXDkY27e6lmbbjpxEx7Vy4InRUt8oxYO55jYiNyW9bYg1ShZHaZBVwxRUSRXGAPpvErDo0obbQKn86RVYADVt68oMiSIzkmqe0ArsekvE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743233608; c=relaxed/simple; bh=+uc1SuLU+7BkVTR+aCzoSyQBA+rYZUJ3KCpPQQaun7w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jL2bVpJZ+vM2vG27fdDjKhAnxpvfV/MaRlOFoeGLGnKO9q6orExlgsyoIPFYktGkr/Ahe7+utnoWnjH0mMRSEhQClX3L/tBMUIxG9GzAr5zYRsjXjW6cOooTuJn+ExCcdOUy36lZbzyHGr00AQgA5pms1THLq931oXax75Xuy+s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=iJ81Pj/B; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="iJ81Pj/B" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-22423adf751so56980125ad.2; Sat, 29 Mar 2025 00:33:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743233606; x=1743838406; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=tv4G5XT9cpfw/l4UO+b+3iqID2AI+6jruhrm3oqXDY8=; b=iJ81Pj/BwarJPArp/H8GLLbXepLSYARC6OAu6W35iFU46xnEiWmJvNtGG/FEtSgl2V sExgrH1EV5QVNSzUML20Gv6ZnWPKSHqG3Cquqk9f3LcGpAFQco9YtWvngEgSnxGr8UT0 DD/g7OCmkWW72J3Rc9Wz3b9GmhBkcg541Fbf/8qijeB5VYvFDhY8REEOKA891tLPglcO I2HKW9GqL0UrCB8Ub9Kxat9db3MaGv6c1LXJwyKSBwa9gKZpWRz4Hy3RdtsQmcJcBNE7 sjlycqvqjmZyozhGcsCR016OFMe4B4XZilqT2BmJjqj3D6DdGt6mbtUWZcT5RiSCrfjN KN5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743233606; x=1743838406; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tv4G5XT9cpfw/l4UO+b+3iqID2AI+6jruhrm3oqXDY8=; b=Cix2apFQ+75I687PjTdzMzfTY/Hm1pRLoRjyfnbP8i79MOYDVtjzAQ7I8+7N/gt8Ka KX08HNnXF6Q9t00tDdP6xFX373MRMJQ+trKh6cJ0Tu5NAYpOCGB7lRFn55F+0Ap52LRG X+t+mIYQiaecSubr+3/MA6QNR4Pvmml4oUqWZEh12dqTAS75T4ULF6T9qJphYQ2NQ67r UY4HnywlYotcrG25XeTW5OKpZUdAsGzZ91iLsj29Qq3PD0gd7LlbhUDBW2Gx39VPUb3/ mu9sM3AudjEj/qtV90pztajS//59AWHkSw/S5WEOGeM97t6SdL5+xspO6nW8Kul2tYkK fQlg== X-Forwarded-Encrypted: i=1; AJvYcCUQE1rUkeXJSdu2gqVnLn+zRoONLMeGvas4fGZZ3NV+QftkLK6jmjfKDQiWeuiX3FKmq4BYU+hxBcpliQfYEdB9SVy05Q==@vger.kernel.org, AJvYcCVNKdgUdQanfxf502lDkLfAy9iTV3O2jdE2YkwuGlpOLxl32LgwEVanZgP+TTxIfHJVQ0isSaJSyF7HWrI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0xNGestTiLLnDxBrEN89hwx0jlM2FMEIg7OtdGi4mQEfTKFBQ yQIgWxKtWyZYaNZCXAmrzBppAH9CmKVQaFGgVgrm2sCzd3q/7yhP X-Gm-Gg: ASbGncurh6WZpVfUlbL374cploHkv7h5P1iV07fqvrVlt24oqU4tHycgG2Ln+3BEZzB rboI+OAAjdwpuG4ddVrWmMhwtp8mstt/olook4zBEgfwj3Nz3TkiTEj9TX3Q40pMeAsDbUi4neJ 80NORIV6438YIUrUP6wJHXyPdzZoR8f641hkn2F2CGYfvvhNqQCm+lOFUlQ5Ewtek6YKoTseLsP HuSGJT+WnTm3mFD9D9kHoViga3GSAoDCnsYOiT73tyOI9N+pFqg0ktLlHhYVXEoUSpfeH/rlXOL Xbqvhm+l/OX9mDxMyXZ/+9DcNJdVTy1PHvorAAYdpxHL X-Google-Smtp-Source: AGHT+IFx6cv+c0oNxC2iGBIlYeRWIPDze1mwvT89CZ2P13sqvbzvJLPbgDA0AnoPelBczR7Z7odsFA== X-Received: by 2002:a17:902:ce02:b0:224:1935:fb91 with SMTP id d9443c01a7336-2292f975776mr32894085ad.27.1743233606157; Sat, 29 Mar 2025 00:33:26 -0700 (PDT) Received: from [192.168.1.26] ([181.91.133.137]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2291eedea62sm30257645ad.55.2025.03.29.00.33.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Mar 2025 00:33:25 -0700 (PDT) From: Kurt Borja Date: Sat, 29 Mar 2025 04:32:29 -0300 Subject: [PATCH v7 12/12] Documentation: ABI: Add sysfs platform and debugfs ABI documentation for alienware-wmi Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250329-hwm-v7-12-a14ea39d8a94@gmail.com> References: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> In-Reply-To: <20250329-hwm-v7-0-a14ea39d8a94@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add ABI description for the alienware-wmi driver. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- Documentation/ABI/testing/debugfs-alienware-wmi | 44 ++++++++++++++++++= ++++ .../ABI/testing/sysfs-platform-alienware-wmi | 14 +++++++ MAINTAINERS | 2 + 3 files changed, 60 insertions(+) diff --git a/Documentation/ABI/testing/debugfs-alienware-wmi b/Documentatio= n/ABI/testing/debugfs-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..48cfd4d0b002efd7b68d9c1d3aa= 91a3a05f49db5 --- /dev/null +++ b/Documentation/ABI/testing/debugfs-alienware-wmi @@ -0,0 +1,44 @@ +What: /sys/kernel/debug/alienware-wmi-/system_description +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes the raw ``system_description`` number reported + by the WMAX device. + + Only present on devices with the AWCC interface. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO + +What: /sys/kernel/debug/alienware-wmi-/hwmon_data +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes HWMON private data. + + Includes fan sensor count, temperature sensor count, internal + fan IDs and internal temp IDs. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO + +What: /sys/kernel/debug/alienware-wmi-/pprof_data +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes Platform Profile private data. + + Includes internal mapping to platform profiles and thermal + profile IDs. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO diff --git a/Documentation/ABI/testing/sysfs-platform-alienware-wmi b/Docum= entation/ABI/testing/sysfs-platform-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..4877b3745f4e5b503376d375bf4= 8464250328ce2 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-platform-alienware-wmi @@ -0,0 +1,14 @@ +What: /sys/class/hwmon/hwmonX/fanY_boost +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes fan boost control for Dell gaming laptops with + the AWCC WMI interface. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + Integer value in the range 0 to 255 + + RW diff --git a/MAINTAINERS b/MAINTAINERS index 8304c6fddfeed0fc4c26bcab767f401c413c9589..95ab2d002e4aeefa09e4ad83405= 674991509f08e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -797,6 +797,8 @@ M: Kurt Borja L: platform-driver-x86@vger.kernel.org L: Dell.Client.Kernel@dell.com S: Maintained +F: Documentation/ABI/testing/debugfs-alienware-wmi +F: Documentation/ABI/testing/sysfs-platform-alienware-wmi F: Documentation/admin-guide/laptops/alienware-wmi.rst F: Documentation/wmi/devices/alienware-wmi.rst F: drivers/platform/x86/dell/alienware-wmi* --=20 2.49.0