Skip to contentSkip to conversation

tpm, tpm_tis: Extend locality handling to TPM2 in tpm_tis_gen_interrupt()

PATCH In review Jarkko Sakkinen 2 participants 4 messages May 10, 2021 – May 11, 2021

Subsystems (3)
lore
Share & tools
lore

Jarkko Sakkinen

author maintainer
#0 lore raw

PATCH 1/2 tpm, tpm_tis: Extend locality handling to TPM2 in tpm_tis_gen_interrupt()

The earlier fix (linked) only partially fixed the locality handling bug in tpm_tis_gen_interrupt(), i.e. only for TPM 1.x.

Extend the locality handling to cover TPM2.

Cc Hans de Goede <[email protected]>
Fixes a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")

---

v1:
* Testing done with Intel NUC5i5MYHE with SLB9665 TPM2 chip.

 drivers/char/tpm/tpm_tis_core.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/char/tpm/tpm_tis_core.c +4 -6
index a2e0395cbe61..6fa150a3b75e 100644
@@ -709,16 +709,14 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
 	cap_t cap;
 	int ret;
 
-	/* TPM 2.0 */
-	if (chip->flags & TPM_CHIP_FLAG_TPM2)
-		return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
-
-	/* TPM 1.2 */
 	ret = request_locality(chip, 0);
 	if (ret < 0)
 		return ret;
 
-	ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
+	if (chip->flags & TPM_CHIP_FLAG_TPM2)
+		ret = tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+	else
+		ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
 
 	release_locality(chip, 0);
 
Signature · 1 line
2.31.1
author maintainer
#1 lore raw

PATCH 2/2 tpm, tpm_tis: Reserve locality in tpm_tis_resume()

Reserve locality in tpm_tis_resume(), as it could be unsert after waking up from a sleep state.

Cc Lino Sanfilippo <[email protected]>
Fixes a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")

---

v1:
* Testing done with Intel NUC5i5MYHE containing SLB9665 TPM 2.0 chip.
* The used test case: "echo mee | sudo tee /sys/power/state" executed without issues.

 drivers/char/tpm/tpm_tis_core.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/char/tpm/tpm_tis_core.c +10 -2
index 6fa150a3b75e..55b9d3965ae1 100644
@@ -1125,12 +1125,20 @@ int tpm_tis_resume(struct device *dev)
 	if (ret)
 		return ret;
 
-	/* TPM 1.2 requires self-test on resume. This function actually returns
+	/*
+	 * TPM 1.2 requires self-test on resume. This function actually returns
 	 * an error code but for unknown reason it isn't handled.
 	 */
-	if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
+	if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) {
+		ret = request_locality(chip, 0);
+		if (ret < 0)
+			return ret;
+
 		tpm1_do_selftest(chip);
 
+		release_locality(chip, 0);
+	}
+
 	return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_resume);
Signature · 1 line
2.31.1
Tested-by on v1 1/2
#2 lore raw
In reply to Jarkko Sakkinen

Hi,

Quoted 35 lines · Jarkko Sakkinen

The earlier fix (linked) only partially fixed the locality handling bug in tpm_tis_gen_interrupt(), i.e. only for TPM 1.x.

Extend the locality handling to cover TPM2.

Cc Hans de Goede <[email protected]>
Fixes a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")

---

v1:
* Testing done with Intel NUC5i5MYHE with SLB9665 TPM2 chip.

 drivers/char/tpm/tpm_tis_core.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/char/tpm/tpm_tis_core.c +0 -5
index a2e0395cbe61..6fa150a3b75e 100644
@@ -709,16 +709,14 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
 	cap_t cap;
 	int ret;
 
-	/* TPM 2.0 */
-	if (chip->flags & TPM_CHIP_FLAG_TPM2)
-		return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
-
-	/* TPM 1.2 */
 	ret = request_locality(chip, 0);
 	if (ret < 0)

drivers/char/tpm/tpm_tis_core.c static int tpm_tis_gen_interrupt(struct tpm_chip *chip) · line 722

Quoted 10 lines
drivers/char/tpm/tpm_tis_core.c +4 -1
 		return ret;
 
-	ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
+	if (chip->flags & TPM_CHIP_FLAG_TPM2)
+		ret = tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+	else
+		ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
 
 	release_locality(chip, 0);
 

This fix works for me. Tested on a SLB9670vq2.0 and the warning message is gone.

Regards,
Lino

author maintainer
#3 lore raw
Quoted 51 lines · Lino Sanfilippo

Hi,

Quoted 35 lines · Jarkko Sakkinen

The earlier fix (linked) only partially fixed the locality handling bug in tpm_tis_gen_interrupt(), i.e. only for TPM 1.x.

Extend the locality handling to cover TPM2.

Cc Hans de Goede <[email protected]>
Fixes a3fbfae82b4c ("tpm: take TPM chip power gating out of tpm_transmit()")

---

v1:
* Testing done with Intel NUC5i5MYHE with SLB9665 TPM2 chip.

 drivers/char/tpm/tpm_tis_core.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)
drivers/char/tpm/tpm_tis_core.c +0 -5
index a2e0395cbe61..6fa150a3b75e 100644
@@ -709,16 +709,14 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
 	cap_t cap;
 	int ret;
 
-	/* TPM 2.0 */
-	if (chip->flags & TPM_CHIP_FLAG_TPM2)
-		return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
-
-	/* TPM 1.2 */
 	ret = request_locality(chip, 0);
 	if (ret < 0)

drivers/char/tpm/tpm_tis_core.c static int tpm_tis_gen_interrupt(struct tpm_chip *chip) · line 722

Quoted 10 lines
drivers/char/tpm/tpm_tis_core.c +4 -1
 		return ret;
 
-	ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
+	if (chip->flags & TPM_CHIP_FLAG_TPM2)
+		ret = tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
+	else
+		ret = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc, 0);
 
 	release_locality(chip, 0);
 

This fix works for me. Tested on a SLB9670vq2.0 and the warning message is gone.

Quoted 4 lines

Regards,
Lino

Thanks a lot, I'll add your tag.

/Jarkko