aboutsummaryrefslogtreecommitdiff
path: root/lib/tpm_api.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2023-02-28 09:50:16 -0500
committerTom Rini <trini@konsulko.com>2023-02-28 09:50:16 -0500
commitf10905b4b7b9b6888e2532cdfb3536d2244676cb (patch)
tree6609cc57d553683eaed0ccfb9dca295af66ef29c /lib/tpm_api.c
parentc12fe739ea1ea9ba4ca289bd4e7b1293a9ccb256 (diff)
parenta11be4c303eabb142e074c7ca14b6ae0d293f0cb (diff)
downloadu-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.c21
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))