Skip to content

Commit 454cb78

Browse files
MrVanmathieupoirier
authored andcommitted
remoteproc: imx_rproc: Add runtime ops copy to support dynamic behavior
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, introduce a new imx_rproc_plat_ops member in struct imx_rproc named `ops`. During initialization, dcfg->ops is assigned to priv->ops. Enable the driver to safely override ops at runtime without affecting the original const configuration. Improve flexibility for platforms that require dynamic operation switching (e.g. i.MX95 Logical Machine ops and CPU ops). Reviewed-by: Frank Li <Frank.Li@nxp.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com> Link: https://lore.kernel.org/r/20260109-imx95-rproc-2026-1-8-v6-2-d2fefb36263d@nxp.com Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
1 parent ac3ea07 commit 454cb78

1 file changed

Lines changed: 13 additions & 14 deletions

File tree

drivers/remoteproc/imx_rproc.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ struct imx_rproc {
116116
u32 entry; /* cpu start address */
117117
u32 core_index;
118118
struct dev_pm_domain_list *pd_list;
119+
const struct imx_rproc_plat_ops *ops;
119120
};
120121

121122
static const struct imx_rproc_att imx_rproc_att_imx93[] = {
@@ -315,18 +316,17 @@ static int imx_rproc_scu_api_start(struct rproc *rproc)
315316
static int imx_rproc_start(struct rproc *rproc)
316317
{
317318
struct imx_rproc *priv = rproc->priv;
318-
const struct imx_rproc_dcfg *dcfg = priv->dcfg;
319319
struct device *dev = priv->dev;
320320
int ret;
321321

322322
ret = imx_rproc_xtr_mbox_init(rproc, true);
323323
if (ret)
324324
return ret;
325325

326-
if (!dcfg->ops || !dcfg->ops->start)
326+
if (!priv->ops || !priv->ops->start)
327327
return -EOPNOTSUPP;
328328

329-
ret = dcfg->ops->start(rproc);
329+
ret = priv->ops->start(rproc);
330330
if (ret)
331331
dev_err(dev, "Failed to enable remote core!\n");
332332

@@ -372,14 +372,13 @@ static int imx_rproc_scu_api_stop(struct rproc *rproc)
372372
static int imx_rproc_stop(struct rproc *rproc)
373373
{
374374
struct imx_rproc *priv = rproc->priv;
375-
const struct imx_rproc_dcfg *dcfg = priv->dcfg;
376375
struct device *dev = priv->dev;
377376
int ret;
378377

379-
if (!dcfg->ops || !dcfg->ops->stop)
378+
if (!priv->ops || !priv->ops->stop)
380379
return -EOPNOTSUPP;
381380

382-
ret = dcfg->ops->stop(rproc);
381+
ret = priv->ops->stop(rproc);
383382
if (ret)
384383
dev_err(dev, "Failed to stop remote core\n");
385384
else
@@ -584,12 +583,11 @@ static int imx_rproc_scu_api_detach(struct rproc *rproc)
584583
static int imx_rproc_detach(struct rproc *rproc)
585584
{
586585
struct imx_rproc *priv = rproc->priv;
587-
const struct imx_rproc_dcfg *dcfg = priv->dcfg;
588586

589-
if (!dcfg->ops || !dcfg->ops->detach)
587+
if (!priv->ops || !priv->ops->detach)
590588
return -EOPNOTSUPP;
591589

592-
return dcfg->ops->detach(rproc);
590+
return priv->ops->detach(rproc);
593591
}
594592

595593
static struct resource_table *imx_rproc_get_loaded_rsc_table(struct rproc *rproc, size_t *table_sz)
@@ -979,18 +977,16 @@ static int imx_rproc_scu_api_detect_mode(struct rproc *rproc)
979977

980978
static int imx_rproc_detect_mode(struct imx_rproc *priv)
981979
{
982-
const struct imx_rproc_dcfg *dcfg = priv->dcfg;
983-
984980
/*
985981
* To i.MX{7,8} ULP, Linux is under control of RTOS, no need
986-
* dcfg->ops or dcfg->ops->detect_mode, it is state RPROC_DETACHED.
982+
* priv->ops or priv->ops->detect_mode, it is state RPROC_DETACHED.
987983
*/
988-
if (!dcfg->ops || !dcfg->ops->detect_mode) {
984+
if (!priv->ops || !priv->ops->detect_mode) {
989985
priv->rproc->state = RPROC_DETACHED;
990986
return 0;
991987
}
992988

993-
return dcfg->ops->detect_mode(priv->rproc);
989+
return priv->ops->detect_mode(priv->rproc);
994990
}
995991

996992
static int imx_rproc_sys_off_handler(struct sys_off_data *data)
@@ -1040,6 +1036,9 @@ static int imx_rproc_probe(struct platform_device *pdev)
10401036
priv->dcfg = dcfg;
10411037
priv->dev = dev;
10421038

1039+
if (dcfg->ops)
1040+
priv->ops = dcfg->ops;
1041+
10431042
dev_set_drvdata(dev, rproc);
10441043
priv->workqueue = create_workqueue(dev_name(dev));
10451044
if (!priv->workqueue) {

0 commit comments

Comments
 (0)