aboutsummaryrefslogtreecommitdiffstats
path: root/meta-agl-bsp/meta-rcar-gen3/recipes-bsp
diff options
context:
space:
mode:
Diffstat (limited to 'meta-agl-bsp/meta-rcar-gen3/recipes-bsp')
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-Fix-for-teec_trace.c-snprintf-Werror-format-truncati.patch28
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-tee-supplicant-use-MMC_IOC_MULTI_CMD-for-RPMB-access.patch208
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/optee.service9
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client_git.bb63
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples/0001-secure_storage-ta-Add-a-missing-include-file.patch29
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb61
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-core-define-syscall_t-as-void-void.patch75
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-scripts-update-scripts-to-use-python3.patch427
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os_git.bb75
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test/optee_xtest_fix.diff13
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb55
-rw-r--r--meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb57
12 files changed, 1100 insertions, 0 deletions
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-Fix-for-teec_trace.c-snprintf-Werror-format-truncati.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-Fix-for-teec_trace.c-snprintf-Werror-format-truncati.patch
new file mode 100644
index 000000000..db8bdace3
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-Fix-for-teec_trace.c-snprintf-Werror-format-truncati.patch
@@ -0,0 +1,28 @@
+From 30dd2986fb64aba7ee78d4e231c344e2c39d7999 Mon Sep 17 00:00:00 2001
+From: Simon Hughes <simon.hughes@arm.com>
+Date: Thu, 21 Jun 2018 17:22:23 +0100
+Subject: [PATCH] Fix for teec_trace.c snprintf -Werror=format-truncation=
+ error.
+
+Signed-off-by: Simon Hughes <simon.hughes@arm.com>
+---
+ libteec/src/teec_trace.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/libteec/src/teec_trace.c b/libteec/src/teec_trace.c
+index 78b79d6..c91bc43 100644
+--- a/libteec/src/teec_trace.c
++++ b/libteec/src/teec_trace.c
+@@ -106,7 +106,8 @@ int _dprintf(const char *function, int flen, int line, int level,
+ */
+ int thread_id = syscall(SYS_gettid); /* perf issue ? */
+
+- snprintf(prefixed, MAX_PRINT_SIZE,
++ int len = 0;
++ len = snprintf(prefixed+len, MAX_PRINT_SIZE,
+ "%s [%d] %s:%s:%d: %s",
+ trace_level_strings[level], thread_id, prefix, func,
+ line, raw);
+--
+2.7.4
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-tee-supplicant-use-MMC_IOC_MULTI_CMD-for-RPMB-access.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-tee-supplicant-use-MMC_IOC_MULTI_CMD-for-RPMB-access.patch
new file mode 100644
index 000000000..fddc7fc13
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/0001-tee-supplicant-use-MMC_IOC_MULTI_CMD-for-RPMB-access.patch
@@ -0,0 +1,208 @@
+From 04a72e88f768722edff453694e70535d36a8b1b4 Mon Sep 17 00:00:00 2001
+From: Hiroki Negishi <hiroki.negishi.bx@renesas.com>
+Date: Mon, 1 Apr 2019 13:10:57 +0900
+Subject: [PATCH] tee-supplicant: use MMC_IOC_MULTI_CMD for RPMB access
+
+To access RPMB, host should switch to RPMB partition.
+And in RPMB partition, host should finish RPMB sequence.
+
+In case of using MMC_IOC_CMD as RPMB ioctl, eMMC driver switches
+partition to user data area between WRITE command and READ command.
+This may cause General failure.
+In case of MMC_IOC_MULTI_CMD, eMMC driver keeps RPMB partition.
+
+This patch changes RPMB ioctl from MMC_IOC_CMD into MMC_IOC_MULTI_CMD
+and changes ioctl parameters according to mmc utils.
+
+Signed-off-by: Hiroki Negishi <hiroki.negishi.bx@renesas.com>
+---
+ tee-supplicant/src/rpmb.c | 120 +++++++++++++++++++++++-----------------------
+ 1 file changed, 61 insertions(+), 59 deletions(-)
+
+diff --git a/tee-supplicant/src/rpmb.c b/tee-supplicant/src/rpmb.c
+index cac9932..29da690 100644
+--- a/tee-supplicant/src/rpmb.c
++++ b/tee-supplicant/src/rpmb.c
+@@ -114,6 +114,7 @@ static pthread_mutex_t rpmb_mutex = PTHREAD_MUTEX_INITIALIZER;
+ */
+
+ #define MMC_BLOCK_MAJOR 179
++#define RPMB_MULTI_CMD_MAX_CMDS 3
+
+ /* mmc_ioc_cmd.opcode */
+ #define MMC_SEND_EXT_CSD 8
+@@ -130,6 +131,9 @@ static pthread_mutex_t rpmb_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+ #define MMC_CMD_ADTC (1 << 5) /* Addressed data transfer command */
+
++#define MMC_RSP_SPI_S1 (1 << 7) /* one status byte */
++#define MMC_RSP_SPI_R1 (MMC_RSP_SPI_S1)
++
+ /* mmc_ioc_cmd.write_flag */
+ #define MMC_CMD23_ARG_REL_WR (1 << 31) /* CMD23 reliable write */
+
+@@ -610,26 +614,38 @@ static uint32_t read_ext_csd(int fd, uint8_t *ext_csd)
+ return TEEC_SUCCESS;
+ }
+
++static inline void set_single_cmd(struct mmc_ioc_cmd *ioc, __u32 opcode,
++ int write_flag, unsigned int blocks)
++{
++ ioc->opcode = opcode;
++ ioc->write_flag = write_flag;
++ ioc->arg = 0x0;
++ ioc->blksz = 512;
++ ioc->blocks = blocks;
++ ioc->flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC;
++}
++
+ static uint32_t rpmb_data_req(int fd, struct rpmb_data_frame *req_frm,
+ size_t req_nfrm, struct rpmb_data_frame *rsp_frm,
+ size_t rsp_nfrm)
+ {
+- int st;
++ int err;
+ size_t i;
+ uint16_t msg_type = ntohs(req_frm->msg_type);
+- struct mmc_ioc_cmd cmd;
++ struct mmc_ioc_cmd *ioc;
++ struct mmc_ioc_multi_cmd *mioc;
++ struct rpmb_data_frame frame_status = {0};
+
+- memset(&cmd, 0, sizeof(cmd));
+- cmd.blksz = 512;
+- cmd.blocks = req_nfrm;
+- cmd.data_ptr = (uintptr_t)req_frm;
+- cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC;
+- cmd.opcode = MMC_WRITE_MULTIPLE_BLOCK;
+- cmd.write_flag = 1;
++ mioc = (struct mmc_ioc_multi_cmd *)
++ malloc(sizeof(struct mmc_ioc_multi_cmd) +
++ RPMB_MULTI_CMD_MAX_CMDS * sizeof(struct mmc_ioc_cmd));
++ if (!mioc)
++ return -ENOMEM;
+
+ for (i = 1; i < req_nfrm; i++) {
+ if (req_frm[i].msg_type != msg_type) {
+ EMSG("All request frames shall be of the same type");
++ free(mioc);
+ return TEEC_ERROR_BAD_PARAMETERS;
+ }
+ }
+@@ -642,77 +658,63 @@ static uint32_t rpmb_data_req(int fd, struct rpmb_data_frame *req_frm,
+ case RPMB_MSG_TYPE_REQ_AUTH_DATA_WRITE:
+ if (rsp_nfrm != 1) {
+ EMSG("Expected only one response frame");
++ free(mioc);
+ return TEEC_ERROR_BAD_PARAMETERS;
+ }
+
+- /* Send write request frame(s) */
+- cmd.write_flag |= MMC_CMD23_ARG_REL_WR;
+- /*
+- * Black magic: tested on a HiKey board with a HardKernel eMMC
+- * module. When postsleep values are zero, the kernel logs
+- * random errors: "mmc_blk_ioctl_cmd: Card Status=0x00000E00"
+- * and ioctl() fails.
+- */
+- cmd.postsleep_min_us = 20000;
+- cmd.postsleep_max_us = 50000;
+- st = IOCTL(fd, MMC_IOC_CMD, &cmd);
+- if (st < 0)
+- return TEEC_ERROR_GENERIC;
+- cmd.postsleep_min_us = 0;
+- cmd.postsleep_max_us = 0;
+-
+- /* Send result request frame */
+- memset(rsp_frm, 0, 1);
+- rsp_frm->msg_type = htons(RPMB_MSG_TYPE_REQ_RESULT_READ);
+- cmd.data_ptr = (uintptr_t)rsp_frm;
+- cmd.write_flag &= ~MMC_CMD23_ARG_REL_WR;
+- st = IOCTL(fd, MMC_IOC_CMD, &cmd);
+- if (st < 0)
+- return TEEC_ERROR_GENERIC;
+-
+- /* Read response frame */
+- cmd.opcode = MMC_READ_MULTIPLE_BLOCK;
+- cmd.write_flag = 0;
+- cmd.blocks = rsp_nfrm;
+- st = IOCTL(fd, MMC_IOC_CMD, &cmd);
+- if (st < 0)
+- return TEEC_ERROR_GENERIC;
++ mioc->num_of_cmds = 3;
++
++ /* Write request */
++ ioc = &mioc->cmds[0];
++ set_single_cmd(ioc, MMC_WRITE_MULTIPLE_BLOCK, (1 << 31) | 1, 1);
++ mmc_ioc_cmd_set_data((*ioc), req_frm);
++
++ /* Result request */
++ ioc = &mioc->cmds[1];
++ frame_status.msg_type = htobe16(RPMB_MSG_TYPE_REQ_RESULT_READ);
++ set_single_cmd(ioc, MMC_WRITE_MULTIPLE_BLOCK, 1, 1);
++ mmc_ioc_cmd_set_data((*ioc), &frame_status);
++
++ /* Get response */
++ ioc = &mioc->cmds[2];
++ set_single_cmd(ioc, MMC_READ_MULTIPLE_BLOCK, 0, 1);
++ mmc_ioc_cmd_set_data((*ioc), rsp_frm);
++
+ break;
+
+ case RPMB_MSG_TYPE_REQ_WRITE_COUNTER_VAL_READ:
+ if (rsp_nfrm != 1) {
+ EMSG("Expected only one response frame");
++ free(mioc);
+ return TEEC_ERROR_BAD_PARAMETERS;
+ }
+
+ /* Fall through */
+ case RPMB_MSG_TYPE_REQ_AUTH_DATA_READ:
+- if (req_nfrm != 1) {
+- EMSG("Expected only one request frame");
+- return TEEC_ERROR_BAD_PARAMETERS;
+- }
++ mioc->num_of_cmds = 2;
++
++ /* Read request */
++ ioc = &mioc->cmds[0];
++ set_single_cmd(ioc, MMC_WRITE_MULTIPLE_BLOCK, 1, 1);
++ mmc_ioc_cmd_set_data((*ioc), req_frm);
++
++ /* Get response */
++ ioc = &mioc->cmds[1];
++ set_single_cmd(ioc, MMC_READ_MULTIPLE_BLOCK, 0, rsp_nfrm);
++ mmc_ioc_cmd_set_data((*ioc), rsp_frm);
+
+- /* Send request frame */
+- st = IOCTL(fd, MMC_IOC_CMD, &cmd);
+- if (st < 0)
+- return TEEC_ERROR_GENERIC;
+-
+- /* Read response frames */
+- cmd.data_ptr = (uintptr_t)rsp_frm;
+- cmd.opcode = MMC_READ_MULTIPLE_BLOCK;
+- cmd.write_flag = 0;
+- cmd.blocks = rsp_nfrm;
+- st = IOCTL(fd, MMC_IOC_CMD, &cmd);
+- if (st < 0)
+- return TEEC_ERROR_GENERIC;
+ break;
+
+ default:
+ EMSG("Unsupported message type: %d", msg_type);
++ free(mioc);
+ return TEEC_ERROR_GENERIC;
+ }
+
+- return TEEC_SUCCESS;
++ err = ioctl(fd, MMC_IOC_MULTI_CMD, mioc);
++
++ free(mioc);
++ return err;
+ }
+
+ static uint32_t rpmb_get_dev_info(uint16_t dev_id, struct rpmb_dev_info *info)
+--
+2.7.4
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/optee.service b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/optee.service
new file mode 100644
index 000000000..37fc4f752
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client/optee.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=optee services
+
+[Service]
+ExecStart=/usr/bin/tee-supplicant
+ExecStop=/usr/bin/killall -s KILL tee-supplicant
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client_git.bb
new file mode 100644
index 000000000..0319f2174
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-client_git.bb
@@ -0,0 +1,63 @@
+DESCRIPTION = "OP-TEE Client"
+LICENSE = "BSD-2-Clause"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=69663ab153298557a59c67a60a743e5b"
+PR = "r0"
+PV = "3.1.0+renesas+git${SRCPV}"
+BRANCH = "master"
+SRC_URI = "git://github.com/OP-TEE/optee_client.git;branch=${BRANCH}"
+SRCREV = "3f16662284a69fdec97b1712064be94d1fed7ae7"
+
+SRC_URI += " \
+ file://optee.service \
+ file://0001-tee-supplicant-use-MMC_IOC_MULTI_CMD-for-RPMB-access.patch \
+ file://0001-Fix-for-teec_trace.c-snprintf-Werror-format-truncati.patch \
+"
+
+inherit python3native systemd
+SYSTEMD_SERVICE_${PN} = "optee.service"
+
+COMPATIBLE_MACHINE = "salvator-x|h3ulcb|m3ulcb|m3nulcb|ebisu"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+S = "${WORKDIR}/git"
+
+# Recipe which fail to compile when enabling _FORTIFY_SOURCE=2 option
+SECURITY_CFLAGS_pn-optee-client = ""
+
+EXTRA_OEMAKE = "RPMB_EMU=0"
+
+do_install () {
+ # Create destination directories
+ install -d ${D}/${libdir}
+ install -d ${D}/${includedir}
+
+ # Install library
+ install -m 0755 ${S}/out/export/lib/libteec.so.1.0 ${D}/${libdir}
+
+ # Create symbolic link
+ cd ${D}/${libdir}
+ ln -sf libteec.so.1.0 libteec.so.1
+ ln -sf libteec.so.1 libteec.so
+
+ # Install header files
+ install -m 0644 ${S}/out/export/include/* ${D}/${includedir}
+
+ # Install systemd service configure file for OP-TEE client
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
+ install -d ${D}/${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/optee.service ${D}/${systemd_system_unitdir}
+ fi
+}
+
+# install the tee-supplicant for 64 bit only.
+do_install_append_aarch64 () {
+ # Create destination directory
+ install -d ${D}/${bindir}
+
+ # Install binary to bindir
+ install -m 0755 ${S}/out/export/bin/tee-supplicant ${D}/${bindir}
+}
+
+RPROVIDES_${PN} += "optee-client"
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples/0001-secure_storage-ta-Add-a-missing-include-file.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples/0001-secure_storage-ta-Add-a-missing-include-file.patch
new file mode 100644
index 000000000..7627a0660
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples/0001-secure_storage-ta-Add-a-missing-include-file.patch
@@ -0,0 +1,29 @@
+From be7079678aeb1503e0f681d977c47c44fd7b4f8c Mon Sep 17 00:00:00 2001
+From: Pierre Marzin <pierre.marzin@iot.bzh>
+Date: Mon, 19 Aug 2019 09:33:17 +0000
+Subject: [PATCH] secure_storage: ta: Add a missing include file
+
+The commit 9890a50d3c26b377dcb27f5db680018e15a5a3de fix a size type by
+using a format macro contant 'PRIu32' into a printf. This needs the
+inttypes.h header file to build correctly with aarch64-linux-gnu-gcc.
+
+Signed-off-by: Pierre Marzin <pierre.marzin@iot.bzh>
+---
+ secure_storage/ta/secure_storage_ta.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/secure_storage/ta/secure_storage_ta.c b/secure_storage/ta/secure_storage_ta.c
+index 3ccc12d..cfdfbb6 100644
+--- a/secure_storage/ta/secure_storage_ta.c
++++ b/secure_storage/ta/secure_storage_ta.c
+@@ -28,6 +28,7 @@
+ #include <secure_storage_ta.h>
+ #include <tee_internal_api.h>
+ #include <tee_internal_api_extensions.h>
++#include <inttypes.h>
+
+ static TEE_Result delete_object(uint32_t param_types, TEE_Param params[4])
+ {
+--
+2.11.0
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb
new file mode 100644
index 000000000..440fe8fdd
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-examples_git.bb
@@ -0,0 +1,61 @@
+SUMMARY = "OP-TEE examples"
+
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=cd95ab417e23b94f381dafc453d70c30"
+
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit python3native
+
+PV = "3.6.0+git${SRCPV}"
+
+SRCREV = "292da2fd8db0176e0e96989268c63ef9ab910a6c"
+
+SRC_URI = " \
+ git://github.com/linaro-swg/optee_examples;branch=master;name=master \
+ file://0001-secure_storage-ta-Add-a-missing-include-file.patch \
+"
+
+COMPATIBLE_MACHINE = "(salvator-x|h3ulcb|m3ulcb|m3nulcb|ebisu)"
+PLATFORM = "rcar"
+
+DEPENDS = "optee-os optee-client python-pycrypto-native"
+
+CFLAGS += "-Wno-extra -Wno-error=format"
+TARGET_CFLAGS += "-Wno-extra -Wno-error=format"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+INSANE_SKIP_${PN} = "ldflags"
+
+TA_DEV_KIT_DIR = "${STAGING_DIR_TARGET}/usr/share/optee/export-ta_arm64"
+
+OPTEE_CLIENT_EXPORT = "${STAGING_DIR_TARGET}/usr"
+
+TEEC_EXPORT = "${STAGING_DIR_TARGET}/usr"
+
+S = "${WORKDIR}/git"
+EXTRA_OEMAKE = "\
+ TEEC_EXPORT=${TEEC_EXPORT} \
+ OPTEE_CLIENT_EXPORT=${OPTEE_CLIENT_EXPORT} \
+ TA_DEV_KIT_DIR=${TA_DEV_KIT_DIR} \
+ HOST_CROSS_COMPILE=${TARGET_PREFIX} \
+ TA_CROSS_COMPILE=${TARGET_PREFIX} \
+ PLATFORM=${PLATFORM} \
+ V=1 \
+ "
+
+do_compile() {
+ oe_runmake
+}
+
+do_install () {
+ mkdir -p ${D}${nonarch_base_libdir}/optee_armtz
+ mkdir -p ${D}${bindir}
+ install -D -p -m0755 ${S}/out/ca/* ${D}${bindir}
+ install -D -p -m0444 ${S}/out/ta/* ${D}${nonarch_base_libdir}/optee_armtz
+ mkdir -p ${D}${includedir}
+ cp ${S}/hello_world/ta/include/* ${D}${includedir}
+}
+
+FILES_${PN} += "${nonarch_base_libdir}/optee_armtz/"
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-core-define-syscall_t-as-void-void.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-core-define-syscall_t-as-void-void.patch
new file mode 100644
index 000000000..bad7b27c6
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-core-define-syscall_t-as-void-void.patch
@@ -0,0 +1,75 @@
+From f6d17e33e7b95c90a2521cfd37cd5cb511909fc4 Mon Sep 17 00:00:00 2001
+From: Jerome Forissier <jerome.forissier@linaro.org>
+Date: Thu, 5 Jul 2018 13:07:52 +0200
+Subject: [PATCH] core: define syscall_t as void (*)(void)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+syscall_t is currently typedef'ed as TEE_Result (*)(void). It is used to
+represent a pointer to any system call, in the syscall table for instance.
+As such, the exact type behind syscall_t cannot reflect all the syscalls
+since they have different prototypes. The current declaration with a
+TEE_Result return type was probably chosen because it was a common
+characteristic of all syscalls to return a TEE_Result.
+
+However, this type causes compilation warnings with GCC 8.1:
+
+core/arch/arm/tee/arch_svc.c:43:36: warning: cast between incompatible function types from ‘void (*)(long unsigned int)’ to ‘TEE_Result (*)(void)’ {aka ‘unsigned int (*)(void)’} [-Wcast-function-type]
+ #define SYSCALL_ENTRY(_fn) { .fn = (syscall_t)_fn }
+ ^
+core/arch/arm/tee/arch_svc.c:50:2: note: in expansion of macro ‘SYSCALL_ENTRY’
+ SYSCALL_ENTRY(syscall_sys_return),
+ ^~~~~~~~~~~~~
+
+The solution is to use 'void (*)(void)' instead, as explained in the GCC
+documentation:
+
+ -Wcast-function-type
+
+ Warn when a function pointer is cast to an incompatible function
+ pointer. [...] The function type void (*) (void) is special and matches
+ everything, which can be used to suppress this warning. [...]
+
+Link: [1] https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
+Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
+Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
+---
+ core/arch/arm/tee/arch_svc.c | 2 +-
+ core/arch/arm/tee/arch_svc_private.h | 7 +++++--
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/core/arch/arm/tee/arch_svc.c b/core/arch/arm/tee/arch_svc.c
+index eb142ec..b2dd193 100644
+--- a/core/arch/arm/tee/arch_svc.c
++++ b/core/arch/arm/tee/arch_svc.c
+@@ -208,7 +208,7 @@ void __weak tee_svc_handler(struct thread_svc_regs *regs)
+ }
+
+ if (scn > TEE_SCN_MAX)
+- scf = syscall_not_supported;
++ scf = (syscall_t)syscall_not_supported;
+ else
+ scf = tee_svc_syscall_table[scn].fn;
+
+diff --git a/core/arch/arm/tee/arch_svc_private.h b/core/arch/arm/tee/arch_svc_private.h
+index c0b3a73..695e733 100644
+--- a/core/arch/arm/tee/arch_svc_private.h
++++ b/core/arch/arm/tee/arch_svc_private.h
+@@ -7,8 +7,11 @@
+
+ #include <tee_api_types.h>
+
+-/* void argument but in reality it can be any number of arguments */
+-typedef TEE_Result (*syscall_t)(void);
++/*
++ * Generic "pointer to function" type. Actual syscalls take zero or more
++ * arguments and return TEE_Result.
++ */
++typedef void (*syscall_t)(void);
+
+ /* Helper function for tee_svc_handler() */
+ uint32_t tee_svc_do_call(struct thread_svc_regs *regs, syscall_t func);
+--
+2.7.4
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-scripts-update-scripts-to-use-python3.patch b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-scripts-update-scripts-to-use-python3.patch
new file mode 100644
index 000000000..9621cf6c4
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os/0001-scripts-update-scripts-to-use-python3.patch
@@ -0,0 +1,427 @@
+From 0d4941123b5a88351f5954f6de00892f85ed5abc Mon Sep 17 00:00:00 2001
+From: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
+Date: Mon, 20 Jan 2020 22:32:13 +0000
+Subject: [PATCH] scripts: update scripts to use python3
+
+Python2 is deprecated effective Jan. 2020, and is not available in
+several distributions.
+
+Update scripts here to re-target then onto python version 3.
+
+Upstream-Status: Pending
+
+Signed-off-by: Andrey Zhizhikin <andrey.zhizhikin@leica-geosystems.com>
+---
+ scripts/gen_hashed_bin.py | 282 ++++++++++++++++++++------------------
+ scripts/gen_ld_sects.py | 8 +-
+ scripts/pem_to_pub_c.py | 2 +-
+ scripts/sign.py | 2 +-
+ scripts/symbolize.py | 2 +-
+ scripts/ta_bin_to_c.py | 2 +-
+ scripts/tee_bin_parser.py | 2 +-
+ 7 files changed, 157 insertions(+), 143 deletions(-)
+
+diff --git a/scripts/gen_hashed_bin.py b/scripts/gen_hashed_bin.py
+index 32350a47..a76a62cc 100755
+--- a/scripts/gen_hashed_bin.py
++++ b/scripts/gen_hashed_bin.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2014-2017, Linaro Limited
+@@ -14,163 +14,177 @@ import hashlib
+ arch_id = {'arm32': 0, 'arm64': 1}
+ image_id = {'pager': 0, 'paged': 1}
+
++
+ def write_header_v1(outf, init_size, args, paged_size):
+- magic = 0x4554504f # 'OPTE'
+- version = 1;
+- outf.write(struct.pack('<IBBHIIIII', \
+- magic, version, arch_id[args.arch], args.flags, init_size, \
+- args.init_load_addr_hi, args.init_load_addr_lo, \
+- args.init_mem_usage, paged_size))
++ magic = 0x4554504f # 'OPTE'
++ version = 1
++ outf.write(struct.pack('<IBBHIIIII',
++ magic,
++ version,
++ arch_id[args.arch],
++ args.flags,
++ init_size,
++ args.init_load_addr_hi,
++ args.init_load_addr_lo,
++ args.init_mem_usage,
++ paged_size))
++
+
+ def write_header_v2(outf, init_size, args, paged_size):
+- magic = 0x4554504f # 'OPTE'
+- version = 2
+- nb_images = 1 if paged_size == 0 else 2
+- outf.write(struct.pack('<IBBHI', \
+- magic, version, arch_id[args.arch], args.flags, nb_images))
+- outf.write(struct.pack('<IIII', \
+- args.init_load_addr_hi, args.init_load_addr_lo, \
+- image_id['pager'], init_size))
+- if nb_images == 2:
+- outf.write(struct.pack('<IIII', \
+- 0xffffffff, 0xffffffff, image_id['paged'], paged_size))
++ magic = 0x4554504f # 'OPTE'
++ version = 2
++ nb_images = 1 if paged_size == 0 else 2
++ outf.write(struct.pack('<IBBHI', magic, version,
++ arch_id[args.arch], args.flags, nb_images))
++ outf.write(struct.pack('<IIII',
++ args.init_load_addr_hi, args.init_load_addr_lo,
++ image_id['pager'], init_size))
++ if nb_images == 2:
++ outf.write(
++ struct.pack(
++ '<IIII',
++ 0xffffffff,
++ 0xffffffff,
++ image_id['paged'],
++ paged_size))
++
+
+ def append_to(outf, start_offs, in_fname, max_bytes=0xffffffff):
+- #print "Appending %s@0x%x 0x%x bytes at position 0x%x" % \
+- #( in_fname, start_offs, max_bytes, int(outf.tell()) )
+- inf = open(in_fname, 'rb');
+- inf.seek(start_offs)
+- while True :
+- nbytes = min(16 * 1024, max_bytes)
+- if nbytes == 0 :
+- break
+- #print "Reading %s %d bytes" % (in_fname, nbytes)
+- buf = inf.read(nbytes)
+- if not buf :
+- break
+- outf.write(buf)
+- max_bytes -= len(buf)
+- inf.close()
++ inf = open(in_fname, 'rb')
++ inf.seek(start_offs)
++ while True:
++ nbytes = min(16 * 1024, max_bytes)
++ if nbytes == 0:
++ break
++ buf = inf.read(nbytes)
++ if not buf:
++ break
++ outf.write(buf)
++ max_bytes -= len(buf)
++ inf.close()
++
+
+ def append_hashes(outf, in_fname):
+- page_size = 4 * 1024
+-
+- inf = open(in_fname, 'r')
+- while True :
+- page = inf.read(page_size)
+- if len(page) == page_size :
+- #print "Writing hash at position 0x%x" % \
+- #int(outf.tell())
+- outf.write(hashlib.sha256(page).digest())
+- elif len(page) == 0 :
+- break
+- else :
+- print("Error: short read, got " + repr(len(page)))
+- sys.exit(1)
+-
+- inf.close()
++ page_size = 4 * 1024
++
++ inf = open(in_fname, 'rb')
++ while True:
++ page = inf.read(page_size)
++ if len(page) == page_size:
++ outf.write(hashlib.sha256(page).digest())
++ elif len(page) == 0:
++ break
++ else:
++ print("Error: short read, got {}".format(len(page)))
++ sys.exit(1)
++
++ inf.close()
++
+
+ def int_parse(str):
+- return int(str, 0)
++ return int(str, 0)
++
+
+ def get_args():
+- parser = argparse.ArgumentParser()
+- parser.add_argument('--arch', required=True, \
+- choices=arch_id.keys(), \
+- help='Architecture')
++ parser = argparse.ArgumentParser()
++ parser.add_argument('--arch', required=True,
++ choices=list(arch_id.keys()),
++ help='Architecture')
+
+- parser.add_argument('--flags', \
+- type=int, default=0, \
+- help='Flags, currently none defined')
++ parser.add_argument('--flags',
++ type=int, default=0,
++ help='Flags, currently none defined')
+
+- parser.add_argument('--init_size', \
+- required=True, type=int_parse, \
+- help='Size of initialization part of binary')
++ parser.add_argument('--init_size',
++ required=True, type=int_parse,
++ help='Size of initialization part of binary')
+
+- parser.add_argument('--init_load_addr_hi', \
+- type=int_parse, default=0, \
+- help='Upper 32 bits of load address of binary')
++ parser.add_argument('--init_load_addr_hi',
++ type=int_parse, default=0,
++ help='Upper 32 bits of load address of binary')
+
+- parser.add_argument('--init_load_addr_lo', \
+- required=True, type=int_parse, \
+- help='Lower 32 bits of load address of binary')
++ parser.add_argument('--init_load_addr_lo',
++ required=True, type=int_parse,
++ help='Lower 32 bits of load address of binary')
+
+- parser.add_argument('--init_mem_usage', \
+- required=True, type=int_parse, \
+- help='Total amount of used memory when initializing');
++ parser.add_argument('--init_mem_usage',
++ required=True, type=int_parse,
++ help='Total amount of used memory when initializing')
+
+- parser.add_argument('--tee_pager_bin', \
+- required=True, \
+- help='The input tee_pager.bin')
++ parser.add_argument('--tee_pager_bin',
++ required=True,
++ help='The input tee_pager.bin')
+
+- parser.add_argument('--tee_pageable_bin', \
+- required=True, \
+- help='The input tee_pageable.bin')
++ parser.add_argument('--tee_pageable_bin',
++ required=True,
++ help='The input tee_pageable.bin')
+
+- parser.add_argument('--out', \
+- required=False, type=argparse.FileType('wb'), \
+- help='The output tee.bin')
++ parser.add_argument('--out',
++ required=False, type=argparse.FileType('wb'),
++ help='The output tee.bin')
+
+- parser.add_argument('--out_header_v2', \
+- required=False, type=argparse.FileType('wb'), \
+- help='The output tee_header_v2.bin')
++ parser.add_argument('--out_header_v2',
++ required=False, type=argparse.FileType('wb'),
++ help='The output tee_header_v2.bin')
+
+- parser.add_argument('--out_pager_v2', \
+- required=False, type=argparse.FileType('wb'), \
+- help='The output tee_pager_v2.bin')
++ parser.add_argument('--out_pager_v2',
++ required=False, type=argparse.FileType('wb'),
++ help='The output tee_pager_v2.bin')
+
+- parser.add_argument('--out_pageable_v2', \
+- required=False, type=argparse.FileType('wb'), \
+- help='The output tee_pageable_v2.bin')
++ parser.add_argument('--out_pageable_v2',
++ required=False, type=argparse.FileType('wb'),
++ help='The output tee_pageable_v2.bin')
++
++ return parser.parse_args()
+
+- return parser.parse_args();
+
+ def main():
+- args = get_args()
+- init_bin_size = args.init_size
+- tee_pager_fname = args.tee_pager_bin
+- tee_pageable_fname = args.tee_pageable_bin
+- pager_input_size = os.path.getsize(tee_pager_fname);
+- paged_input_size = os.path.getsize(tee_pageable_fname);
+- hash_size = paged_input_size / (4 * 1024) * \
+- hashlib.sha256().digest_size
+-
+- if paged_input_size % (4 * 1024) != 0:
+- print("Error: pageable size not a multiple of 4K:" + \
+- repr(paged_input_size))
+- sys.exit(1)
+-
+- init_size = pager_input_size + \
+- min(init_bin_size, paged_input_size) + \
+- hash_size
+- paged_size = paged_input_size - \
+- min(init_bin_size, paged_input_size)
+-
+- if args.out is not None:
+- outf = args.out
+- write_header_v1(outf, init_size, args, paged_size)
+- append_to(outf, 0, tee_pager_fname)
+- append_to(outf, 0, tee_pageable_fname, init_bin_size)
+- append_hashes(outf, tee_pageable_fname)
+- append_to(outf, init_bin_size, tee_pageable_fname)
+- outf.close()
+-
+- if args.out_header_v2 is not None:
+- outf = args.out_header_v2
+- write_header_v2(outf, init_size, args, paged_size)
+- outf.close()
+-
+- if args.out_pager_v2 is not None:
+- outf = args.out_pager_v2
+- append_to(outf, 0, tee_pager_fname)
+- append_to(outf, 0, tee_pageable_fname, init_bin_size)
+- append_hashes(outf, tee_pageable_fname)
+- outf.close()
+-
+- if args.out_pageable_v2 is not None:
+- outf = args.out_pageable_v2
+- append_to(outf, init_bin_size, tee_pageable_fname)
+- outf.close()
++ args = get_args()
++ init_bin_size = args.init_size
++ tee_pager_fname = args.tee_pager_bin
++ tee_pageable_fname = args.tee_pageable_bin
++ pager_input_size = os.path.getsize(tee_pager_fname)
++ paged_input_size = os.path.getsize(tee_pageable_fname)
++ hash_size = paged_input_size // (4 * 1024) * \
++ hashlib.sha256().digest_size
++
++ if paged_input_size % (4 * 1024) != 0:
++ print("Error: pageable size not a multiple of 4K: {}".format(
++ paged_input_size))
++ sys.exit(1)
++
++ init_size = pager_input_size + \
++ min(init_bin_size, paged_input_size) + \
++ hash_size
++ paged_size = paged_input_size - \
++ min(init_bin_size, paged_input_size)
++
++ if args.out is not None:
++ outf = args.out
++ write_header_v1(outf, init_size, args, paged_size)
++ append_to(outf, 0, tee_pager_fname)
++ append_to(outf, 0, tee_pageable_fname, init_bin_size)
++ append_hashes(outf, tee_pageable_fname)
++ append_to(outf, init_bin_size, tee_pageable_fname)
++ outf.close()
++
++ if args.out_header_v2 is not None:
++ outf = args.out_header_v2
++ write_header_v2(outf, init_size, args, paged_size)
++ outf.close()
++
++ if args.out_pager_v2 is not None:
++ outf = args.out_pager_v2
++ append_to(outf, 0, tee_pager_fname)
++ append_to(outf, 0, tee_pageable_fname, init_bin_size)
++ append_hashes(outf, tee_pageable_fname)
++ outf.close()
++
++ if args.out_pageable_v2 is not None:
++ outf = args.out_pageable_v2
++ append_to(outf, init_bin_size, tee_pageable_fname)
++ outf.close()
++
+
+ if __name__ == "__main__":
+- main()
++ main()
+diff --git a/scripts/gen_ld_sects.py b/scripts/gen_ld_sects.py
+index c5dc3a7b..2bdbb192 100755
+--- a/scripts/gen_ld_sects.py
++++ b/scripts/gen_ld_sects.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2017, Linaro Limited
+@@ -8,8 +8,8 @@ import sys
+ import re
+
+ def usage():
+- print "Usage: {0} <section reg exp match> [<skip section>...]".format( \
+- sys.argv[0])
++ print("Usage: {0} <section reg exp match> [<skip section>...]".format( \
++ sys.argv[0]))
+ sys.exit (1)
+
+ def main():
+@@ -55,7 +55,7 @@ def main():
+ if sect_name in skip_sections :
+ continue
+
+- print '\t*({0})'.format(sect_name)
++ print ('\t*({0})'.format(sect_name))
+
+ if __name__ == "__main__":
+ main()
+diff --git a/scripts/pem_to_pub_c.py b/scripts/pem_to_pub_c.py
+index 6b8fa365..0b03d62e 100755
+--- a/scripts/pem_to_pub_c.py
++++ b/scripts/pem_to_pub_c.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2015, Linaro Limited
+diff --git a/scripts/sign.py b/scripts/sign.py
+index ad47479b..348b40a2 100755
+--- a/scripts/sign.py
++++ b/scripts/sign.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ #
+ # Copyright (c) 2015, 2017, Linaro Limited
+ #
+diff --git a/scripts/symbolize.py b/scripts/symbolize.py
+index 1eecf758..0e9bd3ed 100755
+--- a/scripts/symbolize.py
++++ b/scripts/symbolize.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2017, Linaro Limited
+diff --git a/scripts/ta_bin_to_c.py b/scripts/ta_bin_to_c.py
+index cabddbbd..f325fda0 100755
+--- a/scripts/ta_bin_to_c.py
++++ b/scripts/ta_bin_to_c.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2017, Linaro Limited
+diff --git a/scripts/tee_bin_parser.py b/scripts/tee_bin_parser.py
+index 5f7dd3f0..07da5791 100755
+--- a/scripts/tee_bin_parser.py
++++ b/scripts/tee_bin_parser.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+ # SPDX-License-Identifier: BSD-2-Clause
+ #
+ # Copyright (c) 2016, Linaro Limited
+--
+2.17.1
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os_git.bb
new file mode 100644
index 000000000..09deeb65a
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-os_git.bb
@@ -0,0 +1,75 @@
+
+DESCRIPTION = "OP-TEE OS"
+
+LICENSE = "BSD-2-Clause & BSD-3-Clause"
+LIC_FILES_CHKSUM = " \
+ file://LICENSE;md5=69663ab153298557a59c67a60a743e5b \
+ file://${WORKDIR}/git_official/LICENSE;md5=69663ab153298557a59c67a60a743e5b \
+"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit deploy python3native
+
+PV = "3.1.0+renesas+git${SRCPV}"
+
+BRANCH = "rcar_gen3"
+SRCREV_renesas = "19fb6dcbf42631f23afed406e893310eb30cd548"
+SRCREV_officialgit = "e77020396508fc086d7a4d6137388b116e4a662f"
+SRCREV_FORMAT = "renesas_officialgit"
+
+SRC_URI = " \
+ git://github.com/renesas-rcar/optee_os.git;branch=${BRANCH};name=renesas \
+ git://github.com/OP-TEE/optee_os.git;branch=master;name=officialgit;destsuffix=git_official \
+"
+
+SRC_URI_append = " \
+ file://0001-core-define-syscall_t-as-void-void.patch \
+ file://0001-scripts-update-scripts-to-use-python3.patch \
+"
+
+COMPATIBLE_MACHINE = "(salvator-x|h3ulcb|m3ulcb|m3nulcb|ebisu)"
+PLATFORM = "rcar"
+
+DEPENDS = "python3-pycrypto-native"
+
+export CROSS_COMPILE64="${TARGET_PREFIX}"
+
+# Let the Makefile handle setting up the flags as it is a standalone application
+LD[unexport] = "1"
+LDFLAGS[unexport] = "1"
+export CCcore="${CC}"
+export LDcore="${LD}"
+libdir[unexport] = "1"
+
+S = "${WORKDIR}/git"
+EXTRA_OEMAKE = "-e MAKEFLAGS="
+
+do_configure() {
+ git -C ${WORKDIR}/git_official checkout -B official 3.1.0
+ git -C ${WORKDIR}/git_official cherry-pick -n ${SRCREV_officialgit}
+ cp -rn ${WORKDIR}/git_official/core/lib/libtomcrypt ${B}/core/lib/.
+}
+
+do_compile() {
+ oe_runmake PLATFORM=${PLATFORM} CFG_ARM64_core=y
+}
+
+do_install() {
+ install -d ${D}/usr/share/optee
+ cp -r ${S}/out/arm-plat-${PLATFORM}/export-ta_arm64 ${D}/usr/share/optee
+}
+
+do_deploy() {
+ # Create deploy folder
+ install -d ${DEPLOYDIR}
+
+ # Copy TEE OS to deploy folder
+ install -m 0644 ${S}/out/arm-plat-${PLATFORM}/core/tee.elf ${DEPLOYDIR}/tee-${MACHINE}.elf
+ install -m 0644 ${S}/out/arm-plat-${PLATFORM}/core/tee.bin ${DEPLOYDIR}/tee-${MACHINE}.bin
+ install -m 0644 ${S}/out/arm-plat-${PLATFORM}/core/tee.srec ${DEPLOYDIR}/tee-${MACHINE}.srec
+}
+addtask deploy before do_build after do_compile
+
+FILES_${PN}-staticdev += "${datadir}/optee/export-ta_arm64/lib/*.a"
+FILES_${PN}-dev += "${datadir}/optee/export-ta_arm64"
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test/optee_xtest_fix.diff b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test/optee_xtest_fix.diff
new file mode 100644
index 000000000..5067086f1
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test/optee_xtest_fix.diff
@@ -0,0 +1,13 @@
+diff --git a/host/xtest/regression_6000.c b/host/xtest/regression_6000.c
+index 336ea14..2379e43 100644
+--- a/host/xtest/regression_6000.c
++++ b/host/xtest/regression_6000.c
+@@ -82,6 +82,8 @@ static uint32_t fs_id_for_tee_storage_private(void)
+ return TEE_STORAGE_PRIVATE_REE;
+ #elif defined(CFG_RPMB_FS)
+ return TEE_STORAGE_PRIVATE_RPMB;
++#else
++ return TEE_STORAGE_PRIVATE;
+ #endif
+ }
+
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb
new file mode 100644
index 000000000..80a22b89f
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-test_git.bb
@@ -0,0 +1,55 @@
+DESCRIPTION = "OP-TEE TEST"
+
+LICENSE = "GPLv2 & BSD-2-Clause"
+LIC_FILES_CHKSUM = "file://${S}/host/LICENSE;md5=b234ee4d69f5fce4486a80fdaf4a4263"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit python3native
+
+PV = "3.1.0+git${SRCPV}"
+
+SRCREV = "45218eb59b006ad20cc7610904f291dd85157a43"
+
+SRC_URI = " \
+ git://github.com/OP-TEE/optee_test.git;branch=master;name=master \
+ file://optee_xtest_fix.diff \
+"
+
+COMPATIBLE_MACHINE = "(salvator-x|h3ulcb|m3ulcb|m3nulcb|ebisu)"
+PLATFORM = "rcar"
+
+DEPENDS = "optee-os optee-client python3-pycrypto-native"
+
+export CROSS_COMPILE64="${TARGET_PREFIX}"
+
+# Let the Makefile handle setting up the flags as it is a standalone application
+LD[unexport] = "1"
+LDFLAGS[unexport] = "1"
+export CCcore="${CC}"
+export LDcore="${LD}"
+libdir[unexport] = "1"
+
+CFLAGS += "-Wno-extra -Wno-error=stringop-overflow -Wno-error=array-bounds"
+TARGET_CFLAGS += "-Wno-extra -Wno-error=stringop-overflow -Wno-error=array-bounds"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+INSANE_SKIP_${PN} = "ldflags"
+
+S = "${WORKDIR}/git"
+EXTRA_OEMAKE = "-e MAKEFLAGS="
+
+do_compile() {
+ oe_runmake CROSS_COMPILE=${CROSS_COMPILE64} PLATFORM=${PLATFORM} OPTEE_CLIENT_EXPORT=${STAGING_DIR_TARGET}/usr --no-builtin-variables TA_DEV_KIT_DIR="${STAGING_DIR_TARGET}/usr/share/optee/export-ta_arm64"
+}
+
+do_install () {
+ install -D -p -m0755 ${S}/out/xtest/xtest ${D}${bindir}/xtest
+
+ # install path should match the value set in optee-client/tee-supplicant
+ # default TEEC_LOAD_PATH is /lib
+ mkdir -p ${D}${nonarch_base_libdir}/optee_armtz/
+ install -D -p -m0444 ${S}/out/ta/*/*.ta ${D}${nonarch_base_libdir}/optee_armtz/
+}
+
+FILES_${PN} += "${nonarch_base_libdir}/optee_armtz/"
diff --git a/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb
new file mode 100644
index 000000000..d66060b05
--- /dev/null
+++ b/meta-agl-bsp/meta-rcar-gen3/recipes-bsp/optee/optee-user-app-template_git.bb
@@ -0,0 +1,57 @@
+SUMMARY = "OP-TEE user_app_template"
+
+LICENSE = "GPLv2"
+LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=cd95ab417e23b94f381dafc453d70c30"
+
+PACKAGE_ARCH = "${MACHINE_ARCH}"
+
+inherit python3native
+
+PV = "0.1+git${SRCPV}"
+
+SRCREV = "0.1"
+
+SRC_URI = " \
+ git://github.com/iotbzh/optee_user_app_template;branch=master \
+"
+
+COMPATIBLE_MACHINE = "(salvator-x|h3ulcb|m3ulcb|m3nulcb|ebisu)"
+PLATFORM = "rcar"
+
+DEPENDS = "optee-os optee-client python-pycrypto-native"
+
+CFLAGS += "-Wno-extra -Wno-error=format"
+TARGET_CFLAGS += "-Wno-extra -Wno-error=format"
+
+TARGET_CC_ARCH += "${LDFLAGS}"
+INSANE_SKIP_${PN} = "ldflags"
+
+TA_DEV_KIT_DIR = "${STAGING_DIR_TARGET}/usr/share/optee/export-ta_arm64"
+
+OPTEE_CLIENT_EXPORT = "${STAGING_DIR_TARGET}/usr"
+
+TEEC_EXPORT = "${STAGING_DIR_TARGET}/usr"
+
+S = "${WORKDIR}/git"
+EXTRA_OEMAKE = "\
+ TEEC_EXPORT=${TEEC_EXPORT} \
+ OPTEE_CLIENT_EXPORT=${OPTEE_CLIENT_EXPORT} \
+ TA_DEV_KIT_DIR=${TA_DEV_KIT_DIR} \
+ HOST_CROSS_COMPILE=${TARGET_PREFIX} \
+ TA_CROSS_COMPILE=${TARGET_PREFIX} \
+ PLATFORM=${PLATFORM} \
+ V=1 \
+ "
+
+do_compile() {
+ oe_runmake
+}
+
+do_install () {
+ mkdir -p ${D}${nonarch_base_libdir}/optee_armtz
+ mkdir -p ${D}${bindir}
+ install -D -p -m0755 ${S}/out/ca/* ${D}${bindir}
+ install -D -p -m0444 ${S}/out/ta/* ${D}${nonarch_base_libdir}/optee_armtz
+}
+
+FILES_${PN} += "${nonarch_base_libdir}/optee_armtz/"