BACKPORT: TPM: Retry SaveState command in suspend path
[cascardo/linux.git] / drivers / char / tpm / tpm.h
index b1c5280..3266aa0 100644 (file)
 #include <linux/io.h>
 #include <linux/tpm.h>
 
+#define TPM_RETRY      70      /* 7 seconds */
+
 enum tpm_timeout {
        TPM_TIMEOUT = 5,        /* msecs */
+       TPM_TIMEOUT_RETRY = 100 /* msecs */
 };
 
 /* TPM addresses */
@@ -38,6 +41,7 @@ enum tpm_addr {
        TPM_ADDR = 0x4E,
 };
 
+#define TPM_WARN_RETRY         0x800
 #define TPM_WARN_DOING_SELFTEST 0x802
 #define TPM_ERR_DEACTIVATED     0x6
 #define TPM_ERR_DISABLED        0x7
@@ -113,6 +117,9 @@ struct tpm_chip {
        atomic_t data_pending;
        struct mutex buffer_mutex;
 
+       int needs_resume;
+       struct mutex resume_mutex;
+
        struct timer_list user_read_timer;      /* user needs to claim result */
        struct work_struct work;
        struct mutex tpm_mutex; /* tpm is processing */
@@ -277,6 +284,7 @@ typedef union {
        struct  tpm_pcrread_in  pcrread_in;
        struct  tpm_pcrread_out pcrread_out;
        struct  tpm_pcrextend_in pcrextend_in;
+       u16     tpm_startup_arg_in;
 } tpm_cmd_params;
 
 struct tpm_cmd_t {
@@ -289,6 +297,7 @@ ssize_t     tpm_getcap(struct device *, __be32, cap_t *, const char *);
 extern int tpm_get_timeouts(struct tpm_chip *);
 extern void tpm_gen_interrupt(struct tpm_chip *);
 extern int tpm_do_selftest(struct tpm_chip *);
+extern void tpm_continue_selftest_nocheck(struct tpm_chip *chip);
 extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
 extern struct tpm_chip* tpm_register_hardware(struct device *,
                                 const struct tpm_vendor_specific *);
@@ -301,6 +310,9 @@ extern ssize_t tpm_read(struct file *, char __user *, size_t, loff_t *);
 extern void tpm_remove_hardware(struct device *);
 extern int tpm_pm_suspend(struct device *, pm_message_t);
 extern int tpm_pm_resume(struct device *);
+extern ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
+                               int len, const char *desc);
+
 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
                             wait_queue_head_t *);
 #ifdef CONFIG_ACPI