Message ID | 20170324101032.13496-1-jarkko.sakkinen@iki.fi |
---|---|
State | New |
Headers | show |
On Fri, Mar 24, 2017 at 12:10:30PM +0200, Jarkko Sakkinen wrote: > This commit adds support for requesting and relinquishing locality 0 in > tpm_crb for the course of command transmission. > > In order to achieve this, two new callbacks are added to struct > tpm_class_ops: > > - request_locality > - relinquish_locality > > With CRB interface you first set either requestAccess or relinquish bit > from TPM_LOC_CTRL_x register and then wait for locAssigned and > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > The reason why were are doing this is to make sure that the driver > will work properly with Intel TXT that uses locality 2. There's no > explicit guarantee that it would relinquish this locality. In more > general sense this commit enables tpm_crb to be a well behaving > citizen in a multi locality environment. > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > --- > v2: > - TPM driver level calllbacks > v3: > - Call ops->relinquish_locality only if ops->request_locality has been > successful. > - Do not reserve locality in nested tpm_transmit calls. > - Check for tpmRegValidSts to make sure that the value in TPM_LOC_STATE_x is > stable. > v4: > - Removed tpm_tis_core changes. It needs to be done separately. It will be > postponed to 4.13. > - Store locality to struct tpm_chip while active. > drivers/char/tpm/tpm-chip.c | 1 + > drivers/char/tpm/tpm-interface.c | 13 +++++++++++++ > drivers/char/tpm/tpm.h | 3 +++ > drivers/char/tpm/tpm_crb.c | 41 ++++++++++++++++++++++++++++++++++++++++ > include/linux/tpm.h | 3 ++- > 5 files changed, 60 insertions(+), 1 deletion(-) > > diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c > index aade699..a321bd5 100644 > --- a/drivers/char/tpm/tpm-chip.c > +++ b/drivers/char/tpm/tpm-chip.c > @@ -231,6 +231,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev, > goto out; > } > > + chip->locality = -1; > return chip; > > out: > diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c > index 95c6f98..1815666 100644 > --- a/drivers/char/tpm/tpm-interface.c > +++ b/drivers/char/tpm/tpm-interface.c > @@ -384,6 +384,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, > ssize_t len = 0; > u32 count, ordinal; > unsigned long stop; > + bool need_locality = chip->locality == -1; This must be set *after* taking the mutex. Otherwise, I think this should be fine now. /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Jarkko Sakkinen @ 2017-03-24 10:10 GMT: > This commit adds support for requesting and relinquishing locality 0 in > tpm_crb for the course of command transmission. > > In order to achieve this, two new callbacks are added to struct > tpm_class_ops: > > - request_locality > - relinquish_locality > > With CRB interface you first set either requestAccess or relinquish bit > from TPM_LOC_CTRL_x register and then wait for locAssigned and > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > The reason why were are doing this is to make sure that the driver > will work properly with Intel TXT that uses locality 2. There's no > explicit guarantee that it would relinquish this locality. In more > general sense this commit enables tpm_crb to be a well behaving > citizen in a multi locality environment. > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> Tested-by: Jerry Snitselaar <jsnitsel@redhat.com> Tested on kabylake system that was hitting issues with earlier iteration. Still don't have platform to test it dealing with multi-locality enviroment. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Jarkko Sakkinen @ 2017-03-24 10:19 GMT: > On Fri, Mar 24, 2017 at 12:10:30PM +0200, Jarkko Sakkinen wrote: >> This commit adds support for requesting and relinquishing locality 0 in >> tpm_crb for the course of command transmission. >> >> In order to achieve this, two new callbacks are added to struct >> tpm_class_ops: >> >> - request_locality >> - relinquish_locality >> >> With CRB interface you first set either requestAccess or relinquish bit >> from TPM_LOC_CTRL_x register and then wait for locAssigned and >> tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. >> >> The reason why were are doing this is to make sure that the driver >> will work properly with Intel TXT that uses locality 2. There's no >> explicit guarantee that it would relinquish this locality. In more >> general sense this commit enables tpm_crb to be a well behaving >> citizen in a multi locality environment. >> >> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> >> --- >> v2: >> - TPM driver level calllbacks >> v3: >> - Call ops->relinquish_locality only if ops->request_locality has been >> successful. >> - Do not reserve locality in nested tpm_transmit calls. >> - Check for tpmRegValidSts to make sure that the value in TPM_LOC_STATE_x is >> stable. >> v4: >> - Removed tpm_tis_core changes. It needs to be done separately. It will be >> postponed to 4.13. >> - Store locality to struct tpm_chip while active. >> drivers/char/tpm/tpm-chip.c | 1 + >> drivers/char/tpm/tpm-interface.c | 13 +++++++++++++ >> drivers/char/tpm/tpm.h | 3 +++ >> drivers/char/tpm/tpm_crb.c | 41 ++++++++++++++++++++++++++++++++++++++++ >> include/linux/tpm.h | 3 ++- >> 5 files changed, 60 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c >> index aade699..a321bd5 100644 >> --- a/drivers/char/tpm/tpm-chip.c >> +++ b/drivers/char/tpm/tpm-chip.c >> @@ -231,6 +231,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev, >> goto out; >> } >> >> + chip->locality = -1; >> return chip; >> >> out: >> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c >> index 95c6f98..1815666 100644 >> --- a/drivers/char/tpm/tpm-interface.c >> +++ b/drivers/char/tpm/tpm-interface.c >> @@ -384,6 +384,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, >> ssize_t len = 0; >> u32 count, ordinal; >> unsigned long stop; >> + bool need_locality = chip->locality == -1; > > This must be set *after* taking the mutex. Otherwise, I think this > should be fine now. > > /Jarkko Sorry, I missed this email earlier. Yeah, I ran into this while trying to get the tpm_tis code working with this change tonight. Are you just going to move the assignment to right before the if block for request_locality? I've tested with the assignment moved inside the mutex on a kabylake system. I also tested with a patch for adding support to tpm_tis on a tpm_tis system, but that is a work in progress. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
On Sat, Mar 25, 2017 at 05:21:30AM -0700, Jerry Snitselaar wrote: > > Jarkko Sakkinen @ 2017-03-24 10:19 GMT: > > > On Fri, Mar 24, 2017 at 12:10:30PM +0200, Jarkko Sakkinen wrote: > >> This commit adds support for requesting and relinquishing locality 0 in > >> tpm_crb for the course of command transmission. > >> > >> In order to achieve this, two new callbacks are added to struct > >> tpm_class_ops: > >> > >> - request_locality > >> - relinquish_locality > >> > >> With CRB interface you first set either requestAccess or relinquish bit > >> from TPM_LOC_CTRL_x register and then wait for locAssigned and > >> tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > >> > >> The reason why were are doing this is to make sure that the driver > >> will work properly with Intel TXT that uses locality 2. There's no > >> explicit guarantee that it would relinquish this locality. In more > >> general sense this commit enables tpm_crb to be a well behaving > >> citizen in a multi locality environment. > >> > >> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > >> --- > >> v2: > >> - TPM driver level calllbacks > >> v3: > >> - Call ops->relinquish_locality only if ops->request_locality has been > >> successful. > >> - Do not reserve locality in nested tpm_transmit calls. > >> - Check for tpmRegValidSts to make sure that the value in TPM_LOC_STATE_x is > >> stable. > >> v4: > >> - Removed tpm_tis_core changes. It needs to be done separately. It will be > >> postponed to 4.13. > >> - Store locality to struct tpm_chip while active. > >> drivers/char/tpm/tpm-chip.c | 1 + > >> drivers/char/tpm/tpm-interface.c | 13 +++++++++++++ > >> drivers/char/tpm/tpm.h | 3 +++ > >> drivers/char/tpm/tpm_crb.c | 41 ++++++++++++++++++++++++++++++++++++++++ > >> include/linux/tpm.h | 3 ++- > >> 5 files changed, 60 insertions(+), 1 deletion(-) > >> > >> diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c > >> index aade699..a321bd5 100644 > >> --- a/drivers/char/tpm/tpm-chip.c > >> +++ b/drivers/char/tpm/tpm-chip.c > >> @@ -231,6 +231,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev, > >> goto out; > >> } > >> > >> + chip->locality = -1; > >> return chip; > >> > >> out: > >> diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c > >> index 95c6f98..1815666 100644 > >> --- a/drivers/char/tpm/tpm-interface.c > >> +++ b/drivers/char/tpm/tpm-interface.c > >> @@ -384,6 +384,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, > >> ssize_t len = 0; > >> u32 count, ordinal; > >> unsigned long stop; > >> + bool need_locality = chip->locality == -1; > > > > This must be set *after* taking the mutex. Otherwise, I think this > > should be fine now. > > > > /Jarkko > > Sorry, I missed this email earlier. Yeah, I ran into this while trying to get the > tpm_tis code working with this change tonight. Are you just going to move the > assignment to right before the if block for request_locality? I've > tested with the assignment moved inside the mutex on a kabylake > system. > > I also tested with a patch for adding support to tpm_tis on a tpm_tis > system, but that is a work in progress. Yes. It's like that now in the locality branch in my tree. /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
On Fri, Mar 24, 2017 at 11:25:57AM -0700, Jerry Snitselaar wrote: > > Jarkko Sakkinen @ 2017-03-24 10:10 GMT: > > > This commit adds support for requesting and relinquishing locality 0 in > > tpm_crb for the course of command transmission. > > > > In order to achieve this, two new callbacks are added to struct > > tpm_class_ops: > > > > - request_locality > > - relinquish_locality > > > > With CRB interface you first set either requestAccess or relinquish bit > > from TPM_LOC_CTRL_x register and then wait for locAssigned and > > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > > > The reason why were are doing this is to make sure that the driver > > will work properly with Intel TXT that uses locality 2. There's no > > explicit guarantee that it would relinquish this locality. In more > > general sense this commit enables tpm_crb to be a well behaving > > citizen in a multi locality environment. > > > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> > Tested-by: Jerry Snitselaar <jsnitsel@redhat.com> > > Tested on kabylake system that was hitting issues with earlier > iteration. Still don't have platform to test it dealing with > multi-locality enviroment. I believe Jimmy (Gang Wei) has done such testing. Jimmy can you confirm and possibly do re-test (there's a locality branch in my tree to ease the testing) so that we could land this one? /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
On Sat, Mar 25, 2017 at 09:52:11PM +0200, Jarkko Sakkinen wrote: > On Fri, Mar 24, 2017 at 11:25:57AM -0700, Jerry Snitselaar wrote: > > > > Jarkko Sakkinen @ 2017-03-24 10:10 GMT: > > > > > This commit adds support for requesting and relinquishing locality 0 in > > > tpm_crb for the course of command transmission. > > > > > > In order to achieve this, two new callbacks are added to struct > > > tpm_class_ops: > > > > > > - request_locality > > > - relinquish_locality > > > > > > With CRB interface you first set either requestAccess or relinquish bit > > > from TPM_LOC_CTRL_x register and then wait for locAssigned and > > > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > > > > > The reason why were are doing this is to make sure that the driver > > > will work properly with Intel TXT that uses locality 2. There's no > > > explicit guarantee that it would relinquish this locality. In more > > > general sense this commit enables tpm_crb to be a well behaving > > > citizen in a multi locality environment. > > > > > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > > > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> > > Tested-by: Jerry Snitselaar <jsnitsel@redhat.com> > > > > Tested on kabylake system that was hitting issues with earlier > > iteration. Still don't have platform to test it dealing with > > multi-locality enviroment. > > I believe Jimmy (Gang Wei) has done such testing. Jimmy can you confirm > and possibly do re-test (there's a locality branch in my tree to ease > the testing) so that we could land this one? > > /Jarkko I applied this to my master and next branches. /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
----- Original Message ----- > From: "Jarkko Sakkinen" <jarkko.sakkinen@linux.intel.com> > To: "Jerry Snitselaar" <jsnitsel@redhat.com>, "gang wei" <gang.wei@intel.com> > Cc: "Jarkko Sakkinen" <jarkko.sakkinen@iki.fi>, tpmdd-devel@lists.sourceforge.net, > linux-security-module@vger.kernel.org, "Peter Huewe" <peterhuewe@gmx.de>, "Marcel Selhorst" <tpmdd@selhorst.net>, > "Jason Gunthorpe" <jgunthorpe@obsidianresearch.com>, "open list" <linux-kernel@vger.kernel.org> > Sent: Sunday, March 26, 2017 3:52:39 AM > Subject: Re: [PATCH v4] tpm_crb: request and relinquish locality 0 > > On Sat, Mar 25, 2017 at 09:52:11PM +0200, Jarkko Sakkinen wrote: > > On Fri, Mar 24, 2017 at 11:25:57AM -0700, Jerry Snitselaar wrote: > > > > > > Jarkko Sakkinen @ 2017-03-24 10:10 GMT: > > > > > > > This commit adds support for requesting and relinquishing locality 0 in > > > > tpm_crb for the course of command transmission. > > > > > > > > In order to achieve this, two new callbacks are added to struct > > > > tpm_class_ops: > > > > > > > > - request_locality > > > > - relinquish_locality > > > > > > > > With CRB interface you first set either requestAccess or relinquish bit > > > > from TPM_LOC_CTRL_x register and then wait for locAssigned and > > > > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > > > > > > > The reason why were are doing this is to make sure that the driver > > > > will work properly with Intel TXT that uses locality 2. There's no > > > > explicit guarantee that it would relinquish this locality. In more > > > > general sense this commit enables tpm_crb to be a well behaving > > > > citizen in a multi locality environment. > > > > > > > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > > > > > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> > > > Tested-by: Jerry Snitselaar <jsnitsel@redhat.com> > > > > > > Tested on kabylake system that was hitting issues with earlier > > > iteration. Still don't have platform to test it dealing with > > > multi-locality enviroment. > > > > I believe Jimmy (Gang Wei) has done such testing. Jimmy can you confirm > > and possibly do re-test (there's a locality branch in my tree to ease > > the testing) so that we could land this one? > > > > /Jarkko > > I applied this to my master and next branches. > > /Jarkko > Hi Jarkko, The patch applied to next and master doesn't have the assignment moved inside the mutex. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
On Sun, Mar 26, 2017 at 12:39:29PM -0400, Jerry Snitselaar wrote: > > > ----- Original Message ----- > > From: "Jarkko Sakkinen" <jarkko.sakkinen@linux.intel.com> > > To: "Jerry Snitselaar" <jsnitsel@redhat.com>, "gang wei" <gang.wei@intel.com> > > Cc: "Jarkko Sakkinen" <jarkko.sakkinen@iki.fi>, tpmdd-devel@lists.sourceforge.net, > > linux-security-module@vger.kernel.org, "Peter Huewe" <peterhuewe@gmx.de>, "Marcel Selhorst" <tpmdd@selhorst.net>, > > "Jason Gunthorpe" <jgunthorpe@obsidianresearch.com>, "open list" <linux-kernel@vger.kernel.org> > > Sent: Sunday, March 26, 2017 3:52:39 AM > > Subject: Re: [PATCH v4] tpm_crb: request and relinquish locality 0 > > > > On Sat, Mar 25, 2017 at 09:52:11PM +0200, Jarkko Sakkinen wrote: > > > On Fri, Mar 24, 2017 at 11:25:57AM -0700, Jerry Snitselaar wrote: > > > > > > > > Jarkko Sakkinen @ 2017-03-24 10:10 GMT: > > > > > > > > > This commit adds support for requesting and relinquishing locality 0 in > > > > > tpm_crb for the course of command transmission. > > > > > > > > > > In order to achieve this, two new callbacks are added to struct > > > > > tpm_class_ops: > > > > > > > > > > - request_locality > > > > > - relinquish_locality > > > > > > > > > > With CRB interface you first set either requestAccess or relinquish bit > > > > > from TPM_LOC_CTRL_x register and then wait for locAssigned and > > > > > tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. > > > > > > > > > > The reason why were are doing this is to make sure that the driver > > > > > will work properly with Intel TXT that uses locality 2. There's no > > > > > explicit guarantee that it would relinquish this locality. In more > > > > > general sense this commit enables tpm_crb to be a well behaving > > > > > citizen in a multi locality environment. > > > > > > > > > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > > > > > > > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> > > > > Tested-by: Jerry Snitselaar <jsnitsel@redhat.com> > > > > > > > > Tested on kabylake system that was hitting issues with earlier > > > > iteration. Still don't have platform to test it dealing with > > > > multi-locality enviroment. > > > > > > I believe Jimmy (Gang Wei) has done such testing. Jimmy can you confirm > > > and possibly do re-test (there's a locality branch in my tree to ease > > > the testing) so that we could land this one? > > > > > > /Jarkko > > > > I applied this to my master and next branches. > > > > /Jarkko > > > > Hi Jarkko, > > The patch applied to next and master doesn't have the assignment moved > inside the mutex. WTF, I applied old patch version by mistake. Sorry about that and thanks for spotting that out. Better? /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Jarkko Sakkinen @ 2017-03-26 19:51 GMT: > WTF, I applied old patch version by mistake. Sorry about that and > thanks for spotting that out. Better? > > /Jarkko Looks good now. ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
On Sun, Mar 26, 2017 at 03:42:12PM -0700, Jerry Snitselaar wrote: > > Jarkko Sakkinen @ 2017-03-26 19:51 GMT: > > > WTF, I applied old patch version by mistake. Sorry about that and > > thanks for spotting that out. Better? > > > > /Jarkko > > > Looks good now. Great, thanks. /Jarkko ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index aade699..a321bd5 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -231,6 +231,7 @@ struct tpm_chip *tpm_chip_alloc(struct device *pdev, goto out; } + chip->locality = -1; return chip; out: diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c index 95c6f98..1815666 100644 --- a/drivers/char/tpm/tpm-interface.c +++ b/drivers/char/tpm/tpm-interface.c @@ -384,6 +384,7 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, ssize_t len = 0; u32 count, ordinal; unsigned long stop; + bool need_locality = chip->locality == -1; if (!tpm_validate_command(chip, buf, bufsiz)) return -EINVAL; @@ -407,6 +408,13 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, if (chip->dev.parent) pm_runtime_get_sync(chip->dev.parent); + if (need_locality && chip->ops->request_locality) { + rc = chip->ops->request_locality(chip, 0); + if (rc < 0) + goto out_no_locality; + chip->locality = rc; + } + rc = tpm2_prepare_space(chip, space, ordinal, buf); if (rc) goto out; @@ -466,6 +474,11 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space, rc = tpm2_commit_space(chip, space, ordinal, buf, &len); out: + if (need_locality && chip->ops->relinquish_locality) { + chip->ops->relinquish_locality(chip, 0); + chip->locality = -1; + } +out_no_locality: if (chip->dev.parent) pm_runtime_put_sync(chip->dev.parent); diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h index 5eacb3f..4b4c8de 100644 --- a/drivers/char/tpm/tpm.h +++ b/drivers/char/tpm/tpm.h @@ -228,6 +228,9 @@ struct tpm_chip { struct tpm_space work_space; u32 nr_commands; u32 *cc_attrs_tbl; + + /* active locality */ + int locality; }; #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev) diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index 9f31609..d91e47d 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c @@ -34,6 +34,16 @@ enum crb_defaults { CRB_ACPI_START_INDEX = 1, }; +enum crb_loc_ctrl { + CRB_LOC_CTRL_REQUEST_ACCESS = BIT(0), + CRB_LOC_CTRL_RELINQUISH = BIT(1), +}; + +enum crb_loc_state { + CRB_LOC_STATE_LOC_ASSIGNED = BIT(1), + CRB_LOC_STATE_TPM_REG_VALID_STS = BIT(7), +}; + enum crb_ctrl_req { CRB_CTRL_REQ_CMD_READY = BIT(0), CRB_CTRL_REQ_GO_IDLE = BIT(1), @@ -172,6 +182,35 @@ static int __maybe_unused crb_cmd_ready(struct device *dev, return 0; } +static int crb_request_locality(struct tpm_chip *chip, int loc) +{ + struct crb_priv *priv = dev_get_drvdata(&chip->dev); + u32 value = CRB_LOC_STATE_LOC_ASSIGNED | + CRB_LOC_STATE_TPM_REG_VALID_STS; + + if (!priv->regs_h) + return 0; + + iowrite32(CRB_LOC_CTRL_REQUEST_ACCESS, &priv->regs_h->loc_ctrl); + if (!crb_wait_for_reg_32(&priv->regs_h->loc_state, value, value, + TPM2_TIMEOUT_C)) { + dev_warn(&chip->dev, "TPM_LOC_STATE_x.requestAccess timed out\n"); + return -ETIME; + } + + return 0; +} + +static void crb_relinquish_locality(struct tpm_chip *chip, int loc) +{ + struct crb_priv *priv = dev_get_drvdata(&chip->dev); + + if (!priv->regs_h) + return; + + iowrite32(CRB_LOC_CTRL_RELINQUISH, &priv->regs_h->loc_ctrl); +} + static u8 crb_status(struct tpm_chip *chip) { struct crb_priv *priv = dev_get_drvdata(&chip->dev); @@ -278,6 +317,8 @@ static const struct tpm_class_ops tpm_crb = { .send = crb_send, .cancel = crb_cancel, .req_canceled = crb_req_canceled, + .request_locality = crb_request_locality, + .relinquish_locality = crb_relinquish_locality, .req_complete_mask = CRB_DRV_STS_COMPLETE, .req_complete_val = CRB_DRV_STS_COMPLETE, }; diff --git a/include/linux/tpm.h b/include/linux/tpm.h index da158f0..5a090f5 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -48,7 +48,8 @@ struct tpm_class_ops { u8 (*status) (struct tpm_chip *chip); bool (*update_timeouts)(struct tpm_chip *chip, unsigned long *timeout_cap); - + int (*request_locality)(struct tpm_chip *chip, int loc); + void (*relinquish_locality)(struct tpm_chip *chip, int loc); }; #if defined(CONFIG_TCG_TPM) || defined(CONFIG_TCG_TPM_MODULE)
This commit adds support for requesting and relinquishing locality 0 in tpm_crb for the course of command transmission. In order to achieve this, two new callbacks are added to struct tpm_class_ops: - request_locality - relinquish_locality With CRB interface you first set either requestAccess or relinquish bit from TPM_LOC_CTRL_x register and then wait for locAssigned and tpmRegValidSts bits to be set in the TPM_LOC_STATE_x register. The reason why were are doing this is to make sure that the driver will work properly with Intel TXT that uses locality 2. There's no explicit guarantee that it would relinquish this locality. In more general sense this commit enables tpm_crb to be a well behaving citizen in a multi locality environment. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> --- v2: - TPM driver level calllbacks v3: - Call ops->relinquish_locality only if ops->request_locality has been successful. - Do not reserve locality in nested tpm_transmit calls. - Check for tpmRegValidSts to make sure that the value in TPM_LOC_STATE_x is stable. v4: - Removed tpm_tis_core changes. It needs to be done separately. It will be postponed to 4.13. - Store locality to struct tpm_chip while active. drivers/char/tpm/tpm-chip.c | 1 + drivers/char/tpm/tpm-interface.c | 13 +++++++++++++ drivers/char/tpm/tpm.h | 3 +++ drivers/char/tpm/tpm_crb.c | 41 ++++++++++++++++++++++++++++++++++++++++ include/linux/tpm.h | 3 ++- 5 files changed, 60 insertions(+), 1 deletion(-)