On Thu, 8 Oct 2020 at 11:21, Maxim Uvarov <maxim.uva...@linaro.org> wrote: > > On Thu, 8 Oct 2020 at 05:43, Shashi Mallela <shashi.mall...@linaro.org> wrote: > > +static void sbsa_gwdt_update_timer(SBSA_GWDTState *s) > > +{ > > + uint64_t timeout = 0; > > + > > + if (s->enabled) { > > + /* > > + * Extract the upper 16 bits from woru & 32 bits from worl > > + * registers to construct the 48 bit offset value > > + */ > > + timeout = s->woru & SBSA_GWDT_WOR_MASK; > > + timeout <<= 32; > > + timeout |= s->worl; > > + timeout = muldiv64(timeout, NANOSECONDS_PER_SECOND, > > SBSA_TIMER_FREQ); > > static inline uint64_t muldiv64(uint64_t a, uint32_t b, uint32_t c) > { > return (__int128_t)a * b / c; > } > > #define NANOSECONDS_PER_SECOND 1000000000LL > > Interesting why gcc does not warn on 64bit signed to 32bit unsigned > truncation here. Looks like it's too smart to understand > that value fits in 32 bits.
What truncation? 1000000000 in decimal is 0x3B9ACA00 in hex: the number fits in an 32 bit integer without truncation. (ns = muldiv64(ticks, NANOSECONDS_PER_SECOND, frequency) is a pretty common pattern in our timer devices for converting a number of ticks to a duration in nanoseconds, as is the reverse conversion of ticks = muldiv64(ns, NANOSECONDS_PER_SECOND, frequency).) thanks -- PMM