[PATCH 1/1] tpm: clear state post probing
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Nov 15 15:34:18 CET 2021
Hi Heinrich,
On Mon, Nov 15, 2021 at 03:15:45PM +0100, Heinrich Schuchardt wrote:
> Before we can start measuring the TPM must be cleared. Do this in the
> post_probe() method of the uclass.
>
This looks reasonable to me. We need to note that this will make the
startup command with 'SU_STATE' argument practically unusable.
OTOH the 'SU_STATE' is supposed to be used on a TPM when the hardware goes
to sleep. But in order to do so you need to shutdown the TPM with TPM_SU_STATE
as well in order to preserve things like the session counter, PCRs that are
designated to be saved and restored amongst other things. I doubt we ever
had proper support for that and I don't think U-Boot needs this
functionality at all(??). So
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
> drivers/tpm/tpm-uclass.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/tpm/tpm-uclass.c b/drivers/tpm/tpm-uclass.c
> index f67fe1019b..9180551d6f 100644
> --- a/drivers/tpm/tpm-uclass.c
> +++ b/drivers/tpm/tpm-uclass.c
> @@ -11,6 +11,7 @@
> #include <log.h>
> #include <linux/delay.h>
> #include <linux/unaligned/be_byteshift.h>
> +#include <tpm_api.h>
> #include <tpm-v1.h>
> #include <tpm-v2.h>
> #include "tpm_internal.h"
> @@ -136,6 +137,26 @@ int tpm_xfer(struct udevice *dev, const uint8_t *sendbuf, size_t send_size,
> return 0;
> }
>
> +static int dm_tpm_post_probe(struct udevice *dev)
> +{
> + struct tpm_chip_priv *priv = dev_get_uclass_priv(dev);
> +
> + /*
> + * Clearing the TPM state is only possible once after a hard reset.
> + * As we do not know if the TPM has been cleared by a prior boot stage
> + * ignore the return value here.
> + */
> + switch (priv->version) {
> + case TPM_V1:
> + tpm_startup(dev, TPM_ST_CLEAR);
> + break;
> + case TPM_V2:
> + tpm2_startup(dev, TPM2_SU_CLEAR);
> + break;
> + }
> + return 0;
> +}
> +
> UCLASS_DRIVER(tpm) = {
> .id = UCLASS_TPM,
> .name = "tpm",
> @@ -143,5 +164,6 @@ UCLASS_DRIVER(tpm) = {
> #if CONFIG_IS_ENABLED(OF_REAL)
> .post_bind = dm_scan_fdt_dev,
> #endif
> + .post_probe = dm_tpm_post_probe,
> .per_device_auto = sizeof(struct tpm_chip_priv),
> };
> --
> 2.32.0
>
More information about the U-Boot
mailing list