Skip to content

Commit

Permalink
tpm: Export the open/close functions
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
sjg20 committed Nov 29, 2018
1 parent 07e127d commit 51f00c1
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 38 deletions.
47 changes: 27 additions & 20 deletions drivers/tpm/tpm_tis_lpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -388,13 +388,40 @@ 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);
struct tpm_locality *regs = priv->regs;
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);

Expand All @@ -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;
}

Expand Down
18 changes: 18 additions & 0 deletions include/tpm-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,24 @@ int do_##cmd(cmd_tbl_t *cmdtp, int flag, \
return report_return_code(cmd()); \
}

/**
* tpm_open() - Request access to locality 0 for the caller
*
* After all commands have been completed the caller is supposed to
* call tpm_close().
*
* Returns 0 on success, -ve on failure.
*/
int tpm_open(struct udevice *dev);

/**
* tpm_close() - Close the current session
*
* Releasing the locked locality. Returns 0 on success, -ve 1 on
* failure (in case lock removal did not succeed).
*/
int tpm_close(struct udevice *dev);

/**
* tpm_get_desc() - Get a text description of the TPM
*
Expand Down
18 changes: 0 additions & 18 deletions lib/tpm-utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,6 @@
#define tpm_u16(x) __MSB(x), __LSB(x)
#define tpm_u32(x) tpm_u16((x) >> 16), tpm_u16((x) & 0xFFFF)

/**
* tpm_open() - Request access to locality 0 for the caller
*
* After all commands have been completed the caller is supposed to
* call tpm_close().
*
* Returns 0 on success, -ve on failure.
*/
int tpm_open(struct udevice *dev);

/**
* tpm_close() - Close the current session
*
* Releasing the locked locality. Returns 0 on success, -ve 1 on
* failure (in case lock removal did not succeed).
*/
int tpm_close(struct udevice *dev);

/**
* Pack data into a byte string. The data types are specified in
* the format string: 'b' means unsigned byte, 'w' unsigned word,
Expand Down

0 comments on commit 51f00c1

Please sign in to comment.