Enable CONFIG_TPM_AUTOSTART on sandbox and add two tests which send
EVT_LAST_STAGE_INIT: one checks that the TPM is started, the other that
the event does not fail when there is no TPM device.

Signed-off-by: Michael Haener <[email protected]>
---
Changes in v3:
- New patch, split out of patch 1

 configs/sandbox_defconfig |  1 +
 test/dm/tpm.c             | 44 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig
index a2708e6fb33..3efbdc6fdf1 100644
--- a/configs/sandbox_defconfig
+++ b/configs/sandbox_defconfig
@@ -400,6 +400,7 @@ CONFIG_ECDSA=y
 CONFIG_ECDSA_VERIFY=y
 CONFIG_RSASSA_PSS=y
 CONFIG_TPM=y
+CONFIG_TPM_AUTOSTART=y
 CONFIG_ERRNO_STR=y
 CONFIG_GETOPT=y
 CONFIG_TEST_FDTDEC=y
diff --git a/test/dm/tpm.c b/test/dm/tpm.c
index 87c5c416daa..46e843787f1 100644
--- a/test/dm/tpm.c
+++ b/test/dm/tpm.c
@@ -5,8 +5,11 @@
  */
 
 #include <dm.h>
+#include <event.h>
 #include <tpm_api.h>
+#include <dm/device-internal.h>
 #include <dm/test.h>
+#include <dm/uclass-internal.h>
 #include <test/test.h>
 #include <test/ut.h>
 
@@ -197,3 +200,44 @@ static int dm_test_tpm_autostart_reinit(struct 
unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_tpm_autostart_reinit, UTF_SCAN_FDT);
+
+/* Check that CONFIG_TPM_AUTOSTART starts the TPM from the init event */
+static int dm_test_tpm_autostart_event(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+       char buf[50];
+
+       if (!IS_ENABLED(CONFIG_TPM_AUTOSTART))
+               return 0;
+
+       ut_assertok(get_tpm_version(TPM_V2, &dev));
+
+       ut_assert(tpm_report_state(dev, buf, sizeof(buf)));
+       ut_asserteq_str("init_done=0", buf);
+
+       ut_assertok(event_notify_null(EVT_LAST_STAGE_INIT));
+
+       ut_assert(tpm_report_state(dev, buf, sizeof(buf)));
+       ut_asserteq_str("init_done=1", buf);
+
+       return 0;
+}
+DM_TEST(dm_test_tpm_autostart_event, UTF_SCAN_FDT);
+
+/* Check that a missing TPM does not make the init event fail */
+static int dm_test_tpm_autostart_event_missing(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       if (!IS_ENABLED(CONFIG_TPM_AUTOSTART))
+               return 0;
+
+       while (!uclass_find_first_device(UCLASS_TPM, &dev) && dev)
+               ut_assertok(device_unbind(dev));
+
+       ut_asserteq(-ENODEV, uclass_first_device_err(UCLASS_TPM, &dev));
+       ut_assertok(event_notify_null(EVT_LAST_STAGE_INIT));
+
+       return 0;
+}
+DM_TEST(dm_test_tpm_autostart_event_missing, UTF_SCAN_FDT);
-- 
2.55.0

Reply via email to