From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f173.google.com (mail-yb1-f173.google.com [209.85.219.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 4A13821505D; Tue, 25 Feb 2025 22:25:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522317; cv=none; b=VyVtVe6UzsDinAcyQFAw/RcUVx0qgO57Qd6mXmUWhtQ7IVE3DakqmqmV+LZyWf0pYnjQskHDYktF0Q8fn7w2hxfZsHm1EKVIjxGe5Yleh9/gyMmNtkUcfyWU4csCuKBfTFSDpfyLo65W2OWrsWIiN0FhnmlbPgDqlzCc4XAvBoM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522317; c=relaxed/simple; bh=H024Neyf5Xe/vd4mr+qHN5B+S/vJwhPB36J1Wj99T+k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IUFgC7OCFT+WcZgAB7i0adoKmk/Cipu1kBnsr3UGtQB3HR9YVJH7CPrRi8xNSm6dAfvCbF+FTwwBdPPO+XQRTggcuwkLrfmJ4LNljo1I21vgflOOX+8HmNGy++XK1AFe6h9Jc5OlCM9m8BK7qE2P2rf5fc0tbmqjHyefbLqkK3g= 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=FUzGW7an; arc=none smtp.client-ip=209.85.219.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="FUzGW7an" Received: by mail-yb1-f173.google.com with SMTP id 3f1490d57ef6-e545c1e8a15so7088203276.1; Tue, 25 Feb 2025 14:25:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522314; x=1741127114; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xJhCSut6ZCRl9I4VYdMdhRGbsfDQIUyMiZFhX1wO1sw=; b=FUzGW7an3i6Ql9plx5tfLoaCiia7maSh/58mCdl6/4iNUQvYQEWOJQNnqckE7nGqk4 SG+vUFOsf+Rwxi76ivBOT4m3+MlajfEuvOlB7heMPnCxmYUSmKPE4ODI856MWGv3R1qk XSRhD14OCBgCSgy5rxtl3Xz7Yye9BGtt2ePEMkmivn9sxSRrEBsJxHYuU0yiZS8eqkQM R4sGKACH6KbOY1Gsx+5jvRdb3efCaH5mBPgw3mnbCVgjePMnnLmyA7HWYGV3sTghtJuZ 4ASNkp4maWq83znMSq4TRAW2jmDHa/dNJzxL7smyO74GA3lo0WYC85+3PtT1UCgmHIf+ BAeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522314; x=1741127114; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xJhCSut6ZCRl9I4VYdMdhRGbsfDQIUyMiZFhX1wO1sw=; b=XNJusuoPU88nkrekzGfHVWnQHLF64oZHfdMCR1/MHRXGSeUGQRBgHkhexItYE+eBi9 z2DE7DRQpKa58SmY2CJfE3WuaF2cWfR0KEqwImCQCTz/Es4YKNyRa3w1tqqD0ORYbLjF d8m6N2Vbt+DVXTQwXyujvkgqyJf1OdEFfgUK/N0aNDGRIXl8i6PUZnysGYH7/hjzmXKX EjA8ReZqR4y22VsmdDiYr4heU209Yr7kJnIK0tl+vyWadEnAZqtHVTJvedjG+MOrDPQn 6w+n6sodLxKeN1J+fCKMla0NUjSelxlUm1+/4CgEmx4g95MORtiG0NEhF7LY82P0HQj2 XBag== X-Forwarded-Encrypted: i=1; AJvYcCXJKqIgDw0kMizNx9+v1lZxANvS/1maCpk4x8yrAKGOWFXhUA2kXb/3CKsG4dQ/phVt+1PoJoKpEKBWCNQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yxx6BN2vCKIPcmBUDshhjaYSDosPFpIUOiTKDsNVh+Y8FuBDRXS JMiZeTCDRaSxX3WFRrTyBvMwIBKLS3oH/eb5NLUAvA92WfhMT7wQ X-Gm-Gg: ASbGncttiO24W7WJwLtrjmeqgjaPgDCVY8byWSny2lOj3pAQDucwYYLN+5Llj6Aien9 nGuswSM4SciIV5enMTe/OPvXmtu4YugwDl2TYErKQ9MNNa0GUrvgi40sNhUxHz2uBGfaNNYvpRa xtpNBb9TyB8YM1BUmHXuQa7+7TyGcTndaR3UTS75RXBqDPoKAVJXGsijryuJchBu4PGzJKhM8Sv GHwze9zNQsgKpYPP0TXI4eB5SGrSr6FV2FNd5FNW3PvPjoXKsdqUYM0dsVDuFWhqPNgZmZv6ixZ 0XvlDn4Xp2QRROswJ0+g3pDBrG6TX5gwRg== X-Google-Smtp-Source: AGHT+IEXmex1v8WKPnv6Xi5guFbn5TqVxs6eHIe51akHMcq/7I/RcMsbj+PhcGPyy+TQOVWM0b/4JA== X-Received: by 2002:a05:6902:703:b0:e5d:b2c4:7cbf with SMTP id 3f1490d57ef6-e607a4db612mr4288843276.7.1740522313898; Tue, 25 Feb 2025 14:25:13 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:13 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 01/10] platform/x86: alienware-wmi-wmax: Rename thermal related symbols Date: Tue, 25 Feb 2025 17:24:51 -0500 Message-ID: <20250225222500.23535-2-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../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 3d3014b5adf0..ed70e12d73d7 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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f180.google.com (mail-yb1-f180.google.com [209.85.219.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 86A9521507D; Tue, 25 Feb 2025 22:25:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522318; cv=none; b=XQ3cKrmPW3aLg/RENVcndS2lgW4QSx/JEGw5Io6X6623/L99NNkVWo4RXFzdByNILYWDnvqSTKpzLFtkMUEb+oVbwIc3ucRPwpCb+L/ewhPgoqVAsaych/8CxfiC1T6o3e9YVbvLoSxZJAxZlTK7R/Eyuawpl3qktmRrRG0+zkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522318; c=relaxed/simple; bh=3MNEnjIAjYB08ds2Q4WfcgD2Ilr3jiw1InwJo1UyKVY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f5jCglMwo1FWmX/tma2p2uVwBmi9f73gwto3D/AUYSRWRha0dOKKau0iQT6RC/Vi3DbeBj06/MLjcI0cSemQbq97+lsqMK3ESjeXnjc6r+gDkoQiW0JfHS5Oo9z+eBo7tQ7uMDojcilN16YPwjuyRfkLEa5VyHEjzinp/YiKgJQ= 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=jOKG8JqD; arc=none smtp.client-ip=209.85.219.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="jOKG8JqD" Received: by mail-yb1-f180.google.com with SMTP id 3f1490d57ef6-e5dcc411189so5550164276.0; Tue, 25 Feb 2025 14:25:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522315; x=1741127115; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JoNTNsiugx95qIkwhmVKR6HdZgnCFcxvQrL16Y+N13g=; b=jOKG8JqD465wfcmi2spXLWfZGxEBVsFd5g/WQijE9WZAQykrJX1+fQqw5C/7UJuLKB BHJyyNZqM6lix173wlcf5zwZKFAXGK9EcJ7hReBY7LjNE+UdHlmIqgF8PECq7d+Fu94k vknOm/e0+kLC2b2Qb7+vi8DzjlzG45iVD4Rwy063kdg4DSaLEVRjyR9ZRbVP9ve9Kdks /Js9GAdPxo2JmyruIGT8SeaMLKRgNbLgXV2P3JwhrC8LYtK1VqnQZdWogwXtES0yKbOT RO7uwgAeDaPyA60vtcrh7Vn9O8FORrkUjinbIu2t/NaX/ArhtI+yw2c8BVIpgEC4xUto zVTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522315; x=1741127115; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JoNTNsiugx95qIkwhmVKR6HdZgnCFcxvQrL16Y+N13g=; b=i9HqHmGZ62IGlCZ8IdEP9OWlHMmfdaNM07eMi0yw+OdfXykXF+Zem+k/JpBE79hKRf O+8iBDy0j10aqB3r2m3aJ/M29Tdq+Bu3L/WoU/ngQIc05x445nWeJjq3gOAbf2MJXFqI F3uoPrWkgSGx/KRmotX/jLxQAqtygCmCHFbZTu91fi903bBdDVGJF74U0/2l3tXAIDd8 RuR5GP4I4EGWIlcj8Wsrp/5yAGo9mEXREicRG2fpIg6i74zmFAYZEK2Y/9PM1hGai5JD nR66WlyBEaiZ0HIwNVtHmkf6SflvMoaC/+Pq8DDbDxxGvD2wDXSRsJGhfvoZpZrkmRto F69w== X-Forwarded-Encrypted: i=1; AJvYcCWEps1AA7WNU5l/j0/9SYSI0nPYNI50oIk5aZ+h49wzyHo5Ku2uZu00cjK336blU1YXA6SAi+E8AtFfFic=@vger.kernel.org X-Gm-Message-State: AOJu0Yz8g/LJdBde6ptT4zeS9Ik98wQSI7VzePlv8d1kGQ8sH7Ur7TcF 21FYcnZFaITR63wEY7y+A451kFJqls1dpZ/ZHdIyYvGDiRaBd2R7 X-Gm-Gg: ASbGncvmUUQQ9dkK+U5/0L/7lwLYMEFlcHw4fm+U7IEdRYAIMyPpl7PZokhi6PyO11g UylPtm3E3wspluVZDUlw2y5BlkUd5lfd0o8103r/JRroEzBcggx5je4ztnkz43f+gphj9tJx99I Ym2mjVLrupm7yK2B9e3F7RKEshMc+5zB8x6I/gH4acgAs58/Z7czG0oKHJpCgXBT6Wdq0KWjV4r W/UHbyq2VohOG4z/luHfP4kvVXPNtsSjN55bwrzp2tm0Xa0F/etn4uWBzuUHBOY7RujTCYruLkX TbMqSqFuHNEDaGKirmHxZQ7kpdtDfgc1dg== X-Google-Smtp-Source: AGHT+IEoFjMy7r8fYkL27z+bW59UNaOPFMaPAMBlIRPWEu7Lg/1mg4ldvVhY6l2D8ZqbFiL05FJ7bA== X-Received: by 2002:a05:6902:248c:b0:e60:78b7:faf1 with SMTP id 3f1490d57ef6-e607a5033a2mr4124715276.21.1740522315360; Tue, 25 Feb 2025 14:25:15 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:15 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 02/10] platform/x86: alienware-wmi-wmax: Refactor is_awcc_thermal_mode() Date: Tue, 25 Feb 2025 17:24:52 -0500 Message-ID: <20250225222500.23535-3-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Refactor is_awcc_thermal_mode() to use FIELD_GET() instead of bitwise operations. Drop the check for BIT(8) sensor flag and rename it to is_awcc_thermal_profile_id(). Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../platform/x86/dell/alienware-wmi-wmax.c | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index ed70e12d73d7..7f0aa88221d6 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -34,7 +34,7 @@ #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) +#define AWCC_RESOURCE_ID_MASK GENMASK(7, 0) =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -168,8 +168,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 +445,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) - return false; + u8 table =3D FIELD_GET(AWCC_THERMAL_TABLE_MASK, code); + u8 mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, code); =20 - if ((code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LAST) + if (mode >=3D AWCC_PROFILE_LAST) return false; =20 - 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,7 +546,7 @@ static int awcc_platform_profile_get(struct device *dev, 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; @@ -597,6 +595,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 +614,14 @@ 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)) + /* Some IDs have a BIT(8) flag that should be ignored */ + 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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f170.google.com (mail-yb1-f170.google.com [209.85.219.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 E9F202153C8; Tue, 25 Feb 2025 22:25:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522320; cv=none; b=tcp88ompObxdnSf+dM8FmSro3l3UHYeuNsb/Rz4puqhXnjWn2PmxAbvDYWCj7T5C4PZkCi+eBJYe6qMsgOO8i/6qrZ4aKTxPm3zzoueSQKykIbQylG3jLaxU7HsjpkD3dLl0uz1BzFiCa4juZ0YP9xr9w/POaOdoSZxRXIPm5qY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522320; c=relaxed/simple; bh=LPAp9Dj0xFCha514lj3YAN7CuaDKEE+8JYAsRHGitM8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IP/hfd3nL74+6dkLy4toMD3mzPoi4hLA7BS+BQA+lGijC3QneMOt1uq9Mf/KiKSZ0oHuojAOYRobkc3Siz4Ca27AKAYarZsTUEIZ9lDTmGcH+DUrkjvp9Z2PrmAXlUAFKEg3ztUsAkdfr5KXfYhRka9mpdXskiIlp9VWMpr93rg= 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=HW8oW54N; arc=none smtp.client-ip=209.85.219.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="HW8oW54N" Received: by mail-yb1-f170.google.com with SMTP id 3f1490d57ef6-e5dbdbdaeedso5736517276.2; Tue, 25 Feb 2025 14:25:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522317; x=1741127117; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=j+CxeW/yy2vlrb9FwJu8UijsvUZYgdUhzYozNLc8xMI=; b=HW8oW54NAFsi3NGSHN+l69ZgHrv0bJp10jsjWgfyRnV9xeyU/FLVT2zp03dPlplzTt JVa5Xqcp9b/mkJEmLK2M+PgVloeotrJCkuoq+Hqb+29GvvFykWcp6QOD6OF2e5hvG9j+ 5+z/85tJplhqVz2Cd+7N+eJwu4VKAqEQDCaaPzDban0edurcSw/66F21E8k+wkofRrYT fEqZZThxQnjy7d1otFb7509g7TYJWjj34SARxzYEdlbZqQ9JCte2GflPd3hdbAdVVCl5 nawoAAydYjcwP5vXrpnipi5OOL5P19bjzCagEajHPfJCDDEPO41t2wVJ2z+9aobZTiJT 0GdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522317; x=1741127117; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=j+CxeW/yy2vlrb9FwJu8UijsvUZYgdUhzYozNLc8xMI=; b=IrZrwqYr4i+2X4tR9rNlu9A8t9k43YnWh/xD/RTnJ0MajqBonGHk7QwGirQ81/tEeJ TqXoQD9xxP0CZXkT5VilycRw0X7ofsEG3b4soyd3lEsQGXnxVhOEUmB1A5ivVvmVW267 OyXY7BTmUrdShCu9n4Jaj+qX1/dGRrmMQkdPv+RzRJow494elnYCMB/GPJy3R6/IrWpL 6i4WiPIesa70ZmLVQIflxYDIoZYDOxjQM4MeqK2c3dBv4Mvqj4+4J2ccN6+etRTxHcnn CQLCfqrRG4aPQddJLt4FE0Q5Xzc8UgHS7rJ162V3XBU2O6mFhIQwz2VQmKo5j8aMnRT/ XQeA== X-Forwarded-Encrypted: i=1; AJvYcCVozjGvT4nHPkOfBIz8B81eJ/mh//52P8oUk3rHRY1eGP2yaO0CqXyplVmTk5spfSoT8EOgDrk7yAntCR0=@vger.kernel.org X-Gm-Message-State: AOJu0YwYbxuOb8JQK7m1QYSFHtvrCBMw/v/9Fb+IEV9su6iWc5GTZBQk XN1tYcA2fHavY0WVBdncCapycjHx5HZPUp5OhOkdQAH8/m49vPuj X-Gm-Gg: ASbGncvxvJodg+VIyckrXNwuH50rTN/0u1SSUdjdP1Me3yXmmfIutnxj3pe1ESxeySZ LGedtxgQbpsV+8zSNb2rfGgap5k3wVYJj3FYfBeuxqE+hNicQYEeQ4wQYzpTUhcr9hDmhTIihSk fj1iFlc/C+vqc+mNLUkLT/nyr5Ot9fcRUD7Qfp8qQr4Bra2+wfLVqQbGaOFPMU6PcHN8i8WzlWm 5MZ3Iqf8aHJDE60PFxo7+RMr9B0blxt4VXxZxj6XitU4zuoFrAMbmgd005+GZG/bJp2Aw7Qv8Ro oOeP9R+8aMds2IKGKILr5jqM0cwDpf15rw== X-Google-Smtp-Source: AGHT+IHLQr1NbE4fqFz2HyjnHiHOGcU+4XkjBz2cKonMToeEV37hkmgpxFIK1T/NpAm0BJf94ACQTg== X-Received: by 2002:a05:6902:26c9:b0:e5d:aeb7:6e62 with SMTP id 3f1490d57ef6-e5e245ad516mr11818339276.7.1740522316874; Tue, 25 Feb 2025 14:25:16 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:16 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 03/10] platform/x86: alienware-wmi-wmax: Improve internal AWCC API Date: Tue, 25 Feb 2025 17:24:53 -0500 Message-ID: <20250225222500.23535-4-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Inline all AWCC WMI helper methods and directly return the newly introduced __awcc_wmi_command() to simplify implementation. Additionally make wmax_u32_args __packed, add an additional failure code and add a helper with documentation for AWCC_OP_GET_RESOURCE_ID. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../platform/x86/dell/alienware-wmi-wmax.c | 104 +++++++++++------- 1 file changed, 63 insertions(+), 41 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 7f0aa88221d6..57897a0f4296 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 #define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) #define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) #define AWCC_RESOURCE_ID_MASK GENMASK(7, 0) @@ -206,7 +207,7 @@ struct wmax_u32_args { u8 arg1; u8 arg2; u8 arg3; -}; +} __packed; =20 struct awcc_priv { struct wmi_device *wdev; @@ -442,8 +443,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) { @@ -462,72 +462,95 @@ 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 inline int awcc_thermal_information(struct wmi_device *wdev, u8 ope= ration, + 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, }; - u32 out_data; - int ret; =20 - ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, - &in_args, sizeof(in_args), &out_data); - if (ret) - return ret; + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} =20 - if (out_data =3D=3D AWCC_FAILURE_CODE) - return -EBADRQC; +static inline int awcc_thermal_control(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; =20 - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); } =20 -static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, - u32 *out_data) +static inline int awcc_game_shift_status(struct wmi_device *wdev, u8 opera= tion, + u32 *out) { - struct wmax_u32_args in_args =3D { + struct wmax_u32_args args =3D { .operation =3D operation, .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; + return __awcc_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &args, out= ); +} =20 - if (*out_data =3D=3D AWCC_FAILURE_CODE) - return -EOPNOTSUPP; +/** + * 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 inline int awcc_op_get_resource_id(struct wmi_device *wdev, u8 inde= x, u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_RESOURCE_ID, + .arg1 =3D index, + .arg2 =3D 0, + .arg3 =3D 0, + }; =20 - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =20 +/* + * 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) { @@ -605,8 +628,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, &out_data); =20 if (ret =3D=3D -EIO) return ret; --=20 2.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f176.google.com (mail-yb1-f176.google.com [209.85.219.176]) (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 7CF25216382; Tue, 25 Feb 2025 22:25:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522321; cv=none; b=I9jT7dtXeG7Ail4Qn6lx4zBmR11ZOpxYtGnlm23S6qZh4fEzdfigPWr+E4O65S5YmY/5em/R9O2lf1EaRucKNX3bOHryoavUe0Z6FlCfVgx5rotwNvucnEoGVxCmG2rt9WNKPYz9sj7yiK+mbq75oME25OCDbHn9penEmbXDcNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522321; c=relaxed/simple; bh=jUEBuq/ABjACMYB0EbZrp/JVKsSoCpVcXgjiFTHWjCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bDkwsUBzOSMKfwxNFf/AjGYv8MKAl/DazDquQJ1O7uIq3g0XwhT3zPds1o9MZxfTcif3ZtgssQiZQ5lKWF1eYQ5FYU/cR9SKKCQFdOTubIgIsnU3TZlmiiEuwHdmX2Tpcjc0y1x8m3olUh2oINtXqEYJDBvHL1lctkZQRQPhRH4= 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=E13IlmFL; arc=none smtp.client-ip=209.85.219.176 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="E13IlmFL" Received: by mail-yb1-f176.google.com with SMTP id 3f1490d57ef6-e5dd164f03fso5652565276.0; Tue, 25 Feb 2025 14:25:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522318; x=1741127118; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gHxqtl0uXjCD0uT10CA/yTLNuWfuWE7jjsFFOib6WVE=; b=E13IlmFLQJd0XoqS2N3BZzJ/B7ZI64PsISgro3RnwtrfrEKPf+LebO0SQh6IGnwWdM C4HtU/PJsiOIjRd1tSRBMwHlY6sJTEHlEui8ZPHn41acpxbYi/ldkP2gszk3Bv1Yav7/ 5gaUl/RB4o7aYO2WXblxTXXQgjCW8qD+YftaOfDbn/RBGgrop1mwS3BOwkbMOByMQGZZ uOaRclgzJObtMHNdCZzCgBqifUnsM6xTGmu5VcQ0UXpdgH5opyVJDVq2Bc14gdQHQNrN 3AU29HbHtlzTmCzaqdzZKPJ5NYpbI4jf5BwM3spKKcBKvD9/l7PDgKuE1pkl4/y6+oJt NNvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522318; x=1741127118; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gHxqtl0uXjCD0uT10CA/yTLNuWfuWE7jjsFFOib6WVE=; b=Rtjp+3TEVewm5WsUfOn/zBEq5E8NOWRjMUggk1cg1SKDB4sBCXr7CgakLNb1dKq4Zr lWpOEazn5PIJv0GidYqkyj5a4Fs/09f7vyJ1L+M1SZY0FBo5lYizAyyYbKkfDyKRKQ47 MC+IBRI+OdV9syXePs23WtPFjexBBoewRc7oePfxcvCZEhTpR1Swg2QdJMFBdN+plhkd r3tq2Vz7nGfiLaWYcdNIZC+BvWWZWPjgu5kvtYaCOgeApRgRxaVqHfdTNj3AI9H7mU7a 2DcqyKft8jrYsjCEk+rtiahqU9/UWs99ibHeESPOIh4TAkScLzQ/4zLZG7b8S7eCh52D DtPw== X-Forwarded-Encrypted: i=1; AJvYcCWxNxrr3W6hUAtiUmOCMOjzhv5LpWVPYOKCcNQT+DfOH7RK3S4Pxhtq5CnN39EeBCNrnFIikKF8ul26wF4=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0GjEadMvVeBvUehGZdZCRdBWPZ5X1M5sYC/9xHZBlSA0MKJ4G P195cGnqaV7lisHCfVJ7lOzj9d7OIF40Ud+PWtiEN8eb13D6DqZx1Kiq6LoF X-Gm-Gg: ASbGncvmgdEDqngHZS9LnkX7Kcxf9dplIfwA8AoyEx3Rb70D9olqkOcrlsUNVVTIo+v AFaIXH9t8OR0PqO9yuK97SONtKFmZMnefRXjCXisEErSD1iqtm+Cq5vHGhFe8CT0Xo2OENGCA+r nuQLi6psWgN6BQWAtYgKO8i2LGmJmC6pQOFYMAIjiDJv9HOs8UYNUSqw4ubqOcnrTR5oBxM+lIt W/99qM0HXGYB2dTPD6TNoc6xlC4a2FfYeBAKHqPVVj+f9+cyiL04rnEPcVYZxG8STVve65vr7Nn gtNEfEYI4+qn/y5woC9iyfhUMVV/g0xTtQ== X-Google-Smtp-Source: AGHT+IFHzN1SaZ8F5oklGOTlIRNpFs2VPMYXbDDwrKRe0SdyNDUY4QNIhTz5mFeFzrbE7d4l8CZCkg== X-Received: by 2002:a05:6902:e0b:b0:e5d:ba24:7dd3 with SMTP id 3f1490d57ef6-e607a4c4007mr4268717276.5.1740522318351; Tue, 25 Feb 2025 14:25:18 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:18 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 04/10] platform/x86: alienware-wmi-wmax: Modify supported_thermal_profiles[] Date: Tue, 25 Feb 2025 17:24:54 -0500 Message-ID: <20250225222500.23535-5-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename supported_thermal_profiles[] -> supported_profiles[] and change it's type to u8 because it stores AWCC thermal IDs. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 8 ++++---- 1 file changed, 4 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 57897a0f4296..4a8335d90b5d 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -212,7 +212,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 { @@ -606,7 +606,7 @@ static int awcc_platform_profile_set(struct device *dev, } =20 return awcc_thermal_control(priv->wdev, - priv->supported_thermal_profiles[profile]); + priv->supported_profiles[profile]); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -643,7 +643,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); } @@ -652,7 +652,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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f173.google.com (mail-yb1-f173.google.com [209.85.219.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 E70E8217677; Tue, 25 Feb 2025 22:25:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522322; cv=none; b=Eorg40kwsgATixJ3FQeWOVQXqF5xnmb9/cBlWP4odWmepL+kPkceICIuTgzMQIF/mwNYiEZbjpAz2EwwLht+F7J51kVqFSMdjskVdfFydDYyirEvqv/Ag6PVLts8oDWxVfANMiFq1QpsPNk7bujUnJmWrZnqLUZ3xv0PN447lO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522322; c=relaxed/simple; bh=coz2p1iCYGic1nUNNDm5ZUZct2+avkofXt7SJW+CW6o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fwmJV/ouQp7bSti+ibSIMqWXySxCDWjc72O2sDDzCYMEau2iwq2cCqq6NwqNBvqjlVds0Tbu4P9IlN0V6u4eB+Ni8CwLmtnmf6yfKSqsNXpMp8RCDyReC/c2gnMpKVsqtAfGt0c1067eaPWd1G9ZppHh+famC+jKGgUcSTBFbK0= 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=P2+lYNl0; arc=none smtp.client-ip=209.85.219.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="P2+lYNl0" Received: by mail-yb1-f173.google.com with SMTP id 3f1490d57ef6-e606b74ccc0so2181760276.3; Tue, 25 Feb 2025 14:25:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522320; x=1741127120; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=C3/TGlPK8TXmQtMShaone+EJa0sKCUnXmW8tDejZZQo=; b=P2+lYNl0R9zkt3wx5mZaETfOAcR2T8QbKu++5eveEFsZGCLxLtQqrfZGU531jjAu+S zcZUajbfHz4VQnOLHyABTILofSPoypOXLIPQc1lRK4HhmPe6mYTFLF69OPtrrRGicSo+ 4ejaRiHYOkaEFsgiF5rS5s53/y7nuHakXp/Q3DnpU5j6BPfPK9BC6XJlXNsbLYQcJVMa lfcfDh6l/GQcfFSqJGj3i/vvZJJBIKpOLWsNWolCILhnDXGWtdBwIIyrD8IHQsiHLtm3 J2mS0rVxWp1xchUQ9Lc6tUcnxpqnj93M/vEwsSWHq5xg2Krqr48pn6SMiS8Pkii1S3/z /xaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522320; x=1741127120; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C3/TGlPK8TXmQtMShaone+EJa0sKCUnXmW8tDejZZQo=; b=MIEk93spYsKpefWFsMn6m2mCIdB17iCQDodsUZ0IjhKwo6hNxTa9gpqLBRJawIPfHF WDcBhT3Sw4JLEQt/3W+Bpw9yrag/GiaFYkvpPZmKe32cTMqEkOQ88fc4eRw27Dsa5PbC rBLxIVNdFURDPhcpmMAFGg3mLz4FhL+oqzSzB0+COurxejY61xHfDPHgisfjGD5r4kv4 tn72aDFkabQRGdYuDaHWyNPzd9+g0t7c2USyWDWmvX+bosH5CgnjZDfEgwGo4HJ40FJS Y4Slm+r3uUyYrFvbjVH7a2aP5xHtvy60TuSd+6CmwPwgZQgxhwWQUi/O8OgKSbaAPgVd VQiw== X-Forwarded-Encrypted: i=1; AJvYcCV8s1bdfDg1gpKUSoW45vKXUHu7K6+sHoOiO3SedL+z+2xgtRkRLUz03T8NBw+QRoc3hk3UKyxOulvF8ZE=@vger.kernel.org X-Gm-Message-State: AOJu0YwBdmsM/71L5ezJOq4zwYbpyLAhApUmv5adrMp85VyLs0jhpH63 11QKtxUM8txrLaQUSMIkyXcZsax7zjs+LiX8oG4Kn4NX3CCmgKMtVYGNIhHE X-Gm-Gg: ASbGncukyeIILyHL32opzXG61l3CiKBZWUBqsy8jfI7bXq0nN85RXrJMbQBd/AKWfrC 4/GqI+iV/lFcUJumZWaNdGZTqFYQUvmbDyGSRIUVxtlA5L2LZtRfwriuZi+ikoqlBqRoVltPm+H vM2/tZI2gNK7ZaOtOlwWrMmvP/k14q4OHbvLXZKAARAOm4eVPNRbB+zr+u95ouf3Q/xOn3RBave CxZvcOmnHLKvSloRFapoJd7+W2dHyaRsKXWEDiezJ/t408rSVIZK9Sn7vmGwH28oeg8Czxa1kJA /SjJPASoe0oY+55Di3bJA6t8qJv5ZzNjAQ== X-Google-Smtp-Source: AGHT+IEkWY2Ro0A0rYTD/iff35oqluoSFbxm+LSNmEPGn1VLR7VEJkNinZUqWDGX0zrQpXtWtnMKZA== X-Received: by 2002:a05:6902:2204:b0:e5d:b88e:4f07 with SMTP id 3f1490d57ef6-e5e8afe33edmr13486780276.21.1740522319842; Tue, 25 Feb 2025 14:25:19 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:19 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 05/10] platform/x86: alienware-wmi-wmax: Improve platform profile probe Date: Tue, 25 Feb 2025 17:24:55 -0500 Message-ID: <20250225222500.23535-6-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Get and store the AWCC system description in alienware_awcc_setup() instead of awcc_platform_profile_probe() and add a check for integer overflows to avoid misbehaviors. While at it, replace set_bit() with it's non-atomic version __set_bit() because `choices` belong to this thread only. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../platform/x86/dell/alienware-wmi-wmax.c | 61 ++++++++++++++----- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 4a8335d90b5d..965b427f8f0a 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -37,6 +37,9 @@ #define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) #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"); @@ -211,6 +214,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; + } __packed; + u8 res_count[4]; + } __packed; + struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; }; @@ -614,38 +628,41 @@ 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; 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); - 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, &out_data); + /* + * 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, &out_data); if (ret =3D=3D -EIO) return ret; =20 + /* + * Some devices report an incorrect number of thermal profiles + * so the resource ID list may end prematurely + */ if (ret =3D=3D -EBADRQC) break; =20 /* Some IDs have a BIT(8) flag that should be ignored */ id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); - 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)) @@ -655,7 +672,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; @@ -686,6 +703,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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f169.google.com (mail-yb1-f169.google.com [209.85.219.169]) (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 6ABC121B9C8; Tue, 25 Feb 2025 22:25:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522324; cv=none; b=HfuKMZxk9bmAQ7hUkex0t9dVyHraIZAqAWlr8lG7DaAuwgIVwZ+kyk3c9UtRSlpqVO7gyg7PiUJjksJF77buIzegv9awMj39xydUALuEBpgVjNapZXgv4zp1W+Bmqa5P0OJi1mfVIwmPonhkk9oq/gh1LJWZQ6ALfZWQkKmArLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522324; c=relaxed/simple; bh=jY2SGVCgrNBhQUg7x35oBl8V0TTD1k/yXqx1d/A08ko=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qbt6+CT23Lj0RiIDIh2sfZC1TPrBV26BbsxfsY3oK7YKFUuvASwM2DBnRS6hAPJcf9AJJEjE+CtsoLTPl8Eabkehg7zdPLkAAVENvufAyC3LvNGsoqPYnVMh1J0bNUdtUARMlbb9rYQFiURHvuQ7cfoP6AKiQnOnC0BNTud/dow= 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=XXSZopGw; arc=none smtp.client-ip=209.85.219.169 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="XXSZopGw" Received: by mail-yb1-f169.google.com with SMTP id 3f1490d57ef6-e5dd164ee34so5654232276.2; Tue, 25 Feb 2025 14:25:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522321; x=1741127121; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ngqJYv9awp2JsLWCM6W7g9eJMrp9NEn4ebDw819xeHE=; b=XXSZopGwTfgSPl/mgOzyPOfrM3zfRn0avBE2KgCyGsCsD+scKzAwPEa6InPwLNNtI+ rAC46WdHkmt0MxLLfT4C4ZDwpH4ecFC7uzIzaiAhLYaruQkw3y1rZjW6D+VNLfOLd8Z3 8ETjfMFvAjNgBr1XQ7piYfWxKgBzFbAUp7KkI7Q8gsfnz6NlSw97BkIU7txm51ejwHjA r5uTA3xA3pBM2AiyW4V+J6taZtvuBbCzlf/ytBGUCgrGu88ljEVA7w8+ympMgHJ0Hsed o2r7ezTOOEjO2qTXga6IBCubCLR3sDp+VYMhcJargrIY3Jy17n3Ie6AeWwGj3kv/wqPA vibQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522321; x=1741127121; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ngqJYv9awp2JsLWCM6W7g9eJMrp9NEn4ebDw819xeHE=; b=MAO8HCxqBuauP/Q+fYG/WwsNixpaToMZTWesMHc3e9vTgYO5iMpvZLnNnIMb8AKLOJ +0gFc7qEEOaZi9BW4LW/sN6wlpPXRWUUswpE11Y1y1NAS8hEOqMN5nFDjxTPD1h98msn qpz8RffUuJjHJ4/IujYSF+A2q0TRaYQwl/HB+wqVps6YKuxFHC/KD+aWbd1GPxmqk6qi knAODkuBCQc4I/fE9qdqLzCBd2INyZ5jOd5DptwhsjaW7XFXvCKxd1YCyzlHpfikBXC8 c+0U/aWWLzT2Tp92i1VpspyRg+cmqf64W0Ihj2SM2dMnj9qBdo56ci2hliGEnHB2Gboy 7j+g== X-Forwarded-Encrypted: i=1; AJvYcCVuoSGhDmzbt0qeAHwvLn8mjnMFecplUjCZ5JvjjvU8lrw8hhFitIJLOnwN4FwjhI+I8PCy6b5J4sooc18=@vger.kernel.org X-Gm-Message-State: AOJu0YxVHCCIk5GlcQO5We2A90HLg6Lblhz9atY4651gjQr7+B45qF8+ XfQJuNVh/dZVD6PxvyItq/qd28lB2HXczK6thKH8+BCUguJDiw7AlsZG3sxE X-Gm-Gg: ASbGncu2aQYkgU4nXTj1lt1AWZK6SkHU5Ktp/a6q5NnTJCPA3JYCGRjM1xqnt8m8asW 8ucOWIjyabxzcrFN38tl9RH/CpW7r4A6jMIyDtEJ3MGhpkSEtZy0Iuf28tR6TylySRkDxNibv18 dFxSY53Wf/yJQby3+koV8Utp+ZhArsIpuLaS37+cUh0PJyS1sFO/QyEJBSO58gq3K14vULwEfs8 8ztQIsLxTjdnW7CVOGeccKvF0hjwdesLAdfDXkBuay6VzTcS81rcZ/3PHeGrhap3+XWG4g9xaYI 93lRZL6ca++OC/x1bvulJ5cc1L9woJvNEw== X-Google-Smtp-Source: AGHT+IGYOij5ZuQoY9KfrwWS0qxEZXFcfmgWdkuM6+jvBTjVH63lAJruoejb5Vqv9Y92DF9MBRXHUA== X-Received: by 2002:a05:6902:2085:b0:e5b:171c:35ee with SMTP id 3f1490d57ef6-e5e8b0726d8mr14067487276.48.1740522321321; Tue, 25 Feb 2025 14:25:21 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:21 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 06/10] platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile Date: Tue, 25 Feb 2025 17:24:56 -0500 Message-ID: <20250225222500.23535-7-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- .../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 965b427f8f0a..bbe87f91fcb6 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -29,8 +29,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 #define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) @@ -176,6 +174,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, @@ -578,9 +581,15 @@ static int awcc_platform_profile_get(struct device *de= v, if (ret < 0) 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)) @@ -670,11 +679,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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f175.google.com (mail-yb1-f175.google.com [209.85.219.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 1C2BF21CC45; Tue, 25 Feb 2025 22:25:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522326; cv=none; b=OD3uZ2SveFiBdxuorK8IC3zvO/3MWOpGSnTBnuu9Gdu4UnXD7wvXfahs1HUgTZwBeqHof7+1tZwnSyN4k+RGl/q/2MyjWqdH3wTFhqI4eINyl4L4fk1/Zf+mpMW5m3IgCKqd6/8ACBOCUR/q8YPleBJsGvg35vPNE7CfMKY7Yp0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522326; c=relaxed/simple; bh=zWACJQxcs67WOEZXgyLM+xrXB9rfodsDjjWC0Nt+4Is=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=c0a7VQTwgg0+AkmQX7COjbr0xMAcapUx6H5gvu2H0qcAwwJ6HJFMvODkPkEsc1O5hONzqBQ+FOoanaSnlqqaZG4m2jkW7fwor7WsidcaU8aqNsD3ydfFmO7my0NvjW+KpbZZPuY3VmfHEqeLqxeZtsBxonSZELQxc681NN39TSE= 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=DMJXTUlk; arc=none smtp.client-ip=209.85.219.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="DMJXTUlk" Received: by mail-yb1-f175.google.com with SMTP id 3f1490d57ef6-e549b0f8d57so5362750276.3; Tue, 25 Feb 2025 14:25:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522323; x=1741127123; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=i7wYs75TMDc/A4X5p69DyagQQEENOkyGqSOAZ/vwnZk=; b=DMJXTUlkcssithatIqM2RYVmMjmor0dAaBPye1qb6ZzOSh5oI/49+cBqng/0wDr4ci EGwbuRGylAcKIZpAeXgs4awL0p6NI6nXzgP5zLx/MSrPhHHekKZGH6t9DHOgqt/TWBA0 iUoxyDCwSO3ux0arnVT07KxF34wFuz1t3aPd1VtX1vS1ZP0pd3Wxy18E3FlYnbRFXXn3 +uj5opPDvKwM5p04ndPF0ouO4enxK4qazhepS34Wb+Jth6ZcEltLzpytYKoCCjI4sB00 G5+/eY66LnVQ/UpysQw1IQq4aspcg9QdhIcCoVEOnAdW6z6iyehWNE/WanXID1EE5JMu BGuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522323; x=1741127123; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=i7wYs75TMDc/A4X5p69DyagQQEENOkyGqSOAZ/vwnZk=; b=KvUUBK3/Zh3tLW7Ce9Gg4j/iJSlWVSP9vapNNfonF+FCSUrNOgXTlvep7XPa378PLG 39R4Eit3OzOWkO5WbERN80BxVD3dsSmAZBXfKw8fq15qjUMWsRiNUbhNxufI95eCGIuE /BYeaBcWl6rQ3vHFPaUTMb7U5RzwnrDhREK2oe7E+O9biFBNKTikLpyabnLUSOkk8jbb SSGbQjvLdObq1wKdlTTGFCkpaRTcg2DWHonJvfygM0JQuG0uu8ZSIRxYLYAZ570lQzgu U/IIJRcLJ65SbsqNupJy4bhYW+fzhcO+R1V/qn+F2WlghZbpnAF2PMO8znldYZg3re3B yYKw== X-Forwarded-Encrypted: i=1; AJvYcCVNQ2ezwQ3XMl97SS+rgZFuYYue0KLFg928tHQDoIYVvPeV/k0EI032tAjCp8ZW4e4gKNiO26gFdsAL/zY=@vger.kernel.org X-Gm-Message-State: AOJu0YzMVR+CFPf4Hzkgv0h8HJD+73wZcLf2uw/b4DiQEtNpUke61ErD uxBhDbEX/xn3f4Ppsyk1FQbGHYTPRyrsxmQjJi7dLC91NeYIWG2x X-Gm-Gg: ASbGncs4o+VRyH5qUp5qZ2A/9fYp1F7Eoj/t37JLfFWNOtPhTVOFKGYEAxWoevtx+cD tfgJ23UMXWJvIkPcXW/gtgLn21ztJ2g4FZ30rii6sfaoRs+UFp8m6y/8isdCrmjuu0UCLYZP/0q +UVSfA5/Vw9ZLKg2sYARb+ivlJakg5jIg4w6OJoGZwTiW3knES1pAzagCOKyW37zbiqzwInRnrz HYlflzL/33ZXrTcDK0VM0Kh1HWaf+C+7WloSK/MsB7ZQgp38NO1LjUSQb8hCpsd7TJ7dVKPyLnk RrP+yFd2jyB2y8g3U74M6iH/hdmAoAXOyQ== X-Google-Smtp-Source: AGHT+IHLvuDpb9VkvgnpmXkQ4hZ3j9aHGREZSSW4gK50F+7S9Fgj8Gv+RoCxSXHr8M3bK+XJmjY2iQ== X-Received: by 2002:a05:6902:1546:b0:e5d:d161:2690 with SMTP id 3f1490d57ef6-e608a81f9famr1128142276.43.1740522322914; Tue, 25 Feb 2025 14:25:22 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:22 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja , Guenter Roeck Subject: [PATCH v2 07/10] platform/x86: alienware-wmi-wmax: Add HWMON support Date: Tue, 25 Feb 2025 17:24:57 -0500 Message-ID: <20250225222500.23535-8-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" All models with the "AWCC" WMAX device support monitoring fan speed and temperature sensors. Expose this feature through the HWMON interface. Sensor readings are cached for 1 second before refreshing them to mitigate the performance cost of calling WMI methods. Cc: Guenter Roeck Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Kconfig | 1 + .../platform/x86/dell/alienware-wmi-wmax.c | 403 ++++++++++++++++++ 2 files changed, 404 insertions(+) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/= Kconfig index f8a0dffcaab7..85a57c01aaad 100644 --- a/drivers/platform/x86/dell/Kconfig +++ b/drivers/platform/x86/dell/Kconfig @@ -43,6 +43,7 @@ config ALIENWARE_WMI_WMAX bool "Alienware WMAX WMI device driver" default y depends on ALIENWARE_WMI + depends on HWMON select ACPI_PLATFORM_PROFILE help Alienware WMI driver with AlienFX LED, HDMI, amplifier, deep sleep and diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index bbe87f91fcb6..818023a5b205 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -9,10 +9,13 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include +#include #include #include +#include #include #include +#include #include #include "alienware-wmi.h" =20 @@ -25,6 +28,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 @@ -38,6 +42,10 @@ /* Arbitrary limit based on supported models */ #define AWCC_MAX_RES_COUNT 16 =20 +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"); + 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"); @@ -47,16 +55,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, }; @@ -154,9 +165,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 @@ -179,6 +199,12 @@ 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, + AWCC_TEMP_SENSOR_LAST +}; + enum awcc_thermal_profile { AWCC_PROFILE_USTT_BALANCED, AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, @@ -215,6 +241,15 @@ struct wmax_u32_args { u8 arg3; } __packed; =20 +struct awcc_fan_data { + unsigned long *related_temps; + unsigned long *auto_channels_temp; + u32 total_temps; + u32 min_rpm; + u32 max_rpm; + u8 id; +}; + struct awcc_priv { struct wmi_device *wdev; union { @@ -230,6 +265,11 @@ struct awcc_priv { =20 struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; + + struct device *hwdev; + struct awcc_fan_data **fan_data; + unsigned int temp_sensors_size; + unsigned long *temp_sensors; }; =20 static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { @@ -494,6 +534,19 @@ static int __awcc_wmi_command(struct wmi_device *wdev,= u32 method_id, return 0; } =20 +static inline int awcc_get_fan_sensors(struct wmi_device *wdev, u8 operati= on, + 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 inline int awcc_thermal_information(struct wmi_device *wdev, u8 ope= ration, u8 arg, u32 *out) { @@ -564,6 +617,343 @@ static inline int awcc_op_get_resource_id(struct wmi_= device *wdev, u8 index, u32 return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =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; + + switch (type) { + case hwmon_temp: + if (channel < priv->temp_count) + return 0444; + + break; + case hwmon_fan: + if (channel < priv->fan_count) + return 0444; + + break; + case hwmon_pwm: + if (channel < priv->fan_count) + return 0444; + + break; + default: + break; + } + + 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); + struct awcc_fan_data *fan; + u32 state; + int ret; + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, U8_MAX, channel); + if (temp >=3D U8_MAX) + return -ENXIO; + + switch (attr) { + case hwmon_temp_input: + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_TEMPERATURE, + 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_thermal_information(priv->wdev, AWCC_OP_GET_FAN_RPM, + 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]; + + bitmap_copy(val, fan->auto_channels_temp, BITS_PER_LONG); + 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); + struct awcc_fan_data *fan; + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, U8_MAX, channel); + if (temp >=3D U8_MAX) + return -ENXIO; + + 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: + fan =3D priv->fan_data[channel]; + + switch (fan->total_temps) { + case 0: + *str =3D "Independent Fan"; + break; + case 1: + temp =3D find_first_bit(fan->related_temps, U8_MAX); + + switch (temp) { + case AWCC_TEMP_SENSOR_CPU: + *str =3D "Processor Fan"; + break; + case AWCC_TEMP_SENSOR_GPU: + *str =3D "Video Fan"; + break; + default: + *str =3D "Unknown Fan"; + break; + } + + break; + default: + *str =3D "Shared Fan"; + break; + } + + 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 long temp_sensors[BITS_TO_LONGS(U8_MAX)]; + unsigned int i, max_sensor_id =3D 0; + int ret; + u32 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; + + id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, id); + if (id > max_sensor_id) + max_sensor_id =3D id; + + ret =3D __test_and_set_bit(id, temp_sensors); + if (ret) + dev_warn(&wdev->dev, "Sensor ID at index %u is duplicated\n", i); + } + + /* + * We prefer to allocate the bitmap dynamically because usually temp IDs + * are small (< 0x30) and only one UL is needed to store it, but there + * may be unknown devices that break this rule + */ + priv->temp_sensors_size =3D max_sensor_id + 1; + priv->temp_sensors =3D devm_bitmap_zalloc(&wdev->dev, priv->temp_sensors_= size, + GFP_KERNEL); + if (!priv->temp_sensors) + return -ENOMEM; + + bitmap_copy(priv->temp_sensors, temp_sensors, priv->temp_sensors_size); + + return 0; +} + +static int awcc_hwmon_fans_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + u32 id, min_rpm, max_rpm, total_fan_temps, temp_id; + unsigned long gather[BITS_TO_LONGS(U8_MAX)]; + struct awcc_fan_data *fan_data; + unsigned int i, j; + int ret; + + 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_data->related_temps =3D devm_bitmap_zalloc(&wdev->dev, + priv->temp_sensors_size, + GFP_KERNEL); + if (!priv->temp_sensors) + return -ENOMEM; + + fan_data->auto_channels_temp =3D devm_bitmap_zalloc(&wdev->dev, + priv->temp_count, + GFP_KERNEL); + if (!priv->temp_sensors) + return -ENOMEM; + + /* + * Fan IDs are listed first at offset 0 + */ + ret =3D awcc_op_get_resource_id(wdev, i, &id); + if (ret) + return ret; + id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, id); + + 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, &total_fan_temps); + if (ret) + return ret; + + for (j =3D 0; j < total_fan_temps; 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); + if (temp_id < priv->temp_sensors_size) + __set_bit(temp_id, fan_data->related_temps); + } + + fan_data->id =3D id; + fan_data->min_rpm =3D min_rpm; + fan_data->max_rpm =3D max_rpm; + fan_data->total_temps =3D total_fan_temps; + bitmap_gather(gather, fan_data->related_temps, priv->temp_sensors, + priv->temp_sensors_size); + bitmap_copy(fan_data->auto_channels_temp, gather, priv->temp_count); + priv->fan_data[i] =3D fan_data; + } + + 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 @@ -735,6 +1125,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) @@ -815,6 +1211,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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.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 80EF221D3DA; Tue, 25 Feb 2025 22:25:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522327; cv=none; b=BSA+iH3NYu88IW6u1qD2NnfHbGciVz1hTjuWoSNw9wyTjy6M1BiLW0Lk8oLXmVlfrMkdDmhWay4WCTCQx9RLqZao7/IFqGAnNa4XbExJaOWFwcbSBlkgBCnSpI20P79VbdLOrl/Sc9tEf9o2aPKkSYaqbJXcLaXewSHJZIOn/3s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522327; c=relaxed/simple; bh=/eo10kjHGQTKqwD8wnoYQqTqRNZdnJnuq227qjiEHMs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Wj07VyHQ6Kdllg33FtbuTx2wsegaHFdIblMg+h/i3JDY8QJFSMq3YlNjes18WYb3/VUmUqhXBIX1RhAua4MrJuYdMCSZTHTGmhmcPcZf364K5g3gLqh6MnIpdibJ4gvHvPCqyhW/4SO0dAoLb3Jr3UhI1VTf4BlZiGG8qZ5brgo= 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=cFtaZ+Nh; arc=none smtp.client-ip=209.85.219.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="cFtaZ+Nh" Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-e53ef7462b6so5151561276.3; Tue, 25 Feb 2025 14:25:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522324; x=1741127124; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uaWzicfmHXc/LpyRPRs0tJ1l/TrMjPTRdPjC+njdQEM=; b=cFtaZ+Nh2E3wdzxyL1+DET6ujirsp8yczpJeTmjv2NIQrwg/zzKXjdlX61/Mh8AM0H NZfVbBv0tj+bma+0YkVtblXPkASOOfkvCjCZOTphg/PBqCVwO5t0kkPWo9c00LFSi1Ni VYHWkk2qIQpuv/6U72HGcJ/N0MKP9yK4+/JShqO8IHRG7DR5Veugp8vHRn5bKxxGMGRq ntQ6i1ZYmShgwE7kC6zPPggf/MJsYyrnH6AYLoc/ODdUSaVf3jnQXBanR0gzeAVQbe+N g9Ji8ibQPdtRSLiWf3Be+zHLu4Xb4jLOp2C6xmRn3KCUps2LxmGJhFw/iICV6lSL5JSm LYRg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522324; x=1741127124; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uaWzicfmHXc/LpyRPRs0tJ1l/TrMjPTRdPjC+njdQEM=; b=sIjgRfemztaQRgqsCUvQgELz4VAHWh+Dj2+zDL/wHURwOzSZQxMQYuqP/IQwIkOTC6 C0tbtN0EDq4FJ+xyTVUAc21moev2jB+6IRcKzW2HaJr2qdbwABFRsmnR03/lb71gXvOQ SO+pF7ryp+AX0CijG0h7Ba12194iWwTyh2WhWlGDrTxAaTmkJWHgKmiDQW1iDtPt5aGS ftmDC7yw9RUwYK91Cs1uXzOvHAzwCHtJ9YdXAEV/qEiaYhEPSSmoPZbu994C1uVhlyBL kyL8uFVEpCwoe0FTDvyKqH1iQ2FNcbhyqf/WqeYEY7Y5s4Px9ujDo2iGpmV197ukwVCm mARw== X-Forwarded-Encrypted: i=1; AJvYcCXI6dMpYGpnHEjvsIr39WAzQ6GHU8h31+wJ6R0IHp8rzFTF/0Wi1wIT/A/GyqxoKe1CkZiBX5/1H3Rrvr4=@vger.kernel.org X-Gm-Message-State: AOJu0Yy2epCHt0OXqBVqlM/8s2b/V67oi8R1ClfCxwxE4/pC311r8qsq CVy2apFZ22AQCLexODQo+8Wbg+BolJszqkPGuOO1jJSL1o1O0Vn8M1l8Pl2Q X-Gm-Gg: ASbGncuH8+KRNfF5g8GxuU/P5h5cHWhbApl0QSHlmMZg44tQFZARnERZ9gUl+u6Mid/ 7Ksy5yGemcZOX46tU4oVEeY3bY5KlY0H6ZXeF9ay5eQ/aqf/R+N0xrwXk2s3nLiiE6e+9lkt7jI yhD6Lmk5om5BptWGtZKBcrdUkRH7wBSVeqlp1iWQiZtUO+CIDT3cLFgVuRpWfID4GM9pVrB1W/I Bc3RY9/qZ/vnP+mbGlKeWCfDwr+AUkh7SpFSxwuCEknJXyBuz13D2RTuxKak3ncgs4Ll+eoh+/n EapIBynIXKBEYOlcWMVBMQigZYR96MoxtA== X-Google-Smtp-Source: AGHT+IHUM+MfHWwncsThi8IY1zrwxMYmNJollW58jq9gfBWsfaqegtxfrqAhMr5RNxiDCwWUfzFeSg== X-Received: by 2002:a05:6902:108f:b0:e5b:458a:dec2 with SMTP id 3f1490d57ef6-e607a4f9bc1mr4062939276.21.1740522324508; Tue, 25 Feb 2025 14:25:24 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:24 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja , Guenter Roeck Subject: [PATCH v2 08/10] platform/x86: alienware-wmi-wmax: Add support for manual fan control Date: Tue, 25 Feb 2025 17:24:58 -0500 Message-ID: <20250225222500.23535-9-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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 PWM `boost` value, which has the following empirically discovered, aproximate behavior over the PWM value: pwm =3D pwm_base + (pwm_boost / 255) * (pwm_max - pwm_base) Where the pwm_base is the locked PWM value controlled by the FW and pwm_boost is a value between 0 and 255. Expose this pwm_boost knob as a custom HWMON attribute. Cc: Guenter Roeck Signed-off-by: Kurt Borja --- .../platform/x86/dell/alienware-wmi-wmax.c | 152 +++++++++++++++++- 1 file changed, 144 insertions(+), 8 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 818023a5b205..64818efc3a1a 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -13,8 +13,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include "alienware-wmi.h" @@ -178,10 +181,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 { @@ -247,6 +252,7 @@ struct awcc_fan_data { u32 total_temps; u32 min_rpm; u32 max_rpm; + u8 suspend_cache; u8 id; }; =20 @@ -560,12 +566,13 @@ static inline int awcc_thermal_information(struct wmi= _device *wdev, u8 operation return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =20 -static inline int awcc_thermal_control(struct wmi_device *wdev, u8 profile) +static inline int awcc_thermal_control(struct wmi_device *wdev, u8 operati= on, + u8 arg1, u8 arg2) { struct wmax_u32_args args =3D { - .operation =3D AWCC_OP_ACTIVATE_PROFILE, - .arg1 =3D profile, - .arg2 =3D 0, + .operation =3D operation, + .arg1 =3D arg1, + .arg2 =3D arg2, .arg3 =3D 0, }; u32 out; @@ -815,6 +822,77 @@ static const struct hwmon_chip_info awcc_hwmon_chip_in= fo =3D { .info =3D awcc_hwmon_info, }; =20 +static ssize_t pwm_boost_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + int ret, index =3D to_sensor_dev_attr(attr)->index; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *data =3D priv->fan_data[index]; + u32 boost; + + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_FAN_BOOST, data-= >id, + &boost); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", boost); +} + +static ssize_t pwm_boost_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t count) +{ + int ret, index =3D to_sensor_dev_attr(attr)->index; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *data =3D priv->fan_data[index]; + unsigned long val; + + ret =3D kstrtoul(buf, 0, &val); + if (ret) + return ret; + + ret =3D awcc_thermal_control(priv->wdev, AWCC_OP_SET_FAN_BOOST, data->id, + clamp_val(val, 0, 255)); + + return ret ? ret : count; +} + +static SENSOR_DEVICE_ATTR_RW(pwm1_boost, pwm_boost, 0); +static SENSOR_DEVICE_ATTR_RW(pwm2_boost, pwm_boost, 1); +static SENSOR_DEVICE_ATTR_RW(pwm3_boost, pwm_boost, 2); +static SENSOR_DEVICE_ATTR_RW(pwm4_boost, pwm_boost, 3); + +static umode_t pwm_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 pwm_boost_group_visible(struct kobject *kobj) +{ + return true; +} + +DEFINE_SYSFS_GROUP_VISIBLE(pwm_boost); + +static struct attribute *fan_boost_attrs[] =3D { + &sensor_dev_attr_pwm1_boost.dev_attr.attr, + &sensor_dev_attr_pwm2_boost.dev_attr.attr, + &sensor_dev_attr_pwm3_boost.dev_attr.attr, + &sensor_dev_attr_pwm4_boost.dev_attr.attr, + NULL +}; + +static const struct attribute_group pwm_boost_group =3D { + .attrs =3D fan_boost_attrs, + .is_visible =3D SYSFS_GROUP_VISIBLE(pwm_boost), +}; + +static const struct attribute_group *awcc_hwmon_groups[] =3D { + &pwm_boost_group, + NULL +}; + static int awcc_hwmon_temps_init(struct wmi_device *wdev) { struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); @@ -948,12 +1026,51 @@ 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) + fan->suspend_cache =3D 0; + else + fan->suspend_cache =3D clamp_val(boost, 0, 255); + + awcc_thermal_control(priv->wdev, AWCC_OP_SET_FAN_BOOST, fan->id, 0); + } +} + +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; + + for (i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + if (fan->suspend_cache) + awcc_thermal_control(priv->wdev, AWCC_OP_SET_FAN_BOOST, + fan->id, fan->suspend_cache); + } +} + /* * Thermal Profile control * - Provides thermal profile control through the Platform Profile API @@ -1018,8 +1135,8 @@ static int awcc_platform_profile_set(struct device *d= ev, } } =20 - return awcc_thermal_control(priv->wdev, - priv->supported_profiles[profile]); + return awcc_thermal_control(priv->wdev, AWCC_OP_ACTIVATE_PROFILE, + priv->supported_profiles[profile], 0); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -1187,6 +1304,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; +} + +DEFINE_SIMPLE_DEV_PM_OPS(wmax_wmi_pm_ops, wmax_wmi_suspend, wmax_wmi_resum= e); + static const struct wmi_device_id alienware_wmax_device_id_table[] =3D { { WMAX_CONTROL_GUID, NULL }, { }, @@ -1197,6 +1332,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.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f170.google.com (mail-yb1-f170.google.com [209.85.219.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 1B8CF21D3FB; Tue, 25 Feb 2025 22:25:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522328; cv=none; b=n7Apfkm61UI0QTx3ndc6z7y4xkp6PxEm2YDCoEe0B+LTyJBsXstM5ZEXE7qGKrPk6n8QP5gLLDe5WayTImBNH46Kw1xxSBNrZdV0VHMyR48Y8BtnOeppoIs44ZoK8shraRAtGOq1PBdE+HPA94HI2rOTnYcyHYY5UFqYLcxUDuo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522328; c=relaxed/simple; bh=zxWzws/0dfdvCvtJm21MjieatCumRVusoWb38x7G/B4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YDcjexKNlN+loXPoWyIJ1LeHYlwKryOIPgibyhZcg/SSqyrmqmknkIb897LVenak4eHGQvzqIsk9i+Pt3+Kxj1Px9RI3JEQHUQUTHrjYzc+NDvoWSgcDqognzfpB3aCm4h0j4ywCO5/+3CKNPmJPeY/3dlw+iVzK5DEggmgl960= 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=SD+WU+fU; arc=none smtp.client-ip=209.85.219.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="SD+WU+fU" Received: by mail-yb1-f170.google.com with SMTP id 3f1490d57ef6-e4419a47887so4846653276.0; Tue, 25 Feb 2025 14:25:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522326; x=1741127126; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fFIwlEXi4ymhMThLkuI8bhGcLjvZhvmy0OkefTSAnKU=; b=SD+WU+fUdURPUCDesffM4RBGIwz2KVmiZq9Jj7BFmJIVSzXlXHX7DnIVwiqc5lqYjC wN8juX/Qk3GjsBlMLQvDQw971fP4YQJDFDXF5R7+GIS6h7EGSk+ZfDurOpzKyt8TGbzh Z9oCz6fOVXoT3ivQZFFbHSTognB3H3hNiPl57Fe+HQ1Cg3YerpVDLDTHyubwNM+AxUSc YJEIfe2nkPqtYjCy90GZiwyFjyyW3NyWRqs4UbObv6O6eQTu5kLSrA3mvsgoUTKr1mn5 LvsD8CX/hILa+wi9FGO/lASvRcQ+e3dMDKV2xKig/gU/zNVOX6WrOUzxP06+ldtIsXKA +GKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522326; x=1741127126; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fFIwlEXi4ymhMThLkuI8bhGcLjvZhvmy0OkefTSAnKU=; b=IIHG3h0wNAS5QcMkzw9FwMTII+8sHwXEgwMlirWFeBs/0x8qhP8YUCL5X6hHWER8YW nkbcSpXEpE0kedgs119y2ZDdjC2kvhv345N4rLrEdvsiX9y6U83IaQIycxj8dBZ6tmDh RRL/IRUo8dKx2sc5u38BfwVI9MRCziPkqY9DXgdz/q+D6ttsDXXAUc9LFKczpA/rBPEq BhEULasyu/0e/auqoh+uj+J1V3bnyqrB2YL+kFU+piouCjk5xOsnYcn/UItf8K+ef5PK q0ZTM5PJVKEqMAu4lSq75J8vSEo254cb96KFYDGrUNix5wBrcYJ64Fj5kD4TJvoK3YwS LU3w== X-Forwarded-Encrypted: i=1; AJvYcCUyiXWuRl0/0VAifDwq/G4sEMXIPhkRkfDwmAnsHWORjB0biCzjQMYBCREglNuDCgIFmsyX06BpRVbQnKM=@vger.kernel.org X-Gm-Message-State: AOJu0YxCkUgbL1BCxEYEv1eC9UBMJpnv2MnYTzrmbL5mvuz4NHFFdXya ko6Txz6pp8R6RMxSEs7LVd7lF6rmL0FENLpUhdHbJXwhDUX4gh42mFX1zelj X-Gm-Gg: ASbGncsCed60ThAavT5Z76umORLk3jn1pynnYuqcvgPmo47woPe0Rr9Y0b3E0G/CJ40 cWbNCKZVyKvUUb5QPf0UkVl/z1WhTm6U5zUOA+x5SXWOkZUF/9FJcheTZS6HCKq8wHZB1jC6k4J 8SFc4bugo5VLHqkBzVs442j5y8WNUbYF6t5hBWchLXavfWkJyDIv0YKKdpTmbxtXWKYfkJqH+IL grKfubmXZLeu5nWTj+SCJWSnvreH6ZuaPsibkMFYH/TcWbm5Ml7FupGFKk8PuR0cp8yAN0c8oNK fmrz1RIOCF658WNC6sJF70191adUE/YaRg== X-Google-Smtp-Source: AGHT+IHYj3MrD1NV+iRrXbiOmr0b8vvvCdJCAjzh5LSJk22MDKxV9+FejXuJ2mqpNPvVHPGNDaEdZg== X-Received: by 2002:a05:6902:1882:b0:e5b:42c7:8f28 with SMTP id 3f1490d57ef6-e608a80dc3dmr1116394276.35.1740522325968; Tue, 25 Feb 2025 14:25:25 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:25 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 09/10] platform/x86: alienware-wmi-wmax: Add a DebugFS interface Date: Tue, 25 Feb 2025 17:24:59 -0500 Message-ID: <20250225222500.23535-10-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a debugfs interface which exposes thermal private data. Signed-off-by: Kurt Borja --- .../platform/x86/dell/alienware-wmi-wmax.c | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 64818efc3a1a..14faa6ee3e73 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -18,6 +19,7 @@ #include #include #include +#include #include #include #include "alienware-wmi.h" @@ -1216,6 +1218,94 @@ 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); + struct awcc_fan_data *fan_data; + u8 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_data =3D priv->fan_data[i]; + + seq_printf(seq, "Fan %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", fan_data->id); + seq_printf(seq, " Related temperature sensors: "); + for_each_set_bit(bit, fan_data->related_temps, priv->temp_sensors_size) + seq_printf(seq, "0x%02x ", bit); + seq_puts(seq, "\n"); + } + + seq_puts(seq, "\n"); + + seq_printf(seq, "Temperature sensor IDs:\n"); + for_each_set_bit(bit, priv->temp_sensors, priv->temp_sensors_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; + + root =3D debugfs_create_dir("alienware-wmi", 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; @@ -1254,6 +1344,8 @@ static int alienware_awcc_setup(struct wmi_device *wd= ev) return ret; } =20 + awcc_debugfs_init(wdev); + return 0; } =20 --=20 2.48.1 From nobody Thu Dec 18 19:04:09 2025 Received: from mail-yb1-f180.google.com (mail-yb1-f180.google.com [209.85.219.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 B26D82206AF; Tue, 25 Feb 2025 22:25:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522330; cv=none; b=IwrG6RQBWo0e2C3iVxUdeTMX0H0Q5JVU1EqcnikN3RvxAYttYsvsz2x4evmWOGEZIdFkpFofk/5K46mN7yUEWxea7nY3x0WbOB22FvPmKEwgKJt0cXoNPwjFhbro7j3PrgvYoOHrlGG/4msIProZCPDlhncudz+gkyPsPmlBYLs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740522330; c=relaxed/simple; bh=TvzFl75+8BEMuef5Tw/MAjlxEEcCgYatcfbDHZ9OmEc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bquQaCWWi0dzVmvu0kKPjtssIoSAaR7qd8Q+TJybU0y7p6sj8WHfAt+NeWob7H5WRv5Azoxy9MXSbCHK0fUG5ltqUpBHZnom6qOUCSkX5moowYivgoQB9AgEzrbFiCeZhbLZtA6TYacA2gLH5/Y6eDu96xd7rtjzKLk2lUUt/0A= 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=Plv6BEU1; arc=none smtp.client-ip=209.85.219.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="Plv6BEU1" Received: by mail-yb1-f180.google.com with SMTP id 3f1490d57ef6-e5372a2fbddso4780187276.3; Tue, 25 Feb 2025 14:25:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740522327; x=1741127127; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=psyzF+U+3D2SNT0cjQITo0ybM831P3VGS52BhOq58Xg=; b=Plv6BEU1f/OsN88l3/olAsjIqXsqno+/MXFh0NmETgb2Bj5yyKVx09Dn2hppBOazpa OqrZQLeAzsv2ERBCiNfo2prM2qXgPGHcNwxVSGujruS36ZvKEcfYMDkElcM1VmGk2pEE muXAW5TonQ0uHx/YEvTpNLeDycGNkJ+7Yl40F1TW0h08ctGXikAKv6H2LtIxiPng99Wu 7E15TyQe3s5fKi0tpqL9V4jkxvnNRGR+88cHTaWuJnA8dY4Ibmci8v3OIBKNG0u2QYqt exA8GIj1PpJ/S6jzGakIFYaZ829TAPWyrEMJ61aDLdNTDOCs0+289tZ151vrR14K64bu a+nA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740522327; x=1741127127; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=psyzF+U+3D2SNT0cjQITo0ybM831P3VGS52BhOq58Xg=; b=ufB8MsTL4nxhyenZMzjkVnsuFmXMbFL3WRUCGApNgItU5pz+bF+VWHsiq16OFAcai0 PNZd7TQKumykqEysq5jZV5URGlVRnb3CI24tx+2eySSmoVQiQonV2zXth+dvqMd9AZ4V 5/vVbPS0cVDDtk4DR9RRQJttF4JmbRR6+ZrFA+9VZFx+jeYgpuqO+9xizfiunQ5x+xHo 3ut7cWtfR4vvb7iN2eSklwV65rwbzYoCea/ZtZmGh7yu1boE13MOVqAFNK5Y30LRTQI6 P47iWBRHLkpZc+qQGsY/HkJbKu5xqV8itDgRagqREuNHQzgb6/R3WsYjVnEiR7yo/LoD A2kQ== X-Forwarded-Encrypted: i=1; AJvYcCUH4tJeTvH0WwAD2J2y23+CW8deeAP7tenHkDPtwbXgKE+Oj9XGGdbsWlK0KWsp51KUytCJsen027ZggZM=@vger.kernel.org X-Gm-Message-State: AOJu0YxhBcZ410UH+q1Jft5Cu/tFpjB7cesqQ0qlWHHH5+mRmWBxqBGI 3p9kI2kT5hx14jSod4e0gdWfcMjTxTsoZrqhp3MlQw8+GUhEZO9EQmJwfYWF X-Gm-Gg: ASbGncvOHdXj6u5kJyYUqAinVNQd+iP+TSjMesZo1JkewSzwcjpLbDHQrOjySiO3xMT mqFZyzoeZ+mTV0jRqV8nFswtyL3dysSkD80RdQqJ9deyZg1wwjyTzSk91neLVqjsIfRajYA0CQM 1tCPThsRrcCmJNyQQ5YqR7lXVrZQGxnCWtkpY6OpL3XObmc6VW6Qc1wNXTPVX3UWaz12Ao6IdbD h9PNIOqfNTjaUOJE6QrXvUAF0pEc1lc33DvwlBat4lan1ru4QnQ3Q1NmtM5697YYD4ZOAE8wkoo nCWFF0c9SbFdHzFcipIOj8GQyKFZWfeAJQ== X-Google-Smtp-Source: AGHT+IE99nqVmY6BZoywuoBNDELfYbzBwSrDsUdOl2WhdsSV2M6xGo/mo0B7haSfnzXRGHog8dJvtg== X-Received: by 2002:a05:6902:2085:b0:e5d:d765:38ca with SMTP id 3f1490d57ef6-e607a56b546mr3692287276.41.1740522327433; Tue, 25 Feb 2025 14:25:27 -0800 (PST) Received: from localhost.localdomain ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e607b3ead63sm595466276.19.2025.02.25.14.25.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 25 Feb 2025 14:25:27 -0800 (PST) From: Kurt Borja To: =?UTF-8?q?Ilpo=20J=C3=A4rvinen?= , "Armin Wolf" Cc: platform-driver-x86@vger.kernel.org, "Hans de Goede" , Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Kurt Borja Subject: [PATCH v2 10/10] platform/x86: alienware-wmi: Improve and update documentation Date: Tue, 25 Feb 2025 17:25:00 -0500 Message-ID: <20250225222500.23535-11-kuurtb@gmail.com> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com> References: <20250225222500.23535-1-kuurtb@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" 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. Signed-off-by: Kurt Borja --- Documentation/wmi/devices/alienware-wmi.rst | 387 ++++++-------------- 1 file changed, 119 insertions(+), 268 deletions(-) diff --git a/Documentation/wmi/devices/alienware-wmi.rst b/Documentation/wm= i/devices/alienware-wmi.rst index ddc5e561960e..79238051b18b 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 Thermal_Information([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------------- - -:: - - 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 +WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------- =20 -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: ++--------------------+------------------------------------+---------------= -----+ +| 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 | ++--------------------+------------------------------------+---------------= -----+ =20 -* Fan IDs: from 2 up to 4 -* Sensor IDs: 2 -* Thermal profile codes: from 1 up to 7 +WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------------- =20 -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 -:: - - CUSTOM 0x00 - - 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. ++------------------------------+----------+------+ +| 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 | ++------------------------------+----------+------+ + +If a model supports the User Selectable Thermal Tables (USTT) profiles, it= will +not support the Legacy profiles and vice-versa. + +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.48.1