Re: [PATCH v4 2/3] remoteproc: qcom: pas: make region assign more generic

From: neil . armstrong
Date: Mon Dec 11 2023 - 06:19:47 EST


On 11/12/2023 10:54, Konrad Dybcio wrote:
On 11.12.2023 10:37, Neil Armstrong wrote:
On 09/12/2023 19:06, Konrad Dybcio wrote:
On 8.12.2023 16:04, Neil Armstrong wrote:
The current memory region assign only supports a single
memory region.

But new platforms introduces more regions to make the
memory requirements more flexible for various use cases.
Those new platforms also shares the memory region between the
DSP and HLOS.

To handle this, make the region assign more generic in order
to support more than a single memory region and also permit
setting the regions permissions as shared.

Reviewed-by: Mukesh Ojha <quic_mojha@xxxxxxxxxxx>
Signed-off-by: Neil Armstrong <neil.armstrong@xxxxxxxxxx>
---
[...]

+    for (offset = 0; offset < adsp->region_assign_count; ++offset) {
+        struct reserved_mem *rmem = NULL;
+
+        node = of_parse_phandle(adsp->dev->of_node, "memory-region",
+                    adsp->region_assign_idx + offset);
+        if (node)
+            rmem = of_reserved_mem_lookup(node);
+        of_node_put(node);
Shouldn't this only be called when parse_phandle succeeds? (separate
patch with a fix + cc stable if so?)

It's not a bug, it was added like that because of_node_put() already
checks for a NULL pointer:
https://elixir.bootlin.com/linux/v6.7-rc5/source/drivers/of/dynamic.c#L45
Ack



+        if (!rmem) {
+            dev_err(adsp->dev, "unable to resolve shareable memory-region index %d\n",
+                offset);
+            return -EINVAL;
+        }
  -    perm.vmid = QCOM_SCM_VMID_MSS_MSA;
-    perm.perm = QCOM_SCM_PERM_RW;
+        if (adsp->region_assign_shared)  {
+            perm[0].vmid = QCOM_SCM_VMID_HLOS;
+            perm[0].perm = QCOM_SCM_PERM_RW;
+            perm[1].vmid = adsp->region_assign_vmid;
+            perm[1].perm = QCOM_SCM_PERM_RW;
+            perm_size = 2;
+        } else {
+            perm[0].vmid = adsp->region_assign_vmid;
+            perm[0].perm = QCOM_SCM_PERM_RW;
+            perm_size = 1;
+        }
  -    adsp->region_assign_phys = rmem->base;
-    adsp->region_assign_size = rmem->size;
-    adsp->region_assign_perms = BIT(QCOM_SCM_VMID_HLOS);
+        adsp->region_assign_phys[offset] = rmem->base;
+        adsp->region_assign_size[offset] = rmem->size;
+        adsp->region_assign_perms[offset] = BIT(QCOM_SCM_VMID_HLOS);
  -    ret = qcom_scm_assign_mem(adsp->region_assign_phys,
-                  adsp->region_assign_size,
-                  &adsp->region_assign_perms,
I think this should be renamed to region_assign_owner(s)

Why ? this bitfield is names "perms" everywhere qcom_scm_assign_mem is used
And IMO that's not correct - there's the qcom_scm_vmperm.perm field which
is oneOf r/w/x/rw/rwx and this one is filled with ORed BIT()-ed elements
allowed in qcom_scm_vmperm.vmid (QCOM_SCM_VMID_...)

Ok right I just use the same namings as in rmtfs_mem, fastrpc & ath10k/qmi,
but indeed the qcom_scm_assign_mem() 3rd param name is srcvm but doc says "vmid for current set of owners",
so yeah it could be named owners.

I'll send a v5 with the rename.

Neil



Konrad