colibri_imx6: fix video stdout in default environment
[oweals/u-boot.git] / include / tpm-common.h
index 734c2c9d5398acf75939dfefc5f9ec5e7c42b87d..e29b10b1766e1cc14c977f7f298def14f354981a 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef __TPM_COMMON_H
 #define __TPM_COMMON_H
 
+#include <command.h>
+
 enum tpm_duration {
        TPM_SHORT = 0,
        TPM_MEDIUM = 1,
@@ -26,6 +28,18 @@ enum tpm_duration {
 /* Max buffer size supported by our tpm */
 #define TPM_DEV_BUFSIZE                1260
 
+#define TPM_PCR_MINIMUM_DIGEST_SIZE 20
+
+/**
+ * enum tpm_version - The version of the TPM stack to be used
+ * @TPM_V1:            Use TPM v1.x stack
+ * @TPM_V2:            Use TPM v2.x stack
+ */
+enum tpm_version {
+       TPM_V1 = 0,
+       TPM_V2,
+};
+
 /**
  * struct tpm_chip_priv - Information about a TPM, stored by the uclass
  *
@@ -33,20 +47,23 @@ enum tpm_duration {
  * communcation is attempted. If the device has an xfer() method, this is
  * not needed. There is no need to set up @buf.
  *
+ * @version:           TPM stack to be used
  * @duration_ms:       Length of each duration type in milliseconds
  * @retry_time_ms:     Time to wait before retrying receive
+ * @buf:               Buffer used during the exchanges with the chip
  * @pcr_count:         Number of PCR per bank
  * @pcr_select_min:    Minimum size in bytes of the pcrSelect array
- * @buf:               Buffer used during the exchanges with the chip
  */
 struct tpm_chip_priv {
+       enum tpm_version version;
+
        uint duration_ms[TPM_DURATION_COUNT];
        uint retry_time_ms;
-#if defined(CONFIG_TPM_V2)
+       u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)];  /* Max buffer size + addr */
+
+       /* TPM v2 specific data */
        uint pcr_count;
        uint pcr_select_min;
-#endif
-       u8 buf[TPM_DEV_BUFSIZE + sizeof(u8)];  /* Max buffer size + addr */
 };
 
 /**
@@ -71,7 +88,7 @@ struct tpm_ops {
         * After all commands have been completed the caller should call
         * close().
         *
-        * @dev:        Device to close
+        * @dev:        Device to open
         * @return 0 ok OK, -ve on error
         */
        int (*open)(struct udevice *dev);
@@ -158,14 +175,50 @@ struct tpm_ops {
        U_BOOT_CMD_MKENT(cmd, 0, 1, do_tpm_ ## cmd, "", "")
 
 #define TPM_COMMAND_NO_ARG(cmd)                                \
-int do_##cmd(cmd_tbl_t *cmdtp, int flag,               \
-            int argc, char * const argv[])             \
+int do_##cmd(struct cmd_tbl *cmdtp, int flag,          \
+            int argc, char *const argv[])              \
 {                                                      \
+       struct udevice *dev;                            \
+       int rc;                                         \
+                                                       \
+       rc = get_tpm(&dev);                             \
+       if (rc)                                         \
+               return rc;                              \
        if (argc != 1)                                  \
                return CMD_RET_USAGE;                   \
-       return report_return_code(cmd());               \
+       return report_return_code(cmd(dev));            \
 }
 
+/**
+ * tpm_open() - Request access to locality 0 for the caller
+ *
+ * After all commands have been completed the caller is supposed to
+ * call tpm_close().
+ *
+ * @dev - TPM device
+ * 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).
+ *
+ * @dev - TPM device
+ * Returns 0 on success, -ve on failure.
+ */
+int tpm_close(struct udevice *dev);
+
+/**
+ * tpm_clear_and_reenable() - Force clear the TPM and reenable it
+ *
+ * @dev: TPM device
+ * @return 0 on success, -ve on failure
+ */
+u32 tpm_clear_and_reenable(struct udevice *dev);
+
 /**
  * tpm_get_desc() - Get a text description of the TPM
  *
@@ -189,6 +242,7 @@ int tpm_get_desc(struct udevice *dev, char *buf, int size);
  * Note that the outgoing data is inspected to determine command type
  * (ordinal) and a timeout is used for that command type.
  *
+ * @dev - TPM device
  * @sendbuf - buffer of the data to send
  * @send_size size of the data to send
  * @recvbuf - memory to save the response to
@@ -203,15 +257,45 @@ int tpm_xfer(struct udevice *dev, const u8 *sendbuf, size_t send_size,
 /**
  * Initialize TPM device.  It must be called before any TPM commands.
  *
+ * @dev - TPM device
  * @return 0 on success, non-0 on error.
  */
-int tpm_init(void);
+int tpm_init(struct udevice *dev);
+
+/**
+ * Retrieve the array containing all the v1 (resp. v2) commands.
+ *
+ * @return a struct cmd_tbl array.
+ */
+#if defined(CONFIG_TPM_V1)
+struct cmd_tbl *get_tpm1_commands(unsigned int *size);
+#else
+static inline struct cmd_tbl *get_tpm1_commands(unsigned int *size)
+{
+       return NULL;
+}
+#endif
+#if defined(CONFIG_TPM_V2)
+struct cmd_tbl *get_tpm2_commands(unsigned int *size);
+#else
+static inline struct cmd_tbl *get_tpm2_commands(unsigned int *size)
+{
+       return NULL;
+}
+#endif
 
 /**
- * Retrieve the array containing all the commands.
+ * tpm_get_version() - Find the version of a TPM
  *
- * @return a cmd_tbl_t array.
+ * This checks the uclass data for a TPM device and returns the version number
+ * it supports.
+ *
+ * @dev: TPM device
+ * @return version number (TPM_V1 or TPMV2)
  */
-cmd_tbl_t *get_tpm_commands(unsigned int *size);
+enum tpm_version tpm_get_version(struct udevice *dev);
+
+/* Iterate on all TPM devices */
+#define for_each_tpm_device(dev) uclass_foreach_dev_probe(UCLASS_TPM, (dev))
 
 #endif /* __TPM_COMMON_H */