[PATCH] clocksource: imx-tpm: Wait for CnV write to take effect
Jacky Bai
ping.bai at nxp.com
Fri Oct 13 01:47:43 PDT 2023
> Subject: Re: [PATCH] clocksource: imx-tpm: Wait for CnV write to take effect
>
> On 12/10/2023 08:44, Jacky Bai wrote:
> >> Subject: Re: [PATCH] clocksource: imx-tpm: Wait for CnV write to take
> >> effect
> >>
> >> On 11/10/2023 12:13, Jacky Bai wrote:
> >>>> Subject: Re: [PATCH] clocksource: imx-tpm: Wait for CnV write to
> >>>> take effect
> >>
> >> [ ... ]
> >>
> >>>>>>> static int tpm_set_next_event(unsigned long delta,
> >>>>>>> struct
> clock_event_device
> >> *evt)
> >>>>>>> {
> >>>>>>> - unsigned long next, now;
> >>>>>>> + unsigned long next, prev, now;
> >>>>>>>
> >>>>>>> - next = tpm_read_counter();
> >>>>>>> - next += delta;
> >>>>>>> + prev = tpm_read_counter();
> >>>>>>> + next = prev + delta;
> >>>>>>> writel(next, timer_base + TPM_C0V);
> >>>>>>> now = tpm_read_counter();
> >>>>>>>
> >>>>>>> + /*
> >>>>>>> + * Need to wait CNT increase at least 1 cycle to make sure
> >>>>>>> + * the C0V has been updated into HW.
> >>>>>>> + */
> >>>>>>> + if ((next & 0xffffffff) != readl(timer_base + TPM_C0V))
> >>>>>>
> >>>>>> Why do you use a mask for 'next' ?
> >>>>>>
> >>>>>
> >>>>> 'unsigned long' is 64 bit on arm64 platform, while the register is
> >>>>> 32bit, so the upper 32bit cleared before comparing.
> >>>>
> >>>> But next is unsigned long and readl returns a long, no ?
> >>>
> >>> 'next' upper 32bit may not be '0's.
> >>
> >> Is it possible to have 'next' greater than INT_MAX?
> >
> > may has the possibility if prev + next > 0xffffffff?
>
> So there is a couple of things.
>
> 1.
>
> The init function called clockevents_config_and_register() with the register
> width and the max_delta.
>
> The underlying framework is not supposed to call "'set_next_event' where the
> next event will be greater than the register width.
>
> now + delta is < UINT_MAX (or max_delta if I'm not wrong)
>
> It detects timer wrapping and then counts the number of time has to wrap
> before applying a recomputed delta.
>
> 2.
>
> unsigned long a = ULONG_MAX;
> unsigned int b = UINT_MAX;
>
> a = b;
>
> printf("%lu\n", a);
>
> Gives : 4294967295 , UINT_MAX
>
> Said simply, (next & 0xffffffff) is not needed AFAICT.
Great thx. I will refine the changes as you suggested in V2.
BR
>
>
>
>
> --
More information about the linux-arm-kernel
mailing list