Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938226AbdLRS1W (ORCPT ); Mon, 18 Dec 2017 13:27:22 -0500 Received: from mout.kundenserver.de ([212.227.126.134]:64464 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S937045AbdLRS1O (ORCPT ); Mon, 18 Dec 2017 13:27:14 -0500 Subject: Re: [BISECTED] tpm CLKRUN breaks PS/2 keyboard and touchpad on Braswell system To: Javier Martinez Canillas , Jarkko Sakkinen , Jason Gunthorpe Cc: linux-integrity@vger.kernel.org, azhar.shaikh@intel.com, linux-kernel@vger.kernel.org, james.l.morris@oracle.com References: <57d96314-cc9c-0656-186e-4eb77a132b70@ettle.org.uk> <34b361bf-cce7-a1ac-f8a3-76ef22f5b6b0@redhat.com> <5fb5de24-5a4c-4c01-1f72-49fc5844516c@ettle.org.uk> <011b4d29-9d93-4b7a-90dd-0c25cf184c3e@redhat.com> <20171214191052.GA20833@ziepe.ca> <20171215145630.ftsnj4azqqhzqwsh@linux.intel.com> <20171215173826.GD12434@ziepe.ca> <1513443676.29063.0.camel@linux.intel.com> <16609e73-e35d-4bb0-410d-e87915daba39@redhat.com> From: James Ettle Message-ID: <6b41f2a7-3b6e-69f2-fd49-d2ae774ff0f5@ettle.org.uk> Date: Mon, 18 Dec 2017 18:26:35 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <16609e73-e35d-4bb0-410d-e87915daba39@redhat.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 8bit X-Provags-ID: V03:K0:NX3M5TddKxXrmogTmQdFLDaYV3pw1gMxE97RUkFcC7Du+k5/O79 Trx+pjyRmODR/LzNBT2VqN9s+EPFz6un2THBdd3vAFq1hwsoTdTU9vDQu/BjgxbyQi0U+wG tqgKjp4K+/iuH+LiJl8BOowJinxQJjNnrECrvq6DEreEVCUrNSAyvRaMI3LGIoLa1EqMz3r q2QZLTFJrXXIN428JGd4w== X-UI-Out-Filterresults: notjunk:1;V01:K0:qzw4q2oB9Dk=:GPdszWhCf57pLqYULAs2WC L0dNEc4lyqX8gQSy0LWGCQZiVjLdcntJSsHj3gUFGUuJrCyikkqTnTtqT5eJsYQFQvL2V29+b dYdLtX0FtkQcNdTFhQVFkGEwA+HCxrCZfVTbs0DBfRx/V/9gdb/tTQSW7GAAcWoT2vY5QM1iR jPUpJaCFaVzrVzSPmFeGinBUCnXVeli2ZhgWhHS9zz0Xp8q6P5lh5XRU/9Feuu+sSPaBMPtFH rW70J1kUaZzhbIfjSROns/3zX8g+xTVnsXbXMiny2j2Iy3OC8LmFrQy3DP2ykyeTjfSzQD6Bm at88xHmuDLFslPHCUfvY83fSYakAu3BGFS1d0eIj1Eo1IpHVLUMVNJofU5i0zMN7wVzxBJuwG pfeG11arnNc7qfziVe/brnBpDHgT/PmXIEnf16jdZHebf0k/eEJlCcYVijhrdKovU4ZgjTb7T jq03b2GKUng058dFpqC+S1d03JbfclGWjLw/tQK96e5r2exArfCYg4+extmgA8sDTVx3ONTif ar43KbTmweOqlcpfLvDhYeJ0hchbQo9+Uq7BHmyqiD22QRLD7bRTcNSJmo9IFkeCrzPeF3t0m SL48rh6aMaRwMHwuGAt2CEHzKJJoPvS61dC0u0aCis6MenWYS1Xok9xzQJv59gQrN8iM7LQrp 8Y1p6OkDP48NH00XYIt/UvT2hgeMrpEabFNMcTmJKEysUKc1JZNVIkP6jj5NAyATELzO1Wu65 Qxrh1UpvhsxqIn+BLl0XerJGpAzZKDWheZidohLd5EGfU8/3/6vH9ngnOW8= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3834 Lines: 109 The keyboard and touchpad work OK with the patch quoted below and the earlier two applied, i.e. the three patches with signatures: 667dcc75be864ff4c17cf58891853b7393bba3e2 db3248e8a036c39141c8f7e9f1cf5c5ae6815f76 370d45a34dc8914066a995a3a6d6df1953ea9f60 I applied these to a vanilla kernel.org 4.14.7 source using Fedora 4.14.5-300.fc27 .config. Confirmed the tpm modules are loaded. Tests: 1. Keyboard and touchpad work OK on boot - PASS 2. Still work after suspend/resume - PASS Let me know if you want any further tests. Many thanks, James. On 18/12/17 12:29, Javier Martinez Canillas wrote: > On 12/18/2017 01:22 PM, Javier Martinez Canillas wrote: > > [snip] > >> >> James, >> >> Can you please test the following (untested) patch on top of the other two >> mentioned patches to see if it makes a difference for you? >> > > I should had tried to at least compile the patch :) > > Updated patch below: > > From 370d45a34dc8914066a995a3a6d6df1953ea9f60 Mon Sep 17 00:00:00 2001 > From: Javier Martinez Canillas > Date: Mon, 18 Dec 2017 12:56:28 +0100 > Subject: [PATCH v2] tpm: only attempt to disable the LPC CLKRUN if is already > enabled > > Commit 5e572cab92f0 ("tpm: Enable CLKRUN protocol for Braswell systems") > added logic in the TPM TIS driver to disable the Low Pin Count CLKRUN > signal during TPM transactions. > > Unfortunately this breaks other devices that are attached to the LPC bus > like for example PS/2 mouse and keyboards. > > One flaw with the logic is that it assumes that the CLKRUN is always > enabled, and so it unconditionally enables it after a TPM transaction. > > But it could be that the CLKRUN signal was already disabled in the LPC > bus and so after the driver probes, the signal will remain enabled which > may break other devices transactions since the clocks will be restarted > by the CLKRUN# signal. > > Fixes: 5e572cab92f0 ("tpm: Enable CLKRUN protocol for Braswell systems") > Signed-off-by: Javier Martinez Canillas > --- > drivers/char/tpm/tpm_tis_core.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index e7bd2e750f69..5f2b1fc2194f 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -688,7 +688,8 @@ static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool value) > struct tpm_tis_data *data = dev_get_drvdata(&chip->dev); > u32 clkrun_val; > > - if (!IS_ENABLED(CONFIG_X86) || !is_bsw()) > + if (!IS_ENABLED(CONFIG_X86) || !is_bsw() || > + !data->ilb_base_addr) > return; > > if (value) { > @@ -746,7 +747,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > const struct tpm_tis_phy_ops *phy_ops, > acpi_handle acpi_dev_handle) > { > - u32 vendor, intfcaps, intmask; > + u32 vendor, intfcaps, intmask, clkrun_val; > u8 rid; > int rc, probe; > struct tpm_chip *chip; > @@ -772,6 +773,14 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > ILB_REMAP_SIZE); > if (!priv->ilb_base_addr) > return -ENOMEM; > + > + clkrun_val = ioread32(priv->ilb_base_addr + LPC_CNTRL_OFFSET); > + /* Check if CLKRUN# is already not enabled in the LPC bus */ > + if (!(clkrun_val & LPC_CLKRUN_EN)) { > + priv->flags |= TPM_TIS_CLK_ENABLE; > + iounmap(priv->ilb_base_addr); > + priv->ilb_base_addr = NULL; > + } > } > > if (chip->ops->clk_enable != NULL) > @@ -868,7 +877,7 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > } > > rc = tpm_chip_register(chip); > - if (rc && is_bsw()) > + if (rc && is_bsw() && priv->ilb_base_addr) > iounmap(priv->ilb_base_addr); > > if (chip->ops->clk_enable != NULL) >