optee: Add lib entries for sharing OPTEE code across ports
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Tue, 13 Mar 2018 16:50:27 +0000 (16:50 +0000)
committerTom Rini <trini@konsulko.com>
Mon, 19 Mar 2018 20:14:23 +0000 (16:14 -0400)
This patch adds code to lib to enable sharing of useful OPTEE code between
board-ports and architectures. The code on lib/optee/optee.c comes from the
TI omap2 port. Eventually the OMAP2 code will be patched to include the
shared code. The intention here is to add more useful OPTEE specific code
as more functionality gets added.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Cc: Harinarayan Bhatta <harinarayan@ti.com>
Cc: Andrew F. Davis <afd@ti.com>
Cc: Tom Rini <trini@konsulko.com>
Cc: Kever Yang <kever.yang@rock-chips.com>
Cc: Philipp Tomsich <philipp.tomsich@theobroma-systems.com>
Cc: Peng Fan <peng.fan@nxp.com>
Tested-by: Peng Fan <peng.fan@nxp.com>
include/tee/optee.h
lib/Kconfig
lib/Makefile
lib/optee/Kconfig [new file with mode: 0644]
lib/optee/Makefile [new file with mode: 0644]
lib/optee/optee.c [new file with mode: 0644]

index 9ab0d08634f2b9b9cc6c30953aa5f2217be10c35..8943afb4390778ba51f3a227001dd12a646d98e3 100644 (file)
@@ -10,6 +10,8 @@
 #ifndef        _OPTEE_H
 #define _OPTEE_H
 
+#include <linux/errno.h>
+
 #define OPTEE_MAGIC             0x4554504f
 #define OPTEE_VERSION           1
 #define OPTEE_ARCH_ARM32        0
@@ -27,4 +29,18 @@ struct optee_header {
        uint32_t paged_size;
 };
 
+#if defined(CONFIG_OPTEE)
+int optee_verify_image(struct optee_header *hdr, unsigned long tzdram_start,
+                      unsigned long tzdram_len, unsigned long image_len);
+#else
+static inline int optee_verify_image(struct optee_header *hdr,
+                                    unsigned long tzdram_start,
+                                    unsigned long tzdram_len,
+                                    unsigned long image_len)
+{
+       return -EPERM;
+}
+
+#endif
+
 #endif /* _OPTEE_H */
index 4fd41c4282a14ae7a93adf2b31b95e5ad80f921e..a4029a67dd6fff5184ae7ebd37ef837be3b25eac 100644 (file)
@@ -310,5 +310,6 @@ endmenu
 
 source lib/efi/Kconfig
 source lib/efi_loader/Kconfig
+source lib/optee/Kconfig
 
 endmenu
index 0db41c19f379f1209a5eaf622d8f1867e5655e5b..35da5705a4b3be8729973beb7d84b9d8033b2896 100644 (file)
@@ -18,6 +18,7 @@ obj-$(CONFIG_FIT) += libfdt/
 obj-$(CONFIG_OF_LIVE) += of_live.o
 obj-$(CONFIG_CMD_DHRYSTONE) += dhry/
 obj-$(CONFIG_ARCH_AT91) += at91/
+obj-$(CONFIG_OPTEE) += optee/
 
 obj-$(CONFIG_AES) += aes.o
 obj-y += charset.o
diff --git a/lib/optee/Kconfig b/lib/optee/Kconfig
new file mode 100644 (file)
index 0000000..2e406fe
--- /dev/null
@@ -0,0 +1,8 @@
+config OPTEE
+       bool "Support OPTEE images"
+       help
+         U-Boot can be configured to boot OPTEE images.
+         Selecting this option will enable shared OPTEE library code and
+          enable an OPTEE specific bootm command that will perform additional
+          OPTEE specific checks before booting an OPTEE image created with
+          mkimage.
diff --git a/lib/optee/Makefile b/lib/optee/Makefile
new file mode 100644 (file)
index 0000000..03e832f
--- /dev/null
@@ -0,0 +1,7 @@
+#
+# (C) Copyright 2017 Linaro
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-$(CONFIG_OPTEE) += optee.o
diff --git a/lib/optee/optee.c b/lib/optee/optee.c
new file mode 100644 (file)
index 0000000..2cc16d7
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 Linaro
+ * Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <tee/optee.h>
+
+int optee_verify_image(struct optee_header *hdr, unsigned long tzdram_start,
+                      unsigned long tzdram_len, unsigned long image_len)
+{
+       unsigned long tzdram_end = tzdram_start + tzdram_len;
+       uint32_t tee_file_size;
+
+       tee_file_size = hdr->init_size + hdr->paged_size +
+                       sizeof(struct optee_header);
+
+       if (hdr->magic != OPTEE_MAGIC ||
+           hdr->version != OPTEE_VERSION ||
+           hdr->init_load_addr_hi > tzdram_end ||
+           hdr->init_load_addr_lo < tzdram_start ||
+           tee_file_size > tzdram_len ||
+           tee_file_size != image_len ||
+           (hdr->init_load_addr_lo + tee_file_size) > tzdram_end) {
+               return -EINVAL;
+       }
+
+       return 0;
+}