On Thu, Dec 21, 2017 at 6:19 PM, <alexander.stef...@infineon.com> wrote: >> Hi, >> We have a desktop which has S3 suspend (to RAM) problem due to >> error messages as follows. >> [ 198.908282] tpm tpm0: Error (38) sending savestate before suspend >> [ 198.908289] __pnp_bus_suspend(): tpm_pm_suspend+0x0/0x160 returns >> 38 >> [ 198.908293] dpm_run_callback(): pnp_bus_suspend+0x0/0x20 returns 38 >> [ 198.908298] PM: Device 00:0b failed to suspend: error 38 >> >> However, the first suspend after boot is working although it still >> shows an interesting message during resume. >> [ 155.789945] tpm tpm0: A TPM error (38) occurred continue selftest >> >> The error code 38 in definition is TPM_ERR_INVALID_POSTINIT. I >> found some explanations which said this error code means that this >> command was received in the wrong sequence relative to a TPM_Startup >> command. Don't really know what happens here and how should I deal >> with this? Any suggestions? Please let me know what else information >> should I provide. Thanks >> >> Chris > > Just from looking at the code, this seems to be an issue in tpm_tis_resume. > > When the device is not a TPM 2.0, it tries to execute the selftests, but > ignores the results. In your case the selftests fail during resume, but since > the error is ignored, the TPM device is still present (though non-functional) > and so breaks the subsequent suspend. > > In addition, from the error code we can tell that it is not actually a > selftest failure. INVALID_POSTINIT for a command other than TPM_Startup means > that no TPM_Startup has been executed for that power cycle yet, so the TPM > has to reject all other commands. Usually, the platform sends the TPM_Startup > command, but not in your case apparently. > > The correct solution should be something like tpm2_auto_startup (execute > selftests, if they fail because of the missing startup command, execute that > and retry the selftests). Interestingly, tpm1_auto_startup (same purpose as > tpm2_auto_startup, but for TPM 1.2 instead) does not use the same sequence, > the startup-retry part is missing. Is there any reason this is done > differently for TPM 1.2? Otherwise I'd propose to make tpm1_auto_startup > follow the same sequence as tpm2_auto_startup and then call both from > tpm_tis_resume, similar to what tpm_chip_register does. > > Alexander
You mean do tpm1(or 2)_auto_startup when I fail selftest with error code 38? Then it should retry until the TPM state back to correct state? Chris