From: Satyam Gupta <sgsatyam@google.com>
To: Tzung-Bi Shih <tzungbi@kernel.org>
Cc: Benson Leung <bleung@chromium.org>,
Guenter Roeck <groeck@chromium.org>,
Gwendal Grignou <gwendal@chromium.org>,
Scott Collyer <scollyer@google.com>,
chrome-platform@lists.linux.dev, linux-kernel@vger.kernel.org,
Satyam Gupta <sgsatyam@google.com>
Subject: [PATCH v6 7/7] platform/chrome: cros_ec_sensorhub: Drop sensor samples with past timestamps
Date: Thu, 29 Oct 2026 09:28:46 +0000 [thread overview]
Message-ID: <20261029092846.1567475-8-sgsatyam@google.com> (raw)
In-Reply-To: <20261029092846.1567475-1-sgsatyam@google.com>
From: Scott Collyer <scollyer@google.com>
When a sample timestamp is earlier than the newest timestamp seen for
that sensor, the sample is clamped to the last batch timestamp so that
the batch spreading logic re-times it. This makes the spreading logic
treat it as part of the previous batch, which produces stale timestamps
downstream.
Drop such Out Of Order (OOO) samples instead. The previous batch length
then no longer covers the interval up to the next batch, so reset it to
prevent the next batch from computing its sample period across the gap.
Rename cros_ec_sensor_ring_check_for_past_timestamp() to
cros_ec_sensor_ring_is_past_timestamp() and make it return true for past
timestamps.
Signed-off-by: Scott Collyer <scollyer@google.com>
Signed-off-by: Satyam Gupta <sgsatyam@google.com>
---
.../platform/chrome/cros_ec_sensorhub_ring.c | 43 +++++++++++++------
1 file changed, 29 insertions(+), 14 deletions(-)
diff --git a/drivers/platform/chrome/cros_ec_sensorhub_ring.c b/drivers/platform/chrome/cros_ec_sensorhub_ring.c
index ef20aac..bc3f120 100644
--- a/drivers/platform/chrome/cros_ec_sensorhub_ring.c
+++ b/drivers/platform/chrome/cros_ec_sensorhub_ring.c
@@ -440,23 +440,29 @@ cros_ec_sensor_ring_fix_overflow(s64 *ts,
state->last = *ts;
}
-static void
-cros_ec_sensor_ring_check_for_past_timestamp(struct cros_ec_sensorhub
- *sensorhub,
- struct cros_ec_sensors_ring_sample
- *sample)
+static bool
+cros_ec_sensor_ring_is_past_timestamp(struct cros_ec_sensorhub *sensorhub,
+ struct cros_ec_sensors_ring_sample *sample)
{
const u8 sensor_id = sample->sensor_id;
- /* If this event is earlier than one we saw before... */
+ /*
+ * If this event is strictly earlier than one we saw before, it is truly
+ * out-of-order and must be dropped to preserve monotonicity.
+ *
+ * We intentionally allow duplicate timestamps (==) to pass through here
+ * because the EC/ISH may report a batch of samples with the same raw
+ * timestamp. These duplicates are required by the downstream spreading
+ * logic (cros_ec_sensor_ring_spread_add) to interpolate unique,
+ * monotonic timestamps for each sample in the batch.
+ */
if (sensorhub->batch_state[sensor_id].newest_sensor_event >
sample->timestamp)
- /* mark it for spreading. */
- sample->timestamp =
- sensorhub->batch_state[sensor_id].last_ts;
- else
- sensorhub->batch_state[sensor_id].newest_sensor_event =
- sample->timestamp;
+ return true;
+
+ sensorhub->batch_state[sensor_id].newest_sensor_event =
+ sample->timestamp;
+ return false;
}
/**
@@ -608,8 +614,17 @@ cros_ec_sensor_ring_process_event(struct cros_ec_sensorhub *sensorhub,
for (axis = 0; axis < 3; axis++)
out->vector[axis] = in->data[axis];
- if (sensorhub->tight_timestamps)
- cros_ec_sensor_ring_check_for_past_timestamp(sensorhub, out);
+ if (sensorhub->tight_timestamps &&
+ cros_ec_sensor_ring_is_past_timestamp(sensorhub, out)) {
+ /*
+ * Drop the sample. The previous batch length no longer
+ * covers the interval up to the next batch, so reset it to
+ * prevent the next batch from computing its sample period
+ * across the gap.
+ */
+ sensorhub->batch_state[out->sensor_id].last_len = 0;
+ return false;
+ }
return true;
}
--
2.56.0.307.g5fe7bd680c-goog
prev parent reply other threads:[~2026-10-29 9:29 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-29 9:28 [PATCH v6 0/7] platform/chrome: cros_ec_sensorhub: Timestamp wrap and drift filter fixes Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 1/7] platform/chrome: cros_ec_sensorhub: Unwrap sample TS relative to FIFO TS Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 2/7] platform/chrome: cros_ec_sensorhub: Reset TS filter on EC/AP time mismatch Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 3/7] platform/chrome: cros_ec_sensorhub: Fix TS filter history shift index Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 4/7] platform/chrome: cros_ec_sensorhub: Clamp clock drift slope to MAX_DRIFT_PPM Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 5/7] platform/chrome: cros_ec_sensorhub: Reset TS filter on ODR or mode changes Satyam Gupta
2026-10-29 9:28 ` [PATCH v6 6/7] platform/chrome: cros_ec_sensorhub: Increase TS_HISTORY_BORED_US to 2s Satyam Gupta
2026-10-29 9:28 ` Satyam Gupta [this message]
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=20261029092846.1567475-8-sgsatyam@google.com \
--to=sgsatyam@google.com \
--cc=bleung@chromium.org \
--cc=chrome-platform@lists.linux.dev \
--cc=groeck@chromium.org \
--cc=gwendal@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=scollyer@google.com \
--cc=tzungbi@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®