Skip to content

Commit

Permalink
tpm: Enable hwrng only for Pluton on AMD CPUs
Browse files Browse the repository at this point in the history
commit 8f7f35e upstream.

The vendor check introduced by commit 554b841 ("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 on Lenovo Legion Y540 laptop.

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: 554b841 ("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
Reported-by: Patrick Steinhardt <ps@pks.im>
Reported-by: Raymond Jay Golo <rjgolo@gmail.com>
Reported-by: Ronan Pigott <ronan@rjp.ie>
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
Cc: Thorsten Leemhuis <regressions@leemhuis.info>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
jarkkojs authored and gregkh committed Sep 13, 2023
1 parent 9c8dab1 commit 181831d
Showing 1 changed file with 8 additions and 25 deletions.
33 changes: 8 additions & 25 deletions drivers/char/tpm/tpm_crb.c
Expand Up @@ -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,
Expand Down Expand Up @@ -826,9 +804,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);

Expand Down

0 comments on commit 181831d

Please sign in to comment.