mfd / platform: cros_ec_debugfs: Expose resume result via debugfs
authorEvan Green <evgreen@chromium.org>
Thu, 27 Jun 2019 20:44:45 +0000 (13:44 -0700)
committerEnric Balletbo i Serra <enric.balletbo@collabora.com>
Mon, 1 Jul 2019 13:39:11 +0000 (15:39 +0200)
For ECs that support it, the EC returns the number of slp_s0
transitions and whether or not there was a timeout in the resume
response. Expose the last resume result to usermode via debugfs so
that usermode can detect and report S0ix timeouts.

Signed-off-by: Evan Green <evgreen@chromium.org>
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
Documentation/ABI/testing/debugfs-cros-ec
drivers/mfd/cros_ec.c
drivers/platform/chrome/cros_ec_debugfs.c
include/linux/mfd/cros_ec.h

index 573a82d23c89a71b0cbb307921f09e917dc70bce..1fe0add99a2a991f4d5b1824ded0526c59be65a6 100644 (file)
@@ -32,3 +32,25 @@ Description:
                is used for synchronizing the AP host time with the EC
                log. An error is returned if the command is not supported
                by the EC or there is a communication problem.
+
+What:          /sys/kernel/debug/<cros-ec-device>/last_resume_result
+Date:          June 2019
+KernelVersion: 5.3
+Description:
+               Some ECs have a feature where they will track transitions to
+               the (Intel) processor's SLP_S0 line, in order to detect cases
+               where a system failed to go into S0ix. When the system resumes,
+               an EC with this feature will return a summary of SLP_S0
+               transitions that occurred. The last_resume_result file returns
+               the most recent response from the AP's resume message to the EC.
+
+               The bottom 31 bits contain a count of the number of SLP_S0
+               transitions that occurred since the suspend message was
+               received. Bit 31 is set if the EC attempted to wake the
+               system due to a timeout when watching for SLP_S0 transitions.
+               Callers can use this to detect a wake from the EC due to
+               S0ix timeouts. The result will be zero if no suspend
+               transitions have been attempted, or the EC does not support
+               this feature.
+
+               Output will be in the format: "0x%08x\n".
index bd2bcdd4718b2f9a4971eb10f5b94b022ea7dbc8..64a2d3adc72915929d7d66700902a850de696da4 100644 (file)
@@ -110,12 +110,16 @@ static int cros_ec_sleep_event(struct cros_ec_device *ec_dev, u8 sleep_event)
 
        /* For now, report failure to transition to S0ix with a warning. */
        if (ret >= 0 && ec_dev->host_sleep_v1 &&
-           (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME))
+           (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME)) {
+               ec_dev->last_resume_result =
+                       buf.u.resp1.resume_response.sleep_transitions;
+
                WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions &
                          EC_HOST_RESUME_SLEEP_TIMEOUT,
                          "EC detected sleep transition timeout. Total slp_s0 transitions: %d",
                          buf.u.resp1.resume_response.sleep_transitions &
                          EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK);
+       }
 
        return ret;
 }
index 7ee06074384442350f04160ef539d24e1155907f..8ec1cc2889f2e3d34c5215bb06e81b995832f9d3 100644 (file)
@@ -447,6 +447,9 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
        debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
                            &cros_ec_uptime_fops);
 
+       debugfs_create_x32("last_resume_result", 0444, debug_info->dir,
+                          &ec->ec_dev->last_resume_result);
+
        ec->debug_info = debug_info;
 
        dev_set_drvdata(&pd->dev, ec);
index cfa78bb4990f7547470e9ebcfd0183ad13295e77..d50ade418a836830b48c6f3520293727b83b17d0 100644 (file)
@@ -163,6 +163,7 @@ struct cros_ec_device {
        struct ec_response_get_next_event_v1 event_data;
        int event_size;
        u32 host_event_wake_mask;
+       u32 last_resume_result;
 };
 
 /**