From patchwork Fri Jun 10 11:08:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lino Sanfilippo X-Patchwork-Id: 12877474 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1A451C433EF for ; Fri, 10 Jun 2022 11:09:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1348046AbiFJLJ2 (ORCPT ); Fri, 10 Jun 2022 07:09:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59502 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1347832AbiFJLJX (ORCPT ); Fri, 10 Jun 2022 07:09:23 -0400 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E7D7D14640A; Fri, 10 Jun 2022 04:09:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1654859345; bh=mLuSt9GrDvQ8CHVFpIFl/BDsUxB55rqACDGcwmQPwX0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=IggaaXsWOn6fl59/cFAZmlF3IkeQkvdvCn6nwxUv17A2xnKSm5Umao0tjJt1rAGr7 Jl0CLIXrachWQPVcYAuR0M7wOu1NrqM7z/tb++BaUB1FLnvICzF8aK3QhrNkDjgeY6 a4kJAtGbUgXYXTC2Xw/1lBqCwtP1uj5M7cH80guI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from Venus.fritz.box ([46.223.3.165]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1McH5a-1nTrfJ1zEy-00cjOA; Fri, 10 Jun 2022 13:09:05 +0200 From: LinoSanfilippo@gmx.de To: peterhuewe@gmx.de, jarkko@kernel.org, jgg@ziepe.ca Cc: stefanb@linux.vnet.ibm.com, linux@mniewoehner.de, linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org, l.sanfilippo@kunbus.com, LinoSanfilippo@gmx.de, lukas@wunner.de, p.rosenberger@kunbus.com Subject: [PATCH v5 06/10] tpm, tpm_tis: Only handle supported interrupts in wait_for_tpm_stat() Date: Fri, 10 Jun 2022 13:08:42 +0200 Message-Id: <20220610110846.8307-7-LinoSanfilippo@gmx.de> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220610110846.8307-1-LinoSanfilippo@gmx.de> References: <20220610110846.8307-1-LinoSanfilippo@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:V9ZSj7NtP38cs9cWw3vp2komO17Wj/HumTOgtp20/73V9KjgMfa cvye23uGL22ne2bQCUvSEnEZSRd2LGYpIW2f1Pr4LB9MFX6umJcv1JcLmukQFWQU0y/plI7 nLxfJDs3GEdt9sHnA+6ZVTIFrN1Difx0pvAhMY2ceYWjBm5akUvMsLxqkKlJF3gWf01eSzF pJTpVRo7VVzhElkFB+bOQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:mhz9Ol5hJp4=:DOvdfBWCHo8CQkhJ5W44gL yMtxWCBVPO4LD2R4Di/MALIDlwcUB62NLcoN2gwWLtyehDCcuL8dCjMYnsL2SJGW+F1OYjkQG BxCtsdsSDuzY6PPNCY3WwzlKZvyBy3Q5Gj2BlFwqQAxZeYWZscXE/J0CisjknJfH3Vx9nCPnW QwkQnUYXpioWfvXRbObBZBSnc0hmotHQg9NqzgWvi6XxuPBYPqx5Kvsvt3tdfoVtIe9Kp1APZ tdt7trTESd110gyCSVfciILTQFKn4blPs2NmWvvOxLfa235w66IFn7J0WDy7iQLjPJcOMfTan sumz+UWGpMtWVAKM+fGkXMqTw42Jyys2rRVt9nRxNQR2yqZoBcuLzUsdql5JGky2NZtZLAc70 dj5VmipviVxpgjfcwDhmDQ5q9PLh/bxuZCEpQ3P0JO+6+Bw9sZHKZTYHmn3g10+Pu3QznnkBd xN7qq3qBKVM1sLc5bfnM3NgKe2uDUujAsNWpVZdxg1tYCE0PeCmbQh89jO48pVB64mL3xCShw K/OLrH755ysLixZ4V7Wr+JQaQJqdLpzpoqNUAe5uvp+dkvS0CDwMH+5bfxxadCCxQtNRYBpPK WES+97JYROXZhkTsxQNjJHx43tHnbLgSio+O6wwHBZYL4zAtTetNicccUh7UcJFuuG8avWHU2 dQYWQzNYMrq1sG/1OxCkwbo4zyqxoc2+BCLCfVzJACxKFLRlhf9+eyQPLNcF5b6nkw2hi/hyw wNx6WVu3p2xFjPTyff6onISMj3x7IjPi9TbwxaJ4SNd51Jx/qbMnhFeK/lqWr1tGlEiHYesZS Zq6+eNNk0mi2VD0pfDBz+A15kH+goiHYXqcsuPwUxqMUPvyAOos77MlBnrA7qPzprMCuHxAQy xJOFQ3ESYkBvEUa0uixQSI6SPQuePVNjU44G0w+wuOw1MVoqJ7wGIfTT8BETUB+k2urNdogeh jz3Ks6x5/Up74iC1zZgSFAuaIhTHFbRFijYYJLtwjradAvuE7owfxvut/YKS7js2+4GzqtvpB AkSggowdK9xQoubhQacwbGRb4pACqZqGD0HZapke12h6B3pv4jwzE7PrHq1n4YfNc8D+9G5uL lNLd5lbx9mD2NaeaQdzbZtZ66lXz6RunpN5YZsCSSHZXVh3fZ0habllkA== Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org From: Lino Sanfilippo According to the TPM Interface Specification (TIS) interrupts for "stsValid" and "commandReady" might not be supported. Take this into account and only wait for interrupts which are actually in use in wait_for_tpm_stat(). After that process all the remaining status changes by polling the status register. Signed-off-by: Lino Sanfilippo --- drivers/char/tpm/tpm_tis_core.c | 46 ++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c index 2f03fefa1706..028bec44362d 100644 --- a/drivers/char/tpm/tpm_tis_core.c +++ b/drivers/char/tpm/tpm_tis_core.c @@ -53,41 +53,63 @@ static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, long rc; u8 status; bool canceled = false; + u8 active_irqs = 0; + int ret = 0; /* check current status */ status = chip->ops->status(chip); if ((status & mask) == mask) return 0; - stop = jiffies + timeout; + /* check what status changes can be handled by irqs */ + if (priv->irqs_in_use & TPM_INTF_STS_VALID_INT) + active_irqs |= TPM_STS_VALID; - if (chip->flags & TPM_CHIP_FLAG_IRQ) { + if (priv->irqs_in_use & TPM_INTF_DATA_AVAIL_INT) + active_irqs |= TPM_STS_DATA_AVAIL; + + if (priv->irqs_in_use & TPM_INTF_CMD_READY_INT) + active_irqs |= TPM_STS_COMMAND_READY; + + active_irqs &= mask; + + stop = jiffies + timeout; + /* process status changes with irq support */ + if (active_irqs) { + ret = -ETIME; again: timeout = stop - jiffies; if ((long)timeout <= 0) return -ETIME; rc = wait_event_interruptible_timeout(*queue, - wait_for_tpm_stat_cond(chip, mask, check_cancel, + wait_for_tpm_stat_cond(chip, active_irqs, check_cancel, &canceled), timeout); if (rc > 0) { if (canceled) return -ECANCELED; - return 0; + ret = 0; } if (rc == -ERESTARTSYS && freezing(current)) { clear_thread_flag(TIF_SIGPENDING); goto again; } - } else { - do { - usleep_range(priv->timeout_min, - priv->timeout_max); - status = chip->ops->status(chip); - if ((status & mask) == mask) - return 0; - } while (time_before(jiffies, stop)); } + + if (ret) + return ret; + + mask &= ~active_irqs; + if (!mask) /* all done */ + return 0; + /* process status changes without irq support */ + do { + status = chip->ops->status(chip); + if ((status & mask) == mask) + return 0; + usleep_range(priv->timeout_min, + priv->timeout_max); + } while (time_before(jiffies, stop)); return -ETIME; }