Unverified Commit 30a4ad20 authored by Derek J. Clark's avatar Derek J. Clark Committed by Ilpo Järvinen
Browse files

platform/x86: lenovo-wmi-other: Add Attribute ID helper functions



Adds lwmi_attr_id() function. In the same vein as LWMI_ATTR_ID_FAN_RPM(),
but as a generic, to de-duplicate attribute_id assignment boilerplate.

Adds tunable_attr_01_id() function that breaks out the members of a
tunable_attr_01 struct and passes them to lwmi_attr_id().

No functional change intended.

Cc: stable@vger.kernel.org
Reviewed-by: default avatarRong Zhang <i@rong.moe>
Tested-by: default avatarRong Zhang <i@rong.moe>
Reviewed-by: default avatarMark Pearson <mpearson-lenovo@squebb.ca>
Signed-off-by: default avatarDerek J. Clark <derekjohn.clark@gmail.com>
Link: https://patch.msgid.link/20260510042546.436874-9-derekjohn.clark@gmail.com


Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
parent 7e27896e
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/acpi.h>
#include <linux/bitfield.h>
#include <linux/bug.h>
#include <linux/cleanup.h>
#include <linux/component.h>
@@ -48,6 +47,7 @@
#include <linux/wmi.h>

#include "wmi-capdata.h"
#include "wmi-helpers.h"

#define LENOVO_CAPABILITY_DATA_00_GUID "362A3AFE-3D96-4665-8530-96DAD5BB300E"
#define LENOVO_CAPABILITY_DATA_01_GUID "7A8F5407-CB67-4D6E-B547-39B3BE018154"
@@ -58,8 +58,8 @@
#define LWMI_FEATURE_ID_FAN_TEST 0x05

#define LWMI_ATTR_ID_FAN_TEST                                      \
	(FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) |		\
	 FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_TEST))
	lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_TEST, \
		     LWMI_GZ_THERMAL_MODE_NONE, LWMI_TYPE_ID_NONE)

enum lwmi_cd_type {
	LENOVO_CAPABILITY_DATA_00,
+20 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#define _LENOVO_WMI_CAPDATA_H_

#include <linux/bits.h>
#include <linux/bitfield.h>
#include <linux/types.h>

#define LWMI_SUPP_VALID		BIT(0)
@@ -19,6 +20,8 @@

#define LWMI_DEVICE_ID_FAN	0x04

#define LWMI_TYPE_ID_NONE 0x00

struct component_match;
struct device;
struct cd_list;
@@ -57,6 +60,23 @@ struct lwmi_cd_binder {
	cd_list_cb_t cd_fan_list_cb;
};

/**
 * lwmi_attr_id() - Formats a capability data attribute ID
 * @dev_id: The u8 corresponding to the device ID.
 * @feat_id: The u8 corresponding to the feature ID on the device.
 * @mode_id: The u8 corresponding to the wmi-gamezone mode for set/get.
 * @type_id: The u8 corresponding to the sub-device.
 *
 * Return: encoded capability data attribute ID.
 */
static inline u32 lwmi_attr_id(u8 dev_id, u8 feat_id, u8 mode_id, u8 type_id)
{
	return (FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, dev_id)   |
		FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, feat_id) |
		FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode_id) |
		FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, type_id));
}

void lwmi_cd_match_add_all(struct device *master, struct component_match **matchptr);
int lwmi_cd00_get_data(struct cd_list *list, u32 attribute_id, struct capdata00 *output);
int lwmi_cd01_get_data(struct cd_list *list, u32 attribute_id, struct capdata01 *output);
+20 −29
Original line number Diff line number Diff line
@@ -59,8 +59,6 @@

#define LWMI_FEATURE_ID_FAN_RPM 0x03

#define LWMI_TYPE_ID_NONE 0x00

#define LWMI_FEATURE_VALUE_GET 17
#define LWMI_FEATURE_VALUE_SET 18

@@ -68,13 +66,12 @@
#define LWMI_FAN_NR 4
#define LWMI_FAN_ID(x) ((x) + LWMI_FAN_ID_BASE)

#define LWMI_ATTR_ID_FAN_RPM(x)						\
	(FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, LWMI_DEVICE_ID_FAN) |	\
	 FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, LWMI_FEATURE_ID_FAN_RPM) |	\
	 FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, LWMI_FAN_ID(x)))

#define LWMI_FAN_DIV 100

#define LWMI_ATTR_ID_FAN_RPM(x)                                   \
	lwmi_attr_id(LWMI_DEVICE_ID_FAN, LWMI_FEATURE_ID_FAN_RPM, \
		     LWMI_GZ_THERMAL_MODE_NONE, LWMI_FAN_ID(x))

#define LWMI_OM_FW_ATTR_BASE_PATH "lenovo-wmi-other"
#define LWMI_OM_HWMON_NAME "lenovo_wmi_other"

@@ -549,6 +546,18 @@ struct tunable_attr_01 {
	u8 type_id;
};

/**
 * tunable_attr_01_id() - Formats a tunable_attr_01 to a capdata attribute ID
 * @attr: The tunable_attr_01 to format.
 * @mode: The u8 corresponding to the wmi-gamezone mode for set/get.
 *
 * Return: encoded capability data attribute ID.
 */
static u32 tunable_attr_01_id(struct tunable_attr_01 *attr, u8 mode)
{
	return lwmi_attr_id(attr->device_id, attr->feature_id, mode, attr->type_id);
}

static struct tunable_attr_01 ppt_pl1_spl = {
	.device_id = LWMI_DEVICE_ID_CPU,
	.feature_id = LWMI_FEATURE_ID_CPU_SPL,
@@ -616,12 +625,7 @@ static ssize_t attr_capdata01_show(struct kobject *kobj,
	u32 attribute_id;
	int value, ret;

	attribute_id =
		FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) |
		FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) |
		FIELD_PREP(LWMI_ATTR_MODE_ID_MASK,
			   LWMI_GZ_THERMAL_MODE_CUSTOM) |
		FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id);
	attribute_id = tunable_attr_01_id(tunable_attr, LWMI_GZ_THERMAL_MODE_CUSTOM);

	ret = lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata);
	if (ret)
@@ -676,7 +680,6 @@ static ssize_t attr_current_value_store(struct kobject *kobj,
	struct wmi_method_args_32 args = {};
	struct capdata01 capdata;
	enum thermal_mode mode;
	u32 attribute_id;
	u32 value;
	int ret;

@@ -687,13 +690,9 @@ static ssize_t attr_current_value_store(struct kobject *kobj,
	if (mode != LWMI_GZ_THERMAL_MODE_CUSTOM)
		return -EBUSY;

	attribute_id =
		FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) |
		FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) |
		FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) |
		FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id);
	args.arg0 = tunable_attr_01_id(tunable_attr, mode);

	ret = lwmi_cd01_get_data(priv->cd01_list, attribute_id, &capdata);
	ret = lwmi_cd01_get_data(priv->cd01_list, args.arg0, &capdata);
	if (ret)
		return ret;

@@ -704,7 +703,6 @@ static ssize_t attr_current_value_store(struct kobject *kobj,
	if (value < capdata.min_value || value > capdata.max_value)
		return -EINVAL;

	args.arg0 = attribute_id;
	args.arg1 = value;

	ret = lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_SET,
@@ -738,7 +736,6 @@ static ssize_t attr_current_value_show(struct kobject *kobj,
	struct lwmi_om_priv *priv = dev_get_drvdata(tunable_attr->dev);
	struct wmi_method_args_32 args = {};
	enum thermal_mode mode;
	u32 attribute_id;
	int retval;
	int ret;

@@ -746,13 +743,7 @@ static ssize_t attr_current_value_show(struct kobject *kobj,
	if (ret)
		return ret;

	attribute_id =
		FIELD_PREP(LWMI_ATTR_DEV_ID_MASK, tunable_attr->device_id) |
		FIELD_PREP(LWMI_ATTR_FEAT_ID_MASK, tunable_attr->feature_id) |
		FIELD_PREP(LWMI_ATTR_MODE_ID_MASK, mode) |
		FIELD_PREP(LWMI_ATTR_TYPE_ID_MASK, tunable_attr->type_id);

	args.arg0 = attribute_id;
	args.arg0 = tunable_attr_01_id(tunable_attr, mode);

	ret = lwmi_dev_evaluate_int(priv->wdev, 0x0, LWMI_FEATURE_VALUE_GET,
				    (unsigned char *)&args, sizeof(args),