lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <aQ35BvxIwMetA5fm@shlinux89>
Date: Fri, 7 Nov 2025 21:49:58 +0800
From: Peng Fan <peng.fan@....nxp.com>
To: Daniel Baluta <daniel.baluta@...il.com>
Cc: Peng Fan <peng.fan@....com>, Bjorn Andersson <andersson@...nel.org>,
	Mathieu Poirier <mathieu.poirier@...aro.org>,
	Rob Herring <robh@...nel.org>,
	Krzysztof Kozlowski <krzk+dt@...nel.org>,
	Conor Dooley <conor+dt@...nel.org>, Shawn Guo <shawnguo@...nel.org>,
	Sascha Hauer <s.hauer@...gutronix.de>,
	Pengutronix Kernel Team <kernel@...gutronix.de>,
	Fabio Estevam <festevam@...il.com>,
	Daniel Baluta <daniel.baluta@....com>, Frank Li <frank.li@....com>,
	linux-remoteproc@...r.kernel.org, devicetree@...r.kernel.org,
	imx@...ts.linux.dev, linux-arm-kernel@...ts.infradead.org,
	linux-kernel@...r.kernel.org
Subject: Re: [PATCH v2 4/5] remoteproc: imx_rproc: Add support for System
 Manager API

Hi Daniel,

On Fri, Nov 07, 2025 at 11:10:15AM +0200, Daniel Baluta wrote:
>> There are three cases for M7:
>
>Here we should specify how M7 gets into these three situations, is it
>via the ATF configuration?

It is not ATF configuration. This is configured in System Manager.

>
>e.g
>
>Depending on ATF configuration, M7 can be used as follows:

I will use:
"Depending on System Manager configuration, M7 can be used as follows:"

>
>>  (1) M7 in a separate Logical Machine(LM) that Linux can't control it.
>
>Here we should make it clear from who is M7 separate.
>
>e.g
>
>(1) M7 in a separate Logical Machine (LM) from A55 cores, that Linux
>can't control
>
>>  (2) M7 in a separate Logical Machine that Linux can control it using
>>      LMM protocol
>
>(2) M7 in a separate LM from A55 cores that Linux can control using
>LMM protocol.
>
>>  (3) M7 runs in same Logical Machine as A55, so Linux can control it
>>      using CPU protocol
>>
>
>
>> So extend the driver to using LMM and CPU protocol to manage the M7 core.
>
>
>>  - Compare linux LM ID(got using scmi_imx_lmm_info) and M7 LM ID(the ID
>>    is fixed as 1 in SM firmware if M7 is in a seprate LM),
>
>s/seprate/separate
>
>One question here: Is it OK to call scmi_imx_lmm_info no matter the
>context are we in?

Yes. With LMM_ID_DISCOVER as parameter, this API will not fail in permission
check. It will always return current LM ID.

>
>If this call fails is it safe to assume that we are in the case (1)
>describe above? E.g Linux
>cannot reach the M7 core through LMM protocol  or CPU protocol?

Sadly no. See above.

>
>
>>
...
>> +static const struct imx_rproc_plat_ops imx_rproc_ops_sm = {
>
>I think this should be called imx_rproc_ops_sm_lmm.

ok.

>
>> +       .detect_mode    = imx_rproc_sm_detect_mode,
>> +       .prepare        = imx_rproc_sm_lmm_prepare,
>> +       .start          = imx_rproc_sm_lmm_start,
>> +       .stop           = imx_rproc_sm_lmm_stop,
>> +};
>> +
...
>> +       /*
>> +        * Use power on to do permission check. If rproc is in different LM,
>> +        * and linux has permission to handle the LM, set IMX_RPROC_FLAGS_SM_LMM_AVAIL.
>> +        */
>> +       ret = scmi_imx_lmm_operation(dcfg->lmid, SCMI_IMX_LMM_POWER_ON, 0);
>
>I wonder if there is a better call to check if Linux has permissions
>to handle to other LMM. This is a bit
>strange but if no other option we can go witi it.

Per doc drivers/firmware/arm_scmi/vendors/imx95.rst, this is the only one
that could be used for runtime detection.

>> +       if (ret != 0) {
>> +               if (ret == -EACCES) {
>> +                       /* Not under Linux Control, so only do IPC between rproc and Linux */
>> +                       dev_info(dev, "lmm(%d) not under Linux Control\n", dcfg->lmid);
>
>Would this be an error? So if Linux cannot interact with the other LMM
>via LMM API how IPC is possible?
>via CPU protocol?

When M7 is in a different LM, this means it is booted by ROM/SM, so
there is only IPC between M7 and Linux.

>
>Maybe we need a better explanation here.

"RPROC LM is booted before Linux and not under Linux Control, so only
do IPC between RPROC and Linux, not return failure"

>
>
>> +                       return 0;
>> +               }
>> +       /* else shutdown the LM to save power */

...

>> +       ret = scmi_imx_lmm_operation(dcfg->lmid, SCMI_IMX_LMM_SHUTDOWN, 0);
>> +       if (ret) {
>> +               dev_err(dev, "shutdown lmm(%d) failed: %d\n", dcfg->lmid, ret);
>
>do we care to restore the flags field here on case of error?

keep or clear, both should be fine. But restore the flags should be better
code practice. I will add that.

>
>> +               return ret;
>> +       }
>> +
>> +       return 0;
>> +}
>> +
>> +static int imx_rproc_sm_detect_mode(struct rproc *rproc)
>> +{
>
><snip>
>
>> +
>> +       ret = scmi_imx_cpu_started(dcfg->cpuid, &started);
>
>Is this CPU protocol call?

Yes.

>So we can still use this even if Host core
>and remote core are in different LMMs?

Yes. SM supports this.

>
>> +       if (ret) {
>> +               dev_err(dev, "Failed to detect cpu(%d) status: %d\n", dcfg->cpuid, ret);
>> +               return ret;
>> +       }
>> +
>> +       if (started)
>> +               priv->rproc->state = RPROC_DETACHED;
>> +
>> +       /* Get current Linux Logical Machine ID */
>> +       ret = scmi_imx_lmm_info(LMM_ID_DISCOVER, &info);
>> +       if (ret) {
>> +               dev_err(dev, "Failed to get current LMM ID err: %d\n", ret);
>> +               return ret;
>> +       }
>> +
>> +       /*
>> +        * Check whether remote processor is in same Logical Machine as Linux.
>
>Is in same -> is in the same. We need to always try to be consistent.
>
>Remote processor is a hardware part while Linux is a software part.
>
>So always use the same object types: e.g /*check whether remote
>processor is in the same LM as host core (running Linux) */
>
>> +        * If yes, use CPU protocol API to manage remote processor.
>> +        * If no, use Logical Machine API to manage remote processor.
>> +        */
>> +       is_cpu_ops = dcfg->lmid == info.lmid;
>
>No need for is_cpu_ops.
>
>Just go if(dcfg->lmid == info.lmid)

ok.

>
>
>> +
>> +       if (is_cpu_ops) {
>> +               priv->ops = &imx_rproc_ops_sm_cpu;
>> +               dev_info(dev, "Using CPU Protocol OPS\n");
>
>I'm not sure we want to go with dev_info here. It it pollute the log
>and at least confuse people.
>But if you feel a strong need for this you can keep it.
>
>Also, shouldn't be here an else case where priv->ops gets set to LMM ops?

Frank has same comment :)
This LMM ops is assigned to dcfg->ops, see patch 5.

But since both of you asked, adding else seems make it clear.

>
>> +               return 0;
>> +       }
>> +
>> +       dev_info(dev, "Using LMM Protocol OPS\n");
>> +
>> +       return imx_rproc_sm_lmm_check(rproc, started);
>
>If this check fails is the info message above still valid? It will
>confuse people.

I prefer to keep the message above, imx_rproc_sm_lmm_check() will
print out error message if there are any failures.

>
><snip>
>
>> @@ -52,6 +52,9 @@ struct imx_rproc_dcfg {
>>         enum imx_rproc_method           method;
>>         u32                             flags;
>>         const struct imx_rproc_plat_ops *ops;
>> +       /* For System Manager(SM) based SoCs, the IDs are from SM firmware */
>
>Keep here:
>
>/* For System Manager(SM) based SoCs */
>
>Then comment for each of the fields:
>> +       u32                             cpuid; /* TODO.... CPU Id of the remote core? */
>
>> +       u32                             lmid;
>
>But how these fields are set? Are they the cpuid and lmid of the
>remote core or local core (a55)?

Both are for remote core. These fields are hard-coded in System Manager.

Thanks
Peng


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ