Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c3166e1 authored by Evan Green's avatar Evan Green Committed by Enric Balletbo i Serra
Browse files

mfd / platform: cros_ec_debugfs: Expose resume result via debugfs



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: default avatarEvan Green <evgreen@chromium.org>
Acked-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
parent c18e6ea1
Loading
Loading
Loading
Loading
+22 −0
Original line number Original line Diff line number Diff line
@@ -32,3 +32,25 @@ Description:
		is used for synchronizing the AP host time with the EC
		is used for synchronizing the AP host time with the EC
		log. An error is returned if the command is not supported
		log. An error is returned if the command is not supported
		by the EC or there is a communication problem.
		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".
+5 −1
Original line number Original line Diff line number Diff line
@@ -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. */
	/* For now, report failure to transition to S0ix with a warning. */
	if (ret >= 0 && ec_dev->host_sleep_v1 &&
	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 &
		WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions &
			  EC_HOST_RESUME_SLEEP_TIMEOUT,
			  EC_HOST_RESUME_SLEEP_TIMEOUT,
			  "EC detected sleep transition timeout. Total slp_s0 transitions: %d",
			  "EC detected sleep transition timeout. Total slp_s0 transitions: %d",
			  buf.u.resp1.resume_response.sleep_transitions &
			  buf.u.resp1.resume_response.sleep_transitions &
			  EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK);
			  EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK);
	}


	return ret;
	return ret;
}
}
+3 −0
Original line number Original line Diff line number Diff line
@@ -447,6 +447,9 @@ static int cros_ec_debugfs_probe(struct platform_device *pd)
	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
	debugfs_create_file("uptime", 0444, debug_info->dir, debug_info,
			    &cros_ec_uptime_fops);
			    &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;
	ec->debug_info = debug_info;


	dev_set_drvdata(&pd->dev, ec);
	dev_set_drvdata(&pd->dev, ec);
+1 −0
Original line number Original line Diff line number Diff line
@@ -163,6 +163,7 @@ struct cros_ec_device {
	struct ec_response_get_next_event_v1 event_data;
	struct ec_response_get_next_event_v1 event_data;
	int event_size;
	int event_size;
	u32 host_event_wake_mask;
	u32 host_event_wake_mask;
	u32 last_resume_result;
};
};


/**
/**