Re: [PATCH v2 02/15] firmware: qcom: Add a generic PAS service

Sumit Garg
2026-03-23T12:56:11Z

On Fri, Mar 13, 2026 at 01:01:21PM +0530, Mukesh Ojha wrote:
> On Fri, Mar 13, 2026 at 12:54:50PM +0530, Mukesh Ojha wrote:
> > On Thu, Mar 12, 2026 at 11:57:43AM +0530, Sumit Garg wrote:
> > > From: Sumit Garg <sumit.garg@oss.qualcomm.com>
> > >
> > > Qcom platforms has the legacy of using non-standard SCM calls
> > > splintered over the various kernel drivers. These SCM calls aren't
> > > compliant with the standard SMC calling conventions which is a
> > > prerequisite to enable migration to the FF-A specifications from Arm.
> > >
> > > OP-TEE as an alternative trusted OS to Qualcomm TEE (QTEE) can't
> > > support these non-standard SCM calls. And even for newer architectures
> > > with S-EL2 and Hafnium support, QTEE won't be able to support SCM
> >
> > using S‑EL2 with Hafnium
> >
> > > calls either with FF-A requirements coming in. And with both OP-TEE
> > > and QTEE drivers well integrated in the TEE subsystem, it makes further
> > > sense to reuse the TEE bus client drivers infrastructure.
> > >
> > > The added benefit of TEE bus infrastructure is that there is support
> > > for discoverable/enumerable services. With that client drivers don't
> > > have to manually invoke a special SCM call to know the service status.
> > >
> > > So enable the generic Peripheral Authentication Service (PAS) provided
> > > by the firmware. It acts as the common layer with different TZ
> > > backends plugged in whether it's an SCM implementation or a proper
> > > TEE bus based PAS service implementation.
> > >
> > > Signed-off-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
> > > ---
> > > drivers/firmware/qcom/Kconfig | 8 +
> > > drivers/firmware/qcom/Makefile | 1 +
> > > drivers/firmware/qcom/qcom_pas.c | 298 +++++++++++++++++++++++++
> > > drivers/firmware/qcom/qcom_pas.h | 53 +++++
> > > include/linux/firmware/qcom/qcom_pas.h | 41 ++++
> > > 5 files changed, 401 insertions(+)
> > > create mode 100644 drivers/firmware/qcom/qcom_pas.c
> > > create mode 100644 drivers/firmware/qcom/qcom_pas.h
> > > create mode 100644 include/linux/firmware/qcom/qcom_pas.h
> > >

<snip>

> > > diff --git a/drivers/firmware/qcom/qcom_pas.c b/drivers/firmware/qcom/qcom_pas.c
> > > new file mode 100644
> > > index 000000000000..beb1bae55546
> > > --- /dev/null
> > > +++ b/drivers/firmware/qcom/qcom_pas.c
> > > @@ -0,0 +1,298 @@
> > > +// SPDX-License-Identifier: GPL-2.0
> > > +/*
> > > + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> > > + */
> > > +
> > > +#include <linux/device/devres.h>
> > > +#include <linux/firmware/qcom/qcom_pas.h>
> > > +#include <linux/kernel.h>
> > > +#include <linux/module.h>
> > > +
> > > +#include "qcom_pas.h"
> > > +
> > > +struct qcom_pas_ops *ops_ptr;
> >
> > Should this be static ?
> >
> > > +
> > > +/**
> > > + * devm_qcom_pas_context_alloc() - Allocate peripheral authentication service
> > > + * context for a given peripheral
> > > + *
> > > + * PAS context is device-resource managed, so the caller does not need
> > > + * to worry about freeing the context memory.
> > > + *
> > > + * @dev: PAS firmware device
> > > + * @pas_id: peripheral authentication service id
> > > + * @mem_phys: Subsystem reserve memory start address
> > > + * @mem_size: Subsystem reserve memory size
> > > + *
> > > + * Return: The new PAS context, or ERR_PTR() on failure.
> > > + */
> > > +struct qcom_pas_context *devm_qcom_pas_context_alloc(struct device *dev,
> > > + u32 pas_id,
> > > + phys_addr_t mem_phys,
> > > + size_t mem_size)
> > > +{
> > > + struct qcom_pas_context *ctx;
> > > +
> > > + ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
> > > + if (!ctx)
> > > + return ERR_PTR(-ENOMEM);
> > > +
> > > + ctx->dev = dev;
> > > + ctx->pas_id = pas_id;
> > > + ctx->mem_phys = mem_phys;
> > > + ctx->mem_size = mem_size;
> > > +
> > > + return ctx;
> > > +}
> > > +EXPORT_SYMBOL_GPL(devm_qcom_pas_context_alloc);
> > > +
> > > +/**
> > > + * qcom_pas_init_image() - Initialize peripheral authentication service state
> > > + * machine for a given peripheral, using the metadata
> > > + * @pas_id: peripheral authentication service id
> > > + * @metadata: pointer to memory containing ELF header, program header table
> > > + * and optional blob of data used for authenticating the metadata
> > > + * and the rest of the firmware
> > > + * @size: size of the metadata
> > > + * @ctx: optional pas context
> > > + *
> > > + * Return: 0 on success.
> > > + *
> > > + * Upon successful return, the PAS metadata context (@ctx) will be used to
> > > + * track the metadata allocation, this needs to be released by invoking
> > > + * qcom_pas_metadata_release() by the caller.
> > > + */
> > > +int qcom_pas_init_image(u32 pas_id, const void *metadata, size_t size,
> > > + struct qcom_pas_context *ctx)
>
> please, align this with previous line '(' for all the functions.
>

The alignment is fine here, not sure why the plain text replies show
them as not aligned.

-Sumit