diff options
author | Tom Rini <trini@konsulko.com> | 2023-02-28 09:50:16 -0500 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2023-02-28 09:50:16 -0500 |
commit | f10905b4b7b9b6888e2532cdfb3536d2244676cb (patch) | |
tree | 6609cc57d553683eaed0ccfb9dca295af66ef29c /lib/tpm_api.c | |
parent | c12fe739ea1ea9ba4ca289bd4e7b1293a9ccb256 (diff) | |
parent | a11be4c303eabb142e074c7ca14b6ae0d293f0cb (diff) | |
download | u-boot-WIP/28Feb2023-next.zip u-boot-WIP/28Feb2023-next.tar.gz u-boot-WIP/28Feb2023-next.tar.bz2 |
Merge tag 'tpm-next-28022023' of https://source.denx.de/u-boot/custodians/u-boot-tpm into nextWIP/28Feb2023-next
TPM auto startup and testing:
Due to U-Boot's lazy binding we always relied on command line tools to
initialize the TPM subsystem and devices. One exception is the EFI
subsystem. When compiled with TCG2 measured boot support the TPM was
automatically initialized.
However that init was not complete. The TCG specs [0] (and specifically
ยง12.3 Self-test modes) describe how self-tests on the device should be
performed. This PR is adding an extra API function, that can be used to
initialize the TPM2.0 properly.
Simon added the equivalent for TPM1.2 and refactored the DM tests to
include the new funtion.
[0] https://trustedcomputinggroup.org/wp-content/uploads/TPM-Rev-2.0-Part-1-Architecture-01.07-2014-03-13.pdf
Diffstat (limited to 'lib/tpm_api.c')
-rw-r--r-- | lib/tpm_api.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/tpm_api.c b/lib/tpm_api.c index 7e8df87..3ef5e81 100644 --- a/lib/tpm_api.c +++ b/lib/tpm_api.c @@ -35,6 +35,27 @@ u32 tpm_startup(struct udevice *dev, enum tpm_startup_type mode) } } +u32 tpm_auto_start(struct udevice *dev) +{ + u32 rc; + + /* + * the tpm_init() will return -EBUSY if the init has already happened + * The selftest and startup code can run multiple times with no side + * effects + */ + rc = tpm_init(dev); + if (rc && rc != -EBUSY) + return rc; + + if (tpm_is_v1(dev)) + return tpm1_auto_start(dev); + else if (tpm_is_v2(dev)) + return tpm2_auto_start(dev); + else + return -ENOSYS; +} + u32 tpm_resume(struct udevice *dev) { if (tpm_is_v1(dev)) |