@@ -310,6 +310,19 @@ static ssize_t timeouts_show(struct device *dev, struct device_attribute *attr,
}
static DEVICE_ATTR_RO(timeouts);
+static ssize_t null_name_show(struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct tpm_chip *chip = to_tpm_chip(dev);
+ int size = TPM2_NAME_SIZE;
+
+ bin2hex(buf, chip->tpmkeyname, size);
+ size *= 2;
+ buf[size++] = '\n';
+ return size;
+}
+static DEVICE_ATTR_RO(null_name);
+
static ssize_t tpm_version_major_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -336,7 +349,7 @@ static struct attribute *tpm1_dev_attrs[] = {
};
static struct attribute *tpm2_dev_attrs[] = {
- &dev_attr_tpm_version_major.attr,
+ &dev_attr_null_name.attr,
NULL
};
@@ -346,10 +359,24 @@ static const struct attribute_group tpm1_dev_group = {
static const struct attribute_group tpm2_dev_group = {
.attrs = tpm2_dev_attrs,
+
};
void tpm_sysfs_add_device(struct tpm_chip *chip)
{
+ /* XXX: If you wish to remove this restriction, you must first update
+ * tpm_sysfs to explicitly lock chip->ops.
+ */
+ if (chip->flags & TPM_CHIP_FLAG_TPM2) {
+ WARN_ON(chip->groups_cnt != 0);
+ chip->groups[chip->groups_cnt++] = &tpm2_dev_group;
+ return;
+ }
+
+ /* The sysfs routines rely on an implicit tpm_try_get_ops, device_del
+ * is called before ops is null'd and the sysfs core synchronizes this
+ * removal so that no callbacks are running or can run again
+ */
WARN_ON(chip->groups_cnt != 0);
if (chip->flags & TPM_CHIP_FLAG_TPM2)
chip->groups[chip->groups_cnt++] = &tpm2_dev_group;