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

Commit e3e1a1e1 authored by Stefan Berger's avatar Stefan Berger Committed by Rajiv Andrade
Browse files

tpm: Adjust interface timeouts if they are too small



Adjust the interface timeouts if they are found to be too small, i.e., if
they are returned in milliseconds rather than microseconds as we heared
from Infineon that some (old) Infineon TPMs do.

Signed-off-by: default avatarStefan Berger <stefanb@linux.vnet.ibm.com>
Signed-off-by: default avatarRajiv Andrade <srajiv@linux.vnet.ibm.com>
parent 829bf067
Loading
Loading
Loading
Loading
+9 −4
Original line number Original line Diff line number Diff line
@@ -534,6 +534,7 @@ void tpm_get_timeouts(struct tpm_chip *chip)
	struct duration_t *duration_cap;
	struct duration_t *duration_cap;
	ssize_t rc;
	ssize_t rc;
	u32 timeout;
	u32 timeout;
	unsigned int scale = 1;


	tpm_cmd.header.in = tpm_getcap_header;
	tpm_cmd.header.in = tpm_getcap_header;
	tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
	tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
@@ -553,17 +554,21 @@ void tpm_get_timeouts(struct tpm_chip *chip)
	timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
	timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
	/* Don't overwrite default if value is 0 */
	/* Don't overwrite default if value is 0 */
	timeout = be32_to_cpu(timeout_cap->a);
	timeout = be32_to_cpu(timeout_cap->a);
	if (timeout && timeout < 1000) {
		/* timeouts in msec rather usec */
		scale = 1000;
	}
	if (timeout)
	if (timeout)
		chip->vendor.timeout_a = usecs_to_jiffies(timeout);
		chip->vendor.timeout_a = usecs_to_jiffies(timeout * scale);
	timeout = be32_to_cpu(timeout_cap->b);
	timeout = be32_to_cpu(timeout_cap->b);
	if (timeout)
	if (timeout)
		chip->vendor.timeout_b = usecs_to_jiffies(timeout);
		chip->vendor.timeout_b = usecs_to_jiffies(timeout * scale);
	timeout = be32_to_cpu(timeout_cap->c);
	timeout = be32_to_cpu(timeout_cap->c);
	if (timeout)
	if (timeout)
		chip->vendor.timeout_c = usecs_to_jiffies(timeout);
		chip->vendor.timeout_c = usecs_to_jiffies(timeout * scale);
	timeout = be32_to_cpu(timeout_cap->d);
	timeout = be32_to_cpu(timeout_cap->d);
	if (timeout)
	if (timeout)
		chip->vendor.timeout_d = usecs_to_jiffies(timeout);
		chip->vendor.timeout_d = usecs_to_jiffies(timeout * scale);


duration:
duration:
	tpm_cmd.header.in = tpm_getcap_header;
	tpm_cmd.header.in = tpm_getcap_header;