|
@@ -997,61 +997,13 @@ int tpm2_probe(struct tpm_chip *chip)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(tpm2_probe);
|
|
|
|
|
|
-/**
|
|
|
- * tpm2_auto_startup - Perform the standard automatic TPM initialization
|
|
|
- * sequence
|
|
|
- * @chip: TPM chip to use
|
|
|
- *
|
|
|
- * Returns 0 on success, < 0 in case of fatal error.
|
|
|
- */
|
|
|
-int tpm2_auto_startup(struct tpm_chip *chip)
|
|
|
-{
|
|
|
- int rc;
|
|
|
-
|
|
|
- rc = tpm_get_timeouts(chip);
|
|
|
- if (rc)
|
|
|
- goto out;
|
|
|
-
|
|
|
- rc = tpm2_do_selftest(chip);
|
|
|
- if (rc != 0 && rc != TPM2_RC_INITIALIZE) {
|
|
|
- dev_err(&chip->dev, "TPM self test failed\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- if (rc == TPM2_RC_INITIALIZE) {
|
|
|
- rc = tpm2_startup(chip, TPM2_SU_CLEAR);
|
|
|
- if (rc)
|
|
|
- goto out;
|
|
|
-
|
|
|
- rc = tpm2_do_selftest(chip);
|
|
|
- if (rc) {
|
|
|
- dev_err(&chip->dev, "TPM self test failed\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- rc = tpm2_get_pcr_allocation(chip);
|
|
|
-
|
|
|
-out:
|
|
|
- if (rc > 0)
|
|
|
- rc = -ENODEV;
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
struct tpm2_pcr_selection {
|
|
|
__be16 hash_alg;
|
|
|
u8 size_of_select;
|
|
|
u8 pcr_select[3];
|
|
|
} __packed;
|
|
|
|
|
|
-/**
|
|
|
- * tpm2_get_pcr_allocation() - get TPM active PCR banks.
|
|
|
- *
|
|
|
- * @chip: TPM chip to use.
|
|
|
- *
|
|
|
- * Return: Same as with tpm_transmit_cmd.
|
|
|
- */
|
|
|
-ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip)
|
|
|
+static ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip)
|
|
|
{
|
|
|
struct tpm2_pcr_selection pcr_selection;
|
|
|
struct tpm_buf buf;
|
|
@@ -1114,3 +1066,47 @@ out:
|
|
|
|
|
|
return rc;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * tpm2_auto_startup - Perform the standard automatic TPM initialization
|
|
|
+ * sequence
|
|
|
+ * @chip: TPM chip to use
|
|
|
+ *
|
|
|
+ * Initializes timeout values for operation and command durations, conducts
|
|
|
+ * a self-test and reads the list of active PCR banks.
|
|
|
+ *
|
|
|
+ * Return: 0 on success. Otherwise, a system error code is returned.
|
|
|
+ */
|
|
|
+int tpm2_auto_startup(struct tpm_chip *chip)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+
|
|
|
+ rc = tpm_get_timeouts(chip);
|
|
|
+ if (rc)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ rc = tpm2_do_selftest(chip);
|
|
|
+ if (rc != 0 && rc != TPM2_RC_INITIALIZE) {
|
|
|
+ dev_err(&chip->dev, "TPM self test failed\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (rc == TPM2_RC_INITIALIZE) {
|
|
|
+ rc = tpm2_startup(chip, TPM2_SU_CLEAR);
|
|
|
+ if (rc)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ rc = tpm2_do_selftest(chip);
|
|
|
+ if (rc) {
|
|
|
+ dev_err(&chip->dev, "TPM self test failed\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ rc = tpm2_get_pcr_allocation(chip);
|
|
|
+
|
|
|
+out:
|
|
|
+ if (rc > 0)
|
|
|
+ rc = -ENODEV;
|
|
|
+ return rc;
|
|
|
+}
|