tpm_tis: Use timeouts returned from TPM
PATCH 1/1 tpm_tis: Use timeouts returned from TPM
The current TPM TIS driver in git discards the timeout values returned from the TPM. The check of the response packet needs to consider that the return_code field is 0 on success and the size of the expected packet is equivalent to the header size + u32 length indicator for the TPM_GetCapability() result + 3 timeout indicators of type u32.
I am also adding a sysfs entry 'timeouts' showing the timeouts that are being used.
drivers/char/tpm/tpm.c +16 -2
@@ -575,9 +575,11 @@ duration:if (rc)return ; -if (be32_to_cpu (tpm_cmd.header.out.return_code) - !=3 *sizeof (u32)) +if (be32_to_cpu (tpm_cmd.header.out.return_code) !=0 || +be32_to_cpu (tpm_cmd.header.out.length) + !=sizeof (tpm_cmd.header.out) +sizeof (u32) +3 *sizeof (u32))return ; + duration_cap = &tpm_cmd.params.getcap_out.cap.duration; chip->vendor.duration[TPM_SHORT ] =usecs_to_jiffies (be32_to_cpu (duration_cap->tpm_short));
@@ -937,6 +939,18 @@ ssize_t tpm_show_caps_1_2(struct device * dev, }EXPORT_SYMBOL_GPL (tpm_show_caps_1_2); +ssize_t tpm_show_timeouts (struct device *dev,struct device_attribute *attr, +char *buf) +{ +struct tpm_chip *chip =dev_get_drvdata (dev); + +return sprintf (buf,"%d %d %d\n" , +jiffies_to_usecs (chip->vendor.duration[TPM_SHORT ]), +jiffies_to_usecs (chip->vendor.duration[TPM_MEDIUM ]), +jiffies_to_usecs (chip->vendor.duration[TPM_LONG ])); +} +EXPORT_SYMBOL_GPL (tpm_show_timeouts); +ssize_t tpm_store_cancel (struct device *dev,struct device_attribute *attr,const char *buf,size_t count) {
drivers/char/tpm/tpm.h +2 -0
@@ -56,6 +56,8 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr, char *);extern ssize_t tpm_show_temp_deactivated (struct device *,struct device_attribute *attr,char *); +extern ssize_t tpm_show_timeouts (struct device *, +struct device_attribute *attr,char *);struct tpm_chip ;
drivers/char/tpm/tpm_tis.c +3 -1
@@ -376,6 +376,7 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated, NULL); static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL); static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); +static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);static struct attribute *tis_attrs[] = { &dev_attr_pubek.attr,
@@ -385,7 +386,8 @@ static struct attribute *tis_attrs[] = { &dev_attr_owned.attr, &dev_attr_temp_deactivated.attr, &dev_attr_caps.attr, - &dev_attr_cancel.attr, NULL, + &dev_attr_cancel.attr, + &dev_attr_timeouts.attr, NULL, }; static struct attribute_group tis_attr_grp = {
Quoted 2 lines · Stefan Berger
The current TPM TIS driver in git discards the timeout values returned from the TPM.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c4ff4b829ef9e6353c0b133b7adb564a68054979
broke the TPM for me on a thinkpad T410. When using the TPM, dmesg complains:
[ 65.728310] tpm_tis 00:0b: Operation Timed out [ 67.651450] tpm_tis 00:0b: Operation Timed out [ 69.669421] tpm_tis 00:0b: Operation Timed out
This patch fixes it, so consider it:
Thanks!
Signature · 1 line
Guillaume
[ + jmorris ]
Quoted 9 lines · Guillaume Chazarain
Quoted 2 lines · Stefan Berger
The current TPM TIS driver in git discards the timeout values returned from the TPM.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c4ff4b829ef9e6353c0b133b7adb564a68054979
broke the TPM for me on a thinkpad T410. When using the TPM, dmesg complains:
Quoted 7 lines
[ 65.728310]
tpm_tis00:0b: Operation Timed out
[ 67.651450]tpm_tis00:0b: Operation Timed out
[ 69.669421]tpm_tis00:0b: Operation Timed outThis patch fixes it, so consider it:
Tested-by Guillaume Chazarain <[email protected]>
This patch (https://lkml.org/lkml/2011/1/11/341) fixes a regression introduced in 2.6.38-rc3, any chance of having it merged?
Thanks.
Signature · 1 line
Guillaume
Quoted 15 lines · Guillaume Chazarain
[ + jmorris ]
Quoted 12 lines · Guillaume Chazarain
Quoted 2 lines · Stefan Berger
The current TPM TIS driver in git discards the timeout values returned from the TPM.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c4ff4b829ef9e6353c0b133b7adb564a68054979
broke the TPM for me on a thinkpad T410. When using the TPM, dmesg complains:[ 65.728310] tpm_tis 00:0b: Operation Timed out [ 67.651450] tpm_tis 00:0b: Operation Timed out [ 69.669421] tpm_tis 00:0b: Operation Timed out
Quoted 7 lines
Quoted 3 lines
This patch fixes it, so consider it:
Tested-by Guillaume Chazarain<[email protected]>This patch (https://lkml.org/lkml/2011/1/11/341) fixes a regression introduced in 2.6.38-rc3, any chance of having it merged?
Thanks.
This patch solves a bug existent before the commit that made into 2.6.38-rc3. Prior to such commit, the device driver was using default values that were big enough to allow TPM commands to succeed, but that stalled the kernel for too long during boot (2 minutes for each command sent) when buggy TPMs don't respond.
I'll apply this patch to my tree, and ask James to pull from it.
Rajiv