322 lines
11 KiB
Diff
322 lines
11 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
From: Tomas Winkler <tomas.winkler@intel.com>
|
||
Date: Tue, 6 Mar 2018 10:17:24 +0200
|
||
Subject: [PATCH] tpm: move tpm_getcap to tpm1-cmd.c
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
1. Move tpm_getcap to tpm1-cmd. Rename the function to tpm1_getcap.
|
||
2. Remove unused tpm_getcap_header with unused constant
|
||
as this functionality is already implemented using tpm_buf construct.
|
||
|
||
Fixes warning:
|
||
drivers/char/tpm/tpm-interface.c:452:38: warning: ‘tpm_getcap_header’ defined but not used [-Wunused-const-variable=]
|
||
static const struct tpm_input_header tpm_getcap_header = {
|
||
^~~~~~~~~~~~~~~~~
|
||
3. Drop unused TPM_DIGEST_SIZE. It's already defined in
|
||
include/linux/tpm.h
|
||
|
||
V2-V3: Rebase
|
||
V4-V5: Resend
|
||
|
||
Change-Id: I16f30868492f319fb0ff78ddee0ef9084d176170
|
||
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
|
||
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
|
||
---
|
||
drivers/char/tpm/tpm-interface.c | 47 +----------------------------
|
||
drivers/char/tpm/tpm-sysfs.c | 48 +++++++++++++++---------------
|
||
drivers/char/tpm/tpm.h | 4 +--
|
||
drivers/char/tpm/tpm1-cmd.c | 51 +++++++++++++++++++++++++++-----
|
||
drivers/char/tpm/tpm_tis_core.c | 2 +-
|
||
5 files changed, 71 insertions(+), 81 deletions(-)
|
||
|
||
diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c
|
||
index 893413267278..80fc91d4c099 100644
|
||
--- a/drivers/char/tpm/tpm-interface.c
|
||
+++ b/drivers/char/tpm/tpm-interface.c
|
||
@@ -464,52 +464,6 @@ int tpm_startup(struct tpm_chip *chip)
|
||
return rc;
|
||
}
|
||
|
||
-#define TPM_DIGEST_SIZE 20
|
||
-#define TPM_RET_CODE_IDX 6
|
||
-#define TPM_INTERNAL_RESULT_SIZE 200
|
||
-#define TPM_ORD_GET_CAP 101
|
||
-#define TPM_ORD_GET_RANDOM 70
|
||
-
|
||
-static const struct tpm_input_header tpm_getcap_header = {
|
||
- .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND),
|
||
- .length = cpu_to_be32(22),
|
||
- .ordinal = cpu_to_be32(TPM_ORD_GET_CAP)
|
||
-};
|
||
-
|
||
-ssize_t tpm_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
|
||
- const char *desc, size_t min_cap_length)
|
||
-{
|
||
- struct tpm_buf buf;
|
||
- int rc;
|
||
-
|
||
- rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP);
|
||
- if (rc)
|
||
- return rc;
|
||
-
|
||
- if (subcap_id == TPM_CAP_VERSION_1_1 ||
|
||
- subcap_id == TPM_CAP_VERSION_1_2) {
|
||
- tpm_buf_append_u32(&buf, subcap_id);
|
||
- tpm_buf_append_u32(&buf, 0);
|
||
- } else {
|
||
- if (subcap_id == TPM_CAP_FLAG_PERM ||
|
||
- subcap_id == TPM_CAP_FLAG_VOL)
|
||
- tpm_buf_append_u32(&buf, TPM_CAP_FLAG);
|
||
- else
|
||
- tpm_buf_append_u32(&buf, TPM_CAP_PROP);
|
||
-
|
||
- tpm_buf_append_u32(&buf, 4);
|
||
- tpm_buf_append_u32(&buf, subcap_id);
|
||
- }
|
||
- rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
|
||
- min_cap_length, 0, desc);
|
||
- if (!rc)
|
||
- *cap = *(cap_t *)&buf.data[TPM_HEADER_SIZE + 4];
|
||
-
|
||
- tpm_buf_destroy(&buf);
|
||
- return rc;
|
||
-}
|
||
-EXPORT_SYMBOL_GPL(tpm_getcap);
|
||
-
|
||
int tpm_get_timeouts(struct tpm_chip *chip)
|
||
{
|
||
if (chip->flags & TPM_CHIP_FLAG_HAVE_TIMEOUTS)
|
||
@@ -867,6 +821,7 @@ int tpm_pm_resume(struct device *dev)
|
||
}
|
||
EXPORT_SYMBOL_GPL(tpm_pm_resume);
|
||
|
||
+#define TPM_ORD_GET_RANDOM 70
|
||
#define TPM_GETRANDOM_RESULT_SIZE 18
|
||
static const struct tpm_input_header tpm_getrandom_header = {
|
||
.tag = cpu_to_be16(TPM_TAG_RQU_COMMAND),
|
||
diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c
|
||
index 177a60e5c6ec..9cb771e96f28 100644
|
||
--- a/drivers/char/tpm/tpm-sysfs.c
|
||
+++ b/drivers/char/tpm/tpm-sysfs.c
|
||
@@ -109,9 +109,9 @@ static ssize_t pcrs_show(struct device *dev, struct device_attribute *attr,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(chip, TPM_CAP_PROP_PCR, &cap,
|
||
- "attempting to determine the number of PCRS",
|
||
- sizeof(cap.num_pcrs))) {
|
||
+ if (tpm1_getcap(chip, TPM_CAP_PROP_PCR, &cap,
|
||
+ "attempting to determine the number of PCRS",
|
||
+ sizeof(cap.num_pcrs))) {
|
||
tpm_put_ops(chip);
|
||
return 0;
|
||
}
|
||
@@ -141,9 +141,9 @@ static ssize_t enabled_show(struct device *dev, struct device_attribute *attr,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(chip, TPM_CAP_FLAG_PERM, &cap,
|
||
- "attempting to determine the permanent enabled state",
|
||
- sizeof(cap.perm_flags)))
|
||
+ if (tpm1_getcap(chip, TPM_CAP_FLAG_PERM, &cap,
|
||
+ "attempting to determine the permanent enabled state",
|
||
+ sizeof(cap.perm_flags)))
|
||
goto out_ops;
|
||
|
||
rc = sprintf(buf, "%d\n", !cap.perm_flags.disable);
|
||
@@ -163,9 +163,9 @@ static ssize_t active_show(struct device *dev, struct device_attribute *attr,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(chip, TPM_CAP_FLAG_PERM, &cap,
|
||
- "attempting to determine the permanent active state",
|
||
- sizeof(cap.perm_flags)))
|
||
+ if (tpm1_getcap(chip, TPM_CAP_FLAG_PERM, &cap,
|
||
+ "attempting to determine the permanent active state",
|
||
+ sizeof(cap.perm_flags)))
|
||
goto out_ops;
|
||
|
||
rc = sprintf(buf, "%d\n", !cap.perm_flags.deactivated);
|
||
@@ -185,9 +185,9 @@ static ssize_t owned_show(struct device *dev, struct device_attribute *attr,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(to_tpm_chip(dev), TPM_CAP_PROP_OWNER, &cap,
|
||
- "attempting to determine the owner state",
|
||
- sizeof(cap.owned)))
|
||
+ if (tpm1_getcap(to_tpm_chip(dev), TPM_CAP_PROP_OWNER, &cap,
|
||
+ "attempting to determine the owner state",
|
||
+ sizeof(cap.owned)))
|
||
goto out_ops;
|
||
|
||
rc = sprintf(buf, "%d\n", cap.owned);
|
||
@@ -207,9 +207,9 @@ static ssize_t temp_deactivated_show(struct device *dev,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(to_tpm_chip(dev), TPM_CAP_FLAG_VOL, &cap,
|
||
- "attempting to determine the temporary state",
|
||
- sizeof(cap.stclear_flags)))
|
||
+ if (tpm1_getcap(to_tpm_chip(dev), TPM_CAP_FLAG_VOL, &cap,
|
||
+ "attempting to determine the temporary state",
|
||
+ sizeof(cap.stclear_flags)))
|
||
goto out_ops;
|
||
|
||
rc = sprintf(buf, "%d\n", cap.stclear_flags.deactivated);
|
||
@@ -230,18 +230,18 @@ static ssize_t caps_show(struct device *dev, struct device_attribute *attr,
|
||
if (tpm_try_get_ops(chip))
|
||
return 0;
|
||
|
||
- if (tpm_getcap(chip, TPM_CAP_PROP_MANUFACTURER, &cap,
|
||
- "attempting to determine the manufacturer",
|
||
- sizeof(cap.manufacturer_id)))
|
||
+ if (tpm1_getcap(chip, TPM_CAP_PROP_MANUFACTURER, &cap,
|
||
+ "attempting to determine the manufacturer",
|
||
+ sizeof(cap.manufacturer_id)))
|
||
goto out_ops;
|
||
|
||
str += sprintf(str, "Manufacturer: 0x%x\n",
|
||
be32_to_cpu(cap.manufacturer_id));
|
||
|
||
/* Try to get a TPM version 1.2 TPM_CAP_VERSION_INFO */
|
||
- rc = tpm_getcap(chip, TPM_CAP_VERSION_1_2, &cap,
|
||
- "attempting to determine the 1.2 version",
|
||
- sizeof(cap.tpm_version_1_2));
|
||
+ rc = tpm1_getcap(chip, TPM_CAP_VERSION_1_2, &cap,
|
||
+ "attempting to determine the 1.2 version",
|
||
+ sizeof(cap.tpm_version_1_2));
|
||
if (!rc) {
|
||
str += sprintf(str,
|
||
"TCG version: %d.%d\nFirmware version: %d.%d\n",
|
||
@@ -251,9 +251,9 @@ static ssize_t caps_show(struct device *dev, struct device_attribute *attr,
|
||
cap.tpm_version_1_2.revMinor);
|
||
} else {
|
||
/* Otherwise just use TPM_STRUCT_VER */
|
||
- if (tpm_getcap(chip, TPM_CAP_VERSION_1_1, &cap,
|
||
- "attempting to determine the 1.1 version",
|
||
- sizeof(cap.tpm_version)))
|
||
+ if (tpm1_getcap(chip, TPM_CAP_VERSION_1_1, &cap,
|
||
+ "attempting to determine the 1.1 version",
|
||
+ sizeof(cap.tpm_version)))
|
||
goto out_ops;
|
||
|
||
str += sprintf(str,
|
||
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
|
||
index 6ef91ad7ef64..6682ecfb722d 100644
|
||
--- a/drivers/char/tpm/tpm.h
|
||
+++ b/drivers/char/tpm/tpm.h
|
||
@@ -545,8 +545,6 @@ ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_space *space,
|
||
size_t min_rsp_body_length, unsigned int flags,
|
||
const char *desc);
|
||
int tpm_startup(struct tpm_chip *chip);
|
||
-ssize_t tpm_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
|
||
- const char *desc, size_t min_cap_length);
|
||
int tpm_get_timeouts(struct tpm_chip *);
|
||
int tpm1_auto_startup(struct tpm_chip *chip);
|
||
int tpm_do_selftest(struct tpm_chip *chip);
|
||
@@ -555,6 +553,8 @@ int tpm1_get_timeouts(struct tpm_chip *chip);
|
||
unsigned long tpm1_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
|
||
int tpm1_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash,
|
||
const char *log_msg);
|
||
+ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
|
||
+ const char *desc, size_t min_cap_length);
|
||
unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal);
|
||
int tpm_pm_suspend(struct device *dev);
|
||
int tpm_pm_resume(struct device *dev);
|
||
diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c
|
||
index ec242397e6dc..3bd079587ef5 100644
|
||
--- a/drivers/char/tpm/tpm1-cmd.c
|
||
+++ b/drivers/char/tpm/tpm1-cmd.c
|
||
@@ -314,15 +314,15 @@ int tpm1_get_timeouts(struct tpm_chip *chip)
|
||
unsigned long timeout_old[4], timeout_chip[4], timeout_eff[4];
|
||
ssize_t rc;
|
||
|
||
- rc = tpm_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, NULL,
|
||
- sizeof(cap.timeout));
|
||
+ rc = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, NULL,
|
||
+ sizeof(cap.timeout));
|
||
if (rc == TPM_ERR_INVALID_POSTINIT) {
|
||
if (tpm_startup(chip))
|
||
return rc;
|
||
|
||
- rc = tpm_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap,
|
||
- "attempting to determine the timeouts",
|
||
- sizeof(cap.timeout));
|
||
+ rc = tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap,
|
||
+ "attempting to determine the timeouts",
|
||
+ sizeof(cap.timeout));
|
||
}
|
||
|
||
if (rc) {
|
||
@@ -383,9 +383,9 @@ int tpm1_get_timeouts(struct tpm_chip *chip)
|
||
chip->timeout_c = usecs_to_jiffies(timeout_eff[2]);
|
||
chip->timeout_d = usecs_to_jiffies(timeout_eff[3]);
|
||
|
||
- rc = tpm_getcap(chip, TPM_CAP_PROP_TIS_DURATION, &cap,
|
||
- "attempting to determine the durations",
|
||
- sizeof(cap.duration));
|
||
+ rc = tpm1_getcap(chip, TPM_CAP_PROP_TIS_DURATION, &cap,
|
||
+ "attempting to determine the durations",
|
||
+ sizeof(cap.duration));
|
||
if (rc)
|
||
return rc;
|
||
|
||
@@ -434,3 +434,38 @@ int tpm1_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash,
|
||
tpm_buf_destroy(&buf);
|
||
return rc;
|
||
}
|
||
+
|
||
+#define TPM_ORD_GET_CAP 101
|
||
+ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
|
||
+ const char *desc, size_t min_cap_length)
|
||
+{
|
||
+ struct tpm_buf buf;
|
||
+ int rc;
|
||
+
|
||
+ rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_GET_CAP);
|
||
+ if (rc)
|
||
+ return rc;
|
||
+
|
||
+ if (subcap_id == TPM_CAP_VERSION_1_1 ||
|
||
+ subcap_id == TPM_CAP_VERSION_1_2) {
|
||
+ tpm_buf_append_u32(&buf, subcap_id);
|
||
+ tpm_buf_append_u32(&buf, 0);
|
||
+ } else {
|
||
+ if (subcap_id == TPM_CAP_FLAG_PERM ||
|
||
+ subcap_id == TPM_CAP_FLAG_VOL)
|
||
+ tpm_buf_append_u32(&buf, TPM_CAP_FLAG);
|
||
+ else
|
||
+ tpm_buf_append_u32(&buf, TPM_CAP_PROP);
|
||
+
|
||
+ tpm_buf_append_u32(&buf, 4);
|
||
+ tpm_buf_append_u32(&buf, subcap_id);
|
||
+ }
|
||
+ rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
|
||
+ min_cap_length, 0, desc);
|
||
+ if (!rc)
|
||
+ *cap = *(cap_t *)&buf.data[TPM_HEADER_SIZE + 4];
|
||
+
|
||
+ tpm_buf_destroy(&buf);
|
||
+ return rc;
|
||
+}
|
||
+EXPORT_SYMBOL_GPL(tpm1_getcap);
|
||
diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c
|
||
index 104726bc6492..0f5e47d58df7 100644
|
||
--- a/drivers/char/tpm/tpm_tis_core.c
|
||
+++ b/drivers/char/tpm/tpm_tis_core.c
|
||
@@ -623,7 +623,7 @@ static int tpm_tis_gen_interrupt(struct tpm_chip *chip)
|
||
if (chip->flags & TPM_CHIP_FLAG_TPM2)
|
||
return tpm2_get_tpm_pt(chip, 0x100, &cap2, desc);
|
||
else
|
||
- return tpm_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc,
|
||
+ return tpm1_getcap(chip, TPM_CAP_PROP_TIS_TIMEOUT, &cap, desc,
|
||
0);
|
||
}
|
||
|
||
--
|
||
https://clearlinux.org
|
||
|