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