Merge tag 'tpmdd-next-v5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 30 Jun 2021 18:23:33 +0000 (11:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 30 Jun 2021 18:23:33 +0000 (11:23 -0700)
Pull tpm driver updates from Jarkko Sakkinen:
 "Bug fixes for TPM"

[ This isn't actually the whole contents of the tag and thus doesn't
  contain Jarkko's signature - I dropped the two top commits that added
  support for signing modules using elliptic curve keys because there's
  a new series for that that fixes a few confising things   - Linus ]

* tag 'tpmdd-next-v5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd:
  tpm: Replace WARN_ONCE() with dev_err_once() in tpm_tis_status()
  tpm_tis: Use DEFINE_RES_MEM() to simplify code
  tpm: fix some doc warnings in tpm1-cmd.c
  tpm_tis_spi: add missing SPI device ID entries
  tpm: add longer timeout for TPM2_CC_VERIFY_SIGNATURE
  char: tpm: move to use request_irq by IRQF_NO_AUTOEN flag
  tpm_tis_spi: set default probe function if device id not match
  tpm_crb: Use IOMEM_ERR_PTR when function returns iomem

drivers/char/tpm/tpm1-cmd.c
drivers/char/tpm/tpm2-cmd.c
drivers/char/tpm/tpm_crb.c
drivers/char/tpm/tpm_tis.c
drivers/char/tpm/tpm_tis_core.c
drivers/char/tpm/tpm_tis_core.h
drivers/char/tpm/tpm_tis_i2c_cr50.c
drivers/char/tpm/tpm_tis_spi_main.c

index ca7158f..f7dc986 100644 (file)
@@ -312,7 +312,7 @@ unsigned long tpm1_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
 #define TPM_ST_CLEAR 1
 
 /**
- * tpm_startup() - turn on the TPM
+ * tpm1_startup() - turn on the TPM
  * @chip: TPM chip to use
  *
  * Normally the firmware should start the TPM. This function is provided as a
@@ -611,7 +611,7 @@ out:
 
 #define TPM_ORD_CONTINUE_SELFTEST 83
 /**
- * tpm_continue_selftest() - run TPM's selftest
+ * tpm1_continue_selftest() - run TPM's selftest
  * @chip: TPM chip to use
  *
  * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
index c84d239..a25815a 100644 (file)
@@ -87,7 +87,7 @@ static u8 tpm2_ordinal_duration_index(u32 ordinal)
                return TPM_MEDIUM;
 
        case TPM2_CC_VERIFY_SIGNATURE:        /* 177 */
-               return TPM_LONG;
+               return TPM_LONG_LONG;
 
        case TPM2_CC_PCR_EXTEND:              /* 182 */
                return TPM_MEDIUM;
index a9dcf31..1860665 100644 (file)
@@ -464,7 +464,7 @@ static void __iomem *crb_map_res(struct device *dev, struct resource *iores,
 
        /* Detect a 64 bit address on a 32 bit system */
        if (start != new_res.start)
-               return (void __iomem *) ERR_PTR(-EINVAL);
+               return IOMEM_ERR_PTR(-EINVAL);
 
        if (!iores)
                return devm_ioremap_resource(dev, &new_res);
index 4ed6e66..d3f2e53 100644 (file)
@@ -363,11 +363,7 @@ static int tpm_tis_force_device(void)
 {
        struct platform_device *pdev;
        static const struct resource x86_resources[] = {
-               {
-                       .start = 0xFED40000,
-                       .end = 0xFED40000 + TIS_MEM_LEN - 1,
-                       .flags = IORESOURCE_MEM,
-               },
+               DEFINE_RES_MEM(0xFED40000, TIS_MEM_LEN)
        };
 
        if (!force)
index 55b9d39..69579ef 100644 (file)
@@ -196,13 +196,24 @@ static u8 tpm_tis_status(struct tpm_chip *chip)
                return 0;
 
        if (unlikely((status & TPM_STS_READ_ZERO) != 0)) {
-               /*
-                * If this trips, the chances are the read is
-                * returning 0xff because the locality hasn't been
-                * acquired.  Usually because tpm_try_get_ops() hasn't
-                * been called before doing a TPM operation.
-                */
-               WARN_ONCE(1, "TPM returned invalid status\n");
+               if  (!test_and_set_bit(TPM_TIS_INVALID_STATUS, &priv->flags)) {
+                       /*
+                        * If this trips, the chances are the read is
+                        * returning 0xff because the locality hasn't been
+                        * acquired.  Usually because tpm_try_get_ops() hasn't
+                        * been called before doing a TPM operation.
+                        */
+                       dev_err(&chip->dev, "invalid TPM_STS.x 0x%02x, dumping stack for forensics\n",
+                               status);
+
+                       /*
+                        * Dump stack for forensics, as invalid TPM_STS.x could be
+                        * potentially triggered by impaired tpm_try_get_ops() or
+                        * tpm_find_get_ops().
+                        */
+                       dump_stack();
+               }
+
                return 0;
        }
 
index 9b2d32a..b2a3c6c 100644 (file)
@@ -83,6 +83,7 @@ enum tis_defaults {
 
 enum tpm_tis_flags {
        TPM_TIS_ITPM_WORKAROUND         = BIT(0),
+       TPM_TIS_INVALID_STATUS          = BIT(1),
 };
 
 struct tpm_tis_data {
@@ -90,7 +91,7 @@ struct tpm_tis_data {
        int locality;
        int irq;
        bool irq_tested;
-       unsigned int flags;
+       unsigned long flags;
        void __iomem *ilb_base_addr;
        u16 clkrun_enabled;
        wait_queue_head_t int_queue;
index f19c227..44dde2f 100644 (file)
@@ -706,14 +706,14 @@ static int tpm_cr50_i2c_probe(struct i2c_client *client,
 
        if (client->irq > 0) {
                rc = devm_request_irq(dev, client->irq, tpm_cr50_i2c_int_handler,
-                                     IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+                                     IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
+                                     IRQF_NO_AUTOEN,
                                      dev->driver->name, chip);
                if (rc < 0) {
                        dev_err(dev, "Failed to probe IRQ %d\n", client->irq);
                        return rc;
                }
 
-               disable_irq(client->irq);
                priv->irq = client->irq;
        } else {
                dev_warn(dev, "No IRQ, will use %ums delay for TPM ready\n",
index 3856f6e..54584b4 100644 (file)
@@ -240,10 +240,14 @@ static int tpm_tis_spi_driver_probe(struct spi_device *spi)
        tpm_tis_spi_probe_func probe_func;
 
        probe_func = of_device_get_match_data(&spi->dev);
-       if (!probe_func && spi_dev_id)
-               probe_func = (tpm_tis_spi_probe_func)spi_dev_id->driver_data;
-       if (!probe_func)
-               return -ENODEV;
+       if (!probe_func) {
+               if (spi_dev_id) {
+                       probe_func = (tpm_tis_spi_probe_func)spi_dev_id->driver_data;
+                       if (!probe_func)
+                               return -ENODEV;
+               } else
+                       probe_func = tpm_tis_spi_probe;
+       }
 
        return probe_func(spi);
 }
@@ -260,6 +264,8 @@ static int tpm_tis_spi_remove(struct spi_device *dev)
 }
 
 static const struct spi_device_id tpm_tis_spi_id[] = {
+       { "st33htpm-spi", (unsigned long)tpm_tis_spi_probe },
+       { "slb9670", (unsigned long)tpm_tis_spi_probe },
        { "tpm_tis_spi", (unsigned long)tpm_tis_spi_probe },
        { "cr50", (unsigned long)cr50_spi_probe },
        {}