forked from mirrors/linux
		
	tpm: reduce poll sleep time in tpm_transmit()
tpm_try_transmit currently checks TPM status every 5 msecs between send and recv. It does so in a loop for the maximum timeout as defined in the TPM Interface Specification. However, the TPM may return before 5 msecs. Thus the polling interval for each iteration can be reduced, which improves overall performance. This patch changes the polling sleep time from 5 msecs to 1 msec. Additionally, this patch renames TPM_POLL_SLEEP to TPM_TIMEOUT_POLL and moves it to tpm.h as an enum value. After this change, performance on a system[1] with a TPM 1.2 with an 8 byte burstcount for 1000 extends improved from ~14 sec to ~10.7 sec. [1] All tests are performed on an x86 based, locked down, single purpose closed system. It has Infineon TPM 1.2 using LPC Bus. Signed-off-by: Nayna Jain <nayna@linux.vnet.ibm.com> Acked-by: Jay Freyensee <why2jjj.linux@gmail.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
This commit is contained in:
		
							parent
							
								
									33bafe9082
								
							
						
					
					
						commit
						59f5a6b07f
					
				
					 3 changed files with 5 additions and 10 deletions
				
			
		|  | @ -489,7 +489,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, | |||
| 			goto out; | ||||
| 		} | ||||
| 
 | ||||
| 		tpm_msleep(TPM_TIMEOUT); | ||||
| 		tpm_msleep(TPM_TIMEOUT_POLL); | ||||
| 		rmb(); | ||||
| 	} while (time_before(jiffies, stop)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -53,7 +53,8 @@ enum tpm_const { | |||
| enum tpm_timeout { | ||||
| 	TPM_TIMEOUT = 5,	/* msecs */ | ||||
| 	TPM_TIMEOUT_RETRY = 100, /* msecs */ | ||||
| 	TPM_TIMEOUT_RANGE_US = 300	/* usecs */ | ||||
| 	TPM_TIMEOUT_RANGE_US = 300,	/* usecs */ | ||||
| 	TPM_TIMEOUT_POLL = 1	/* msecs */ | ||||
| }; | ||||
| 
 | ||||
| /* TPM addresses */ | ||||
|  |  | |||
|  | @ -31,12 +31,6 @@ | |||
| #include "tpm.h" | ||||
| #include "tpm_tis_core.h" | ||||
| 
 | ||||
| /* This is a polling delay to check for status and burstcount.
 | ||||
|  * As per ddwg input, expectation is that status check and burstcount | ||||
|  * check should return within few usecs. | ||||
|  */ | ||||
| #define TPM_POLL_SLEEP	1  /* msec */ | ||||
| 
 | ||||
| static void tpm_tis_clkrun_enable(struct tpm_chip *chip, bool value); | ||||
| 
 | ||||
| static bool wait_for_tpm_stat_cond(struct tpm_chip *chip, u8 mask, | ||||
|  | @ -90,7 +84,7 @@ static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, | |||
| 		} | ||||
| 	} else { | ||||
| 		do { | ||||
| 			tpm_msleep(TPM_POLL_SLEEP); | ||||
| 			tpm_msleep(TPM_TIMEOUT_POLL); | ||||
| 			status = chip->ops->status(chip); | ||||
| 			if ((status & mask) == mask) | ||||
| 				return 0; | ||||
|  | @ -279,7 +273,7 @@ static int get_burstcount(struct tpm_chip *chip) | |||
| 		burstcnt = (value >> 8) & 0xFFFF; | ||||
| 		if (burstcnt) | ||||
| 			return burstcnt; | ||||
| 		tpm_msleep(TPM_POLL_SLEEP); | ||||
| 		tpm_msleep(TPM_TIMEOUT_POLL); | ||||
| 	} while (time_before(jiffies, stop)); | ||||
| 	return -EBUSY; | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Nayna Jain
						Nayna Jain