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