Thread (11 messages) 11 messages, 4 authors, 2025-10-30

Re: [PATCH 2/4] remoteproc: imx_rproc: Add runtime ops copy to support dynamic behavior

From: Frank Li <Frank.li@nxp.com>
Date: 2025-10-28 15:58:20
Also in: imx, linux-devicetree, linux-remoteproc, lkml

On Tue, Oct 28, 2025 at 04:18:02PM +0800, Peng Fan wrote:
Structure imx_rproc_dcfg contains a const pointer to imx_rproc_plat_ops,
which defines the start/stop/detect_mode operations for a remote processor.
To preserve the const correctness of the static configuration while
allowing runtime modification of ops behavior, this patch introduces a new
Needn't "this patch", just "introduce a new ..."
imx_rproc_plat_ops member in struct imx_rproc named `ops`.

During initialization, the contents of dcfg->ops are copied into priv->ops.
This enables the driver to safely override or customize specific ops at
Nit: Enable the driver ..
runtime without affecting the original const configuration.

This change improves flexibility for platforms that require dynamic
Nit: Improve ...

Generally, needn't words like "This change[patch]" in commit message.
simple use impesative mode, like

Do foo for ...
Make foo to ...

Reviewed-by: Frank Li <Frank.Li@nxp.com>
quoted hunk ↗ jump to hunk
operation switching (e.g. i.MX95 Logical Machine ops and CPU ops).

Signed-off-by: Peng Fan <peng.fan@nxp.com>
---
 drivers/remoteproc/imx_rproc.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 02e155e967942d745de4ccd96f9008e4211f9b36..4ffd2415295be5e60c8eb8ea5126b3562bf703fe 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -116,6 +116,7 @@ struct imx_rproc {
 	u32				entry;		/* cpu start address */
 	u32				core_index;
 	struct dev_pm_domain_list	*pd_list;
+	struct imx_rproc_plat_ops	ops;
 };

 static const struct imx_rproc_att imx_rproc_att_imx93[] = {
@@ -315,7 +316,6 @@ static int imx_rproc_scu_api_start(struct rproc *rproc)
 static int imx_rproc_start(struct rproc *rproc)
 {
 	struct imx_rproc *priv = rproc->priv;
-	const struct imx_rproc_dcfg *dcfg = priv->dcfg;
 	struct device *dev = priv->dev;
 	int ret;
@@ -323,10 +323,10 @@ static int imx_rproc_start(struct rproc *rproc)
 	if (ret)
 		return ret;

-	if (!dcfg->ops || !dcfg->ops->start)
+	if (!priv->ops.start)
 		return -EOPNOTSUPP;

-	ret = dcfg->ops->start(rproc);
+	ret = priv->ops.start(rproc);
 	if (ret)
 		dev_err(dev, "Failed to enable remote core!\n");
@@ -372,14 +372,13 @@ static int imx_rproc_scu_api_stop(struct rproc *rproc)
 static int imx_rproc_stop(struct rproc *rproc)
 {
 	struct imx_rproc *priv = rproc->priv;
-	const struct imx_rproc_dcfg *dcfg = priv->dcfg;
 	struct device *dev = priv->dev;
 	int ret;

-	if (!dcfg->ops || !dcfg->ops->stop)
+	if (!priv->ops.stop)
 		return -EOPNOTSUPP;

-	ret = dcfg->ops->stop(rproc);
+	ret = priv->ops.stop(rproc);
 	if (ret)
 		dev_err(dev, "Failed to stop remote core\n");
 	else
@@ -590,12 +589,11 @@ static int imx_rproc_scu_api_detach(struct rproc *rproc)
 static int imx_rproc_detach(struct rproc *rproc)
 {
 	struct imx_rproc *priv = rproc->priv;
-	const struct imx_rproc_dcfg *dcfg = priv->dcfg;

-	if (!dcfg->ops || !dcfg->ops->detach)
+	if (!priv->ops.detach)
 		return -EOPNOTSUPP;

-	return dcfg->ops->detach(rproc);
+	return priv->ops.detach(rproc);
 }

 static struct resource_table *imx_rproc_get_loaded_rsc_table(struct rproc *rproc, size_t *table_sz)
@@ -995,18 +993,16 @@ static int imx_rproc_scu_api_detect_mode(struct rproc *rproc)

 static int imx_rproc_detect_mode(struct imx_rproc *priv)
 {
-	const struct imx_rproc_dcfg *dcfg = priv->dcfg;
-
 	/*
 	 * To i.MX{7,8} ULP, Linux is under control of RTOS, no need
-	 * dcfg->ops or dcfg->ops->detect_mode, it is state RPROC_DETACHED.
+	 * priv->ops.detect_mode, it is state RPROC_DETACHED.
 	 */
-	if (!dcfg->ops || !dcfg->ops->detect_mode) {
+	if (!priv->ops.detect_mode) {
 		priv->rproc->state = RPROC_DETACHED;
 		return 0;
 	}

-	return dcfg->ops->detect_mode(priv->rproc);
+	return priv->ops.detect_mode(priv->rproc);
 }

 static int imx_rproc_sys_off_handler(struct sys_off_data *data)
@@ -1056,6 +1052,9 @@ static int imx_rproc_probe(struct platform_device *pdev)
 	priv->dcfg = dcfg;
 	priv->dev = dev;

+	if (dcfg->ops)
+		memcpy(&priv->ops, dcfg->ops, sizeof(struct imx_rproc_plat_ops));
+
 	dev_set_drvdata(dev, rproc);
 	priv->workqueue = create_workqueue(dev_name(dev));
 	if (!priv->workqueue) {

--
2.37.1
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help