]> git.hungrycats.org Git - linux/commitdiff
misc: fastrpc: Pass proper scm arguments for static process init
authorEkansh Gupta <quic_ekangupt@quicinc.com>
Fri, 11 Aug 2023 11:56:43 +0000 (12:56 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 13 Sep 2023 07:48:41 +0000 (09:48 +0200)
commit fe6518d547fc52ba74201018dc9aeb364072ac78 upstream.

Memory is allocated for dynamic loading when audio daemon is trying
to attach to audioPD on DSP side. This memory is allocated from
reserved CMA memory region and needs ownership assignment to
new VMID in order to use it from audioPD.

In the current implementation, arguments are not correctly passed
to the scm call which might result in failure of dynamic loading
on audioPD. Added changes to pass correct arguments during daemon
attach request.

Fixes: 0871561055e6 ("misc: fastrpc: Add support for audiopd")
Cc: stable <stable@kernel.org>
Tested-by: Ekansh Gupta <quic_ekangupt@quicinc.com>
Signed-off-by: Ekansh Gupta <quic_ekangupt@quicinc.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20230811115643.38578-4-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/fastrpc.c

index 9666d28037e1806ce6022840d383ef7e4b429f68..5a134fa8a174cbba956c1cd257b85aa0d9c6b226 100644 (file)
@@ -1322,13 +1322,18 @@ static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
        return 0;
 err_invoke:
        if (fl->cctx->vmcount) {
-               struct qcom_scm_vmperm perm;
+               u64 src_perms = 0;
+               struct qcom_scm_vmperm dst_perms;
+               u32 i;
 
-               perm.vmid = QCOM_SCM_VMID_HLOS;
-               perm.perm = QCOM_SCM_PERM_RWX;
+               for (i = 0; i < fl->cctx->vmcount; i++)
+                       src_perms |= BIT(fl->cctx->vmperms[i].vmid);
+
+               dst_perms.vmid = QCOM_SCM_VMID_HLOS;
+               dst_perms.perm = QCOM_SCM_PERM_RWX;
                err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
                                                (u64)fl->cctx->remote_heap->size,
-                                               &fl->cctx->perms, &perm, 1);
+                                               &src_perms, &dst_perms, 1);
                if (err)
                        dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
                                fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);