On 4/17/25 8:12 AM, Gokul Sriram Palanisamy wrote:
> From: Vignesh Viswanathan <[email protected]>
> 
> Add support to bring up hexagon based WCSS using secure PIL. All IPQxxxx
> SoCs support secure Peripheral Image Loading (PIL).
> 
> Secure PIL image is signed firmware image which only trusted software such
> as TrustZone (TZ) can authenticate and load. Linux kernel will send a
> Peripheral Authentication Service (PAS) request to TZ to authenticate and
> load the PIL images. This change also introduces secure firmware
> authentication using Trusted Management Engine-Lite (TME-L) which is
> supported on IPQ5424 SoC. This driver uses mailbox based PAS request to
> TME-L for image authentication if supported, else it will fallback to use
> SCM call based PAS request to TZ.
> 
> In order to avoid overloading the existing WCSS driver or PAS driver, we
> came up with this new PAS based IPQ WCSS driver.
> 
> Signed-off-by: Vignesh Viswanathan <[email protected]>
> Signed-off-by: Manikanta Mylavarapu <[email protected]>
> Signed-off-by: Gokul Sriram Palanisamy <[email protected]>
> ---

[...]

> +static int wcss_sec_start(struct rproc *rproc)
> +{
> +     struct wcss_sec *wcss = rproc->priv;
> +     struct device *dev = wcss->dev;
> +     int ret;
> +
> +     ret = qcom_q6v5_prepare(&wcss->q6);
> +     if (ret)
> +             return ret;
> +
> +     if (!IS_ERR_OR_NULL(wcss->mbox_chan)) {

You abort probe if wcss->mbox_chan returns an errno, please rework
this to use if (use_tmelcom) or something

[...]

> +static void wcss_sec_copy_segment(struct rproc *rproc,
> +                               struct rproc_dump_segment *segment,
> +                               void *dest, size_t offset, size_t size)
> +{
> +     struct wcss_sec *wcss = rproc->priv;
> +     struct device *dev = wcss->dev;
> +
> +     if (!segment->io_ptr)
> +             segment->io_ptr = ioremap_wc(segment->da, segment->size);
> +
> +     if (!segment->io_ptr) {
> +             dev_err(dev, "Failed to ioremap segment %pad size 0x%zx\n",
> +                     &segment->da, segment->size);
> +             return;
> +     }
> +
> +     if (offset + size <= segment->size) {

I believe this allows an off-by-one (remove '=')

[...]

> +             memcpy(dest, segment->io_ptr + offset, size);
> +     } else {
> +             iounmap(segment->io_ptr);
> +             segment->io_ptr = NULL;
> +     }
> +}
> +
> +static int wcss_sec_dump_segments(struct rproc *rproc,
> +                               const struct firmware *fw)
> +{
> +     struct device *dev = rproc->dev.parent;
> +     struct reserved_mem *rmem = NULL;
> +     struct device_node *node;
> +     int num_segs, index;
> +     int ret;
> +
> +     /*
> +      * Parse through additional reserved memory regions for the rproc
> +      * and add them to the coredump segments
> +      */
> +     num_segs = of_count_phandle_with_args(dev->of_node,
> +                                           "memory-region", NULL);
> +     for (index = 0; index < num_segs; index++) {
> +             node = of_parse_phandle(dev->of_node,
> +                                     "memory-region", index);

https://lore.kernel.org/linux-arm-msm/[email protected]/

[...]

> +static const struct wcss_data wcss_sec_ipq5424_res_init = {
> +     .pasid = MPD_WCSS_PAS_ID,
> +     .ss_name = "q6wcss",
> +     .tmelcom = true,

"bool tmelcom" is very non-descriptive.. call it something like
use_tmelcom, or maybe flip the condition and call it e.g.
tz_managed

Konrad

Reply via email to