[SeaBIOS] [PATCH 05/10] tpm: Move TPM hardware functions from tcgbios.c to hw/tpm_drivers.c
Kevin O'Connor
kevin at koconnor.net
Wed Dec 30 01:17:45 CET 2015
Move the hardware interface functions (tpmhw_probe, tpmhw_transmit,
and tpmhw_set_timeouts) to tpm_drivers.c code, and only export those
functions. This simplifies the hardware interface.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/hw/tpm_drivers.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/hw/tpm_drivers.h | 28 ++++--------------
src/tcgbios.c | 75 ++++------------------------------------------
3 files changed, 95 insertions(+), 92 deletions(-)
diff --git a/src/hw/tpm_drivers.c b/src/hw/tpm_drivers.c
index 0932797..dc09779 100644
--- a/src/hw/tpm_drivers.c
+++ b/src/hw/tpm_drivers.c
@@ -7,6 +7,7 @@
//
// This file may be distributed under the terms of the GNU LGPLv3 license.
+#include "byteorder.h" // be32_to_cpu
#include "config.h" // CONFIG_TPM_TIS_SHA1THRESHOLD
#include "hw/tpm_drivers.h" // struct tpm_driver
#include "std/tcg.h" // TCG_NO_RESPONSE
@@ -16,6 +17,28 @@
#include "util.h" // timer_calc_usec
#include "x86.h" // readl
+/* low level driver implementation */
+struct tpm_driver {
+ u32 *timeouts;
+ u32 *durations;
+ void (*set_timeouts)(u32 timeouts[4], u32 durations[3]);
+ u32 (*probe)(void);
+ u32 (*init)(void);
+ u32 (*activate)(u8 locty);
+ u32 (*ready)(void);
+ u32 (*senddata)(const u8 *const data, u32 len);
+ u32 (*readresp)(u8 *buffer, u32 *len);
+ u32 (*waitdatavalid)(void);
+ u32 (*waitrespready)(enum tpmDurationType to_t);
+};
+
+extern struct tpm_driver tpm_drivers[];
+
+#define TIS_DRIVER_IDX 0
+#define TPM_NUM_DRIVERS 1
+
+#define TPM_INVALID_DRIVER 0xf
+
static const u32 tis_default_timeouts[4] = {
TIS_DEFAULT_TIMEOUT_A,
TIS_DEFAULT_TIMEOUT_B,
@@ -297,3 +320,64 @@ struct tpm_driver tpm_drivers[TPM_NUM_DRIVERS] = {
.waitrespready = tis_waitrespready,
},
};
+
+static u8 TPMHW_driver_to_use = TPM_INVALID_DRIVER;
+
+int
+tpmhw_probe(void)
+{
+ unsigned int i;
+ for (i = 0; i < TPM_NUM_DRIVERS; i++) {
+ struct tpm_driver *td = &tpm_drivers[i];
+ if (td->probe() != 0) {
+ td->init();
+ TPMHW_driver_to_use = i;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+u32
+tpmhw_transmit(u8 locty, struct tpm_req_header *req,
+ void *respbuffer, u32 *respbufferlen,
+ enum tpmDurationType to_t)
+{
+ if (TPMHW_driver_to_use == TPM_INVALID_DRIVER)
+ return TCG_FATAL_COM_ERROR;
+
+ struct tpm_driver *td = &tpm_drivers[TPMHW_driver_to_use];
+
+ u32 irc = td->activate(locty);
+ if (irc != 0) {
+ /* tpm could not be activated */
+ return TCG_FATAL_COM_ERROR;
+ }
+
+ irc = td->senddata((void*)req, be32_to_cpu(req->totlen));
+ if (irc != 0)
+ return TCG_FATAL_COM_ERROR;
+
+ irc = td->waitdatavalid();
+ if (irc != 0)
+ return TCG_FATAL_COM_ERROR;
+
+ irc = td->waitrespready(to_t);
+ if (irc != 0)
+ return TCG_FATAL_COM_ERROR;
+
+ irc = td->readresp(respbuffer, respbufferlen);
+ if (irc != 0)
+ return TCG_FATAL_COM_ERROR;
+
+ td->ready();
+
+ return 0;
+}
+
+void
+tpmhw_set_timeouts(u32 timeouts[4], u32 durations[3])
+{
+ struct tpm_driver *td = &tpm_drivers[TPMHW_driver_to_use];
+ td->set_timeouts(timeouts, durations);
+}
diff --git a/src/hw/tpm_drivers.h b/src/hw/tpm_drivers.h
index ec50cca..afa3027 100644
--- a/src/hw/tpm_drivers.h
+++ b/src/hw/tpm_drivers.h
@@ -10,28 +10,12 @@ enum tpmDurationType {
TPM_DURATION_TYPE_LONG,
};
-/* low level driver implementation */
-struct tpm_driver {
- u32 *timeouts;
- u32 *durations;
- void (*set_timeouts)(u32 timeouts[4], u32 durations[3]);
- u32 (*probe)(void);
- u32 (*init)(void);
- u32 (*activate)(u8 locty);
- u32 (*ready)(void);
- u32 (*senddata)(const u8 *const data, u32 len);
- u32 (*readresp)(u8 *buffer, u32 *len);
- u32 (*waitdatavalid)(void);
- u32 (*waitrespready)(enum tpmDurationType to_t);
-};
-
-extern struct tpm_driver tpm_drivers[];
-
-
-#define TIS_DRIVER_IDX 0
-#define TPM_NUM_DRIVERS 1
-
-#define TPM_INVALID_DRIVER 0xf
+int tpmhw_probe(void);
+struct tpm_req_header;
+u32 tpmhw_transmit(u8 locty, struct tpm_req_header *req,
+ void *respbuffer, u32 *respbufferlen,
+ enum tpmDurationType to_t);
+void tpmhw_set_timeouts(u32 timeouts[4], u32 durations[3]);
/* TIS driver */
/* address of locality 0 (TIS) */
diff --git a/src/tcgbios.c b/src/tcgbios.c
index b680c1d..e1399ee 100644
--- a/src/tcgbios.c
+++ b/src/tcgbios.c
@@ -98,72 +98,6 @@ is_preboot_if_shutdown(void)
/****************************************************************
- * TPM hardware interface
- ****************************************************************/
-
-static u8 TPMHW_driver_to_use = TPM_INVALID_DRIVER;
-
-static int
-tpmhw_probe(void)
-{
- unsigned int i;
- for (i = 0; i < TPM_NUM_DRIVERS; i++) {
- struct tpm_driver *td = &tpm_drivers[i];
- if (td->probe() != 0) {
- td->init();
- TPMHW_driver_to_use = i;
- return 0;
- }
- }
- return -1;
-}
-
-static u32
-transmit(u8 locty, struct tpm_req_header *req,
- void *respbuffer, u32 *respbufferlen,
- enum tpmDurationType to_t)
-{
- if (TPMHW_driver_to_use == TPM_INVALID_DRIVER)
- return TCG_FATAL_COM_ERROR;
-
- struct tpm_driver *td = &tpm_drivers[TPMHW_driver_to_use];
-
- u32 irc = td->activate(locty);
- if (irc != 0) {
- /* tpm could not be activated */
- return TCG_FATAL_COM_ERROR;
- }
-
- irc = td->senddata((void*)req, be32_to_cpu(req->totlen));
- if (irc != 0)
- return TCG_FATAL_COM_ERROR;
-
- irc = td->waitdatavalid();
- if (irc != 0)
- return TCG_FATAL_COM_ERROR;
-
- irc = td->waitrespready(to_t);
- if (irc != 0)
- return TCG_FATAL_COM_ERROR;
-
- irc = td->readresp(respbuffer, respbufferlen);
- if (irc != 0)
- return TCG_FATAL_COM_ERROR;
-
- td->ready();
-
- return 0;
-}
-
-static void
-tpmhw_set_timeouts(u32 timeouts[4], u32 durations[3])
-{
- struct tpm_driver *td = &tpm_drivers[TPMHW_driver_to_use];
- td->set_timeouts(timeouts, durations);
-}
-
-
-/****************************************************************
* ACPI TCPA table interface
****************************************************************/
@@ -340,7 +274,7 @@ build_and_send_cmd(u8 locty, u32 ordinal, const u8 *append, u32 append_size,
if (append_size)
memcpy(req.cmd, append, append_size);
- u32 rc = transmit(locty, &req.trqh, obuffer, &obuffer_len, to_t);
+ u32 rc = tpmhw_transmit(locty, &req.trqh, obuffer, &obuffer_len, to_t);
if (rc)
return rc;
@@ -459,7 +393,8 @@ tpm_log_extend_event(struct pcpes *pcpes, const void *event)
struct tpm_rsp_extend rsp;
u32 resp_length = sizeof(rsp);
- u32 rc = transmit(0, &tre.hdr, &rsp, &resp_length, TPM_DURATION_TYPE_SHORT);
+ u32 rc = tpmhw_transmit(0, &tre.hdr, &rsp, &resp_length,
+ TPM_DURATION_TYPE_SHORT);
if (rc || resp_length != sizeof(rsp)) {
tpm_set_failure();
return rc;
@@ -931,8 +866,8 @@ pass_through_to_tpm_int(struct pttti *pttti, struct pttto *pttto)
}
u32 resbuflen = pttti->opblength - offsetof(struct pttto, tpmopout);
- rc = transmit(0, trh, pttto->tpmopout, &resbuflen,
- TPM_DURATION_TYPE_LONG /* worst case */);
+ rc = tpmhw_transmit(0, trh, pttto->tpmopout, &resbuflen,
+ TPM_DURATION_TYPE_LONG /* worst case */);
if (rc)
goto err_exit;
--
2.5.0
More information about the SeaBIOS
mailing list