* [PATCH v2] tpm_tis: convert to using locality callbacks
@ 2017-03-27 15:46 Jerry Snitselaar
[not found] ` <20170327154604.10744-1-jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 2+ messages in thread
From: Jerry Snitselaar @ 2017-03-27 15:46 UTC (permalink / raw)
To: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA
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 <peterhuewe-Mmb7MZpHnFY@public.gmane.org>
Cc: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
Cc: Jason Gunthorpe <jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org>
Cc: Marcel Selhorst <tpmdd-yWjUBOtONefk1uMJSBkQmQ@public.gmane.org>
Signed-off-by: Jerry Snitselaar <jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
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
^ permalink raw reply related [flat|nested] 2+ messages in thread[parent not found: <20170327154604.10744-1-jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH v2] tpm_tis: convert to using locality callbacks [not found] ` <20170327154604.10744-1-jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2017-04-05 12:17 ` Jarkko Sakkinen 0 siblings, 0 replies; 2+ messages in thread From: Jarkko Sakkinen @ 2017-04-05 12:17 UTC (permalink / raw) To: Jerry Snitselaar Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, linux-kernel-u79uwXL29TY76Z2rM5mHXA 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 <peterhuewe-Mmb7MZpHnFY@public.gmane.org> > Cc: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org> > Cc: Jason Gunthorpe <jgunthorpe-ePGOBjL8dl3ta4EC/59zMFaTQe2KTcn/@public.gmane.org> > Cc: Marcel Selhorst <tpmdd-yWjUBOtONefk1uMJSBkQmQ@public.gmane.org> > Signed-off-by: Jerry Snitselaar <jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-04-05 12:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-27 15:46 [PATCH v2] tpm_tis: convert to using locality callbacks Jerry Snitselaar
[not found] ` <20170327154604.10744-1-jsnitsel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2017-04-05 12:17 ` Jarkko Sakkinen
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).