summaryrefslogtreecommitdiff
path: root/drivers/tpm
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2018-11-18 14:22:26 -0700
committerSimon Glass <sjg@chromium.org>2018-11-29 09:30:06 -0700
commit51f00c1704e505f51a02a3687e4384231ce8ae20 (patch)
tree019ad60bed1d06aef4b527daa3b206e1491a9381 /drivers/tpm
parent07e127d85d9f22ac93f1e9da41a985013c4002ed (diff)
tpm: Export the open/close functions
At present these functions are not accessible outside the TPM library, but in some cases we need to call them. Export them in the header file and add a define for the SHA1 digest size. Also adjust tpm_open() to call tpm_close() first so that the TPM is in a known state before opening (e.g. by a previous phase of U-Boot). Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/tpm')
-rw-r--r--drivers/tpm/tpm_tis_lpc.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/drivers/tpm/tpm_tis_lpc.c b/drivers/tpm/tpm_tis_lpc.c
index e993fd9f83..30194bce07 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;
}