[PATCH] driver/char/tpm: declare internal symbols as static

2012-08-28 Thread xiaoyan . zhang
From: Xiaoyan Zhang 

This patch declares the internal struct and functions as static to provide
more security.

Signed-off-by: Xiaoyan Zhang 
Signed-off-by: Fengguang Wu 
---
 drivers/char/tpm/tpm.c |4 ++--
 drivers/char/tpm/tpm_ppi.c |   37 +++--
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 39526c0..6724615 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -915,7 +915,7 @@ EXPORT_SYMBOL_GPL(tpm_show_pcrs);
 
 #define  READ_PUBEK_RESULT_SIZE 314
 #define TPM_ORD_READPUBEK cpu_to_be32(124)
-struct tpm_input_header tpm_readpubek_header = {
+static struct tpm_input_header tpm_readpubek_header = {
.tag = TPM_TAG_RQU_COMMAND,
.length = cpu_to_be32(30),
.ordinal = TPM_ORD_READPUBEK
@@ -1395,7 +1395,7 @@ EXPORT_SYMBOL_GPL(tpm_dev_vendor_release);
  * Once all references to platform device are down to 0,
  * release all allocated structures.
  */
-void tpm_dev_release(struct device *dev)
+static void tpm_dev_release(struct device *dev)
 {
struct tpm_chip *chip = dev_get_drvdata(dev);
 
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
index 440fa1c..f27b58c 100644
--- a/drivers/char/tpm/tpm_ppi.c
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -53,8 +53,8 @@ static inline void ppi_assign_params(union acpi_object 
params[4],
params[3].package.elements = NULL;
 }
 
-ssize_t tpm_show_ppi_version(struct device *dev, struct device_attribute *attr,
-char *buf)
+static ssize_t tpm_show_ppi_version(struct device *dev,
+   struct device_attribute *attr, char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -82,9 +82,8 @@ ssize_t tpm_show_ppi_version(struct device *dev, struct 
device_attribute *attr,
return status;
 }
 
-ssize_t tpm_show_ppi_request(struct device *dev,
-struct device_attribute *attr,
-char *buf)
+static ssize_t tpm_show_ppi_request(struct device *dev,
+   struct device_attribute *attr, char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -132,9 +131,9 @@ cleanup:
return status;
 }
 
-ssize_t tpm_store_ppi_request(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
+static ssize_t tpm_store_ppi_request(struct device *dev,
+struct device_attribute *attr,
+const char *buf, size_t count)
 {
char version[PPI_VERSION_LEN + 1];
acpi_handle handle;
@@ -207,9 +206,9 @@ ssize_t tpm_store_ppi_request(struct device *dev,
return status;
 }
 
-ssize_t tpm_show_ppi_transition_action(struct device *dev,
-  struct device_attribute *attr,
-  char *buf)
+static ssize_t tpm_show_ppi_transition_action(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
 {
char version[PPI_VERSION_LEN + 1];
acpi_handle handle;
@@ -269,9 +268,9 @@ ssize_t tpm_show_ppi_transition_action(struct device *dev,
return status;
 }
 
-ssize_t tpm_show_ppi_response(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t tpm_show_ppi_response(struct device *dev,
+struct device_attribute *attr,
+char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -413,14 +412,16 @@ static ssize_t show_ppi_operations(char *buf, u32 start, 
u32 end)
return str - buf;
 }
 
-ssize_t tpm_show_ppi_tcg_operations(struct device *dev,
-  struct device_attribute *attr, char *buf)
+static ssize_t tpm_show_ppi_tcg_operations(struct device *dev,
+  struct device_attribute *attr,
+  char *buf)
 {
return show_ppi_operations(buf, 0, PPI_TPM_REQ_MAX);
 }
 
-ssize_t tpm_show_ppi_vs_operations(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t tpm_show_ppi_vs_operations(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
 {
return show_ppi_operations(buf, PPI_VS_REQ_START, PPI_VS_REQ_END);
 }
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] driver/char/tpm: declare internal symbols as static

2012-08-28 Thread xiaoyan . zhang
From: Xiaoyan Zhang xiaoyan.zh...@intel.com

This patch declares the internal struct and functions as static to provide
more security.

Signed-off-by: Xiaoyan Zhang xiaoyan.zh...@intel.com
Signed-off-by: Fengguang Wu fengguang...@intel.com
---
 drivers/char/tpm/tpm.c |4 ++--
 drivers/char/tpm/tpm_ppi.c |   37 +++--
 2 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 39526c0..6724615 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -915,7 +915,7 @@ EXPORT_SYMBOL_GPL(tpm_show_pcrs);
 
 #define  READ_PUBEK_RESULT_SIZE 314
 #define TPM_ORD_READPUBEK cpu_to_be32(124)
-struct tpm_input_header tpm_readpubek_header = {
+static struct tpm_input_header tpm_readpubek_header = {
.tag = TPM_TAG_RQU_COMMAND,
.length = cpu_to_be32(30),
.ordinal = TPM_ORD_READPUBEK
@@ -1395,7 +1395,7 @@ EXPORT_SYMBOL_GPL(tpm_dev_vendor_release);
  * Once all references to platform device are down to 0,
  * release all allocated structures.
  */
-void tpm_dev_release(struct device *dev)
+static void tpm_dev_release(struct device *dev)
 {
struct tpm_chip *chip = dev_get_drvdata(dev);
 
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
index 440fa1c..f27b58c 100644
--- a/drivers/char/tpm/tpm_ppi.c
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -53,8 +53,8 @@ static inline void ppi_assign_params(union acpi_object 
params[4],
params[3].package.elements = NULL;
 }
 
-ssize_t tpm_show_ppi_version(struct device *dev, struct device_attribute *attr,
-char *buf)
+static ssize_t tpm_show_ppi_version(struct device *dev,
+   struct device_attribute *attr, char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -82,9 +82,8 @@ ssize_t tpm_show_ppi_version(struct device *dev, struct 
device_attribute *attr,
return status;
 }
 
-ssize_t tpm_show_ppi_request(struct device *dev,
-struct device_attribute *attr,
-char *buf)
+static ssize_t tpm_show_ppi_request(struct device *dev,
+   struct device_attribute *attr, char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -132,9 +131,9 @@ cleanup:
return status;
 }
 
-ssize_t tpm_store_ppi_request(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
+static ssize_t tpm_store_ppi_request(struct device *dev,
+struct device_attribute *attr,
+const char *buf, size_t count)
 {
char version[PPI_VERSION_LEN + 1];
acpi_handle handle;
@@ -207,9 +206,9 @@ ssize_t tpm_store_ppi_request(struct device *dev,
return status;
 }
 
-ssize_t tpm_show_ppi_transition_action(struct device *dev,
-  struct device_attribute *attr,
-  char *buf)
+static ssize_t tpm_show_ppi_transition_action(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
 {
char version[PPI_VERSION_LEN + 1];
acpi_handle handle;
@@ -269,9 +268,9 @@ ssize_t tpm_show_ppi_transition_action(struct device *dev,
return status;
 }
 
-ssize_t tpm_show_ppi_response(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t tpm_show_ppi_response(struct device *dev,
+struct device_attribute *attr,
+char *buf)
 {
acpi_handle handle;
acpi_status status;
@@ -413,14 +412,16 @@ static ssize_t show_ppi_operations(char *buf, u32 start, 
u32 end)
return str - buf;
 }
 
-ssize_t tpm_show_ppi_tcg_operations(struct device *dev,
-  struct device_attribute *attr, char *buf)
+static ssize_t tpm_show_ppi_tcg_operations(struct device *dev,
+  struct device_attribute *attr,
+  char *buf)
 {
return show_ppi_operations(buf, 0, PPI_TPM_REQ_MAX);
 }
 
-ssize_t tpm_show_ppi_vs_operations(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t tpm_show_ppi_vs_operations(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
 {
return show_ppi_operations(buf, PPI_VS_REQ_START, PPI_VS_REQ_END);
 }
-- 
1.7.7.6

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ

[PATCH v5 2/2] driver: add PPI support in tpm driver

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang 

The Physical Presence Interface enables the OS and the BIOS to cooperate and
provides a simple and straightforward platform user experience for
administering the TPM without sacrificing security.

V2: separate the patch out in a separate source file,
add #ifdef CONFIG_ACPI so it compiles out on ppc,
use standard error instead of ACPI error as return code of show/store fns.
V3: move #ifdef CONFIG_ACPI from .c file to .h file.
V4: move tpm_ppi code from tpm module to tpm_bios module.
V5: modify sys_add_ppi() so that ppi_attr_grp doesn't need to be exported

Signed-off-by: Xiaoyan Zhang 
---
 drivers/char/tpm/Makefile  |2 +-
 drivers/char/tpm/tpm.c |5 +
 drivers/char/tpm/tpm.h |9 +
 drivers/char/tpm/tpm_ppi.c |  460 
 4 files changed, 475 insertions(+), 1 deletions(-)
 create mode 100644 drivers/char/tpm/tpm_ppi.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index 9080cc4..5b3fc8b 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -4,7 +4,7 @@
 obj-$(CONFIG_TCG_TPM) += tpm.o
 ifdef CONFIG_ACPI
obj-$(CONFIG_TCG_TPM) += tpm_bios.o
-   tpm_bios-objs += tpm_eventlog.o tpm_acpi.o
+   tpm_bios-objs += tpm_eventlog.o tpm_acpi.o tpm_ppi.o
 else
 ifdef CONFIG_TCG_IBMVTPM
obj-$(CONFIG_TCG_TPM) += tpm_bios.o
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 0a75638..39526c0 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -1476,6 +1476,11 @@ struct tpm_chip *tpm_register_hardware(struct device 
*dev,
goto put_device;
}
 
+   if (sys_add_ppi(>kobj)) {
+   misc_deregister(>vendor.miscdev);
+   goto put_device;
+   }
+
chip->bios_dir = tpm_bios_log_setup(devname);
 
/* Make chip available */
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index f1af738..02c266a 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -327,3 +327,12 @@ extern int tpm_pm_suspend(struct device *);
 extern int tpm_pm_resume(struct device *);
 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
 wait_queue_head_t *);
+
+#ifdef CONFIG_ACPI
+extern ssize_t sys_add_ppi(struct kobject *parent);
+#else
+static inline ssize_t sys_add_ppi(struct kobject *parent)
+{
+   return 0;
+}
+#endif
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
new file mode 100644
index 000..440fa1c
--- /dev/null
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -0,0 +1,460 @@
+#include 
+#include 
+#include "tpm.h"
+
+static const u8 tpm_ppi_uuid[] = {
+   0xA6, 0xFA, 0xDD, 0x3D,
+   0x1B, 0x36,
+   0xB4, 0x4E,
+   0xA4, 0x24,
+   0x8D, 0x10, 0x08, 0x9D, 0x16, 0x53
+};
+static char *tpm_device_name = "TPM";
+
+#define TPM_PPI_REVISION_ID1
+#define TPM_PPI_FN_VERSION 1
+#define TPM_PPI_FN_SUBREQ  2
+#define TPM_PPI_FN_GETREQ  3
+#define TPM_PPI_FN_GETACT  4
+#define TPM_PPI_FN_GETRSP  5
+#define TPM_PPI_FN_SUBREQ2 7
+#define TPM_PPI_FN_GETOPR  8
+#define PPI_TPM_REQ_MAX22
+#define PPI_VS_REQ_START   128
+#define PPI_VS_REQ_END 255
+#define PPI_VERSION_LEN3
+
+static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context,
+   void **return_value)
+{
+   acpi_status status;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   status = acpi_get_name(handle, ACPI_FULL_PATHNAME, );
+   if (strstr(buffer.pointer, context) != NULL) {
+   *return_value = handle;
+   kfree(buffer.pointer);
+   return AE_CTRL_TERMINATE;
+   }
+   return AE_OK;
+}
+
+static inline void ppi_assign_params(union acpi_object params[4],
+u64 function_num)
+{
+   params[0].type = ACPI_TYPE_BUFFER;
+   params[0].buffer.length = sizeof(tpm_ppi_uuid);
+   params[0].buffer.pointer = (char *)tpm_ppi_uuid;
+   params[1].type = ACPI_TYPE_INTEGER;
+   params[1].integer.value = TPM_PPI_REVISION_ID;
+   params[2].type = ACPI_TYPE_INTEGER;
+   params[2].integer.value = function_num;
+   params[3].type = ACPI_TYPE_PACKAGE;
+   params[3].package.count = 0;
+   params[3].package.elements = NULL;
+}
+
+ssize_t tpm_show_ppi_version(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   acpi_handle handle;
+   acpi_status status;
+   struct acpi_object_list input;
+   struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
+   union acpi_object params[4];
+   union acpi_object *obj;
+
+   input.count = 4;
+   ppi_assign_params(params, TPM_PPI_FN_VERSION);
+   input.pointer = params;
+   status = acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+  

[PATCH v5 1/2] Documentation: sysfs for Physical Presence Interface

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang 


Signed-off-by: Xiaoyan Zhang 
---
 Documentation/ABI/testing/sysfs-driver-ppi |   70 
 1 files changed, 70 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-ppi

diff --git a/Documentation/ABI/testing/sysfs-driver-ppi 
b/Documentation/ABI/testing/sysfs-driver-ppi
new file mode 100644
index 000..97a003e
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-driver-ppi
@@ -0,0 +1,70 @@
+What:  /sys/devices/pnp0//ppi/
+Date:  August 2012
+Kernel Version:3.6
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This folder includes the attributes related with PPI (Physical
+   Presence Interface). Only if TPM is supported by BIOS, this
+   folder makes sence. The folder path can be got by command
+   'find /sys/ -name 'pcrs''. For the detail information of PPI,
+   please refer to the PPI specification from
+   http://www.trustedcomputinggroup.org/
+
+What:  /sys/devices/pnp0//ppi/version
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the version of the PPI supported by the
+   platform.
+   This file is readonly.
+
+What:  /sys/devices/pnp0//ppi/request
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the request for an operation to be
+   executed in the pre-OS environment. It is the only input from
+   the OS to the pre-OS environment. The request should be an
+   integer value range from 1 to 160, and 0 means no request.
+   This file can be read and written.
+
+What:  /sys/devices/pnp0/00:/ppi/response
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the response to the most recent operation
+   request it acted upon. The format is " 
+   : ".
+   This file is readonly.
+
+What:  /sys/devices/pnp0//ppi/transition_action
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the platform-specific action that should
+   take place in order to transition to the BIOS for execution of
+   a requested operation. The format is ": ".
+   This file is readonly.
+
+What:  /sys/devices/pnp0//ppi/tcg_operations
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows whether it is allowed to request an
+   operation to be executed in the pre-OS environment by the BIOS
+   for the requests defined by TCG, i.e. requests from 1 to 22.
+   The format is " : ".
+   This attribute is only supported by PPI version 1.2+.
+   This file is readonly.
+
+What:  /sys/devices/pnp0//ppi/vs_operations
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows whether it is allowed to request an
+   operation to be executed in the pre-OS environment by the BIOS
+   for the verdor specific requests, i.e. requests from 128 to
+   255. The format is same with tcg_operations. This attribute
+   is also only supported by PPI version 1.2+.
+   This file is readonly.
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v5 0/2] Add PPI support in tpm driver

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang 

The Physical Presence Interface enables the OS and the BIOS to cooperate to
provide a simple and straightforward platform user experience for
administering the TPM without sacrificing security.

Xiaoyan Zhang (2):
  Documentation: sysfs for Physical Presence Interface
  driver: add PPI support in tpm driver

 Documentation/ABI/testing/sysfs-driver-ppi |   70 +
 drivers/char/tpm/Makefile  |2 +-
 drivers/char/tpm/tpm.c |5 +
 drivers/char/tpm/tpm.h |9 +
 drivers/char/tpm/tpm_ppi.c |  460 
 5 files changed, 545 insertions(+), 1 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-ppi
 create mode 100644 drivers/char/tpm/tpm_ppi.c

-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v5 0/2] Add PPI support in tpm driver

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang xiaoyan.zh...@intel.com

The Physical Presence Interface enables the OS and the BIOS to cooperate to
provide a simple and straightforward platform user experience for
administering the TPM without sacrificing security.

Xiaoyan Zhang (2):
  Documentation: sysfs for Physical Presence Interface
  driver: add PPI support in tpm driver

 Documentation/ABI/testing/sysfs-driver-ppi |   70 +
 drivers/char/tpm/Makefile  |2 +-
 drivers/char/tpm/tpm.c |5 +
 drivers/char/tpm/tpm.h |9 +
 drivers/char/tpm/tpm_ppi.c |  460 
 5 files changed, 545 insertions(+), 1 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-ppi
 create mode 100644 drivers/char/tpm/tpm_ppi.c

-- 
1.7.7.6

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v5 1/2] Documentation: sysfs for Physical Presence Interface

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang xiaoyan.zh...@intel.com


Signed-off-by: Xiaoyan Zhang xiaoyan.zh...@intel.com
---
 Documentation/ABI/testing/sysfs-driver-ppi |   70 
 1 files changed, 70 insertions(+), 0 deletions(-)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-ppi

diff --git a/Documentation/ABI/testing/sysfs-driver-ppi 
b/Documentation/ABI/testing/sysfs-driver-ppi
new file mode 100644
index 000..97a003e
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-driver-ppi
@@ -0,0 +1,70 @@
+What:  /sys/devices/pnp0/bus-num/ppi/
+Date:  August 2012
+Kernel Version:3.6
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This folder includes the attributes related with PPI (Physical
+   Presence Interface). Only if TPM is supported by BIOS, this
+   folder makes sence. The folder path can be got by command
+   'find /sys/ -name 'pcrs''. For the detail information of PPI,
+   please refer to the PPI specification from
+   http://www.trustedcomputinggroup.org/
+
+What:  /sys/devices/pnp0/bus-num/ppi/version
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the version of the PPI supported by the
+   platform.
+   This file is readonly.
+
+What:  /sys/devices/pnp0/bus-num/ppi/request
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the request for an operation to be
+   executed in the pre-OS environment. It is the only input from
+   the OS to the pre-OS environment. The request should be an
+   integer value range from 1 to 160, and 0 means no request.
+   This file can be read and written.
+
+What:  /sys/devices/pnp0/00:bus-num/ppi/response
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the response to the most recent operation
+   request it acted upon. The format is request response num
+   : response description.
+   This file is readonly.
+
+What:  /sys/devices/pnp0/bus-num/ppi/transition_action
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows the platform-specific action that should
+   take place in order to transition to the BIOS for execution of
+   a requested operation. The format is action num: action
+   description.
+   This file is readonly.
+
+What:  /sys/devices/pnp0/bus-num/ppi/tcg_operations
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows whether it is allowed to request an
+   operation to be executed in the pre-OS environment by the BIOS
+   for the requests defined by TCG, i.e. requests from 1 to 22.
+   The format is request status num: status description.
+   This attribute is only supported by PPI version 1.2+.
+   This file is readonly.
+
+What:  /sys/devices/pnp0/bus-num/ppi/vs_operations
+Date:  August 2012
+Contact:   xiaoyan.zh...@intel.com
+Description:
+   This attribute shows whether it is allowed to request an
+   operation to be executed in the pre-OS environment by the BIOS
+   for the verdor specific requests, i.e. requests from 128 to
+   255. The format is same with tcg_operations. This attribute
+   is also only supported by PPI version 1.2+.
+   This file is readonly.
-- 
1.7.7.6

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v5 2/2] driver: add PPI support in tpm driver

2012-08-21 Thread xiaoyan . zhang
From: Xiaoyan Zhang xiaoyan.zh...@intel.com

The Physical Presence Interface enables the OS and the BIOS to cooperate and
provides a simple and straightforward platform user experience for
administering the TPM without sacrificing security.

V2: separate the patch out in a separate source file,
add #ifdef CONFIG_ACPI so it compiles out on ppc,
use standard error instead of ACPI error as return code of show/store fns.
V3: move #ifdef CONFIG_ACPI from .c file to .h file.
V4: move tpm_ppi code from tpm module to tpm_bios module.
V5: modify sys_add_ppi() so that ppi_attr_grp doesn't need to be exported

Signed-off-by: Xiaoyan Zhang xiaoyan.zh...@intel.com
---
 drivers/char/tpm/Makefile  |2 +-
 drivers/char/tpm/tpm.c |5 +
 drivers/char/tpm/tpm.h |9 +
 drivers/char/tpm/tpm_ppi.c |  460 
 4 files changed, 475 insertions(+), 1 deletions(-)
 create mode 100644 drivers/char/tpm/tpm_ppi.c

diff --git a/drivers/char/tpm/Makefile b/drivers/char/tpm/Makefile
index 9080cc4..5b3fc8b 100644
--- a/drivers/char/tpm/Makefile
+++ b/drivers/char/tpm/Makefile
@@ -4,7 +4,7 @@
 obj-$(CONFIG_TCG_TPM) += tpm.o
 ifdef CONFIG_ACPI
obj-$(CONFIG_TCG_TPM) += tpm_bios.o
-   tpm_bios-objs += tpm_eventlog.o tpm_acpi.o
+   tpm_bios-objs += tpm_eventlog.o tpm_acpi.o tpm_ppi.o
 else
 ifdef CONFIG_TCG_IBMVTPM
obj-$(CONFIG_TCG_TPM) += tpm_bios.o
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 0a75638..39526c0 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -1476,6 +1476,11 @@ struct tpm_chip *tpm_register_hardware(struct device 
*dev,
goto put_device;
}
 
+   if (sys_add_ppi(dev-kobj)) {
+   misc_deregister(chip-vendor.miscdev);
+   goto put_device;
+   }
+
chip-bios_dir = tpm_bios_log_setup(devname);
 
/* Make chip available */
diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
index f1af738..02c266a 100644
--- a/drivers/char/tpm/tpm.h
+++ b/drivers/char/tpm/tpm.h
@@ -327,3 +327,12 @@ extern int tpm_pm_suspend(struct device *);
 extern int tpm_pm_resume(struct device *);
 extern int wait_for_tpm_stat(struct tpm_chip *, u8, unsigned long,
 wait_queue_head_t *);
+
+#ifdef CONFIG_ACPI
+extern ssize_t sys_add_ppi(struct kobject *parent);
+#else
+static inline ssize_t sys_add_ppi(struct kobject *parent)
+{
+   return 0;
+}
+#endif
diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c
new file mode 100644
index 000..440fa1c
--- /dev/null
+++ b/drivers/char/tpm/tpm_ppi.c
@@ -0,0 +1,460 @@
+#include linux/acpi.h
+#include acpi/acpi_drivers.h
+#include tpm.h
+
+static const u8 tpm_ppi_uuid[] = {
+   0xA6, 0xFA, 0xDD, 0x3D,
+   0x1B, 0x36,
+   0xB4, 0x4E,
+   0xA4, 0x24,
+   0x8D, 0x10, 0x08, 0x9D, 0x16, 0x53
+};
+static char *tpm_device_name = TPM;
+
+#define TPM_PPI_REVISION_ID1
+#define TPM_PPI_FN_VERSION 1
+#define TPM_PPI_FN_SUBREQ  2
+#define TPM_PPI_FN_GETREQ  3
+#define TPM_PPI_FN_GETACT  4
+#define TPM_PPI_FN_GETRSP  5
+#define TPM_PPI_FN_SUBREQ2 7
+#define TPM_PPI_FN_GETOPR  8
+#define PPI_TPM_REQ_MAX22
+#define PPI_VS_REQ_START   128
+#define PPI_VS_REQ_END 255
+#define PPI_VERSION_LEN3
+
+static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context,
+   void **return_value)
+{
+   acpi_status status;
+   struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+   status = acpi_get_name(handle, ACPI_FULL_PATHNAME, buffer);
+   if (strstr(buffer.pointer, context) != NULL) {
+   *return_value = handle;
+   kfree(buffer.pointer);
+   return AE_CTRL_TERMINATE;
+   }
+   return AE_OK;
+}
+
+static inline void ppi_assign_params(union acpi_object params[4],
+u64 function_num)
+{
+   params[0].type = ACPI_TYPE_BUFFER;
+   params[0].buffer.length = sizeof(tpm_ppi_uuid);
+   params[0].buffer.pointer = (char *)tpm_ppi_uuid;
+   params[1].type = ACPI_TYPE_INTEGER;
+   params[1].integer.value = TPM_PPI_REVISION_ID;
+   params[2].type = ACPI_TYPE_INTEGER;
+   params[2].integer.value = function_num;
+   params[3].type = ACPI_TYPE_PACKAGE;
+   params[3].package.count = 0;
+   params[3].package.elements = NULL;
+}
+
+ssize_t tpm_show_ppi_version(struct device *dev, struct device_attribute *attr,
+char *buf)
+{
+   acpi_handle handle;
+   acpi_status status;
+   struct acpi_object_list input;
+   struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
+   union acpi_object params[4];
+   union acpi_object *obj;
+
+   input.count = 4;
+   ppi_assign_params(params, TPM_PPI_FN_VERSION);
+   input.pointer = params;
+   status = acpi_walk_namespace