On Wed, Aug 20, 2025 at 04:38:56PM -0700, Amirreza Zarrabi wrote: Looking at other commits in drivers/tee/ I'd expect the subject prefix to be "tee: qcom: ".
> 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.g...@oss.qualcomm.com> > Tested-by: Neil Armstrong <neil.armstr...@linaro.org> > Tested-by: Harshal Dev <quic_h...@quicinc.com> > Signed-off-by: Amirreza Zarrabi <amirreza.zarr...@oss.qualcomm.com> > --- > drivers/tee/qcomtee/Makefile | 1 + > drivers/tee/qcomtee/core.c | 19 ++++++++--- > drivers/tee/qcomtee/primordial_obj.c | 66 > ++++++++++++++++++++++++++++++++++++ > drivers/tee/qcomtee/qcomtee.h | 3 ++ > 4 files changed, 84 insertions(+), 5 deletions(-) > > diff --git a/drivers/tee/qcomtee/Makefile b/drivers/tee/qcomtee/Makefile > index 600af2b8f1c1..78f8e899d143 100644 > --- a/drivers/tee/qcomtee/Makefile > +++ b/drivers/tee/qcomtee/Makefile > @@ -3,5 +3,6 @@ obj-$(CONFIG_QCOMTEE) += qcomtee.o > qcomtee-objs += async.o > qcomtee-objs += call.o > qcomtee-objs += core.o > +qcomtee-objs += primordial_obj.o > qcomtee-objs += shm.o > qcomtee-objs += user_obj.o > diff --git a/drivers/tee/qcomtee/core.c b/drivers/tee/qcomtee/core.c > index 578299a3eabc..561a48319f91 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. */ > diff --git a/drivers/tee/qcomtee/primordial_obj.c > b/drivers/tee/qcomtee/primordial_obj.c > new file mode 100644 > index 000000000000..df94fbf5f141 > --- /dev/null > +++ b/drivers/tee/qcomtee/primordial_obj.c > @@ -0,0 +1,66 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. > + */ > + > +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt I don't see any pr_*() functions in this file, please drop this. Regards, Bjorn > + > +#include <linux/delay.h> > + > +#include "qcomtee.h" > + > +/** > + * DOC: Primordial Object > + * > + * After boot, the kernel provides a static object of type > + * %QCOMTEE_OBJECT_TYPE_CB called the primordial object. This object is used > + * for native kernel services or privileged operations. > + * > + * We support: > + * - %QCOMTEE_OBJECT_OP_YIELD to yield by the thread running in QTEE. > + * - %QCOMTEE_OBJECT_OP_SLEEP to wait for a period of time. > + */ > + > +#define QCOMTEE_OBJECT_OP_YIELD 1 > +#define QCOMTEE_OBJECT_OP_SLEEP 2 > + > +static int > +qcomtee_primordial_obj_dispatch(struct qcomtee_object_invoke_ctx *oic, > + struct qcomtee_object *primordial_object_unused, > + u32 op, struct qcomtee_arg *args) > +{ > + int err = 0; > + > + switch (op) { > + case QCOMTEE_OBJECT_OP_YIELD: > + cond_resched(); > + /* No output object. */ > + oic->data = NULL; > + break; > + case QCOMTEE_OBJECT_OP_SLEEP: > + /* Check message format matched QCOMTEE_OBJECT_OP_SLEEP op. */ > + if (qcomtee_args_len(args) != 1 || > + args[0].type != QCOMTEE_ARG_TYPE_IB || > + args[0].b.size < sizeof(u32)) > + return -EINVAL; > + > + msleep(*(u32 *)(args[0].b.addr)); > + /* No output object. */ > + oic->data = NULL; > + break; > + default: > + err = -EINVAL; > + } > + > + return err; > +} > + > +static struct qcomtee_object_operations qcomtee_primordial_obj_ops = { > + .dispatch = qcomtee_primordial_obj_dispatch, > +}; > + > +struct qcomtee_object qcomtee_primordial_object = { > + .name = "primordial", > + .object_type = QCOMTEE_OBJECT_TYPE_CB, > + .ops = &qcomtee_primordial_obj_ops > +}; > diff --git a/drivers/tee/qcomtee/qcomtee.h b/drivers/tee/qcomtee/qcomtee.h > index f34be992e68b..084b3882017e 100644 > --- a/drivers/tee/qcomtee/qcomtee.h > +++ b/drivers/tee/qcomtee/qcomtee.h > @@ -140,4 +140,7 @@ int qcomtee_user_object_submit(struct tee_context *ctx, > struct tee_param *params, int num_params, > int req_id, int errno); > > +/* (2) Primordial Object. */ > +extern struct qcomtee_object qcomtee_primordial_object; > + > #endif /* QCOMTEE_H */ > > -- > 2.34.1 >