From patchwork Thu Jul 28 04:06:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrey Pronin X-Patchwork-Id: 9250659 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 02E426075F for ; Thu, 28 Jul 2016 04:06:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E66E924B48 for ; Thu, 28 Jul 2016 04:06:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D53BB254F7; Thu, 28 Jul 2016 04:06:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 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 mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 2C59724B48 for ; Thu, 28 Jul 2016 04:06:18 +0000 (UTC) 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 1bScaP-0001qi-5p; Thu, 28 Jul 2016 04:06:17 +0000 Received: from sog-mx-1.v43.ch3.sourceforge.com ([172.29.43.191] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1bScaO-0001qd-2R for tpmdd-devel@lists.sourceforge.net; Thu, 28 Jul 2016 04:06:16 +0000 Received-SPF: pass (sog-mx-1.v43.ch3.sourceforge.com: domain of chromium.org designates 209.85.192.179 as permitted sender) client-ip=209.85.192.179; envelope-from=apronin@chromium.org; helo=mail-pf0-f179.google.com; Received: from mail-pf0-f179.google.com ([209.85.192.179]) by sog-mx-1.v43.ch3.sourceforge.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.76) id 1bScaM-00048J-UC for tpmdd-devel@lists.sourceforge.net; Thu, 28 Jul 2016 04:06:16 +0000 Received: by mail-pf0-f179.google.com with SMTP id y134so17455154pfg.0 for ; Wed, 27 Jul 2016 21:06:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=pejDehBuFtevheQUOuE2zGZDt0mcsXwUondHIJB2nCs=; b=UI1X7sRN4jiMrI2yRpFP+mGfEu+KME2zW8eVQDV1wWbu1+/oeF4DYmjDmB23HzvDsv YPraS47NgQJY616Nyf5lGr77i+tnjoujphyBigIxdrbqCwGRl6rR0FOLhDqCNUTGR5rl LQCjACJX+MMLG8ymq5kS6o7PasIQnRAc0mJoyTdIGB4adVhBciG9J51hVj3EHiwy9xXW onIKl3LQhjMIgreRqiKLyLPnRB+LJA22L4oCwqwdmaIP7U8VqDpbihot6uV9wUkGBcso EGFCMiLAh2yvKcSyBkiUuRpkWP/vKpuF13sFBbgb8LhR83qTWva58P4DWhT5fkpz0Dwv 79+A== X-Gm-Message-State: AEkoouufbWXo965diWyo8mUlIS2LqU8bYomcdfMDgqd03x8Hr4rdDdPxEkLLeYCrpDA3hWYQ X-Received: by 10.98.57.151 with SMTP id u23mr55533828pfj.4.1469678769278; Wed, 27 Jul 2016 21:06:09 -0700 (PDT) Received: from apronin0.mtv.corp.google.com ([172.22.64.136]) by smtp.gmail.com with ESMTPSA id y200sm12608703pfb.13.2016.07.27.21.06.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Jul 2016 21:06:08 -0700 (PDT) From: Andrey Pronin To: Jarkko Sakkinen Date: Wed, 27 Jul 2016 21:06:06 -0700 Message-Id: <1469678766-117528-1-git-send-email-apronin@chromium.org> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1468547496-16215-1-git-send-email-apronin@chromium.org> References: <1468547496-16215-1-git-send-email-apronin@chromium.org> In-Reply-To: <1468547496-16215-1-git-send-email-apronin@chromium.org> References: <1468547496-16215-1-git-send-email-apronin@chromium.org> X-Headers-End: 1bScaM-00048J-UC Cc: Christophe Ricard , dianders@chromium.org, linux-kernel@vger.kernel.org, smbarber@chromium.org, tpmdd-devel@lists.sourceforge.net, dtor@chromium.org Subject: [tpmdd-devel] [PATCH v3] tpm: add sysfs attributes for tpm2 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: , MIME-Version: 1.0 Errors-To: tpmdd-devel-bounces@lists.sourceforge.net X-Virus-Scanned: ClamAV using ClamSMTP Add sysfs attributes in TPM2.0 case for: - TPM_PT_PERMANENT flags - TPM_PT_STARTUP_CLEAR flags - lockout-related properties v2: Dropped adding driver-specific attributes. No legacy links for TPM2 attributes. All attributes created in groups[0]. Added actual attributes for flags and lockout properties. v3: Avoid creating a separate 'show' function for each attribute. Signed-off-by: Andrey Pronin --- drivers/char/tpm/tpm-chip.c | 4 +- drivers/char/tpm/tpm-sysfs.c | 122 +++++++++++++++++++++++++++++++++++++++++-- drivers/char/tpm/tpm.h | 30 +++++++++++ 3 files changed, 150 insertions(+), 6 deletions(-) diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index e595013..ede2ca0 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -281,8 +281,6 @@ static int tpm1_chip_register(struct tpm_chip *chip) if (chip->flags & TPM_CHIP_FLAG_TPM2) return 0; - tpm_sysfs_add_device(chip); - chip->bios_dir = tpm_bios_log_setup(dev_name(&chip->dev)); return 0; @@ -363,6 +361,8 @@ int tpm_chip_register(struct tpm_chip *chip) return rc; } + tpm_sysfs_add_device(chip); + rc = tpm1_chip_register(chip); if (rc) return rc; diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index b46cf70..62940ef 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -264,7 +264,7 @@ static ssize_t timeouts_show(struct device *dev, struct device_attribute *attr, } static DEVICE_ATTR_RO(timeouts); -static struct attribute *tpm_dev_attrs[] = { +static struct attribute *tpm1_dev_attrs[] = { &dev_attr_pubek.attr, &dev_attr_pcrs.attr, &dev_attr_enabled.attr, @@ -278,8 +278,120 @@ static struct attribute *tpm_dev_attrs[] = { NULL, }; -static const struct attribute_group tpm_dev_group = { - .attrs = tpm_dev_attrs, +static const struct attribute_group tpm1_dev_group = { + .attrs = tpm1_dev_attrs, +}; + +struct tpm2_prop_flag_dev_attribute { + struct device_attribute attr; + u32 property_id; + u32 flag_mask; +}; + +struct tpm2_prop_u32_dev_attribute { + struct device_attribute attr; + u32 property_id; +}; + +static ssize_t tpm2_prop_flag_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpm2_prop_flag_dev_attribute *pa = + container_of(attr, struct tpm2_prop_flag_dev_attribute, attr); + u32 flags; + ssize_t rc; + + rc = tpm2_get_tpm_pt(to_tpm_chip(dev), pa->property_id, &flags, + "reading property"); + if (rc) + return 0; + + return sprintf(buf, "%d\n", !!(flags & pa->flag_mask)); +} + +static ssize_t tpm2_prop_u32_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct tpm2_prop_u32_dev_attribute *pa = + container_of(attr, struct tpm2_prop_u32_dev_attribute, attr); + u32 value; + ssize_t rc; + + rc = tpm2_get_tpm_pt(to_tpm_chip(dev), pa->property_id, &value, + "reading property"); + if (rc) + return 0; + + return sprintf(buf, "%u\n", value); +} + +#define TPM2_PROP_FLAG_ATTR(_name, _property_id, _flag_mask) \ + struct tpm2_prop_flag_dev_attribute attr_tpm2_prop_##_name = { \ + __ATTR(_name, S_IRUGO, tpm2_prop_flag_show, NULL), \ + _property_id, _flag_mask \ + } + +#define TPM2_PROP_U32_ATTR(_name, _property_id) \ + struct tpm2_prop_u32_dev_attribute attr_tpm2_prop_##_name = { \ + __ATTR(_name, S_IRUGO, tpm2_prop_u32_show, NULL), \ + _property_id \ + } + +TPM2_PROP_FLAG_ATTR(owner_auth_set, + TPM2_PT_PERMANENT, TPM2_ATTR_OWNER_AUTH_SET); +TPM2_PROP_FLAG_ATTR(endorsement_auth_set, + TPM2_PT_PERMANENT, TPM2_ATTR_ENDORSEMENT_AUTH_SET); +TPM2_PROP_FLAG_ATTR(lockout_auth_set, + TPM2_PT_PERMANENT, TPM2_ATTR_LOCKOUT_AUTH_SET); +TPM2_PROP_FLAG_ATTR(disable_clear, + TPM2_PT_PERMANENT, TPM2_ATTR_DISABLE_CLEAR); +TPM2_PROP_FLAG_ATTR(in_lockout, + TPM2_PT_PERMANENT, TPM2_ATTR_IN_LOCKOUT); +TPM2_PROP_FLAG_ATTR(tpm_generated_eps, + TPM2_PT_PERMANENT, TPM2_ATTR_TPM_GENERATED_EPS); + +TPM2_PROP_FLAG_ATTR(ph_enable, + TPM2_PT_STARTUP_CLEAR, TPM2_ATTR_PH_ENABLE); +TPM2_PROP_FLAG_ATTR(sh_enable, + TPM2_PT_STARTUP_CLEAR, TPM2_ATTR_SH_ENABLE); +TPM2_PROP_FLAG_ATTR(eh_enable, + TPM2_PT_STARTUP_CLEAR, TPM2_ATTR_EH_ENABLE); +TPM2_PROP_FLAG_ATTR(ph_enable_nv, + TPM2_PT_STARTUP_CLEAR, TPM2_ATTR_PH_ENABLE_NV); +TPM2_PROP_FLAG_ATTR(orderly, + TPM2_PT_STARTUP_CLEAR, TPM2_ATTR_ORDERLY); + +TPM2_PROP_U32_ATTR(lockout_counter, TPM2_PT_LOCKOUT_COUNTER); +TPM2_PROP_U32_ATTR(max_auth_fail, TPM2_PT_MAX_AUTH_FAIL); +TPM2_PROP_U32_ATTR(lockout_interval, TPM2_PT_LOCKOUT_INTERVAL); +TPM2_PROP_U32_ATTR(lockout_recovery, TPM2_PT_LOCKOUT_RECOVERY); + +#define ATTR_FOR_TPM2_PROP(_name) (&attr_tpm2_prop_##_name.attr.attr) +static struct attribute *tpm2_dev_attrs[] = { + ATTR_FOR_TPM2_PROP(owner_auth_set), + ATTR_FOR_TPM2_PROP(endorsement_auth_set), + ATTR_FOR_TPM2_PROP(lockout_auth_set), + ATTR_FOR_TPM2_PROP(disable_clear), + ATTR_FOR_TPM2_PROP(in_lockout), + ATTR_FOR_TPM2_PROP(tpm_generated_eps), + ATTR_FOR_TPM2_PROP(ph_enable), + ATTR_FOR_TPM2_PROP(sh_enable), + ATTR_FOR_TPM2_PROP(eh_enable), + ATTR_FOR_TPM2_PROP(ph_enable_nv), + ATTR_FOR_TPM2_PROP(orderly), + ATTR_FOR_TPM2_PROP(lockout_counter), + ATTR_FOR_TPM2_PROP(max_auth_fail), + ATTR_FOR_TPM2_PROP(lockout_interval), + ATTR_FOR_TPM2_PROP(lockout_recovery), + &dev_attr_durations.attr, + &dev_attr_timeouts.attr, + NULL, +}; + +static const struct attribute_group tpm2_dev_group = { + .attrs = tpm2_dev_attrs, }; void tpm_sysfs_add_device(struct tpm_chip *chip) @@ -289,5 +401,7 @@ void tpm_sysfs_add_device(struct tpm_chip *chip) * removal so that no callbacks are running or can run again */ WARN_ON(chip->groups_cnt != 0); - chip->groups[chip->groups_cnt++] = &tpm_dev_group; + chip->groups[chip->groups_cnt++] = + (chip->flags & TPM_CHIP_FLAG_TPM2) ? + &tpm2_dev_group : &tpm1_dev_group; } diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 6e002c4..9feb023 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -127,6 +127,36 @@ enum tpm2_capabilities { TPM2_CAP_TPM_PROPERTIES = 6, }; +enum tpm2_properties { + TPM2_PT_NONE = 0, + TPM2_PT_GROUP = 0x100, + TPM2_PT_FIXED = TPM2_PT_GROUP, + TPM2_PT_VAR = TPM2_PT_GROUP * 2, + TPM2_PT_PERMANENT = TPM2_PT_VAR + 0, + TPM2_PT_STARTUP_CLEAR = TPM2_PT_VAR + 1, + TPM2_PT_LOCKOUT_COUNTER = TPM2_PT_VAR + 14, + TPM2_PT_MAX_AUTH_FAIL = TPM2_PT_VAR + 15, + TPM2_PT_LOCKOUT_INTERVAL = TPM2_PT_VAR + 16, + TPM2_PT_LOCKOUT_RECOVERY = TPM2_PT_VAR + 17, +}; + +enum tpm2_attr_permanent { + TPM2_ATTR_OWNER_AUTH_SET = BIT(0), + TPM2_ATTR_ENDORSEMENT_AUTH_SET = BIT(1), + TPM2_ATTR_LOCKOUT_AUTH_SET = BIT(2), + TPM2_ATTR_DISABLE_CLEAR = BIT(8), + TPM2_ATTR_IN_LOCKOUT = BIT(9), + TPM2_ATTR_TPM_GENERATED_EPS = BIT(10), +}; + +enum tpm2_attr_startup_clear { + TPM2_ATTR_PH_ENABLE = BIT(0), + TPM2_ATTR_SH_ENABLE = BIT(1), + TPM2_ATTR_EH_ENABLE = BIT(2), + TPM2_ATTR_PH_ENABLE_NV = BIT(3), + TPM2_ATTR_ORDERLY = BIT(31), +}; + enum tpm2_startup_types { TPM2_SU_CLEAR = 0x0000, TPM2_SU_STATE = 0x0001,