drivers/pc80/tpm: Add some optional delay to tis_readresponse()
Certain TPMs (observed on Infineon SLB9635 installed on revolve 810 g1) seem to need some delay between tis_wait_valid() and tis_has_valid_data(), or tis_has_valid_data() may invalidly return 0, ending the loop immaturely with some bytes left unread, and fail to pass the check below, causing the current command not finalized by tis_command_ready(), and blocking any later tis_wait_ready(). This time the added delay is controlled by a Kconfig option TPM_RDRESP_NEED_DELAY. Change-Id: Ic2a2f252e72a0bbce51e2863f8e46647b1570ba5 Signed-off-by: Bill XIE <persmule@gmail.com> Reviewed-on: https://review.coreboot.org/25322 Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		
				
					committed by
					
						 Philipp Deppenwiese
						Philipp Deppenwiese
					
				
			
			
				
	
			
			
			
						parent
						
							c8412ed1f9
						
					
				
				
					commit
					a4bf0b7cd1
				
			| @@ -46,3 +46,12 @@ config TPM_DEACTIVATE | ||||
| 	depends on LPC_TPM | ||||
| 	help | ||||
| 	  Deactivate TPM by issuing deactivate command. | ||||
|  | ||||
| config TPM_RDRESP_NEED_DELAY | ||||
| 	bool "Enable Delay Workaround for TPM" | ||||
| 	default n | ||||
| 	depends on LPC_TPM | ||||
| 	help | ||||
| 	  Certain TPMs seem to need some delay when reading response | ||||
| 	  to work around a race-condition-related issue, possibly | ||||
| 	  caused by ill-programmed TPM firmware. | ||||
|   | ||||
| @@ -595,6 +595,14 @@ static u32 tis_readresponse(u8 *buffer, size_t *len) | ||||
| 		if (offset == expected_count) | ||||
| 			break;	/* We got all we need */ | ||||
|  | ||||
| 		/* | ||||
| 		 * Certain TPMs seem to need some delay between tis_wait_valid() | ||||
| 		 * and tis_has_valid_data(), or some race-condition-related | ||||
| 		 * issue will occur. | ||||
| 		 */ | ||||
| 		if (IS_ENABLED(CONFIG_TPM_RDRESP_NEED_DELAY)) | ||||
| 			udelay(10); | ||||
|  | ||||
| 	} while (tis_has_valid_data(locality)); | ||||
|  | ||||
| 	/* * Make sure we indeed read all there was. */ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user