From nobody Thu Dec 18 00:16:00 2025 Received: from mail-ua1-f50.google.com (mail-ua1-f50.google.com [209.85.222.50]) (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 C6DB6205E15; Sat, 8 Mar 2025 20:23:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465430; cv=none; b=XD3VEEMTKh6XO0/0jJ+3UHDL9H79hv2j5ffZliOCnGkDbCy55WgJAFJiRvg26gQxeywLh31X2uLFAdwz+pXiRVfr8xIRGQn4KgJ0V9WRgI5sEk/Qe+sf78QNn/Xyu1FwH92BG7POOuMeocXBhU5y/d9gdtFZLTpEyMXXc6dKxe4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465430; c=relaxed/simple; bh=W3245L2StKIvemIozL1BX/WJzgLB3uNjsg77Bwf+aQc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=adhWKcaqMm1WfQtXlTY4gQ/CEmujkD3gWchjqZLkhC2xGcINqqmw59QjRgyMlPUPeBOjYIegtL7N3ZgSvPHhRkWLowHXR4WvEibzvAJPSDorFXeEaGQPghehwlCgIFzv56BFACJv5Rb4RN5QHWl3zaQNfPRrAPDHnAsjxV+Xyos= 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=LWB0by8t; arc=none smtp.client-ip=209.85.222.50 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="LWB0by8t" Received: by mail-ua1-f50.google.com with SMTP id a1e0cc1a2514c-86112ab1ad4so1162504241.1; Sat, 08 Mar 2025 12:23:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465427; x=1742070227; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=3Iwv9GoGUQi5x68b8OratsnyLt/cCmcP1mUBYKH22PI=; b=LWB0by8t3V50vIiWbj0ta21+8iS9/Ks3ENmLu30/Zw5I/A97MkLCzuXCYN/wSSF3b8 ZYGVv9H+q872A5KKES+RCD2w9ygRHh3wPhyv+JJStEJWz2R6NKcVlr8edyaEYE4yXr5z RsNlpHjuBoFdkoX0pK4c8GyJyTLicC2FVogdUunHu6cpJvCznoXvJu4adKjAo5HlTgCb mLp2VElZaa+DHmBr2WLX4F9Qd5OnVp9IN+JmKYJKaOCklgblSoTPyUuRDzPHdInhrrxg KXSdihkgl9VqkkSSnvlAn0AM6SoOJsb7f8euRJMD4Q7NJo4LgsZ4JYe68RsG8rL0LYf0 tiKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465427; x=1742070227; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=3Iwv9GoGUQi5x68b8OratsnyLt/cCmcP1mUBYKH22PI=; b=h8NXM2PQ1XpG7+fWC5ELPk1nkuqqhiBAo8PJvgdaxAOuYDfREQj7HuB7sraI1Lrh8q bizVhu4y0Y4rxAkB4lbZZs83easgQRAgO5Zl9f8t2WWnjubkRiJ7sYYzM2zxbSMbb9vm EVvdUGLNeKmTovzC0M5exAMwheAnLELNtWZCj+/clcMYr9FQMw3r8Pj54EDSsPaM51Qt wl72Fkg2AkeXI65FLH4/bp7F6Vo1v70dH8j8mKVNZqrIqwk+lMLOQVhtWYjp76YWzCLW Wj3IQV45XiSvAFA8p9Sgv8X1NVVR0U/u4n4P7ZEzrGC4flr0IHdf2IsxksviuWSn14PM DTBw== X-Forwarded-Encrypted: i=1; AJvYcCUUCs9Ej2Ht379hLLK8ONFwFqJQsIU6hs3xHjpRGsTP3vUFoARkTAeD9A527JQWtXaqm2Zs/WQg2SsLKcboP6LJzmuNcw==@vger.kernel.org, AJvYcCWuKJzQjq3CWthkx1R9xWa8wx7BtRsZIDnLWc7b93iLOv8kf2PotypJsBmMhOveDbjSNg3DJnt9ojcMw6Q=@vger.kernel.org X-Gm-Message-State: AOJu0YxkyA6B7dBi72CuNFzOy9jHvr5Ktn4VPqgj552ZhRQ8VqYRrU7M XJ5pLz6xh92ilSSQI1NSQelqp6KPGDuEbDXIjC25jxtNeH9frwA+dr08uA5Z X-Gm-Gg: ASbGncsv/YoG9Z3SFjxhqoEEB8HzrU6bT4Y4D3rPUaoQEx9OFGj1Cf2xlR7FJGctEXP PAyO8NrwLq90rVQTjdRoEzGLtZf1/yehHKk7/f3ARvUHB4GLHfanDNm0+cj5a1/2nIgCO8cguuK Lh+oTJxv/r8fdxnGDYBveuBWLLRHT5mZZW7cJ5gvNBUNudigWRPKlN1Km6tGMU1DTU2AZyftFEU LFPFsbGjaFn3MXKhsbzjRPfKVythTZ0BPX2Tj/xlN5FD4Fgn209bg8hEFFd7LJ16xSrTRsA05Kk vbLhmFM8ar61eJO/TVkD2o9sJLOziWhoVRh3XJS2jwfHMw== X-Google-Smtp-Source: AGHT+IHJxsI/niLbjOCiKWwpcBkidzEzgKD6J0uoF+fY4pzFKKbg80HTYV0aJSHbJzsyghZUcU4lLg== X-Received: by 2002:a05:6102:1606:b0:4c1:86bc:f959 with SMTP id ada2fe7eead31-4c30a5a74e9mr5559231137.8.1741465427164; Sat, 08 Mar 2025 12:23:47 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:46 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:13 -0500 Subject: [PATCH v4 01/12] platform/x86: alienware-wmi-wmax: Rename thermal related symbols Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-1-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 The "thermal" features of the WMAX WMI device are only present on the host device if the ACPI _UID is "AWCC". Replace WMAX prefixes with "AWCC" to reflect this relationship. Thermal profiles with WMAX_PROFILE_BASIC prefix are also renamed to WMAX_PROFILE_LEGACY because they are only supported in older versions of this WMI device. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 173 +++++++++++++--------= ---- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 3d3014b5adf046c94c1ebf39a0e28a92622b40d6..ed70e12d73d7fe5d89f3364c536= 7820bf47e3c1e 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -24,16 +24,17 @@ #define WMAX_METHOD_DEEP_SLEEP_STATUS 0x0C #define WMAX_METHOD_BRIGHTNESS 0x3 #define WMAX_METHOD_ZONE_CONTROL 0x4 -#define WMAX_METHOD_THERMAL_INFORMATION 0x14 -#define WMAX_METHOD_THERMAL_CONTROL 0x15 -#define WMAX_METHOD_GAME_SHIFT_STATUS 0x25 =20 -#define WMAX_THERMAL_MODE_GMODE 0xAB +#define AWCC_METHOD_THERMAL_INFORMATION 0x14 +#define AWCC_METHOD_THERMAL_CONTROL 0x15 +#define AWCC_METHOD_GAME_SHIFT_STATUS 0x25 =20 -#define WMAX_FAILURE_CODE 0xFFFFFFFF -#define WMAX_THERMAL_TABLE_MASK GENMASK(7, 4) -#define WMAX_THERMAL_MODE_MASK GENMASK(3, 0) -#define WMAX_SENSOR_ID_MASK BIT(8) +#define AWCC_THERMAL_MODE_GMODE 0xAB + +#define AWCC_FAILURE_CODE 0xFFFFFFFF +#define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4) +#define AWCC_THERMAL_MODE_MASK GENMASK(3, 0) +#define AWCC_SENSOR_ID_MASK BIT(8) =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -151,38 +152,38 @@ static const struct dmi_system_id awcc_dmi_table[] __= initconst =3D { }, }; =20 -enum WMAX_THERMAL_INFORMATION_OPERATIONS { - WMAX_OPERATION_SYS_DESCRIPTION =3D 0x02, - WMAX_OPERATION_LIST_IDS =3D 0x03, - WMAX_OPERATION_CURRENT_PROFILE =3D 0x0B, +enum AWCC_THERMAL_INFORMATION_OPERATIONS { + AWCC_OP_GET_SYSTEM_DESCRIPTION =3D 0x02, + AWCC_OP_GET_RESOURCE_ID =3D 0x03, + AWCC_OP_GET_CURRENT_PROFILE =3D 0x0B, }; =20 -enum WMAX_THERMAL_CONTROL_OPERATIONS { - WMAX_OPERATION_ACTIVATE_PROFILE =3D 0x01, +enum AWCC_THERMAL_CONTROL_OPERATIONS { + AWCC_OP_ACTIVATE_PROFILE =3D 0x01, }; =20 -enum WMAX_GAME_SHIFT_STATUS_OPERATIONS { - WMAX_OPERATION_TOGGLE_GAME_SHIFT =3D 0x01, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS =3D 0x02, +enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { + AWCC_OP_TOGGLE_GAME_SHIFT =3D 0x01, + AWCC_OP_GET_GAME_SHIFT_STATUS =3D 0x02, }; =20 -enum WMAX_THERMAL_TABLES { - WMAX_THERMAL_TABLE_BASIC =3D 0x90, - WMAX_THERMAL_TABLE_USTT =3D 0xA0, +enum AWCC_THERMAL_TABLES { + AWCC_THERMAL_TABLE_LEGACY =3D 0x90, + AWCC_THERMAL_TABLE_USTT =3D 0xA0, }; =20 -enum wmax_thermal_mode { - THERMAL_MODE_USTT_BALANCED, - THERMAL_MODE_USTT_BALANCED_PERFORMANCE, - THERMAL_MODE_USTT_COOL, - THERMAL_MODE_USTT_QUIET, - THERMAL_MODE_USTT_PERFORMANCE, - THERMAL_MODE_USTT_LOW_POWER, - THERMAL_MODE_BASIC_QUIET, - THERMAL_MODE_BASIC_BALANCED, - THERMAL_MODE_BASIC_BALANCED_PERFORMANCE, - THERMAL_MODE_BASIC_PERFORMANCE, - THERMAL_MODE_LAST, +enum awcc_thermal_profile { + AWCC_PROFILE_USTT_BALANCED, + AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, + AWCC_PROFILE_USTT_COOL, + AWCC_PROFILE_USTT_QUIET, + AWCC_PROFILE_USTT_PERFORMANCE, + AWCC_PROFILE_USTT_LOW_POWER, + AWCC_PROFILE_LEGACY_QUIET, + AWCC_PROFILE_LEGACY_BALANCED, + AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE, + AWCC_PROFILE_LEGACY_PERFORMANCE, + AWCC_PROFILE_LAST, }; =20 struct wmax_led_args { @@ -210,20 +211,20 @@ struct wmax_u32_args { struct awcc_priv { struct wmi_device *wdev; struct device *ppdev; - enum wmax_thermal_mode supported_thermal_profiles[PLATFORM_PROFILE_LAST]; + enum awcc_thermal_profile supported_thermal_profiles[PLATFORM_PROFILE_LAS= T]; }; =20 -static const enum platform_profile_option wmax_mode_to_platform_profile[TH= ERMAL_MODE_LAST] =3D { - [THERMAL_MODE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, - [THERMAL_MODE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, - [THERMAL_MODE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, - [THERMAL_MODE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, - [THERMAL_MODE_BASIC_QUIET] =3D PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_BASIC_BALANCED] =3D PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_P= ERFORMANCE, - [THERMAL_MODE_BASIC_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, +static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { + [AWCC_PROFILE_USTT_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_USTT_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_PE= RFORMANCE, + [AWCC_PROFILE_USTT_COOL] =3D PLATFORM_PROFILE_COOL, + [AWCC_PROFILE_USTT_QUIET] =3D PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_USTT_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, + [AWCC_PROFILE_USTT_LOW_POWER] =3D PLATFORM_PROFILE_LOW_POWER, + [AWCC_PROFILE_LEGACY_QUIET] =3D PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_LEGACY_BALANCED] =3D PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE] =3D PLATFORM_PROFILE_BALANCED_= PERFORMANCE, + [AWCC_PROFILE_LEGACY_PERFORMANCE] =3D PLATFORM_PROFILE_PERFORMANCE, }; =20 static struct awcc_quirks *awcc; @@ -444,26 +445,26 @@ const struct attribute_group wmax_deepsleep_attribute= _group =3D { * Thermal Profile control * - Provides thermal profile control through the Platform Profile API */ -static bool is_wmax_thermal_code(u32 code) +static bool is_awcc_thermal_mode(u32 code) { - if (code & WMAX_SENSOR_ID_MASK) + if (code & AWCC_SENSOR_ID_MASK) return false; =20 - if ((code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_LAST) + if ((code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LAST) return false; =20 - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_BASIC && - (code & WMAX_THERMAL_MODE_MASK) >=3D THERMAL_MODE_BASIC_QUIET) + if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_LEGACY && + (code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LEGACY_QUIET) return true; =20 - if ((code & WMAX_THERMAL_TABLE_MASK) =3D=3D WMAX_THERMAL_TABLE_USTT && - (code & WMAX_THERMAL_MODE_MASK) <=3D THERMAL_MODE_USTT_LOW_POWER) + if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_USTT && + (code & AWCC_THERMAL_MODE_MASK) <=3D AWCC_PROFILE_USTT_LOW_POWER) return true; =20 return false; } =20 -static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, +static int awcc_thermal_information(struct wmi_device *wdev, u8 operation, u8 arg, u32 *out_data) { struct wmax_u32_args in_args =3D { @@ -474,21 +475,21 @@ static int wmax_thermal_information(struct wmi_device= *wdev, u8 operation, }; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; =20 - if (*out_data =3D=3D WMAX_FAILURE_CODE) + if (*out_data =3D=3D AWCC_FAILURE_CODE) return -EBADRQC; =20 return 0; } =20 -static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) +static int awcc_thermal_control(struct wmi_device *wdev, u8 profile) { struct wmax_u32_args in_args =3D { - .operation =3D WMAX_OPERATION_ACTIVATE_PROFILE, + .operation =3D AWCC_OP_ACTIVATE_PROFILE, .arg1 =3D profile, .arg2 =3D 0, .arg3 =3D 0, @@ -496,18 +497,18 @@ static int wmax_thermal_control(struct wmi_device *wd= ev, u8 profile) u32 out_data; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &in_args, sizeof(in_args), &out_data); if (ret) return ret; =20 - if (out_data =3D=3D WMAX_FAILURE_CODE) + if (out_data =3D=3D AWCC_FAILURE_CODE) return -EBADRQC; =20 return 0; } =20 -static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, +static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, u32 *out_data) { struct wmax_u32_args in_args =3D { @@ -518,46 +519,46 @@ static int wmax_game_shift_status(struct wmi_device *= wdev, u8 operation, }; int ret; =20 - ret =3D alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, + ret =3D alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; =20 - if (*out_data =3D=3D WMAX_FAILURE_CODE) + if (*out_data =3D=3D AWCC_FAILURE_CODE) return -EOPNOTSUPP; =20 return 0; } =20 -static int thermal_profile_get(struct device *dev, - enum platform_profile_option *profile) +static int awcc_platform_profile_get(struct device *dev, + enum platform_profile_option *profile) { struct awcc_priv *priv =3D dev_get_drvdata(dev); u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFI= LE, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, 0, &out_data); =20 if (ret < 0) return ret; =20 - if (out_data =3D=3D WMAX_THERMAL_MODE_GMODE) { + if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { *profile =3D PLATFORM_PROFILE_PERFORMANCE; return 0; } =20 - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) return -ENODATA; =20 - out_data &=3D WMAX_THERMAL_MODE_MASK; - *profile =3D wmax_mode_to_platform_profile[out_data]; + out_data &=3D AWCC_THERMAL_MODE_MASK; + *profile =3D awcc_mode_to_platform_profile[out_data]; =20 return 0; } =20 -static int thermal_profile_set(struct device *dev, - enum platform_profile_option profile) +static int awcc_platform_profile_set(struct device *dev, + enum platform_profile_option profile) { struct awcc_priv *priv =3D dev_get_drvdata(dev); =20 @@ -565,8 +566,8 @@ static int thermal_profile_set(struct device *dev, u32 gmode_status; int ret; =20 - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + ret =3D awcc_game_shift_status(priv->wdev, + AWCC_OP_GET_GAME_SHIFT_STATUS, &gmode_status); =20 if (ret < 0) @@ -574,8 +575,8 @@ static int thermal_profile_set(struct device *dev, =20 if ((profile =3D=3D PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || (profile !=3D PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { - ret =3D wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_TOGGLE_GAME_SHIFT, + ret =3D awcc_game_shift_status(priv->wdev, + AWCC_OP_TOGGLE_GAME_SHIFT, &gmode_status); =20 if (ret < 0) @@ -583,21 +584,21 @@ static int thermal_profile_set(struct device *dev, } } =20 - return wmax_thermal_control(priv->wdev, + return awcc_thermal_control(priv->wdev, priv->supported_thermal_profiles[profile]); } =20 -static int thermal_profile_probe(void *drvdata, unsigned long *choices) +static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) { enum platform_profile_option profile; struct awcc_priv *priv =3D drvdata; - enum wmax_thermal_mode mode; + enum awcc_thermal_profile mode; u8 sys_desc[4]; u32 first_mode; u32 out_data; int ret; =20 - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_SYS_DESCRIPTI= ON, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTI= ON, 0, (u32 *) &sys_desc); if (ret < 0) return ret; @@ -605,7 +606,7 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) first_mode =3D sys_desc[0] + sys_desc[1]; =20 for (u32 i =3D 0; i < sys_desc[3]; i++) { - ret =3D wmax_thermal_information(priv->wdev, WMAX_OPERATION_LIST_IDS, + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID, i + first_mode, &out_data); =20 if (ret =3D=3D -EIO) @@ -614,11 +615,11 @@ static int thermal_profile_probe(void *drvdata, unsig= ned long *choices) if (ret =3D=3D -EBADRQC) break; =20 - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) continue; =20 - mode =3D out_data & WMAX_THERMAL_MODE_MASK; - profile =3D wmax_mode_to_platform_profile[mode]; + mode =3D out_data & AWCC_THERMAL_MODE_MASK; + profile =3D awcc_mode_to_platform_profile[mode]; priv->supported_thermal_profiles[profile] =3D out_data; =20 set_bit(profile, choices); @@ -629,7 +630,7 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) =20 if (awcc->gmode) { priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] =3D - WMAX_THERMAL_MODE_GMODE; + AWCC_THERMAL_MODE_GMODE; =20 set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } @@ -638,9 +639,9 @@ static int thermal_profile_probe(void *drvdata, unsigne= d long *choices) } =20 static const struct platform_profile_ops awcc_platform_profile_ops =3D { - .probe =3D thermal_profile_probe, - .profile_get =3D thermal_profile_get, - .profile_set =3D thermal_profile_set, + .probe =3D awcc_platform_profile_probe, + .profile_get =3D awcc_platform_profile_get, + .profile_set =3D awcc_platform_profile_set, }; =20 static int awcc_platform_profile_init(struct wmi_device *wdev) --=20 2.48.1 From nobody Thu Dec 18 00:16:00 2025 Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D66320C00B; Sat, 8 Mar 2025 20:23:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465432; cv=none; b=LelQAN+L7ebchRQHDYCr6QQAiWm4w2YYBKdD49gA1pJTNqKx9QqA5K+u/etS1yiBD8PEdFYLSPtXDWMPTBegy5HLd8EgP11ZxvTS7IrbsAgmPmFKzipFYvbsb/vFKXebATDXNZ8KUkIscKfs5lgpHUNS375L4VHIczcjVEvD6wQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465432; c=relaxed/simple; bh=b6I4LW2lXRr4zSKyCgVo5hQkgsNPWVdZQx2aOlTduKg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YH7E41+HtLdYa50hdYFkuuJ8avuItQI0wx6q4ZsQOtir0a6Pp+A4HNZx2NSAX2mvZmGBY+Cojp7cJoZW3xQeamOaoxsA2loSSimx3oZtv3X6EfKWx0JXXju4H5rof7Onhe1XCpo5FswqS1JBqzOK1nD0oT1eqjICFczvjP2YTKE= 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=HN8329+T; arc=none smtp.client-ip=209.85.221.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HN8329+T" Received: by mail-vk1-f172.google.com with SMTP id 71dfb90a1353d-523efb24fb9so535523e0c.3; Sat, 08 Mar 2025 12:23:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465429; x=1742070229; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ki8JJlqvtQ1DWozBXa70s7Vleuhvzvt2Tgc/aHkAO4s=; b=HN8329+T0Doec6DOKf38RHa08eymk6K7h+qm4zm4y25EYEnnqCsvKIcxycs6VPEmSX V86E+rcq1jeEy3cVVsMA3ShxFTj8mWvhBAU273lV81INPWmfvX3o5JrgSaQGueKzJhcF 4YJbyREHNj/lbW5EIy0tqQ/Jx2k3QmLOuEkoo1OfuGoCz5UVa7z9mbaxC+9i4kekC9bb 9KKkwmYNuedipTAsCF6+tWbTKrNrzvdGn3fCeDwCCozrc2nMz3Mnuiq9kD597cX781jE PPLnNxWbsMyE8LHTjyr67PmnoRQWtN46b/FMUod+H5DMEfZ2cbtwRA44y2NFbRtgLtog Uxfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465429; x=1742070229; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ki8JJlqvtQ1DWozBXa70s7Vleuhvzvt2Tgc/aHkAO4s=; b=m9gAjDm1ykINXhdwZ3t/vVbt9g2f6D4lrCCUN1wtBTe0hUIlbmsy1rBu8WQG5Ls8He D7V4DzYuvr4F15YHSvSHmulypcdRpfp9Gx6VIM1R0OQ9GsETcS7YnzFFnAgLz9Q7M/Q4 jwhfzX/04qKM+B+lPELAso0g5WPESy33d5C/tkeyJHCUHOru9vYpD3fipbMPEt9KOcmO 6zMR0dUC9WRv4UxG1OrnpL7Q/C0O0wzH7PRSuFvanpKaZkFTku0dszDuF9uJD2TOTp+2 KYFugavC6YiJkxoqwheWHDz97lgzoivCiSKU51TvXEr6naK7/MW2o2SxeGWn2Dsmjcni jDYw== X-Forwarded-Encrypted: i=1; AJvYcCV5zfP6IBmLBluEltTuokclZr05J/SzUdj2xRz50uXpALSLhaOy1TDI2gTdksREjXUf6QqaLUCpeJ2GCb0=@vger.kernel.org, AJvYcCW0f3AM7Lgj348IRcf+3W8PRTd/ZWXDY1s6BVdpECo8+2r2IpFAtcas9aJ9SNTdlWAdyD4tG0/or5lHBF6yu8No9lGNyA==@vger.kernel.org X-Gm-Message-State: AOJu0YzCr2PAqCCw/hCf/JR3sUQRdw3Y3lPNQrKOtYIL2i5E0494/Gbe 7l6Ndzsy3OXER5lsU8pDBJzCj+FmIGK4RvwBWihcWxHNVxbSB1Qj2FHa5Ryn X-Gm-Gg: ASbGnctHN7imgO9a6hXd1/0FerG4MnEVHrLuTQ0MOHXcVIKh0849TAg1JA0DSP9W7+q nmUD/qSB8Bm6reKbERE55X+pIMsNz/Ocal964yQEmCd4Be2s0rjmy/ZIDKY9XG2xPIQyTayt0ZN gh9U6LJmC3eDcV5vf3nJTKPFqFdGoB8LJCCBa6azoGOfF2CoW8tOvIouOMIpKMpUMUuidQxvOED tNmRNZWO8m/biXdf2ossTpoA9xvkR0Z11NFQ1eiOhyaR9pq9cQCQzhFhk7qJCa/+KDUujgahlYn g9Lvf5hilzB8xN/U1prekDyy++qKvYfoLRNVZ3EfEQupx4SIeLFE0lOi X-Google-Smtp-Source: AGHT+IHU2ZK0HS4qNxZqWbt7VYhGplFMMoA+CI1Bm5NG9H8wfq6wPD7P2v1ssp1vrM2u1L2cheF8FA== X-Received: by 2002:a05:6102:2b96:b0:4bb:5d61:127e with SMTP id ada2fe7eead31-4c30a72e288mr5487214137.25.1741465428993; Sat, 08 Mar 2025 12:23:48 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:48 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:14 -0500 Subject: [PATCH v4 02/12] platform/x86: alienware-wmi-wmax: Refactor is_awcc_thermal_mode() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-2-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 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(). Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 33 +++++++++++++---------= ---- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index ed70e12d73d7fe5d89f3364c5367820bf47e3c1e..80aefba5b22d6b4ac18aeb2ca35= 6f8c911150abd 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -34,7 +34,8 @@ #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) +/* Some IDs have a BIT(8) flag that we ignore */ +#define AWCC_RESOURCE_ID_MASK GENMASK(7, 0) =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -168,8 +169,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 +446,18 @@ const struct attribute_group wmax_deepsleep_attribute= _group =3D { * Thermal Profile control * - Provides thermal profile control through the Platform Profile API */ -static bool is_awcc_thermal_mode(u32 code) +static bool is_awcc_thermal_profile_id(u8 code) { - if (code & AWCC_SENSOR_ID_MASK) + u8 table =3D FIELD_GET(AWCC_THERMAL_TABLE_MASK, code); + u8 mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, code); + + if (mode >=3D AWCC_PROFILE_LAST) return false; =20 - if ((code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LAST) - return false; - - if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_LEGACY && - (code & AWCC_THERMAL_MODE_MASK) >=3D AWCC_PROFILE_LEGACY_QUIET) + if (table =3D=3D AWCC_THERMAL_TABLE_LEGACY && mode >=3D AWCC_PROFILE_LEGA= CY_QUIET) return true; =20 - if ((code & AWCC_THERMAL_TABLE_MASK) =3D=3D AWCC_THERMAL_TABLE_USTT && - (code & AWCC_THERMAL_MODE_MASK) <=3D AWCC_PROFILE_USTT_LOW_POWER) + if (table =3D=3D AWCC_THERMAL_TABLE_USTT && mode <=3D AWCC_PROFILE_USTT_L= OW_POWER) return true; =20 return false; @@ -548,7 +547,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 +596,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 +615,13 @@ static int awcc_platform_profile_probe(void *drvdata,= unsigned long *choices) if (ret =3D=3D -EBADRQC) break; =20 - if (!is_awcc_thermal_mode(out_data)) + id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); + if (!is_awcc_thermal_profile_id(id)) continue; =20 - mode =3D out_data & AWCC_THERMAL_MODE_MASK; + mode =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile =3D awcc_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] =3D out_data; + priv->supported_thermal_profiles[profile] =3D id; =20 set_bit(profile, choices); } --=20 2.48.1 From nobody Thu Dec 18 00:16:00 2025 Received: from mail-vk1-f182.google.com (mail-vk1-f182.google.com [209.85.221.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97CD220F06D; Sat, 8 Mar 2025 20:23:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465434; cv=none; b=HE8AT7+m8RjcAlQyu3s9Wcy2WOKJoFEPOKU5A+T/IbjzJgAzAou7PUzoP4JTHpmujN5iA2JkmmJ14cMVxsdqFuP6gEGuHULaaqX5vbwM8LP5u/IxO7A4/LP9gWhjK2Uegd8YsU3vN73+95buW4q3Ob9gcPgQuuVimSXxxjLvRIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465434; c=relaxed/simple; bh=kh4XOux5fLnMpuGqL85jz0yoPfb6XXn59lqRIp0pM/c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BhuG8Kr3BJ5Rh/gtN7zkwOkcXherS0XeQxR96Y22SNzLKys5hZFAlzxNzRwvUGAnkvCSNqtKj4NK4B4DKTndY2aJ4VTmgRIM78ZW7JTZPiAplcFZypfUkGH4lQA73YBxd+Jrx9fp/ILuwifkdeV4Rv+iXfPm5uWCA3K/xDjzbrY= 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=N33q/1EO; arc=none smtp.client-ip=209.85.221.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="N33q/1EO" Received: by mail-vk1-f182.google.com with SMTP id 71dfb90a1353d-523fa0df55dso424378e0c.1; Sat, 08 Mar 2025 12:23:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465431; x=1742070231; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xOGDcRRC34nNPALoyT1dHPnr4hN67cRU6zIR5rs0fSA=; b=N33q/1EOjxh4SE44vy3h8gwzVvGbrKK8CmnQnPG5EmIsGfZPWptH8ARgvVdTZh+aXL AhlSP85fLO+iMDK3hbjnQ6j7z8VsnAHKYU8zHZbcQrAVdsq2B0U4glthpswNEErmYjaR OatyBdawJ7sek5xtFS2RxPDLgGr4rLqvmqpJHPfqKtVlSVtYk4TvsSpBr1ddlF6EK1Dm xKbgimTc+rtBfiLiEX+vUCG3KmZMqNCGjM9Iay9J/+QShJH8L3PBLP5msAJW01aOz3ni AFObJCSJKIN4uJZpynghPw85bEJmO2WYyDEvfLSeErDAclYojmux7xFSv2j+JJw3Lfp7 cNGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465431; x=1742070231; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xOGDcRRC34nNPALoyT1dHPnr4hN67cRU6zIR5rs0fSA=; b=shTyyUplXC+dcxvBhKaCxp3m8v6QqcesAJvX6AgGTJ4xG0fS2VRUm/Wzkj+drrL++o My98g15PYaPTXMRhnhNX/V7SpPhG9rGK34lxrZkiAhnuEOf3O7gIWYjLDgYbNpJGGYwc /4DZC946SR+vONk4mWz3P9RqQCVob2PU0e23OBeOU5yUZXY/LjS8QomOuy2yHqk8gZ91 lSOI/hSvWyf/NxLZE4q/i0tBtXu82kORGsOC2HXY+n8eywovUj9TX1sS9JjIAZzfjhmL QliV7JB9QHEYxj9Egry9SiliJ1ceErPcnz0KkqdgexrQFswvP1zAwO5pTLY0Gt7cpEAB bbPQ== X-Forwarded-Encrypted: i=1; AJvYcCUhrZicqntsJNIXXIPOGMZIbNeu4o/PKCcuHdCJrMyfLcOvQjOQS/7jIpHcsRXqmAiipA9XKd5hfR9OSp4=@vger.kernel.org, AJvYcCWoHxqD3olMecYNgybGV7FgBBq5Lc2jFwhnr7veB878LfsV4Lcj6qNo2EkJhyxWeCy4bqbRmeOz7AYjfJ3cCdQYWJsNSw==@vger.kernel.org X-Gm-Message-State: AOJu0YxtAsbjFiYaPhUp0ovMVEYfAC+BgeWY/5K1jIG2YM3N7q/pP3jV ZF4+8L8FBiqWVdJfTxXp03wD4wzGkXcjhKtG7+AfqaoCDHFa9p62g1Kb/M9o X-Gm-Gg: ASbGncsH70PYr37OsK8YBHYWmz7T6om/VUKBS2x3ttdB3r4lNbnSgFR1ywg7Ea+WKU3 AxDe5C0HU+VfZfvKUhibvgC+GyEHllsufqBVNI6zLbq9CIse+FUebEOYG0Knkm7bnBQJMlS+2wz IJcFbXy9PKJHgaZ77wz4LQSrBuhJMFW1Qgx3FlwO/gER0y3qXfKr8HPhKJa6gS7UNrwW8AsWDiI m+P+9KGjl0SAq6o6sopGTOEirPyN+oF9ZNDM/JjXO+LFx5Teg/K0B5wklvokklsiyCU7LTaUY3T Elo90O/bWVuJfYjbxKDGdaNd1aodaoVBUWwyBCYcaurpYg== X-Google-Smtp-Source: AGHT+IFudrsBaeHYLLtm3SA3s0OnGsIm5/X30EUEXC/3VBDmY8bx9/EPrATd9/ca6tsOj3+EeJg9sg== X-Received: by 2002:a67:fa49:0:b0:4c2:ff6c:6043 with SMTP id ada2fe7eead31-4c31b2cfbcamr2267685137.0.1741465430935; Sat, 08 Mar 2025 12:23:50 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:50 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:15 -0500 Subject: [PATCH v4 03/12] platform/x86: alienware-wmi-wmax: Improve internal AWCC API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-3-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Inline all AWCC WMI helper methods and directly return the newly introduced __awcc_wmi_command() helper to simplify implementation. Drop awcc_thermal_control() in favor of awcc_op_activate_profile(). Add awcc_op_get_resource_id(), awcc_op_get_current_profile() and a new failure code. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 150 +++++++++++++++------= ---- 1 file changed, 91 insertions(+), 59 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 80aefba5b22d6b4ac18aeb2ca356f8c911150abd..b9dbfdc8096c571722b3c7ac3e7= 3989e235e2eb9 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) /* Some IDs have a BIT(8) flag that we ignore */ @@ -443,8 +444,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) { @@ -463,72 +463,107 @@ 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 { + int ret; + + ret =3D alienware_wmi_command(wdev, method_id, args, sizeof(*args), out); + if (ret) + return ret; + + if (*out =3D=3D AWCC_FAILURE_CODE || *out =3D=3D AWCC_FAILURE_CODE_2) + return -EBADRQC; + + return 0; +} + +static inline int awcc_thermal_information(struct wmi_device *wdev, u8 ope= ration, + u8 arg, u32 *out) +{ + struct wmax_u32_args 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) - return ret; - - if (*out_data =3D=3D AWCC_FAILURE_CODE) - return -EBADRQC; - - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =20 -static int awcc_thermal_control(struct wmi_device *wdev, u8 profile) +static inline int awcc_game_shift_status(struct wmi_device *wdev, u8 opera= tion, + u32 *out) { - struct wmax_u32_args in_args =3D { - .operation =3D AWCC_OP_ACTIVATE_PROFILE, - .arg1 =3D profile, - .arg2 =3D 0, - .arg3 =3D 0, - }; - u32 out_data; - int ret; - - ret =3D alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, - &in_args, sizeof(in_args), &out_data); - if (ret) - return ret; - - if (out_data =3D=3D AWCC_FAILURE_CODE) - return -EBADRQC; - - return 0; -} - -static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, - u32 *out_data) -{ - 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; - - if (*out_data =3D=3D AWCC_FAILURE_CODE) - return -EOPNOTSUPP; - - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &args, out= ); } =20 +/** + * 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, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} + +static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32= *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_CURRENT_PROFILE, + .arg1 =3D 0, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} + +static inline int awcc_op_activate_profile(struct wmi_device *wdev, u8 pro= file) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_ACTIVATE_PROFILE, + .arg1 =3D profile, + .arg2 =3D 0, + .arg3 =3D 0, + }; + u32 out; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); +} + +/* + * Thermal Profile control + * - Provides thermal profile control through the Platform Profile API + */ static int awcc_platform_profile_get(struct device *dev, enum platform_profile_option *profile) { @@ -536,10 +571,8 @@ static int awcc_platform_profile_get(struct device *de= v, u32 out_data; int ret; =20 - ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, - 0, &out_data); - - if (ret < 0) + ret =3D awcc_op_get_current_profile(priv->wdev, &out_data); + if (ret) return ret; =20 if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { @@ -550,7 +583,7 @@ static int awcc_platform_profile_get(struct device *dev, if (!is_awcc_thermal_profile_id(out_data)) return -ENODATA; =20 - out_data &=3D AWCC_THERMAL_MODE_MASK; + out_data =3D FIELD_GET(AWCC_THERMAL_MODE_MASK, out_data); *profile =3D awcc_mode_to_platform_profile[out_data]; =20 return 0; @@ -583,8 +616,8 @@ static int awcc_platform_profile_set(struct device *dev, } } =20 - return awcc_thermal_control(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, + priv->supported_thermal_profiles[profile]); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -606,8 +639,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 00:16:00 2025 Received: from mail-ua1-f43.google.com (mail-ua1-f43.google.com [209.85.222.43]) (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 9EBF2212B3E; Sat, 8 Mar 2025 20:23:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465436; cv=none; b=PeTDB2/YqxDJbf429iPr6zonT805YIcG29KorJkOw1NRetXBT6odnQPz36VBhCUGemxqLo7f6/yhthBvZ55c3ys3z1VAJwIyJiYJs8Sxxa8Tyc+9Eu4ljxC3dY/UbXQCBRS1jLgvsi+GpF1EQOysKDeKw7cWu8ShciCoubYq0M4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465436; c=relaxed/simple; bh=0/cs7k9NEYKOzfKSWrMqL/b8KZs7Y/LPsKkPsOmnrDQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fbwCCczIpw/kxNsgdSTj2glzmGVkx/85w/+4JXOini21A1Lf2Pb5bwl6+aYHDKuwRAjo3b4jlmz4fi09lN/V1Oircw5ImyagTCpViXJRuj4xcCdOqoI5ohy1bl4BFLXXAN+tmHliVCexc/ICX06Yi7pODOqEuNfdttuWMKZqPdg= 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=AlMq3bRY; arc=none smtp.client-ip=209.85.222.43 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="AlMq3bRY" Received: by mail-ua1-f43.google.com with SMTP id a1e0cc1a2514c-86718c2c3b9so1119568241.2; Sat, 08 Mar 2025 12:23:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465433; x=1742070233; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=tfPNOoHpP1FsVmbeiwOjL1eZebItbrovfjcUpFcyo94=; b=AlMq3bRYCOI7MCzSDLUZ0Rh9yOxwfW0yTZz8qREM76avvwqDa7b2+nA7pqx0BY6X/Z XeRQFF6sEq7wjGt6xaS3xHE9a/fN3alyNgzjF+GOjoay+SJNAG47OR1YmneGHskk3d7+ qIvalJU409fyu4KyrLj+oDg/4sVXqX5mF1zzoJrAdbXCh2atFfbASs0oZF0V3MjpVYeQ vtY0Gw/iAJjApJfOY2UfgYAoxAbEJGa5pmgRnwJoY3SvFcgmFmB8bcNF5ffUEYPw4OqH N/gxPkwIVaGY4L7HqTzikk80Oy/hKV2NdFivgcTLQkRQQVIO5HH0nwPl+zt64+/JZ8Vy gzyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465433; x=1742070233; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=tfPNOoHpP1FsVmbeiwOjL1eZebItbrovfjcUpFcyo94=; b=Dul6hsu+jOHhM/maJPRQcue+149B4dfTwx+J6TboE6OGXQAkn4WLT+Ect4YhCuwxuZ WlpcvCYnapz3lOBGOJcBvEWEzq/CBQ4mKbTQ5yTt5jFcex1eCLhMmWZWqQ6/RT3I7hvH SMQCG+ob98Q1UYgpncdiJY2FEXlcR0x8uTWivh5fh1aB+lC4FJZyLWAFNm++TKWmBqdN FmjacG/bsRjyCGrMcC4dpmJCxAUEK/W07zNv/kscPm6BC3oCxnSsMT9FIYSXbKcnahUn N85q7ugIrGqQLuVD9VO+GxvFo/nMdbs6QANiPlL34Kra1V1QU8PDzff0WTtyXPoaIu7c outw== X-Forwarded-Encrypted: i=1; AJvYcCV4OX99XkK0kqD99E/wgwWKDBfJk1+vv3HvDgmQ/dOMv6jP2XKMyuOx6HTMpF1ha8toKoCx7P1ZIwIBjjA=@vger.kernel.org, AJvYcCVLwY8Iv0a0oJhcb977t/VhLTmE5nzZvu4byWSbnlSa8jR/C94/mY+uDPfSGMaL8lph/NgoQgXkHqnt1WXEc3N8pQg6Aw==@vger.kernel.org X-Gm-Message-State: AOJu0YwCX57Hb6iwREhvvYaZ5G9Py+DI0aAJUxeWw87hheBVPmKY6NTD 5m1n/byQv9cPjPQAgMnkgKwSAxtQP1B6Vj4E7ZOQRxAtO8LlIAmQkFuvZuJf X-Gm-Gg: ASbGncvcQPWrtgOkbmrXm3Y0mtlBTL0Gfja8hZF7x3QJ4VKq8cHizCXU88Eizry86/8 X4McvemdauUWjeWPYy6vXLeF2zDztunPMvfoa9CksWA+Z/w10ES9dYIgiDKrI0qIrBiNsiyiPBb wMwfh2VRpHSU/om3Bbg1fnUgQZ/59mTtaWOUU6YNY4GTxB15Ms66U+jpS0YoS4Gcpe5RmaTC/03 vwx3dJBA+snMOfJ1+uHZ4SGYOmpU6DweDVtZn1PTveEQdeBTrSMK7L3kJ4Fwjo7B0EDh6cAvnnv YTbRmR/87SeJLf7mXeX77lixIoyPvSmyCQOYb5nVLXnRQtNM2AzX2PCR X-Google-Smtp-Source: AGHT+IFvz1GBQVyXY22TzEYtkoZD39hy6FwWQLBVOeyoym8O3yzr6yN4p/uZqY+wicUK8tqNIIjc1Q== X-Received: by 2002:a05:6102:578f:b0:4bb:c24b:b623 with SMTP id ada2fe7eead31-4c30a6624famr6409449137.19.1741465433206; Sat, 08 Mar 2025 12:23:53 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:52 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:16 -0500 Subject: [PATCH v4 04/12] platform/x86: alienware-wmi-wmax: Modify supported_thermal_profiles[] Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-4-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Rename supported_thermal_profiles[] -> supported_profiles[] and change it's type to u8 because it stores AWCC thermal IDs. Reviewed-by: Armin Wolf Reviewed-by: Ilpo J=C3=A4rvinen Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index b9dbfdc8096c571722b3c7ac3e73989e235e2eb9..a8a13779793abbcc8d1263474ca= c6227d524a6f5 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -213,7 +213,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 { @@ -616,8 +616,7 @@ static int awcc_platform_profile_set(struct device *dev, } } =20 - return awcc_op_activate_profile(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, priv->supported_profiles[prof= ile]); } =20 static int awcc_platform_profile_probe(void *drvdata, unsigned long *choic= es) @@ -653,7 +652,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); } @@ -662,7 +661,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 00:16:00 2025 Received: from mail-ua1-f43.google.com (mail-ua1-f43.google.com [209.85.222.43]) (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 74C652135BB; Sat, 8 Mar 2025 20:23:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465438; cv=none; b=XLAtWVtd0blRdD/MBjnTlmWCOZ/X+JDLMn8684B/PX8zNSTBHL0F/udtBkDWbkfuEpZRL9qhS9HAwjgQ2MdvsOzKkcD2mEiwEegEHl8+r9hSzHwVIgvWLZl+eASSXdGHyuOvQiGuQHMmSfbkNrb9KYa09bnmM8Un7ClYn53xoIc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465438; c=relaxed/simple; bh=cPKPG5Vxh6Z/Se8zjhuifeo9I8dN5wM+mN+9d222mtM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=av4FtE7CTxZK85Iq2EYl90MF8nE1bG1M9L+BKJjlEDsw1vHrnA/2wrwuENANnBh/ECCnzDzMHKxZMghFcYDNXBcucw0iHyEOn5D78f7ifVinj0Q4RVFnsU++dA1z+DL5ZwLJyR2PFWthlZ0d3fl+QZ1vuOW1y+cPcyJmHZKQ5zw= 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=eoNIqtVZ; arc=none smtp.client-ip=209.85.222.43 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="eoNIqtVZ" Received: by mail-ua1-f43.google.com with SMTP id a1e0cc1a2514c-8671d8a9c3eso2312473241.3; Sat, 08 Mar 2025 12:23:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465435; x=1742070235; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=KJz42pw5OoHFXvVMA6liTx4M4GaMhFeDvsfN2Iym2Zk=; b=eoNIqtVZ9w5w4LY3gyEjOqfGvRfXhvj91CDmLGW1t82vf0uyqYeHgBLcxuQxhVuxze 4LGyFSmgPuWa+M9G3nbboSjhLebf1dgz3Xt2EiBa0nKOUM/YGToweeKvhNK96cPBcNcZ 58XedQd11UAGzOEQNRZ5h1Z5FHlsiXF4hcYHWQ9djPlQg7FcRuAC+1wYLSIr9GggpaK4 12me1+Vh/Wpq6dBc/EYJ+72O4VlNG49vJQw6p68ZcsyDDnZGvKr22bkhblrziWgxz2MF qH7oB/ifumKvSRX8ohQmxEeRqYy3cZSR3eVR5IjcdNzbhbW9bJKG4KJHy1J+GfM0YaIC SQZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465435; x=1742070235; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KJz42pw5OoHFXvVMA6liTx4M4GaMhFeDvsfN2Iym2Zk=; b=SKMNkPQHiW9sVVd3yFIcKEEPwJomFH5TyQ4PHKaYo+rYsIOiw3yv7s9cSsGUJHqkxQ JD4QXfNW/wl0JQ/vpAaKEyPDP9YgMn9xkKP1NZqcAJloQanpKsljtKkO2CiuZ+SegvUt ggkg5QOiCLSDgsPPPxEeEPTV4XzU4cFX2CAZNlaaqA+6P3lJNwECvodEYQUrWZKtWFq+ uW4Sg/l54p9obqBKZJjDx5q6hulzPSQFjsk2lsHhqLj0KZ+NEJOrrJxfnD7sW7ylr3PC SXVYM+BqbHrkhth0pfHWBjs9iJIA+Wv9c9xvcWQh+iGxX0OtJCMKWaFoeIhDb4xFACCL jfew== X-Forwarded-Encrypted: i=1; AJvYcCUVwrrhVadUfBrJVEM/0WnM5drvX9jqtm1aVrXMHEvQQuQdy6mpXYxfVjPIiEGJuOUgMllB3ukkn0qFv/o=@vger.kernel.org, AJvYcCXMVTQNEu0NQtawo+sPmbEAiFmu2dxCY0lJS/GxjdXuOfLz3SGPWaB0l3aefRePPRKlKi4kvPPvmzonLbxIvvoOST95/Q==@vger.kernel.org X-Gm-Message-State: AOJu0YxEhlo5B8jVivtFaIXFldxuYRVjXdKk7nJamecezOeCbfU5dAcJ fUuNSEBXAWVnHgcOEPlOf4bm0ylL6/s+mYj1vO/JEL/y+iqWdWQhYffB17QP X-Gm-Gg: ASbGncu8A2mivDZNnVIZBIFpZiGBIWp4ML9cc3YkC82VoDAAqqv4Y3xCJ9KXn229+2B n6jv/DZ7YCTqmYEmsUufpIOyjnxw+VK9RbXOX7/wzd5N7lYdm5o8Ll4Vr9qjJtOu7YPW4U6h3UX ucTfLw83Xuei8cOzVzpiuGeNDkPLYw3FRLsxJotZ45V22BdMOjqby5u/ASQsZ4kgMXnLf/HEbYl WDKfWY3hOpIgMpqv/8hycpm3syHtoc3tc1XZB1GJWGEacqyp9tCEQNtSen+tB3I9MQ5YX8NIrfT SWn8tnCpGCr8q7apLz+XIgGz0DXpw1RtMvC0fBKZyvzMHw== X-Google-Smtp-Source: AGHT+IHZuh0N2XkhCgZMU1UGiMB84tDZK0ElCpb1rVEIzVIXgCs3xyzgH2LpYHaBdEDSKocxNgncjw== X-Received: by 2002:a05:6102:cd3:b0:4c1:7c38:135 with SMTP id ada2fe7eead31-4c30a367a82mr6117823137.0.1741465435055; Sat, 08 Mar 2025 12:23:55 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:54 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:17 -0500 Subject: [PATCH v4 05/12] platform/x86: alienware-wmi-wmax: Improve platform profile probe Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-5-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Get and store the AWCC system description in alienware_awcc_setup() instead of awcc_platform_profile_probe() and 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. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/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 a8a13779793abbcc8d1263474cac6227d524a6f5..0530f25b956f73f47c0354f40da= c2910448c894e 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -38,6 +38,9 @@ /* Some IDs have a BIT(8) flag that we ignore */ #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"); @@ -212,6 +215,17 @@ struct wmax_u32_args { =20 struct awcc_priv { struct wmi_device *wdev; + union { + u32 system_description; + struct { + u8 fan_count; + u8 temp_count; + u8 unknown_count; + u8 profile_count; + }; + u8 res_count[4]; + }; + struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; }; @@ -624,37 +638,40 @@ 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 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)) @@ -664,7 +681,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; @@ -695,6 +712,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 00:16:00 2025 Received: from mail-ua1-f54.google.com (mail-ua1-f54.google.com [209.85.222.54]) (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 560AC213E8D; Sat, 8 Mar 2025 20:23:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465439; cv=none; b=u7s/3HhbDG+PyF1lpkq5xaKHeC5E1OoirIVt5hw727eu/bU/PbREZlv0vhKojl6tFjnWdoKb8O/c1MRucUhMj1Kwv5YKfOX92GSZtKrJPgnVm3elfekd3EgIUAbBmyRDCsKWwNJPtyO+LNxXe99MJdsHeTOAkVLFVebGkS3cj+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465439; c=relaxed/simple; bh=/RVTDk95xTdgwIURpxctNMV56eIngqQ4/eX5yRQzsK8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZAGx7In4RpYN9ZszKstzHFV3m49E5IxOzfYy/7ue+RwhR+S68ruuRPIS03UQTAzGs34tLKHtXPIlDnGsW7kifvt3pDipszJ3QsuzIU/a02XdbDrCKQs964Pbu2AeC6LEtCTeUgX312l0dyHnr3/DhcfPPwEgfxg5oBXWmpq14nA= 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=K7NnTdys; arc=none smtp.client-ip=209.85.222.54 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="K7NnTdys" Received: by mail-ua1-f54.google.com with SMTP id a1e0cc1a2514c-86d2fba8647so2768924241.0; Sat, 08 Mar 2025 12:23:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465437; x=1742070237; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=H43dqBGhipBxPHVP+jwxsicROhpGVr1mHnd5dBnGOsU=; b=K7NnTdysudkBMfzkKv6KYC6yNbAxtOj4sEaQYoRYlMBtsjQFleXjHs5G6Lk7R1qIv9 2tHjN7CgjO/lE+ajr9YHdUykS2Jvy5LHOmeqXc/M9o0K2TRWaP3+sCWxXuH7iCVSfoSG BTCZXviI1GJW2PcbKtXbt70WhWj88Mo06iUGGz2fVd8Gz1mCIujpjETKjm702YjKj8Re +GfHfIWGGxwls6x4OxqQJDX5KXtROWq2osBENjXcmv94krk3cKiOgjh37a9x2IImra4k BimGXkTTLDX7qc/8FP7OGfJS+/239yrxaAv4Le6P7vgd5OvyIfeZUl/Z4Y7CpxR1DHcK ZnFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465437; x=1742070237; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=H43dqBGhipBxPHVP+jwxsicROhpGVr1mHnd5dBnGOsU=; b=lwGyWDC0iGV1cXa35qviaO9S7oXT5gFd5dStF/sYPQ9LeI3o2/wT7Jj+lb6mOa3fc3 oXjpWiXiGdpakuK9KrDkqKyUSiGwS46kIKPyqiXDJCaccqvkw4OXUbPeutnGQfugSbcb lTBAMUZklPFWFc2wiathb8cGwUdcBRH2p7BGFem3b2Ft59sGRNdrs+t1o8W6Q+8vX9+K m1NlZmjC+x0e9aRHKQMZdG8mPZTuPJ/10ClqSxoUhLnfvAYgFHQL6ZZ+Vcs4Cw7xPG7P 9anzu2FUdRWB0ej2YDAe5Md0XjFM4/iHJg8/rsAi1FKYHbNfIl91BfNJOppWAhY5Qh4T shEQ== X-Forwarded-Encrypted: i=1; AJvYcCUUK5yTVznLYgNbH8X9cYNOqj3/TQDr33t+qmbluPsozGUS1OfF4mR+DW7LwklbMaTwCCtg2cwxT+o73yo=@vger.kernel.org, AJvYcCV9emrJG91O9rq2uW5hvoadU/AABpln2RykoOZcN6eUoNcOBEzrpqIqrr7LuB+xJ93zr8nsIrYDQSpDw9Sk409CmDqCag==@vger.kernel.org X-Gm-Message-State: AOJu0Yxmmf9G2HxVYl76EdWU7GFdB4bPRdM1meFGlGDnpawXUYr3/dEA YT6DCfW5JlFXkiUeA7PO3cB2jfkJ3b96SgYoMv6BJbevdcud4+7RMaOXJEgZ X-Gm-Gg: ASbGncuIan9k6Bz0tFWVK9marjj4UhsvGAptQgnBIlHPk6AbyoVADzVARCKUy4n5llC yMUgxe+LFtKIQNRQfHjmtgpplR949WskUdW8t0aZsgS5g6LMAhos2WSOW+HmAE7qsRvnxIcFLj/ ZDORdd1mRxLTfhHQ54dhrJSwLlmH5Rifhv2vi0lMWAuTZZbSNy9Ur4TSLaJQNQIA228gomYhWBa rtTgaNd/qpbuVReyUkbsY+4VhBDFXUtvxx1Wx3Zzr5TLkoRrU3an+euMmsjpL9MNBypwlTgU/y7 zg8RC2CznSfMRtpeT8Y1TgJW6aBQqGtoKfCVOO03af8LLA== X-Google-Smtp-Source: AGHT+IH7mFn2VkfQwVHFZEjGscAWUbvP9g6ea6o2RiF6OGXa73QMG7EZQDFPYmj5IoyvNr+OHQ2OsQ== X-Received: by 2002:a05:6102:1613:b0:4bb:d062:452 with SMTP id ada2fe7eead31-4c30a537426mr6401588137.3.1741465436847; Sat, 08 Mar 2025 12:23:56 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:56 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:18 -0500 Subject: [PATCH v4 06/12] platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-6-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support a "custom" thermal profile. In some models this profile signals user-space that the user wants to manually control the fans, which are always unlocked. In other models it actually unlocks manual fan control. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 0530f25b956f73f47c0354f40dac2910448c894e..3b37e4456482bc284b8e867c1c5= b6255fc6c8ef2 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) @@ -177,6 +175,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, @@ -589,9 +592,15 @@ static int awcc_platform_profile_get(struct device *de= v, if (ret) return ret; =20 - if (out_data =3D=3D AWCC_THERMAL_MODE_GMODE) { + switch (out_data) { + case AWCC_SPECIAL_PROFILE_CUSTOM: + *profile =3D PLATFORM_PROFILE_CUSTOM; + return 0; + case AWCC_SPECIAL_PROFILE_GMODE: *profile =3D PLATFORM_PROFILE_PERFORMANCE; return 0; + default: + break; } =20 if (!is_awcc_thermal_profile_id(out_data)) @@ -679,11 +688,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 00:16:00 2025 Received: from mail-ua1-f48.google.com (mail-ua1-f48.google.com [209.85.222.48]) (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 6A3DD214808; Sat, 8 Mar 2025 20:24:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465442; cv=none; b=goRRewBsrN0yoVaxQnYO3B6zyhadQjBHK2obg2KPAcXcO3d473x4TTEQV00qO8dfpN9TeFM3/BO4KfCk1d+BB61srwey70s98VzecDKkAJAvJOTMd4H+oR3U1+owx7NqEJcHSE6c+77+2ajyGdcQOzJHJ88Jf1oTIT1GGKe5wwY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465442; c=relaxed/simple; bh=RO8Ij/R9/4fe/uQYJvkhyLhFIPkBqmsMim/dWVmav5g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QgI6WqsU29ClEwaBZ+XjXvPQfVKJeGR5GPmyYTfzcutiZme4ZERawUgwfy/DWhz+iG8WVc5M7+hRjbrm2ApHvCnbOoKvWMRjwiMlonKkb/f2fmw+yXzrDpvOp0/isBKcF6nhTEHlX4H+rMcDy9x2HMNhlnjPx9lm/U4aTTiEE0o= 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=nHa9LJeW; arc=none smtp.client-ip=209.85.222.48 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="nHa9LJeW" Received: by mail-ua1-f48.google.com with SMTP id a1e0cc1a2514c-866de72bb82so1325565241.1; Sat, 08 Mar 2025 12:24:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465439; x=1742070239; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=TDf1AsZtiaj0YCG5+ojaDmXlmfPmHY7e2c2ersP/1FY=; b=nHa9LJeW5Sc/n76ZKuhljoNjNGKjhbtR5vkORuZVjlSg8Wy30gEMUbEEoMik1JWeQ3 8zAapHfohQ24PFVswuMIrAEzRJeBBXAqj3N5hTDLRbAG8VlizK3PZ1D0NIFbTW69OIl7 5ZFGcpCCYV8i3PuBzf5bZzshTrJD5Cj33U9C1VqHT9GCl9ddkgZ8B2+Kwrev9WkSNomw 6DvCflMcB9+K6+3CaF5y9kv1rX7vgC8IViesZrt5esETHNvI79GQRP6W549oePWKyXLZ UnbFhr4WyWehO6eeoEIc4sItNM3vX58Eq++qtpfRA3tBgdKufcRlKgQEM4Kgo4QvmEO+ 5Zzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465439; x=1742070239; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TDf1AsZtiaj0YCG5+ojaDmXlmfPmHY7e2c2ersP/1FY=; b=To+OPxiMxC4XUso7DnwR4lWNJudPsmFa/8dM4V2Zj6sp98pcBXOvxi53CwImynCs+/ FnE/PINz3Es5pMkDT4Xb7aYwu6O5zI0FGNqZyoWsTFNOkDQA+R4lEg14obCg4zG2jtlt QYefuYMIw7St4e0pFa9dDuw8Nu97dge688V0mLhUzHJSARsuAV3IY4LgYb1IjlYcdzyR WH94YSwYONz5eaEQG1MI8HS7pwSoNjSOGQkom7YpAcdMg7XAA8HZIompHr2ZChW76rXf kIn5BbKkuBanBmNdMnb76UvS1pYJOZTGCvP9KQxtMkA5V1Gn3350wgS5L5AKo6a5ZNxG tbEQ== X-Forwarded-Encrypted: i=1; AJvYcCV7/mP1g8g2Que18U/EVuLxDbsIT8UXyW4P3FddC9xmyiKrIS1I1lEOXrq9Vj8mojBAkBaK0sLu2svDhd1dj8bUchgtHQ==@vger.kernel.org, AJvYcCVUGYNwxPoKhtANy7NMuVdleJZ6CJvePp9sKx6++0nZ8aZmadsRD7LqfPDKbm5l0aIgDwqK9lQ1fObq8Q==@vger.kernel.org, AJvYcCWGm8KllrCLkrfhdBAjoDW9ZppQe4XHj6tFBAGEjB+J5OXlck8v99bN+IauMrfZQwfQ89xnaCr31NIuw+e7@vger.kernel.org X-Gm-Message-State: AOJu0Yzaw56SLpjAL1hwmA6ju07jVkGBXUA/1j/ZJKpEL213ljQmK7Sk yoF5e99MzNWt//TODQdA8WvzMcBEl9TfP8czR3xGcFwBZWRzvIyy X-Gm-Gg: ASbGncu8FuRlKmC6x1Bz7B2YGUx9zLME+66WrNY4P9vkHoSh3HTR0IiZCStMc1qSM79 8cNoYN3qK0NF2WGfXYwOb5WBkX6oBf47zkU2YlgLUe0OKj22GRZ8AhDbMfHECwHTaKQMBLeoUma oKfmKRP90fAyGMV4pTBtJqBO/4A+VV983MFYAqjceUmXi2Vmrn6VFK5YDRbGk/aflUm1k6yf9dz 7GaZCAXuNTCa2GIbHAtWg0tv7vUPEcYa9TKa/qbRljhO6DyfC/DuY1Vi9iexgVDAAmpvzwBH/XP fb2UdbavMxJ4MKhrituLPN0STJwiVEmUx2yjDo6Pd3DxWg== X-Google-Smtp-Source: AGHT+IGQ/1hWr0umt3tgGyO29lVNvli8Qs4G5fMIxTTL0EgFSFHvpAhT3OWxNbtifrTcOEuFEMcWoQ== X-Received: by 2002:a05:6102:3fa7:b0:4c1:9e13:8283 with SMTP id ada2fe7eead31-4c30a731103mr5498918137.25.1741465439147; Sat, 08 Mar 2025 12:23:59 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:23:58 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:19 -0500 Subject: [PATCH v4 07/12] platform/x86: alienware-wmi-wmax: Add HWMON support Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-7-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support monitoring fan speed and temperature sensors. Expose this feature through the HWMON interface. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/dell/alienware-wmi-wmax.c | 396 +++++++++++++++++++++= ++++ 2 files changed, 397 insertions(+) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/= Kconfig index f8a0dffcaab7c3b423472c5b9093011334a698c8..85a57c01aaada5d899cd8252e77= ed6043da5cbdf 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 3b37e4456482bc284b8e867c1c5b6255fc6c8ef2..f1f20db206d47f644e8cd58a6d1= 69c850606e75b 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,12 @@ =20 /* Arbitrary limit based on supported models */ #define AWCC_MAX_RES_COUNT 16 +#define AWCC_ID_BITMAP_SIZE (U8_MAX + 1) +#define AWCC_ID_BITMAP_LONGS BITS_TO_LONGS(AWCC_ID_BITMAP_SIZE) + +static bool force_hwmon; +module_param_unsafe(force_hwmon, bool, 0); +MODULE_PARM_DESC(force_hwmon, "Force probing for HWMON support without che= cking if the WMI backend is available"); =20 static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -48,16 +58,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, }; @@ -155,9 +168,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 @@ -180,6 +202,11 @@ enum AWCC_SPECIAL_THERMAL_CODES { AWCC_SPECIAL_PROFILE_GMODE =3D 0xAB, }; =20 +enum AWCC_TEMP_SENSOR_TYPES { + AWCC_TEMP_SENSOR_CPU =3D 0x01, + AWCC_TEMP_SENSOR_GPU =3D 0x06, +}; + enum awcc_thermal_profile { AWCC_PROFILE_USTT_BALANCED, AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, @@ -216,6 +243,14 @@ struct wmax_u32_args { u8 arg3; }; =20 +struct awcc_fan_data { + unsigned long auto_channels_temp; + const char *label; + u32 min_rpm; + u32 max_rpm; + u8 id; +}; + struct awcc_priv { struct wmi_device *wdev; union { @@ -231,6 +266,10 @@ struct awcc_priv { =20 struct device *ppdev; u8 supported_profiles[PLATFORM_PROFILE_LAST]; + + struct device *hwdev; + struct awcc_fan_data **fan_data; + unsigned long temp_sensors[AWCC_ID_BITMAP_LONGS]; }; =20 static const enum platform_profile_option awcc_mode_to_platform_profile[AW= CC_PROFILE_LAST] =3D { @@ -495,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) { @@ -552,6 +604,30 @@ static inline int awcc_op_get_resource_id(struct wmi_d= evice *wdev, u8 index, u32 return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =20 +static inline int awcc_op_get_fan_rpm(struct wmi_device *wdev, u8 fan_id, = u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_FAN_RPM, + .arg1 =3D fan_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} + +static inline int awcc_op_get_temperature(struct wmi_device *wdev, u8 temp= _id, u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_TEMPERATURE, + .arg1 =3D temp_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} + static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32= *out) { struct wmax_u32_args args =3D { @@ -577,6 +653,313 @@ static inline int awcc_op_activate_profile(struct wmi= _device *wdev, u8 profile) return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); } =20 +/* + * HWMON + * - Provides temperature and fan speed monitoring as well as manual fan + * control + */ +static umode_t awcc_hwmon_is_visible(const void *drvdata, enum hwmon_senso= r_types type, + u32 attr, int channel) +{ + const struct awcc_priv *priv =3D drvdata; + unsigned int temp_count; + + switch (type) { + case hwmon_temp: + temp_count =3D bitmap_weight(priv->temp_sensors, AWCC_ID_BITMAP_SIZE); + + return channel < temp_count ? 0444 : 0; + case hwmon_fan: + return channel < priv->fan_count ? 0444 : 0; + case hwmon_pwm: + return channel < priv->fan_count ? 0444 : 0; + default: + return 0; + } +} + +static int awcc_hwmon_read(struct device *dev, enum hwmon_sensor_types typ= e, + u32 attr, int channel, long *val) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + const struct awcc_fan_data *fan; + u32 state; + int ret; + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (attr) { + case hwmon_temp_input: + ret =3D awcc_op_get_temperature(priv->wdev, temp, &state); + if (ret) + return ret; + + *val =3D state * MILLIDEGREE_PER_DEGREE; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_fan: + fan =3D priv->fan_data[channel]; + + switch (attr) { + case hwmon_fan_input: + ret =3D awcc_op_get_fan_rpm(priv->wdev, fan->id, &state); + if (ret) + return ret; + + *val =3D state; + break; + case hwmon_fan_min: + *val =3D fan->min_rpm; + break; + case hwmon_fan_max: + *val =3D fan->max_rpm; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_pwm: + fan =3D priv->fan_data[channel]; + + switch (attr) { + case hwmon_pwm_auto_channels_temp: + *val =3D fan->auto_channels_temp; + break; + default: + return -EOPNOTSUPP; + } + + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static int awcc_hwmon_read_string(struct device *dev, enum hwmon_sensor_ty= pes type, + u32 attr, int channel, const char **str) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + u8 temp; + + switch (type) { + case hwmon_temp: + temp =3D find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (temp) { + case AWCC_TEMP_SENSOR_CPU: + *str =3D "CPU"; + break; + case AWCC_TEMP_SENSOR_GPU: + *str =3D "GPU"; + break; + default: + *str =3D "Unknown"; + break; + } + + break; + case hwmon_fan: + *str =3D priv->fan_data[channel]->label; + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static const struct hwmon_ops awcc_hwmon_ops =3D { + .is_visible =3D awcc_hwmon_is_visible, + .read =3D awcc_hwmon_read, + .read_string =3D awcc_hwmon_read_string, +}; + +static const struct hwmon_channel_info * const awcc_hwmon_info[] =3D { + HWMON_CHANNEL_INFO(temp, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT, + HWMON_T_LABEL | HWMON_T_INPUT + ), + HWMON_CHANNEL_INFO(fan, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX, + HWMON_F_LABEL | HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_MAX + ), + HWMON_CHANNEL_INFO(pwm, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP, + HWMON_PWM_AUTO_CHANNELS_TEMP + ), + NULL +}; + +static const struct hwmon_chip_info awcc_hwmon_chip_info =3D { + .ops =3D &awcc_hwmon_ops, + .info =3D awcc_hwmon_info, +}; + +static int awcc_hwmon_temps_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + unsigned int i; + int ret; + 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; + + __set_bit(FIELD_GET(AWCC_RESOURCE_ID_MASK, id), priv->temp_sensors); + } + + return 0; +} + +static char *awcc_alloc_fan_label(struct device *dev, u32 temp_count, u8 t= emp_id) +{ + char *label; + + switch (temp_count) { + case 0: + label =3D devm_kstrdup(dev, "Independent Fan", GFP_KERNEL); + break; + case 1: + switch (temp_id) { + case AWCC_TEMP_SENSOR_CPU: + label =3D devm_kstrdup(dev, "Processor Fan", GFP_KERNEL); + break; + case AWCC_TEMP_SENSOR_GPU: + label =3D devm_kstrdup(dev, "Video Fan", GFP_KERNEL); + break; + default: + label =3D devm_kstrdup(dev, "Unknown Fan", GFP_KERNEL); + break; + } + + break; + default: + label =3D devm_kstrdup(dev, "Shared Fan", GFP_KERNEL); + break; + } + + return label; +} + +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, temp_count, temp_id; + unsigned long fan_temps[AWCC_ID_BITMAP_LONGS]; + unsigned long gather[AWCC_ID_BITMAP_LONGS]; + struct awcc_fan_data *fan_data; + unsigned int i, j; + char *label; + 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 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, &temp_count); + if (ret) + return ret; + + for (j =3D 0; j < temp_count; j++) { + ret =3D awcc_get_fan_sensors(wdev, AWCC_OP_GET_FAN_TEMP_ID, + id, j, &temp_id); + if (ret) + break; + + temp_id =3D FIELD_GET(AWCC_RESOURCE_ID_MASK, temp_id); + __set_bit(temp_id, fan_temps); + } + + label =3D awcc_alloc_fan_label(&wdev->dev, temp_count, temp_id); + if (!label) + return -ENOMEM; + + fan_data->id =3D id; + fan_data->min_rpm =3D min_rpm; + fan_data->max_rpm =3D max_rpm; + fan_data->label =3D label; + bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE= ); + bitmap_copy(&fan_data->auto_channels_temp, gather, priv->temp_count); + priv->fan_data[i] =3D fan_data; + + bitmap_zero(fan_temps, AWCC_ID_BITMAP_SIZE); + } + + return 0; +} + +static int awcc_hwmon_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); + int ret; + + priv->fan_data =3D devm_kcalloc(&wdev->dev, priv->fan_count, + sizeof(*priv->fan_data), GFP_KERNEL); + if (!priv->fan_data) + return -ENOMEM; + + ret =3D awcc_hwmon_temps_init(wdev); + if (ret) + return ret; + + ret =3D awcc_hwmon_fans_init(wdev); + if (ret) + return ret; + + priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", priv, + &awcc_hwmon_chip_info, NULL); + + return PTR_ERR_OR_ZERO(priv->hwdev); +} + /* * Thermal Profile control * - Provides thermal profile control through the Platform Profile API @@ -744,6 +1127,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) @@ -824,6 +1213,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 00:16:00 2025 Received: from mail-ua1-f54.google.com (mail-ua1-f54.google.com [209.85.222.54]) (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 7FB07215066; Sat, 8 Mar 2025 20:24:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465444; cv=none; b=Ug+N01iAW9Fq3rcHaal8xO+0FDgg7W9VMhCHH8PRV+suGAKnOAA4qGeHM+aWfZRn1W/zR8mwPzl7hET/a6PvOEF6JzJKuqpFrHUrTEcoZU1M+55bqn2AZhxMbzikfY5Dv7O3E+I+zQAqk5P8mc7SXrSBARDGwzn9ZFrQlymF9vI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465444; c=relaxed/simple; bh=1WvtCI7T/zSeG16awHQltZPDSPU9utR7aCz/0rI6NFE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nlkjFAtUVObqmpixjgDI7g3n4SyJ+eYZ57RErsHlSbCMC/vaS0AgZo2yCz1QD1V3/ICAIALHENuTFqGdPc71YfrJBNePxZ66X84wxuL3gINJ/3p1Og1soqibnQXJVN0AT8seFaVdjHk/YJFCRMHVTrWXzSFGkNypFoeYFjcpe+I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=l3HcXCLu; arc=none smtp.client-ip=209.85.222.54 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="l3HcXCLu" Received: by mail-ua1-f54.google.com with SMTP id a1e0cc1a2514c-86112ab1ad4so1162534241.1; Sat, 08 Mar 2025 12:24:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465441; x=1742070241; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=EnJlPpID8OgV+6ieoW+XQuA9obmHPOcyUX8+U0ErvAw=; b=l3HcXCLunkpibpI01g5PdYFbXJfOXi7kE3Az2WkNoFfSfjWiDhnO/PVzOuT2sEERgQ 5de+DFXG5hsHmcXN6d2i+SgshT4IL40xLd184NwjDJex2xy/PQrQqQvegaT1qKLg4Wcz VYOGOjrALUUV3x+Wo5Fo/huvj3ajSpPOd9SAVNTZidvzkCB5IHY1Y6hbvmLLF+eUiSW5 SMOONwYjW5yokTmN3BT63zI/wHPVflRrXXAScV8v1/O7sorCr8xPYH2p49e0BzWfiaed hR+Vd51acO60R8VpNYDRm7oEyOUh77IXtZgtyvK3mj1K+N0ndo0woPOghvdbOlEsaz4H zhzA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465441; x=1742070241; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EnJlPpID8OgV+6ieoW+XQuA9obmHPOcyUX8+U0ErvAw=; b=rNtGAAULcVbJ53D7pkReXYlEwnrNIkEo4SLes9+nxPIdyrBlO34KLJv9uA0LYB0oES LPGFXCREeVFo/NYmpB++M3TrzGrX5ugTYUCFR8xKIGdYl6LIR6Yri2GCGOHqU9zi7FZb D94s/njV5jz9zBuT7jClnMOa4DoRXaEw/3NgGcNOEemXyEO+dUV4QzX5OFGZOiQd5JLu NiLABUrupE57ncPyPD39mfRJuCjgM9k22fVABV3mIMonmTGFQ5TOiic6aIyOnAvSWOro GZEbtWFtMUBYq/gSJ4ulkvLovWo00JZVwRm8wR4cWmOUUmf7RWdwKkmFmSkds9LTvFyN jCLg== X-Forwarded-Encrypted: i=1; AJvYcCUwJ+xdTwWkZnPtdpeoxkYRX4JtiuVZj6QN8bv/SluObCC2hrAN+kz+W62rrkAze9HKG0aY680izOkT20wv577Bvb2IzQ==@vger.kernel.org, AJvYcCW75hhoFrJ+/PwzVczfC/iB8WjrGar2SGQ4xn48RqwlZLrjUxLqq7eNpjxKA2peVcKgDcZwXs/mILqgXbz0@vger.kernel.org, AJvYcCXv7beJGD+NSuTBgJrG/p6XQNgt8bWXpPcqYwp+871eEMTCa3WYU/+iBqdTF3M+1d+RYdBsdlG1FlGiUA==@vger.kernel.org X-Gm-Message-State: AOJu0Yz5LIgfekFdwkGIKX8U41mZW9vN/EowTYxwtPQ9jcSGwQYoxwoJ vDYBuYDIudSbskU0L4OHyudi+DrO3wOSMzI6QPGaCmh3+4rAouV5 X-Gm-Gg: ASbGncv+zS/pMH1U4KXgGZ3qo4+WTqaEaDiKrjfeFqx1oy58R5RDJRCXwSwsGFYl9d2 f3vU8hOyV8/UgS/XcEiDlEvHDqksKVFomb6sx9M/dsnFAVJb1rfM8fjIjI3jK+xRrfKSAhil70O sK2Zrnu+FkzGt7LenV2jTHYanJcPjesE+vkG/XFZOg0EdBYj5HKix7QaX5ci2egu1YuvxsrcNRa 9IWn6+XvksEwG7CnffIZgjkEBcpZVExq7g/9y03aMnMqiyK00h4qiZUwva1N/iUcBEyYtdn10EB 9Nq3lU4hGVq3lY/eI3PYhasvuZjVO4IpblABhdNTOA+kjw== X-Google-Smtp-Source: AGHT+IGNO21Owm/0YLb7Atl/atogHWj/IWrr1Qy6qbQK/gdQJ7tkJ6cIpVSdIKPU1ai3xeK5RFaccQ== X-Received: by 2002:a05:6102:3fa7:b0:4bb:9b46:3f8a with SMTP id ada2fe7eead31-4c30a5016d4mr6314470137.2.1741465441289; Sat, 08 Mar 2025 12:24:01 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.23.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:24:00 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:20 -0500 Subject: [PATCH v4 08/12] platform/x86: alienware-wmi-wmax: Add support for manual fan control Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-8-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support a way of manually controlling fans. The PWM duty cycle of a fan can't be controlled directly. Instead the AWCC interface let's us tune a fan `boost` value, which has the following empirically discovered, aproximate behavior over the PWM value: pwm =3D pwm_base + (fan_boost / 255) * (pwm_max - pwm_base) Where the pwm_base is the locked PWM value controlled by the FW and fan_boost is a value between 0 and 255. Expose this fan_boost knob as a custom HWMON attribute. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Signed-off-by: Kurt Borja Reviewed-by: Armin Wolf --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 174 +++++++++++++++++++++= +++- 1 file changed, 172 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index f1f20db206d47f644e8cd58a6d169c850606e75b..68ff520f016d2d567cddcefe41f= 01bf284b4d979 100644 --- a/drivers/platform/x86/dell/alienware-wmi-wmax.c +++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c @@ -13,8 +13,12 @@ #include #include #include +#include +#include +#include #include #include +#include #include #include #include "alienware-wmi.h" @@ -181,10 +185,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 { @@ -248,6 +254,7 @@ struct awcc_fan_data { const char *label; u32 min_rpm; u32 max_rpm; + u8 suspend_cache; u8 id; }; =20 @@ -628,6 +635,18 @@ static inline int awcc_op_get_temperature(struct wmi_d= evice *wdev, u8 temp_id, u return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); } =20 +static inline int awcc_op_get_fan_boost(struct wmi_device *wdev, u8 fan_id= , u32 *out) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_GET_FAN_BOOST, + .arg1 =3D fan_id, + .arg2 =3D 0, + .arg3 =3D 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, o= ut); +} + static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32= *out) { struct wmax_u32_args args =3D { @@ -653,6 +672,19 @@ static inline int awcc_op_activate_profile(struct wmi_= device *wdev, u8 profile) return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); } =20 +static inline int awcc_op_set_fan_boost(struct wmi_device *wdev, u8 fan_id= , u8 boost) +{ + struct wmax_u32_args args =3D { + .operation =3D AWCC_OP_SET_FAN_BOOST, + .arg1 =3D fan_id, + .arg2 =3D boost, + .arg3 =3D 0, + }; + u32 out; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out); +} + /* * HWMON * - Provides temperature and fan speed monitoring as well as manual fan @@ -817,6 +849,81 @@ static const struct hwmon_chip_info awcc_hwmon_chip_in= fo =3D { .info =3D awcc_hwmon_info, }; =20 +static ssize_t fan_boost_show(struct device *dev, struct device_attribute = *attr, + char *buf) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + int index =3D to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan =3D priv->fan_data[index]; + u32 boost; + int ret; + + ret =3D awcc_op_get_fan_boost(priv->wdev, fan->id, &boost); + if (ret) + return ret; + + return sysfs_emit(buf, "%u\n", boost); +} + +static ssize_t fan_boost_store(struct device *dev, struct device_attribute= *attr, + const char *buf, size_t count) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + int index =3D to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan =3D priv->fan_data[index]; + unsigned long val; + int ret; + + ret =3D kstrtoul(buf, 0, &val); + if (ret) + return ret; + + ret =3D awcc_op_set_fan_boost(priv->wdev, fan->id, clamp_val(val, 0, 255)= ); + + return ret ? ret : count; +} + +static SENSOR_DEVICE_ATTR_RW(fan1_boost, fan_boost, 0); +static SENSOR_DEVICE_ATTR_RW(fan2_boost, fan_boost, 1); +static SENSOR_DEVICE_ATTR_RW(fan3_boost, fan_boost, 2); +static SENSOR_DEVICE_ATTR_RW(fan4_boost, fan_boost, 3); +static SENSOR_DEVICE_ATTR_RW(fan5_boost, fan_boost, 4); +static SENSOR_DEVICE_ATTR_RW(fan6_boost, fan_boost, 5); + +static umode_t fan_boost_attr_visible(struct kobject *kobj, struct attribu= te *attr, int n) +{ + struct awcc_priv *priv =3D dev_get_drvdata(kobj_to_dev(kobj)); + + return n < priv->fan_count ? attr->mode : 0; +} + +static bool fan_boost_group_visible(struct kobject *kobj) +{ + return true; +} + +DEFINE_SYSFS_GROUP_VISIBLE(fan_boost); + +static struct attribute *fan_boost_attrs[] =3D { + &sensor_dev_attr_fan1_boost.dev_attr.attr, + &sensor_dev_attr_fan2_boost.dev_attr.attr, + &sensor_dev_attr_fan3_boost.dev_attr.attr, + &sensor_dev_attr_fan4_boost.dev_attr.attr, + &sensor_dev_attr_fan5_boost.dev_attr.attr, + &sensor_dev_attr_fan6_boost.dev_attr.attr, + NULL +}; + +static const struct attribute_group fan_boost_group =3D { + .attrs =3D fan_boost_attrs, + .is_visible =3D SYSFS_GROUP_VISIBLE(fan_boost), +}; + +static const struct attribute_group *awcc_hwmon_groups[] =3D { + &fan_boost_group, + NULL +}; + static int awcc_hwmon_temps_init(struct wmi_device *wdev) { struct awcc_priv *priv =3D dev_get_drvdata(&wdev->dev); @@ -954,12 +1061,56 @@ static int awcc_hwmon_init(struct wmi_device *wdev) if (ret) return ret; =20 - priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", priv, - &awcc_hwmon_chip_info, NULL); + priv->hwdev =3D devm_hwmon_device_register_with_info(&wdev->dev, "alienwa= re_wmi", + priv, &awcc_hwmon_chip_info, + awcc_hwmon_groups); =20 return PTR_ERR_OR_ZERO(priv->hwdev); } =20 +static void awcc_hwmon_suspend(struct device *dev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + u32 boost; + int ret; + + for (i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + ret =3D awcc_thermal_information(priv->wdev, AWCC_OP_GET_FAN_BOOST, + fan->id, &boost); + if (ret) + dev_err(dev, "Failed to store Fan %u boost while suspending\n", i); + + fan->suspend_cache =3D ret ? 0 : clamp_val(boost, 0, 255); + + awcc_op_set_fan_boost(priv->wdev, fan->id, 0); + if (ret) + dev_err(dev, "Failed to set Fan %u boost to 0 while suspending\n", i); + } +} + +static void awcc_hwmon_resume(struct device *dev) +{ + struct awcc_priv *priv =3D dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + int ret; + + for (i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + if (!fan->suspend_cache) + continue; + + ret =3D awcc_op_set_fan_boost(priv->wdev, fan->id, fan->suspend_cache); + if (ret) + dev_err(dev, "Failed to restore Fan %u boost while resuming\n", i); + } +} + /* * Thermal Profile control * - Provides thermal profile control through the Platform Profile API @@ -1189,6 +1340,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 }, { }, @@ -1199,6 +1368,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 00:16:00 2025 Received: from mail-ua1-f47.google.com (mail-ua1-f47.google.com [209.85.222.47]) (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 17F6F20DD67; Sat, 8 Mar 2025 20:24:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465447; cv=none; b=nzK6F9Wm432f9Ain0Ko00fesQFYTseAIfldnsc26QeY6knWBR59phVtl6goZ9/x6e3Z+RWg+09EdMJQCbL0w66WoZDBKSHZGiG5QHskBwZIuH1RUjVx1oej6M/jFoXhx42so08hl/3v/vhscYQLc+7TQ+Zusk7Dzihd8q4dfONY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465447; c=relaxed/simple; bh=KwrCLpK8le08otfiFGfZZYH0fnGuFvXy84GjEXmIJac=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BXaCOsCz90kkiZAQ8UTkloqtDQS5lylwplRf1KgB90poHHBK9DlH0kZFoBAN7tUtDV2jvfakuVG6OLS1ME1nTZsfqHP7JDcMxP1qc/L86UQMngKEBDHNbZEXzQG3A7YipZC3c+0RxSgzOozpQZ3yEqO/BYOBxhND89DlPX+WDWw= 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=Uqdz5i7P; arc=none smtp.client-ip=209.85.222.47 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="Uqdz5i7P" Received: by mail-ua1-f47.google.com with SMTP id a1e0cc1a2514c-86b31db3c3bso1192235241.3; Sat, 08 Mar 2025 12:24:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465443; x=1742070243; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2Pd44e4mOe+bD5C1vl3vRJ8fZ0guGsHvauJTp/rwYSw=; b=Uqdz5i7PGhaPqOBgPWYsQ9cEZ7cHxIhEDlvdg0pcYIt64oPpCj7jmsP+9c0XNLAZnT ZHPH8zkxgHe8k1pWVUmrXc5ClvXbe/skoMUGq2EfFcVSho8sHbF0hZTR73yPPa/yM1JZ mumcNx3I2Aql+rJFdfhkaw+rpRTEerxTW5dEVP+vuc7NflBh4nPVktn8LiyXsro0ftuS e1tpeqIaaek0iph2JAs2FkFYnm22G83gd/TYMVt9U30ZoY88vWtczpltRZ/XcfDq5RgJ vSsK9UQXPYEURvkPDW5wFDR7VsX+J1b31XLucRJWcye5ukS+sZOG2JNyaE3Lk8gMmBpm Ft6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465443; x=1742070243; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2Pd44e4mOe+bD5C1vl3vRJ8fZ0guGsHvauJTp/rwYSw=; b=DILOA3L9S4iuPCcpqIYyAXS1ezQX/AZVvcCmdTTT/ZxRj9hM42QTVdLaqbqGScQQGJ KcdcDm8SAgqdS1sRQ6NF0SvRLqM6Q0qSDLPm1QEO+aPJKIAYZ/8iw9TtqKDgxii8Xu/X rHIXAlps2vvOKvFE/r+/KnA/pEMJTtKnfU1YfLXvRNbb7URXiATIjbVhx4z8aduZmnKb b1q/VzSYRyVhJ3RVuUEPCV3D2Eb9fx5otoXkcPut/jGoJAw39T0sadaVHdMBU6JyR7se nq0u/+sK+HlwxbYc4FejJYATptGTf5tp1s3CqXRnU/OM5pSRLef03b0TGE7InJ1cuocs ARig== X-Forwarded-Encrypted: i=1; AJvYcCWAo0ut7leRkOFC/FZBQL+E1X6/ZfobU++Okcrldjo+aA8nVJA32h03kkhja8q+AOE3v+u9hiBMBkO8nSA=@vger.kernel.org, AJvYcCXMZU5hEBJRjhDvpK3n+IXUpa6xSqbZ+AihbJtiLLF7aiZwnrS5X3tIG0Bvx8R7oQIz0d7iILZ41XOmAGVVqJ1tQdA7pQ==@vger.kernel.org X-Gm-Message-State: AOJu0YzNJUK41Pur9r71yLuhaLcukiIJDE3ma/cRNbJ2kXd7/H7wGJWd NKXuaDLEoQ/zLh3ZqU8Idz2CVwC+YNIuNlxgivsblcSaWUn/26QdBKfc9aoQ X-Gm-Gg: ASbGncs2CS5R/2FhGnZz7WKzqQOqm6g5HLcaV4DUh/EcxcAeSEUO/DpavthZDPuoPGP /ZvrUWW7derSeZlO5s4LPOOgRjDCnKkfeLCWNIFxufA105OzAVGbPK6KnEejCtky7cGE2xDOoaV p1zekrwGTBUqJrqljfzV39FfA/MKjgP9xk3oCzTVCNw/pU85q+CPWj4beavx/sSGBP1s/KPdu2a 1eljT8DLz41IPKXw/OKOTBhQBkb9pBcAUk7Rf2teReRy3akRgIiXFTdAZTRQrNlZHiipTDtGh6Y ifeRdZaHWHgArzBbdtsW8k13XQYmequX8J0BCvoZCOD4XQ== X-Google-Smtp-Source: AGHT+IHLsdwldUVtT72+0KCW67ZAr32woKdVpLiiHrNEJ202SOCU0qArbfrBNGq4LruYBqxg/+5aGw== X-Received: by 2002:a05:6102:41a8:b0:4ba:974c:891e with SMTP id ada2fe7eead31-4c30a67bb0dmr5259292137.17.1741465443568; Sat, 08 Mar 2025 12:24:03 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.24.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:24:02 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:21 -0500 Subject: [PATCH v4 09/12] platform/x86: alienware-wmi-wmax: Add a DebugFS interface Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-9-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add a debugfs interface which exposes thermal private data. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 90 ++++++++++++++++++++++= ++++ 1 file changed, 90 insertions(+) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platf= orm/x86/dell/alienware-wmi-wmax.c index 68ff520f016d2d567cddcefe41f01bf284b4d979..46d11b200820cdbaa841fc97e33= b339fca42104e 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 @@ -19,6 +20,7 @@ #include #include #include +#include #include #include #include "alienware-wmi.h" @@ -1252,6 +1254,92 @@ static int awcc_platform_profile_init(struct wmi_dev= ice *wdev) return PTR_ERR_OR_ZERO(priv->ppdev); } =20 +/* + * DebugFS + */ +static int awcc_debugfs_system_description_read(struct seq_file *seq, void= *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + + seq_printf(seq, "0x%08x\n", priv->system_description); + + return 0; +} + +static int awcc_debugfs_hwmon_data_read(struct seq_file *seq, void *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + const struct awcc_fan_data *fan; + unsigned int bit; + + seq_printf(seq, "Number of fans: %u\n", priv->fan_count); + seq_printf(seq, "Number of temperature sensors: %u\n\n", priv->temp_count= ); + + for (u32 i =3D 0; i < priv->fan_count; i++) { + fan =3D priv->fan_data[i]; + + seq_printf(seq, "Fan %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", fan->id); + seq_printf(seq, " Related temperature sensors bitmap: %lu\n", + fan->auto_channels_temp); + } + + seq_puts(seq, "\nTemperature sensor IDs:\n"); + for_each_set_bit(bit, priv->temp_sensors, AWCC_ID_BITMAP_SIZE) + seq_printf(seq, " 0x%02x\n", bit); + + return 0; +} + +static int awcc_debugfs_pprof_data_read(struct seq_file *seq, void *data) +{ + struct device *dev =3D seq->private; + struct awcc_priv *priv =3D dev_get_drvdata(dev); + + seq_printf(seq, "Number of thermal profiles: %u\n\n", priv->profile_count= ); + + for (u32 i =3D 0; i < PLATFORM_PROFILE_LAST; i++) { + if (!priv->supported_profiles[i]) + continue; + + seq_printf(seq, "Platform profile %u:\n", i); + seq_printf(seq, " ID: 0x%02x\n", priv->supported_profiles[i]); + } + + return 0; +} + +static void awcc_debugfs_remove(void *data) +{ + struct dentry *root =3D data; + + debugfs_remove(root); +} + +static void awcc_debugfs_init(struct wmi_device *wdev) +{ + struct dentry *root; + char name[64]; + + scnprintf(name, ARRAY_SIZE(name), "%s-%s", "alienware-wmi", dev_name(&wde= v->dev)); + root =3D debugfs_create_dir(name, NULL); + + debugfs_create_devm_seqfile(&wdev->dev, "system_description", root, + awcc_debugfs_system_description_read); + + if (awcc->hwmon) + debugfs_create_devm_seqfile(&wdev->dev, "hwmon_data", root, + awcc_debugfs_hwmon_data_read); + + if (awcc->pprof) + debugfs_create_devm_seqfile(&wdev->dev, "pprof_data", root, + awcc_debugfs_pprof_data_read); + + devm_add_action_or_reset(&wdev->dev, awcc_debugfs_remove, root); +} + static int alienware_awcc_setup(struct wmi_device *wdev) { struct awcc_priv *priv; @@ -1290,6 +1378,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 00:16:00 2025 Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6E25621519C; Sat, 8 Mar 2025 20:24:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465449; cv=none; b=XrdMYKzk0Jhp9lnRkEazB+DWW54zmqOyHUY5vQK8xh+iyhOXvUzW4RIcz8S52tMhpEs3OAl1JdE17lnK3+c7RxMZHozhU+5BB8LWb86CUaPOzAV6U4iiVlebM75MAGbe8QX3fQdetrH4dP0ExKNhmI0vf1JjaVMF9oWfdJwK2EU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465449; c=relaxed/simple; bh=7xu59QVIatBVpYJa1Dkam5LKCr4ecNWmwMnn1XOpgxM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VuX7di3jjBXRJI6VnLaWBVcixzBO+XkRDzPP15dmGiT4bjcngu1ljH2PDJAk1UyGowU3yWrtv6YTfh76BAX0xF/LCu79ktnFDOxj0ALf86ovLZCf9OMrFYLivKQGHzbPgTdug0Iu7tWJKLz+gRc3u4OHGol7055qfd4NM9AcWcQ= 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=JidbcH/h; arc=none smtp.client-ip=209.85.221.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JidbcH/h" Received: by mail-vk1-f172.google.com with SMTP id 71dfb90a1353d-5239e7d4f0aso2914108e0c.2; Sat, 08 Mar 2025 12:24:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465446; x=1742070246; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2yxTxBzVJ1jb8Memke4DOGdfoivqF5ZiHtqL+IiDifo=; b=JidbcH/hTMHIK379ALpn7oybwjhugSFeIpaEbpGyMupJ7aGRHQ4LgI2Fw91f8GR2T5 NGNyUc4cuTGASCnBn62mFIWj08VaCpUZi4AOJ8LnCOo0EumP3KpYLsHyI0qSUILVzqiH yDZ6CxbOp2mUdZXRLDhPfsuMrlcfWHS9UCgeJwJc1TPKKwEgkjIEbMXMpE675yuFo4NJ PLn6rcTmjP+tqzf8TQexEBsxUgeo1CYJ4Zp3uxWW6L2dHXr9bJMU2JDUrgigI2Vok3AY f0z9kPsOdI1ptaHGOlb7gsgu8s8+ddo6PZNKIiI41OffbdVJ5O7xe6bfy8ZcVliGv9il VfkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465446; x=1742070246; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2yxTxBzVJ1jb8Memke4DOGdfoivqF5ZiHtqL+IiDifo=; b=hx27S40S5zxBKt3ST7jvqN6EpmUTgVOIhSDk9Ui4cY8/0B4CcdyNkaqMQN/YYgmKjP RNoGWdRGU5mG0mq+yOmJI0KXbIAXF5bGWl048E19dbi0czc8ygp6SdoyHRvD+yCaQtIP kJsecJxlK2KNVqbUpK6aqNxj0RVCMfJ/ta3wLZYew2jR68Z4PWstJlGz9Xq61ULNBMWa OCADKxmI3r1dwF4D/nMrqn3KkOYYLJ6XuBwd59qZIB4tAdgJzZXE0NIl2Jmtkl7UaiTM +fL6LwyyfNezd9gWd4ifX10Z8noJ8x7SC88S8L3J7+N5zsUvqs7CbvORAJdXmhTzk5Yp +DTg== X-Forwarded-Encrypted: i=1; AJvYcCWQnGYuLUuUoSInE5/RYphVy8b09Boy30xWt7yki9axaZbDLBkTZ4rlOtIYzLh2whFlp43kTQAFFwz2EzI=@vger.kernel.org, AJvYcCX92p0G/SUolChDYAukgiFCpyYQ/7+M+daKYHH8vnp15QXvBK4k7zSgHe7/EC3LBb7ap81EECyNrmtAsCgZgAafh4DUVg==@vger.kernel.org X-Gm-Message-State: AOJu0YwDuwKJ/v+SyjtGCt3+tIiT1hp6sNIshJWgRg5vyf1f5tcCfQoh m0XfoPr0plZmmTmRBZhUpGv7ke4iBdj9fbrJCQhG4u0E2aXWxXGH X-Gm-Gg: ASbGncvDhXNieM89gPqYqtDRonLWZC1iiJ3sZWN9NxA0APoAsYSwgS+Mv4AhVKu1F0G 3W4A8wuj/+pQoeJvKQNFu/7PWWeM8v0HyI9G+ZC74Vh9hbFe4VFPkkME5PZAcaYf7V8ZEux6C3S tz3d4M8x7Pqxi2CjVfm0e+WmYbks9rahqBL4Ux3DVeWbSIL+trAhQYcQJ1nC7WQe+BhwepjhFtl KlCERtMfUgUmOsYbQUScDObYm/JkwJ3+rnybzu+RM+XB+3ltA0EKsH2bpGdF9U17hQe9OfeL+lQ 8ZMyUrCjBeHiz0Vl2fmCXZd/la/Yf6/VC9u8XIAcO53gSNcZDDnk7eMm X-Google-Smtp-Source: AGHT+IG1AjTfYKQW3sIVfJ770EWyrdjjUlxsp6oTNHF1791xiHDYHpJRv+86i3n+/BIUsakXEplM9Q== X-Received: by 2002:a05:6102:a49:b0:4bb:cbbc:38 with SMTP id ada2fe7eead31-4c30a538838mr4889494137.5.1741465446138; Sat, 08 Mar 2025 12:24:06 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.24.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:24:05 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:22 -0500 Subject: [PATCH v4 10/12] Documentation: wmi: Improve and update alienware-wmi documentation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-10-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Bagas Sanjaya X-Mailer: b4 0.14.2 Use tables to describe method operations instead of using pseudo-code. Drop unknown method descriptions to avoid redundancy. Drop GPIO section as it is currently irrelevant to this driver. Update Thermal_Information method documentation. Add one more helpful developer to the kudos section. Reviewed-by: Armin Wolf Reviewed-by: Bagas Sanjaya Signed-off-by: Kurt Borja --- Documentation/wmi/devices/alienware-wmi.rst | 383 +++++++++---------------= ---- 1 file changed, 117 insertions(+), 266 deletions(-) diff --git a/Documentation/wmi/devices/alienware-wmi.rst b/Documentation/wm= i/devices/alienware-wmi.rst index ddc5e561960e05fc7cffe700d7d278e32ff2e7b2..79238051b18bc5de9b502325017= cd5c5fcf41748 100644 --- a/Documentation/wmi/devices/alienware-wmi.rst +++ b/Documentation/wmi/devices/alienware-wmi.rst @@ -11,7 +11,7 @@ The WMI device WMAX has been implemented for many Alienwa= re and Dell's G-Series models. Throughout these models, two implementations have been identified.= The first one, used by older systems, deals with HDMI, brightness, RGB, amplif= ier and deep sleep control. The second one used by newer systems deals primari= ly -with thermal, overclocking, and GPIO control. +with thermal control and overclocking. =20 It is suspected that the latter is used by Alienware Command Center (AWCC)= to manage manufacturer predefined thermal profiles. The alienware-wmi driver @@ -69,9 +69,6 @@ data using the `bmfdec `_= utility: [WmiMethodId(164), Implemented, read, write, Description("Tobii Camera = Power Off.")] void TobiiCameraPowerOff([out] uint32 argr); }; =20 -Some of these methods get quite intricate so we will describe them using -pseudo-code that vaguely resembles the original ASL code. - Methods not described in the following document have unknown behavior. =20 Argument Structure @@ -87,175 +84,133 @@ ID 0xA0, the argument you would pass to the method is= 0xA001. Thermal Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 +WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------- + ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Get the number of temperature | - Byte 1: Fan = ID | +| | sensors related with a fan ID | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get the temperature sensor IDs | - Byte 1: Fan = ID | +| | related to a fan sensor ID | - Byte 2: Inde= x | ++--------------------+------------------------------------+---------------= -----+ + WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x01: - argr =3D 1 - - if BYTE_0(arg2) =3D=3D 0x02: - argr =3D SYSTEM_DESCRIPTION - - if BYTE_0(arg2) =3D=3D 0x03: - if BYTE_1(arg2) =3D=3D 0x00: - argr =3D FAN_ID_0 - - if BYTE_1(arg2) =3D=3D 0x01: - argr =3D FAN_ID_1 - - if BYTE_1(arg2) =3D=3D 0x02: - argr =3D FAN_ID_2 - - if BYTE_1(arg2) =3D=3D 0x03: - argr =3D FAN_ID_3 - - if BYTE_1(arg2) =3D=3D 0x04: - argr =3D SENSOR_ID_CPU | 0x0100 - - if BYTE_1(arg2) =3D=3D 0x05: - argr =3D SENSOR_ID_GPU | 0x0100 - - if BYTE_1(arg2) =3D=3D 0x06: - argr =3D THERMAL_MODE_QUIET_ID - - if BYTE_1(arg2) =3D=3D 0x07: - argr =3D THERMAL_MODE_BALANCED_ID - - if BYTE_1(arg2) =3D=3D 0x08: - argr =3D THERMAL_MODE_BALANCED_PERFORMANCE_ID - - if BYTE_1(arg2) =3D=3D 0x09: - argr =3D THERMAL_MODE_PERFORMANCE_ID - - if BYTE_1(arg2) =3D=3D 0x0A: - argr =3D THERMAL_MODE_LOW_POWER_ID - - if BYTE_1(arg2) =3D=3D 0x0B: - argr =3D THERMAL_MODE_GMODE_ID - - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x04: - if is_valid_sensor(BYTE_1(arg2)): - argr =3D SENSOR_TEMP_C - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x05: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_RPM() - - if BYTE_0(arg2) =3D=3D 0x06: - skip - - if BYTE_0(arg2) =3D=3D 0x07: - argr =3D 0 - - If BYTE_0(arg2) =3D=3D 0x08: - if is_valid_fan(BYTE_1(arg2)): - argr =3D 0 - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x09: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_UNKNOWN_STAT_0() - - else: - argr =3D 0xFFFFFFFF - - if BYTE_0(arg2) =3D=3D 0x0A: - argr =3D THERMAL_MODE_BALANCED_ID - - if BYTE_0(arg2) =3D=3D 0x0B: - argr =3D CURRENT_THERMAL_MODE() - - if BYTE_0(arg2) =3D=3D 0x0C: - if is_valid_fan(BYTE_1(arg2)): - argr =3D FAN_UNKNOWN_STAT_1() - else: - argr =3D 0xFFFFFFFF - -Operation 0x02 returns a *system description* buffer with the following -structure: - -:: - - out[0] -> Number of fans - out[1] -> Number of sensors - out[2] -> 0x00 - out[3] -> Number of thermal modes - -Operation 0x03 list all available fan IDs, sensor IDs and thermal profile -codes in order, but different models may have different number of fans and -thermal profiles. These are the known ranges: - -* Fan IDs: from 2 up to 4 -* Sensor IDs: 2 -* Thermal profile codes: from 1 up to 7 - -In total BYTE_1(ARG2) may range from 0x5 up to 0xD depending on the model. ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Unknown. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get system description number with | - None = | +| | the following structure: | = | +| | | = | +| | - Byte 0: Number of fans | = | +| | - Byte 1: Number of temperature | = | +| | sensors | = | +| | - Byte 2: Unknown | = | +| | - Byte 3: Number of thermal | = | +| | profiles | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x03 | List an ID or resource at a given | - Byte 1: Inde= x | +| | index. Fan IDs, temperature IDs, | = | +| | unknown IDs and thermal profile | = | +| | IDs are listed in that exact | = | +| | order. | = | +| | | = | +| | Operation 0x02 is used to know | = | +| | which indexes map to which | = | +| | resources. | = | +| | | = | +| | **Returns:** ID at a given index | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x04 | Get the current temperature for a | - Byte 1: Sens= or | +| | given temperature sensor. | ID = | ++--------------------+------------------------------------+---------------= -----+ +| 0x05 | Get the current RPM for a given | - Byte 1: Fan = ID | +| | fan. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x06 | Get fan speed percentage. (not | - Byte 1: Fan = ID | +| | implemented in every model) | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x07 | Unknown. | - Unknown = | ++--------------------+------------------------------------+---------------= -----+ +| 0x08 | Get minimum RPM for a given FAN | - Byte 1: Fan = ID | +| | ID. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x09 | Get maximum RPM for a given FAN | - Byte 1: Fan = ID | +| | ID. | = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0A | Get balanced thermal profile ID. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0B | Get current thermal profile ID. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x0C | Get current `boost` value for a | - Byte 1: Fan = ID | +| | given fan ID. | = | ++--------------------+------------------------------------+---------------= -----+ =20 WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x01: - if is_valid_thermal_profile(BYTE_1(arg2)): - SET_THERMAL_PROFILE(BYTE_1(arg2)) - argr =3D 0 - - if BYTE_0(arg2) =3D=3D 0x02: - if is_valid_fan(BYTE_1(arg2)): - SET_FAN_SPEED_MULTIPLIER(BYTE_2(arg2)) - argr =3D 0 - else: - argr =3D 0xFFFFFFFF - -.. note:: - While you can manually change the fan speed multiplier with this method, - Dell's BIOS tends to overwrite this changes anyway. ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Activate a given thermal profile. | - Byte 1: Ther= mal | +| | | profile ID = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Set a `boost` value for a given | - Byte 1: Fan = ID | +| | fan ID. | - Byte 2: Boos= t | ++--------------------+------------------------------------+---------------= -----+ =20 These are the known thermal profile codes: =20 -:: ++------------------------------+----------+------+ +| Thermal Profile | Type | ID | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D+ +| Custom | Special | 0x00 | ++------------------------------+----------+------+ +| G-Mode | Special | 0xAB | ++------------------------------+----------+------+ +| Quiet | Legacy | 0x96 | ++------------------------------+----------+------+ +| Balanced | Legacy | 0x97 | ++------------------------------+----------+------+ +| Balanced Performance | Legacy | 0x98 | ++------------------------------+----------+------+ +| Performance | Legacy | 0x99 | ++------------------------------+----------+------+ +| Balanced | USTT | 0xA0 | ++------------------------------+----------+------+ +| Balanced Performance | USTT | 0xA1 | ++------------------------------+----------+------+ +| Cool | USTT | 0xA2 | ++------------------------------+----------+------+ +| Quiet | USTT | 0xA3 | ++------------------------------+----------+------+ +| Performance | USTT | 0xA4 | ++------------------------------+----------+------+ +| Low Power | USTT | 0xA5 | ++------------------------------+----------+------+ =20 - CUSTOM 0x00 +If a model supports the User Selectable Thermal Tables (USTT) profiles, it= will +not support the Legacy profiles and vice-versa. =20 - BALANCED_USTT 0xA0 - BALANCED_PERFORMANCE_USTT 0xA1 - COOL_USTT 0xA2 - QUIET_USTT 0xA3 - PERFORMANCE_USTT 0xA4 - LOW_POWER_USTT 0xA5 - - QUIET 0x96 - BALANCED 0x97 - BALANCED_PERFORMANCE 0x98 - PERFORMANCE 0x99 - - GMODE 0xAB - -Usually if a model doesn't support the first four profiles they will suppo= rt -the User Selectable Thermal Tables (USTT) profiles and vice-versa. - -GMODE replaces PERFORMANCE in G-Series laptops. +Every model supports the CUSTOM (0x00) thermal profile. GMODE replaces +PERFORMANCE in G-Series laptops. =20 WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 -:: - - if BYTE_0(arg2) =3D=3D 0x1: - TOGGLE_GAME_SHIFT() - argr =3D GET_GAME_SHIFT_STATUS() - - if BYTE_0(arg2) =3D=3D 0x2: - argr =3D GET_GAME_SHIFT_STATUS() ++--------------------+------------------------------------+---------------= -----+ +| Operation (Byte 0) | Description | Arguments = | ++=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D+=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D+ +| 0x01 | Toggle *Game Shift*. | - None = | ++--------------------+------------------------------------+---------------= -----+ +| 0x02 | Get *Game Shift* status. | - None = | ++--------------------+------------------------------------+---------------= -----+ =20 Game Shift Status does not change the fan speed profile but it could be so= me sort of CPU/GPU power profile. Benchmarks have not been done. @@ -267,131 +222,27 @@ Thermal_Information does not list it. G-key on Dell's G-Series laptops also changes Game Shift status, so both a= re directly related. =20 -WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0x1: - if is_valid_fan(BYTE_1(arg2)): - argr =3D 1 - else: - argr =3D 0 - - if BYTE_0(arg2) =3D=3D 0x2: - if is_valid_fan(BYTE_1(arg2)): - if BYTE_2(arg2) =3D=3D 0: - argr =3D=3D SENSOR_ID - else - argr =3D=3D 0xFFFFFFFF - else: - argr =3D 0 - Overclocking Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -.. warning:: - These methods have not been tested and are only partially reverse - engineered. - -WMI method Return_OverclockingReport([out] uint32 argr) -------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - -WMI method Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - -WMI method Clear_OCFailSafeFlag([out] uint32 argr) --------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr =3D 0 - -CSMI is an unknown operation. - - WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- =20 AWCC supports memory overclocking, but this method is very intricate and h= as not been deciphered yet. =20 -GPIO methods -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - -These methods are probably related to some kind of firmware update system, -through a GPIO device. - -.. warning:: - These methods have not been tested and are only partially reverse - engineered. - -WMI method FWUpdateGPIOtoggle([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0: - if BYTE_1(arg2) =3D=3D 1: - SET_PIN_A_HIGH() - else: - SET_PIN_A_LOW() - - if BYTE_0(arg2) =3D=3D 1: - if BYTE_1(arg2) =3D=3D 1: - SET_PIN_B_HIGH() - - else: - SET_PIN_B_LOW() - - else: - argr =3D 1 - -WMI method ReadTotalofGPIOs([out] uint32 argr) ----------------------------------------------- - -:: - - argr =3D 0x02 - -WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- - -:: - - if BYTE_0(arg2) =3D=3D 0: - argr =3D PIN_A_STATUS - - if BYTE_0(arg2) =3D=3D 1: - argr =3D PIN_B_STATUS - Other information Methods =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D =20 WMI method ReadChassisColor([out] uint32 argr) ---------------------------------------------- =20 -:: - - argr =3D CHASSIS_COLOR_ID +Returns the chassis color internal ID. =20 Acknowledgements =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -Kudos to `AlexIII `_ for documenting -and testing available thermal profile codes. +Kudos to `AlexIII `_ and +`T-Troll `_ for documenting and +testing some of this device's functionality, making it possible to general= ize +this driver. --=20 2.48.1 From nobody Thu Dec 18 00:16:00 2025 Received: from mail-ua1-f41.google.com (mail-ua1-f41.google.com [209.85.222.41]) (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 9CD4620F07F; Sat, 8 Mar 2025 20:24:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465452; cv=none; b=EiZNXNf2scR99JPYSIqXbvn0/0adluwf5MtYHCMsOIYZBoyBgfJOZiGgMHFFnLCAc3h12aE3y+2FrCOs90s2y45v0m3fXKggjf9jqXzTricX7zY9T5wqHj9bHEemL4pwtv0DiDO3Y6npSTQbW++i2MoEruKfnrPKuBdBnbQDfrw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465452; c=relaxed/simple; bh=MoPrepwlxFP7fxNo2DLCr3NelEfkZ6jBFL4xdaXEdkY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jbFTvt1YdRr2tzco20tW4/FCWDmB69WRXco3mXi89f2GF76u5bAlFHyIfsxu3+MRhAh5hHGFP95GipbQCFoGntKyeUc7y3t1c8GmFH7I1VbHHo3iFqYIwIp2SWzhCvRQopGkN078S5VPQbkbA3+cBIgnR0XLq0/VkBhqya0nq/8= 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=Ux3IVU9K; arc=none smtp.client-ip=209.85.222.41 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="Ux3IVU9K" Received: by mail-ua1-f41.google.com with SMTP id a1e0cc1a2514c-86b9ea43955so1212699241.2; Sat, 08 Mar 2025 12:24:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465448; x=1742070248; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=pxF8GLhZE/ZzjWGUIeAK3xtzKENLRNdEpz9w1JFOH84=; b=Ux3IVU9KseyXxSr8HKjOsSLw/Xt4sNxfOUw8YxMxw9OMo7pIWZW41YxhVu4a2V+jcv R4z4Pnw/pkAMV3JiYRwFQxrxgVy59g0GA9t53lIB2NjKzD43bnygsCC0zUKlQMixgG1u 5dDe6G51KxzNtZr8Ee6n9V2HvypokkPWghbqwmQiWtkAXv1gt/PcGhk0/OtiUCcAxvV2 W0APERBDglfyRLlMITipp39DjJ/PwRhSOZerKdMl0LxrdLdvwgWlyKXUdrjvx386rjr3 BdGDH9lH7pI59qHkWUwr1HdQh3EpsJ1eLAHaQJUpu8Vt/X5NwIELVfB38XAQlryDH/So Dqqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465448; x=1742070248; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pxF8GLhZE/ZzjWGUIeAK3xtzKENLRNdEpz9w1JFOH84=; b=ZbQVdGBvME6Rwvs5Fdt7Q1/jSibJ85J2ZAJFxmMoswa7JlF/4ZVl96JH53NQrBQ9A6 4w07438S2DB+eSpsVz67ozna5AJ2PqGW6k546TiPaNT8Em+navnCFJBegAe0zGppMJZ9 owDG/xhehwpVcvFn0nk2innaW/wUOvY/uLgWYoFHU2u7WcygfWju3VzvT1zXUm7x4T1J usjnWD4KE1cK5EfqPsdxSXCK0bsOWu5FuTxRSu0CSa9jCgD9FZYdOaoQLpz8l8Cm/8/s UH3oIynXkmpS8g2QlLC9jvsWuRCaKldyBSAbUeqygxbr+fdCKFevl4xaCFowq6/Nipxj 7mmQ== X-Forwarded-Encrypted: i=1; AJvYcCU/pA0cL3orx1ydDwW7Cz2AGkg+UGVGCu+5rI/BkGQ1vrUkxOQqJgOY5lUaTNgh5nxtbpsLOtqFq85gUwzst4Ib7vdI/g==@vger.kernel.org, AJvYcCUqpFDsi5jOnX3kWsqWh6mhXounKC3zg3Ukvfps64sGCQ9sA/F1clWmS6mAlURRUj9Pk9Ynb2q6NvCmXKI=@vger.kernel.org X-Gm-Message-State: AOJu0YwV78HRzRJpVYAIuYT2utIJvjrE9h77laglUMMT8vW6W/29M1Ou 2HwGEV8AVM5yp8tULjkRFc7Wsw5KMjck3yiTBNrVJBbsNmpnYzEXUZn5Eeal X-Gm-Gg: ASbGncvf+Uz9EFVHh0fZFcrASRdSiREBpwYJpdaJXbLfKEf7xGksNJ06Y/job4qNZKK RrnfCOYIDjDIQCjGq/RsFiWzhXWcUs7gsWQjp/SJ2fxwU/Jehsdls9aGxJ6jkpy847h4VeFhAs8 0UVKTJ0p46d1bhXzmG8zJiRDF7T2ToCRFTtfiDBr6oIJiS7TsKAWn3n5NQ121fxdHst1/ccLaC7 nx9hwFKQGjo8bqgEC3aiTO8Upyv6/Qb5PQR4unj8LLednB7t+CTOjXUGyL142ZUeuOMLa5lZGAY sNYd5yh40YBHAl0fcSXcwP4otEF51mVMJ86gm53BtHn8xw== X-Google-Smtp-Source: AGHT+IFK2mD2IHi0uBizwggdYKuNDNbiZBkIQfBP8NEpOvWNB3OKqc8VEeBS49AergoeRP5WDz4HMQ== X-Received: by 2002:a05:6102:578f:b0:4bb:e8c5:b172 with SMTP id ada2fe7eead31-4c30a5e4f1fmr6342854137.8.1741465448013; Sat, 08 Mar 2025 12:24:08 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.24.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:24:07 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:23 -0500 Subject: [PATCH v4 11/12] Documentation: admin-guide: laptops: Add documentation for alienware-wmi Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-11-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add driver admin-guide documentation for the alienware-wmi driver. Signed-off-by: Kurt Borja --- .../admin-guide/laptops/alienware-wmi.rst | 128 +++++++++++++++++= ++++ Documentation/admin-guide/laptops/index.rst | 1 + MAINTAINERS | 1 + 3 files changed, 130 insertions(+) diff --git a/Documentation/admin-guide/laptops/alienware-wmi.rst b/Document= ation/admin-guide/laptops/alienware-wmi.rst new file mode 100644 index 0000000000000000000000000000000000000000..fa3980de77fa457ea431b20c513= 1d7c59a836419 --- /dev/null +++ b/Documentation/admin-guide/laptops/alienware-wmi.rst @@ -0,0 +1,128 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Alienware WMI Driver +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Kurt Borja + +This is a driver for the "WMAX" WMI device, which is found in most Dell ga= ming +laptops and controls various special features. + +Before the launch of M-Series laptops (~2018), the "WMAX" device controlled +basic RGB lighting, deep sleep mode, HDMI mode and amplifier status. + +Later, this device was completely repurpused. Now it mostly deals with the= rmal +profiles, sensor monitoring and overclocking. This interface is named "AWC= C" and +is known to be used by the AWCC OEM application to control these features. + +The alienware-wmi driver controls both interfaces. + +AWCC Interface +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +WMI device Documentation: Documentation/wmi/devices/alienware-wmi.rst + +Supported devices +----------------- + +- Alienware M-Series laptops +- Alienware X-Series laptops +- Alienware Aurora Desktops +- Dell G-Series laptops + +If you believe your device supports the AWCC interface and you don't have = any of +the features described in this document, try the following alienware-wmi m= odule +parameters: + +- ``force_platform_profile=3D1``: Forces probing for platform profile supp= ort +- ``force_hwmon=3D1``: Forces probing for HWMON support + +If the module loads successfully with these parameters, consider submittin= g a +patch adding your model to the ``awcc_dmi_table`` located in +``drivers/platform/x86/dell/alienware-wmi-wmax.c`` or contacting the maint= ainer +for further guidance. + +Status +------ + +The following features are currently supported: + +- :ref:`Platform Profile `: + + - Thermal profile control + + - G-Mode toggling + +- :ref:`HWMON `: + + - Sensor monitoring + + - Manual fan control + +.. _platform-profile: + +Platform Profile +---------------- + +The AWCC interface exposes various firmware defined thermal profiles. We e= xpose +these profiles to user-space through the Platform Profile class interface. +Refer to +:ref:`sysfs-class-platform-profile ` +for more information. + +The name of the platform-profile class device exported by this driver is +"alienware-wmi" and it's path can be found with: + +:: + + grep -l "alienware-wmi" /sys/class/platform-profile/platform-profile-*/na= me | sed 's|/[^/]*$||' + +If the device supports G-Mode, it is also toggled when selecting the +``performance`` profile. + +.. note:: + You may set the ``force_gmode`` module parameter to always try to toggl= e this + feature, without checking if your model supports it. + +.. _hwmon: + +HWMON +----- + +The AWCC interface also supports sensor monitoring and manual fan control.= Both +of these features are exposed to user-space through the HWMON interface. + +The name of the hwmon class device exported by this driver is "alienware_w= mi" +and it's path can be found with: + +:: + + grep -l "alienware_wmi" /sys/class/hwmon/hwmon*/name | sed 's|/[^/]*$||' + +Sensor monitoring is done through the standard HWMON interface. Refer to +:ref:`sysfs-class-hwmon ` for more +information. + +Manual fan control on the other hand, is not exposed directly by the AWCC +interface. Instead it let's us control a fan `boost` value. This `boost` v= alue +has the following aproximate behavior over the fan pwm: + +:: + + pwm =3D pwm_base + (fan_boost / 255) * (pwm_max - pwm_base) + +Due to the above behavior, we expose the fan `boost` control to user-space +through the following, custom hwmon sysfs attribute: + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +Name Perm Description +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D +fan[1-4]_boost RW Fan boost value. + + Integer value between 0 and 255 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D + +.. note:: + In some devices, manual fan control only works reliably, if the ``custo= m`` + platform profile is selected. diff --git a/Documentation/admin-guide/laptops/index.rst b/Documentation/ad= min-guide/laptops/index.rst index e71c8984c23e43ca7cd6373b88803354dff6bc60..db842b629303c1bcf02646204d5= 1938f9bd4043e 100644 --- a/Documentation/admin-guide/laptops/index.rst +++ b/Documentation/admin-guide/laptops/index.rst @@ -7,6 +7,7 @@ Laptop Drivers .. toctree:: :maxdepth: 1 =20 + alienware-wmi asus-laptop disk-shock-protection laptop-mode diff --git a/MAINTAINERS b/MAINTAINERS index 1afd30d00aecf9a48f8c71e156affd5f329539bd..c609bc321b8dc3ab0e8d92b04e4= 2483be8cc171c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -796,6 +796,7 @@ M: Kurt Borja L: platform-driver-x86@vger.kernel.org L: Dell.Client.Kernel@dell.com S: Maintained +F: Documentation/admin-guide/laptops/alienware-wmi.rst F: Documentation/wmi/devices/alienware-wmi.rst F: drivers/platform/x86/dell/alienware-wmi* =20 --=20 2.48.1 From nobody Thu Dec 18 00:16:00 2025 Received: from mail-ua1-f44.google.com (mail-ua1-f44.google.com [209.85.222.44]) (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 EA189215F45; Sat, 8 Mar 2025 20:24:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465453; cv=none; b=hEmywRJ+mmLb2hCN5hLyOdsk9zwwIaqCRpI3cwjdU+CjsQ/5iy8258vPqXBVGHqj0HdlLiFe1hXRlpkKJINbKPLagClGeutUHXydvKcJVLY23IarNzpPuRkIfLI50XXbzzqPGj1oUju1pGnlKU5j6Ohhzxh9hHfRfN3wa9bmtlM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741465453; c=relaxed/simple; bh=snnBzgnx45BY551HJwZzSOCPAMvggCW5QA2j4ofGGwo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WlwB4o3fkS/dHlPuFceD2GO4faRLx0FyyAvcymhEU3HfYma3xBY8CrrX6jHyYMg/kokSyEGwPzy8EITntOSWYTVf+Ml39sBQ4gG5MXvGEtTZDivwaPADAINIzr01Dnddrne3VJnjG+PM642oX133/EHOylBCxaIoBs3VfT0xjr4= 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=VFZ91m69; arc=none smtp.client-ip=209.85.222.44 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="VFZ91m69" Received: by mail-ua1-f44.google.com with SMTP id a1e0cc1a2514c-868da0af0fcso1266839241.2; Sat, 08 Mar 2025 12:24:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741465450; x=1742070250; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Ow5M59Yec7VakUaC2tNDYbZogIjsAYrtW+Ao/807hoI=; b=VFZ91m69YKv07U8vx0aLwBjutoxWbyxU89VYXnhIKy2OlbTw8q6nA+ThKK9BjbZb+9 v8EyLq7BtN8lmTMs6drCb85z/rsUgN/KeHaL0z4g6ivHl7JAgOpiaJzyJC7nORYN1/ak gHMLbK+1cr2Hoonj1Jyqg9mwPR5wFd0Cl18TsJ8Y7ACVIk45+5gRiCHfQqc8Z0RUPUoZ pDKci/6afYztR83R1JxNyFerw6uNa4MK9uw/e8fRzl0hwcpn8u3ZixqqhrdGQZazwzCF gfcnvSKxse9WFA4Fmv8OhjtBOtRw8+qCXoFtbYo/gigWLFyPCjVedddUqETWglo2im8U BWKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741465450; x=1742070250; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Ow5M59Yec7VakUaC2tNDYbZogIjsAYrtW+Ao/807hoI=; b=KaS5bUcpAZG7lk3NGAyL39imAVYEPpDIU3LKPSoGyiQEN7B+pVqh0200nujKbOmGxA 5d3Ud8Hdh5T9n+0RV7uQqA0zbRXhnTK/cu7fR7kPg6Mhz4Sb0V46tQDZHqGgwYwnFVUG qjux4G9G0DIn37zaW0ZGSARXgJMG3nw9MyHLiavypGQQ2u+boawu0U0ZbuDw1iyDsndw D9D7sa9UZeAjWqFZDKdUJatVB8fERkE4GNWW14JyKmhcbw6GAb08DYtVsEtQNUMBJ3G+ dhnduWovAm403K9X+XlPD4j3+FchwEtCE2XVY4wWsdljxCwKwkbdrf1pZ/bnpudBSUif X7fQ== X-Forwarded-Encrypted: i=1; AJvYcCUAgpPBmdLaoBmqbtObCZEgwG1xmxR6BwAtOPeeBF2NVYVPx+YtKRqy+h3C/GjD5GVpAtb96YRE3jzJW0Ou3qbZ8Apivw==@vger.kernel.org, AJvYcCWo7lydupXgZXzhp9YcANDpmqFxazL9j8JyatPs2ZApTrGaYloh/b4A/gUwQ8nn4rL13vIqFl183z7wwa0=@vger.kernel.org X-Gm-Message-State: AOJu0Yw/3PZmUP0adHXrrEyNl5TxQUxkgC6sidb1jnZbCe4E4eOoPPDc QxWsBVGwNgjXHOPhoX3RswHK3ul5zAzqiygjAsrAU0awh6CM+kANE1sUV2pr X-Gm-Gg: ASbGnctJk182J7gNFJlmHbZJh4zAj8zf5PBNgJq/v2ubBtj/6q6PlPVYSrSCjGu3nVP 16gjZ7yfl6klacCK6adbBYmzpXBqXmyro5Pn6rQc5Olgyl8kBifeba9KK7rnNdZpZXOSu50JAW2 vrzoj0L8yjN7GHBSH/whN60mdxYvWjeUgHIQyXK3TgP2tseBqHlP+/Y8/oMc88M7Y1nEeqnXKif CT5D9OwV4Z8TMQIH1S5BsTPMcRjilk5cePtfY0cD/yf97Q7CYTncYE9nEl0Xmzl2n+SzL/y+kQI ZuReYvsHQXPSkxmg3yGtwdRpb2999AWKt1xyceocB4DSTw== X-Google-Smtp-Source: AGHT+IFO85emDTfPho8prBm8xs9uwG0lLdsuCN5KLhw+N2n245bKg/jWnqZDJLtaPENR17SSmgAJhg== X-Received: by 2002:a05:6102:9d0:b0:4c2:20d3:a125 with SMTP id ada2fe7eead31-4c30a5aa387mr6067763137.8.1741465450457; Sat, 08 Mar 2025 12:24:10 -0800 (PST) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-4c2fb452a47sm1281061137.8.2025.03.08.12.24.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 08 Mar 2025 12:24:09 -0800 (PST) From: Kurt Borja Date: Sat, 08 Mar 2025 15:23:24 -0500 Subject: [PATCH v4 12/12] Documentation: ABI: Add sysfs platform and debugfs ABI documentation for alienware-wmi Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250308-hwm-v4-12-afa1342828f5@gmail.com> References: <20250308-hwm-v4-0-afa1342828f5@gmail.com> In-Reply-To: <20250308-hwm-v4-0-afa1342828f5@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add ABI description for the alienware-wmi driver. Signed-off-by: Kurt Borja --- Documentation/ABI/testing/debugfs-alienware-wmi | 44 ++++++++++++++++++= ++++ .../ABI/testing/sysfs-platform-alienware-wmi | 14 +++++++ MAINTAINERS | 2 + 3 files changed, 60 insertions(+) diff --git a/Documentation/ABI/testing/debugfs-alienware-wmi b/Documentatio= n/ABI/testing/debugfs-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..48cfd4d0b002efd7b68d9c1d3aa= 91a3a05f49db5 --- /dev/null +++ b/Documentation/ABI/testing/debugfs-alienware-wmi @@ -0,0 +1,44 @@ +What: /sys/kernel/debug/alienware-wmi-/system_description +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes the raw ``system_description`` number reported + by the WMAX device. + + Only present on devices with the AWCC interface. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO + +What: /sys/kernel/debug/alienware-wmi-/hwmon_data +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes HWMON private data. + + Includes fan sensor count, temperature sensor count, internal + fan IDs and internal temp IDs. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO + +What: /sys/kernel/debug/alienware-wmi-/pprof_data +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes Platform Profile private data. + + Includes internal mapping to platform profiles and thermal + profile IDs. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + RO diff --git a/Documentation/ABI/testing/sysfs-platform-alienware-wmi b/Docum= entation/ABI/testing/sysfs-platform-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..4877b3745f4e5b503376d375bf4= 8464250328ce2 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-platform-alienware-wmi @@ -0,0 +1,14 @@ +What: /sys/class/hwmon/hwmonX/fanY_boost +Date: March 2025 +KernelVersion: 6.15 +Contact: Kurt Borja +Description: + This file exposes fan boost control for Dell gaming laptops with + the AWCC WMI interface. + + See Documentation/admin-guide/laptops/alienware-wmi.rst for + details. + + Integer value in the range 0 to 255 + + RW diff --git a/MAINTAINERS b/MAINTAINERS index c609bc321b8dc3ab0e8d92b04e42483be8cc171c..faa377126bda0b9c848760495dc= 893982f3a4c3a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -796,6 +796,8 @@ M: Kurt Borja L: platform-driver-x86@vger.kernel.org L: Dell.Client.Kernel@dell.com S: Maintained +F: Documentation/ABI/testing/debugfs-alienware-wmi +F: Documentation/ABI/testing/sysfs-platform-alienware-wmi F: Documentation/admin-guide/laptops/alienware-wmi.rst F: Documentation/wmi/devices/alienware-wmi.rst F: drivers/platform/x86/dell/alienware-wmi* --=20 2.48.1