From: Kurt Borja <kuurtb@gmail.com>
To: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
"Armin Wolf" <W_Armin@gmx.de>
Cc: platform-driver-x86@vger.kernel.org,
"Hans de Goede" <hdegoede@redhat.com>,
Dell.Client.Kernel@dell.com, linux-kernel@vger.kernel.org,
Kurt Borja <kuurtb@gmail.com>
Subject: [PATCH v2 03/10] platform/x86: alienware-wmi-wmax: Improve internal AWCC API
Date: Tue, 25 Feb 2025 17:24:53 -0500 [thread overview]
Message-ID: <20250225222500.23535-4-kuurtb@gmail.com> (raw)
In-Reply-To: <20250225222500.23535-1-kuurtb@gmail.com>
Inline all AWCC WMI helper methods and directly return the newly
introduced __awcc_wmi_command() to simplify implementation. Additionally
make wmax_u32_args __packed, add an additional failure code and add a
helper with documentation for AWCC_OP_GET_RESOURCE_ID.
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Reviewed-by: Armin Wolf <W_Armin@gmx.de>
---
.../platform/x86/dell/alienware-wmi-wmax.c | 104 +++++++++++-------
1 file changed, 63 insertions(+), 41 deletions(-)
diff --git a/drivers/platform/x86/dell/alienware-wmi-wmax.c b/drivers/platform/x86/dell/alienware-wmi-wmax.c
index 7f0aa88221d6..57897a0f4296 100644
--- a/drivers/platform/x86/dell/alienware-wmi-wmax.c
+++ b/drivers/platform/x86/dell/alienware-wmi-wmax.c
@@ -32,6 +32,7 @@
#define AWCC_THERMAL_MODE_GMODE 0xAB
#define AWCC_FAILURE_CODE 0xFFFFFFFF
+#define AWCC_FAILURE_CODE_2 0xFFFFFFFE
#define AWCC_THERMAL_TABLE_MASK GENMASK(7, 4)
#define AWCC_THERMAL_MODE_MASK GENMASK(3, 0)
#define AWCC_RESOURCE_ID_MASK GENMASK(7, 0)
@@ -206,7 +207,7 @@ struct wmax_u32_args {
u8 arg1;
u8 arg2;
u8 arg3;
-};
+} __packed;
struct awcc_priv {
struct wmi_device *wdev;
@@ -442,8 +443,7 @@ const struct attribute_group wmax_deepsleep_attribute_group = {
};
/*
- * Thermal Profile control
- * - Provides thermal profile control through the Platform Profile API
+ * AWCC Helpers
*/
static bool is_awcc_thermal_profile_id(u8 code)
{
@@ -462,72 +462,95 @@ static bool is_awcc_thermal_profile_id(u8 code)
return false;
}
-static int awcc_thermal_information(struct wmi_device *wdev, u8 operation,
- u8 arg, u32 *out_data)
+static int __awcc_wmi_command(struct wmi_device *wdev, u32 method_id,
+ struct wmax_u32_args *args, u32 *out)
{
- struct wmax_u32_args in_args = {
- .operation = operation,
- .arg1 = arg,
- .arg2 = 0,
- .arg3 = 0,
- };
int ret;
- ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION,
- &in_args, sizeof(in_args), out_data);
- if (ret < 0)
+ ret = alienware_wmi_command(wdev, method_id, args, sizeof(*args), out);
+ if (ret)
return ret;
- if (*out_data == AWCC_FAILURE_CODE)
+ if (*out == AWCC_FAILURE_CODE || *out == AWCC_FAILURE_CODE_2)
return -EBADRQC;
return 0;
}
-static int awcc_thermal_control(struct wmi_device *wdev, u8 profile)
+static inline int awcc_thermal_information(struct wmi_device *wdev, u8 operation,
+ u8 arg, u32 *out)
{
- struct wmax_u32_args in_args = {
- .operation = AWCC_OP_ACTIVATE_PROFILE,
- .arg1 = profile,
+ struct wmax_u32_args args = {
+ .operation = operation,
+ .arg1 = arg,
.arg2 = 0,
.arg3 = 0,
};
- u32 out_data;
- int ret;
- ret = alienware_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL,
- &in_args, sizeof(in_args), &out_data);
- if (ret)
- return ret;
+ return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out);
+}
- if (out_data == AWCC_FAILURE_CODE)
- return -EBADRQC;
+static inline int awcc_thermal_control(struct wmi_device *wdev, u8 profile)
+{
+ struct wmax_u32_args args = {
+ .operation = AWCC_OP_ACTIVATE_PROFILE,
+ .arg1 = profile,
+ .arg2 = 0,
+ .arg3 = 0,
+ };
+ u32 out;
- return 0;
+ return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_CONTROL, &args, &out);
}
-static int awcc_game_shift_status(struct wmi_device *wdev, u8 operation,
- u32 *out_data)
+static inline int awcc_game_shift_status(struct wmi_device *wdev, u8 operation,
+ u32 *out)
{
- struct wmax_u32_args in_args = {
+ struct wmax_u32_args args = {
.operation = operation,
.arg1 = 0,
.arg2 = 0,
.arg3 = 0,
};
- int ret;
- ret = alienware_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS,
- &in_args, sizeof(in_args), out_data);
- if (ret < 0)
- return ret;
+ return __awcc_wmi_command(wdev, AWCC_METHOD_GAME_SHIFT_STATUS, &args, out);
+}
- if (*out_data == AWCC_FAILURE_CODE)
- return -EOPNOTSUPP;
+/**
+ * awcc_op_get_resource_id - Get the resource ID at a given index
+ * @wdev: AWCC WMI device
+ * @index: Index
+ * @out: Value returned by the WMI call
+ *
+ * Get the resource ID at a given index. Resource IDs are listed in the
+ * following order:
+ *
+ * - Fan IDs
+ * - Sensor IDs
+ * - Unknown IDs
+ * - Thermal Profile IDs
+ *
+ * The total number of IDs of a given type can be obtained with
+ * AWCC_OP_GET_SYSTEM_DESCRIPTION.
+ *
+ * Return: 0 on success, -errno on failure
+ */
+static inline int awcc_op_get_resource_id(struct wmi_device *wdev, u8 index, u32 *out)
+{
+ struct wmax_u32_args args = {
+ .operation = AWCC_OP_GET_RESOURCE_ID,
+ .arg1 = index,
+ .arg2 = 0,
+ .arg3 = 0,
+ };
- return 0;
+ return __awcc_wmi_command(wdev, AWCC_METHOD_THERMAL_INFORMATION, &args, out);
}
+/*
+ * Thermal Profile control
+ * - Provides thermal profile control through the Platform Profile API
+ */
static int awcc_platform_profile_get(struct device *dev,
enum platform_profile_option *profile)
{
@@ -605,8 +628,7 @@ static int awcc_platform_profile_probe(void *drvdata, unsigned long *choices)
first_mode = sys_desc[0] + sys_desc[1];
for (u32 i = 0; i < sys_desc[3]; i++) {
- ret = awcc_thermal_information(priv->wdev, AWCC_OP_GET_RESOURCE_ID,
- i + first_mode, &out_data);
+ ret = awcc_op_get_resource_id(priv->wdev, i + first_mode, &out_data);
if (ret == -EIO)
return ret;
--
2.48.1
next prev parent reply other threads:[~2025-02-25 22:25 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-25 22:24 [PATCH v2 00/10] platform/x86: alienware-wmi-wmax: HWMON support + DebugFS + Improvements Kurt Borja
2025-02-25 22:24 ` [PATCH v2 01/10] platform/x86: alienware-wmi-wmax: Rename thermal related symbols Kurt Borja
2025-02-25 22:24 ` [PATCH v2 02/10] platform/x86: alienware-wmi-wmax: Refactor is_awcc_thermal_mode() Kurt Borja
2025-03-04 15:02 ` Ilpo Järvinen
2025-03-04 16:18 ` Kurt Borja
2025-02-25 22:24 ` Kurt Borja [this message]
2025-02-25 22:24 ` [PATCH v2 04/10] platform/x86: alienware-wmi-wmax: Modify supported_thermal_profiles[] Kurt Borja
2025-03-04 15:33 ` Ilpo Järvinen
2025-02-25 22:24 ` [PATCH v2 05/10] platform/x86: alienware-wmi-wmax: Improve platform profile probe Kurt Borja
2025-03-04 15:40 ` Ilpo Järvinen
2025-03-04 16:22 ` Kurt Borja
2025-02-25 22:24 ` [PATCH v2 06/10] platform/x86: alienware-wmi-wmax: Add support for the "custom" thermal profile Kurt Borja
2025-02-25 22:24 ` [PATCH v2 07/10] platform/x86: alienware-wmi-wmax: Add HWMON support Kurt Borja
2025-03-04 15:53 ` Ilpo Järvinen
2025-03-04 16:27 ` Kurt Borja
2025-03-04 16:31 ` Ilpo Järvinen
2025-03-05 11:10 ` kernel test robot
2025-02-25 22:24 ` [PATCH v2 08/10] platform/x86: alienware-wmi-wmax: Add support for manual fan control Kurt Borja
2025-02-25 22:24 ` [PATCH v2 09/10] platform/x86: alienware-wmi-wmax: Add a DebugFS interface Kurt Borja
2025-02-25 22:25 ` [PATCH v2 10/10] platform/x86: alienware-wmi: Improve and update documentation Kurt Borja
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250225222500.23535-4-kuurtb@gmail.com \
--to=kuurtb@gmail.com \
--cc=Dell.Client.Kernel@dell.com \
--cc=W_Armin@gmx.de \
--cc=hdegoede@redhat.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.