/* Forward declarations for platform operations */
static const struct imx_rproc_plat_ops imx_rproc_ops_sm_lmm;
+static const struct imx_rproc_plat_ops imx_rproc_ops_sm_cpu;
struct imx_rproc {
struct device *dev;
return imx_sc_pm_cpu_start(priv->ipc_handle, priv->rsrc_id, true, priv->entry);
}
+static int imx_rproc_sm_cpu_start(struct rproc *rproc)
+{
+ struct imx_rproc *priv = rproc->priv;
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+ int ret;
+
+ ret = scmi_imx_cpu_reset_vector_set(dcfg->cpuid, 0, true, false, false);
+ if (ret) {
+ dev_err(priv->dev, "Failed to set reset vector cpuid(%u): %d\n", dcfg->cpuid, ret);
+ return ret;
+ }
+
+ return scmi_imx_cpu_start(dcfg->cpuid, true);
+}
+
static int imx_rproc_sm_lmm_start(struct rproc *rproc)
{
struct imx_rproc *priv = rproc->priv;
return imx_sc_pm_cpu_start(priv->ipc_handle, priv->rsrc_id, false, priv->entry);
}
+static int imx_rproc_sm_cpu_stop(struct rproc *rproc)
+{
+ struct imx_rproc *priv = rproc->priv;
+ const struct imx_rproc_dcfg *dcfg = priv->dcfg;
+
+ return scmi_imx_cpu_start(dcfg->cpuid, false);
+}
+
static int imx_rproc_sm_lmm_stop(struct rproc *rproc)
{
struct imx_rproc *priv = rproc->priv;
* If no, use Logical Machine API to manage M7.
*/
if (dcfg->lmid == info.lmid) {
- dev_err(dev, "CPU Protocol OPS is not supported\n");
- return -EOPNOTSUPP;
+ priv->ops = &imx_rproc_ops_sm_cpu;
+ dev_info(dev, "Using CPU Protocol OPS\n");
+ return 0;
}
priv->ops = &imx_rproc_ops_sm_lmm;
.stop = imx_rproc_sm_lmm_stop,
};
+static const struct imx_rproc_plat_ops imx_rproc_ops_sm_cpu = {
+ .detect_mode = imx_rproc_sm_detect_mode,
+ .start = imx_rproc_sm_cpu_start,
+ .stop = imx_rproc_sm_cpu_stop,
+};
+
static const struct imx_rproc_dcfg imx_rproc_cfg_imx8mn_mmio = {
.src_reg = IMX7D_SRC_SCR,
.src_mask = IMX7D_M4_RST_MASK,