The .get_loaded_rsc_table rproc ops implementations in TI K3 R5, DSP and
M4 remoteproc drivers return a pointer to the resource table that was
pre-loaded at the base address of the DDR region reserved for firmware
usage.

Refactor the implementations into ti_k3_common.c driver as
k3_get_loaded_rsc_table() and register this common function as
.get_loaded_rsc_table ops in R5, DSP and M4 drivers.

Signed-off-by: Beleswar Padhi <b-pa...@ti.com>
Tested-by: Judith Mendez <j...@ti.com>
---
v11: Changelog:
1. Carried T/B tag.

Link to v10:
https://lore.kernel.org/all/20250417182001.3903905-29-b-pa...@ti.com/

v10: Changelog:
1. Don't remove dsp func override. Already done by [v10 20/33] patch.
2. Update commit message to call out changes in a better way.

Link to v9:
https://lore.kernel.org/all/20250317120622.1746415-22-b-pa...@ti.com/

 drivers/remoteproc/ti_k3_common.c         | 33 ++++++++++++++++++++++
 drivers/remoteproc/ti_k3_common.h         |  2 ++
 drivers/remoteproc/ti_k3_dsp_remoteproc.c | 34 +----------------------
 drivers/remoteproc/ti_k3_m4_remoteproc.c  | 34 +----------------------
 drivers/remoteproc/ti_k3_r5_remoteproc.c  | 34 +----------------------
 5 files changed, 38 insertions(+), 99 deletions(-)

diff --git a/drivers/remoteproc/ti_k3_common.c 
b/drivers/remoteproc/ti_k3_common.c
index 5c5185a4581c2..96313d75c5130 100644
--- a/drivers/remoteproc/ti_k3_common.c
+++ b/drivers/remoteproc/ti_k3_common.c
@@ -314,5 +314,38 @@ EXPORT_SYMBOL_GPL(k3_rproc_attach);
 int k3_rproc_detach(struct rproc *rproc) { return 0; }
 EXPORT_SYMBOL_GPL(k3_rproc_detach);
 
+/*
+ * This function implements the .get_loaded_rsc_table() callback and is used
+ * to provide the resource table for a booted remote processor in IPC-only
+ * mode. The remote processor firmwares follow a design-by-contract approach
+ * and are expected to have the resource table at the base of the DDR region
+ * reserved for firmware usage. This provides flexibility for the remote
+ * processor to be booted by different bootloaders that may or may not have the
+ * ability to publish the resource table address and size through a DT
+ * property.
+ */
+struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
+                                              size_t *rsc_table_sz)
+{
+       struct k3_rproc *kproc = rproc->priv;
+       struct device *dev = kproc->dev;
+
+       if (!kproc->rmem[0].cpu_addr) {
+               dev_err(dev, "memory-region #1 does not exist, loaded rsc table 
can't be found");
+               return ERR_PTR(-ENOMEM);
+       }
+
+       /*
+        * NOTE: The resource table size is currently hard-coded to a maximum
+        * of 256 bytes. The most common resource table usage for K3 firmwares
+        * is to only have the vdev resource entry and an optional trace entry.
+        * The exact size could be computed based on resource table address, but
+        * the hard-coded value suffices to support the IPC-only mode.
+        */
+       *rsc_table_sz = 256;
+       return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
+}
+EXPORT_SYMBOL_GPL(k3_get_loaded_rsc_table);
+
 MODULE_LICENSE("GPL");
 MODULE_DESCRIPTION("TI K3 common Remoteproc code");
diff --git a/drivers/remoteproc/ti_k3_common.h 
b/drivers/remoteproc/ti_k3_common.h
index 97345349b818a..266e5c66762f1 100644
--- a/drivers/remoteproc/ti_k3_common.h
+++ b/drivers/remoteproc/ti_k3_common.h
@@ -99,4 +99,6 @@ int k3_rproc_start(struct rproc *rproc);
 int k3_rproc_stop(struct rproc *rproc);
 int k3_rproc_attach(struct rproc *rproc);
 int k3_rproc_detach(struct rproc *rproc);
+struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
+                                              size_t *rsc_table_sz);
 #endif /* REMOTEPROC_TI_K3_COMMON_H */
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c 
b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index a62a69d9f80ed..8a51b304ed1f2 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -58,38 +58,6 @@ static int k3_dsp_rproc_start(struct rproc *rproc)
        return 0;
 }
 
-/*
- * This function implements the .get_loaded_rsc_table() callback and is used
- * to provide the resource table for a booted DSP in IPC-only mode. The K3 DSP
- * firmwares follow a design-by-contract approach and are expected to have the
- * resource table at the base of the DDR region reserved for firmware usage.
- * This provides flexibility for the remote processor to be booted by different
- * bootloaders that may or may not have the ability to publish the resource 
table
- * address and size through a DT property. This callback is invoked only in
- * IPC-only mode.
- */
-static struct resource_table *k3_dsp_get_loaded_rsc_table(struct rproc *rproc,
-                                                         size_t *rsc_table_sz)
-{
-       struct k3_rproc *kproc = rproc->priv;
-       struct device *dev = kproc->dev;
-
-       if (!kproc->rmem[0].cpu_addr) {
-               dev_err(dev, "memory-region #1 does not exist, loaded rsc table 
can't be found");
-               return ERR_PTR(-ENOMEM);
-       }
-
-       /*
-        * NOTE: The resource table size is currently hard-coded to a maximum
-        * of 256 bytes. The most common resource table usage for K3 firmwares
-        * is to only have the vdev resource entry and an optional trace entry.
-        * The exact size could be computed based on resource table address, but
-        * the hard-coded value suffices to support the IPC-only mode.
-        */
-       *rsc_table_sz = 256;
-       return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
-}
-
 /*
  * Custom function to translate a DSP device address (internal RAMs only) to a
  * kernel virtual address.  The DSPs can access their RAMs at either an 
internal
@@ -156,7 +124,7 @@ static const struct rproc_ops k3_dsp_rproc_ops = {
        .detach                 = k3_rproc_detach,
        .kick                   = k3_rproc_kick,
        .da_to_va               = k3_dsp_rproc_da_to_va,
-       .get_loaded_rsc_table   = k3_dsp_get_loaded_rsc_table,
+       .get_loaded_rsc_table   = k3_get_loaded_rsc_table,
 };
 
 static int k3_dsp_rproc_of_get_memories(struct platform_device *pdev,
diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c 
b/drivers/remoteproc/ti_k3_m4_remoteproc.c
index accf8b9aea6ed..59c696a493c5f 100644
--- a/drivers/remoteproc/ti_k3_m4_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c
@@ -21,38 +21,6 @@
 #include "ti_sci_proc.h"
 #include "ti_k3_common.h"
 
-/*
- * This function implements the .get_loaded_rsc_table() callback and is used
- * to provide the resource table for a booted remote processor in IPC-only
- * mode. The remote processor firmwares follow a design-by-contract approach
- * and are expected to have the resource table at the base of the DDR region
- * reserved for firmware usage. This provides flexibility for the remote
- * processor to be booted by different bootloaders that may or may not have the
- * ability to publish the resource table address and size through a DT
- * property.
- */
-static struct resource_table *k3_m4_get_loaded_rsc_table(struct rproc *rproc,
-                                                        size_t *rsc_table_sz)
-{
-       struct k3_rproc *kproc = rproc->priv;
-       struct device *dev = kproc->dev;
-
-       if (!kproc->rmem[0].cpu_addr) {
-               dev_err(dev, "memory-region #1 does not exist, loaded rsc table 
can't be found");
-               return ERR_PTR(-ENOMEM);
-       }
-
-       /*
-        * NOTE: The resource table size is currently hard-coded to a maximum
-        * of 256 bytes. The most common resource table usage for K3 firmwares
-        * is to only have the vdev resource entry and an optional trace entry.
-        * The exact size could be computed based on resource table address, but
-        * the hard-coded value suffices to support the IPC-only mode.
-        */
-       *rsc_table_sz = 256;
-       return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
-}
-
 /*
  * Custom function to translate a remote processor device address (internal
  * RAMs only) to a kernel virtual address.  The remote processors can access
@@ -253,7 +221,7 @@ static const struct rproc_ops k3_m4_rproc_ops = {
        .detach = k3_rproc_detach,
        .kick = k3_rproc_kick,
        .da_to_va = k3_m4_rproc_da_to_va,
-       .get_loaded_rsc_table = k3_m4_get_loaded_rsc_table,
+       .get_loaded_rsc_table = k3_get_loaded_rsc_table,
 };
 
 static int k3_m4_rproc_probe(struct platform_device *pdev)
diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c 
b/drivers/remoteproc/ti_k3_r5_remoteproc.c
index 49b576872103e..e6f136d320c13 100644
--- a/drivers/remoteproc/ti_k3_r5_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c
@@ -559,38 +559,6 @@ static int k3_r5_rproc_stop(struct rproc *rproc)
        return ret;
 }
 
-/*
- * This function implements the .get_loaded_rsc_table() callback and is used
- * to provide the resource table for the booted R5F in IPC-only mode. The K3 
R5F
- * firmwares follow a design-by-contract approach and are expected to have the
- * resource table at the base of the DDR region reserved for firmware usage.
- * This provides flexibility for the remote processor to be booted by different
- * bootloaders that may or may not have the ability to publish the resource 
table
- * address and size through a DT property. This callback is invoked only in
- * IPC-only mode.
- */
-static struct resource_table *k3_r5_get_loaded_rsc_table(struct rproc *rproc,
-                                                        size_t *rsc_table_sz)
-{
-       struct k3_rproc *kproc = rproc->priv;
-       struct device *dev = kproc->dev;
-
-       if (!kproc->rmem[0].cpu_addr) {
-               dev_err(dev, "memory-region #1 does not exist, loaded rsc table 
can't be found");
-               return ERR_PTR(-ENOMEM);
-       }
-
-       /*
-        * NOTE: The resource table size is currently hard-coded to a maximum
-        * of 256 bytes. The most common resource table usage for K3 firmwares
-        * is to only have the vdev resource entry and an optional trace entry.
-        * The exact size could be computed based on resource table address, but
-        * the hard-coded value suffices to support the IPC-only mode.
-        */
-       *rsc_table_sz = 256;
-       return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
-}
-
 /*
  * Internal Memory translation helper
  *
@@ -1042,7 +1010,7 @@ static int k3_r5_rproc_configure_mode(struct k3_rproc 
*kproc)
                kproc->rproc->ops->attach = k3_rproc_attach;
                kproc->rproc->ops->detach = k3_rproc_detach;
                kproc->rproc->ops->get_loaded_rsc_table =
-                                               k3_r5_get_loaded_rsc_table;
+                                               k3_get_loaded_rsc_table;
        } else if (!c_state) {
                dev_info(cdev, "configured R5F for remoteproc mode\n");
                ret = 0;
-- 
2.34.1


Reply via email to