From patchwork Thu Nov 24 13:55:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Lino Sanfilippo X-Patchwork-Id: 13055004 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 A9F89C43217 for ; Thu, 24 Nov 2022 13:56:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229693AbiKXN4b (ORCPT ); Thu, 24 Nov 2022 08:56:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49404 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229453AbiKXN4a (ORCPT ); Thu, 24 Nov 2022 08:56:30 -0500 Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DF1AECCD3; Thu, 24 Nov 2022 05:56:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.de; s=s31663417; t=1669298170; bh=SB+1tJYA4q5lk40PtRnyFjmWRiGu2T/CfYKZHicV39Q=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date; b=GTn/9PQWnu8i/A6NYBndQl836lmvS4fmx0AFJguvmtxCU+ryGoL3VJpyepLdkLL2o w0YZsGD4BSMjb2zqQ7WluNNSHiNoaO3u8xYLioURtDXhNthQzCBGgsYKSctTXt4hya mfAptyEN2aULumHxd9XlyJByhdDOh6+Gjt0t17gcGILlpZ3cuh1Tl4alaksuPhjMGF srZe/SssWIax3TQwDvs9xIvcanzIrIEcJlEUxFndASOmw0qcTKnP6Z1K+EpCrR2J3j D5tVXeiErXBPhfeeApwzQ52mi+1FTxzznzgi4Eq0f4iWfhMHqWtB/Iv2VZhRkIbcA1 VF7tGiKhYYxMw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from Venus.speedport.ip ([84.162.7.17]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MO9zH-1oZeTI3cK1-00OakT; Thu, 24 Nov 2022 14:56:09 +0100 From: Lino Sanfilippo 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, jandryuk@gmail.com, pmenzel@molgen.mpg.de, l.sanfilippo@kunbus.com, LinoSanfilippo@gmx.de, lukas@wunner.de, p.rosenberger@kunbus.com Subject: [PATCH v11 00/14] TPM IRQ fixes Date: Thu, 24 Nov 2022 14:55:24 +0100 Message-Id: <20221124135538.31020-1-LinoSanfilippo@gmx.de> X-Mailer: git-send-email 2.36.1 MIME-Version: 1.0 X-Provags-ID: V03:K1:P9TbHYcLHgIxCYw9aap9R5+EGkaEf4jq+6tJkxVIPYSEauvke4h Vhjsgc0A9NvZ+zMKqh8TAwGbwWWZ2KBZMfvJox09P/1iV+LtbxYPDtQpRF7IuUW4RwJAyzw 13DhOiJ3lMuAsbajHvrev99zo60espNf7fKqFO2Ee3d56q/+x0iNWTeuiz3QPmuLm37z2rG AQxfQ3y88mWQSheKwRSng== UI-OutboundReport: notjunk:1;M01:P0:gal9pq2Zkak=;iNIWswf8BrWJ85q0Gomxd3jTbEX 0KIJCDPdJKIIX+9uXgM+x4ENEWZAogr5xb/hquOjMi//ZWrJYy7RsstfiW5g4kUyx/aWcWRQA GjYy80lnFr81xjEXSPoOZQXdvfWp5vH+U+Wdw4YdFDfH7I5Zbuc5qAf9jG8uhSWK8wvn9so3K 30uV0V2lIsYfpgODB2h1yVJln3pDuFd+Wbf1/HS6OJ4ZUFlwEmcj34RVo0FMvMBitCpcHTE4z SzIkM1Jid6P7sTNg+S/JHFAU2mMg9GOyuzuIV+JaPdxkmvZyJT9xtOGrYfugRKi/eVklDvcyN KmoI2e0wLdU9x7ofmZdaACFUs0SXYjw5hUAbWuEQ0COO5CLdIA1J8noBgHoO7TWbjWge+k6lZ huVkuIuPrGcG8o+Tn49W8z5d0aHQGIMTV/eiRd447r9c7zydt2+Kfw2mXeE2Trgpoz3XXFt7Z s/4pyT+TPGOM2W4mlQlQaHddKWPbg9Bk0ffhHPW72pyser5HRec2UKyRdXahTo16anJHPRRil D8IwVtTfo1PEl+069dOdW/nVy6YjLpt4C8vaahIAmZp4ybxiv1+Ogzry0qfV/YmNCAJWje8X0 ZUT3W6kQMyDfMSQtRAIVbPH2T6GCYMhN27NHWFNXXczAjwRax0PCy7yFl+txOZBMSn83YrPqv qmo4JEkdFWgHPNGe/SBcw9zXkYfR/EGCvqg63jECfI6f0aJ1dLdAqRAgx+hp6RNjgP9vqBU4r Hrfy4qQFlGOjnd9kZlQR89K0C2qB+IYYW7BypdBxrqvW07XpOkSdjMqRCjZfyPbdSnqD63lZf GudhJYQwtewu5zVR4nVYlCbd/pLIBk0e8pYmKm6PXM2rc9sj51u+H8mJYdAl5FZz8vR4gIwWr SZG25Fuxy6g3aGkDHWpXcjB/xO38dRBt0cs1RojlxCM1pQ+fwfpsLBf+0KRBnjelJDliSG4Ds ugPaXD2XkSzs7vNY8E0QXeHlIIY= Precedence: bulk List-ID: X-Mailing-List: linux-integrity@vger.kernel.org From: Lino Sanfilippo This series enables IRQ support for the TPM TIS core. For this reason a number of bugfixes around the interrupt handling are required (patches 1 to 5). Patch 6 takes into account that according to the TPM Interface Specification stsValid and commandRead interrupts might not be supported by the hardware. For this reason the supported interrupts are first queried and stored. Then wait_for_tpm_stat() is adjusted to not wait for status changes that are not reported by interrupts. Patch 7 moves the interrupt flag checks into an own function as suggested by Jarkko. Patch 8 Removes the possibility that tpm_tis_data->locality can be changed at driver runtime so this variable can be read without the need to protect it against concurrent modification. Patch 9 addresses the issue with concurrent locality handling: Since the interrupt handler writes the interrupt status registers it needs to hold the locality. However it runs concurrently to the thread which triggered the interrupt (e.g. by reading or writing data to the TPM). So it must take care when claiming and releasing the locality itself, because it may race with the concurrent running thread which also claims and releases the locality. To avoid that both interrupt and concurrent running thread interfere with each other a locality counter is used which guarantees that at any time the locality is held as long as it is required by one of both execution paths. Patch 10 implements the request of a threaded interrupt handler. This is needed since SPI uses a mutex for data transmission and since we access the interrupt status register via SPI in the irq handler we need a sleepable context. Patch 11 makes sure that writes to the interrupt register are effective if done in the interrupt handler. Patch 12 makes sure that writes to the interrupt and INTERRUPT_VECTOR and INTERRUPT_ENABLE registers are effective by holding the locality. Patch 13 makes sure that the TPM is properly initialized after power cycle before the irq test is done. Patch 14 enables the test for interrupts by setting the required flag before the test is executed. Changes in v11: - adjust patches 4,5 and 14 slightly to void the consecutive removal and re-addition of the "ret" variable in tpm_tis_gen_interrupt() Changes in v10: - fix typo in subject line as pointed out by Jason Andryuk - improve patch "tpm, tpm_tis: Claim locality before writing interrupt registers" by extending the scope with held locality". For this reason the "Reviewed-by" tag by Jarko and the "Tested-by" tag by Michael have been removed. - add fix to avoid TPM_RC_INITIALIZE after power cycle when testing irqs (PATCH 13) - add fix to restore the old interrupt vector at error (PATCH 4) Changes in v9: - add a fix for an issue when interrupts are reenabled on resume (PATCH 11) - improve the commit message for patch 8 as requested by Jarkko - improved functions naming - changed patch 12 (tpm, tpm_tis: Enable interrupt test) to not delete the TPM_CHIP_FLAG_IRQ flag any more when tpm2_get_tpm_pt() fails. Due to this change the 'Tested-by' tag from Michael and the 'Reviewed-by:' tag from Jarko has been removed Changes in v8: - tpm_tis_data->locality is not changed at runtime any more so that it can be read without any protection against concurrent modification. - add missing brackets as pointed out by Jason Andryuk Changes in v7: - moved interrupt flag checks into an own function as suggested by Jarkko - added "Tested-by" tags for Tests from Michael Niewöhner - fixed one comment Changes in v6: - set TPM_TIS_IRQ_TESTED in flag member of the tpm_tis_data struct instead in an own bitfield - improve commit messages - use int_mask instead of irqs_in_use as variable name - use sts_mask instead of active_irqs as variable name - squash patch 5 and 6 - prefix functions with tpm_tis_ - remove "fixes" tag Changes in v5: - improve commit message of patch 1 as requested by Jarko - drop patch that makes locality handling simpler by only claiming it at driver startup and releasing it at driver shutdown (requested by Jarko) - drop patch that moves the interrupt test from tpm_tis_send() to tmp_tis_probe_irq_single() as requested by Jarko - add patch to make locality handling threadsafe so that it can also be done by the irq handler - separate logical changes into own patches - always request threaded interrupt handler Changes in v4: - only request threaded irq in case of SPI as requested by Jarko. - reimplement patch 2 to limit locality handling changes to the TIS core. - separate fixes from cleanups as requested by Jarko. - rephrase commit messages Changes in v3: - fixed compiler error reported by kernel test robot - rephrased commit message as suggested by Jarko Sakkinen - added Reviewed-by tag Changes in v2: - rebase against 5.12 - free irq on error path Lino Sanfilippo (14): tpm, tpm_tis: Avoid cache incoherency in test for interrupts tpm, tpm_tis: Claim locality before writing TPM_INT_ENABLE register tpm, tpm_tis: Disable interrupts if tpm_tis_probe_irq() failed tpm, tpm_tis: Do not skip reset of original interrupt vector tpm, tpm_tis: Claim locality before writing interrupt registers tpm, tpm_tis: Only handle supported interrupts tpm, tpm_tis: Move interrupt mask checks into own function tpm, tpm_tis: do not check for the active locality in interrupt handler tpm, tpm: Implement usage counter for locality tpm, tpm_tis: Request threaded interrupt handler tpm, tpm_tis: Claim locality in interrupt handler tpm, tpm_tis: Claim locality when interrupts are reenabled on resume tpm, tpm_tis: startup chip before testing for interrupts tpm, tpm_tis: Enable interrupt test drivers/char/tpm/tpm-chip.c | 38 ++-- drivers/char/tpm/tpm.h | 1 + drivers/char/tpm/tpm_tis.c | 2 +- drivers/char/tpm/tpm_tis_core.c | 299 ++++++++++++++++++++------------ drivers/char/tpm/tpm_tis_core.h | 5 +- 5 files changed, 214 insertions(+), 131 deletions(-) base-commit: 30a0b95b1335e12efef89dd78518ed3e4a71a763 Tested-by: Jarkko Sakkinen