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