summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2018-10-11 18:16:59 +0800
committerPhilipp Deppenwiese <zaolin.daisuki@gmail.com>2018-10-18 16:22:40 +0000
commit9937a063d47c974f274ece2fadcc13faf6423929 (patch)
tree7adab74d57426fff327375b6cb6afc1a8cbbae4e /src
parent660389ef9e10dbe2735820baaf035c14fef6fafc (diff)
downloadcoreboot-9937a063d47c974f274ece2fadcc13faf6423929.tar.gz
coreboot-9937a063d47c974f274ece2fadcc13faf6423929.tar.bz2
coreboot-9937a063d47c974f274ece2fadcc13faf6423929.zip
tpm/tspi: clean up tpm_setup function flow
Introduce two helper functions for more readable code. Use epilogue function instead of goto for error handling. BUG=None TEST=None Change-Id: Ibea44880683a301e82ee2ba049003c36fcb44eba Signed-off-by: Joel Kitching <kitching@google.com> Reviewed-on: https://review.coreboot.org/29026 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/security/tpm/tspi/tspi.c84
1 files changed, 46 insertions, 38 deletions
diff --git a/src/security/tpm/tspi/tspi.c b/src/security/tpm/tspi/tspi.c
index c1779e677acf..d9cade981d8c 100644
--- a/src/security/tpm/tspi/tspi.c
+++ b/src/security/tpm/tspi/tspi.c
@@ -64,6 +64,43 @@ static uint32_t tpm1_invoke_state_machine(void)
}
#endif
+static uint32_t tpm_setup_s3_helper(void)
+{
+ uint32_t result;
+
+ result = tlcl_resume();
+ switch (result) {
+ case TPM_SUCCESS:
+ break;
+
+ case TPM_E_INVALID_POSTINIT:
+ /*
+ * We're on a platform where the TPM maintains power
+ * in S3, so it's already initialized.
+ */
+ printk(BIOS_INFO, "TPM: Already initialized.\n");
+ result = TPM_SUCCESS;
+ break;
+
+ default:
+ printk(BIOS_ERR, "TPM: Resume failed (%#x).\n", result);
+ break;
+
+ }
+
+ return result;
+}
+
+static uint32_t tpm_setup_epilogue(uint32_t result)
+{
+ if (result != TPM_SUCCESS)
+ post_code(POST_TPM_FAILURE);
+ else
+ printk(BIOS_INFO, "TPM: setup succeeded\n");
+
+ return result;
+}
+
/*
* tpm_setup starts the TPM and establishes the root of trust for the
* anti-rollback mechanism. SetupTPM can fail for three reasons. 1 A bug. 2 a
@@ -91,37 +128,19 @@ uint32_t tpm_setup(int s3flag)
result = tlcl_lib_init();
if (result != TPM_SUCCESS) {
printk(BIOS_ERR, "TPM: Can't initialize.\n");
- goto out;
+ return tpm_setup_epilogue(result);
}
/* Handle special init for S3 resume path */
if (s3flag) {
- result = tlcl_resume();
- switch (result) {
- case TPM_SUCCESS:
- break;
-
- case TPM_E_INVALID_POSTINIT:
- /*
- * We're on a platform where the TPM maintains power
- * in S3, so it's already initialized.
- */
- printk(BIOS_INFO, "TPM: Already initialized.\n");
- result = TPM_SUCCESS;
- break;
-
- default:
- printk(BIOS_ERR, "TPM: Resume failed (%#x).\n", result);
- break;
-
- }
- goto out;
+ printk(BIOS_INFO, "TPM: Handle S3 resume.\n");
+ return tpm_setup_epilogue(tpm_setup_s3_helper());
}
result = tlcl_startup();
if (result != TPM_SUCCESS) {
printk(BIOS_ERR, "TPM: Can't run startup command.\n");
- goto out;
+ return tpm_setup_epilogue(result);
}
result = tlcl_assert_physical_presence();
@@ -133,33 +152,22 @@ uint32_t tpm_setup(int s3flag)
*/
result = tlcl_physical_presence_cmd_enable();
if (result != TPM_SUCCESS) {
- printk(
- BIOS_ERR,
- "TPM: Can't enable physical presence command.\n");
- goto out;
+ printk(BIOS_ERR, "TPM: Can't enable physical presence command.\n");
+ return tpm_setup_epilogue(result);
}
result = tlcl_assert_physical_presence();
if (result != TPM_SUCCESS) {
- printk(BIOS_ERR,
- "TPM: Can't assert physical presence.\n");
- goto out;
+ printk(BIOS_ERR, "TPM: Can't assert physical presence.\n");
+ return tpm_setup_epilogue(result);
}
}
#if IS_ENABLED(CONFIG_TPM1)
result = tpm1_invoke_state_machine();
- if (result != TPM_SUCCESS)
- return result;
#endif
-out:
- if (result != TPM_SUCCESS)
- post_code(POST_TPM_FAILURE);
- else
- printk(BIOS_INFO, "TPM: setup succeeded\n");
-
- return result;
+ return tpm_setup_epilogue(result);
}
uint32_t tpm_clear_and_reenable(void)