From patchwork Sat May 1 13:57:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lino Sanfilippo X-Patchwork-Id: 12234781 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,MIME_BASE64_TEXT,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9AB4AC43470 for ; Sat, 1 May 2021 14:01:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 758BC61490 for ; Sat, 1 May 2021 14:01:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231876AbhEAOCa (ORCPT ); Sat, 1 May 2021 10:02:30 -0400 Received: from mout.gmx.net ([212.227.17.20]:52145 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232138AbhEAOC2 (ORCPT ); Sat, 1 May 2021 10:02:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1619877687; bh=bdgo8J4TivRhaCR1yMOLb0GbU9YLD5pDkm2mF7GPaks=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=FUnpwhDN0gy0rPzqdmRT8cm82auiNAPkUBlJrN7Al9fLpJEqrPPfRrM9s7zaqCVeA UyINw8uNkbl2askCsqW9QHmi6WSpD4/t9ko07je8Y9qkjs6wUy2plyI+yklz7utNaC JCOlBTLrggeon6DR6pO+2AYSxB5CPfMFybVEMKZ0= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from Venus.fritz.box ([78.42.220.31]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MRmjq-1m1XnY3dBy-00TFYd; Sat, 01 May 2021 16:01:26 +0200 From: Lino Sanfilippo To: peterhuewe@gmx.de, jarkko@kernel.org, jgg@ziepe.ca Cc: stefanb@linux.vnet.ibm.com, James.Bottomley@hansenpartnership.com, keescook@chromium.org, jsnitsel@redhat.com, ml.linux@elloe.vision, linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org, LinoSanfilippo@gmx.de Subject: [PATCH v3 4/4] tpm: Only enable supported irqs Date: Sat, 1 May 2021 15:57:27 +0200 Message-Id: <20210501135727.17747-5-LinoSanfilippo@gmx.de> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210501135727.17747-1-LinoSanfilippo@gmx.de> References: <20210501135727.17747-1-LinoSanfilippo@gmx.de> MIME-Version: 1.0 X-Provags-ID: V03:K1:7jLZxRXA8T/g7l9AnnNL9N15FTgU/ED0fMkRffZPiEVIKMk8H6l 4X2OqvLjhjaG6s6fkYNfNuWQww3zrkZzde7/xLfUaMhWVaAAMXPDnzgo4XjVsoY0kwMJfy0 NH5GvynI8/dbk306ZAKprQ9K2YdEQMevdCHxvbCa2wfqCCSXJfS/eMjc4/wb3Ia9j+tZBsk 7k0X1iOL+32wdxXWq78lg== X-UI-Out-Filterresults: notjunk:1;V03:K0:I/0z9n93ojk=:J5OZzIFHBaL8NZeZJPq1dZ 3tQ3reOr3iY1hWsl1oOWQmxMqY0YfTbkogEN/dRtlI7uzyVGuXojb7CYV/dQlGUY9kfzKy0Z4 F2XmICtP3T9B02wEdCk5yy0T/N5ELxdf0TSCtRToNJDpMbShdhBS7j9/bapJndZpLWzb8oZKg SG62ZTkrNYmp7bYlkOcg82WrvTYv9i4g8mYyByxUoWCpmL5wR0QOoK/Zqk0GSwVDFrUyTzJSx 6ciZe1ibX/Uva6BTpR/At4WSqvY5SULs5s03vdH2dnqZJnfNacVjcH4fwjkD1OM90R8uC3aXn KtdW8HW/ow1HclaEK4kHrGi1N16GeykltbNvOp/50BgvAU+bzoiRpHvOHJPP14glhEJfq+2pD xW2HcEqzGiIc4GM9JvLIKN4aBfHYSbbUd+kDjjQxXw/i8USXIC057QMtTIyV6urwKRbCrqKhG WPpLRaRNVldBXbW60Mfq7lC8TgMglGuY5+x3yyAeF7Zvrc5O31vG1XxbaTva1kKXk+dfudZFT JSboEEjKeNoiNPhsIlKmWxUyKdBfECbDfsc3+3T9+IFZfJKwpe+7eITO304K5Xhl2jiy0tRul gr3WQek7A+WrLQzuRCnDmMM/trN+5OxK3z5/NA9F2+tggNP+YT20MkMmkRY5c7A6rdIJusB/e R4LFdR9bHKYNqo/ALK6hzHEO4qCcAnWRwyO4izQRktnb+OeI2HYbjxIQMZ/jXoOL6BYBpco6+ 51tmg5G8OD80Lt2vO4eh6HPW2YOrMH6LVlrmvJAikPAurrtEZezf0BKAXPmiUzm+2EDU7it8+ Mj8Fogv4z00AXAgCLi42s/TXjt2J77/SKPF8A0EYGKYhxvP2bfRP/yt23N6rweuyHWw4LVgSp pWt+3y4i/rzYsF8Ox6QEV87X9qyIoEy4mzv3FA2s003PKKXeg03J0srjU9Jb+HP63ngONvduF /VluQqV/TZVyBc6TT2bCFvVKh6TWA4lvJ4eWuymkBZVOpK3PPdCWygAczxNlWyFvGMElS0xgE aDMef8KWJpXs/ac0D7ahZGcHh3rc1UIgPGxHltPTJemZZoTn0bUQR43IwnzdVKhijNv7kKzVe J+p2DT+zpKlyi2Lz1pWFFZ2fWwmF3qiFCIp/VOSK0tABB1ERTw9xZPWG5NoCp47NeLSi0ZPzZ XEGzMOduJhdlgqvfMtNksXx3a+e8xSrde3hLw43UuWV/9w8kuev6lQPynMs1A97DCcdyCZpUD 2i7F79qOcEWbTzarb Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org Do not set interrupts which are not supported by the hardware. Instead use the information from the capability query and activate only the reported interrupts. Signed-off-by: Lino Sanfilippo Reviewed-by: Stefan Berger --- drivers/char/tpm/tpm_tis_core.c | 68 ++++++++++++++++++--------------- drivers/char/tpm/tpm_tis_core.h | 1 + 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c index 9615234054aa..757498a63f57 100644 --- a/drivers/char/tpm/tpm_tis_core.c +++ b/drivers/char/tpm/tpm_tis_core.c @@ -936,13 +936,47 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, if (rc) goto out_err; + /* Figure out the capabilities */ + rc = tpm_tis_read32(priv, TPM_INTF_CAPS(priv->locality), &intfcaps); + if (rc < 0) + goto out_err; + + dev_dbg(dev, "TPM interface capabilities (0x%x):\n", + intfcaps); + if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) + dev_dbg(dev, "\tBurst Count Static\n"); + if (intfcaps & TPM_INTF_CMD_READY_INT) { + priv->supported_irqs |= TPM_INTF_CMD_READY_INT; + dev_dbg(dev, "\tCommand Ready Int Support\n"); + } + if (intfcaps & TPM_INTF_INT_EDGE_FALLING) + dev_dbg(dev, "\tInterrupt Edge Falling\n"); + if (intfcaps & TPM_INTF_INT_EDGE_RISING) + dev_dbg(dev, "\tInterrupt Edge Rising\n"); + if (intfcaps & TPM_INTF_INT_LEVEL_LOW) + dev_dbg(dev, "\tInterrupt Level Low\n"); + if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) + dev_dbg(dev, "\tInterrupt Level High\n"); + if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) { + priv->supported_irqs |= TPM_INTF_LOCALITY_CHANGE_INT; + dev_dbg(dev, "\tLocality Change Int Support\n"); + } + if (intfcaps & TPM_INTF_STS_VALID_INT) { + priv->supported_irqs |= TPM_INTF_STS_VALID_INT; + dev_dbg(dev, "\tSts Valid Int Support\n"); + } + if (intfcaps & TPM_INTF_DATA_AVAIL_INT) { + priv->supported_irqs |= TPM_INTF_DATA_AVAIL_INT; + dev_dbg(dev, "\tData Avail Int Support\n"); + } + /* Take control of the TPM's interrupt hardware and shut it off */ rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask); if (rc < 0) goto out_err; - intmask |= TPM_INTF_CMD_READY_INT | TPM_INTF_LOCALITY_CHANGE_INT | - TPM_INTF_DATA_AVAIL_INT | TPM_INTF_STS_VALID_INT; + intmask |= priv->supported_irqs; + intmask &= ~TPM_GLOBAL_INT_ENABLE; tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask); @@ -971,32 +1005,6 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, goto out_err; } - /* Figure out the capabilities */ - rc = tpm_tis_read32(priv, TPM_INTF_CAPS(priv->locality), &intfcaps); - if (rc < 0) - goto out_err; - - dev_dbg(dev, "TPM interface capabilities (0x%x):\n", - intfcaps); - if (intfcaps & TPM_INTF_BURST_COUNT_STATIC) - dev_dbg(dev, "\tBurst Count Static\n"); - if (intfcaps & TPM_INTF_CMD_READY_INT) - dev_dbg(dev, "\tCommand Ready Int Support\n"); - if (intfcaps & TPM_INTF_INT_EDGE_FALLING) - dev_dbg(dev, "\tInterrupt Edge Falling\n"); - if (intfcaps & TPM_INTF_INT_EDGE_RISING) - dev_dbg(dev, "\tInterrupt Edge Rising\n"); - if (intfcaps & TPM_INTF_INT_LEVEL_LOW) - dev_dbg(dev, "\tInterrupt Level Low\n"); - if (intfcaps & TPM_INTF_INT_LEVEL_HIGH) - dev_dbg(dev, "\tInterrupt Level High\n"); - if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT) - dev_dbg(dev, "\tLocality Change Int Support\n"); - if (intfcaps & TPM_INTF_STS_VALID_INT) - dev_dbg(dev, "\tSts Valid Int Support\n"); - if (intfcaps & TPM_INTF_DATA_AVAIL_INT) - dev_dbg(dev, "\tData Avail Int Support\n"); - /* INTERRUPT Setup */ init_waitqueue_head(&priv->read_queue); init_waitqueue_head(&priv->int_queue); @@ -1066,9 +1074,7 @@ static void tpm_tis_reenable_interrupts(struct tpm_chip *chip) if (rc < 0) goto out; - intmask |= TPM_INTF_CMD_READY_INT - | TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_DATA_AVAIL_INT - | TPM_INTF_STS_VALID_INT | TPM_GLOBAL_INT_ENABLE; + intmask |= priv->supported_irqs | TPM_GLOBAL_INT_ENABLE; tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask); diff --git a/drivers/char/tpm/tpm_tis_core.h b/drivers/char/tpm/tpm_tis_core.h index dc5f92b18dca..8ff62213d8fc 100644 --- a/drivers/char/tpm/tpm_tis_core.h +++ b/drivers/char/tpm/tpm_tis_core.h @@ -89,6 +89,7 @@ struct tpm_tis_data { u16 manufacturer_id; int locality; int irq; + unsigned int supported_irqs; unsigned int flags; void __iomem *ilb_base_addr; u16 clkrun_enabled;