
Hi Simon,
This one looks good to me. Actually, i think atmel driver is trivial to move to driver model following the current TPM class. I would assume this will be changed very soon.
Acked-by: Christophe Ricardchristophe-h.ricard@st.com
Best Regards Christophe
On 23/08/2015 02:31, Simon Glass wrote:
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
Changes in v2:
Correct error checking code in tpm_sendrecv_command()
Use tpm_ prefix instead of tis_ for TPM functions
common/cmd_tpm.c | 26 ++++++++++++++++++++++++++ include/tpm.h | 2 +- lib/tpm.c | 31 ++++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 6 deletions(-)
diff --git a/common/cmd_tpm.c b/common/cmd_tpm.c index 0294952..bad2006 100644 --- a/common/cmd_tpm.c +++ b/common/cmd_tpm.c @@ -6,6 +6,7 @@
#include <common.h> #include <command.h> +#include <dm.h> #include <malloc.h> #include <tpm.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_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, 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; }
+#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); +#endif free(command); if (!rc) { puts("tpm response:\n"); diff --git a/include/tpm.h b/include/tpm.h index e4472d3..445952b 100644 --- a/include/tpm.h +++ b/include/tpm.h @@ -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.
*/ -uint32_t tpm_init(void); +int tpm_init(void);
/**
- Issue a TPM_Startup command.
diff --git a/lib/tpm.c b/lib/tpm.c index d9789b0..19bf0b5 100644 --- a/lib/tpm.c +++ b/lib/tpm.c @@ -6,10 +6,11 @@ */
#include <common.h> -#include <stdarg.h> -#include <u-boot/sha1.h> +#include <dm.h> +#include <tis.h> #include <tpm.h> #include <asm/unaligned.h> +#include <u-boot/sha1.h>
/* Internal error of TPM command library */ #define TPM_LIB_ERROR ((uint32_t)~0u) @@ -240,9 +241,20 @@ static uint32_t tpm_sendrecv_command(const void *command, response = 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), response, &response_length);
- if (err)
+#endif
- if (err < 0) return TPM_LIB_ERROR; if (size_ptr) *size_ptr = response_length;
@@ -250,15 +262,24 @@ static uint32_t tpm_sendrecv_command(const void *command, 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(); if (err) return err;
return tis_open(); +#endif }
uint32_t tpm_startup(enum tpm_startup_type mode)