[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 1/2] hw/watchdog: Implement SBSA watchdog device
From: |
Maxim Uvarov |
Subject: |
Re: [PATCH v3 1/2] hw/watchdog: Implement SBSA watchdog device |
Date: |
Thu, 8 Oct 2020 13:43:35 +0300 |
On Thu, 8 Oct 2020 at 13:27, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Thu, 8 Oct 2020 at 11:21, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> >
> > On Thu, 8 Oct 2020 at 05:43, Shashi Mallela <shashi.mallela@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
I meant that LL is an long long int which is 64 bit size type. And
then you pass it to uint32_t.