diff options
Diffstat (limited to 'drivers/char/tpm/tpm-chip.c')
| -rw-r--r-- | drivers/char/tpm/tpm-chip.c | 83 | 
1 files changed, 14 insertions, 69 deletions
diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c index cf5499e51999..ea6b4013bc38 100644 --- a/drivers/char/tpm/tpm-chip.c +++ b/drivers/char/tpm/tpm-chip.c @@ -510,70 +510,6 @@ static int tpm_add_legacy_sysfs(struct tpm_chip *chip)  	return 0;  } -/* - * Some AMD fTPM versions may cause stutter - * https://www.amd.com/en/support/kb/faq/pa-410 - * - * Fixes are available in two series of fTPM firmware: - * 6.x.y.z series: 6.0.18.6 + - * 3.x.y.z series: 3.57.y.5 + - */ -#ifdef CONFIG_X86 -static bool tpm_amd_is_rng_defective(struct tpm_chip *chip) -{ -	u32 val1, val2; -	u64 version; -	int ret; - -	if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) -		return false; - -	ret = tpm_request_locality(chip); -	if (ret) -		return false; - -	ret = tpm2_get_tpm_pt(chip, TPM2_PT_MANUFACTURER, &val1, NULL); -	if (ret) -		goto release; -	if (val1 != 0x414D4400U /* AMD */) { -		ret = -ENODEV; -		goto release; -	} -	ret = tpm2_get_tpm_pt(chip, TPM2_PT_FIRMWARE_VERSION_1, &val1, NULL); -	if (ret) -		goto release; -	ret = tpm2_get_tpm_pt(chip, TPM2_PT_FIRMWARE_VERSION_2, &val2, NULL); - -release: -	tpm_relinquish_locality(chip); - -	if (ret) -		return false; - -	version = ((u64)val1 << 32) | val2; -	if ((version >> 48) == 6) { -		if (version >= 0x0006000000180006ULL) -			return false; -	} else if ((version >> 48) == 3) { -		if (version >= 0x0003005700000005ULL) -			return false; -	} else { -		return false; -	} - -	dev_warn(&chip->dev, -		 "AMD fTPM version 0x%llx causes system stutter; hwrng disabled\n", -		 version); - -	return true; -} -#else -static inline bool tpm_amd_is_rng_defective(struct tpm_chip *chip) -{ -	return false; -} -#endif /* CONFIG_X86 */ -  static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)  {  	struct tpm_chip *chip = container_of(rng, struct tpm_chip, hwrng); @@ -585,10 +521,20 @@ static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)  	return tpm_get_random(chip, data, max);  } +static bool tpm_is_hwrng_enabled(struct tpm_chip *chip) +{ +	if (!IS_ENABLED(CONFIG_HW_RANDOM_TPM)) +		return false; +	if (tpm_is_firmware_upgrade(chip)) +		return false; +	if (chip->flags & TPM_CHIP_FLAG_HWRNG_DISABLED) +		return false; +	return true; +} +  static int tpm_add_hwrng(struct tpm_chip *chip)  { -	if (!IS_ENABLED(CONFIG_HW_RANDOM_TPM) || tpm_is_firmware_upgrade(chip) || -	    tpm_amd_is_rng_defective(chip)) +	if (!tpm_is_hwrng_enabled(chip))  		return 0;  	snprintf(chip->hwrng_name, sizeof(chip->hwrng_name), @@ -693,7 +639,7 @@ int tpm_chip_register(struct tpm_chip *chip)  	return 0;  out_hwrng: -	if (IS_ENABLED(CONFIG_HW_RANDOM_TPM) && !tpm_is_firmware_upgrade(chip)) +	if (tpm_is_hwrng_enabled(chip))  		hwrng_unregister(&chip->hwrng);  out_ppi:  	tpm_bios_log_teardown(chip); @@ -718,8 +664,7 @@ EXPORT_SYMBOL_GPL(tpm_chip_register);  void tpm_chip_unregister(struct tpm_chip *chip)  {  	tpm_del_legacy_sysfs(chip); -	if (IS_ENABLED(CONFIG_HW_RANDOM_TPM) && !tpm_is_firmware_upgrade(chip) && -	    !tpm_amd_is_rng_defective(chip)) +	if (tpm_is_hwrng_enabled(chip))  		hwrng_unregister(&chip->hwrng);  	tpm_bios_log_teardown(chip);  	if (chip->flags & TPM_CHIP_FLAG_TPM2 && !tpm_is_firmware_upgrade(chip))  | 
