Skip to contentSkip to conversation

tpm_tis: Use timeouts returned from TPM

PATCH Superseded Stefan Berger 3 participants 4 messages Jan 11, 2011 – Feb 8, 2011 TPM device driver

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

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
index 1f46f1c..ef9ca1e 100644
@@ -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
index 72ddb03..d84ff77 100644
@@ -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
index c17a305..3e1f2bb 100644
@@ -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 = {
Tested-by on v1 1/1
#1 lore raw
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
#2 lore raw

[ + 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_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:

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
#3 lore raw
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:

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