mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
tpm: separate cmd_ready/go_idle from runtime_pm
Fix tpm ptt initialization error: tpm tpm0: A TPM error (378) occurred get tpm pcr allocation. We cannot use go_idle cmd_ready commands via runtime_pm handles as with the introduction of localities this is no longer an optional feature, while runtime pm can be not enabled. Though cmd_ready/go_idle provides a power saving, it's also a part of TPM2 protocol and should be called explicitly. This patch exposes cmd_read/go_idle via tpm class ops and removes runtime pm support as it is not used by any driver. When calling from nested context always use both flags: TPM_TRANSMIT_UNLOCKED and TPM_TRANSMIT_RAW. Both are needed to resolve tpm spaces and locality request recursive calls to tpm_transmit(). TPM_TRANSMIT_RAW should never be used standalone as it will fail on double locking. While TPM_TRANSMIT_UNLOCKED standalone should be called from non-recursive locked contexts. New wrappers are added tpm_cmd_ready() and tpm_go_idle() to streamline tpm_try_transmit code. tpm_crb no longer needs own power saving functions and can drop using tpm_pm_suspend/resume. This patch cannot be really separated from the locality fix. Fixes:888d867df4(tpm: cmd_ready command can be issued only after granting locality) Cc: stable@vger.kernel.org Fixes:888d867df4(tpm: cmd_ready command can be issued only after granting locality) Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
This commit is contained in:
committed by
Jarkko Sakkinen
parent
79e2472f99
commit
627448e85c
@@ -43,6 +43,8 @@ struct tpm_class_ops {
|
||||
u8 (*status) (struct tpm_chip *chip);
|
||||
bool (*update_timeouts)(struct tpm_chip *chip,
|
||||
unsigned long *timeout_cap);
|
||||
int (*go_idle)(struct tpm_chip *chip);
|
||||
int (*cmd_ready)(struct tpm_chip *chip);
|
||||
int (*request_locality)(struct tpm_chip *chip, int loc);
|
||||
int (*relinquish_locality)(struct tpm_chip *chip, int loc);
|
||||
void (*clk_enable)(struct tpm_chip *chip, bool value);
|
||||
|
||||
Reference in New Issue
Block a user