On Wed, Aug 23, 2023 at 02:15:10AM +0300, Jarkko Sakkinen wrote:
The vendor check introduced by commit 554b841d4703 ("tpm: Disable RNG for all AMD fTPMs") doesn't work properly on a number of Intel fTPMs. On the reported systems the TPM doesn't reply at bootup and returns back the command code. This makes the TPM fail probe.
Since only Microsoft Pluton is the only known combination of AMD CPU and fTPM from other vendor, disable hwrng otherwise. In order to make sysadmin aware of this, print also info message to the klog.
Cc: stable@vger.kernel.org Fixes: 554b841d4703 ("tpm: Disable RNG for all AMD fTPMs") Reported-by: Todd Brandt todd.e.brandt@intel.com Closes: https://bugzilla.kernel.org/show_bug.cgi?id=217804 Signed-off-by: Jarkko Sakkinen jarkko@kernel.org
v3:
- Forgot to amend config flags.
v2:
- CONFIG_X86
- Removed "Reviewed-by: Jarkko Sakkinen jarkko@kernel.org"
- Removed "Signed-off-by: Mario Limonciello mario.limonciello@amd.com"
drivers/char/tpm/tpm_crb.c | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-)
It looks like stable should be pinged as well. I saw a report yesterday for Fedora where someone is seeing issue where the tpm device no longer shows up with a 6.4.11 kernel. That kernel pulled in commit 554b841d4703. It pulled in a couple other tpm commits, and there is practically no info in the bug at this point, but I'm guessing the probe is failing due to 554b841d4703.
diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index 65ff4d2fbe8d..ea085b14ab7c 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c @@ -463,28 +463,6 @@ static bool crb_req_canceled(struct tpm_chip *chip, u8 status) return (cancel & CRB_CANCEL_INVOKE) == CRB_CANCEL_INVOKE; } -static int crb_check_flags(struct tpm_chip *chip) -{
- u32 val;
- int ret;
- ret = crb_request_locality(chip, 0);
- if (ret)
return ret;
- ret = tpm2_get_tpm_pt(chip, TPM2_PT_MANUFACTURER, &val, NULL);
- if (ret)
goto release;
- if (val == 0x414D4400U /* AMD */)
chip->flags |= TPM_CHIP_FLAG_HWRNG_DISABLED;
-release:
- crb_relinquish_locality(chip, 0);
- return ret;
-}
static const struct tpm_class_ops tpm_crb = { .flags = TPM_OPS_AUTO_STARTUP, .status = crb_status, @@ -827,9 +805,14 @@ static int crb_acpi_add(struct acpi_device *device) if (rc) goto out;
- rc = crb_check_flags(chip);
- if (rc)
goto out;
+#ifdef CONFIG_X86
- /* A quirk for https://www.amd.com/en/support/kb/faq/pa-410 */
- if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
priv->sm != ACPI_TPM2_COMMAND_BUFFER_WITH_PLUTON) {
dev_info(dev, "Disabling hwrng\n");
chip->flags |= TPM_CHIP_FLAG_HWRNG_DISABLED;
- }
+#endif /* CONFIG_X86 */ rc = tpm_chip_register(chip); -- 2.39.2