| .. SPDX-License-Identifier: GPL-2.0 |
| |
| ============================================= |
| QTEE (Qualcomm Trusted Execution Environment) |
| ============================================= |
| |
| The QTEE driver handles communication with Qualcomm TEE [1]. |
| |
| The lowest level of communication with QTEE builds on the ARM SMC Calling |
| Convention (SMCCC) [2], which is the foundation for QTEE's Secure Channel |
| Manager (SCM) [3] used internally by the driver. |
| |
| In a QTEE-based system, services are represented as objects with a series of |
| operations that can be called to produce results, including other objects. |
| |
| When an object is hosted within QTEE, executing its operations is referred |
| to as "direct invocation". QTEE can also invoke objects hosted in the non-secure |
| world using a method known as "callback request". |
| |
| The SCM provides two functions to support direct invocation and callback requests: |
| |
| - QCOM_SCM_SMCINVOKE_INVOKE: Used for direct invocation. It can return either |
| a result or initiate a callback request. |
| - QCOM_SCM_SMCINVOKE_CB_RSP: Used to submit a response to a callback request |
| triggered by a previous direct invocation. |
| |
| The QTEE Transport Message [4] is stacked on top of the SCM driver functions. |
| |
| A message consists of two buffers shared with QTEE: inbound and outbound |
| buffers. The inbound buffer is used for direct invocation, and the outbound |
| buffer is used to make callback requests. This picture shows the contents of |
| a QTEE transport message:: |
| |
| +---------------------+ |
| | v |
| +-----------------+-------+-------+------+--------------------------+ |
| | qcomtee_msg_ |object | buffer | | |
| | object_invoke | id | offset, size | | (inbound buffer) |
| +-----------------+-------+--------------+--------------------------+ |
| <---- header -----><---- arguments ------><- in/out buffer payload -> |
| |
| +-----------+ |
| | v |
| +-----------------+-------+-------+------+----------------------+ |
| | qcomtee_msg_ |object | buffer | | |
| | callback | id | offset, size | | (outbound buffer) |
| +-----------------+-------+--------------+----------------------+ |
| |
| Each buffer is started with a header and array of arguments. |
| |
| QTEE Transport Message supports four types of arguments: |
| |
| - Input Object (IO) is an object parameter to the current invocation |
| or callback request. |
| - Output Object (OO) is an object parameter from the current invocation |
| or callback request. |
| - Input Buffer (IB) is (offset, size) pair to the inbound or outbound region |
| to store parameter to the current invocation or callback request. |
| - Output Buffer (OB) is (offset, size) pair to the inbound or outbound region |
| to store parameter from the current invocation or callback request. |
| |
| Picture of the relationship between the different components in the QTEE |
| architecture:: |
| |
| User space Kernel Secure world |
| ~~~~~~~~~~ ~~~~~~ ~~~~~~~~~~~~ |
| +--------+ +----------+ +--------------+ |
| | Client | |callback | | Trusted | |
| +--------+ |server | | Application | |
| /\ +----------+ +--------------+ |
| || +----------+ /\ /\ |
| || |callback | || || |
| || |server | || \/ |
| || +----------+ || +--------------+ |
| || /\ || | TEE Internal | |
| || || || | API | |
| \/ \/ \/ +--------+--------+ +--------------+ |
| +---------------------+ | TEE | QTEE | | QTEE | |
| | libqcomtee [5] | | subsys | driver | | Trusted OS | |
| +-------+-------------+--+----+-------+----+-------------+--------------+ |
| | Generic TEE API | | QTEE MSG | |
| | IOCTL (TEE_IOC_*) | | SMCCC (QCOM_SCM_SMCINVOKE_*) | |
| +-----------------------------+ +---------------------------------+ |
| |
| References |
| ========== |
| |
| [1] https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-11/qualcomm-trusted-execution-environment.html |
| |
| [2] http://infocenter.arm.com/help/topic/com.arm.doc.den0028a/index.html |
| |
| [3] drivers/firmware/qcom/qcom_scm.c |
| |
| [4] drivers/tee/qcomtee/qcomtee_msg.h |
| |
| [5] https://github.com/quic/quic-teec |