This patch proposes diverse updates to rproc_update_resource_table_entry
function:
- rename rproc_update_resource_table_entry to __update_rsc_tbl_entry to
  have shorter function name.
- add RSC_VDEV support
- add force mode resource even if resource already fixed on firmware side.

Signed-off-by: Loic Pallardy <[email protected]>
---
 drivers/remoteproc/remoteproc_core.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/drivers/remoteproc/remoteproc_core.c 
b/drivers/remoteproc/remoteproc_core.c
index 30e9c70..aff1a00 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1027,13 +1027,15 @@ static int __verify_rsc_tbl_entry(struct rproc *rproc,
        return -EINVAL;
 }
 
-static int rproc_update_resource_table_entry(struct rproc *rproc,
+static int __update_rsc_tbl_entry(struct rproc *rproc,
                                struct rproc_request_resource *request,
-                               struct resource_table *table, int size)
+                               struct resource_table *table, int size,
+                               bool force)
 {
        struct fw_rsc_carveout *tblc, *newc;
        struct fw_rsc_devmem *tbld, *newd;
        struct fw_rsc_trace *tblt, *newt;
+       struct fw_rsc_vdev *tblv, *newv;
        int updated = true;
        int i;
 
@@ -1054,7 +1056,8 @@ static int rproc_update_resource_table_entry(struct rproc 
*rproc,
                                    sizeof(*tblc->name)))
                                break;
 
-                       memcpy(tblc, newc, request->size);
+                       if (tblc->pa == FW_RSC_ADDR_ANY || force)
+                               memcpy(tblc, newc, request->size);
 
                        return updated;
                case RSC_DEVMEM:
@@ -1079,6 +1082,20 @@ static int rproc_update_resource_table_entry(struct 
rproc *rproc,
                        memcpy(tblt, newt, request->size);
 
                        return updated;
+               case RSC_VDEV:
+                       tblv = rsc;
+                       newv = request->resource;
+                       if (newv->id != tblv->id)
+                               break;
+
+                       if (request->size > (sizeof(*tblv) +
+                                   tblv->num_of_vrings * sizeof(struct 
fw_rsc_vdev_vring) +
+                                   tblv->config_len))
+                               return -ENOSPC;
+
+                       memcpy(tblv, newv, request->size);
+
+                       return updated;
                default:
                        dev_err(&rproc->dev,
                                "Unsupported resource type: %d\n",
@@ -1176,8 +1193,8 @@ rproc_apply_resource_overrides(struct rproc *rproc,
                int updated = 0;
 
                /* If we already have a table, update it with the new values. */
-               updated = rproc_update_resource_table_entry(rproc, resource,
-                                                           table, size);
+               updated = __update_rsc_tbl_entry(rproc, resource, table, size,
+                                                false);
                if (updated < 0) {
                        table = ERR_PTR(updated);
                        goto out;
-- 
1.9.1

Reply via email to