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
@@ -512,9 +512,17 @@ extern const struct file_operations tpm_fops;
|
||||
extern const struct file_operations tpmrm_fops;
|
||||
extern struct idr dev_nums_idr;
|
||||
|
||||
/**
|
||||
* enum tpm_transmit_flags
|
||||
*
|
||||
* @TPM_TRANSMIT_UNLOCKED: used to lock sequence of tpm_transmit calls.
|
||||
* @TPM_TRANSMIT_RAW: prevent recursive calls into setup steps
|
||||
* (go idle, locality,..). Always use with UNLOCKED
|
||||
* as it will fail on double locking.
|
||||
*/
|
||||
enum tpm_transmit_flags {
|
||||
TPM_TRANSMIT_UNLOCKED = BIT(0),
|
||||
TPM_TRANSMIT_RAW = BIT(1),
|
||||
TPM_TRANSMIT_UNLOCKED = BIT(0),
|
||||
TPM_TRANSMIT_RAW = BIT(1),
|
||||
};
|
||||
|
||||
ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
|
||||
|
Reference in New Issue
Block a user