From patchwork Mon Mar 13 05:21:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Meng Li X-Patchwork-Id: 738044 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vhWpT5Mqfz9s7m for ; Mon, 13 Mar 2017 19:52:33 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1cnLiN-0000ix-Fk; Mon, 13 Mar 2017 08:52:27 +0000 Received: from sog-mx-1.v43.ch3.sourceforge.com ([172.29.43.191] helo=mx.sourceforge.net) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1cnIR1-0001J4-Vk for tpmdd-devel@lists.sourceforge.net; Mon, 13 Mar 2017 05:22:19 +0000 Received-SPF: pass (sog-mx-1.v43.ch3.sourceforge.com: domain of windriver.com designates 192.103.53.11 as permitted sender) client-ip=192.103.53.11; envelope-from=Meng.Li@windriver.com; helo=mail5.wrs.com; Received: from mail5.windriver.com ([192.103.53.11] helo=mail5.wrs.com) by sog-mx-1.v43.ch3.sourceforge.com with esmtps (TLSv1:AES256-SHA:256) (Exim 4.76) id 1cnIR0-0007lE-Rc for tpmdd-devel@lists.sourceforge.net; Mon, 13 Mar 2017 05:22:19 +0000 Received: from ALA-HCA.corp.ad.wrs.com (ala-hca.corp.ad.wrs.com [147.11.189.40]) by mail5.wrs.com (8.15.2/8.15.2) with ESMTPS id v2D5M40q023401 (version=TLSv1 cipher=AES128-SHA bits=128 verify=OK); Sun, 12 Mar 2017 22:22:04 -0700 Received: from pek-mli-d1.wrs.com (128.224.162.235) by ALA-HCA.corp.ad.wrs.com (147.11.189.40) with Microsoft SMTP Server id 14.3.294.0; Sun, 12 Mar 2017 22:22:03 -0700 From: To: Date: Mon, 13 Mar 2017 13:21:57 +0800 Message-ID: <1489382517-9078-1-git-send-email-Meng.Li@windriver.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 X-Spam-Score: -1.9 (-) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain -0.0 SPF_PASS SPF: sender matches SPF record -0.3 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain X-Headers-End: 1cnIR0-0007lE-Rc X-Mailman-Approved-At: Mon, 13 Mar 2017 08:52:25 +0000 Cc: tpmdd-devel@lists.sourceforge.net Subject: [tpmdd-devel] [PATCH] tpm: Add sysfs interface to show TPM hardware version X-BeenThere: tpmdd-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Tpm Device Driver maintainance List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: tpmdd-devel-bounces@lists.sourceforge.net From: Limeng So far, there is not a sysfs interface for user space code to check the TPM hardware version(TPM1.x or TPM2). So, add a file named description in /sys/class/tpm/tpmX/ to show it. Signed-off-by: Meng Li --- drivers/char/tpm/tpm-chip.c | 85 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index c406343..da2cd69 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -36,6 +36,83 @@ 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; +} + +/** + * store_description - interface for manually setting data. + * @dev: unused + * @attr: unused + * @buf: unused + * @count: unused + * + * There is not any process in this function, reserve for feature. + */ +static ssize_t store_description(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return count; +} + +static struct device_attribute tpm_attrs[] = { + __ATTR(description, S_IRUGO | S_IWUSR, show_description, store_description), +}; + +/** + * 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 +440,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 +466,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);