Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753186AbcLCSmZ (ORCPT ); Sat, 3 Dec 2016 13:42:25 -0500 Received: from mga11.intel.com ([192.55.52.93]:18865 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751420AbcLCSlq (ORCPT ); Sat, 3 Dec 2016 13:41:46 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,294,1477983600"; d="scan'208";a="38636474" Date: Sat, 3 Dec 2016 20:41:37 +0200 From: Jarkko Sakkinen To: Peter Huewe Cc: Marcel Selhorst , Jason Gunthorpe , "moderated list:TPM DEVICE DRIVER" , open list , linux-security-module@vger.kernel.org Subject: Re: [PATCH v2 2/3] tpm_crb: encapsulate crb_wait_for_reg_32 Message-ID: <20161203184137.p4mk3gdldcflty5x@intel.com> References: <20161203175213.10210-1-jarkko.sakkinen@linux.intel.com> <20161203175213.10210-3-jarkko.sakkinen@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20161203175213.10210-3-jarkko.sakkinen@linux.intel.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 Content-Length: 2160 Lines: 73 CC linux-security-module On Sat, Dec 03, 2016 at 07:52:12PM +0200, Jarkko Sakkinen wrote: > Encapsulated crb_wait_for_reg32() so that state changes in other CRB > registers than TPM_CRB_CTRL_REQ_x can be waited. > > Signed-off-by: Jarkko Sakkinen > --- > drivers/char/tpm/tpm_crb.c | 37 +++++++++++++++++++++++-------------- > 1 file changed, 23 insertions(+), 14 deletions(-) > > diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c > index 8d81b66..f986d02 100644 > --- a/drivers/char/tpm/tpm_crb.c > +++ b/drivers/char/tpm/tpm_crb.c > @@ -121,6 +121,25 @@ static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv) > return 0; > } > > +static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value, > + unsigned long timeout) > +{ > + ktime_t start; > + ktime_t stop; > + > + start = ktime_get(); > + stop = ktime_add(start, ms_to_ktime(timeout)); > + > + do { > + if ((ioread32(reg) & mask) == value) > + return true; > + > + usleep_range(50, 100); > + } while (ktime_before(ktime_get(), stop)); > + > + return false; > +} > + > /** > * crb_cmd_ready - request tpm crb device to enter ready state > * > @@ -138,24 +157,14 @@ static int __maybe_unused crb_go_idle(struct device *dev, struct crb_priv *priv) > static int __maybe_unused crb_cmd_ready(struct device *dev, > struct crb_priv *priv) > { > - ktime_t stop, start; > - u32 req; > - > if (priv->flags & CRB_FL_ACPI_START) > return 0; > > iowrite32(CRB_CTRL_REQ_CMD_READY, &priv->regs_t->ctrl_req); > - > - start = ktime_get(); > - stop = ktime_add(start, ms_to_ktime(TPM2_TIMEOUT_C)); > - do { > - req = ioread32(&priv->regs_t->ctrl_req); > - if (!(req & CRB_CTRL_REQ_CMD_READY)) > - return 0; > - usleep_range(50, 100); > - } while (ktime_before(ktime_get(), stop)); > - > - if (ioread32(&priv->regs_t->ctrl_req) & CRB_CTRL_REQ_CMD_READY) { > + if (!crb_wait_for_reg_32(&priv->regs_t->ctrl_req, > + CRB_CTRL_REQ_CMD_READY /* mask */, > + 0, /* value */ > + TPM2_TIMEOUT_C)) { > dev_warn(dev, "cmdReady timed out\n"); > return -ETIME; > } > -- > 2.9.3 >