From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932698AbdDEMSY (ORCPT ); Wed, 5 Apr 2017 08:18:24 -0400 Received: from mga04.intel.com ([192.55.52.120]:61163 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754516AbdDEMRm (ORCPT ); Wed, 5 Apr 2017 08:17:42 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,278,1486454400"; d="scan'208";a="842204206" Date: Wed, 5 Apr 2017 15:17:39 +0300 From: Jarkko Sakkinen To: Jerry Snitselaar Cc: tpmdd-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, Peter Huewe , Jason Gunthorpe , Marcel Selhorst Subject: Re: [PATCH v2] tpm_tis: convert to using locality callbacks Message-ID: <20170405121739.gdv65qquowxdkzvw@intel.com> References: <20170327154604.10744-1-jsnitsel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170327154604.10744-1-jsnitsel@redhat.com> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo User-Agent: Mutt/1.6.2-neo (2016-08-21) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Mar 27, 2017 at 08:46:04AM -0700, Jerry Snitselaar wrote: > This patch converts tpm_tis to use of the new tpm class ops > request_locality, and relinquish_locality. > > With the move to using the callbacks, release_locality is changed so > that we now release the locality even if there is no request pending. > > This required some changes to the tpm_tis_core_init code path to > make sure locality is requested when needed: > > - tpm2_probe code path will end up calling request/release through > callbacks, so request_locality prior to tpm2_probe not needed. > > - probe_itpm makes calls to tpm_tis_send_data which no longer calls > request_locality, so add request_locality prior to tpm_tis_send_data > calls. Also drop release_locality call in middleof probe_itpm, and > keep locality until release_locality called at end of probe_itpm. > > Cc: Peter Huewe > Cc: Jarkko Sakkinen > Cc: Jason Gunthorpe > Cc: Marcel Selhorst > Signed-off-by: Jerry Snitselaar I'll give Reviewed-by for this and it's already in my master branch but not yet in next because I haven't been able to test it yet. Tested-by's are very welcome and testing should be easy to do as the change is already pushed. Thank you for doing this. /Jarkko > --- > v2: drop release_locality call in tpm_tis_remove > > drivers/char/tpm/tpm_tis_core.c | 34 ++++++++-------------------------- > 1 file changed, 8 insertions(+), 26 deletions(-) > > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index f31fc831c8f9..b617b2eeb080 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -75,21 +75,11 @@ static bool check_locality(struct tpm_chip *chip, int l) > return false; > } > > -static void release_locality(struct tpm_chip *chip, int l, int force) > +static void release_locality(struct tpm_chip *chip, int l) > { > struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); > - int rc; > - u8 access; > - > - rc = tpm_tis_read8(priv, TPM_ACCESS(l), &access); > - if (rc < 0) > - return; > - > - if (force || (access & > - (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) == > - (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) > - tpm_tis_write8(priv, TPM_ACCESS(l), TPM_ACCESS_ACTIVE_LOCALITY); > > + tpm_tis_write8(priv, TPM_ACCESS(l), TPM_ACCESS_ACTIVE_LOCALITY); > } > > static int request_locality(struct tpm_chip *chip, int l) > @@ -254,7 +244,6 @@ static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count) > > out: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return size; > } > > @@ -270,9 +259,6 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > size_t count = 0; > bool itpm = priv->flags & TPM_TIS_ITPM_WORKAROUND; > > - if (request_locality(chip, 0) < 0) > - return -EBUSY; > - > status = tpm_tis_status(chip); > if ((status & TPM_STS_COMMAND_READY) == 0) { > tpm_tis_ready(chip); > @@ -331,7 +317,6 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > > out_err: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return rc; > } > > @@ -392,7 +377,6 @@ static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len) > return len; > out_err: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return rc; > } > > @@ -479,12 +463,14 @@ static int probe_itpm(struct tpm_chip *chip) > if (vendor != TPM_VID_INTEL) > return 0; > > + if (request_locality(chip, 0) != 0) > + return -EBUSY; > + > rc = tpm_tis_send_data(chip, cmd_getticks, len); > if (rc == 0) > goto out; > > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > > priv->flags |= TPM_TIS_ITPM_WORKAROUND; > > @@ -498,7 +484,7 @@ static int probe_itpm(struct tpm_chip *chip) > > out: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > + release_locality(chip, priv->locality); > > return rc; > } > @@ -672,7 +658,6 @@ void tpm_tis_remove(struct tpm_chip *chip) > interrupt = 0; > > tpm_tis_write32(priv, reg, ~TPM_GLOBAL_INT_ENABLE & interrupt); > - release_locality(chip, priv->locality, 1); > } > EXPORT_SYMBOL_GPL(tpm_tis_remove); > > @@ -686,6 +671,8 @@ static const struct tpm_class_ops tpm_tis = { > .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, > .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, > .req_canceled = tpm_tis_req_canceled, > + .request_locality = request_locality, > + .relinquish_locality = release_locality, > }; > > int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > @@ -728,11 +715,6 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > intmask &= ~TPM_GLOBAL_INT_ENABLE; > tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask); > > - if (request_locality(chip, 0) != 0) { > - rc = -ENODEV; > - goto out_err; > - } > - > rc = tpm2_probe(chip); > if (rc) > goto out_err; > -- > 2.11.0.258.ge05806da9 > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jarkko Sakkinen Subject: Re: [PATCH v2] tpm_tis: convert to using locality callbacks Date: Wed, 5 Apr 2017 15:17:39 +0300 Message-ID: <20170405121739.gdv65qquowxdkzvw@intel.com> References: <20170327154604.10744-1-jsnitsel@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <20170327154604.10744-1-jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: tpmdd-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: Jerry Snitselaar Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: tpmdd-devel@lists.sourceforge.net On Mon, Mar 27, 2017 at 08:46:04AM -0700, Jerry Snitselaar wrote: > This patch converts tpm_tis to use of the new tpm class ops > request_locality, and relinquish_locality. > > With the move to using the callbacks, release_locality is changed so > that we now release the locality even if there is no request pending. > > This required some changes to the tpm_tis_core_init code path to > make sure locality is requested when needed: > > - tpm2_probe code path will end up calling request/release through > callbacks, so request_locality prior to tpm2_probe not needed. > > - probe_itpm makes calls to tpm_tis_send_data which no longer calls > request_locality, so add request_locality prior to tpm_tis_send_data > calls. Also drop release_locality call in middleof probe_itpm, and > keep locality until release_locality called at end of probe_itpm. > > Cc: Peter Huewe > Cc: Jarkko Sakkinen > Cc: Jason Gunthorpe > Cc: Marcel Selhorst > Signed-off-by: Jerry Snitselaar I'll give Reviewed-by for this and it's already in my master branch but not yet in next because I haven't been able to test it yet. Tested-by's are very welcome and testing should be easy to do as the change is already pushed. Thank you for doing this. /Jarkko > --- > v2: drop release_locality call in tpm_tis_remove > > drivers/char/tpm/tpm_tis_core.c | 34 ++++++++-------------------------- > 1 file changed, 8 insertions(+), 26 deletions(-) > > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index f31fc831c8f9..b617b2eeb080 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -75,21 +75,11 @@ static bool check_locality(struct tpm_chip *chip, int l) > return false; > } > > -static void release_locality(struct tpm_chip *chip, int l, int force) > +static void release_locality(struct tpm_chip *chip, int l) > { > struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); > - int rc; > - u8 access; > - > - rc = tpm_tis_read8(priv, TPM_ACCESS(l), &access); > - if (rc < 0) > - return; > - > - if (force || (access & > - (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) == > - (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) > - tpm_tis_write8(priv, TPM_ACCESS(l), TPM_ACCESS_ACTIVE_LOCALITY); > > + tpm_tis_write8(priv, TPM_ACCESS(l), TPM_ACCESS_ACTIVE_LOCALITY); > } > > static int request_locality(struct tpm_chip *chip, int l) > @@ -254,7 +244,6 @@ static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count) > > out: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return size; > } > > @@ -270,9 +259,6 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > size_t count = 0; > bool itpm = priv->flags & TPM_TIS_ITPM_WORKAROUND; > > - if (request_locality(chip, 0) < 0) > - return -EBUSY; > - > status = tpm_tis_status(chip); > if ((status & TPM_STS_COMMAND_READY) == 0) { > tpm_tis_ready(chip); > @@ -331,7 +317,6 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > > out_err: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return rc; > } > > @@ -392,7 +377,6 @@ static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len) > return len; > out_err: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > return rc; > } > > @@ -479,12 +463,14 @@ static int probe_itpm(struct tpm_chip *chip) > if (vendor != TPM_VID_INTEL) > return 0; > > + if (request_locality(chip, 0) != 0) > + return -EBUSY; > + > rc = tpm_tis_send_data(chip, cmd_getticks, len); > if (rc == 0) > goto out; > > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > > priv->flags |= TPM_TIS_ITPM_WORKAROUND; > > @@ -498,7 +484,7 @@ static int probe_itpm(struct tpm_chip *chip) > > out: > tpm_tis_ready(chip); > - release_locality(chip, priv->locality, 0); > + release_locality(chip, priv->locality); > > return rc; > } > @@ -672,7 +658,6 @@ void tpm_tis_remove(struct tpm_chip *chip) > interrupt = 0; > > tpm_tis_write32(priv, reg, ~TPM_GLOBAL_INT_ENABLE & interrupt); > - release_locality(chip, priv->locality, 1); > } > EXPORT_SYMBOL_GPL(tpm_tis_remove); > > @@ -686,6 +671,8 @@ static const struct tpm_class_ops tpm_tis = { > .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID, > .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID, > .req_canceled = tpm_tis_req_canceled, > + .request_locality = request_locality, > + .relinquish_locality = release_locality, > }; > > int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > @@ -728,11 +715,6 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, > intmask &= ~TPM_GLOBAL_INT_ENABLE; > tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask); > > - if (request_locality(chip, 0) != 0) { > - rc = -ENODEV; > - goto out_err; > - } > - > rc = tpm2_probe(chip); > if (rc) > goto out_err; > -- > 2.11.0.258.ge05806da9 > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot