Merge tag 'tpmdd-next-20151110' of https://github.com/jsakkine/linux-tpmdd into for...
authorJames Morris <james.l.morris@oracle.com>
Thu, 12 Nov 2015 09:38:04 +0000 (20:38 +1100)
committerJames Morris <james.l.morris@oracle.com>
Thu, 12 Nov 2015 09:38:04 +0000 (20:38 +1100)
drivers/char/tpm/tpm-chip.c
drivers/char/tpm/tpm2-cmd.c
drivers/char/tpm/tpm_of.c
drivers/char/tpm/tpm_tis.c

index f26b0ae23bea77719c5f6e13e9cfcc33d5706405..45cc39aabeeeb8fde7967971516a4efad50d2caa 100644 (file)
@@ -226,21 +226,23 @@ int tpm_chip_register(struct tpm_chip *chip)
        if (rc)
                goto out_err;
 
-       if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) {
-               rc = __compat_only_sysfs_link_entry_to_kobj(&chip->pdev->kobj,
-                                                           &chip->dev.kobj,
-                                                           "ppi");
-               if (rc)
-                       goto out_err;
-       }
-
        /* Make the chip available. */
        spin_lock(&driver_lock);
-       list_add_rcu(&chip->list, &tpm_chip_list);
+       list_add_tail_rcu(&chip->list, &tpm_chip_list);
        spin_unlock(&driver_lock);
 
        chip->flags |= TPM_CHIP_FLAG_REGISTERED;
 
+       if (!(chip->flags & TPM_CHIP_FLAG_TPM2)) {
+               rc = __compat_only_sysfs_link_entry_to_kobj(&chip->pdev->kobj,
+                                                           &chip->dev.kobj,
+                                                           "ppi");
+               if (rc && rc != -ENOENT) {
+                       tpm_chip_unregister(chip);
+                       return rc;
+               }
+       }
+
        return 0;
 out_err:
        tpm1_chip_unregister(chip);
index bd7039fafa8aa7c34326e7a2270cd09e42837d81..c12130485fc18e966c9e41736e57bd7fd0586082 100644 (file)
@@ -443,12 +443,13 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
                             TPM_DIGEST_SIZE);
 
        /* sensitive */
-       tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len);
+       tpm_buf_append_u16(&buf, 4 + TPM_DIGEST_SIZE + payload->key_len + 1);
 
        tpm_buf_append_u16(&buf, TPM_DIGEST_SIZE);
        tpm_buf_append(&buf, options->blobauth, TPM_DIGEST_SIZE);
-       tpm_buf_append_u16(&buf, payload->key_len);
+       tpm_buf_append_u16(&buf, payload->key_len + 1);
        tpm_buf_append(&buf, payload->key, payload->key_len);
+       tpm_buf_append_u8(&buf, payload->migratable);
 
        /* public */
        tpm_buf_append_u16(&buf, 14);
@@ -573,6 +574,8 @@ static int tpm2_unseal(struct tpm_chip *chip,
                       u32 blob_handle)
 {
        struct tpm_buf buf;
+       u16 data_len;
+       u8 *data;
        int rc;
 
        rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_UNSEAL);
@@ -591,11 +594,13 @@ static int tpm2_unseal(struct tpm_chip *chip,
                rc = -EPERM;
 
        if (!rc) {
-               payload->key_len = be16_to_cpup(
+               data_len = be16_to_cpup(
                        (__be16 *) &buf.data[TPM_HEADER_SIZE + 4]);
+               data = &buf.data[TPM_HEADER_SIZE + 6];
 
-               memcpy(payload->key, &buf.data[TPM_HEADER_SIZE + 6],
-                      payload->key_len);
+               memcpy(payload->key, data, data_len - 1);
+               payload->key_len = data_len - 1;
+               payload->migratable = data[data_len - 1];
        }
 
        tpm_buf_destroy(&buf);
index 1141456a4b1f1b974192e89574af9e165051922b..570f30c5c5f42ee5ee8076e17f45301de11ecf59 100644 (file)
@@ -53,17 +53,18 @@ int read_log(struct tpm_bios_log *log)
                goto cleanup_eio;
        }
 
-       of_node_put(np);
        log->bios_event_log = kmalloc(*sizep, GFP_KERNEL);
        if (!log->bios_event_log) {
                pr_err("%s: ERROR - Not enough memory for BIOS measurements\n",
                       __func__);
+               of_node_put(np);
                return -ENOMEM;
        }
 
        log->bios_event_log_end = log->bios_event_log + *sizep;
 
        memcpy(log->bios_event_log, __va(*basep), *sizep);
+       of_node_put(np);
 
        return 0;
 
index 696ef1d56b4f5830682bc1227b72686c2906eefb..65f7eecc45b01c489e2381b2311a95f2898527df 100644 (file)
@@ -645,6 +645,7 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
 {
        u32 vendor, intfcaps, intmask;
        int rc, i, irq_s, irq_e, probe;
+       int irq_r = -1;
        struct tpm_chip *chip;
        struct priv_data *priv;
 
@@ -751,6 +752,7 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
                irq_s =
                    ioread8(chip->vendor.iobase +
                            TPM_INT_VECTOR(chip->vendor.locality));
+               irq_r = irq_s;
                if (irq_s) {
                        irq_e = irq_s;
                } else {
@@ -805,6 +807,8 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
                        iowrite32(intmask,
                                  chip->vendor.iobase +
                                  TPM_INT_ENABLE(chip->vendor.locality));
+
+                       devm_free_irq(dev, i, chip);
                }
        }
        if (chip->vendor.irq) {
@@ -831,7 +835,9 @@ static int tpm_tis_init(struct device *dev, struct tpm_info *tpm_info,
                                  chip->vendor.iobase +
                                  TPM_INT_ENABLE(chip->vendor.locality));
                }
-       }
+       } else if (irq_r != -1)
+               iowrite8(irq_r, chip->vendor.iobase +
+                        TPM_INT_VECTOR(chip->vendor.locality));
 
        if (chip->flags & TPM_CHIP_FLAG_TPM2) {
                chip->vendor.timeout_a = msecs_to_jiffies(TPM2_TIMEOUT_A);