From patchwork Thu Mar 13 14:29:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015199 Received: from mail-yw1-f179.google.com (mail-yw1-f179.google.com [209.85.128.179]) (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 09415268C4B; Thu, 13 Mar 2025 14:30:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876220; cv=none; b=AEI8EEQj6B/vfCA1Nd6VxZc7ymYSK/IAf4KpaH9wix5Xz8PR9BEzLGDutA7eyoekrjLCm6qzgdWAdYbXLzWX56MxKELQPhxby44UUI+cblZ1dhLrP59D+ExPyPocKlGv58yjUdJ+m7eg6m0m9dnJ9zcoqetmRrUUy+QzxAbatVg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876220; c=relaxed/simple; bh=W3245L2StKIvemIozL1BX/WJzgLB3uNjsg77Bwf+aQc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J1IDf4MwaHIerm7+g5Z3VigDo0K/lUBdUJPM6WNL/g0mf96m9ljutdRO17IQlFHiGG9IwG3vny3YiH3cWXQnqrTIny4eeM8jCk2Gou0ZbcDFd43QydE4ooCVHvY5muWPJ+SQCsUUTli/YkC3ef2MzfK2oUPMi72fpH4a1cV/glY= 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=Sg0Wo1WZ; arc=none smtp.client-ip=209.85.128.179 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="Sg0Wo1WZ" Received: by mail-yw1-f179.google.com with SMTP id 00721157ae682-6ef60e500d7so9211177b3.0; Thu, 13 Mar 2025 07:30:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876214; x=1742481014; 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=Sg0Wo1WZWb3LuHFAepH8uL31hpqbMb4A2md8WJaIlDzTdihBGuktnV8YlrbY3i5z8g CNBS31imSGJKw0lEb4HTjcEh+3EjQdH/RneWNRV0+W0n3MUQ8P+Wd3UT03dXX3sJodIp gRofwWbctMuzAT8oz2tLeS6s9BKVJH/yVsuVcbykmTIFwk7jMChk3NcK2DV3uXO1Gmq5 EpQFbXn3cCFm6/G388cMGFibyPQFtJMjtBdHiW4XJwHYc98gue1n8DB2xnAJfiLoso7D DIcy76X3HFeuOMm24tCh/H3jjJR4TW5Q3kHYUe+5auDSDyxGQEHGYem+7L5Eom0W4z7T vbEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876214; x=1742481014; 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=WW94V4ob9CFqJltLnjUH0EY9ghasCEfnvNGdEAyuDrbjKeQLlm31egMQEl3T4Zig55 BYqMJJu8mhgl05YzQcj0AS0X0MFRXbNCG/ZiRjos8PAdC1AhqSu+x4N/9RMDxzRyt6R2 Dbq5EBp16emXAmTLSMMs2mwK7tmPpIhLAzN50fAY2qYDoZWwmsy/q0B7+VkVsbpwSn7r 4+rsOoJkiDtU5vPHe5WGzUT9TFl813nBISQJv+daoHVgPj5tmbR9MMq3PT1kNC9+jBrR 7NS0vgvKrwHfFnVVqxedEDC587olGsvmLTG3ONE742wx7cT/4qpbf++3efaJMlLjSf5p xwPg== X-Forwarded-Encrypted: i=1; AJvYcCU8zcqm/ZSwrE2+LBMMvd21QANFCIqKEh8QqrtYYq1YNp+2MumIwN6uECEdREV2nOPjm15itTOcCcp9yK6SxyEp8J6GRQ==@vger.kernel.org, AJvYcCUCDwis2GGF8jIr1+OJ59LHNNfr94CsZmiHZNIaLe5RxUEOab5G3CIMIU+x+bdJPUcq5rx4dRDYjPkA+o8=@vger.kernel.org X-Gm-Message-State: AOJu0YyLZA/1mbgrhR8stSiBWwZxRwCfYZaTX4EKajqebjFUlpmyn9Uq XnA5IGpYvIXavjHcS+sdvOhnTdipDKz+Ac8oG0wKJgGxOvnMcFCyuK8OnmT2 X-Gm-Gg: ASbGnctUySVuKnrU+zSeU8uZDRQoQp0IESKx0XYUGY14fzWqknZugVhc5/a/Yfizp2w 9WGflc2rd+w5758/yyWAwTb9u2QVpdPolXdBbwgChRGw7yeYiwepYo420jQniTVOxj83qtrB31L yYOhOUYMgQBrceQAGz3I3UaA3B9cJUVr8L1mDooR8j+1IaHbNjy0lQj3inbNDxpO83BY+2I/8Io Oied1KVgn+md4DWNaDpdqeBhTOcOnXYpaRHW0vGVL/9K+kTbEm+vIVdnmPcvdZyp1whPumBCnT/ GLJt3sCeOv0GCGllQJgm6jlIOubiVGwE/5XummufV5Y8ug== X-Google-Smtp-Source: AGHT+IG9DOxtvMZjpc2ltg4cqDkbnmfrf9htT/NdI9q0ABW9VcK1Bmyrr0vwn6or0GIVJolHQQZvDQ== X-Received: by 2002:a05:6902:218c:b0:e60:9fd4:bdb9 with SMTP id 3f1490d57ef6-e63b5233a43mr15883903276.44.1741876213635; Thu, 13 Mar 2025 07:30:13 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:13 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:29:56 -0500 Subject: [PATCH v6 01/12] platform/x86: alienware-wmi-wmax: Rename thermal related symbols Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-1-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index 3d3014b5adf046c94c1ebf39a0e28a92622b40d6..ed70e12d73d7fe5d89f3364c5367820bf47e3c1e 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 -#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 -#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) 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 = { }, }; -enum WMAX_THERMAL_INFORMATION_OPERATIONS { - WMAX_OPERATION_SYS_DESCRIPTION = 0x02, - WMAX_OPERATION_LIST_IDS = 0x03, - WMAX_OPERATION_CURRENT_PROFILE = 0x0B, +enum AWCC_THERMAL_INFORMATION_OPERATIONS { + AWCC_OP_GET_SYSTEM_DESCRIPTION = 0x02, + AWCC_OP_GET_RESOURCE_ID = 0x03, + AWCC_OP_GET_CURRENT_PROFILE = 0x0B, }; -enum WMAX_THERMAL_CONTROL_OPERATIONS { - WMAX_OPERATION_ACTIVATE_PROFILE = 0x01, +enum AWCC_THERMAL_CONTROL_OPERATIONS { + AWCC_OP_ACTIVATE_PROFILE = 0x01, }; -enum WMAX_GAME_SHIFT_STATUS_OPERATIONS { - WMAX_OPERATION_TOGGLE_GAME_SHIFT = 0x01, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS = 0x02, +enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { + AWCC_OP_TOGGLE_GAME_SHIFT = 0x01, + AWCC_OP_GET_GAME_SHIFT_STATUS = 0x02, }; -enum WMAX_THERMAL_TABLES { - WMAX_THERMAL_TABLE_BASIC = 0x90, - WMAX_THERMAL_TABLE_USTT = 0xA0, +enum AWCC_THERMAL_TABLES { + AWCC_THERMAL_TABLE_LEGACY = 0x90, + AWCC_THERMAL_TABLE_USTT = 0xA0, }; -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, }; 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_LAST]; }; -static const enum platform_profile_option wmax_mode_to_platform_profile[THERMAL_MODE_LAST] = { - [THERMAL_MODE_USTT_BALANCED] = PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_USTT_BALANCED_PERFORMANCE] = PLATFORM_PROFILE_BALANCED_PERFORMANCE, - [THERMAL_MODE_USTT_COOL] = PLATFORM_PROFILE_COOL, - [THERMAL_MODE_USTT_QUIET] = PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_USTT_PERFORMANCE] = PLATFORM_PROFILE_PERFORMANCE, - [THERMAL_MODE_USTT_LOW_POWER] = PLATFORM_PROFILE_LOW_POWER, - [THERMAL_MODE_BASIC_QUIET] = PLATFORM_PROFILE_QUIET, - [THERMAL_MODE_BASIC_BALANCED] = PLATFORM_PROFILE_BALANCED, - [THERMAL_MODE_BASIC_BALANCED_PERFORMANCE] = PLATFORM_PROFILE_BALANCED_PERFORMANCE, - [THERMAL_MODE_BASIC_PERFORMANCE] = PLATFORM_PROFILE_PERFORMANCE, +static const enum platform_profile_option awcc_mode_to_platform_profile[AWCC_PROFILE_LAST] = { + [AWCC_PROFILE_USTT_BALANCED] = PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_USTT_BALANCED_PERFORMANCE] = PLATFORM_PROFILE_BALANCED_PERFORMANCE, + [AWCC_PROFILE_USTT_COOL] = PLATFORM_PROFILE_COOL, + [AWCC_PROFILE_USTT_QUIET] = PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_USTT_PERFORMANCE] = PLATFORM_PROFILE_PERFORMANCE, + [AWCC_PROFILE_USTT_LOW_POWER] = PLATFORM_PROFILE_LOW_POWER, + [AWCC_PROFILE_LEGACY_QUIET] = PLATFORM_PROFILE_QUIET, + [AWCC_PROFILE_LEGACY_BALANCED] = PLATFORM_PROFILE_BALANCED, + [AWCC_PROFILE_LEGACY_BALANCED_PERFORMANCE] = PLATFORM_PROFILE_BALANCED_PERFORMANCE, + [AWCC_PROFILE_LEGACY_PERFORMANCE] = PLATFORM_PROFILE_PERFORMANCE, }; static struct awcc_quirks *awcc; @@ -444,26 +445,26 @@ const struct attribute_group wmax_deepsleep_attribute_group = { * 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; - if ((code & WMAX_THERMAL_MODE_MASK) >= THERMAL_MODE_LAST) + if ((code & AWCC_THERMAL_MODE_MASK) >= AWCC_PROFILE_LAST) return false; - if ((code & WMAX_THERMAL_TABLE_MASK) == WMAX_THERMAL_TABLE_BASIC && - (code & WMAX_THERMAL_MODE_MASK) >= THERMAL_MODE_BASIC_QUIET) + if ((code & AWCC_THERMAL_TABLE_MASK) == AWCC_THERMAL_TABLE_LEGACY && + (code & AWCC_THERMAL_MODE_MASK) >= AWCC_PROFILE_LEGACY_QUIET) return true; - if ((code & WMAX_THERMAL_TABLE_MASK) == WMAX_THERMAL_TABLE_USTT && - (code & WMAX_THERMAL_MODE_MASK) <= THERMAL_MODE_USTT_LOW_POWER) + if ((code & AWCC_THERMAL_TABLE_MASK) == AWCC_THERMAL_TABLE_USTT && + (code & AWCC_THERMAL_MODE_MASK) <= AWCC_PROFILE_USTT_LOW_POWER) return true; return false; } -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 = { @@ -474,21 +475,21 @@ static int wmax_thermal_information(struct wmi_device *wdev, u8 operation, }; int ret; - ret = alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_INFORMATION, + ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; - if (*out_data == WMAX_FAILURE_CODE) + if (*out_data == AWCC_FAILURE_CODE) return -EBADRQC; return 0; } -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 = { - .operation = WMAX_OPERATION_ACTIVATE_PROFILE, + .operation = AWCC_OP_ACTIVATE_PROFILE, .arg1 = profile, .arg2 = 0, .arg3 = 0, @@ -496,18 +497,18 @@ static int wmax_thermal_control(struct wmi_device *wdev, u8 profile) u32 out_data; int ret; - ret = alienware_wmi_command(wdev, WMAX_METHOD_THERMAL_CONTROL, + ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &in_args, sizeof(in_args), &out_data); if (ret) return ret; - if (out_data == WMAX_FAILURE_CODE) + if (out_data == AWCC_FAILURE_CODE) return -EBADRQC; return 0; } -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 = { @@ -518,46 +519,46 @@ static int wmax_game_shift_status(struct wmi_device *wdev, u8 operation, }; int ret; - ret = alienware_wmi_command(wdev, WMAX_METHOD_GAME_SHIFT_STATUS, + ret = alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &in_args, sizeof(in_args), out_data); if (ret < 0) return ret; - if (*out_data == WMAX_FAILURE_CODE) + if (*out_data == AWCC_FAILURE_CODE) return -EOPNOTSUPP; return 0; } -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 = dev_get_drvdata(dev); u32 out_data; int ret; - ret = wmax_thermal_information(priv->wdev, WMAX_OPERATION_CURRENT_PROFILE, + ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, 0, &out_data); if (ret < 0) return ret; - if (out_data == WMAX_THERMAL_MODE_GMODE) { + if (out_data == AWCC_THERMAL_MODE_GMODE) { *profile = PLATFORM_PROFILE_PERFORMANCE; return 0; } - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) return -ENODATA; - out_data &= WMAX_THERMAL_MODE_MASK; - *profile = wmax_mode_to_platform_profile[out_data]; + out_data &= AWCC_THERMAL_MODE_MASK; + *profile = awcc_mode_to_platform_profile[out_data]; return 0; } -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 = dev_get_drvdata(dev); @@ -565,8 +566,8 @@ static int thermal_profile_set(struct device *dev, u32 gmode_status; int ret; - ret = wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_GET_GAME_SHIFT_STATUS, + ret = awcc_game_shift_status(priv->wdev, + AWCC_OP_GET_GAME_SHIFT_STATUS, &gmode_status); if (ret < 0) @@ -574,8 +575,8 @@ static int thermal_profile_set(struct device *dev, if ((profile == PLATFORM_PROFILE_PERFORMANCE && !gmode_status) || (profile != PLATFORM_PROFILE_PERFORMANCE && gmode_status)) { - ret = wmax_game_shift_status(priv->wdev, - WMAX_OPERATION_TOGGLE_GAME_SHIFT, + ret = awcc_game_shift_status(priv->wdev, + AWCC_OP_TOGGLE_GAME_SHIFT, &gmode_status); if (ret < 0) @@ -583,21 +584,21 @@ static int thermal_profile_set(struct device *dev, } } - return wmax_thermal_control(priv->wdev, + return awcc_thermal_control(priv->wdev, priv->supported_thermal_profiles[profile]); } -static int thermal_profile_probe(void *drvdata, unsigned long *choices) +static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) { enum platform_profile_option profile; struct awcc_priv *priv = drvdata; - enum wmax_thermal_mode mode; + enum awcc_thermal_profile mode; u8 sys_desc[4]; u32 first_mode; u32 out_data; int ret; - ret = wmax_thermal_information(priv->wdev, WMAX_OPERATION_SYS_DESCRIPTION, + ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTION, 0, (u32 *) &sys_desc); if (ret < 0) return ret; @@ -605,7 +606,7 @@ static int thermal_profile_probe(void *drvdata, unsigned long *choices) first_mode = sys_desc[0] + sys_desc[1]; for (u32 i = 0; i < sys_desc[3]; i++) { - ret = wmax_thermal_information(priv->wdev, WMAX_OPERATION_LIST_IDS, + ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID, i + first_mode, &out_data); if (ret == -EIO) @@ -614,11 +615,11 @@ static int thermal_profile_probe(void *drvdata, unsigned long *choices) if (ret == -EBADRQC) break; - if (!is_wmax_thermal_code(out_data)) + if (!is_awcc_thermal_mode(out_data)) continue; - mode = out_data & WMAX_THERMAL_MODE_MASK; - profile = wmax_mode_to_platform_profile[mode]; + mode = out_data & AWCC_THERMAL_MODE_MASK; + profile = awcc_mode_to_platform_profile[mode]; priv->supported_thermal_profiles[profile] = out_data; set_bit(profile, choices); @@ -629,7 +630,7 @@ static int thermal_profile_probe(void *drvdata, unsigned long *choices) if (awcc->gmode) { priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] = - WMAX_THERMAL_MODE_GMODE; + AWCC_THERMAL_MODE_GMODE; set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } @@ -638,9 +639,9 @@ static int thermal_profile_probe(void *drvdata, unsigned long *choices) } static const struct platform_profile_ops awcc_platform_profile_ops = { - .probe = thermal_profile_probe, - .profile_get = thermal_profile_get, - .profile_set = thermal_profile_set, + .probe = awcc_platform_profile_probe, + .profile_get = awcc_platform_profile_get, + .profile_set = awcc_platform_profile_set, }; static int awcc_platform_profile_init(struct wmi_device *wdev) From patchwork Thu Mar 13 14:29:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015198 Received: from mail-yb1-f176.google.com (mail-yb1-f176.google.com [209.85.219.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CA6BA2686B3; Thu, 13 Mar 2025 14:30:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876218; cv=none; b=tOZiuayLDms5zQkl37S2BMCjuVbes+t7FDZUHpWO+gNydhIg9f5J4mu5XjFeSNB1BVb3PfOb8FFH4uk9weQqoAnZFAZjmTIV4CP3Iw6Y6BbDS5soBzDsiFprRjTAfxZU2TmeqFjEwFUfrF1cFuso0j91M3365snyu7qkZcF6hGg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876218; c=relaxed/simple; bh=b6I4LW2lXRr4zSKyCgVo5hQkgsNPWVdZQx2aOlTduKg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QNRVPmFJZibpD1DyNjHi0fr+AUcfZcK4zoLj+VUM04tWPlhapGossFk0CLOUNZbD8u7KUtsZIAicWO1AXu4TxbMNHUwx+yle8ed5g0XMYUV9eIhYrK3crmzDJ4noZFL0Rai1yj/xR6ma+oyIwa/is+EMh/bhhuE0oq5h2FN/qCM= 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=cD8zmSW7; arc=none smtp.client-ip=209.85.219.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cD8zmSW7" Received: by mail-yb1-f176.google.com with SMTP id 3f1490d57ef6-e60ad903382so744401276.0; Thu, 13 Mar 2025 07:30:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876215; x=1742481015; 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=cD8zmSW7YQ2PXbOUb4V8RU2h6iSgnVFwDN7yG1PfvNC4skbEb7bW49t0RfsMKv1uaR PkZ/19RevteYKN77KVG9RoDMVKBugD+zV2VFebryoUJnJ5QZptDLUP/sYhivDWjfTqoB 4j7t0UiKKbitMC8QkUSj9ohHhY1NqtxlJgGsi8MwukNe8oScC5EFdx/2v/g5fU1IMqB4 Gk3vArlPBinpBtclCpKYr3wa6Go2XkNnveEyMRj/Nt7gu0XxQt5DnHMsKgeLENQVkqMh 4hWny/NXvxEqAF9GmbSBXGM+Yh+tFD5YGRvJbm6mO0t/b1EwoyjMZ+GlxCWBXGUjKIvj 92Zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876215; x=1742481015; 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=Dpskix7CMFCHGT6BNauwsXHIcFckQ268ViYZi2dRdYkTO9FrTRLPTQWvUzs7Ozgz// BnJGdjk+T6ImCTzUWeD9ZpjfAFb3H9H0svfAPYRJK8X3d+yDNgiwq36Ufas7eM710pF+ 7dJDEJfvDYxUaw5Mk7htv1mExE8vxi7IEhwOslvQT9sNKJw4BLOykaDw0ET+un7TgPzt KRO/DOAlXChhtOGyiLLWZ5gP2qdrpxufUevHYOGC62d61Z4vtizJ7eSKMzP0iHtAo06P Kri+R2tnb7B6Ai124WxrjoYermCu7s869LZlwkPbTchAJRr6LQGuZESLxNqb4koP3BbE mr3A== X-Forwarded-Encrypted: i=1; AJvYcCW/qtGShk4MIBDHv+9HIu2lsHOrJW4E+hkBmzhJdf84oecQH/PNRhqkgTE9/e+taaMDFDOuKxychB23F+4xwNaJ4MkH+w==@vger.kernel.org, AJvYcCXGRI5Gghx4JA5MaxT7C7zvQAlTmjAGx6H5vfHisSfdRlTOTUOnjryGMyF3fgDNqfI3GlyIT4nTQSjT0JQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yxl5JmttDIRh4IgrnLE0CMSremJFQKdU7x22yDPEZEKQRYvKOyF k+S1O1MUiSxJ6K1jk224bIpidyQFNRRWW9aUUUNZFdxMciCqn3GaZFKK1EJ9 X-Gm-Gg: ASbGncuuiEwLsCpcybdYTIYJ7i3VnflcTdOuSLVJ/fL8xryF1HihUTugMEa4+lknykB Zb+KPOtiV81oPySSVvIxm0ULzcf5UIu6iFiYGFv8gA12OnsyswUm8Jqy/3/7cXb7MGtdaqfByNs zV4IYGpqourQF3NGHtekpZw2ppDnfaNEU8utaNvIxQCJ+eDI3POFfwnqT6QUcG8vqrKbuZsx4wr qEUrwMPiOIb72S3UJ4MuzzuJuDJ5cz9JwS4zBSJ8unFqjgWgBcO98BB9KN2rHuvtGAe7OShNKXn qXjlzlR8VK2TK4xLJ4yrDabNhyqJZqYu4g5lWO2xWrT9jQ== X-Google-Smtp-Source: AGHT+IE9Yxr71vz63KnzlDN5COkyvu0Pll9aV0OTCeuBIWylr62xLdvN+73SzaEC0T35f2N6EMXAAA== X-Received: by 2002:a05:6902:70a:b0:e5a:c5d6:3948 with SMTP id 3f1490d57ef6-e635bf1ed24mr32939717276.0.1741876215390; Thu, 13 Mar 2025 07:30:15 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:14 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:29:57 -0500 Subject: [PATCH v6 02/12] platform/x86: alienware-wmi-wmax: Refactor is_awcc_thermal_mode() Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-2-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index ed70e12d73d7fe5d89f3364c5367820bf47e3c1e..80aefba5b22d6b4ac18aeb2ca356f8c911150abd 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) static bool force_platform_profile; module_param_unsafe(force_platform_profile, bool, 0); @@ -168,8 +169,8 @@ enum AWCC_GAME_SHIFT_STATUS_OPERATIONS { }; enum AWCC_THERMAL_TABLES { - AWCC_THERMAL_TABLE_LEGACY = 0x90, - AWCC_THERMAL_TABLE_USTT = 0xA0, + AWCC_THERMAL_TABLE_LEGACY = 0x9, + AWCC_THERMAL_TABLE_USTT = 0xA, }; enum awcc_thermal_profile { @@ -445,20 +446,18 @@ const struct attribute_group wmax_deepsleep_attribute_group = { * 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 = FIELD_GET(AWCC_THERMAL_TABLE_MASK, code); + u8 mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, code); + + if (mode >= AWCC_PROFILE_LAST) return false; - if ((code & AWCC_THERMAL_MODE_MASK) >= AWCC_PROFILE_LAST) - return false; - - if ((code & AWCC_THERMAL_TABLE_MASK) == AWCC_THERMAL_TABLE_LEGACY && - (code & AWCC_THERMAL_MODE_MASK) >= AWCC_PROFILE_LEGACY_QUIET) + if (table == AWCC_THERMAL_TABLE_LEGACY && mode >= AWCC_PROFILE_LEGACY_QUIET) return true; - if ((code & AWCC_THERMAL_TABLE_MASK) == AWCC_THERMAL_TABLE_USTT && - (code & AWCC_THERMAL_MODE_MASK) <= AWCC_PROFILE_USTT_LOW_POWER) + if (table == AWCC_THERMAL_TABLE_USTT && mode <= AWCC_PROFILE_USTT_LOW_POWER) return true; return false; @@ -548,7 +547,7 @@ static int awcc_platform_profile_get(struct device *dev, return 0; } - if (!is_awcc_thermal_mode(out_data)) + if (!is_awcc_thermal_profile_id(out_data)) return -ENODATA; out_data &= AWCC_THERMAL_MODE_MASK; @@ -597,6 +596,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) u32 first_mode; u32 out_data; int ret; + u8 id; ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTION, 0, (u32 *) &sys_desc); @@ -615,12 +615,13 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) if (ret == -EBADRQC) break; - if (!is_awcc_thermal_mode(out_data)) + id = FIELD_GET(AWCC_RESOURCE_ID_MASK, out_data); + if (!is_awcc_thermal_profile_id(id)) continue; - mode = out_data & AWCC_THERMAL_MODE_MASK; + mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile = awcc_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] = out_data; + priv->supported_thermal_profiles[profile] = id; set_bit(profile, choices); } From patchwork Thu Mar 13 14:29:58 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015200 Received: from mail-yb1-f170.google.com (mail-yb1-f170.google.com [209.85.219.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCAAE268C40; Thu, 13 Mar 2025 14:30:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876221; cv=none; b=oGdHwpBgJ7d8hAZqZE06rcTmdMETArpzxwhzCQ7icKnHNt+npy9t3HWCiFU0AxdINKgotlYSUF97TC2+iTGebEmKljajaBdx/aR/YnOPt+q3mm88WUogcbUk6d7x0Ef+HGhh3n1svrBwGVHAgVXpTlQxR5zZw4pkieKJE+p9dck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876221; c=relaxed/simple; bh=kh4XOux5fLnMpuGqL85jz0yoPfb6XXn59lqRIp0pM/c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ntiXfwfy8cJlW/Ju6Jm2WQNLHEvAe9A/dQk3SNc3pxO5ICL0WIpOKm8gcQrVDIrWGb/b7djJQNuOq6KA7RFCqcmh1Uo5ATvfMo9Wnqa1XkeT/72pTCsJpdlWcI3xzDY8UUjLBNunB969/ODeR6DdFF0wy+Ft4L7Hd6oSkvKwP8s= 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=hbaCd4+z; arc=none smtp.client-ip=209.85.219.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hbaCd4+z" Received: by mail-yb1-f170.google.com with SMTP id 3f1490d57ef6-e5372a2fbddso851175276.3; Thu, 13 Mar 2025 07:30:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876217; x=1742481017; 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=hbaCd4+zN7ef9EYR4/XNlOT9gpecaqGavwpqL/J0k1siZ3+hc6xiW3VVlI16oMywqr GHSCXiRaa4HpjeCjPOK1lWhrtPMxtDGT/TWgqesoVXJW10kosXoyTYnWK58WYfmU6BUk n6eAqum1iXfY6c/9gxANxdDCqXGHZDmNVuYdtJOMilpOKs8yXA7ClS2rsEUY2tq1dRA4 v0rMqnL0lpZ573zT+6YwsfeKmWFwGCAyF4e27ClnTDOMW3bl2qZDZSMEkTA54tU1Uiee wU2Ypr7Niuw+7TkdZXG9PsGwIUA/cRFSug6DKxL23LjVRrUEosioU+PDbN2+tO6I2vx5 Lj9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876217; x=1742481017; 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=FxIJs+rC4laSWvCfLlPREq9lqkVGpb+ZHW+cAvs5j1mFjIPg0Csn+oYMXiS7mjgp/L hd3so9Ik7c16GSGlLnaCIuhRm4+ECw08CMKy6SL3ycWIBqaK2GTFBdQNwM2S9gGtJp57 XSnyUBRGloZ8I6E9Xq03qNPx7ceegcIPE7BjKOavf9k2oXovYlLtc9wVo1Xfk6CbKrNh Pnp9vAmRW33qRXpRfi9VjHanXcflBZtHFcNwZ39xnY+DO+VDIiwE0D5xWK//thX73e06 9yuHJk+dcWRhcDAuQnD9OL18VsfGTKvw3bv09Cxkd9kCLAi7lgowXs2Ux4ZmuxxbmGmW aJlg== X-Forwarded-Encrypted: i=1; AJvYcCUtPpgg+16lvkLovOMsHey3P5lmV5FSgwsqnQ/FrZNrXQETwrb75myCw6e+IqUv9Bymqf/PPqc2i7SrEQ+HITuAg8us9g==@vger.kernel.org, AJvYcCWMDu0BRw1RBTh1Ia1e8G9ZjbVJCxBa/V98PUndS/tjvav5BWfMNFXmETH90FZsbukl4Q5H6YRfEE7XkI4=@vger.kernel.org X-Gm-Message-State: AOJu0YzXjygfYpHStytX2ZMe7MKg3vVwV0KrEw4CzS0nENoLuBJ+4r5y 87LnggV2otbwg8FXsl+jmINKFAJnzrLBMFwWs1Kluug0SDrIyGKKXAN/jJoh X-Gm-Gg: ASbGnctKjzK8vL2fl0Pb+7O/Jds91Y4xzzhe6QBr+OLf+vhHjmn1h2PNQ1xEMC0Ik3c b6G8qLmAHJ8SGq6WZb5hNj/oE4Hqbt5LFK8afhViPBU3lcqrympgzwP3Yl6XJGEMDj3bjIe+pZp ybuLIXW8e5dWy8j33kDYPMrTpJ4C4HM0Re8rVZeO76ATOepicjfBmMJblfxQMzwfQnsZqQOgtg+ cowuT3LcjtLJ18Jmgj4UpwZyyD7fBxXWDoQDgGFsdVS6fgCHvxedZVgo5NIx5wKA+WsI988A0rU bdgWwfoMAqMYoPFvHRyeSo81ZnH8tlk3umjH5lbK/JHN+QinV6ydWonf X-Google-Smtp-Source: AGHT+IFwPFOoK+DbMLYrOWTULL9K9QqyK/6Sl4SAReMr1rxpRT2Ku8wYjhd418oQjC412y7xvwk1MA== X-Received: by 2002:a05:6902:72c:b0:e5e:1034:db93 with SMTP id 3f1490d57ef6-e635c1d8d0emr29439003276.34.1741876217319; Thu, 13 Mar 2025 07:30:17 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:16 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:29:58 -0500 Subject: [PATCH v6 03/12] platform/x86: alienware-wmi-wmax: Improve internal AWCC API Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-3-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index 80aefba5b22d6b4ac18aeb2ca356f8c911150abd..b9dbfdc8096c571722b3c7ac3e73989e235e2eb9 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 #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_group = { }; /* - * 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; } -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 = { + int ret; + + ret = alienware_wmi_command(wdev, method_id, args, sizeof(*args), out); + if (ret) + return ret; + + if (*out == AWCC_FAILURE_CODE || *out == AWCC_FAILURE_CODE_2) + return -EBADRQC; + + return 0; +} + +static inline int awcc_thermal_information(struct wmi_device *wdev, u8 operation, + u8 arg, u32 *out) +{ + struct wmax_u32_args args = { .operation = operation, .arg1 = arg, .arg2 = 0, .arg3 = 0, }; - int ret; - ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, - &in_args, sizeof(in_args), out_data); - if (ret < 0) - return ret; - - if (*out_data == AWCC_FAILURE_CODE) - return -EBADRQC; - - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); } -static int awcc_thermal_control(struct wmi_device *wdev, u8 profile) +static inline int awcc_game_shift_status(struct wmi_device *wdev, u8 operation, + u32 *out) { - struct wmax_u32_args in_args = { - .operation = AWCC_OP_ACTIVATE_PROFILE, - .arg1 = profile, - .arg2 = 0, - .arg3 = 0, - }; - u32 out_data; - int ret; - - ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, - &in_args, sizeof(in_args), &out_data); - if (ret) - return ret; - - if (out_data == 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 = { + struct wmax_u32_args args = { .operation = operation, .arg1 = 0, .arg2 = 0, .arg3 = 0, }; - int ret; - ret = alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, - &in_args, sizeof(in_args), out_data); - if (ret < 0) - return ret; - - if (*out_data == AWCC_FAILURE_CODE) - return -EOPNOTSUPP; - - return 0; + return __awcc_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &args, out); } +/** + * awcc_op_get_resource_id - Get the resource ID at a given index + * @wdev: AWCC WMI device + * @index: Index + * @out: Value returned by the WMI call + * + * Get the resource ID at a given index. Resource IDs are listed in the + * following order: + * + * - Fan IDs + * - Sensor IDs + * - Unknown IDs + * - Thermal Profile IDs + * + * The total number of IDs of a given type can be obtained with + * AWCC_OP_GET_SYSTEM_DESCRIPTION. + * + * Return: 0 on success, -errno on failure + */ +static inline int awcc_op_get_resource_id(struct wmi_device *wdev, u8 index, u32 *out) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_GET_RESOURCE_ID, + .arg1 = index, + .arg2 = 0, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); +} + +static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_GET_CURRENT_PROFILE, + .arg1 = 0, + .arg2 = 0, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); +} + +static inline int awcc_op_activate_profile(struct wmi_device *wdev, u8 profile) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_ACTIVATE_PROFILE, + .arg1 = profile, + .arg2 = 0, + .arg3 = 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 *dev, u32 out_data; int ret; - ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_CURRENT_PROFILE, - 0, &out_data); - - if (ret < 0) + ret = awcc_op_get_current_profile(priv->wdev, &out_data); + if (ret) return ret; if (out_data == 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; - out_data &= AWCC_THERMAL_MODE_MASK; + out_data = FIELD_GET(AWCC_THERMAL_MODE_MASK, out_data); *profile = awcc_mode_to_platform_profile[out_data]; return 0; @@ -583,8 +616,8 @@ static int awcc_platform_profile_set(struct device *dev, } } - return awcc_thermal_control(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, + priv->supported_thermal_profiles[profile]); } static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) @@ -606,8 +639,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) first_mode = sys_desc[0] + sys_desc[1]; for (u32 i = 0; i < sys_desc[3]; i++) { - ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID, - i + first_mode, &out_data); + ret = awcc_op_get_resource_id(priv->wdev, i + first_mode, &out_data); if (ret == -EIO) return ret; From patchwork Thu Mar 13 14:29:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015201 Received: from mail-yb1-f179.google.com (mail-yb1-f179.google.com [209.85.219.179]) (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 7CA29268C77; Thu, 13 Mar 2025 14:30:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876223; cv=none; b=pewAWcR9JMK40ohBceZd+1SDJUV7ldO0KEVBE7sM5Z2E//Clbrku7ow1GEWQKzy0wxQIT81ix60OZfr3g8aN6oOcP22v/aKmiuN33oZL48aFsYfbWajwPlX9QBj864GHMNDzChjOzVjGJKP1UP9iiHfWk6cMJuDB78t2KvaB5NE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876223; 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=mMfKSr+bl6jr762UZ07J5NHBnmBHiR0Gt1qXfaeAkIT32g/KVt2py8b+N9GheHm4RwxUHr5trAAEEobC/NdhtK0TumWgeHepuGnuwFraW95Rpg0kGxw4wZwwDb/a/5eTmPoiLGVKEVmJJQV8AZ7gqNYiAr3hyLY4eLTJpLGHoVU= 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=nRUPa2mn; arc=none smtp.client-ip=209.85.219.179 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="nRUPa2mn" Received: by mail-yb1-f179.google.com with SMTP id 3f1490d57ef6-e62d132a6a7so779117276.3; Thu, 13 Mar 2025 07:30:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876220; x=1742481020; 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=nRUPa2mnhb5VbRO4JSvteFZeeBGbeT+CaNnZngbwVVYoQZDCGsAdpdcw6kg3zyWFmL tcyTszpssplRoOksR5Qv5mNtsj09MrcCvx8ezIX9jnJaBUTVXrlxtPTYlPGCsgVRwNpG t6cdS31fZaCEynY5Xuo6fMbXthKCYrCU4ZIIPeZxOd4EBMyZiCiOKciKj3aIBUH7LzfO fr9H9brPpxNK077WUz7EoiIf7/xZHGSdD0rb1kMF4ETS3ahY48YuJA6owmWZcypNRsET swOXGXr3vud0VLjmQVIIaPcJFGKuyIZ8wLIty3Uw4+UZluQrqZtQ0+aQ/X1Xfa/OcqiC fJLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876220; x=1742481020; 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=KIz2jKOm5dwYDvI7f4dslYWIahHfy1Z0yl0eXszBRIjWHFilCMmmO2QCrJc8nDyWO/ mXIYMvbkcJC9SSSTpOBOj35jV4oRbGBtZeG7350W4+VdUgaSdOEI1aKmdwDFPNHYxW7D Wk4maZu2hSqOiRs/b3dbTwfXYr8jwIwUMGG2eR5k1oX/xxAlt4ec+MikvvetMMQZHFfB oXW4SNrIzVXcn/4Qi4OpvCtqtrdeHXNFE0qTGeUZ0TgDyVSEDEtPLkHeG1YVk9F4BZIS jOlqRKvb8vnrnRdfIIbRJA/tZlC67HKWRon4ncgkB5p6b9gAB+8DFPR37SqXurN0q935 Kj2Q== X-Forwarded-Encrypted: i=1; AJvYcCX13O2U8oqczpFQzWNp0s94LuPR+aGd/7qDsEu3vzcgOOFTZLeGPA8zokSKd69pqI1FY5cbFksK0meCkEsg4rowCgP+qA==@vger.kernel.org, AJvYcCXSKARYEP88jEs7DA2DAxtTYY7LAnqR/qKB8mu7iTscE6dE9VhPg4+S8QfO1Nn0gWaCV48f916LMdKtH7M=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6KKWk1p1fZDFEOC/4RN2Z02W7t4t1he3q7KWZy8JpHNJd6TPu icQsPnryob3+k68bD0j8JnbCKn+y6QBdDcmXn11ZUfl/4XeFZ59PCzWCAnCY X-Gm-Gg: ASbGncuM74oe4rBtVD5Y8ihghOCqgGdOWzM8XMgGcBxsedmZ5BXPalu1wfJ6PpDK5fZ XpfZGjv7PTHZQQDeV2WlU255AFesxHhZK8txH3dGh/Dc/W5mS3sUwjxsKXr5Szic5XBdoTpPUKm NgAn8VIJwt1uJkNQDNce0gezq0lU1Xa8OwzXBsC83amMZ1MDul9s7DanjF0WE/YCwUPmfniQihA 0tmxLNU/HytqopXLjxs6z2eAMd7MhAleCX08F047Yc/DzxUsYtCP+1JkHrXBYFYIWzrS7jddh+h qbRkgUswbQ5yNsTZq6vX5MzGCLgFG1Z6ddUQUow9xbVzFZplaMv5C8A+ X-Google-Smtp-Source: AGHT+IENTVSpftQ6ym0myu0zktCZdQxBR6LNLBh2QvQfY+cxi8GE9QR0PUGo1JYGvGNUWo6F8uyFoA== X-Received: by 2002:a05:6902:102c:b0:e60:8734:64df with SMTP id 3f1490d57ef6-e63b52114a6mr13104121276.36.1741876219070; Thu, 13 Mar 2025 07:30:19 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:18 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:29:59 -0500 Subject: [PATCH v6 04/12] platform/x86: alienware-wmi-wmax: Modify supported_thermal_profiles[] Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-4-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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ärvinen 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/platform/x86/dell/alienware-wmi-wmax.c index b9dbfdc8096c571722b3c7ac3e73989e235e2eb9..a8a13779793abbcc8d1263474cac6227d524a6f5 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_LAST]; + u8 supported_profiles[PLATFORM_PROFILE_LAST]; }; static const enum platform_profile_option awcc_mode_to_platform_profile[AWCC_PROFILE_LAST] = { @@ -616,8 +616,7 @@ static int awcc_platform_profile_set(struct device *dev, } } - return awcc_op_activate_profile(priv->wdev, - priv->supported_thermal_profiles[profile]); + return awcc_op_activate_profile(priv->wdev, priv->supported_profiles[profile]); } static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) @@ -653,7 +652,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile = awcc_mode_to_platform_profile[mode]; - priv->supported_thermal_profiles[profile] = id; + priv->supported_profiles[profile] = id; set_bit(profile, choices); } @@ -662,7 +661,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) return -ENODEV; if (awcc->gmode) { - priv->supported_thermal_profiles[PLATFORM_PROFILE_PERFORMANCE] = + priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] = AWCC_THERMAL_MODE_GMODE; set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); From patchwork Thu Mar 13 14:30:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015202 Received: from mail-yb1-f176.google.com (mail-yb1-f176.google.com [209.85.219.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E00C9268FDC; Thu, 13 Mar 2025 14:30:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876224; cv=none; b=Jk0lwG2+2Un69XAlaPGt+UoEkkyBA/AVCz9B6UapfWHRr+eMHhOkC1oXfeVv4UCdj5ZmJO/7Gih7OmGRSBLZE2noomcx9zsIYEW4SD/skDp5b2kBZMk7M94scvANp1bLocb3oZ0SVI1kDkqNWz/ZRBIFZFiZlauF5WmRIfTx9QE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876224; 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=IBD7zbkAXKMMeS5sKaptpHop1p5GDEIRNLoI8zhwGRFQ48J3wIqFy59CU74bJepkoATFA0m51khFvBF4t/TtdmMFVP5wR13ogJomkDabARLRL6L+fcFCUdpjOtfbqoe+1DzubG5pZTYR1wMCQYTJeHTerTNKzecTA4Sw/E44rFk= 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=EBI8Yxpk; arc=none smtp.client-ip=209.85.219.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EBI8Yxpk" Received: by mail-yb1-f176.google.com with SMTP id 3f1490d57ef6-e549b0f8d57so1016117276.3; Thu, 13 Mar 2025 07:30:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876222; x=1742481022; 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=EBI8YxpkiO+azdMa9AadVVaoaNY7myGXO1ffSbcHPEnnAXk4yBJbK5gg6OIIDXJMVv mjasIlQSNxpJnctZifYy9B6hL52lmBoQHMsNxcv7s/tordGbYAks1ibzKcCvmPPtvJ8T YlSal4Y9I71JCa3dmH+yvT9oKLzrpl/BOh/FqG84Y37QaoN7zcPR0c4tSBogT9jAlJLG AJcRSmxqZOWU2ZUhzft4xYj5t7MnAZeZ9PfjogQkmf+HniTWOgBFfoX2xfTV020O5bWb H7H0eFzcPaGCkCQmbaJdCmm9AkPr0dCesbfo2u9W9P2FfoSxaOYYyV3+AbRFnlLHux61 JdcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876222; x=1742481022; 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=wCv8FEZoQahcpCkqkmB/zVx8BJIiIWXfETxPQ1lcOTXbvjJy7cpSqa9e5QgdkH2p93 WU6D11k56nuEXCnhOQyUBNly2DnN6iM988SV1k2I7G/4jG071kLQ4SzxwQxnnXA0YOzf NLIehUKIrOgC7S5e1+FzcsB+eZfDaXr/AYrI+e2UvIRcPYNNeGFZuexgPcOVUUZwcJR5 ioHeSbmfQPsxqjAyb+t2NTsgRayaUEz5/bnLUdxGXd0ZNQ70baeu2KmPtNOpBCmQ+Hh/ 5z3ria/TpMeRPpMnLjl7h2eDXvcBzTkUckzlpKYQzo90f99mp3Wh8t3SMZ4uVvXjooJq YK3Q== X-Forwarded-Encrypted: i=1; AJvYcCWNamyxyQ+hT1eHqzlXIMmX6STYeHtG01Ri7s24xVZ7GObbn2JMo2y5BQPX56/jXEyrRFZiNpyW75lNbsS9SaVAJvCFWA==@vger.kernel.org, AJvYcCXL2Oks6Dfnf2u7tvh2WO12Wp4MlZ8nnoPkrd+3+MrSCwaSDGqh3i3OzmZyiW4Pq4C4vlIrRw/CZXqLtpA=@vger.kernel.org X-Gm-Message-State: AOJu0Yza2Il0asT54R0DM3zWPgCLwuj1eQf8W9RlysnGh5BKQKa4E25U QB4CWGjo4Pk61RaECYb7LWD10wNxHOXt4P+yZD7L4oo4i4UVOfeNSJ/Th8MX X-Gm-Gg: ASbGnctEWqWnKL5PkWZk/nMKilmEc7ZAU1kwgzjfqKPNpRUFTQe3vTG661Btvzl1yCU 06cpPK9ZkFzBAPKm69lLmocRFgPKsxikGCiPzBCUvkwvqHaC5hUBnSn2LzhkpXHhqG5TzsEYtXi gmSAVAie4rU+WQwddGUkFzs2hkfgIgGdpkbMD+aXhPaQDDr8kEpD5oDZRcx2puE2n5CxLzOK5Gg VtbqgoIhIzqi6dfNSoewPSj2zT0QnpgcsNi+X5s+JFOgCKD8rgwGDc4un5j09PRwWlAy8kOHEBs L3p0tWmYIPv8N7VZ0dXonPYF5pHLKaLlTkESFo3pFVGSwA== X-Google-Smtp-Source: AGHT+IFdD7/NASvI+q+boLup6Uv9f/S3WpBzZOueGmFiLHw3B1Uf/oDFB2V/GQdA5nFYhRfEEzbItw== X-Received: by 2002:a05:6902:2192:b0:e63:f0ac:4801 with SMTP id 3f1490d57ef6-e63f0ac4b9cmr1024421276.38.1741876221660; Thu, 13 Mar 2025 07:30:21 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:21 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:00 -0500 Subject: [PATCH v6 05/12] platform/x86: alienware-wmi-wmax: Improve platform profile probe Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-5-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index a8a13779793abbcc8d1263474cac6227d524a6f5..0530f25b956f73f47c0354f40dac2910448c894e 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) +/* 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 profiles without checking if WMI thermal backend is available"); @@ -212,6 +215,17 @@ struct wmax_u32_args { 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 = drvdata; enum awcc_thermal_profile mode; - u8 sys_desc[4]; - u32 first_mode; + u8 id, offset = 0; u32 out_data; int ret; - u8 id; - ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_SYSTEM_DESCRIPTION, - 0, (u32 *) &sys_desc); - if (ret < 0) - return ret; - - first_mode = sys_desc[0] + sys_desc[1]; - - for (u32 i = 0; i < sys_desc[3]; i++) { - ret = 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 = 0; i < ARRAY_SIZE(priv->res_count) - 1; i++) + offset += priv->res_count[i]; + for (unsigned int i = 0; i < priv->profile_count; i++) { + ret = awcc_op_get_resource_id(priv->wdev, i + offset, &out_data); if (ret == -EIO) return ret; + /* + * Some devices report an incorrect number of thermal profiles + * so the resource ID list may end prematurely + */ if (ret == -EBADRQC) break; id = 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; + } mode = FIELD_GET(AWCC_THERMAL_MODE_MASK, id); profile = awcc_mode_to_platform_profile[mode]; priv->supported_profiles[profile] = id; - set_bit(profile, choices); + __set_bit(profile, choices); } if (bitmap_empty(choices, PLATFORM_PROFILE_LAST)) @@ -664,7 +681,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] = AWCC_THERMAL_MODE_GMODE; - set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); + __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } return 0; @@ -695,6 +712,20 @@ static int alienware_awcc_setup(struct wmi_device *wdev) if (!priv) return -ENOMEM; + ret = awcc_thermal_information(wdev, AWCC_OP_GET_SYSTEM_DESCRIPTION, + 0, &priv->system_description); + if (ret < 0) + return ret; + + /* Sanity check */ + for (unsigned int i = 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 = wdev; dev_set_drvdata(&wdev->dev, priv); From patchwork Thu Mar 13 14:30:01 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015203 Received: from mail-yb1-f181.google.com (mail-yb1-f181.google.com [209.85.219.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC48A268691; Thu, 13 Mar 2025 14:30:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876228; cv=none; b=dnjKSDF+HObZV4S1CMmUea0S2Y+yTsu2IrmSEMM/Fp3wXDaIoTZuP3NoALgEvAKz7WPlUgDnp9WLtRQ3wtrgEA4PxVCNUjFpcYPHBCmHTLq3UoMouVMPVxQMvT6T4D8a/l/XsdCEWxmXsZD0FywDZ96qZCcMtxEMf3vZV8blb00= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876228; c=relaxed/simple; bh=/RVTDk95xTdgwIURpxctNMV56eIngqQ4/eX5yRQzsK8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mAsxzlwTywIUIGfwuuZoq6mzJ3Og4LKpOjtDk7yvPEPhiQugQ45DoF63j49oQgmwxGL1HjBeQiAdNRjNqDmbsotaZwWtnP+n4i03MP5RJbIAKi6j21N3yzMhmPCIRJd3M6piPJ7MR3kIHhG171Su6sKXvYIUj4FZxVcIcA5pYs0= 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=NW/GS4lf; arc=none smtp.client-ip=209.85.219.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NW/GS4lf" Received: by mail-yb1-f181.google.com with SMTP id 3f1490d57ef6-e6341e4d0b4so1881761276.0; Thu, 13 Mar 2025 07:30:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876225; x=1742481025; 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=NW/GS4lfcZP7Eg5sEGsr5yLs7yxLd7AKBrIsjg/tbZ/giC33FJhOAHe6qmc8VB5nd3 s/jj+KR0jyXfj7ugaRWnl1kfnI5U8NVHYudEG2CFBHa6GhuwYbBhrrYrBLlfn6mu2pEK wanEprj3469xtr5TiPS9CBjhFGEmQKTqj+QqANurGNd+CJi3QHcAPQdL5uWT9zuDnor2 FerKyh8exXiPfNp7PebRPmsm3MOGRBt5i1/xUlWkh6Kt0WYBzzj9+AyQ0dMnBtLq1fmX WeV6et5792RggpWIb0dzmHlsQFnGa35MjzwGrpjthoLAWoCUtmGXtKucMUCSpYxz6Vb1 Riiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876225; x=1742481025; 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=iz8uFlS9XgiDwWO9BsvjrF8LRcNw15d23PBSU7GW0e7TdEYKiL760wTRoUQwHJFcRF UKK/PI0D+mSW9SVfgTDLkba5Odyt/ifloUvSLEKkkmdsp7jpRrpFEXzIbL+qrHYxjASu R6ceaDz5Elpo5i2xbf+C4gqHZa3sQuj8Eg3W4+rv+HDYfg26IoKbMXEwuhap+dDFEBSt 4gyOhrr+fsOkCQeFJnrGdbOzUcQ0yKgCqccietZt5EtyOBtxrGMJFcKNGpftnWa+U6/C +jVTWNC/OqlPfEqxcqkYHzRbetG/wj7+MTjd59R/wJXIBq+5LkGQp55XsZ/LKZgE4ujR cQUw== X-Forwarded-Encrypted: i=1; AJvYcCWkYeE4yDeECsKGKcMRRlATzBE6Vm+tsLiuxehYkdWgg5wcH/FT14jRTAv6/YoOGY3mbgG1Q0/5nKRurak=@vger.kernel.org, AJvYcCXMibftNIRKBBFG6xhcIoC8c5TIQvHYn6QPS/yABnSQQsSNMCVaqufIk3nng2ZcmAIQ5zzMpboMvQBhc02m2UShM3keFw==@vger.kernel.org X-Gm-Message-State: AOJu0YxqOLZtrtaX/b/vPwLtdqnUuEEtHmFmAtdICf+4tY6fFioUk70z uWnpu1Rq4FKAZuMUgY1qFVE1DK1gGBnYLWAl6f2h2BNpEK0yEiuHCFZe1chD X-Gm-Gg: ASbGncsUUluYorihifHWzS8vkxbgdnuJ9fHAmMqpT7M7NoaaOjqDHaN43fiEo8DEl3g D+ARFYeAoqGnWx5mkGBy2aUy0Y/waHTH+cD38ob+Vo69LP2D6Y1hSQ0DNX0x1IrWk+Zg/ZfHkyv KA4BkLg0zPCQ4AhlIYXEpf5w9O9rUcPUNMY7nY223kFkI/C2nSjg9Aielvyo2HyZRChfVZoM9db Jb5/XHew2298ZnKOK+W/IlQb84CVu7l+Q2lp5gex51p7HFfcROyyVn+w55e9O2RCwRdMhvMRpVo 47NpFNqp3IIxrRI+ADg9UMRbK/lCN06v6TDE2ec3UK5q3A== X-Google-Smtp-Source: AGHT+IE9jUrYk/s6U/kpCNubFDXo6NtG8uIjFtuEh+Os6nK3lcMjXqwsXN/pO1r/XmwpzYCtLFnFhg== X-Received: by 2002:a05:6902:2289:b0:e63:cfb7:5da5 with SMTP id 3f1490d57ef6-e63e3be255fmr3521660276.9.1741876223341; Thu, 13 Mar 2025 07:30:23 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:22 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:01 -0500 Subject: [PATCH v6 06/12] platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-6-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index 0530f25b956f73f47c0354f40dac2910448c894e..3b37e4456482bc284b8e867c1c5b6255fc6c8ef2 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 -#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 = 0xA, }; +enum AWCC_SPECIAL_THERMAL_CODES { + AWCC_SPECIAL_PROFILE_CUSTOM = 0x00, + AWCC_SPECIAL_PROFILE_GMODE = 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 *dev, if (ret) return ret; - if (out_data == AWCC_THERMAL_MODE_GMODE) { + switch (out_data) { + case AWCC_SPECIAL_PROFILE_CUSTOM: + *profile = PLATFORM_PROFILE_CUSTOM; + return 0; + case AWCC_SPECIAL_PROFILE_GMODE: *profile = PLATFORM_PROFILE_PERFORMANCE; return 0; + default: + break; } if (!is_awcc_thermal_profile_id(out_data)) @@ -679,11 +688,17 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices) if (awcc->gmode) { priv->supported_profiles[PLATFORM_PROFILE_PERFORMANCE] = - AWCC_THERMAL_MODE_GMODE; + AWCC_SPECIAL_PROFILE_GMODE; __set_bit(PLATFORM_PROFILE_PERFORMANCE, choices); } + /* Every model supports the "custom" profile */ + priv->supported_profiles[PLATFORM_PROFILE_CUSTOM] = + AWCC_SPECIAL_PROFILE_CUSTOM; + + __set_bit(PLATFORM_PROFILE_CUSTOM, choices); + return 0; } From patchwork Thu Mar 13 14:30:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015204 Received: from mail-yw1-f175.google.com (mail-yw1-f175.google.com [209.85.128.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0F912268FFD; Thu, 13 Mar 2025 14:30:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876231; cv=none; b=FVgOfGRDkejBUicwoKL4jToLzbfO4vlulQrxvxOgW8M3HVNxgTA+EeGfNOEF+an/a7b4q2pnNylvHagzMhxQ4bRsOwDYbL6y39jfToSeH1VsqrTwedDKHOIRcpWltAlFAnV+BeLi8T1G2Zmb8oPV07KqFumkNSw7uNjD3YPmHFw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876231; c=relaxed/simple; bh=xJNuBJ8Lq+cf0vQCIGGN/Evrgk1LJ5JESRbRX7CZAU0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sM5C5qcOVCEl8mjIXffAdT3utdk2dPL1OTawI7nehsx2R9T84WkKVAPns3tLo0J0y7DP+RA+24CqL3t73Wh7iyLyzdAk8B7E57Q9S87bvwuPIr2KcbqWAZ91Wkq9BqpMCHNlNlDvGkL/wZ+7SQ+QXJW6oPsddsCSFA9FAi0yHg8= 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=EViHaYxy; arc=none smtp.client-ip=209.85.128.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="EViHaYxy" Received: by mail-yw1-f175.google.com with SMTP id 00721157ae682-6f74b78df93so10723287b3.0; Thu, 13 Mar 2025 07:30:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876228; x=1742481028; 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=ovIBwyrFCxunHqofwj+leY0pxsU/rdE7vlF0h9oNJ9g=; b=EViHaYxykOf3SpfNoN/51ITgQHempFYK7tV01TtW43TLi4gAs50JxXbnz2QQVmXCQy QWZzX0RFkdKFjSogiRfbaemcv050QtaruRyo9JmroiFKYbOe+dbv2OqKk6yU/PU6SpUd RfqYMUgFsv/sZS7VRmjDGa4eYJDNx50A9JnDSAVuaiO71uTrpv4jJtGcXaOKxkCQn12B 6oHt5MvL1Nq//YRVIEDI3c05jiSor78iBqt0fnowD3Po76Pa9pSJx5THSCLM4OhojY/a IeWIXUlxRj9g/uxxqux0VVnfEKJmkxZa3L7aPE1N3pNlVxDDupQoaKuhe7bmNR8Hx5Q9 xtzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876228; x=1742481028; 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=ovIBwyrFCxunHqofwj+leY0pxsU/rdE7vlF0h9oNJ9g=; b=S1NFSaJn1QHvEjC7r+BQFlGFCjomrEdqe5f+Gyhi+qG/m81uGs+VuYZclHx7e+2Gu3 mlA/6Zlk6anXzLZkk6XBsMK4H3lDWSZvhdBNj5cV3LSqwH/ChmtzwhtqX/7gE+Zq+uuQ P5Bi7yEkwsaFCfsIRAmO2tldhpOR5C85ER11zYWs1+zc+05rzCcvjF1HC/5IO9VnH27f C3NQ0E+ERVB4K+0pTjIg/JxJIu1PRux+pMf+Q4eKJjmSWBn70lrliC4+SOQDCdNXb+aN W+HZiufTvf73KSXS+yQJYA1cIo2ljGMvkhInp0O3C6jeYe7g4D2D95JtniGl8oJ5PCu3 n0DA== X-Forwarded-Encrypted: i=1; AJvYcCUHlLb1QiL27HMRcgIsLHLz+Z/SskZAJtNtnxysuF4y98ypaSqLYXNAbfvkYFSleYZ8aZXpK+DhCUnm8g==@vger.kernel.org, AJvYcCUj/1VnqoXsKc35E3BhAqocwkVRrT0DCcADm7PV0YXb4OBuQWukBDXR67o6OGC/HC/Mq5CBmX6+JxSCeghAmg86PSvF6g==@vger.kernel.org, AJvYcCWGVNbuy6ndo23zBWqZwtEQ2ooLMA/doiFPFyP/x50leXxcA5tu4XoJixGouM2YtF8urhxO57JCOZyOFh7F@vger.kernel.org X-Gm-Message-State: AOJu0Yx3sAVigEE0LFWHURHHWOWGhqvOfyjS/Rlyv/tKCAi8OlQhhIKT GIQFcllwPHlYFgUWBj/Z1u+6nJJTraUBQUGCh9gResWVGQ2wxqiNuIAcTzEk X-Gm-Gg: ASbGncsvaqikKx8GRBRZjY68CFs5vkXwpWJ4xAoM8thGQOLHTgOfsO3a864an+TzN71 rA46f9Oy2TNQZKzCU3Op00D2V4NukHDuSLFbtj0c6/4vp3Y/5DXaF18uM6zZvFA87Hp4FH+1ZyF +ZvYUTn8PId856vsesSg1cLgjWxpaB75ieCOB8mAF7XIHiwI5hUY5QoAqdMxsrVfAi0zJ5+m53N ZEOKPk/VMBi6TtdrAtOKU4SUDItwC+CECxuSXOFxeC8SOd3P1o2JsUcrcF8PNvoT6O0bUbN2aJf swBnnfQBsnuBo/kKCjSf19IBAC1qRhImHZs/ltiQGQjPmQ== X-Google-Smtp-Source: AGHT+IFHcibNeL97nDuwMxCGYqtgpUyeE9vE4YjaeOwxFsm7FS3wDbWO/gktO9Xm/Ua/w9JJTld2TQ== X-Received: by 2002:a05:6902:cc7:b0:e60:8d10:8698 with SMTP id 3f1490d57ef6-e635c1906f6mr33296569276.27.1741876227532; Thu, 13 Mar 2025 07:30:27 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:26 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:02 -0500 Subject: [PATCH v6 07/12] platform/x86: alienware-wmi-wmax: Add HWMON support Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-7-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org, Guenter Roeck , Jean Delvare , linux-hwmon@vger.kernel.org X-Mailer: b4 0.14.2 All models with the "AWCC" WMAX device support monitoring fan speed and temperature sensors. Expose this feature through the HWMON interface. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/Kconfig | 1 + drivers/platform/x86/dell/alienware-wmi-wmax.c | 396 +++++++++++++++++++++++++ 2 files changed, 397 insertions(+) diff --git a/drivers/platform/x86/dell/Kconfig b/drivers/platform/x86/dell/Kconfig index f8a0dffcaab7c3b423472c5b9093011334a698c8..f7107b0c55f27c9be70f50b36dd2e7bab42a6960 100644 --- a/drivers/platform/x86/dell/Kconfig +++ b/drivers/platform/x86/dell/Kconfig @@ -22,6 +22,7 @@ config ALIENWARE_WMI depends on DMI depends on LEDS_CLASS depends on NEW_LEDS + depends on HWMON help This is a driver for controlling Alienware WMI driven features. diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c index 3b37e4456482bc284b8e867c1c5b6255fc6c8ef2..0c30ffb6091a15d81f4dc959dfd28417249d3dda 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 #include +#include #include #include +#include #include #include +#include #include #include "alienware-wmi.h" @@ -25,6 +28,7 @@ #define WMAX_METHOD_BRIGHTNESS 0x3 #define WMAX_METHOD_ZONE_CONTROL 0x4 +#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 @@ /* 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 checking if the WMI backend is available"); 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 selected"); struct awcc_quirks { + bool hwmon; bool pprof; bool gmode; }; static struct awcc_quirks g_series_quirks = { + .hwmon = true, .pprof = true, .gmode = true, }; static struct awcc_quirks generic_quirks = { + .hwmon = true, .pprof = true, .gmode = false, }; @@ -155,9 +168,18 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = { }, }; +enum AWCC_GET_FAN_SENSORS_OPERATIONS { + AWCC_OP_GET_TOTAL_FAN_TEMPS = 0x01, + AWCC_OP_GET_FAN_TEMP_ID = 0x02, +}; + enum AWCC_THERMAL_INFORMATION_OPERATIONS { AWCC_OP_GET_SYSTEM_DESCRIPTION = 0x02, AWCC_OP_GET_RESOURCE_ID = 0x03, + AWCC_OP_GET_TEMPERATURE = 0x04, + AWCC_OP_GET_FAN_RPM = 0x05, + AWCC_OP_GET_FAN_MIN_RPM = 0x08, + AWCC_OP_GET_FAN_MAX_RPM = 0x09, AWCC_OP_GET_CURRENT_PROFILE = 0x0B, }; @@ -180,6 +202,11 @@ enum AWCC_SPECIAL_THERMAL_CODES { AWCC_SPECIAL_PROFILE_GMODE = 0xAB, }; +enum AWCC_TEMP_SENSOR_TYPES { + AWCC_TEMP_SENSOR_CPU = 0x01, + AWCC_TEMP_SENSOR_GPU = 0x06, +}; + enum awcc_thermal_profile { AWCC_PROFILE_USTT_BALANCED, AWCC_PROFILE_USTT_BALANCED_PERFORMANCE, @@ -216,6 +243,14 @@ struct wmax_u32_args { u8 arg3; }; +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 { 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]; }; static const enum platform_profile_option awcc_mode_to_platform_profile[AWCC_PROFILE_LAST] = { @@ -495,6 +534,19 @@ static int __awcc_wmi_command(struct wmi_device *wdev, u32 method_id, return 0; } +static inline int awcc_get_fan_sensors(struct wmi_device *wdev, u8 operation, + u8 fan_id, u8 index, u32 *out) +{ + struct wmax_u32_args args = { + .operation = operation, + .arg1 = fan_id, + .arg2 = index, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_GET_FAN_SENSORS, &args, out); +} + static inline int awcc_thermal_information(struct wmi_device *wdev, u8 operation, u8 arg, u32 *out) { @@ -552,6 +604,30 @@ static inline int awcc_op_get_resource_id(struct wmi_device *wdev, u8 index, u32 return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); } +static inline int awcc_op_get_fan_rpm(struct wmi_device *wdev, u8 fan_id, u32 *out) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_GET_FAN_RPM, + .arg1 = fan_id, + .arg2 = 0, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); +} + +static inline int awcc_op_get_temperature(struct wmi_device *wdev, u8 temp_id, u32 *out) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_GET_TEMPERATURE, + .arg1 = temp_id, + .arg2 = 0, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); +} + static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) { struct wmax_u32_args args = { @@ -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); } +/* + * 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_sensor_types type, + u32 attr, int channel) +{ + const struct awcc_priv *priv = drvdata; + unsigned int temp_count; + + switch (type) { + case hwmon_temp: + temp_count = 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 type, + u32 attr, int channel, long *val) +{ + struct awcc_priv *priv = dev_get_drvdata(dev); + const struct awcc_fan_data *fan; + u32 state; + int ret; + u8 temp; + + switch (type) { + case hwmon_temp: + temp = find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (attr) { + case hwmon_temp_input: + ret = awcc_op_get_temperature(priv->wdev, temp, &state); + if (ret) + return ret; + + *val = state * MILLIDEGREE_PER_DEGREE; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_fan: + fan = priv->fan_data[channel]; + + switch (attr) { + case hwmon_fan_input: + ret = awcc_op_get_fan_rpm(priv->wdev, fan->id, &state); + if (ret) + return ret; + + *val = state; + break; + case hwmon_fan_min: + *val = fan->min_rpm; + break; + case hwmon_fan_max: + *val = fan->max_rpm; + break; + default: + return -EOPNOTSUPP; + } + + break; + case hwmon_pwm: + fan = priv->fan_data[channel]; + + switch (attr) { + case hwmon_pwm_auto_channels_temp: + *val = 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_types type, + u32 attr, int channel, const char **str) +{ + struct awcc_priv *priv = dev_get_drvdata(dev); + u8 temp; + + switch (type) { + case hwmon_temp: + temp = find_nth_bit(priv->temp_sensors, AWCC_ID_BITMAP_SIZE, channel); + + switch (temp) { + case AWCC_TEMP_SENSOR_CPU: + *str = "CPU"; + break; + case AWCC_TEMP_SENSOR_GPU: + *str = "GPU"; + break; + default: + *str = "Unknown"; + break; + } + + break; + case hwmon_fan: + *str = priv->fan_data[channel]->label; + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +static const struct hwmon_ops awcc_hwmon_ops = { + .is_visible = awcc_hwmon_is_visible, + .read = awcc_hwmon_read, + .read_string = awcc_hwmon_read_string, +}; + +static const struct hwmon_channel_info * const awcc_hwmon_info[] = { + 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 = { + .ops = &awcc_hwmon_ops, + .info = awcc_hwmon_info, +}; + +static int awcc_hwmon_temps_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv = dev_get_drvdata(&wdev->dev); + unsigned int i; + int ret; + u32 id; + + for (i = 0; i < priv->temp_count; i++) { + /* + * Temperature sensors IDs are listed after the fan IDs at + * offset `fan_count` + */ + ret = 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_get_fan_label(struct device *dev, u32 temp_count, u8 temp_id) +{ + char *label; + + switch (temp_count) { + case 0: + label = "Independent Fan"; + break; + case 1: + switch (temp_id) { + case AWCC_TEMP_SENSOR_CPU: + label = "Processor Fan"; + break; + case AWCC_TEMP_SENSOR_GPU: + label = "Video Fan"; + break; + default: + label = "Unknown Fan"; + break; + } + + break; + default: + label = "Shared Fan"; + break; + } + + return label; +} + +static int awcc_hwmon_fans_init(struct wmi_device *wdev) +{ + struct awcc_priv *priv = 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 = 0; i < priv->fan_count; i++) { + fan_data = devm_kzalloc(&wdev->dev, sizeof(*fan_data), GFP_KERNEL); + if (!fan_data) + return -ENOMEM; + + /* + * Fan IDs are listed first at offset 0 + */ + ret = awcc_op_get_resource_id(wdev, i, &id); + if (ret) + return ret; + id = FIELD_GET(AWCC_RESOURCE_ID_MASK, id); + + ret = awcc_thermal_information(wdev, AWCC_OP_GET_FAN_MIN_RPM, id, + &min_rpm); + if (ret) + return ret; + + ret = awcc_thermal_information(wdev, AWCC_OP_GET_FAN_MAX_RPM, id, + &max_rpm); + if (ret) + return ret; + + ret = awcc_get_fan_sensors(wdev, AWCC_OP_GET_TOTAL_FAN_TEMPS, id, + 0, &temp_count); + if (ret) + return ret; + + for (j = 0; j < temp_count; j++) { + ret = awcc_get_fan_sensors(wdev, AWCC_OP_GET_FAN_TEMP_ID, + id, j, &temp_id); + if (ret) + break; + + temp_id = FIELD_GET(AWCC_RESOURCE_ID_MASK, temp_id); + __set_bit(temp_id, fan_temps); + } + + label = awcc_get_fan_label(&wdev->dev, temp_count, temp_id); + if (!label) + return -ENOMEM; + + fan_data->id = id; + fan_data->min_rpm = min_rpm; + fan_data->max_rpm = max_rpm; + fan_data->label = label; + bitmap_gather(gather, fan_temps, priv->temp_sensors, AWCC_ID_BITMAP_SIZE); + bitmap_copy(&fan_data->auto_channels_temp, gather, BITS_PER_LONG); + priv->fan_data[i] = 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 = dev_get_drvdata(&wdev->dev); + int ret; + + priv->fan_data = devm_kcalloc(&wdev->dev, priv->fan_count, + sizeof(*priv->fan_data), GFP_KERNEL); + if (!priv->fan_data) + return -ENOMEM; + + ret = awcc_hwmon_temps_init(wdev); + if (ret) + return ret; + + ret = awcc_hwmon_fans_init(wdev); + if (ret) + return ret; + + priv->hwdev = devm_hwmon_device_register_with_info(&wdev->dev, "alienware_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 *wdev) priv->wdev = wdev; dev_set_drvdata(&wdev->dev, priv); + if (awcc->hwmon) { + ret = awcc_hwmon_init(wdev); + if (ret) + return ret; + } + if (awcc->pprof) { ret = awcc_platform_profile_init(wdev); if (ret) @@ -824,6 +1213,13 @@ int __init alienware_wmax_wmi_init(void) if (id) awcc = id->driver_data; + if (force_hwmon) { + if (!awcc) + awcc = &empty_quirks; + + awcc->hwmon = true; + } + if (force_platform_profile) { if (!awcc) awcc = &empty_quirks; From patchwork Thu Mar 13 14:30:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015205 Received: from mail-yb1-f181.google.com (mail-yb1-f181.google.com [209.85.219.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D6F28269827; Thu, 13 Mar 2025 14:30:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876232; cv=none; b=CWhy62rOnXWY3JmYzAHasVJoIPU2Wap0EPyT7pVZkgrOqh3LgWPqhwdkJs32oIThEGa1+xXGtJGyHxHC4qSnr0LWytvCCeD9zdQdMsKlhDRLqmGY27QpSoR/dkLbkB/zlpG3wP/Tr7PKJdU8FmKa82F2dT7j6aRDRQv5dVk2xXI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876232; c=relaxed/simple; bh=ivAY+5mUtEoo0Yn/CdswmOdOT+MH1hiQsZQtqNwGuvs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UWP2NRfayfQ7nJVBrtp7KmV7tsBrWzDi7fYj98U2/K1wcWnH2J3woCvqChsJCGdHiSutBI67oD1AeqnvSXaMoSPjoAodaG/Iqqwxy7yGHrghWoZ9w7oosuRJ2p06yJBz8+Cq2mJ5Mqpi+4qaUw+2UsSr9Zw8aj7+pR4pIEgKV1U= 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=UoNB4Q9L; arc=none smtp.client-ip=209.85.219.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UoNB4Q9L" Received: by mail-yb1-f181.google.com with SMTP id 3f1490d57ef6-e60f212fee7so734430276.1; Thu, 13 Mar 2025 07:30:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876229; x=1742481029; 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=7RWLQ6OJvPjGY+MuzQcOxHw/mUwbQwWGIpX/Qme8AKs=; b=UoNB4Q9LNKhhRQ+w8ekwsRrlAShGAkZypL3IY6lH3RNFYB1AnfJs+OGXwSzTdFDqIA 6ypbNKu5TU8SGEvG58yEhPPXf7OwYn9IfMHvYrsztqDNeoL1nmipKfV1ytf0ccHTQf/L XihEpGhjjVggmVjwaFB+vak5Alyb2Ukcvdx3sHYh/1u7IdwR1ha/20AHqNizn0c4ZRHP TEwWvdb7+a5tD5WFmR7NYvrIo2yQqTjHINitcHyKKAiaH6L3XbuFBKvMR0l8nHqoEdm0 2+sfWjVEp5rp9UU5IwvcHa+pj/UR81tUshLKN8RO3mImx0Bh23i2AMurgiD4sr1J47tr jRWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876229; x=1742481029; 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=7RWLQ6OJvPjGY+MuzQcOxHw/mUwbQwWGIpX/Qme8AKs=; b=E9/qog286fz9KwRS2HRwexbBum8qZ+FYt0YlxmiTItHSIOPT9a0SOc7+PYi20kDScK 3OFtHlntiLsdQoTt/guGPC9FkYTBRLDa78ijIw0rehmqx88braINY4ln880oNJcMT/QG vQ+IwDWLAvVCIHsNfLzG0sC0xomsIWUg73K6++vS4Ra/0NNtygahpy4emQqdTnnlFRQ6 FVx/1CUwWxlaonUc0ULz3ltQxWSodrDx2D3wAeUkJZRNePQtX6n70ffw34kCG1rgl3wM vCZE/sJwn4TjGNSa9qcrXqGB0+C4jfzE0DVeKKcEpeCK7mGrnjeKZ3K49BBOfwgnvWyE Bicg== X-Forwarded-Encrypted: i=1; AJvYcCUZQU10W5IyyqVoK/K0Eji7VLPAHUWC/s4D2gfOhsu9Npbrp8asiGamPiZVjvY/78+pdS4UlAcExmOUx4b0Xnc0u+ueHw==@vger.kernel.org, AJvYcCVBKrunoE0Qf4pOfvz5XYjxyfu7FvUqmVpuSgJausn8txOfrogrPM31gbT3n5g36JgNQ+kE2keRUlVacdYY@vger.kernel.org, AJvYcCXqXQZ32ZCNS32hzAUUPHHD/v7066ze01As3qJgDEVBfuh5TDw6lvXRoYuwjtdNDt+QQT3oRncdjQYk1g==@vger.kernel.org X-Gm-Message-State: AOJu0YyCmH8pugSeSgxGUW2Kc5NLc93JbOGdy0kwebj7XXmbvDKhEcul QsqGsGtfCEB0r12YsKidV35Gx7btRhQBVUjxx+reV6a2ea+5mao80qw5bKqS X-Gm-Gg: ASbGncvP5l7VRUabPTZLQs1N61ZaXvxtVsntk/cFZuxI9kCUactSVGPojicROVl5NOl Q1qIuz4A2+7ql7zLz4R8vqv9oHRkr69XOneY7H1ZYzWava8ZVYXvOw1J6ZDH2UxHOi4FXbXBZWO 3s8IsO8n3eJBTaO3XeEgBrpKR0f6nF8H9XMOJN7X7wPTzebx+ccQzWEkwhV5QjERtf1oLrP3gfy 8exVD9xsNgO/u78g0tv2JjA+3kc9/2a7AAMuQ8TSlqaP0knDBJ4TsVlBJ2B7TsXEacWEuF11qSe sTrhVFueuXrD2ArrB+9uqkXCf4BF0qMeD6tIybIpn+v8FQ== X-Google-Smtp-Source: AGHT+IF1hEpC9u58s6TqP+szXZJpBOVH2hyllVVoIbdjkvOgzDQU25h0wLZdBmudFd+usFibYoaKCA== X-Received: by 2002:a05:6902:260e:b0:e63:d299:8705 with SMTP id 3f1490d57ef6-e63d29987b2mr5988645276.31.1741876229443; Thu, 13 Mar 2025 07:30:29 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:29 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:03 -0500 Subject: [PATCH v6 08/12] platform/x86: alienware-wmi-wmax: Add support for manual fan control Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-8-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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 = pwm_base + (fan_boost / 255) * (pwm_max - pwm_base) Where the pwm_base is the locked PWM value controlled by the FW and fan_boost is a value between 0 and 255. Expose this fan_boost knob as a custom HWMON attribute. Cc: Guenter Roeck Cc: Jean Delvare Cc: linux-hwmon@vger.kernel.org Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- drivers/platform/x86/dell/alienware-wmi-wmax.c | 174 ++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 2 deletions(-) diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c index 0c30ffb6091a15d81f4dc959dfd28417249d3dda..823b579260555085ef6ac793b806738a756bb9da 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 = 0x08, AWCC_OP_GET_FAN_MAX_RPM = 0x09, AWCC_OP_GET_CURRENT_PROFILE = 0x0B, + AWCC_OP_GET_FAN_BOOST = 0x0C, }; enum AWCC_THERMAL_CONTROL_OPERATIONS { AWCC_OP_ACTIVATE_PROFILE = 0x01, + AWCC_OP_SET_FAN_BOOST = 0x02, }; 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; }; @@ -628,6 +635,18 @@ static inline int awcc_op_get_temperature(struct wmi_device *wdev, u8 temp_id, u return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); } +static inline int awcc_op_get_fan_boost(struct wmi_device *wdev, u8 fan_id, u32 *out) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_GET_FAN_BOOST, + .arg1 = fan_id, + .arg2 = 0, + .arg3 = 0, + }; + + return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out); +} + static inline int awcc_op_get_current_profile(struct wmi_device *wdev, u32 *out) { struct wmax_u32_args args = { @@ -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); } +static inline int awcc_op_set_fan_boost(struct wmi_device *wdev, u8 fan_id, u8 boost) +{ + struct wmax_u32_args args = { + .operation = AWCC_OP_SET_FAN_BOOST, + .arg1 = fan_id, + .arg2 = boost, + .arg3 = 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_info = { .info = awcc_hwmon_info, }; +static ssize_t fan_boost_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct awcc_priv *priv = dev_get_drvdata(dev); + int index = to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan = priv->fan_data[index]; + u32 boost; + int ret; + + ret = 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 = dev_get_drvdata(dev); + int index = to_sensor_dev_attr(attr)->index; + struct awcc_fan_data *fan = priv->fan_data[index]; + unsigned long val; + int ret; + + ret = kstrtoul(buf, 0, &val); + if (ret) + return ret; + + ret = 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 attribute *attr, int n) +{ + struct awcc_priv *priv = 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[] = { + &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 = { + .attrs = fan_boost_attrs, + .is_visible = SYSFS_GROUP_VISIBLE(fan_boost), +}; + +static const struct attribute_group *awcc_hwmon_groups[] = { + &fan_boost_group, + NULL +}; + static int awcc_hwmon_temps_init(struct wmi_device *wdev) { struct awcc_priv *priv = dev_get_drvdata(&wdev->dev); @@ -954,12 +1061,56 @@ static int awcc_hwmon_init(struct wmi_device *wdev) if (ret) return ret; - priv->hwdev = devm_hwmon_device_register_with_info(&wdev->dev, "alienware_wmi", priv, - &awcc_hwmon_chip_info, NULL); + priv->hwdev = devm_hwmon_device_register_with_info(&wdev->dev, "alienware_wmi", + priv, &awcc_hwmon_chip_info, + awcc_hwmon_groups); return PTR_ERR_OR_ZERO(priv->hwdev); } +static void awcc_hwmon_suspend(struct device *dev) +{ + struct awcc_priv *priv = dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + u32 boost; + int ret; + + for (i = 0; i < priv->fan_count; i++) { + fan = priv->fan_data[i]; + + ret = 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 = 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 = dev_get_drvdata(dev); + struct awcc_fan_data *fan; + unsigned int i; + int ret; + + for (i = 0; i < priv->fan_count; i++) { + fan = priv->fan_data[i]; + + if (!fan->suspend_cache) + continue; + + ret = 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, const void *context) return ret; } +static int wmax_wmi_suspend(struct device *dev) +{ + if (awcc->hwmon) + awcc_hwmon_suspend(dev); + + return 0; +} + +static int wmax_wmi_resume(struct device *dev) +{ + if (awcc->hwmon) + awcc_hwmon_resume(dev); + + return 0; +} + +static DEFINE_SIMPLE_DEV_PM_OPS(wmax_wmi_pm_ops, wmax_wmi_suspend, wmax_wmi_resume); + static const struct wmi_device_id alienware_wmax_device_id_table[] = { { WMAX_CONTROL_GUID, NULL }, { }, @@ -1199,6 +1368,7 @@ static struct wmi_driver alienware_wmax_wmi_driver = { .driver = { .name = "alienware-wmi-wmax", .probe_type = PROBE_PREFER_ASYNCHRONOUS, + .pm = pm_sleep_ptr(&wmax_wmi_pm_ops), }, .id_table = alienware_wmax_device_id_table, .probe = wmax_wmi_probe, From patchwork Thu Mar 13 14:30:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015206 Received: from mail-yw1-f178.google.com (mail-yw1-f178.google.com [209.85.128.178]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6DBA82698BC; Thu, 13 Mar 2025 14:30:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876234; cv=none; b=WzqbI19xhOZS5GX4Pf0MGNoI9BLGu3dAAI0LbwMWOQNbHB/FcD87BTYsqhgtlrNebS0cEUVhjicFONMFi6o8DHEh2fb7TzcTNAansTJU60soGYIe8eWj/aJ5jnyAljDF492tlbVdBZmq8Wt25cbZHIyViV0Q9gf/lvCTldCrCPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876234; c=relaxed/simple; bh=ZvzPBd7CyT6TPutX3RzSw4oI/HMVtgz3XsoaM+0Sm3w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j5ZRLv7ezWwy5DCJLJSQRH4p1u866xmkqR2ksLrQH3yXaze06ZdeBRaiboKlzpNvKvszSkBpeTvYZwvsMBUi0T0TkDhjzPFrvBvYU1+4CBQMdXLr98wL5sSfk/h7lW0p7qSfBCdy2tZBimlGypGysMUm8sLN39HAjrMBSY5NJj4= 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=Fi55fLzQ; arc=none smtp.client-ip=209.85.128.178 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Fi55fLzQ" Received: by mail-yw1-f178.google.com with SMTP id 00721157ae682-6ff07872097so8872067b3.3; Thu, 13 Mar 2025 07:30:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876231; x=1742481031; 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=6CvqXIK1HKLafOhJzmaRIgOV23DcLfPOQLHCwOVZEuM=; b=Fi55fLzQw3PkaHSLR/R0llBzPg3cq1i4e6YVv+ieiqUp8naVUrRMfV0pSzc2VdbDlr m7EQrAvHAyE0id9c2nfluBqcwzp2Q7wKcQkugOgyPyKODU2WTt7ugdKHG1Fa53zcDjo0 BPpyNzVmqYf8aQooKZ9+cza0gK3jDZcS5AbOEc6nGH5YknEw/K3o3RR9riAjm4XvlKRU yYn4Qv4etTeQm3G1gSYyBkbhf7a+FS1VNZ3dC6sOpuvyU1XKxiMXrl3piCKNqWgzQgtT ZhYenhE9pEKzVs3H/TwpJTJcIhHGgt8Bho+tBUtrW2KezlAlX5o+w4tiiKXvUcfqOWXv fHPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876231; x=1742481031; 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=6CvqXIK1HKLafOhJzmaRIgOV23DcLfPOQLHCwOVZEuM=; b=R/ykmoG4MiNE/uEthEoJTiHHdRncrShED6PIg2b/TT4ZE+L8oGy+gT/wqTrOAslYDl icIoRvr71wDb5frSK7FZbJamJodHRKV2meojInH9RMFRMLZAxXEpAvz3Hy+UEXKHhC/+ UKe0zZGap6UnwvyseQY3hSS9ZqRLG0NkgPbJSKUyLhk1vnpI73I4rYGGsKZiZ0ZBcbWJ CRYPf0wUM4NatmjvmNK/hNYVA7dbU20PGYQqJstkjjPrLPRN09LXegz6D+Kca8NFnXwI fybD7eF9Oc7cv5OrKrHwpXR2XvKpuWkmptKt5eML4FDc8lweu2lJEBuQsb3sV1WtrIq3 Dv0g== X-Forwarded-Encrypted: i=1; AJvYcCUsx+oGKfwk7w9/jUxRORhbqgWzFSTcOW3Ts1L1YK0YgaQEFsc/SaCCRM6cyYPhmPu3iEfkYsWWqmpgKYCYlQC0vOFfCQ==@vger.kernel.org, AJvYcCXjinesk/jhwaFQTxsmMKCx6Bw3oU2LME6E0wlpOKD5xsmrEK84jpMKzUoIMDOG0zwGZAWy1sdHDhHUMpI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/GGxmKweznzIL9MUhdkCZ26iWEtpHIzP03O4KoJYQzMw/r1oC S+hLm8e4dKJyyrtY4UGKRllV+p63iWrSBcCfsyQybhhlJCWnTxTpl+HhUTvZ X-Gm-Gg: ASbGncuVCdryECmgTD4OtsmTI3i3qBBCKN6kqT+DFmqlIUc0Px5ky9YxCVO6I3/8F0B ttoG0TASdgx69liWXcHuDs0zrnLQlVGFYzBy7iRKHGwsJtRzQz5g0RY50nfEagZ4HqKsz8CAv8A VHr/XcGA0e8O5arK1J6xYR7mealQzn4bTNfbRUVxws7duLDfyWiT0EGvB7kl1jnlFZUZh2fo4Q9 NsTnBH0zgy+JLHEOv4UsRbF9IVgrpL1/32NMnDCXpmJfEGvH3bzo8uB0ThHKeKG2x40mb20odfA iLS27nVgJ5mWkzH5wIObvyEljtNR15YK5YUmzgcftfBQuQ== X-Google-Smtp-Source: AGHT+IECycEP6tdbMhuIwGBhPz887Ioicikyg6JsVvULRdpINQCWyhCrxMomdvFfI1YbiSoFyRSL9w== X-Received: by 2002:a05:6902:3101:b0:e5d:ddd2:8acf with SMTP id 3f1490d57ef6-e635c1d966bmr26174905276.38.1741876230964; Thu, 13 Mar 2025 07:30:30 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:30 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:04 -0500 Subject: [PATCH v6 09/12] platform/x86: alienware-wmi-wmax: Add a DebugFS interface Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-9-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/platform/x86/dell/alienware-wmi-wmax.c index 823b579260555085ef6ac793b806738a756bb9da..472e6289fec5be0db0a5cb8e76718b750fa558b5 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_device *wdev) return PTR_ERR_OR_ZERO(priv->ppdev); } +/* + * DebugFS + */ +static int awcc_debugfs_system_description_read(struct seq_file *seq, void *data) +{ + struct device *dev = seq->private; + struct awcc_priv *priv = 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 = seq->private; + struct awcc_priv *priv = 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 = 0; i < priv->fan_count; i++) { + fan = 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 = seq->private; + struct awcc_priv *priv = dev_get_drvdata(dev); + + seq_printf(seq, "Number of thermal profiles: %u\n\n", priv->profile_count); + + for (u32 i = 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 = 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(&wdev->dev)); + root = 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 *wdev) return ret; } + awcc_debugfs_init(wdev); + return 0; } From patchwork Thu Mar 13 14:30:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015208 Received: from mail-yb1-f173.google.com (mail-yb1-f173.google.com [209.85.219.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2D01269D15; Thu, 13 Mar 2025 14:30:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876238; cv=none; b=g5ghgm/+oNTN+wbEVRR/NyuVGdtmvDQ17q4bdo0d5T5OmrFWuYg2reuEWSTR6CKTw1gIyzmzwS0PoGE7eN4n3lvnaUumj5t5Kp9x/wHIFw2PmNm1CcU8/e4I1yq25fniP1OIyCq3Zm+Yzi+F7S2Z/vKUw2WATqPrxniA8pcSyRw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876238; c=relaxed/simple; bh=7xu59QVIatBVpYJa1Dkam5LKCr4ecNWmwMnn1XOpgxM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pr84w7xezKvAgGFdflbZ3jzHggpqyg3cj+w39aJfoDLz5z2Rr/kkRK+n2LRRCW5+p95kRgDNkmGaT+o6aurYPciFepRliZVruFRLPq8iZdAlj/PtVD4R5dN5cuZ6IVFXUx7J9mj9XREMl/ZcJIzrMszK4qZuu1NwwX5mWX10u+w= 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=MpQzWP6V; arc=none smtp.client-ip=209.85.219.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="MpQzWP6V" Received: by mail-yb1-f173.google.com with SMTP id 3f1490d57ef6-e46ebe19489so888247276.2; Thu, 13 Mar 2025 07:30:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876233; x=1742481033; 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=MpQzWP6VBk70YtiOcZ/tCgMuHN6Md22qcGakX79G3yzl6QTyXpQ4befYi03FwqIltd 46cc9zlngeyYZG4pkPVbOOGPPcXSKENnBu6Za2fWyADD9QJlOYSXsO39bvHFuIYFzMMx /yoe4DYccJHP80qCX8r99SytyqR9IVvum1qcRX5Gem5JBOgELHmQ03YgQHd2wVSmZs4S jCBhLiLOhhzR9X++/lSghCEsj+HcqBvd5TXdYX/bIKPs5/Ec0I+rLa+GE0oD19VPugHq K+hAlf+sJWqPc3CGUGmsFRWYCp9tVFVSUu4wfUBxcnQxLlMN4KxJyJV2x2DJPHqo7wXy /Gvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876233; x=1742481033; 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=lhgobS1RDmRgl1APRENV1Sw0h+pCAr3Ch1pC3hB+Vgs86WTg//AeKpRycnyYdBbOQy jOijrr4zhl+w61BfXIXNq4SqgXCHgSziJwKDazvnr6E3DwsWVjaGjAivRZuMCuV9z9uH yKb3BRM0v1zqCBZPRwMeY/evg0yiSmVAnlKaRwJXO4Iad3scWQXyWNITTvGM/ZwVPCnN WnQSG31BjEnaw6iFr9RGZJghuJJqhwxgM/6Kg0QBatrJ7H9h7b+n031pPjIk31b9VFwI 7QBvv/LHAtZQDb9ZoDALZlSuujUjJk0wuyTMpyFs7oyFvHmODLpo73XBKshS3Lve7+lT FxHA== X-Forwarded-Encrypted: i=1; AJvYcCWTZZr1AzwJKaKkd7M1POYoP6C1rpxzjcK1j/tRTaKrDjMdaItXw8+Hl4nyYKg6Vn1BHyBxZeAR+T5oKkw=@vger.kernel.org, AJvYcCWvJgzL67p/jh22sL2SCP60eUSjFsdlyaQkSQvNfuONxO6OXO44Xk/HVoA8P0kgGvEsDjEk40wPc9qHszor5YYcObV5KA==@vger.kernel.org X-Gm-Message-State: AOJu0Yx87W0HHtatyQs4wz+DdFtjdd57+25aId8zYXG+35t4pFXWbKI/ 4zP45939Doojow+yzdHMaVDvOMg9kL8NyMUGAy+9Yk6TFnm9wai1 X-Gm-Gg: ASbGncv4rhkMt6wZb8jLIlg3+1l5FciePPq45EmFC2HlysWRrGFsMqonBYB1K6VzhGg 2upPRQy/2QISCy9HtM0J4JuuAU/hRUwcdFSHunwzYFRUUiilKyCjWYpuMSz+LQsB9uQzFgzBj1t Ew4yLiFOKVqwje09BwqiRilEoaL13UeM9lgmB9nFiMpzlkj1FEewUl4WUJMCIwStTDN2VMeuFjH 2zgSlZcEfiePvZSgEkv5XA4rSfdZ3Su1byx1+ht1Im3lZsAW9SruEnfXFg5D0kOBDNzIR0rZXHU SmlIgD3u8mniYW6sR8JfZp3gkzmCvlm7Sv4kuD8ivT19ow== X-Google-Smtp-Source: AGHT+IH09AesIQBjUBxsApIZQvHyYZm6UZ9u67B7m+1ckEnFWBOgtSLn7GunC15gO9RKs7x54Sd2Lg== X-Received: by 2002:a05:6902:310b:b0:e5b:4482:a4f7 with SMTP id 3f1490d57ef6-e635c1382fdmr31684786276.12.1741876233099; Thu, 13 Mar 2025 07:30:33 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:32 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:05 -0500 Subject: [PATCH v6 10/12] Documentation: wmi: Improve and update alienware-wmi documentation Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-10-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@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/wmi/devices/alienware-wmi.rst index ddc5e561960e05fc7cffe700d7d278e32ff2e7b2..79238051b18bc5de9b502325017cd5c5fcf41748 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 Alienware 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, amplifier and deep sleep control. The second one used by newer systems deals primarily -with thermal, overclocking, and GPIO control. +with thermal control and overclocking. 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); }; -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. Argument Structure @@ -87,175 +84,133 @@ ID 0xA0, the argument you would pass to the method is 0xA001. Thermal Methods =============== +WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) +------------------------------------------------------------- + ++--------------------+------------------------------------+--------------------+ +| Operation (Byte 0) | Description | Arguments | ++====================+====================================+====================+ +| 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: Index | ++--------------------+------------------------------------+--------------------+ + WMI method Thermal_Information([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- -:: - - if BYTE_0(arg2) == 0x01: - argr = 1 - - if BYTE_0(arg2) == 0x02: - argr = SYSTEM_DESCRIPTION - - if BYTE_0(arg2) == 0x03: - if BYTE_1(arg2) == 0x00: - argr = FAN_ID_0 - - if BYTE_1(arg2) == 0x01: - argr = FAN_ID_1 - - if BYTE_1(arg2) == 0x02: - argr = FAN_ID_2 - - if BYTE_1(arg2) == 0x03: - argr = FAN_ID_3 - - if BYTE_1(arg2) == 0x04: - argr = SENSOR_ID_CPU | 0x0100 - - if BYTE_1(arg2) == 0x05: - argr = SENSOR_ID_GPU | 0x0100 - - if BYTE_1(arg2) == 0x06: - argr = THERMAL_MODE_QUIET_ID - - if BYTE_1(arg2) == 0x07: - argr = THERMAL_MODE_BALANCED_ID - - if BYTE_1(arg2) == 0x08: - argr = THERMAL_MODE_BALANCED_PERFORMANCE_ID - - if BYTE_1(arg2) == 0x09: - argr = THERMAL_MODE_PERFORMANCE_ID - - if BYTE_1(arg2) == 0x0A: - argr = THERMAL_MODE_LOW_POWER_ID - - if BYTE_1(arg2) == 0x0B: - argr = THERMAL_MODE_GMODE_ID - - else: - argr = 0xFFFFFFFF - - if BYTE_0(arg2) == 0x04: - if is_valid_sensor(BYTE_1(arg2)): - argr = SENSOR_TEMP_C - else: - argr = 0xFFFFFFFF - - if BYTE_0(arg2) == 0x05: - if is_valid_fan(BYTE_1(arg2)): - argr = FAN_RPM() - - if BYTE_0(arg2) == 0x06: - skip - - if BYTE_0(arg2) == 0x07: - argr = 0 - - If BYTE_0(arg2) == 0x08: - if is_valid_fan(BYTE_1(arg2)): - argr = 0 - else: - argr = 0xFFFFFFFF - - if BYTE_0(arg2) == 0x09: - if is_valid_fan(BYTE_1(arg2)): - argr = FAN_UNKNOWN_STAT_0() - - else: - argr = 0xFFFFFFFF - - if BYTE_0(arg2) == 0x0A: - argr = THERMAL_MODE_BALANCED_ID - - if BYTE_0(arg2) == 0x0B: - argr = CURRENT_THERMAL_MODE() - - if BYTE_0(arg2) == 0x0C: - if is_valid_fan(BYTE_1(arg2)): - argr = FAN_UNKNOWN_STAT_1() - else: - argr = 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 | ++====================+====================================+====================+ +| 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: Index | +| | 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: Sensor | +| | 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. | | ++--------------------+------------------------------------+--------------------+ WMI method Thermal_Control([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- -:: - - if BYTE_0(arg2) == 0x01: - if is_valid_thermal_profile(BYTE_1(arg2)): - SET_THERMAL_PROFILE(BYTE_1(arg2)) - argr = 0 - - if BYTE_0(arg2) == 0x02: - if is_valid_fan(BYTE_1(arg2)): - SET_FAN_SPEED_MULTIPLIER(BYTE_2(arg2)) - argr = 0 - else: - argr = 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 | ++====================+====================================+====================+ +| 0x01 | Activate a given thermal profile. | - Byte 1: Thermal | +| | | profile ID | ++--------------------+------------------------------------+--------------------+ +| 0x02 | Set a `boost` value for a given | - Byte 1: Fan ID | +| | fan ID. | - Byte 2: Boost | ++--------------------+------------------------------------+--------------------+ These are the known thermal profile codes: -:: ++------------------------------+----------+------+ +| Thermal Profile | Type | ID | ++==============================+==========+======+ +| 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 | ++------------------------------+----------+------+ - CUSTOM 0x00 +If a model supports the User Selectable Thermal Tables (USTT) profiles, it will +not support the Legacy profiles and vice-versa. - 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 support -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. WMI method GameShiftStatus([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- -:: - - if BYTE_0(arg2) == 0x1: - TOGGLE_GAME_SHIFT() - argr = GET_GAME_SHIFT_STATUS() - - if BYTE_0(arg2) == 0x2: - argr = GET_GAME_SHIFT_STATUS() ++--------------------+------------------------------------+--------------------+ +| Operation (Byte 0) | Description | Arguments | ++====================+====================================+====================+ +| 0x01 | Toggle *Game Shift*. | - None | ++--------------------+------------------------------------+--------------------+ +| 0x02 | Get *Game Shift* status. | - None | ++--------------------+------------------------------------+--------------------+ Game Shift Status does not change the fan speed profile but it could be some 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 are directly related. -WMI method GetFanSensors([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------- - -:: - - if BYTE_0(arg2) == 0x1: - if is_valid_fan(BYTE_1(arg2)): - argr = 1 - else: - argr = 0 - - if BYTE_0(arg2) == 0x2: - if is_valid_fan(BYTE_1(arg2)): - if BYTE_2(arg2) == 0: - argr == SENSOR_ID - else - argr == 0xFFFFFFFF - else: - argr = 0 - Overclocking Methods ==================== -.. warning:: - These methods have not been tested and are only partially reverse - engineered. - -WMI method Return_OverclockingReport([out] uint32 argr) -------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr = 0 - -CSMI is an unknown operation. - -WMI method Set_OCUIBIOSControl([in] uint32 arg2, [out] uint32 argr) -------------------------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr = 0 - -CSMI is an unknown operation. - -WMI method Clear_OCFailSafeFlag([out] uint32 argr) --------------------------------------------------- - -:: - - CSMI (0xE3, 0x99) - argr = 0 - -CSMI is an unknown operation. - - WMI method MemoryOCControl([in] uint32 arg2, [out] uint32 argr) --------------------------------------------------------------- AWCC supports memory overclocking, but this method is very intricate and has not been deciphered yet. -GPIO methods -============ - -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) == 0: - if BYTE_1(arg2) == 1: - SET_PIN_A_HIGH() - else: - SET_PIN_A_LOW() - - if BYTE_0(arg2) == 1: - if BYTE_1(arg2) == 1: - SET_PIN_B_HIGH() - - else: - SET_PIN_B_LOW() - - else: - argr = 1 - -WMI method ReadTotalofGPIOs([out] uint32 argr) ----------------------------------------------- - -:: - - argr = 0x02 - -WMI method ReadGPIOpPinStatus([in] uint32 arg2, [out] uint32 argr) ------------------------------------------------------------------- - -:: - - if BYTE_0(arg2) == 0: - argr = PIN_A_STATUS - - if BYTE_0(arg2) == 1: - argr = PIN_B_STATUS - Other information Methods ========================= WMI method ReadChassisColor([out] uint32 argr) ---------------------------------------------- -:: - - argr = CHASSIS_COLOR_ID +Returns the chassis color internal ID. Acknowledgements ================ -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 generalize +this driver. From patchwork Thu Mar 13 14:30:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015207 Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01DCC267F70; Thu, 13 Mar 2025 14:30:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876237; cv=none; b=Il2BDZvBrhEUZCFboFx1XOXNygCVp1wi2KoMJU6FM6bFjob4fUOtAKjNHrDl8sICi+7ACXrAiTk2+gODjvq0lGVbsZ8N56FptllDnL3z+lQgO1Oo3+truXaF58g4B79HGMDZRWndle4kntl0NdcCykELAXqVAbOPpBCk/qKhVQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876237; c=relaxed/simple; bh=9bd+fFXZOGpfjf5fiMZ91f038xwI4VpLqB8yAWQipxk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=F0snGla4drfR+eM3CVi1cywKgAAsMkBjCM5MTEno5CtbSNQd08ECYbLsnjS0kjKE/FnyNyLFi3vF5QQpFj7ZgUVhW12ZMOZWfcgwnLaIAnV9+eKUvoJiOt+sPq8JhNd7bMUJPaPEucAWwF9EBKyxskXrQu939DkCrH0OGim3qME= 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=FeN6FEa2; arc=none smtp.client-ip=209.85.219.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="FeN6FEa2" Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-e3c8ae3a3b2so882262276.0; Thu, 13 Mar 2025 07:30:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876235; x=1742481035; 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=dOocp0DmQcn5u4f3g9aw3Ib1o2FEUYsoDQmnBjH/Bjw=; b=FeN6FEa29WnH0cLYEEoN9oUXl+tvfta2J1elkQkK9/EG+Rxx4s2TfnKVqs+Ja29aCW LF0XOEspfYXiWtLMVYQfe93jfKb5qD/gmwac5vUFyuUHlZ7W/i5M3/5J2W54KqaA87j/ a+4C+kjf7GDma2X0Ra0pmhF8zDvUrh7+H9qhcFcd3SQgfVEXpmnOJ2xeRgs0c12dqppL wfZZq3RJmvu9HvrFseXg6XENFnhiN3Ym5lAPWQRgd7Kmtgui7DHT+K4PmSHOAalVL+p7 g3/zGVRyv5HTVnSNKdBQLrbkIwp2yy/SYWR51dUg03PdvvkQROY4TvZGeBvZlWNWj+1G zgFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876235; x=1742481035; 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=dOocp0DmQcn5u4f3g9aw3Ib1o2FEUYsoDQmnBjH/Bjw=; b=SnRurExEnjDu2IXcOUNwDXqvvsyswivqgWWUghTqlsSKtYPxvZUUJ0m0KuOnn7KBF3 3Vdr4W7lGzisEhyubeqvCZX8sfEU9B1O6LUwSTvBjEWDytvUQA1QPI9oT2uEIKbRQk3j G5KHbN4X7/9QVUf4n/uIax9SXstbiP05wZqkO7DyW6P9mQ3V+WeqIEsl95SLM7y7PG6K 3w8cKUptj8iO9EuLOJqhZI0kLzupHmtXpBOjB/CdrAL0qxHcSFLORBlt9u826Gi796KG W1eTwPUwriCs9gy5ViBtTx+T404S2yoLtMHgRzekDYbyLV2x1kSSyhqUIOfGmslvla1L mFzQ== X-Forwarded-Encrypted: i=1; AJvYcCU7P9gezJIvGuXeA3vfhdH42C896Q61VhbTtvJt0FNPoK5fwRuz7GSO9Yz2euwQmZPP5ZM5n2UExpmS9DU=@vger.kernel.org, AJvYcCXHmrZ+Tv15BCdMCfn87kNgnY3vot3l1qxecftaamkSc7VnkqjAuSp+cOntg1Q1H/mN5R92PXNCgDHL7+W1VvGcLjg4ig==@vger.kernel.org X-Gm-Message-State: AOJu0Yw4TWi99Xh/Z6pdxvXJu0CCK+q8nOCwi25SW4VbcmgpBc9YUg9K 4ZXskY9Ue9r6eGRnvPl48w4c7avS8S8Sm76ZKQeR4PZvCSLlw5B46F18Z53I X-Gm-Gg: ASbGncsB0mXCaRMmXZCw/OX5xWtMOecv4DPvrBsHiwDRUzgtKNSmm24+muuMRVEuTRE 6mbbWaycBwCG+1FTJX4exHmFKKvGhrag9s5IKTFgEDOCgZOdCsr4JmAMVU7WMfO7+PBEc3T/JBo uL+awN1T6oWwE9BavHYAhjzvFbYJEp3EnEYhX1LgH+AlmUnTtkUJwM8QAXCX6dBzJPF1HjUL9eg 0wliy8UvGqiMIJ4C+DRU1juilFXGJtI0D6l67G7EkrKFLugYcfjkegLchKNW19qC2hw/Amhw6Q8 Db6R3LwFKSgAUd+OfkVS6sJFaraehVgmbM77jzJT0uvWww== X-Google-Smtp-Source: AGHT+IGwMVc2RU+zHHELmrIwICHYTq1+E+km6vWD4wbCL6PpVAiutZscBAPkJahHzbgQk7SEDEG01w== X-Received: by 2002:a05:6902:348a:b0:e60:aa39:11f2 with SMTP id 3f1490d57ef6-e635c1d97c3mr27214369276.32.1741876234584; Thu, 13 Mar 2025 07:30:34 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:34 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:06 -0500 Subject: [PATCH v6 11/12] Documentation: admin-guide: laptops: Add documentation for alienware-wmi Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-11-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add driver admin-guide documentation for the alienware-wmi driver. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- .../admin-guide/laptops/alienware-wmi.rst | 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/Documentation/admin-guide/laptops/alienware-wmi.rst new file mode 100644 index 0000000000000000000000000000000000000000..fe7dec73706f8ec85040dc1cbaec38ffda70b563 --- /dev/null +++ b/Documentation/admin-guide/laptops/alienware-wmi.rst @@ -0,0 +1,128 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +==================== +Alienware WMI Driver +==================== + +Kurt Borja + +This is a driver for the "WMAX" WMI device, which is found in most Dell gaming +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 thermal +profiles, sensor monitoring and overclocking. This interface is named "AWCC" and +is known to be used by the AWCC OEM application to control these features. + +The alienware-wmi driver controls both interfaces. + +AWCC Interface +============== + +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 module +parameters: + +- ``force_platform_profile=1``: Forces probing for platform profile support +- ``force_hwmon=1``: Forces probing for HWMON support + +If the module loads successfully with these parameters, consider submitting a +patch adding your model to the ``awcc_dmi_table`` located in +``drivers/platform/x86/dell/alienware-wmi-wmax.c`` or contacting the maintainer +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 expose +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-*/name | 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 toggle 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_wmi" +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` value +has the following aproximate behavior over the fan pwm: + +:: + + pwm = 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: + +=============================== ======= ======================================= +Name Perm Description +=============================== ======= ======================================= +fan[1-4]_boost RW Fan boost value. + + Integer value between 0 and 255 +=============================== ======= ======================================= + +.. note:: + In some devices, manual fan control only works reliably if the ``custom`` + platform profile is selected. diff --git a/Documentation/admin-guide/laptops/index.rst b/Documentation/admin-guide/laptops/index.rst index e71c8984c23e43ca7cd6373b88803354dff6bc60..db842b629303c1bcf02646204d51938f9bd4043e 100644 --- a/Documentation/admin-guide/laptops/index.rst +++ b/Documentation/admin-guide/laptops/index.rst @@ -7,6 +7,7 @@ Laptop Drivers .. toctree:: :maxdepth: 1 + alienware-wmi asus-laptop disk-shock-protection laptop-mode diff --git a/MAINTAINERS b/MAINTAINERS index 1afd30d00aecf9a48f8c71e156affd5f329539bd..c609bc321b8dc3ab0e8d92b04e42483be8cc171c 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* From patchwork Thu Mar 13 14:30:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kurt Borja X-Patchwork-Id: 14015209 Received: from mail-yb1-f174.google.com (mail-yb1-f174.google.com [209.85.219.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E0FA326A09D; Thu, 13 Mar 2025 14:30:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876239; cv=none; b=a8vWK2EKUW57X5tLqP9SRT6ILmwdEloKOK7E1NCUHFk0mtQtqFteMwBWxmELAYZupMsWB/C0l13MdCxHXmnN3uS03/FudyBoWHA095nG+HfT2WJXZpRJ6N9KVSGj1uPlYE5vgK/937QlOt13IoBpDZAXFIV6LVsQ+jlcAKv8e9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741876239; c=relaxed/simple; bh=+UVctgMLCQI2qtTmv9h2RN5EXbGlaQr/uLpLO/ItiII=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UjQXyGUrQ5li0W7ysNDZzxbrvO035K2NvIRXXvGFChbz2UX4I58mdo2/NlbRxJSSak129z7BPGMz7yEAqJqCmnCLfrNBnyTWyqgodMoFCO4NdqH0F54HYmoUpoXZJ3vdVthtj6vYt6+4BlWKIEWZdX2oNq62RbQ52vvANuuMHgk= 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=V2btCvWB; arc=none smtp.client-ip=209.85.219.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="V2btCvWB" Received: by mail-yb1-f174.google.com with SMTP id 3f1490d57ef6-e3978c00a5aso909416276.1; Thu, 13 Mar 2025 07:30:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741876236; x=1742481036; 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=08INWI3mX8Qq+o80JMhCH1odycnPWIStSqHUAbKsMI8=; b=V2btCvWBDXK3sy3aZRiY10caAqjSyItQL7lZDGz0J0m3cFmBjeI+2dMYpVKYK9lNfP PHo5eLRs3sjI0aVpdCgsAw3zpDFez8sjizBJdDP+aW9kCVLbT3M5U1UJnZWUBe2X+lJj hGLzU2zEoSmLfeUZzLKc7FLOB/ARUhc35Yrjzvd8pEip+PYWKu/PYCmAhB/F/r6FuEN9 UyJ2UCn9hnXF6McV0YRuSw+nEyEGX5wRaie8o1W3nFiSuHvjI6coYXGWSNq5BUW/KrOm IMGQiDIy8Bn8hqQ+HF0SKYcJn9ltO4kn3Oq5uu2LFfHaCM5zFPaNUHkO8ZIeIZKqROX5 RqSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741876236; x=1742481036; 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=08INWI3mX8Qq+o80JMhCH1odycnPWIStSqHUAbKsMI8=; b=qfNjMDfEfUB6ZPQvM6BbsGjUMluBRHMAdt1zYUltF5dWkN0frkjyoAPQIPesfTCREo EJx5juUFBDFs1jhxr8TCtF84WCYoGRxmbMBnitKTWGvnF6QkZZTS0lYgmn/YRCAxjH8f yoHkue49Tnbpga6VhERWbGecn9Au+K66Jr/NeIWqvzqTp4nYbNht6aKGkyhcyeTBNoKd Tif7zUKXPwE7UMsoSoj8QY6kkU6tCN/w5t4VKoPs01TmhRIkYswivCZw+zB1Yl+/HXzK w0OnTS+IUnm1Nqx8EJvDB/hQCI9xfoTujZOkz1+NN3EjG5284I+3uJ4nV3l/16qF739i 0z7w== X-Forwarded-Encrypted: i=1; AJvYcCXm0E6tYNUdCGyGIvEiDC+ZX1sSUS1sdExpDhz5srKpU3yLe2wYepvPkX16C1ovKUyaBEF3dyh3RvgnaMjkrdn+dC3WTw==@vger.kernel.org, AJvYcCXzK5Y7iaAAibgOgB8pWJYgdkVVhg04l7PaiCTSTOyvtuYeJjrwYyMUzwl1no2TdXFwcJ4xnlSCkHEdgg0=@vger.kernel.org X-Gm-Message-State: AOJu0Yzon+Jxbg1hEtSYGkJquiY+YlxiQuvVtBZ3p3hE7q87MPGAnwT3 1XAxtx80S5ESsIvHmUmKZhKz0Un8RBOvValNWk+rkw3UpDmQmL5vVSEOz7Ip X-Gm-Gg: ASbGnctWsJJ9Beb20JavhTJlB+G5XmWXqrwG5h86ZimE1LFSWyOLhcnomBK2+uHvFzn SUcn6lzcgYbXvb4592u6chgb1fFBsC54BinKWkli8F78Q/BGmcU8QO5xHLxpIQfP1FgXy/S4WUr 1nkKkmGLyEvyhFDOAVut6dJBjuA4atZ/NmS4YIumZX3mhE/6J7v+EX+iPh2xkhRZwARSWQhhsaY xDGvi5/jmOnUXzlqrU3hd80hPRWamCfd2kNmdgG8wgTUiZnXSx2BTvIFnVZATcGFyrf2/hf2HRS XMfOLhxCNiJdBK00jNaDJmsLidYOX2QsuASNQirGg8UPcA== X-Google-Smtp-Source: AGHT+IGmj4KVOfUR9zKVTivrey+683lgb+CPnX2O/8jAGtwG7zq9BkPwsKxPl9loZzk5cxtrlFAC+A== X-Received: by 2002:a05:6902:a91:b0:e60:a93f:2a86 with SMTP id 3f1490d57ef6-e635c1f4d33mr34739204276.42.1741876236159; Thu, 13 Mar 2025 07:30:36 -0700 (PDT) Received: from [192.168.100.70] ([2800:bf0:82:3d2:9e61:1a62:1a8c:3e62]) by smtp.gmail.com with ESMTPSA id 3f1490d57ef6-e63e56718d0sm338938276.50.2025.03.13.07.30.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Mar 2025 07:30:35 -0700 (PDT) From: Kurt Borja Date: Thu, 13 Mar 2025 09:30:07 -0500 Subject: [PATCH v6 12/12] Documentation: ABI: Add sysfs platform and debugfs ABI documentation for alienware-wmi Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250313-hwm-v6-12-17b57f787d77@gmail.com> References: <20250313-hwm-v6-0-17b57f787d77@gmail.com> In-Reply-To: <20250313-hwm-v6-0-17b57f787d77@gmail.com> To: =?utf-8?q?Ilpo_J=C3=A4rvinen?= , Armin Wolf Cc: Kurt Borja , Hans de Goede , platform-driver-x86@vger.kernel.org, Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 Add ABI description for the alienware-wmi driver. Reviewed-by: Armin Wolf Signed-off-by: Kurt Borja --- Documentation/ABI/testing/debugfs-alienware-wmi | 44 ++++++++++++++++++++++ .../ABI/testing/sysfs-platform-alienware-wmi | 14 +++++++ MAINTAINERS | 2 + 3 files changed, 60 insertions(+) diff --git a/Documentation/ABI/testing/debugfs-alienware-wmi b/Documentation/ABI/testing/debugfs-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..48cfd4d0b002efd7b68d9c1d3aa91a3a05f49db5 --- /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/Documentation/ABI/testing/sysfs-platform-alienware-wmi new file mode 100644 index 0000000000000000000000000000000000000000..4877b3745f4e5b503376d375bf48464250328ce2 --- /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..faa377126bda0b9c848760495dc893982f3a4c3a 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*