Refuse activation of tpm_tis driver if TPM is not working correctly
PATCH 1/1 Refuse activation of tpm_tis driver if TPM is not working correctly
Refuse activation of tpm_tis driver if the TPM is found not to be working correctly. This prevents suspend/resume problems for me on Lenovo W500 and T61p.
--- drivers/char/tpm/tpm_tis.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)
drivers/char/tpm/tpm_tis.c +13 -0
@@ -549,6 +549,7 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,u32 vendor, intfcaps, intmask;int rc, i, irq_s, irq_e;struct tpm_chip *chip; +u8 digest[TPM_DIGEST_SIZE ];if (!(chip =tpm_register_hardware (dev, &tpm_tis)))return -ENODEV ;
@@ -616,6 +617,18 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,/* get the timeouts before testing for irqs */ tpm_get_timeouts (chip); +/* test for correctly working TPM; refuse driver if not working +to prevent suspend/resume problems */ + rc =tpm_pcr_read (chip->dev_num,0 , digest); +if (rc !=0 ) { +dev_err (dev,"Could not read PCR 0. " +"TPM is not working correctly.\n" ); +dev_err (dev,"Was machine previously suspended without TPM " +"driver present?\n" ); + rc = -ENODEV ; + goto out_err; + } +/* INTERRUPT Setup */ init_waitqueue_head (&chip->vendor.read_queue);init_waitqueue_head (&chip->vendor.int_queue);
Signature · 1 line
1.7.6.4
Quoted 5 lines · Stefan Berger
Refuse activation of
tpm_tisdriver if the TPM is found not to be working correctly. This prevents suspend/resume problems for me on Lenovo W500 and T61p.Signed-off-by Stefan Berger<[email protected]>
Testing and trying to reproduce it here.
Rajiv
Quoted 36 lines
--- drivers/char/tpm/tpm_tis.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-)drivers/char/tpm/tpm_tis.c +13
-0@@ -549,6 +549,7 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,u32 vendor, intfcaps, intmask;int rc, i, irq_s, irq_e;struct tpm_chip *chip; +u8 digest[TPM_DIGEST_SIZE ];if (!(chip =tpm_register_hardware (dev,&tpm_tis)))return -ENODEV ;@@ -616,6 +617,18 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,/* get the timeouts before testing for irqs */ tpm_get_timeouts (chip); +/* test for correctly working TPM; refuse driver if not working +to prevent suspend/resume problems */ + rc =tpm_pcr_read (chip->dev_num,0 , digest); +if (rc !=0 ) { +dev_err (dev,"Could not read PCR 0. " +"TPM is not working correctly.\n" ); +dev_err (dev,"Was machine previously suspended without TPM " +"driver present?\n" ); + rc = -ENODEV ; + goto out_err; + } +/* INTERRUPT Setup */ init_waitqueue_head (&chip->vendor.read_queue);init_waitqueue_head (&chip->vendor.int_queue);
Quoted 7 lines · Rajiv Andrade
Quoted 5 lines · Stefan Berger
Refuse activation of
tpm_tisdriver if the TPM is found not to be working correctly. This prevents suspend/resume problems for me on Lenovo W500 and T61p.Signed-off-by Stefan Berger<[email protected]>Testing and trying to reproduce it here.
Yes, for some yet unknown reason the TPM doesn't respond after a suspend/resume in case it wasn't loaded before that. With this change/check, suspends work fine in this scenario for me as well. Applied to:
github.com/srajiv/tpm.git next-tpm-fixes
Thanks for the fix Stefan.
Rajiv