All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans de Goede <hdegoede@redhat.com>
To: Mark Pearson <markpearson@lenovo.com>
Cc: mgross@linux.intel.com, platform-driver-x86@vger.kernel.org
Subject: Re: [PATCH] platform/x86: think-lmi: add debug_cmd
Date: Sat, 17 Jul 2021 15:59:13 +0200	[thread overview]
Message-ID: <4e59c26c-d58b-dfd5-ed21-f9cd83fc43b6@redhat.com> (raw)
In-Reply-To: <20210715230850.389961-1-markpearson@lenovo.com>

Hi Mark,

On 7/16/21 1:08 AM, Mark Pearson wrote:
> Many Lenovo BIOS's support the ability to send a debug command which
> is useful for debugging and testing unreleased or early features.
> Adding support for this feature.
> 
> Also moved the pending_reboot node under attributes dir where it should
> correctly live. Got that wrong in my last commit and realised as I was
> updating the documentation for debug_cmd
> 
> Signed-off-by: Mark Pearson <markpearson@lenovo.com>

Thank you for the patch, I'm not entirely sure if we want this in its
current form though, isn't this new debug_cmd file not something which
would be better under debugfs ?  Or maybe have it only show up if
a module parameter is passed to enable it ?

Note that both have implications wrt secureboot. debugfs is only
writeable when secureboot is disabled; and ATM module options are
not protected by secureboot, but at least in Fedora we would actually
like to change that in the future.

Anyways, lets discuss this a bit further and then merge something
for this later.

The pending_reboot move is good to have. You really should have
submitted this as a separate patch. Hint as soon as you write
"Also ...", or e.g. "This commit does the following 3 things:
1... 2... 3..." or some such in the commit message that is a hint
that you should split the patch.

I've split out the pending_reboot changes (and also updated the
remove path which you left unchanged) now. While looking into
the remove path, I also found a couple of other probe-failure
related issues so I'll be sending out a patch-set with a
few small fixes (including the pending_reboot move) soon.

Regards,

Hans





> ---
>  .../testing/sysfs-class-firmware-attributes   | 11 +++
>  drivers/platform/x86/think-lmi.c              | 77 ++++++++++++++++++-
>  drivers/platform/x86/think-lmi.h              |  1 +
>  3 files changed, 88 insertions(+), 1 deletion(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-class-firmware-attributes b/Documentation/ABI/testing/sysfs-class-firmware-attributes
> index 3348bf80a37c..db0aa2939efc 100644
> --- a/Documentation/ABI/testing/sysfs-class-firmware-attributes
> +++ b/Documentation/ABI/testing/sysfs-class-firmware-attributes
> @@ -272,3 +272,14 @@ Description:
>  
>  		Note that any changes to this attribute requires a reboot
>  		for changes to take effect.
> +
> +What:		/sys/class/firmware-attributes/*/attributes/debug_cmd
> +Date:		July 2021
> +KernelVersion:	5.14
> +Contact:	Mark Pearson <markpearson@lenovo.com>
> +Description:
> +		This write only attribute can be used to send debug commands to the BIOS.
> +		This should only be used when recommended by the BIOS vendor. Vendors may
> +		use it to enable extra debug attributes or BIOS features for testing purposes.
> +
> +		Note that any changes to this attribute requires a reboot for changes to take effect.
> diff --git a/drivers/platform/x86/think-lmi.c b/drivers/platform/x86/think-lmi.c
> index 64dcec53a7a0..d58d4b155139 100644
> --- a/drivers/platform/x86/think-lmi.c
> +++ b/drivers/platform/x86/think-lmi.c
> @@ -116,6 +116,14 @@
>   */
>  #define LENOVO_GET_BIOS_SELECTIONS_GUID	"7364651A-132F-4FE7-ADAA-40C6C7EE2E3B"
>  
> +/*
> + * Name:
> + *  Lenovo_DebugCmdGUID
> + * Description
> + *  Debug entry GUID method for entering debug commands to the BIOS
> + */
> +#define LENOVO_DEBUG_CMD_GUID "7FF47003-3B6C-4E5E-A227-E979824A85D1"
> +
>  #define TLMI_POP_PWD (1 << 0)
>  #define TLMI_PAP_PWD (1 << 1)
>  #define to_tlmi_pwd_setting(kobj)  container_of(kobj, struct tlmi_pwd_setting, kobj)
> @@ -660,6 +668,63 @@ static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *
>  
>  static struct kobj_attribute pending_reboot = __ATTR_RO(pending_reboot);
>  
> +/* ---- Debug interface--------------------------------------------------------- */
> +static ssize_t debug_cmd_store(struct kobject *kobj, struct kobj_attribute *attr,
> +				const char *buf, size_t count)
> +{
> +	char *set_str = NULL, *new_setting = NULL;
> +	char *auth_str = NULL;
> +	char *p;
> +	int ret;
> +
> +	if (!tlmi_priv.can_debug_cmd)
> +		return -EOPNOTSUPP;
> +
> +	new_setting = kstrdup(buf, GFP_KERNEL);
> +	if (!new_setting)
> +		return -ENOMEM;
> +
> +	/* Strip out CR if one is present */
> +	p = strchrnul(new_setting, '\n');
> +	*p = '\0';
> +
> +	if (tlmi_priv.pwd_admin->valid && tlmi_priv.pwd_admin->password[0]) {
> +		auth_str = kasprintf(GFP_KERNEL, "%s,%s,%s;",
> +				tlmi_priv.pwd_admin->password,
> +				encoding_options[tlmi_priv.pwd_admin->encoding],
> +				tlmi_priv.pwd_admin->kbdlang);
> +		if (!auth_str) {
> +			ret = -ENOMEM;
> +			goto out;
> +		}
> +	}
> +
> +	if (auth_str)
> +		set_str = kasprintf(GFP_KERNEL, "%s,%s", new_setting, auth_str);
> +	else
> +		set_str = kasprintf(GFP_KERNEL, "%s;", new_setting);
> +	if (!set_str) {
> +		ret = -ENOMEM;
> +		goto out;
> +	}
> +
> +	ret = tlmi_simple_call(LENOVO_DEBUG_CMD_GUID, set_str);
> +	if (ret)
> +		goto out;
> +
> +	if (!ret && !tlmi_priv.pending_changes) {
> +		tlmi_priv.pending_changes = true;
> +		/* let userland know it may need to check reboot pending again */
> +		kobject_uevent(&tlmi_priv.class_dev->kobj, KOBJ_CHANGE);
> +	}
> +out:
> +	kfree(auth_str);
> +	kfree(set_str);
> +	kfree(new_setting);
> +	return ret ?: count;
> +}
> +static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd);
> +
>  /* ---- Initialisation --------------------------------------------------------- */
>  static void tlmi_release_attr(void)
>  {
> @@ -681,6 +746,8 @@ static void tlmi_release_attr(void)
>  	kobject_put(&tlmi_priv.pwd_power->kobj);
>  	kset_unregister(tlmi_priv.authentication_kset);
>  	sysfs_remove_file(&tlmi_priv.class_dev->kobj, &pending_reboot.attr);
> +	if (tlmi_priv.can_debug_cmd)
> +		sysfs_remove_file(&tlmi_priv.class_dev->kobj, &debug_cmd.attr);
>  }
>  
>  static int tlmi_sysfs_init(void)
> @@ -761,10 +828,15 @@ static int tlmi_sysfs_init(void)
>  		goto fail_create_attr;
>  
>  	/* Create global sysfs files */
> -	ret = sysfs_create_file(&tlmi_priv.class_dev->kobj, &pending_reboot.attr);
> +	ret = sysfs_create_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
>  	if (ret)
>  		goto fail_create_attr;
>  
> +	if (tlmi_priv.can_debug_cmd) {
> +		ret = sysfs_create_file(&tlmi_priv.attribute_kset->kobj, &debug_cmd.attr);
> +		if (ret)
> +			goto fail_create_attr;
> +	}
>  	return ret;
>  
>  fail_create_attr:
> @@ -796,6 +868,9 @@ static int tlmi_analyze(void)
>  	if (wmi_has_guid(LENOVO_BIOS_PASSWORD_SETTINGS_GUID))
>  		tlmi_priv.can_get_password_settings = true;
>  
> +	if (wmi_has_guid(LENOVO_DEBUG_CMD_GUID))
> +		tlmi_priv.can_debug_cmd = true;
> +
>  	/*
>  	 * Try to find the number of valid settings of this machine
>  	 * and use it to create sysfs attributes.
> diff --git a/drivers/platform/x86/think-lmi.h b/drivers/platform/x86/think-lmi.h
> index eb598846628a..f8e26823075f 100644
> --- a/drivers/platform/x86/think-lmi.h
> +++ b/drivers/platform/x86/think-lmi.h
> @@ -61,6 +61,7 @@ struct think_lmi {
>  	bool can_set_bios_password;
>  	bool can_get_password_settings;
>  	bool pending_changes;
> +	bool can_debug_cmd;
>  
>  	struct tlmi_attr_setting *setting[TLMI_SETTINGS_COUNT];
>  	struct device *class_dev;
> 


  reply	other threads:[~2021-07-17 13:59 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-15 23:08 [PATCH] platform/x86: think-lmi: add debug_cmd Mark Pearson
2021-07-17 13:59 ` Hans de Goede [this message]
2021-07-19 12:46   ` [External]Re: " Mark Pearson
2021-07-29 17:34     ` Hans de Goede
2021-07-29 17:40       ` [External]Re: " Mark Pearson

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=4e59c26c-d58b-dfd5-ed21-f9cd83fc43b6@redhat.com \
    --to=hdegoede@redhat.com \
    --cc=markpearson@lenovo.com \
    --cc=mgross@linux.intel.com \
    --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.