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

Ilias Apalodimas ilias.apalodimas at linaro.org
Wed Jul 24 10:55:49 CEST 2024


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>


More information about the U-Boot mailing list