Hi Simon,

Simon Glass <[email protected]> wrote on Wed, 18 Jul 2018 19:31:41 -0600:

> Hi Miquel,
> 
> On 14 July 2018 at 06:16, Miquel Raynal <[email protected]> wrote:
> > While there is probably no reason to do so in a real life situation, it
> > will allow to compile test both stacks with the same sandbox defconfig.
> >
> > As we cannot define two 'tpm' commands at the same time, the command for
> > TPM v1 is still called 'tpm' and the one for TPM v2 'tpm2'. While this
> > is the exact command name that must be written into eg. test files, any
> > user already using the TPM v2 stack can continue using just 'tpm' as
> > command as long as TPM v1 support is not compiled (because U-Boot prompt
> > will search for the closest command named after 'tpm'.b)
> >
> > The command set can also be changed at runtime (not supported yet, but
> > ready to be), but as one can compile only either one stack or the other,
> > there is still one spot in the code where conditionals are used: to
> > retrieve the v1 or v2 command set.
> >
> > Signed-off-by: Miquel Raynal <[email protected]>
> > ---
> >  cmd/tpm-common.c               | 24 +++++++++++++++++++++++-
> >  cmd/tpm-v1.c                   |  2 +-
> >  cmd/tpm-v2.c                   |  4 ++--
> >  drivers/tpm/Kconfig            |  7 ++-----
> >  drivers/tpm/tpm-uclass.c       | 13 ++++++++++---
> >  drivers/tpm/tpm2_tis_sandbox.c | 11 +++++++++++
> >  drivers/tpm/tpm2_tis_spi.c     | 15 +++++++++++++++
> >  include/tpm-common.h           | 36 ++++++++++++++++++++++++++++++------
> >  lib/tpm-common.c               |  4 ++++
> >  lib/tpm-utils.h                |  9 +++++++++
> >  10 files changed, 107 insertions(+), 18 deletions(-)
> >  
> 
> Reviewed-by: Simon Glass <[email protected]>
> 
> Some comments below.
> 
> > diff --git a/cmd/tpm-common.c b/cmd/tpm-common.c
> > index 6cf9fcc9ac..69cc02b599 100644
> > --- a/cmd/tpm-common.c
> > +++ b/cmd/tpm-common.c
> > @@ -273,12 +273,34 @@ int do_tpm_init(cmd_tbl_t *cmdtp, int flag, int argc, 
> > char * const argv[])
> >  int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> >  {
> >         cmd_tbl_t *tpm_commands, *cmd;
> > +       struct tpm_chip_priv *priv;
> > +       struct udevice *dev;
> >         unsigned int size;
> > +       int rc;  
> 
> Can we use 'ret'? That is more common.

Of course.

> 
> >
> >         if (argc < 2)
> >                 return CMD_RET_USAGE;
> >
> > -       tpm_commands = get_tpm_commands(&size);
> > +       rc = get_tpm(&dev);
> > +       if (rc)
> > +               return rc;
> > +
> > +       priv = dev_get_uclass_priv(dev);
> > +
> > +       switch (priv->version) {
> > +#if defined(CONFIG_TPM_V1)
> > +       case TPM_V1:  
> 
> if (IS_ENABLED(CONFIG_TPM_V1))
> 
> (I think #ifdef is worse)

Actually, in the present state, get_tpmx_commands symbol is only
available if the file if TPM_Vx is selected in Kconfig.

I created two dummy functions in tpm-common.h which return NULL for
each symbol if their respective TPM version is not compiled. This way it
removes any conditionals in the code.

> 
> > +               tpm_commands = get_tpm1_commands(&size);
> > +               break;
> > +#endif
> > +#if defined(CONFIG_TPM_V2)
> > +       case TPM_V2:
> > +               tpm_commands = get_tpm2_commands(&size);
> > +               break;
> > +#endif
> > +       default:
> > +               return CMD_RET_USAGE;
> > +       }

[...]

> >
> > +static int sandbox_tpm2_set_version(struct udevice *dev)
> > +{
> > +       struct tpm_chip_priv *priv = dev_get_uclass_priv(dev);
> > +
> > +       /* Use the TPM v2 stack */
> > +       priv->version = TPM_V2;  
> 
> Don't you think this could be done in the probe() method?

When I first wrote this I faced some issues. As I did not remembered
why it would fail I tried again and indeed, moving this
selection in the probe works.

> 
> > +
> > +       return 0;
> > +}
> > +

[...]

> > @@ -65,6 +78,16 @@ struct tpm_chip_priv {
> >   * to bytes which are sent and received.
> >   */
> >  struct tpm_ops {
> > +       /**
> > +        * set_version() - Set the right TPM stack version to use
> > +        *
> > +        * Default is TPM_V1. TPM of newer versions can implement this
> > +        * optional hook to set another value.
> > +        *
> > +        * @dev:        TPM device
> > +        */
> > +       int (*set_version)(struct udevice *dev);  
> 
> I think this could just be a helper function provided by the uclass,
> rather than a device method.

Actually there is no need for this hook or any helper anymore, I
removed them all as the version selection is done in the driver
->probe().

I'll let other people that would need to change the version at runtime
adding support for that if they want, it should not be too tricky
anyway.

Thanks,
Miquèl
_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to