summaryrefslogtreecommitdiff
path: root/drivers/tpm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tpm')
-rw-r--r--drivers/tpm/tpm_tis_lpc.c47
-rw-r--r--drivers/tpm/tpm_tis_sandbox.c6
2 files changed, 33 insertions, 20 deletions
diff --git a/drivers/tpm/tpm_tis_lpc.c b/drivers/tpm/tpm_tis_lpc.c
index e993fd9f833..30194bce078 100644
--- a/drivers/tpm/tpm_tis_lpc.c
+++ b/drivers/tpm/tpm_tis_lpc.c
@@ -388,6 +388,27 @@ static int tis_readresponse(struct udevice *dev, u8 *buffer, size_t len)
return offset;
}
+static int tpm_tis_lpc_close(struct udevice *dev)
+{
+ struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
+ struct tpm_locality *regs = priv->regs;
+ u8 locality = 0;
+
+ if (tpm_read_word(priv, &regs[locality].access) &
+ TIS_ACCESS_ACTIVE_LOCALITY) {
+ tpm_write_word(priv, TIS_ACCESS_ACTIVE_LOCALITY,
+ &regs[locality].access);
+
+ if (tis_wait_reg(priv, &regs[locality].access,
+ TIS_ACCESS_ACTIVE_LOCALITY, 0) == -ETIMEDOUT) {
+ printf("%s:%d - failed to release locality %d\n",
+ __FILE__, __LINE__, locality);
+ return -ETIMEDOUT;
+ }
+ }
+ return 0;
+}
+
static int tpm_tis_lpc_open(struct udevice *dev)
{
struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
@@ -395,6 +416,12 @@ static int tpm_tis_lpc_open(struct udevice *dev)
u8 locality = 0; /* we use locality zero for everything. */
int ret;
+ ret = tpm_tis_lpc_close(dev);
+ if (ret) {
+ printf("%s: Failed to close TPM\n", __func__);
+ return ret;
+ }
+
/* now request access to locality. */
tpm_write_word(priv, TIS_ACCESS_REQUEST_USE, &regs[locality].access);
@@ -410,27 +437,7 @@ static int tpm_tis_lpc_open(struct udevice *dev)
tpm_write_word(priv, TIS_STS_COMMAND_READY,
&regs[locality].tpm_status);
- return 0;
-}
-
-static int tpm_tis_lpc_close(struct udevice *dev)
-{
- struct tpm_tis_lpc_priv *priv = dev_get_priv(dev);
- struct tpm_locality *regs = priv->regs;
- u8 locality = 0;
-
- if (tpm_read_word(priv, &regs[locality].access) &
- TIS_ACCESS_ACTIVE_LOCALITY) {
- tpm_write_word(priv, TIS_ACCESS_ACTIVE_LOCALITY,
- &regs[locality].access);
- if (tis_wait_reg(priv, &regs[locality].access,
- TIS_ACCESS_ACTIVE_LOCALITY, 0) == -ETIMEDOUT) {
- printf("%s:%d - failed to release locality %d\n",
- __FILE__, __LINE__, locality);
- return -ETIMEDOUT;
- }
- }
return 0;
}
diff --git a/drivers/tpm/tpm_tis_sandbox.c b/drivers/tpm/tpm_tis_sandbox.c
index 79517f015af..3336f559e57 100644
--- a/drivers/tpm/tpm_tis_sandbox.c
+++ b/drivers/tpm/tpm_tis_sandbox.c
@@ -187,9 +187,11 @@ static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,
code = get_unaligned_be32(sendbuf + sizeof(uint16_t) +
sizeof(uint32_t));
+#ifdef DEBUG
printf("tpm: %zd bytes, recv_len %zd, cmd = %x\n", send_size,
*recv_len, code);
print_buffer(0, sendbuf, 1, send_size, 0);
+#endif
switch (code) {
case TPM_CMD_GET_CAPABILITY:
type = get_unaligned_be32(sendbuf + 14);
@@ -306,6 +308,10 @@ static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,
printf("Unknown tpm command %02x\n", code);
return -ENOSYS;
}
+#ifdef DEBUG
+ printf("tpm: rx recv_len %zd\n", *recv_len);
+ print_buffer(0, recvbuf, 1, *recv_len, 0);
+#endif
return 0;
}