Thread (5 messages) 5 messages, 3 authors, 2025-07-22

Re: [PATCH] soc: amlogic: clk-measure: Optimize measurement accuracy

From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Date: 2025-07-17 15:44:02
Also in: linux-amlogic, lkml

Hello,

thank you for this patch!

On Thu, Jul 17, 2025 at 5:08 AM Chuan Liu via B4 Relay
[off-list ref] wrote:
From: Chuan Liu <redacted>

The cycle count register has a 20-bit effective width, but the driver
only utilizes 16 bits. This reduces the sampling window when measuring
high-frequency clocks, resulting in (slightly) degraded measurement
accuracy.
I checked the Meson8 downstream code [0] and it uses 0x000FFFFF to
mask the register value -> this means that old SoCs also have a 20-bit
wide width.

[...]
Here are the test comparisons based on C3:
[...]
Here are the test comparisons based on C3:
I have tested this patch with Meson8b based Odroid-C1:
pre-optimization:
# time cat /sys/kernel/debug/meson-clk-msr/measure_summary | grep -v "  0  "
  clock                     rate    precision
---------------------------------------------
 clk81                 159372396    +/-5208Hz
 a9_clk_div16           24000000    +/-3125Hz
 rtc_osc_clk_out           31250    +/-3125Hz
 hdmi_ch0_tmds         146399038    +/-4807Hz
 sar_adc                 1140625    +/-3125Hz
 sdhc_rx                94443750    +/-3125Hz
 sdhc_sd                94443750    +/-3125Hz
 pwm_d                 849921875    +/-31250Hz
 pwm_c                 849921875    +/-31250Hz

real    0m0.102s
user    0m0.005s
sys     0m0.069s


post-optimization:
# time cat /sys/kernel/debug/meson-clk-msr/measure_summary | grep -v "  0  "
  clock                     rate    precision
---------------------------------------------
 clk81                 159373438    +/-1562Hz
 a9_clk_div16           12000000    +/-1562Hz
 rtc_osc_clk_out           32813    +/-1562Hz
 hdmi_ch0_tmds         146398438    +/-1562Hz
 sar_adc                 1143750    +/-1562Hz
 sdhc_rx                94443750    +/-1562Hz
 sdhc_sd                94443750    +/-1562Hz
 pwm_d                 849992188    +/-1562Hz
 pwm_c                 849992188    +/-1562Hz

real    0m0.173s
user    0m0.008s
sys     0m0.109s

So there's also an improvement in accuracy. The only downside I'm
seeing is that it takes 75% extra time for the measurement. For me
this is irrelevant since we use this for debugging.

[...]
+       /*
+        * HACK: The input clock signal path from gate (Controlled by MSR_RUN)
+        * to internal sampling circuit in clk-measure has a propagation delay
+        * requirement: 24 clock cycles must elapse after mux selection before
+        * sampling.
+        *
+        * For a 30kHz measurement clock, this translates to an 800μs delay:
+        * 800us = 24 / 30000Hz.
+        */
+       fsleep(800);
What is needed to make this not a HACK anymore? Is there a register
that we can poll for the number of clock cycles that have passed?


Best regards,
Martin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help