Commit 44489516 authored by Stefan Berger's avatar Stefan Berger Committed by Greg Kroah-Hartman

tpm_tis: Use timeouts returned from TPM

commit 9b29050f upstream.

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.
Signed-off-by: default avatarStefan Berger <stefanb@linux.vnet.ibm.com>
Tested-by: default avatarGuillaume Chazarain <guichaz@gmail.com>
Signed-off-by: default avatarRajiv Andrade <srajiv@linux.vnet.ibm.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 926636ad
...@@ -577,9 +577,11 @@ void tpm_get_timeouts(struct tpm_chip *chip) ...@@ -577,9 +577,11 @@ void tpm_get_timeouts(struct tpm_chip *chip)
if (rc) if (rc)
return; return;
if (be32_to_cpu(tpm_cmd.header.out.return_code) if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 ||
!= 3 * sizeof(u32)) be32_to_cpu(tpm_cmd.header.out.length)
!= sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32))
return; return;
duration_cap = &tpm_cmd.params.getcap_out.cap.duration; duration_cap = &tpm_cmd.params.getcap_out.cap.duration;
chip->vendor.duration[TPM_SHORT] = chip->vendor.duration[TPM_SHORT] =
usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short)); usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short));
...@@ -923,6 +925,18 @@ ssize_t tpm_show_caps_1_2(struct device * dev, ...@@ -923,6 +925,18 @@ ssize_t tpm_show_caps_1_2(struct device * dev,
} }
EXPORT_SYMBOL_GPL(tpm_show_caps_1_2); 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, ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
......
...@@ -56,6 +56,8 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr, ...@@ -56,6 +56,8 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
char *); char *);
extern ssize_t tpm_show_temp_deactivated(struct device *, extern ssize_t tpm_show_temp_deactivated(struct device *,
struct device_attribute *attr, char *); struct device_attribute *attr, char *);
extern ssize_t tpm_show_timeouts(struct device *,
struct device_attribute *attr, char *);
struct tpm_chip; struct tpm_chip;
......
...@@ -376,6 +376,7 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated, ...@@ -376,6 +376,7 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
NULL); NULL);
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, 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(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL);
static struct attribute *tis_attrs[] = { static struct attribute *tis_attrs[] = {
&dev_attr_pubek.attr, &dev_attr_pubek.attr,
...@@ -385,7 +386,8 @@ static struct attribute *tis_attrs[] = { ...@@ -385,7 +386,8 @@ static struct attribute *tis_attrs[] = {
&dev_attr_owned.attr, &dev_attr_owned.attr,
&dev_attr_temp_deactivated.attr, &dev_attr_temp_deactivated.attr,
&dev_attr_caps.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 = { static struct attribute_group tis_attr_grp = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment