diff options
author | Jack Rosenthal <jrosenth@chromium.org> | 2019-06-25 17:42:00 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-27 17:09:06 +0000 |
commit | b69a471834c521e47a4931324e96e5ce7a49e865 (patch) | |
tree | 15edb811daa8023e22b84eab58be315ea2e869d5 | |
parent | 93b7637e6925ee2a58c3666e60d428749eb4eadf (diff) | |
download | chrome-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.c | 19 |
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 |