mirror of
https://github.com/linux-sunxi/u-boot-sunxi.git
synced 2024-02-12 11:16:03 +08:00
dm: tpm: Convert the TPM command and library to driver model
Add driver model support to the TPM command and the TPM library. Both support only a single TPM at present. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Christophe Ricard<christophe-h.ricard@st.com> Reviewed-by: Heiko Schocher <hs@denx.de>
This commit is contained in:
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <tpm.h>
|
#include <tpm.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
@ -438,6 +439,21 @@ TPM_COMMAND_NO_ARG(tpm_force_clear)
|
|||||||
TPM_COMMAND_NO_ARG(tpm_physical_enable)
|
TPM_COMMAND_NO_ARG(tpm_physical_enable)
|
||||||
TPM_COMMAND_NO_ARG(tpm_physical_disable)
|
TPM_COMMAND_NO_ARG(tpm_physical_disable)
|
||||||
|
|
||||||
|
#ifdef CONFIG_DM_TPM
|
||||||
|
static int get_tpm(struct udevice **devp)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = uclass_first_device(UCLASS_TPM, devp);
|
||||||
|
if (rc) {
|
||||||
|
printf("Could not find TPM (ret=%d)\n", rc);
|
||||||
|
return CMD_RET_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag,
|
static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag,
|
||||||
int argc, char * const argv[])
|
int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
@ -452,7 +468,17 @@ static int do_tpm_raw_transfer(cmd_tbl_t *cmdtp, int flag,
|
|||||||
return CMD_RET_FAILURE;
|
return CMD_RET_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_DM_TPM
|
||||||
|
struct udevice *dev;
|
||||||
|
|
||||||
|
rc = get_tpm(&dev);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = tpm_xfer(dev, command, count, response, &response_length);
|
||||||
|
#else
|
||||||
rc = tis_sendrecv(command, count, response, &response_length);
|
rc = tis_sendrecv(command, count, response, &response_length);
|
||||||
|
#endif
|
||||||
free(command);
|
free(command);
|
||||||
if (!rc) {
|
if (!rc) {
|
||||||
puts("tpm response:\n");
|
puts("tpm response:\n");
|
||||||
|
@ -349,7 +349,7 @@ int tpm_xfer(struct udevice *dev, const uint8_t *sendbuf, size_t send_size,
|
|||||||
*
|
*
|
||||||
* @return 0 on success, non-0 on error.
|
* @return 0 on success, non-0 on error.
|
||||||
*/
|
*/
|
||||||
uint32_t tpm_init(void);
|
int tpm_init(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Issue a TPM_Startup command.
|
* Issue a TPM_Startup command.
|
||||||
|
31
lib/tpm.c
31
lib/tpm.c
@ -6,10 +6,11 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <stdarg.h>
|
#include <dm.h>
|
||||||
#include <u-boot/sha1.h>
|
#include <tis.h>
|
||||||
#include <tpm.h>
|
#include <tpm.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <u-boot/sha1.h>
|
||||||
|
|
||||||
/* Internal error of TPM command library */
|
/* Internal error of TPM command library */
|
||||||
#define TPM_LIB_ERROR ((uint32_t)~0u)
|
#define TPM_LIB_ERROR ((uint32_t)~0u)
|
||||||
@ -240,9 +241,20 @@ static uint32_t tpm_sendrecv_command(const void *command,
|
|||||||
response = response_buffer;
|
response = response_buffer;
|
||||||
response_length = sizeof(response_buffer);
|
response_length = sizeof(response_buffer);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_DM_TPM
|
||||||
|
struct udevice *dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = uclass_first_device(UCLASS_TPM, &dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
err = tpm_xfer(dev, command, tpm_command_size(command),
|
||||||
|
response, &response_length);
|
||||||
|
#else
|
||||||
err = tis_sendrecv(command, tpm_command_size(command),
|
err = tis_sendrecv(command, tpm_command_size(command),
|
||||||
response, &response_length);
|
response, &response_length);
|
||||||
if (err)
|
#endif
|
||||||
|
if (err < 0)
|
||||||
return TPM_LIB_ERROR;
|
return TPM_LIB_ERROR;
|
||||||
if (size_ptr)
|
if (size_ptr)
|
||||||
*size_ptr = response_length;
|
*size_ptr = response_length;
|
||||||
@ -250,15 +262,24 @@ static uint32_t tpm_sendrecv_command(const void *command,
|
|||||||
return tpm_return_code(response);
|
return tpm_return_code(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t tpm_init(void)
|
int tpm_init(void)
|
||||||
{
|
{
|
||||||
uint32_t err;
|
int err;
|
||||||
|
|
||||||
|
#ifdef CONFIG_DM_TPM
|
||||||
|
struct udevice *dev;
|
||||||
|
|
||||||
|
err = uclass_first_device(UCLASS_TPM, &dev);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
return tpm_open(dev);
|
||||||
|
#else
|
||||||
err = tis_init();
|
err = tis_init();
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
return tis_open();
|
return tis_open();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t tpm_startup(enum tpm_startup_type mode)
|
uint32_t tpm_startup(enum tpm_startup_type mode)
|
||||||
|
Reference in New Issue
Block a user