This patch enables a user to specify the additional optional command
parameter by writing it into the request file:

   # echo "23 16" > request
   # cat request
   23 16

For backwards compatibility:

If only 1 parameter is given then we assume this is the operation request
number.

   # echo "5" > request
   # cat request
   5

Signed-off-by: Stefan Berger <[email protected]>
Tested-by: David Safford <[email protected]>
---
 drivers/char/tpm/tpm_ppi.c | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
index 942a2f79e9da..75e7a856177c 100644
--- a/drivers/char/tpm/tpm_ppi.c
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -120,9 +120,10 @@ static ssize_t tpm_store_ppi_request(struct device *dev,
        u32 req;
        u64 ret;
        int func = TPM_PPI_FN_SUBREQ;
-       union acpi_object *obj, tmp;
-       union acpi_object argv4 = ACPI_INIT_DSM_ARGV4(1, &tmp);
+       union acpi_object *obj, tmp[2];
+       union acpi_object argv4 = ACPI_INIT_DSM_ARGV4(2, tmp);
        struct tpm_chip *chip = to_tpm_chip(dev);
+       u64 rev = TPM_PPI_REVISION_ID_1;
 
        /*
         * the function to submit TPM operation request to pre-os environment
@@ -139,20 +140,29 @@ static ssize_t tpm_store_ppi_request(struct device *dev,
         * string/package type. For PPI version 1.0 and 1.1, use buffer type
         * for compatibility, and use package type since 1.2 according to spec.
         */
-       if (strcmp(chip->ppi_version, "1.2") < 0) {
+       if (strcmp(chip->ppi_version, "1.3") == 0) {
+               if (sscanf(buf, "%llu %llu", &tmp[0].integer.value,
+                          &tmp[1].integer.value) != 2)
+                       goto ppi12;
+               rev = TPM_PPI_REVISION_ID_2;
+               tmp[0].type = ACPI_TYPE_INTEGER;
+               tmp[1].type = ACPI_TYPE_INTEGER;
+       } else if (strcmp(chip->ppi_version, "1.2") < 0) {
                if (sscanf(buf, "%d", &req) != 1)
                        return -EINVAL;
                argv4.type = ACPI_TYPE_BUFFER;
                argv4.buffer.length = sizeof(req);
                argv4.buffer.pointer = (u8 *)&req;
        } else {
-               tmp.type = ACPI_TYPE_INTEGER;
-               if (sscanf(buf, "%llu", &tmp.integer.value) != 1)
+ppi12:
+               argv4.package.count = 1;
+               tmp[0].type = ACPI_TYPE_INTEGER;
+               if (sscanf(buf, "%llu", &tmp[0].integer.value) != 1)
                        return -EINVAL;
        }
 
        obj = tpm_eval_dsm(chip->acpi_dev_handle, func, ACPI_TYPE_INTEGER,
-                          &argv4, TPM_PPI_REVISION_ID_1);
+                          &argv4, rev);
        if (!obj) {
                return -ENXIO;
        } else {
-- 
2.13.6

Reply via email to