linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
       [not found] <20190327182040.112651-1-twawrzynczak@chromium.org>
@ 2019-04-08 11:29 ` Enric Balletbo i Serra
  2019-04-08 13:01   ` Enric Balletbo i Serra
  2019-04-08 21:09 ` [PATCH v4] " Tim Wawrzynczak
  2019-05-02 16:09 ` Tim Wawrzynczak
  2 siblings, 1 reply; 8+ messages in thread
From: Enric Balletbo i Serra @ 2019-04-08 11:29 UTC (permalink / raw)
  To: Tim Wawrzynczak; +Cc: Benson Leung, linux-kernel, Guenter Roeck

Hi Tim,

Many thanks for sending this patch upstream, some comments below

On 27/3/19 19:20, Tim Wawrzynczak wrote:
> The new debugfs entry 'uptime' is being made available to userspace so that
> a userspace daemon can synchronize EC logs with host time.
> 
> Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
> ---
> Changelist:
>  - Moved uptime file from sysfs to debugfs (/sys/kernel/debug/cros_ec/uptime)
>  - Fixed ordering of local variables in cros_ec_uptime_read.
> Tested against ChromeOS kernel v4.14
> ---
>  Documentation/ABI/testing/debugfs-cros-ec | 10 +++++
>  drivers/platform/chrome/cros_ec_debugfs.c | 54 +++++++++++++++++++++++
>  2 files changed, 64 insertions(+)
>  create mode 100644 Documentation/ABI/testing/debugfs-cros-ec
> 
> diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
> new file mode 100644
> index 000000000000..24b781c67a4c
> --- /dev/null
> +++ b/Documentation/ABI/testing/debugfs-cros-ec

Thanks to introduce the documentation!

> @@ -0,0 +1,10 @@
> +What:		/sys/kernel/debug/cros_ec/uptime

Is that propriety only supported for the standard cros-ec?

If the answer is yes, is fine, but if this could be supported for other variants
like cros_pd, cros_tp, cros_fp, cros_ish, etc. then I'd name it

/sys/kernel/debug/<ec-device-name>/uptime


> +Date:		March 2019
> +KernelVersion:	5.1
> +Description:
> +		Read-only.
> +		Reads the EC's current uptime information
> +		(using EC_CMD_GET_UPTIME_INFO) and prints
> +		time_since_ec_boot_ms into the file.
> +		This is used for synchronizing AP host time
> +		with the cros_ec log.
> diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
> index 71308766e891..3ea42008a59e 100644
> --- a/drivers/platform/chrome/cros_ec_debugfs.c
> +++ b/drivers/platform/chrome/cros_ec_debugfs.c
> @@ -201,6 +201,40 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
>  	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;
> +	struct {
> +		struct cros_ec_command msg;
> +		struct ec_response_uptime_info resp;
> +	} __packed ec_buf;
> +	struct ec_response_uptime_info *resp;
> +	struct cros_ec_command *msg;
> +	char read_buf[32];
> +	int ret;
> +
> +	msg = &ec_buf.msg;
> +	resp = (struct ec_response_uptime_info *)msg->data;
> +
> +	msg->command = EC_CMD_GET_UPTIME_INFO;
> +	msg->version = 0;
> +	msg->insize = sizeof(*resp);
> +	msg->outsize = 0;
> +
> +	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = scnprintf(read_buf, sizeof(read_buf), "%u\n",
> +			resp->time_since_ec_boot_ms);
> +
> +	return simple_read_from_buffer(user_buf, count, ppos, read_buf, ret);
> +}
> +
>  static ssize_t cros_ec_pdinfo_read(struct file *file,
>  				   char __user *user_buf,
>  				   size_t count,
> @@ -269,6 +303,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
>  	.llseek = default_llseek,
>  };
>  
> +const struct file_operations cros_ec_uptime_fops = {
> +	.owner = THIS_MODULE,
> +	.open = simple_open,
> +	.read = cros_ec_uptime_read,
> +	.llseek = default_llseek,

Should this file be seekable?

> +};
> +
>  static int ec_read_version_supported(struct cros_ec_dev *ec)
>  {
>  	struct ec_params_get_cmd_versions_v1 *params;
> @@ -413,6 +454,15 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
>  	return 0;
>  }
>  
> +static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
> +{
> +	if (!debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
> +				&cros_ec_uptime_fops))
> +		return -ENOMEM;

When calling debugfs functions, there is no need to ever check the
return value.  The function can work or not, but the code logic should
never do something different based on this. This has been discussed recently on
the LKML.

I know that this is currently wrong for the other entries in this file but let's
try to do well and remove this function and just call debugfs_create_file in probe.

I plan to send patches to fix current status.

> +
> +	return 0;
> +}
> +
>  static int cros_ec_debugfs_probe(struct platform_device *pd)
>  {
>  	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
> @@ -442,6 +492,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
>  	if (ret)
>  		goto remove_log;
>  
> +	ret = cros_ec_create_uptime(debug_info);
> +	if (ret)
> +		goto remove_log;
> +

       debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
                           &cros_ec_uptime_fops);

>  	ec->debug_info = debug_info;
>  
>  	dev_set_drvdata(&pd->dev, ec);
> 

Thanks,
 Enric


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
  2019-04-08 11:29 ` [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime Enric Balletbo i Serra
@ 2019-04-08 13:01   ` Enric Balletbo i Serra
  0 siblings, 0 replies; 8+ messages in thread
From: Enric Balletbo i Serra @ 2019-04-08 13:01 UTC (permalink / raw)
  To: Tim Wawrzynczak; +Cc: Benson Leung, linux-kernel, Guenter Roeck



On 8/4/19 13:29, Enric Balletbo i Serra wrote:
> Hi Tim,
> 
> Many thanks for sending this patch upstream, some comments below
> 
> On 27/3/19 19:20, Tim Wawrzynczak wrote:
>> The new debugfs entry 'uptime' is being made available to userspace so that
>> a userspace daemon can synchronize EC logs with host time.
>>
>> Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
>> ---
>> Changelist:
>>  - Moved uptime file from sysfs to debugfs (/sys/kernel/debug/cros_ec/uptime)
>>  - Fixed ordering of local variables in cros_ec_uptime_read.
>> Tested against ChromeOS kernel v4.14
>> ---
>>  Documentation/ABI/testing/debugfs-cros-ec | 10 +++++
>>  drivers/platform/chrome/cros_ec_debugfs.c | 54 +++++++++++++++++++++++
>>  2 files changed, 64 insertions(+)
>>  create mode 100644 Documentation/ABI/testing/debugfs-cros-ec
>>
>> diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
>> new file mode 100644
>> index 000000000000..24b781c67a4c
>> --- /dev/null
>> +++ b/Documentation/ABI/testing/debugfs-cros-ec
> 
> Thanks to introduce the documentation!
> 
>> @@ -0,0 +1,10 @@
>> +What:		/sys/kernel/debug/cros_ec/uptime
> 
> Is that propriety only supported for the standard cros-ec?
> 
> If the answer is yes, is fine, but if this could be supported for other variants
> like cros_pd, cros_tp, cros_fp, cros_ish, etc. then I'd name it
> 
> /sys/kernel/debug/<ec-device-name>/uptime
> 
> 
>> +Date:		March 2019
>> +KernelVersion:	5.1
>> +Description:
>> +		Read-only.
>> +		Reads the EC's current uptime information
>> +		(using EC_CMD_GET_UPTIME_INFO) and prints
>> +		time_since_ec_boot_ms into the file.
>> +		This is used for synchronizing AP host time
>> +		with the cros_ec log.
>> diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
>> index 71308766e891..3ea42008a59e 100644
>> --- a/drivers/platform/chrome/cros_ec_debugfs.c
>> +++ b/drivers/platform/chrome/cros_ec_debugfs.c
>> @@ -201,6 +201,40 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
>>  	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;
>> +	struct {
>> +		struct cros_ec_command msg;
>> +		struct ec_response_uptime_info resp;
>> +	} __packed ec_buf;
>> +	struct ec_response_uptime_info *resp;
>> +	struct cros_ec_command *msg;
>> +	char read_buf[32];
>> +	int ret;
>> +
>> +	msg = &ec_buf.msg;
>> +	resp = (struct ec_response_uptime_info *)msg->data;
>> +
>> +	msg->command = EC_CMD_GET_UPTIME_INFO;
>> +	msg->version = 0;
>> +	msg->insize = sizeof(*resp);
>> +	msg->outsize = 0;
>> +
>> +	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
>> +	if (ret < 0)
>> +		return ret;
>> +
>> +	ret = scnprintf(read_buf, sizeof(read_buf), "%u\n",
>> +			resp->time_since_ec_boot_ms);
>> +
>> +	return simple_read_from_buffer(user_buf, count, ppos, read_buf, ret);
>> +}
>> +
>>  static ssize_t cros_ec_pdinfo_read(struct file *file,
>>  				   char __user *user_buf,
>>  				   size_t count,
>> @@ -269,6 +303,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
>>  	.llseek = default_llseek,
>>  };
>>  
>> +const struct file_operations cros_ec_uptime_fops = {
>> +	.owner = THIS_MODULE,
>> +	.open = simple_open,
>> +	.read = cros_ec_uptime_read,
>> +	.llseek = default_llseek,
> 
> Should this file be seekable?
> 
>> +};
>> +
>>  static int ec_read_version_supported(struct cros_ec_dev *ec)
>>  {
>>  	struct ec_params_get_cmd_versions_v1 *params;
>> @@ -413,6 +454,15 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
>>  	return 0;
>>  }
>>  
>> +static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
>> +{
>> +	if (!debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
>> +				&cros_ec_uptime_fops))
>> +		return -ENOMEM;
> 
> When calling debugfs functions, there is no need to ever check the
> return value.  The function can work or not, but the code logic should
> never do something different based on this. This has been discussed recently on
> the LKML.
> 
> I know that this is currently wrong for the other entries in this file but let's
> try to do well and remove this function and just call debugfs_create_file in probe.
> 

Sorry, actually I changed my opinion on this. So you should check if the command
is supported and only expose that file if that is the case here. See this commit.

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

> I plan to send patches to fix current status.
> 
>> +
>> +	return 0;
>> +}
>> +
>>  static int cros_ec_debugfs_probe(struct platform_device *pd)
>>  {
>>  	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
>> @@ -442,6 +492,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
>>  	if (ret)
>>  		goto remove_log;
>>  
>> +	ret = cros_ec_create_uptime(debug_info);
>> +	if (ret)
>> +		goto remove_log;
>> +
> 
>        debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
>                            &cros_ec_uptime_fops);
> 
>>  	ec->debug_info = debug_info;
>>  
>>  	dev_set_drvdata(&pd->dev, ec);
>>
> 
> Thanks,
>  Enric
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
       [not found] <20190327182040.112651-1-twawrzynczak@chromium.org>
  2019-04-08 11:29 ` [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime Enric Balletbo i Serra
@ 2019-04-08 21:09 ` Tim Wawrzynczak
  2019-05-02 16:09 ` Tim Wawrzynczak
  2 siblings, 0 replies; 8+ messages in thread
From: Tim Wawrzynczak @ 2019-04-08 21:09 UTC (permalink / raw)
  To: linux-kernel
  Cc: Benson Leung, Enric Balletbo i Serra, Guenter Roeck, Tim Wawrzynczak

The new debugfs entry 'uptime' is being made available to userspace so that
a userspace daemon can synchronize EC logs with host time.

Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
---
Enric, AFAIK only the cros_ec supports the 'uptime' command for now.
And yes, the file does need to be seekable; the userspace daemon that
consumes the file keeps the file open and seeks back to the beginning
to get the latest uptime value.
Based on your second response to v3, I kept the separate 'create_uptime'
function b/c of the logic for checking support for the uptime command.
Let me know if you'd like me to move all of that logic into _probe.

Changelist from v3:
 1) Don't check return values of debugfs_* functions.
 2) Only expose 'uptime' file if EC supports it.
---
 Documentation/ABI/testing/debugfs-cros-ec | 10 +++
 drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 Documentation/ABI/testing/debugfs-cros-ec

diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
new file mode 100644
index 000000000000..24b781c67a4c
--- /dev/null
+++ b/Documentation/ABI/testing/debugfs-cros-ec
@@ -0,0 +1,10 @@
+What:		/sys/kernel/debug/cros_ec/uptime
+Date:		March 2019
+KernelVersion:	5.1
+Description:
+		Read-only.
+		Reads the EC's current uptime information
+		(using EC_CMD_GET_UPTIME_INFO) and prints
+		time_since_ec_boot_ms into the file.
+		This is used for synchronizing AP host time
+		with the cros_ec log.
diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
index 71308766e891..226545a2150b 100644
--- a/drivers/platform/chrome/cros_ec_debugfs.c
+++ b/drivers/platform/chrome/cros_ec_debugfs.c
@@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
+static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
+{
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_uptime_info resp;
+	} __packed ec_buf;
+	struct ec_response_uptime_info *resp;
+	struct cros_ec_command *msg;
+
+	msg = &ec_buf.msg;
+	resp = (struct ec_response_uptime_info *)msg->data;
+
+	msg->command = EC_CMD_GET_UPTIME_INFO;
+	msg->version = 0;
+	msg->insize = sizeof(*resp);
+	msg->outsize = 0;
+
+	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
+	if (ret < 0)
+		return ret;
+
+	*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;
+	u32 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);
+}
+
 static ssize_t cros_ec_pdinfo_read(struct file *file,
 				   char __user *user_buf,
 				   size_t count,
@@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
 	.llseek = default_llseek,
 };
 
+const struct file_operations cros_ec_uptime_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = cros_ec_uptime_read,
+	.llseek = default_llseek,
+};
+
 static int ec_read_version_supported(struct cros_ec_dev *ec)
 {
 	struct ec_params_get_cmd_versions_v1 *params;
@@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
 	return 0;
 }
 
+static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
+{
+	struct cros_ec_debugfs *debug_info = file->private_data;
+	struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
+	u32 uptime;
+	int ret;
+
+	/*
+	 * If the EC does not support the uptime command, which is
+	 * indicated by xfer_status() returning -EINVAL, then no
+	 * debugfs entry will be created.
+	 */
+	ret = cros_ec_get_uptime(ec_dev, &uptime);
+
+	if (ret == -EINVAL)
+		return supported;
+
+	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
+			&cros_ec_uptime_fops);
+
+	return 0;
+}
+
 static int cros_ec_debugfs_probe(struct platform_device *pd)
 {
 	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
@@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
 	if (ret)
 		goto remove_log;
 
+	ret = cros_ec_create_uptime(debug_info);
+	if (ret)
+		goto remove_log;
+
 	ec->debug_info = debug_info;
 
 	dev_set_drvdata(&pd->dev, ec);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
       [not found] <20190327182040.112651-1-twawrzynczak@chromium.org>
  2019-04-08 11:29 ` [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime Enric Balletbo i Serra
  2019-04-08 21:09 ` [PATCH v4] " Tim Wawrzynczak
@ 2019-05-02 16:09 ` Tim Wawrzynczak
  2019-05-02 21:16   ` Enric Balletbo Serra
  2 siblings, 1 reply; 8+ messages in thread
From: Tim Wawrzynczak @ 2019-05-02 16:09 UTC (permalink / raw)
  To: linux-kernel
  Cc: Benson Leung, Enric Balletbo i Serra, Guenter Roeck, Tim Wawrzynczak

The new debugfs entry 'uptime' is being made available to userspace so that
a userspace daemon can synchronize EC logs with host time.

Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
---
Enric, is there something I can do to help speed this along?  This patch
is useful for ChromeOS board bringup, and we would like to see it upstreamed
if at all possible.

Also, AFAIK only the cros_ec supports the 'uptime' command for now.
And yes, the file does need to be seekable; the userspace daemon that
consumes the file keeps the file open and seeks back to the beginning
to get the latest uptime value.
Based on your second response to v3, I kept the separate 'create_uptime'
function b/c of the logic for checking support for the uptime command.
Let me know if you'd like me to move all of that logic into _probe.

Changelist from v3:
 1) Don't check return values of debugfs_* functions.
 2) Only expose 'uptime' file if EC supports it.
---
 Documentation/ABI/testing/debugfs-cros-ec | 10 +++
 drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 Documentation/ABI/testing/debugfs-cros-ec

diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
new file mode 100644
index 000000000000..24b781c67a4c
--- /dev/null
+++ b/Documentation/ABI/testing/debugfs-cros-ec
@@ -0,0 +1,10 @@
+What:		/sys/kernel/debug/cros_ec/uptime
+Date:		March 2019
+KernelVersion:	5.1
+Description:
+		Read-only.
+		Reads the EC's current uptime information
+		(using EC_CMD_GET_UPTIME_INFO) and prints
+		time_since_ec_boot_ms into the file.
+		This is used for synchronizing AP host time
+		with the cros_ec log.
diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
index 71308766e891..226545a2150b 100644
--- a/drivers/platform/chrome/cros_ec_debugfs.c
+++ b/drivers/platform/chrome/cros_ec_debugfs.c
@@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
+static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
+{
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_uptime_info resp;
+	} __packed ec_buf;
+	struct ec_response_uptime_info *resp;
+	struct cros_ec_command *msg;
+
+	msg = &ec_buf.msg;
+	resp = (struct ec_response_uptime_info *)msg->data;
+
+	msg->command = EC_CMD_GET_UPTIME_INFO;
+	msg->version = 0;
+	msg->insize = sizeof(*resp);
+	msg->outsize = 0;
+
+	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
+	if (ret < 0)
+		return ret;
+
+	*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;
+	u32 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);
+}
+
 static ssize_t cros_ec_pdinfo_read(struct file *file,
 				   char __user *user_buf,
 				   size_t count,
@@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
 	.llseek = default_llseek,
 };
 
+const struct file_operations cros_ec_uptime_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = cros_ec_uptime_read,
+	.llseek = default_llseek,
+};
+
 static int ec_read_version_supported(struct cros_ec_dev *ec)
 {
 	struct ec_params_get_cmd_versions_v1 *params;
@@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
 	return 0;
 }
 
+static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
+{
+	struct cros_ec_debugfs *debug_info = file->private_data;
+	struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
+	u32 uptime;
+	int ret;
+
+	/*
+	 * If the EC does not support the uptime command, which is
+	 * indicated by xfer_status() returning -EINVAL, then no
+	 * debugfs entry will be created.
+	 */
+	ret = cros_ec_get_uptime(ec_dev, &uptime);
+
+	if (ret == -EINVAL)
+		return supported;
+
+	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
+			&cros_ec_uptime_fops);
+
+	return 0;
+}
+
 static int cros_ec_debugfs_probe(struct platform_device *pd)
 {
 	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
@@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
 	if (ret)
 		goto remove_log;
 
+	ret = cros_ec_create_uptime(debug_info);
+	if (ret)
+		goto remove_log;
+
 	ec->debug_info = debug_info;
 
 	dev_set_drvdata(&pd->dev, ec);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
  2019-05-02 16:09 ` Tim Wawrzynczak
@ 2019-05-02 21:16   ` Enric Balletbo Serra
  2019-06-06 11:15     ` Enric Balletbo i Serra
  0 siblings, 1 reply; 8+ messages in thread
From: Enric Balletbo Serra @ 2019-05-02 21:16 UTC (permalink / raw)
  To: Tim Wawrzynczak
  Cc: linux-kernel, Benson Leung, Enric Balletbo i Serra, Guenter Roeck

Hi Tim,

Missatge de Tim Wawrzynczak <twawrzynczak@chromium.org> del dia dj., 2
de maig 2019 a les 18:10:
>
> The new debugfs entry 'uptime' is being made available to userspace so that
> a userspace daemon can synchronize EC logs with host time.
>
> Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
> ---
> Enric, is there something I can do to help speed this along?  This patch
> is useful for ChromeOS board bringup, and we would like to see it upstreamed
> if at all possible.
>

The last version looks good to me. The patch is in my list but is too
late for the next merge window. Will be one of the first patches I'll
queue for 5.3

Thanks,
 Enric

> Also, AFAIK only the cros_ec supports the 'uptime' command for now.
> And yes, the file does need to be seekable; the userspace daemon that
> consumes the file keeps the file open and seeks back to the beginning
> to get the latest uptime value.
> Based on your second response to v3, I kept the separate 'create_uptime'
> function b/c of the logic for checking support for the uptime command.
> Let me know if you'd like me to move all of that logic into _probe.
>
> Changelist from v3:
>  1) Don't check return values of debugfs_* functions.
>  2) Only expose 'uptime' file if EC supports it.
> ---
>  Documentation/ABI/testing/debugfs-cros-ec | 10 +++
>  drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
>  2 files changed, 88 insertions(+)
>  create mode 100644 Documentation/ABI/testing/debugfs-cros-ec
>
> diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
> new file mode 100644
> index 000000000000..24b781c67a4c
> --- /dev/null
> +++ b/Documentation/ABI/testing/debugfs-cros-ec
> @@ -0,0 +1,10 @@
> +What:          /sys/kernel/debug/cros_ec/uptime
> +Date:          March 2019
> +KernelVersion: 5.1
> +Description:
> +               Read-only.
> +               Reads the EC's current uptime information
> +               (using EC_CMD_GET_UPTIME_INFO) and prints
> +               time_since_ec_boot_ms into the file.
> +               This is used for synchronizing AP host time
> +               with the cros_ec log.
> diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
> index 71308766e891..226545a2150b 100644
> --- a/drivers/platform/chrome/cros_ec_debugfs.c
> +++ b/drivers/platform/chrome/cros_ec_debugfs.c
> @@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
>         return 0;
>  }
>
> +static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
> +{
> +       struct {
> +               struct cros_ec_command msg;
> +               struct ec_response_uptime_info resp;
> +       } __packed ec_buf;
> +       struct ec_response_uptime_info *resp;
> +       struct cros_ec_command *msg;
> +
> +       msg = &ec_buf.msg;
> +       resp = (struct ec_response_uptime_info *)msg->data;
> +
> +       msg->command = EC_CMD_GET_UPTIME_INFO;
> +       msg->version = 0;
> +       msg->insize = sizeof(*resp);
> +       msg->outsize = 0;
> +
> +       ret = cros_ec_cmd_xfer_status(ec_dev, msg);
> +       if (ret < 0)
> +               return ret;
> +
> +       *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;
> +       u32 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);
> +}
> +
>  static ssize_t cros_ec_pdinfo_read(struct file *file,
>                                    char __user *user_buf,
>                                    size_t count,
> @@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
>         .llseek = default_llseek,
>  };
>
> +const struct file_operations cros_ec_uptime_fops = {
> +       .owner = THIS_MODULE,
> +       .open = simple_open,
> +       .read = cros_ec_uptime_read,
> +       .llseek = default_llseek,
> +};
> +
>  static int ec_read_version_supported(struct cros_ec_dev *ec)
>  {
>         struct ec_params_get_cmd_versions_v1 *params;
> @@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
>         return 0;
>  }
>
> +static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
> +{
> +       struct cros_ec_debugfs *debug_info = file->private_data;
> +       struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
> +       u32 uptime;
> +       int ret;
> +
> +       /*
> +        * If the EC does not support the uptime command, which is
> +        * indicated by xfer_status() returning -EINVAL, then no
> +        * debugfs entry will be created.
> +        */
> +       ret = cros_ec_get_uptime(ec_dev, &uptime);
> +
> +       if (ret == -EINVAL)
> +               return supported;
> +
> +       debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
> +                       &cros_ec_uptime_fops);
> +
> +       return 0;
> +}
> +
>  static int cros_ec_debugfs_probe(struct platform_device *pd)
>  {
>         struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
> @@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
>         if (ret)
>                 goto remove_log;
>
> +       ret = cros_ec_create_uptime(debug_info);
> +       if (ret)
> +               goto remove_log;
> +
>         ec->debug_info = debug_info;
>
>         dev_set_drvdata(&pd->dev, ec);
> --
> 2.20.1
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
  2019-05-02 21:16   ` Enric Balletbo Serra
@ 2019-06-06 11:15     ` Enric Balletbo i Serra
  0 siblings, 0 replies; 8+ messages in thread
From: Enric Balletbo i Serra @ 2019-06-06 11:15 UTC (permalink / raw)
  To: Enric Balletbo Serra, Tim Wawrzynczak
  Cc: linux-kernel, Benson Leung, Guenter Roeck

Hi Tim,

Sorry for making you wait so much, now that the patches about cros_ec_commands
include file has been accepted and the struct is up-to-date I can manage this.
I've some few comments though, one of them is a change I requested but that now
we should revert (sorry about that)

Please rebase the patch on top of chrome-platform-5.3, there are trivial conflicts.

On 2/5/19 23:16, Enric Balletbo Serra wrote:
> Hi Tim,
> 
> Missatge de Tim Wawrzynczak <twawrzynczak@chromium.org> del dia dj., 2
> de maig 2019 a les 18:10:
>>
>> The new debugfs entry 'uptime' is being made available to userspace so that
>> a userspace daemon can synchronize EC logs with host time.
>>
>> Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
>> ---
>> Enric, is there something I can do to help speed this along?  This patch
>> is useful for ChromeOS board bringup, and we would like to see it upstreamed
>> if at all possible.
>>
> 
> The last version looks good to me. The patch is in my list but is too
> late for the next merge window. Will be one of the first patches I'll
> queue for 5.3
> 
> Thanks,
>  Enric
> 
>> Also, AFAIK only the cros_ec supports the 'uptime' command for now.
>> And yes, the file does need to be seekable; the userspace daemon that
>> consumes the file keeps the file open and seeks back to the beginning
>> to get the latest uptime value.
>> Based on your second response to v3, I kept the separate 'create_uptime'
>> function b/c of the logic for checking support for the uptime command.
>> Let me know if you'd like me to move all of that logic into _probe.
>>
>> Changelist from v3:
>>  1) Don't check return values of debugfs_* functions.
>>  2) Only expose 'uptime' file if EC supports it.
>> ---
>>  Documentation/ABI/testing/debugfs-cros-ec | 10 +++
>>  drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
>>  2 files changed, 88 insertions(+)
>>  create mode 100644 Documentation/ABI/testing/debugfs-cros-ec
>>
>> diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
>> new file mode 100644
>> index 000000000000..24b781c67a4c
>> --- /dev/null
>> +++ b/Documentation/ABI/testing/debugfs-cros-ec
>> @@ -0,0 +1,10 @@
>> +What:          /sys/kernel/debug/cros_ec/uptime

Although for now only cros_ec supports it, let's use <cros-ec-device> for
possible future uses.

/sys/kernel/debug/<cros-ec-device>/uptime

>> +Date:          March 2019
>> +KernelVersion: 5.1

Will be 5.3

>> +Description:
>> +               Read-only.
>> +               Reads the EC's current uptime information
>> +               (using EC_CMD_GET_UPTIME_INFO) and prints
>> +               time_since_ec_boot_ms into the file.
>> +               This is used for synchronizing AP host time
>> +               with the cros_ec log.
>> diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
>> index 71308766e891..226545a2150b 100644
>> --- a/drivers/platform/chrome/cros_ec_debugfs.c
>> +++ b/drivers/platform/chrome/cros_ec_debugfs.c
>> @@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
>>         return 0;
>>  }
>>
>> +static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
>> +{
>> +       struct {
>> +               struct cros_ec_command msg;
>> +               struct ec_response_uptime_info resp;
>> +       } __packed ec_buf;
>> +       struct ec_response_uptime_info *resp;
>> +       struct cros_ec_command *msg;
>> +
>> +       msg = &ec_buf.msg;
>> +       resp = (struct ec_response_uptime_info *)msg->data;
>> +
>> +       msg->command = EC_CMD_GET_UPTIME_INFO;
>> +       msg->version = 0;
>> +       msg->insize = sizeof(*resp);
>> +       msg->outsize = 0;
>> +
>> +       ret = cros_ec_cmd_xfer_status(ec_dev, msg);
>> +       if (ret < 0)
>> +               return ret;
>> +
>> +       *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;
>> +       u32 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);
>> +}
>> +
>>  static ssize_t cros_ec_pdinfo_read(struct file *file,
>>                                    char __user *user_buf,
>>                                    size_t count,
>> @@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
>>         .llseek = default_llseek,
>>  };
>>
>> +const struct file_operations cros_ec_uptime_fops = {
>> +       .owner = THIS_MODULE,
>> +       .open = simple_open,
>> +       .read = cros_ec_uptime_read,
>> +       .llseek = default_llseek,
>> +};
>> +
>>  static int ec_read_version_supported(struct cros_ec_dev *ec)
>>  {
>>         struct ec_params_get_cmd_versions_v1 *params;
>> @@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
>>         return 0;
>>  }
>>
>> +static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
>> +{
>> +       struct cros_ec_debugfs *debug_info = file->private_data;
>> +       struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
>> +       u32 uptime;
>> +       int ret;
>> +
>> +       /*
>> +        * If the EC does not support the uptime command, which is
>> +        * indicated by xfer_status() returning -EINVAL, then no
>> +        * debugfs entry will be created.
>> +        */
>> +       ret = cros_ec_get_uptime(ec_dev, &uptime);
>> +
>> +       if (ret == -EINVAL)
>> +               return supported;

That doesn't apply anymore, xfer_status will not return -EINVAL (sorry to make
you change this before)

>> +
>> +       debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
>> +                       &cros_ec_uptime_fops);
>> +
>> +       return 0;
>> +}
>> +


Let's remove this function and just do

>>  static int cros_ec_debugfs_probe(struct platform_device *pd)
>>  {
>>         struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
>> @@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
>>         if (ret)
>>                 goto remove_log;
>>


If the command fails just don't create the file silently. No need to remove the
other files just because this fails.

if (cros_ec_get_uptime() == 0)
    debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
                        &cros_ec_uptime_fops);

Thanks,
 Enric

>> +       ret = cros_ec_create_uptime(debug_info);
>> +       if (ret)
>> +               goto remove_log;
>> +
>>         ec->debug_info = debug_info;
>>
>>         dev_set_drvdata(&pd->dev, ec);
>> --
>> 2.20.1
>>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
  2019-03-25 17:02 [PATCH v2] platform/chrome: mfd/cros_ec_sysfs: Add sysfs " twawrzynczak
  2019-04-18 16:44 ` [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs " Tim Wawrzynczak
@ 2019-04-18 16:45 ` Tim Wawrzynczak
  1 sibling, 0 replies; 8+ messages in thread
From: Tim Wawrzynczak @ 2019-04-18 16:45 UTC (permalink / raw)
  To: Tim Wawrzynczak
  Cc: Enric Balletbo i Serra, Benson Leung, Olof Johansson, linux-kernel

The new debugfs entry 'uptime' is being made available to userspace so that
a userspace daemon can synchronize EC logs with host time.

Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
---
Enric, AFAIK only the cros_ec supports the 'uptime' command for now.
And yes, the file does need to be seekable; the userspace daemon that
consumes the file keeps the file open and seeks back to the beginning
to get the latest uptime value.
Based on your second response to v3, I kept the separate 'create_uptime'
function b/c of the logic for checking support for the uptime command.
Let me know if you'd like me to move all of that logic into _probe.

Changelist from v3:
 1) Don't check return values of debugfs_* functions.
 2) Only expose 'uptime' file if EC supports it.
---
 Documentation/ABI/testing/debugfs-cros-ec | 10 +++
 drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 Documentation/ABI/testing/debugfs-cros-ec

diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
new file mode 100644
index 000000000000..24b781c67a4c
--- /dev/null
+++ b/Documentation/ABI/testing/debugfs-cros-ec
@@ -0,0 +1,10 @@
+What:		/sys/kernel/debug/cros_ec/uptime
+Date:		March 2019
+KernelVersion:	5.1
+Description:
+		Read-only.
+		Reads the EC's current uptime information
+		(using EC_CMD_GET_UPTIME_INFO) and prints
+		time_since_ec_boot_ms into the file.
+		This is used for synchronizing AP host time
+		with the cros_ec log.
diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
index 71308766e891..226545a2150b 100644
--- a/drivers/platform/chrome/cros_ec_debugfs.c
+++ b/drivers/platform/chrome/cros_ec_debugfs.c
@@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
+static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
+{
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_uptime_info resp;
+	} __packed ec_buf;
+	struct ec_response_uptime_info *resp;
+	struct cros_ec_command *msg;
+
+	msg = &ec_buf.msg;
+	resp = (struct ec_response_uptime_info *)msg->data;
+
+	msg->command = EC_CMD_GET_UPTIME_INFO;
+	msg->version = 0;
+	msg->insize = sizeof(*resp);
+	msg->outsize = 0;
+
+	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
+	if (ret < 0)
+		return ret;
+
+	*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;
+	u32 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);
+}
+
 static ssize_t cros_ec_pdinfo_read(struct file *file,
 				   char __user *user_buf,
 				   size_t count,
@@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
 	.llseek = default_llseek,
 };
 
+const struct file_operations cros_ec_uptime_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = cros_ec_uptime_read,
+	.llseek = default_llseek,
+};
+
 static int ec_read_version_supported(struct cros_ec_dev *ec)
 {
 	struct ec_params_get_cmd_versions_v1 *params;
@@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
 	return 0;
 }
 
+static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
+{
+	struct cros_ec_debugfs *debug_info = file->private_data;
+	struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
+	u32 uptime;
+	int ret;
+
+	/*
+	 * If the EC does not support the uptime command, which is
+	 * indicated by xfer_status() returning -EINVAL, then no
+	 * debugfs entry will be created.
+	 */
+	ret = cros_ec_get_uptime(ec_dev, &uptime);
+
+	if (ret == -EINVAL)
+		return supported;
+
+	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
+			&cros_ec_uptime_fops);
+
+	return 0;
+}
+
 static int cros_ec_debugfs_probe(struct platform_device *pd)
 {
 	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
@@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
 	if (ret)
 		goto remove_log;
 
+	ret = cros_ec_create_uptime(debug_info);
+	if (ret)
+		goto remove_log;
+
 	ec->debug_info = debug_info;
 
 	dev_set_drvdata(&pd->dev, ec);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime.
  2019-03-25 17:02 [PATCH v2] platform/chrome: mfd/cros_ec_sysfs: Add sysfs " twawrzynczak
@ 2019-04-18 16:44 ` Tim Wawrzynczak
  2019-04-18 16:45 ` Tim Wawrzynczak
  1 sibling, 0 replies; 8+ messages in thread
From: Tim Wawrzynczak @ 2019-04-18 16:44 UTC (permalink / raw)
  To: Tim Wawrzynczak
  Cc: EnricBalletboiSerraenric.balletbo, Benson Leung, Olof Johansson,
	linux-kernel

The new debugfs entry 'uptime' is being made available to userspace so that
a userspace daemon can synchronize EC logs with host time.

Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
---
Enric, AFAIK only the cros_ec supports the 'uptime' command for now.
And yes, the file does need to be seekable; the userspace daemon that
consumes the file keeps the file open and seeks back to the beginning
to get the latest uptime value.
Based on your second response to v3, I kept the separate 'create_uptime'
function b/c of the logic for checking support for the uptime command.
Let me know if you'd like me to move all of that logic into _probe.

Changelist from v3:
 1) Don't check return values of debugfs_* functions.
 2) Only expose 'uptime' file if EC supports it.
---
 Documentation/ABI/testing/debugfs-cros-ec | 10 +++
 drivers/platform/chrome/cros_ec_debugfs.c | 78 +++++++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 Documentation/ABI/testing/debugfs-cros-ec

diff --git a/Documentation/ABI/testing/debugfs-cros-ec b/Documentation/ABI/testing/debugfs-cros-ec
new file mode 100644
index 000000000000..24b781c67a4c
--- /dev/null
+++ b/Documentation/ABI/testing/debugfs-cros-ec
@@ -0,0 +1,10 @@
+What:		/sys/kernel/debug/cros_ec/uptime
+Date:		March 2019
+KernelVersion:	5.1
+Description:
+		Read-only.
+		Reads the EC's current uptime information
+		(using EC_CMD_GET_UPTIME_INFO) and prints
+		time_since_ec_boot_ms into the file.
+		This is used for synchronizing AP host time
+		with the cros_ec log.
diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
index 71308766e891..226545a2150b 100644
--- a/drivers/platform/chrome/cros_ec_debugfs.c
+++ b/drivers/platform/chrome/cros_ec_debugfs.c
@@ -201,6 +201,50 @@ static int cros_ec_console_log_release(struct inode *inode, struct file *file)
 	return 0;
 }
 
+static int cros_ec_get_uptime(struct cros_ec_device *ec_dev, u32 *uptime)
+{
+	struct {
+		struct cros_ec_command msg;
+		struct ec_response_uptime_info resp;
+	} __packed ec_buf;
+	struct ec_response_uptime_info *resp;
+	struct cros_ec_command *msg;
+
+	msg = &ec_buf.msg;
+	resp = (struct ec_response_uptime_info *)msg->data;
+
+	msg->command = EC_CMD_GET_UPTIME_INFO;
+	msg->version = 0;
+	msg->insize = sizeof(*resp);
+	msg->outsize = 0;
+
+	ret = cros_ec_cmd_xfer_status(ec_dev, msg);
+	if (ret < 0)
+		return ret;
+
+	*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;
+	u32 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);
+}
+
 static ssize_t cros_ec_pdinfo_read(struct file *file,
 				   char __user *user_buf,
 				   size_t count,
@@ -269,6 +313,13 @@ const struct file_operations cros_ec_pdinfo_fops = {
 	.llseek = default_llseek,
 };
 
+const struct file_operations cros_ec_uptime_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = cros_ec_uptime_read,
+	.llseek = default_llseek,
+};
+
 static int ec_read_version_supported(struct cros_ec_dev *ec)
 {
 	struct ec_params_get_cmd_versions_v1 *params;
@@ -413,6 +464,29 @@ static int cros_ec_create_pdinfo(struct cros_ec_debugfs *debug_info)
 	return 0;
 }
 
+static int cros_ec_create_uptime(struct cros_ec_debugfs *debug_info)
+{
+	struct cros_ec_debugfs *debug_info = file->private_data;
+	struct cros_ec_device *ec_dev = debug_info->ec->ec_dev;
+	u32 uptime;
+	int ret;
+
+	/*
+	 * If the EC does not support the uptime command, which is
+	 * indicated by xfer_status() returning -EINVAL, then no
+	 * debugfs entry will be created.
+	 */
+	ret = cros_ec_get_uptime(ec_dev, &uptime);
+
+	if (ret == -EINVAL)
+		return supported;
+
+	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
+			&cros_ec_uptime_fops);
+
+	return 0;
+}
+
 static int cros_ec_debugfs_probe(struct platform_device *pd)
 {
 	struct cros_ec_dev *ec = dev_get_drvdata(pd->dev.parent);
@@ -442,6 +516,10 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
 	if (ret)
 		goto remove_log;
 
+	ret = cros_ec_create_uptime(debug_info);
+	if (ret)
+		goto remove_log;
+
 	ec->debug_info = debug_info;
 
 	dev_set_drvdata(&pd->dev, ec);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-06-06 11:15 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20190327182040.112651-1-twawrzynczak@chromium.org>
2019-04-08 11:29 ` [PATCH v3] platform/chrome: mfd/cros_ec_debugfs: Add debugfs entry to retrieve EC uptime Enric Balletbo i Serra
2019-04-08 13:01   ` Enric Balletbo i Serra
2019-04-08 21:09 ` [PATCH v4] " Tim Wawrzynczak
2019-05-02 16:09 ` Tim Wawrzynczak
2019-05-02 21:16   ` Enric Balletbo Serra
2019-06-06 11:15     ` Enric Balletbo i Serra
2019-03-25 17:02 [PATCH v2] platform/chrome: mfd/cros_ec_sysfs: Add sysfs " twawrzynczak
2019-04-18 16:44 ` [PATCH v4] platform/chrome: mfd/cros_ec_debugfs: Add debugfs " Tim Wawrzynczak
2019-04-18 16:45 ` Tim Wawrzynczak

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).