diff options
Diffstat (limited to 'src/security/tpm/tss/tss.c')
-rw-r--r-- | src/security/tpm/tss/tss.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/security/tpm/tss/tss.c b/src/security/tpm/tss/tss.c new file mode 100644 index 0000000000..bd0e98582b --- /dev/null +++ b/src/security/tpm/tss/tss.c @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: BSD-3-Clause */ + +#include <console/console.h> +#include <security/tpm/tis.h> +#include <security/tpm/tss.h> + +/* + * This unit is meant to dispatch to either TPM1.2 or TPM2.0 TSS implementation + * based on TPM family determined on probing during initialization. + */ + +enum tpm_family tlcl_tpm_family = TPM_UNKNOWN; + +tis_sendrecv_fn tlcl_tis_sendrecv; + +/* Probe for TPM device and choose implementation based on the returned TPM family. */ +tpm_result_t tlcl_lib_init(void) +{ + /* Don't probe for TPM more than once per stage. */ + static bool init_done; + if (init_done) + return tlcl_tpm_family == TPM_UNKNOWN ? TPM_CB_NO_DEVICE : TPM_SUCCESS; + + /* Set right away to make recursion impossible. */ + init_done = true; + + tlcl_tis_sendrecv = tis_probe(&tlcl_tpm_family); + + if (tlcl_tis_sendrecv == NULL) { + printk(BIOS_ERR, "%s: tis_probe failed\n", __func__); + tlcl_tpm_family = TPM_UNKNOWN; + } else if (tlcl_tpm_family != TPM_1 && tlcl_tpm_family != TPM_2) { + printk(BIOS_ERR, "%s: tis_probe returned incorrect TPM family: %d\n", __func__, + tlcl_tpm_family); + tlcl_tpm_family = TPM_UNKNOWN; + } + + return tlcl_tpm_family == TPM_UNKNOWN ? TPM_CB_NO_DEVICE : TPM_SUCCESS; +} |