From: Limeng <meng...@windriver.com> So far, there is not a sysfs interface for user space code to check the TPM family version(TPM1.x or TPM2). So, add a file named description in /sys/class/tpm/tpmX/ to show it.
Signed-off-by: Meng Li <meng...@windriver.com> --- drivers/char/tpm/tpm-chip.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index c406343..b222421 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -36,6 +36,68 @@ dev_t tpm_devt; /** + * show_description - sysfs interface for checking current TPM hardware version. + * @dev: pointer to tpm chip device + * @attr: unused + * @buf: char buffer to be filled with TPM hardware version info + * + * Provides sysfs interface for showing current TPM hardware version. + */ +static ssize_t show_description(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct tpm_chip *chip = (struct tpm_chip *)container_of(dev,struct tpm_chip,dev); + int ret; + + if (chip->flags & TPM_CHIP_FLAG_TPM2) + ret = sprintf(buf, "TPM 2.0"); + else + ret = sprintf(buf, "TPM 1.x"); + + return ret; +} + +static struct device_attribute tpm_attrs[] = { + __ATTR(description, S_IRUGO, show_description, NULL), +}; + +/** + * tpm_create_sysfs - Create tpm sysfs interface. + * @dev: pointer to tpm chip device + * + * Create sysfs interface for checking current TPM hardware version. + */ +static int tpm_create_sysfs(struct device *dev) +{ + int r, t; + + for (t = 0; t < ARRAY_SIZE(tpm_attrs); t++) { + r = device_create_file(dev, &tpm_attrs[t]); + if (r) { + dev_err(dev, "failed to create sysfs file\n"); + return r; + } + } + + return 0; +} + +/** + * tpm_remove_sysfs - Remove tpm sysfs interface. + * @dev: pointer to tpm chip device + * + * Remove sysfs interface for checking current TPM hardware version. + */ +static void tpm_remove_sysfs(struct device *dev) +{ + int t; + + for (t = 0; t < ARRAY_SIZE(tpm_attrs); t++) { + device_remove_file(dev, &tpm_attrs[t]); + } +} + +/** * tpm_try_get_ops() - Get a ref to the tpm_chip * @chip: Chip to ref * @@ -363,6 +425,13 @@ int tpm_chip_register(struct tpm_chip *chip) return rc; } + rc = tpm_create_sysfs(&chip->dev); + if (rc) { + tpm_del_legacy_sysfs(chip); + tpm_chip_unregister(chip); + return rc; + } + return 0; } EXPORT_SYMBOL_GPL(tpm_chip_register); @@ -382,6 +451,7 @@ int tpm_chip_register(struct tpm_chip *chip) */ void tpm_chip_unregister(struct tpm_chip *chip) { + tpm_remove_sysfs(&chip->dev); tpm_del_legacy_sysfs(chip); tpm_bios_log_teardown(chip); tpm_del_char_device(chip); -- 1.7.9.5