security/tpm: support compiling in multiple TPM drivers

Starting from here CONFIG_TPM1 and CONFIG_TPM2 are no longer mutually
exclusive.

Change-Id: I44c5a1d825afe414c2f5c2c90f4cfe41ba9bef5f
Ticket: https://ticket.coreboot.org/issues/433
Signed-off-by: Sergii Dmytruk <sergii.dmytruk@3mdeb.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/69162
Reviewed-by: Julius Werner <jwerner@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Sergii Dmytruk
2022-11-01 00:48:43 +02:00
committed by Felix Held
parent 7c75f8e5b2
commit 3e5cefcc45
12 changed files with 53 additions and 28 deletions

View File

@@ -46,7 +46,7 @@ static tpm_result_t crb_tpm_sendrecv(const uint8_t *sendbuf, size_t sbuf_size, u
return TPM_SUCCESS; return TPM_SUCCESS;
} }
tis_sendrecv_fn tis_probe(enum tpm_family *family) tis_sendrecv_fn crb_tis_probe(enum tpm_family *family)
{ {
struct crb_tpm_info info; struct crb_tpm_info info;

View File

@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: BSD-3-Clause */ /* SPDX-License-Identifier: BSD-3-Clause */
/* This is a driver for a Command Response Buffer Interface */ /* This is a driver for a Command Response Buffer Interface */
#include <security/tpm/tis.h>
#include <security/tpm/tss_errors.h> #include <security/tpm/tss_errors.h>
/* CRB driver */ /* CRB driver */
@@ -65,3 +66,5 @@ void crb_tpm_get_info(struct crb_tpm_info *crb_tpm_info);
size_t crb_tpm_process_command(const void *tpm2_command, size_t command_size, size_t crb_tpm_process_command(const void *tpm2_command, size_t command_size,
void *tpm2_response, size_t max_response); void *tpm2_response, size_t max_response);
bool crb_tpm_is_active(void); bool crb_tpm_is_active(void);
tis_sendrecv_fn crb_tis_probe(enum tpm_family *family);

View File

@@ -118,7 +118,7 @@ static tpm_result_t i2c_tpm_sendrecv(const uint8_t *sendbuf, size_t sbuf_size,
return TPM_SUCCESS; return TPM_SUCCESS;
} }
tis_sendrecv_fn tis_probe(enum tpm_family *family) tis_sendrecv_fn i2c_tis_probe(enum tpm_family *family)
{ {
if (tpm_vendor_probe(CONFIG_DRIVER_TPM_I2C_BUS, CONFIG_DRIVER_TPM_I2C_ADDR, family)) if (tpm_vendor_probe(CONFIG_DRIVER_TPM_I2C_BUS, CONFIG_DRIVER_TPM_I2C_ADDR, family))
return NULL; return NULL;

View File

@@ -12,6 +12,8 @@
#include <timer.h> #include <timer.h>
#include <types.h> #include <types.h>
#include "tpm.h"
#define RECV_TIMEOUT (1 * 1000) /* 1 second */ #define RECV_TIMEOUT (1 * 1000) /* 1 second */
#define XMIT_TIMEOUT (1 * 1000) /* 1 second */ #define XMIT_TIMEOUT (1 * 1000) /* 1 second */
#define SLEEP_DURATION 1000 /* microseconds */ #define SLEEP_DURATION 1000 /* microseconds */
@@ -107,7 +109,7 @@ static tpm_result_t i2c_tis_sendrecv(const uint8_t *sendbuf, size_t sbuf_size,
return TPM_SUCCESS; return TPM_SUCCESS;
} }
tis_sendrecv_fn tis_probe(enum tpm_family *family) tis_sendrecv_fn i2c_tis_probe(enum tpm_family *family)
{ {
/* /*
* Can't query version or really anything as the device doesn't support * Can't query version or really anything as the device doesn't support

View File

@@ -56,4 +56,6 @@ tpm_result_t tpm_vendor_probe(unsigned int bus, uint32_t addr, enum tpm_family *
tpm_result_t tpm_vendor_init(struct tpm_chip *chip, unsigned int bus, uint32_t dev_addr); tpm_result_t tpm_vendor_init(struct tpm_chip *chip, unsigned int bus, uint32_t dev_addr);
tis_sendrecv_fn i2c_tis_probe(enum tpm_family *family);
#endif /* __DRIVERS_TPM_SLB9635_I2C_TPM_H__ */ #endif /* __DRIVERS_TPM_SLB9635_I2C_TPM_H__ */

View File

@@ -24,7 +24,9 @@
#include <device/pnp.h> #include <device/pnp.h>
#include <drivers/tpm/tpm_ppi.h> #include <drivers/tpm/tpm_ppi.h>
#include <timer.h> #include <timer.h>
#include "chip.h" #include "chip.h"
#include "tpm.h"
#define PREFIX "lpc_tpm: " #define PREFIX "lpc_tpm: "
@@ -374,7 +376,7 @@ static tpm_result_t tis_command_ready(u8 locality)
* Returns TPM_SUCCESS on success (the device is found or was found during * Returns TPM_SUCCESS on success (the device is found or was found during
* an earlier invocation) or TPM_CB_FAIL if the device is not found. * an earlier invocation) or TPM_CB_FAIL if the device is not found.
*/ */
static tpm_result_t pc80_tis_probe(enum tpm_family *family) static tpm_result_t pc80_tpm_probe(enum tpm_family *family)
{ {
static enum tpm_family tpm_family; static enum tpm_family tpm_family;
@@ -718,7 +720,7 @@ static tpm_result_t pc80_tpm_sendrecv(const uint8_t *sendbuf, size_t send_size,
} }
/* /*
* tis_probe() * pc80_tis_probe()
* *
* Probe for the TPM device and set it up for use within locality 0. * Probe for the TPM device and set it up for use within locality 0.
* *
@@ -726,9 +728,9 @@ static tpm_result_t pc80_tpm_sendrecv(const uint8_t *sendbuf, size_t send_size,
* *
* Returns pointer to send-receive function on success or NULL on failure. * Returns pointer to send-receive function on success or NULL on failure.
*/ */
tis_sendrecv_fn tis_probe(enum tpm_family *family) tis_sendrecv_fn pc80_tis_probe(enum tpm_family *family)
{ {
if (pc80_tis_probe(family)) if (pc80_tpm_probe(family))
return NULL; return NULL;
if (pc80_tis_open()) if (pc80_tis_open())

View File

@@ -0,0 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef DRIVERS_PC80_TPM_TPM_H
#define DRIVERS_PC80_TPM_TPM_H
#include <security/tpm/tis.h>
tis_sendrecv_fn pc80_tis_probe(enum tpm_family *family);
#endif /* DRIVERS_PC80_TPM_TPM_H */

View File

@@ -40,7 +40,7 @@ static tpm_result_t tpm_sendrecv(const uint8_t *sendbuf, size_t sbuf_size,
return TPM_SUCCESS; return TPM_SUCCESS;
} }
tis_sendrecv_fn tis_probe(enum tpm_family *family) tis_sendrecv_fn spi_tis_probe(enum tpm_family *family)
{ {
struct spi_slave spi; struct spi_slave spi;
struct tpm2_info info; struct tpm2_info info;

View File

@@ -4,6 +4,7 @@
#define __COREBOOT_SRC_DRIVERS_SPI_TPM_TPM_H #define __COREBOOT_SRC_DRIVERS_SPI_TPM_TPM_H
#include <drivers/tpm/cr50.h> #include <drivers/tpm/cr50.h>
#include <security/tpm/tis.h>
#include <security/tpm/tss_errors.h> #include <security/tpm/tss_errors.h>
#include <stddef.h> #include <stddef.h>
#include <spi-generic.h> #include <spi-generic.h>
@@ -44,4 +45,6 @@ size_t tpm2_process_command(const void *tpm2_command, size_t command_size,
/* Get information about previously initialized TPM device. */ /* Get information about previously initialized TPM device. */
void tpm2_get_info(struct tpm2_info *info); void tpm2_get_info(struct tpm2_info *info);
tis_sendrecv_fn spi_tis_probe(enum tpm_family *family);
#endif /* ! __COREBOOT_SRC_DRIVERS_SPI_TPM_TPM_H */ #endif /* ! __COREBOOT_SRC_DRIVERS_SPI_TPM_TPM_H */

View File

@@ -4,14 +4,9 @@ source "src/security/tpm/tss/vendor/cr50/Kconfig"
menu "Trusted Platform Module" menu "Trusted Platform Module"
choice
prompt "Trusted Platform Module"
default TPM2 if MAINBOARD_HAS_TPM2
default TPM1 if MAINBOARD_HAS_TPM1
default NO_TPM
config NO_TPM config NO_TPM
bool "No TPM" bool
default y if !TPM1 && !TPM2
help help
No TPM support. Select this option if your system doesn't have a TPM, No TPM support. Select this option if your system doesn't have a TPM,
or if you don't want coreboot to communicate with your TPM in any way. or if you don't want coreboot to communicate with your TPM in any way.
@@ -21,19 +16,17 @@ config NO_TPM
config TPM1 config TPM1
bool "TPM 1.2" bool "TPM 1.2"
depends on I2C_TPM || MEMORY_MAPPED_TPM || SPI_TPM || CRB_TPM depends on I2C_TPM || MEMORY_MAPPED_TPM || SPI_TPM || CRB_TPM
depends on !MAINBOARD_HAS_TPM2 default y if MAINBOARD_HAS_TPM1
help help
Select this option if your TPM uses the older TPM 1.2 protocol. Select this option if your TPM uses the older TPM 1.2 protocol.
config TPM2 config TPM2
bool "TPM 2.0" bool "TPM 2.0"
depends on I2C_TPM || MEMORY_MAPPED_TPM || SPI_TPM || CRB_TPM depends on I2C_TPM || MEMORY_MAPPED_TPM || SPI_TPM || CRB_TPM
depends on !MAINBOARD_HAS_TPM1 default y if MAINBOARD_HAS_TPM2
help help
Select this option if your TPM uses the newer TPM 2.0 protocol. Select this option if your TPM uses the newer TPM 2.0 protocol.
endchoice
config TPM config TPM
bool bool
default y default y
@@ -52,7 +45,7 @@ config MAINBOARD_HAS_TPM2
always uses the 2.0 protocol, and that it should be on by default. always uses the 2.0 protocol, and that it should be on by default.
config TPM_DEACTIVATE config TPM_DEACTIVATE
bool "Deactivate TPM" bool "Deactivate TPM (for TPM1)"
default n default n
depends on !VBOOT depends on !VBOOT
depends on TPM1 depends on TPM1
@@ -106,13 +99,13 @@ config TPM_LOG_CB
Custom coreboot-specific format of the log derived from TPM1 log format. Custom coreboot-specific format of the log derived from TPM1 log format.
config TPM_LOG_TPM1 config TPM_LOG_TPM1
bool "TPM 1.2 format" bool "TPM 1.2 format"
depends on TPM1 depends on TPM1 && !TPM2
help help
Log per TPM 1.2 specification. Log per TPM 1.2 specification.
See "TCG PC Client Specific Implementation Specification for Conventional BIOS". See "TCG PC Client Specific Implementation Specification for Conventional BIOS".
config TPM_LOG_TPM2 config TPM_LOG_TPM2
bool "TPM 2.0 format" bool "TPM 2.0 format"
depends on TPM2 depends on TPM1 || TPM2
help help
Log per TPM 2.0 specification. Log per TPM 2.0 specification.
See "TCG PC Client Platform Firmware Profile Specification". See "TCG PC Client Platform Firmware Profile Specification".

View File

@@ -54,8 +54,6 @@ typedef tpm_result_t (*tis_sendrecv_fn)(const u8 *sendbuf, size_t send_size, u8
size_t *recv_len); size_t *recv_len);
/* /*
* tis_probe()
*
* Probe for the TPM device and set it up for use within locality 0. * Probe for the TPM device and set it up for use within locality 0.
* *
* @family - pointer which is set to TPM family of the device * @family - pointer which is set to TPM family of the device
@@ -65,7 +63,7 @@ typedef tpm_result_t (*tis_sendrecv_fn)(const u8 *sendbuf, size_t send_size, u8
* Do not call this explicitly, it's meant to be used exclusively by TSS * Do not call this explicitly, it's meant to be used exclusively by TSS
* implementation (tlcl_lib_init() function to be specific). * implementation (tlcl_lib_init() function to be specific).
*/ */
tis_sendrecv_fn tis_probe(enum tpm_family *family); typedef tis_sendrecv_fn (*tis_probe_fn)(enum tpm_family *family);
/* /*
* tis_vendor_write() * tis_vendor_write()

View File

@@ -1,6 +1,10 @@
/* SPDX-License-Identifier: BSD-3-Clause */ /* SPDX-License-Identifier: BSD-3-Clause */
#include <console/console.h> #include <console/console.h>
#include <drivers/crb/tpm.h>
#include <drivers/i2c/tpm/tpm.h>
#include <drivers/pc80/tpm/tpm.h>
#include <drivers/spi/tpm/tpm.h>
#include <security/tpm/tis.h> #include <security/tpm/tis.h>
#include <security/tpm/tss.h> #include <security/tpm/tss.h>
@@ -24,13 +28,21 @@ tpm_result_t tlcl_lib_init(void)
/* Set right away to make recursion impossible. */ /* Set right away to make recursion impossible. */
init_done = true; init_done = true;
tlcl_tis_sendrecv = tis_probe(&tlcl_tpm_family); tlcl_tis_sendrecv = NULL;
if (CONFIG(CRB_TPM))
tlcl_tis_sendrecv = crb_tis_probe(&tlcl_tpm_family);
if (CONFIG(MEMORY_MAPPED_TPM) && tlcl_tis_sendrecv == NULL)
tlcl_tis_sendrecv = pc80_tis_probe(&tlcl_tpm_family);
if (CONFIG(I2C_TPM) && tlcl_tis_sendrecv == NULL)
tlcl_tis_sendrecv = i2c_tis_probe(&tlcl_tpm_family);
if (CONFIG(SPI_TPM) && tlcl_tis_sendrecv == NULL)
tlcl_tis_sendrecv = spi_tis_probe(&tlcl_tpm_family);
if (tlcl_tis_sendrecv == NULL) { if (tlcl_tis_sendrecv == NULL) {
printk(BIOS_ERR, "%s: tis_probe failed\n", __func__); printk(BIOS_ERR, "%s: TIS probe failed\n", __func__);
tlcl_tpm_family = TPM_UNKNOWN; tlcl_tpm_family = TPM_UNKNOWN;
} else if (tlcl_tpm_family != TPM_1 && tlcl_tpm_family != TPM_2) { } 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__, printk(BIOS_ERR, "%s: TIS probe returned incorrect TPM family: %d\n", __func__,
tlcl_tpm_family); tlcl_tpm_family);
tlcl_tpm_family = TPM_UNKNOWN; tlcl_tpm_family = TPM_UNKNOWN;
} }