Re: [PATCH v1] platform/chrome: cros_ec_debugfs: conditionally create uptime node

From: Enric Balletbo i Serra
Date: Thu Jul 09 2020 - 03:25:24 EST


Hi Eizan,

Thank you for your patch

On 8/7/20 6:53, Eizan Miyamoto wrote:
> Before creating an 'uptime' node in debugfs, this change adds a check to
> see if a EC_CMD_GET_UPTIME_INFO command can be successfully run.
>
> If the uptime node is created, userspace programs may periodically poll
> it (e.g., timberslide), causing commands to be sent to the EC each time.
> If the EC doesn't support EC_CMD_GET_UPTIME_INFO, an error will be
> emitted in the EC console, producing noise.
>

A similar patch with the same purpose sent by Gwendal was already accepted and
queued for 5.9. See [1].


Thanks,
Enric

[1]
https://git.kernel.org/pub/scm/linux/kernel/git/chrome-platform/linux.git/commit/?h=for-next&id=d378cdd0113878e3860f954d16dd3e91defb1492



> Signed-off-by: Eizan Miyamoto <eizan@xxxxxxxxxxxx>
> ---
>
> drivers/platform/chrome/cros_ec_debugfs.c | 35 +++++++++++++++++------
> 1 file changed, 26 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
> index ecfada00e6c51..8708fe12f8ca8 100644
> --- a/drivers/platform/chrome/cros_ec_debugfs.c
> +++ b/drivers/platform/chrome/cros_ec_debugfs.c
> @@ -242,17 +242,14 @@ static ssize_t cros_ec_pdinfo_read(struct file *file,
> read_buf, p - read_buf);
> }
>
> -static ssize_t cros_ec_uptime_read(struct file *file, char __user *user_buf,
> - size_t count, loff_t *ppos)
> +static int cros_ec_get_uptime(struct cros_ec_device *ec_dev,
> + uint32_t *uptime)
> {
> - struct cros_ec_debugfs *debug_info = file->private_data;
> - struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
> struct {
> struct cros_ec_command cmd;
> struct ec_response_uptime_info resp;
> } __packed msg = {};
> struct ec_response_uptime_info *resp;
> - char read_buf[32];
> int ret;
>
> resp = (struct ec_response_uptime_info *)&msg.resp;
> @@ -264,8 +261,24 @@ static ssize_t cros_ec_uptime_read(struct file *file, char __user *user_buf,
> if (ret < 0)
> return ret;
>
> - ret = scnprintf(read_buf, sizeof(read_buf), "%u\n",
> - resp->time_since_ec_boot_ms);
> + *uptime = resp->time_since_ec_boot_ms;
> + return 0;
> +}
> +
> +static ssize_t cros_ec_uptime_read(struct file *file, char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + struct cros_ec_debugfs *debug_info = file->private_data;
> + struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
> + char read_buf[32];
> + int ret;
> + uint32_t uptime;
> +
> + ret = cros_ec_get_uptime(ec_dev, &uptime);
> + if (ret < 0)
> + return ret;
> +
> + ret = scnprintf(read_buf, sizeof(read_buf), "%u\n", uptime);
>
> return simple_read_from_buffer(user_buf, count, ppos, read_buf, ret);
> }
> @@ -425,6 +438,7 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
> const char *name = ec_platform->ec_name;
> struct cros_ec_debugfs *debug_info;
> int ret;
> + uint32_t uptime;
>
> debug_info = devm_kzalloc(ec->dev, sizeof(*debug_info), GFP_KERNEL);
> if (!debug_info)
> @@ -444,8 +458,11 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
> debugfs_create_file("pdinfo", 0444, debug_info->dir, debug_info,
> &cros_ec_pdinfo_fops);
>
> - debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
> - &cros_ec_uptime_fops);
> + if (cros_ec_get_uptime(debug_info->ec->ec_dev, &uptime) >= 0)
> + debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
> + &cros_ec_uptime_fops);
> + else
> + dev_dbg(ec->dev, "EC does not provide uptime");
>
> debugfs_create_x32("last_resume_result", 0444, debug_info->dir,
> &ec->ec_dev->last_resume_result);
>