summaryrefslogtreecommitdiffstats
path: root/libstb/tpm_chip.c
diff options
context:
space:
mode:
authorClaudio Carvalho <cclaudio@linux.vnet.ibm.com>2016-09-28 05:01:09 -0300
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-10-10 15:29:34 +1100
commitb64d937194e8a51c39c3a32e08ebebc4ae4bf4f5 (patch)
tree2bc63ff44f8f17c6d96ffecf8b4bc052ffc22926 /libstb/tpm_chip.c
parentbb725f224c08a4ffde428eb5576231efc528c06e (diff)
downloadtalos-skiboot-b64d937194e8a51c39c3a32e08ebebc4ae4bf4f5.tar.gz
talos-skiboot-b64d937194e8a51c39c3a32e08ebebc4ae4bf4f5.zip
libstb: add tpm_chip interface
This adds the TPM chip interface for libstb: - tpm_init(): call drivers' probe to find TPM devices that are compatible with them. - tpm_register_chip(): register a TPM chip which includes pointers to the TPM device and TPM driver structures. - tpm_add_status_property(): add the status device tree property for each registered TPM device. The TPM chip interface is documented in 'libstb/tpm_chip.h' and the tpm device tree node is documented in 'doc/device-tree/tpm.rst' Signed-off-by: Claudio Carvalho <cclaudio@linux.vnet.ibm.com> [stewart@linux.vnet.ibm.com: shuffle unused error path around] Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'libstb/tpm_chip.c')
-rw-r--r--libstb/tpm_chip.c117
1 files changed, 117 insertions, 0 deletions
diff --git a/libstb/tpm_chip.c b/libstb/tpm_chip.c
new file mode 100644
index 00000000..0fc3f89e
--- /dev/null
+++ b/libstb/tpm_chip.c
@@ -0,0 +1,117 @@
+/* Copyright 2013-2016 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <skiboot.h>
+#include <device.h>
+#include <string.h>
+
+#include "status_codes.h"
+#include "container.h"
+#include "tpm_chip.h"
+
+static struct list_head tpm_list = LIST_HEAD_INIT(tpm_list);
+
+int tpm_register_chip(struct dt_node *node, struct tpm_dev *dev,
+ struct tpm_driver *driver)
+{
+ int i;
+ struct tpm_chip *tpm;
+
+ i = 0;
+ list_for_each(&tpm_list, tpm, link) {
+ if (tpm->node == node) {
+ /**
+ * @fwts-label TPMAlreadyRegistered
+ * @fwts-advice TPM node already registered. The same
+ * node is being registered twice or there is a
+ * tpm node duplicate in the device tree
+ */
+ prlog(PR_WARNING, "TPM: tpm%d already registered\n",
+ tpm->id);
+ return STB_ERROR;
+ }
+ i++;
+ }
+
+ tpm = (struct tpm_chip*) malloc(sizeof(struct tpm_chip));
+ assert(tpm);
+ tpm->id = i;
+
+ tpm->enabled = true;
+ tpm->node = node;
+ tpm->dev = dev;
+ tpm->driver = driver;
+
+ list_add_tail(&tpm_list, &tpm->link);
+
+ prlog(PR_NOTICE, "TPM: tpm%d registered: driver=%s\n",
+ tpm->id, tpm->driver->name);
+
+ return 0;
+}
+
+void tpm_init(void)
+{
+ if (!list_empty(&tpm_list)) {
+ /**
+ * @fwts-label TPMAlreadyInitialized
+ * @fwts-advice TPM already initialized. Check if tpm is being
+ * initialized more than once.
+ */
+ prlog(PR_WARNING, "TPM: tpm device(s) already initialized\n");
+ return;
+ }
+
+ list_head_init(&tpm_list);
+
+ /* tpm drivers supported */
+
+ if (list_empty(&tpm_list))
+ /**
+ * @fwts-label TPMNotInitialized
+ * @fwts-advice No TPM chip has been initialized. We may not
+ * have a compatible tpm driver or there is no tpm node in the
+ * device tree with the expected bindings.
+ */
+ prlog(PR_ERR, "TPM: no tpm chip has been initialized\n");
+
+}
+
+void tpm_cleanup(void)
+{
+ struct tpm_chip *tpm = NULL;
+
+ tpm = list_pop(&tpm_list, struct tpm_chip, link);
+
+ while (tpm) {
+ /* deallocate memory */
+ if (tpm->dev)
+ free(tpm->dev);
+ tpm->driver = NULL;
+ free(tpm);
+ tpm = list_pop(&tpm_list, struct tpm_chip, link);
+ }
+
+ list_head_init(&tpm_list);
+}
+
+void tpm_add_status_property(void) {
+ struct tpm_chip *tpm;
+ list_for_each(&tpm_list, tpm, link) {
+ dt_add_property_string(tpm->node, "status",
+ tpm->enabled ? "okay" : "disabled");
+ }
+}
OpenPOWER on IntegriCloud