[PATCH v2 1/1] tpm: call tpm_tis_wait_init() after tpm_tis_init()

Simon Glass sjg at chromium.org
Wed Jul 24 16:37:12 CEST 2024


On Wed, 24 Jul 2024 at 02:56, Ilias Apalodimas
<ilias.apalodimas at linaro.org> wrote:
>
> Thanks Lukas,
>
> On Wed, 24 Jul 2024 at 10:35, <lukas.funke-oss at weidmueller.com> wrote:
> >
> > From: Lukas Funke <lukas.funke at weidmueller.com>
> >
> > tpm_tis_wait_init() is using the 'chip->timeout_b' field which is
> > initialized in tpm_tis_init(). However, the init-function is called
> > *after* tpm_tis_wait_init() introducing an uninitalized field access.
> >
> > This commit switches both routines.
> >
> > Signed-off-by: Lukas Funke <lukas.funke at weidmueller.com>
> > Acked-by: Miquel Raynal <miquel.raynal at bootlin.com>
> > ---
> >
> > Changes in v2:
> > - Call tpm_tis_wait_init() from tpm_tis_init()
> > - Use phy_ops for bus access in tpm_tis_wait_init()
> >
> >  drivers/tpm/tpm2_tis_core.c | 28 ++++++++++++++++++++++++++++
> >  drivers/tpm/tpm2_tis_spi.c  | 29 -----------------------------
> >  2 files changed, 28 insertions(+), 29 deletions(-)
> >
> > diff --git a/drivers/tpm/tpm2_tis_core.c b/drivers/tpm/tpm2_tis_core.c
> > index 680a6409433..1fdf8cfa319 100644
> > --- a/drivers/tpm/tpm2_tis_core.c
> > +++ b/drivers/tpm/tpm2_tis_core.c
> > @@ -419,6 +419,28 @@ static bool tis_check_ops(struct tpm_tis_phy_ops *phy_ops)
> >         return true;
> >  }
> >
> > +static int tpm_tis_wait_init(struct udevice *dev, int loc)
> > +{
> > +       struct tpm_chip *chip = dev_get_priv(dev);
> > +       unsigned long start, stop;
> > +       u8 status;
> > +       int ret;
> > +
> > +       start = get_timer(0);
> > +       stop = chip->timeout_b;
> > +       do {
> > +               mdelay(TPM_TIMEOUT_MS);
> > +               ret = chip->phy_ops->read_bytes(dev, TPM_ACCESS(loc), 1, &status);
> > +               if (ret)
> > +                       break;
> > +
> > +               if (status & TPM_ACCESS_VALID)
> > +                       return 0;
> > +       } while (get_timer(start) < stop);
> > +
> > +       return -EIO;
> > +}
> > +
> >  int tpm_tis_init(struct udevice *dev)
> >  {
> >         struct tpm_chip *chip = dev_get_priv(dev);
> > @@ -436,6 +458,12 @@ int tpm_tis_init(struct udevice *dev)
> >         chip->timeout_c = TIS_SHORT_TIMEOUT_MS;
> >         chip->timeout_d = TIS_SHORT_TIMEOUT_MS;
> >
> > +       ret = tpm_tis_wait_init(dev, chip->locality);
> > +       if (ret) {
> > +               log(LOGC_DM, LOGL_ERR, "%s: no device found\n", __func__);
> > +               return ret;
> > +       }
> > +
> >         ret = tpm_tis_request_locality(dev, 0);
> >         if (ret)
> >                 return ret;
> > diff --git a/drivers/tpm/tpm2_tis_spi.c b/drivers/tpm/tpm2_tis_spi.c
> > index b0fe97ab1d0..7909a147c2d 100644
> > --- a/drivers/tpm/tpm2_tis_spi.c
> > +++ b/drivers/tpm/tpm2_tis_spi.c
> > @@ -188,29 +188,6 @@ static int tpm_tis_spi_write32(struct udevice *dev, u32 addr, u32 value)
> >         return tpm_tis_spi_write(dev, addr, sizeof(value), (u8 *)&value_le);
> >  }
> >
> > -static int tpm_tis_wait_init(struct udevice *dev, int loc)
> > -{
> > -       struct tpm_chip *chip = dev_get_priv(dev);
> > -       unsigned long start, stop;
> > -       u8 status;
> > -       int ret;
> > -
> > -       start = get_timer(0);
> > -       stop = chip->timeout_b;
> > -       do {
> > -               mdelay(TPM_TIMEOUT_MS);
> > -
> > -               ret = tpm_tis_spi_read(dev, TPM_ACCESS(loc), 1, &status);
> > -               if (ret)
> > -                       break;
> > -
> > -               if (status & TPM_ACCESS_VALID)
> > -                       return 0;
> > -       } while (get_timer(start) < stop);
> > -
> > -       return -EIO;
> > -}
> > -
> >  static struct tpm_tis_phy_ops phy_ops = {
> >         .read_bytes = tpm_tis_spi_read,
> >         .write_bytes = tpm_tis_spi_write,
> > @@ -256,12 +233,6 @@ static int tpm_tis_spi_probe(struct udevice *dev)
> >         /* Ensure a minimum amount of time elapsed since reset of the TPM */
> >         mdelay(drv_data->time_before_first_cmd_ms);
> >
> > -       ret = tpm_tis_wait_init(dev, chip->locality);
> > -       if (ret) {
> > -               log(LOGC_DM, LOGL_ERR, "%s: no device found\n", __func__);
> > -               return ret;
> > -       }
> > -
> >         tpm_tis_ops_register(dev, &phy_ops);
> >         ret = tpm_tis_init(dev);
> >         if (ret)
> > --
> > 2.30.2
> >
>
> I'll manually add the fixes tag on merge. Other than that
> Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>

Reviewed-by: Simon Glass <sjg at chromium.org>
Fixes: a5c30c26b28 ("tpm: Use the new API on tpm2 spi driver")


More information about the U-Boot mailing list