summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2019-06-25 17:42:00 -0600
committerCommit Bot <commit-bot@chromium.org>2019-06-27 17:09:06 +0000
commitb69a471834c521e47a4931324e96e5ce7a49e865 (patch)
tree15edb811daa8023e22b84eab58be315ea2e869d5
parent93b7637e6925ee2a58c3666e60d428749eb4eadf (diff)
downloadchrome-ec-b69a471834c521e47a4931324e96e5ce7a49e865.tar.gz
ish5: fast 32-bit division in scale_us2ticks
The critical section using scale_us2ticks is in __hw_clock_source_set, which we can optimize as this has 32-bit inupts and outputs. Make a separate function for this usage, scale_us2ticks_32, to be used in this critical section. BUG=b:133190570 BRANCH=none TEST=tested outputs of scale_us2ticks_32 to make sure they matched the correct value for 32-bit inputs Change-Id: I4f0f928327cb686006c5ebf4ef17becc5e921d9e Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1677239 Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org> Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--chip/ish/hwtimer.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/chip/ish/hwtimer.c b/chip/ish/hwtimer.c
index 4b6faa96f8..276ef1b5db 100644
--- a/chip/ish/hwtimer.c
+++ b/chip/ish/hwtimer.c
@@ -44,6 +44,12 @@ static inline uint64_t scale_us2ticks(uint64_t us)
return us * CLOCK_FACTOR;
}
+static inline uint32_t scale_us2ticks_32(uint32_t us)
+{
+ /* no optimization for ISH3 */
+ return us * CLOCK_FACTOR;
+}
+
static inline uint64_t scale_ticks2us(uint64_t ticks)
{
return ticks / CLOCK_FACTOR;
@@ -58,6 +64,7 @@ static inline void wait_while_settling(uint32_t mask)
#define CLOCK_SCALE_BITS 15
BUILD_ASSERT(BIT(CLOCK_SCALE_BITS) == ISH_HPET_CLK_FREQ);
+/* Slow version, for 64-bit precision */
static inline uint64_t scale_us2ticks(uint64_t us)
{
/* ticks = us * ISH_HPET_CLK_FREQ / SECOND */
@@ -65,6 +72,16 @@ static inline uint64_t scale_us2ticks(uint64_t us)
return (us << CLOCK_SCALE_BITS) / SECOND;
}
+/* Fast version, for 32-bit precision */
+static inline uint32_t scale_us2ticks_32(uint32_t us)
+{
+ /*
+ * GCC optimizes this shift/divide into multiplication by a
+ * magic number
+ */
+ return (us << CLOCK_SCALE_BITS) / SECOND;
+}
+
static inline uint64_t scale_ticks2us(uint64_t ticks)
{
return (ticks * SECOND) >> CLOCK_SCALE_BITS;
@@ -139,7 +156,7 @@ void __hw_clock_event_set(uint32_t deadline)
* every 10 seconds.
*/
wait_while_settling(HPET_T1_CMP_SETTLING);
- HPET_TIMER_COMP(1) = current_ticks + scale_us2ticks(remaining_us);
+ HPET_TIMER_COMP(1) = current_ticks + scale_us2ticks_32(remaining_us);
/*
* Update 'last_deadline' and add calibrate delta due to HPET timer