summaryrefslogtreecommitdiff
path: root/drivers/tee/qcomtee/core.c
diff options
context:
space:
mode:
authorAmirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com>2025-09-11 21:07:48 -0700
committerJens Wiklander <jens.wiklander@linaro.org>2025-09-15 17:34:06 +0200
commit0f7bfdcb7c37ae826ba6f1fde05d31040a97fd77 (patch)
treeb9064a258c8bdb6c98b38e936a142ef3d0433e19 /drivers/tee/qcomtee/core.c
parentd6e290837e50f73f88f31f19bd8a7213d92e6e46 (diff)
downloadlinux-next-0f7bfdcb7c37ae826ba6f1fde05d31040a97fd77.tar.gz
linux-next-0f7bfdcb7c37ae826ba6f1fde05d31040a97fd77.zip
tee: qcom: add primordial object
After booting, the kernel provides a static object known as the primordial object. This object is utilized by QTEE for native kernel services such as yield or privileged operations. Acked-by: Sumit Garg <sumit.garg@oss.qualcomm.com> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> Tested-by: Harshal Dev <quic_hdev@quicinc.com> Signed-off-by: Amirreza Zarrabi <amirreza.zarrabi@oss.qualcomm.com> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org>
Diffstat (limited to 'drivers/tee/qcomtee/core.c')
-rw-r--r--drivers/tee/qcomtee/core.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/tee/qcomtee/core.c b/drivers/tee/qcomtee/core.c
index b6931ed6f200..783acc59cfa9 100644
--- a/drivers/tee/qcomtee/core.c
+++ b/drivers/tee/qcomtee/core.c
@@ -31,10 +31,12 @@ int qcomtee_next_arg_type(struct qcomtee_arg *u, int i,
}
/*
- * QTEE expects IDs with the QCOMTEE_MSG_OBJECT_NS_BIT set for objects
- * of the QCOMTEE_OBJECT_TYPE_CB type.
+ * QTEE expects IDs with QCOMTEE_MSG_OBJECT_NS_BIT set for objects of
+ * QCOMTEE_OBJECT_TYPE_CB type. The first ID with QCOMTEE_MSG_OBJECT_NS_BIT
+ * set is reserved for the primordial object.
*/
-#define QCOMTEE_OBJECT_ID_START (QCOMTEE_MSG_OBJECT_NS_BIT + 1)
+#define QCOMTEE_OBJECT_PRIMORDIAL (QCOMTEE_MSG_OBJECT_NS_BIT)
+#define QCOMTEE_OBJECT_ID_START (QCOMTEE_OBJECT_PRIMORDIAL + 1)
#define QCOMTEE_OBJECT_ID_END (U32_MAX)
#define QCOMTEE_OBJECT_SET(p, type, ...) \
@@ -157,7 +159,9 @@ static void qcomtee_object_release(struct kref *refcount)
*/
int qcomtee_object_get(struct qcomtee_object *object)
{
- if (object != NULL_QCOMTEE_OBJECT && object != ROOT_QCOMTEE_OBJECT)
+ if (object != &qcomtee_primordial_object &&
+ object != NULL_QCOMTEE_OBJECT &&
+ object != ROOT_QCOMTEE_OBJECT)
return kref_get_unless_zero(&object->refcount);
return 0;
@@ -169,7 +173,9 @@ int qcomtee_object_get(struct qcomtee_object *object)
*/
void qcomtee_object_put(struct qcomtee_object *object)
{
- if (object != NULL_QCOMTEE_OBJECT && object != ROOT_QCOMTEE_OBJECT)
+ if (object != &qcomtee_primordial_object &&
+ object != NULL_QCOMTEE_OBJECT &&
+ object != ROOT_QCOMTEE_OBJECT)
kref_put(&object->refcount, qcomtee_object_release);
}
@@ -261,6 +267,9 @@ qcomtee_local_object_get(struct qcomtee_object_invoke_ctx *oic,
struct qcomtee *qcomtee = tee_get_drvdata(oic->ctx->teedev);
struct qcomtee_object *object;
+ if (object_id == QCOMTEE_OBJECT_PRIMORDIAL)
+ return &qcomtee_primordial_object;
+
guard(rcu)();
object = xa_load(&qcomtee->xa_local_objects, object_id);
/* It already checks for %NULL_QCOMTEE_OBJECT. */