Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f257402 authored by Jarkko Sakkinen's avatar Jarkko Sakkinen
Browse files

tpm: remove TPM_TRANSMIT_UNLOCKED flag



Added locking as part of tpm_try_get_ops() and tpm_put_ops() as they are
anyway used in most of the call sites except in tpmrm_release() where we
take the locks manually.

Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Reviewed-by: default avatarStefan Berger <stefanb@linux.ibm.com>
Tested-by: default avatarStefan Berger <stefanb@linux.ibm.com>
Reviewed-by: default avatarJerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Tested-by: default avatarAlexander Steffen <Alexander.Steffen@infineon.com>
parent 2677ca98
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ int tpm_try_get_ops(struct tpm_chip *chip)
	if (!chip->ops)
		goto out_lock;

	mutex_lock(&chip->tpm_mutex);
	return 0;
out_lock:
	up_read(&chip->ops_sem);
@@ -75,6 +76,7 @@ EXPORT_SYMBOL_GPL(tpm_try_get_ops);
 */
void tpm_put_ops(struct tpm_chip *chip)
{
	mutex_unlock(&chip->tpm_mutex);
	up_read(&chip->ops_sem);
	put_device(&chip->dev);
}
+3 −6
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space,
	struct tpm_header *header = (void *)buf;
	ssize_t ret, len;

	mutex_lock(&chip->tpm_mutex);
	ret = tpm2_prepare_space(chip, space, buf, bufsiz);
	/* If the command is not implemented by the TPM, synthesize a
	 * response with a TPM2_RC_COMMAND_CODE return for user-space.
@@ -46,18 +45,16 @@ static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space,
		ret = sizeof(*header);
	}
	if (ret)
		goto out_lock;
		goto out_rc;

	len = tpm_transmit(chip, buf, bufsiz, TPM_TRANSMIT_UNLOCKED);
	len = tpm_transmit(chip, buf, bufsiz, 0);
	if (len < 0)
		ret = len;

	if (!ret)
		ret = tpm2_commit_space(chip, space, buf, &len);

out_lock:
	mutex_unlock(&chip->tpm_mutex);

out_rc:
	return ret ? ret : len;
}

+0 −8
Original line number Diff line number Diff line
@@ -236,10 +236,6 @@ ssize_t tpm_transmit(struct tpm_chip *chip, u8 *buf, size_t bufsiz,
	memcpy(save, buf, save_size);

	for (;;) {
		if (!(flags & TPM_TRANSMIT_UNLOCKED) &&
		    !(flags & TPM_TRANSMIT_NESTED))
			mutex_lock(&chip->tpm_mutex);

		if (chip->ops->clk_enable != NULL)
			chip->ops->clk_enable(chip, true);

@@ -266,10 +262,6 @@ ssize_t tpm_transmit(struct tpm_chip *chip, u8 *buf, size_t bufsiz,
		if (chip->ops->clk_enable != NULL)
			chip->ops->clk_enable(chip, false);

		if (!(flags & TPM_TRANSMIT_UNLOCKED) &&
		    !(flags & TPM_TRANSMIT_NESTED))
			mutex_unlock(&chip->tpm_mutex);

		if (ret < 0)
			break;
		rc = be32_to_cpu(header->return_code);
+2 −6
Original line number Diff line number Diff line
@@ -488,14 +488,10 @@ extern struct idr dev_nums_idr;
/**
 * enum tpm_transmit_flags - flags for tpm_transmit()
 *
 * @TPM_TRANSMIT_UNLOCKED:	do not lock the chip
 * @TPM_TRANSMIT_NESTED:	discard setup steps (power management,
 *				locality) including locking (i.e. implicit
 *				UNLOCKED)
 * %TPM_TRANSMIT_NESTED:	discard setup steps (power management, locality)
 */
enum tpm_transmit_flags {
	TPM_TRANSMIT_UNLOCKED	= BIT(0),
	TPM_TRANSMIT_NESTED      = BIT(1),
	TPM_TRANSMIT_NESTED      = BIT(0),
};

ssize_t tpm_transmit(struct tpm_chip *chip, u8 *buf, size_t bufsiz,
+4 −9
Original line number Diff line number Diff line
@@ -652,17 +652,12 @@ int tpm2_unseal_trusted(struct tpm_chip *chip,
	u32 blob_handle;
	int rc;

	mutex_lock(&chip->tpm_mutex);
	rc = tpm2_load_cmd(chip, payload, options, &blob_handle,
			   TPM_TRANSMIT_UNLOCKED);
	rc = tpm2_load_cmd(chip, payload, options, &blob_handle, 0);
	if (rc)
		goto out;
		return rc;

	rc = tpm2_unseal_cmd(chip, payload, options, blob_handle,
			     TPM_TRANSMIT_UNLOCKED);
	tpm2_flush_context_cmd(chip, blob_handle, TPM_TRANSMIT_UNLOCKED);
out:
	mutex_unlock(&chip->tpm_mutex);
	rc = tpm2_unseal_cmd(chip, payload, options, blob_handle, 0);
	tpm2_flush_context_cmd(chip, blob_handle, 0);
	return rc;
}

Loading