> Date: Wed, 6 Jan 2021 16:16:27 -0600
> From: Scott Cheloha <[email protected]>
>
> On Wed, Jan 06, 2021 at 12:16:13PM -0600, Scott Cheloha wrote:
> > As mentioned in a prior mail, tpm(4) is the last user of tvtohz(9) in
> > the tree.
> >
> > However, we don't need to use tvtohz(9) in tpm(4) at all. Converting
> > from milliseconds to ticks is trivial. Using an intermediary timeval
> > is just pointless indirection.
> >
> > With this committed I will be able to remove both tvtohz(9) and
> > tstohz(9) from the tree in a subsequent patch.
>
> Whoops, made a mistake in the prior diff.
>
> We want to MAX() the result up to 1 to avoid dividing to zero and
> blocking indefinitely in e.g. tsleep(9). Previous diff MIN'd the
> result down to 1, which is very wrong.
To be honest I'd just zap the function completely and instead simply do:
to = TPM_ACCESS_TMO / 10;
and
to = TPM_BURST_TMO / 10;
There is no magic happening here. The code is just doing a hardware
register poll loop in 10us steps.
Hmm, actually it seems the code is broken and uses steps of 10
microseconds instead of milliseconds. So instead it should probably
use:
to = TPM_ACCESS_TMO * 100;
and
to = TPM_BURST_TMO * 100;
Cheers,
Mark
> Index: tpm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/acpi/tpm.c,v
> retrieving revision 1.10
> diff -u -p -r1.10 tpm.c
> --- tpm.c 22 May 2020 10:16:37 -0000 1.10
> +++ tpm.c 6 Jan 2021 22:09:49 -0000
> @@ -24,6 +24,7 @@
> */
>
> #include <sys/param.h>
> +#include <sys/kernel.h>
> #include <sys/systm.h>
> #include <sys/device.h>
> #include <sys/malloc.h>
> @@ -455,12 +456,7 @@ tpm_status(struct tpm_softc *sc)
> int
> tpm_tmotohz(int tmo)
> {
> - struct timeval tv;
> -
> - tv.tv_sec = tmo / 1000;
> - tv.tv_usec = 1000 * (tmo % 1000);
> -
> - return tvtohz(&tv);
> + return MAX(1, tmo * hz / 1000);
> }
>
> int
>
>