tpm: Add flag to use default cancellation policy
authorEddie James <eajames@linux.ibm.com>
Mon, 7 Nov 2022 17:14:23 +0000 (11:14 -0600)
committerJarkko Sakkinen <jarkko@kernel.org>
Thu, 8 Dec 2022 16:20:47 +0000 (16:20 +0000)
The check for cancelled request depends on the VID of the chip, but
some chips share VID which shouldn't share their cancellation
behavior. This is the case for the Nuvoton NPCT75X, which should use
the default cancellation check, not the Winbond one.
To avoid changing the existing behavior, add a new flag to indicate
that the chip should use the default cancellation check and set it
for the I2C TPM2 TIS driver.

Fixes: bbc23a07b072 ("tpm: Add tpm_tis_i2c backend for tpm_tis_core")
Signed-off-by: Eddie James <eajames@linux.ibm.com>
Tested-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
drivers/char/tpm/tpm_tis_core.c
drivers/char/tpm/tpm_tis_core.h
drivers/char/tpm/tpm_tis_i2c.c

index 757623bacfd502889ec4e0f0020469a1213b9f2b..3f98e587b3e849aa35346cc8110c17c7c1987cbe 100644 (file)
@@ -682,15 +682,19 @@ static bool tpm_tis_req_canceled(struct tpm_chip *chip, u8 status)
 {
        struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
 
-       switch (priv->manufacturer_id) {
-       case TPM_VID_WINBOND:
-               return ((status == TPM_STS_VALID) ||
-                       (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY)));
-       case TPM_VID_STM:
-               return (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY));
-       default:
-               return (status == TPM_STS_COMMAND_READY);
+       if (!test_bit(TPM_TIS_DEFAULT_CANCELLATION, &priv->flags)) {
+               switch (priv->manufacturer_id) {
+               case TPM_VID_WINBOND:
+                       return ((status == TPM_STS_VALID) ||
+                               (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY)));
+               case TPM_VID_STM:
+                       return (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY));
+               default:
+                       break;
+               }
        }
+
+       return status == TPM_STS_COMMAND_READY;
 }
 
 static irqreturn_t tis_int_handler(int dummy, void *dev_id)
index 66a5a13cd1df2939fdf910e4bebf28448bacef60..b68479e0de10f396ea294a0c68988c9a479763d9 100644 (file)
@@ -86,6 +86,7 @@ enum tis_defaults {
 enum tpm_tis_flags {
        TPM_TIS_ITPM_WORKAROUND         = BIT(0),
        TPM_TIS_INVALID_STATUS          = BIT(1),
+       TPM_TIS_DEFAULT_CANCELLATION    = BIT(2),
 };
 
 struct tpm_tis_data {
index 635a69dfcbbd2e1bfe92db7827c2cacd6b6c912a..f3a7251c8e38fbe9d19d972d7adde1bf5e16f48f 100644 (file)
@@ -329,6 +329,7 @@ static int tpm_tis_i2c_probe(struct i2c_client *dev,
        if (!phy->io_buf)
                return -ENOMEM;
 
+       set_bit(TPM_TIS_DEFAULT_CANCELLATION, &phy->priv.flags);
        phy->i2c_client = dev;
 
        /* must precede all communication with the tpm */