Re: [PATCH 05/14] dt-bindings: remoteproc: Add Qualcomm RPM processor/subsystem

From: Stephan Gerhold
Date: Tue Jun 06 2023 - 04:56:14 EST


<On Tue, Jun 06, 2023 at 08:36:10AM +0200, Krzysztof Kozlowski wrote:
> On 05/06/2023 09:08, Stephan Gerhold wrote:
> > On Qualcomm platforms, most subsystems (e.g. audio/modem DSP) are
> > described as remote processors in the device tree, with a dedicated
> > node where properties and services related to them can be described.
> >
> > The Resource Power Manager (RPM) is also such a subsystem, with a
> > remote processor that is running a special firmware. Unfortunately,
> > the RPM never got a dedicated node representing it properly in the
> > device tree. Most of the RPM services are described below a top-level
> > /smd or /rpm-glink node.
>
> Then what is rpm-requests? This is the true RPM. It looks like you now
> duplicate half of it in a node above. Unless you want here to describe
> ways to communicate with the RPM, not the RPM itself.
>

I think you're confusing hardware and firmware here. The rpm-proc node
represents the RPM hardware block (or perhaps the RPM firmware overall),
while rpm-requests is just *one* communication interface provided by the
RPM firmware. Here is a rough picture of the RPM "subsystem" I'm trying
to describe:

+--------------------------------------------+
| RPM subsystem (qcom,rpm-proc) |
| |
reset | +---------------+ +-----+ +-----+ |
--------->| | | MPM | | CPR | ... |
IPC interrupts | | ARM Cortex-M3 | +-----+ +-----+ |
----------------->| |--- | | |
| +---------------+ |---------------------- |
| +---------------+ | |
| | Code RAM |--| +------------------+ |
| +---------------+ | | | |
| +---------------+ | | Message RAM | |
| | Data RAM |--|--| | |
| +---------------+ | +------------------+ |
+--------------------|-----------------------+
v
NoC

(Somewhat adapted from Figure 8-1 RPM overview in the APQ8016E Technical
Reference Manual, but I added some extra stuff.)

As you can see neither "SMD" nor "rpm-requests" exist in hardware.
Again, it's just one communication protocol implemented by the RPM
firmware running on the Cortex-M3 processor, much like a webserver
running on a PC.

When the SoC is started only the hardware block exists. Usually a
component in the boot chain loads firmware into the code/data RAM and
then de-asserts the reset line to start the Cortex-M3 processor.

This is not guaranteed to happen. For example, I have a special firmware
version where the firmware is only loaded but not brought out of reset.
In this case Linux is responsible to de-assert the reset line.
In follow-up patches I add that to the outer qcom,rpm-proc node:

remoteproc {
compatible = "qcom,msm8916-rpm-proc", "qcom,rpm-proc";
resets = <&gcc GCC_RPM_RESET>;
iommus = <&apps_smmu 0x0040>;

smd-edge {
/* ... */
rpm-requests {
qcom,smd-channels = "rpm_requests";
};
};
};

This reset line cannot be described on the rpm-requests node. Until the
firmware is started there is no such thing as "SMD" or "rpm-requests".

When the RPM firmware is started it sets up some data structures in the
message RAM and then begins serving requests, perhaps like this:

+----------------------------------+
| ARM Cortex-M3 |
| +------------------------------+ | +--------------------------------+
| | RPM Firmware | | | Message RAM |
IPC Interrupt | | +----------------------+ | | | +----------------------------+ |
------------------>| SMD Server | | | | | SMD Data Structures & FIFO | |
| | | +--------------+ | | | | | +--------------+ | |
| | | | rpm_requests | ... | | | | | | rpm_requests | ... | |
| | | +--------------+ | ... | | | | +--------------+ | |
| | +----------------------+ | | | +----------------------------+ |
| +------------------------------+ | | ... |
+----------------------------------+ +--------------------------------+

The "smd-edge" node represents the SMD part and "rpm_requests" is one
of the communication channels that can be used to talk to the RPM firmware.

Everything below rpm-requests: clocks, regulators, power domains are
pure firmware constructions. They do not exist in the RPM hardware block,
the firmware just acts as a proxy to collect votes from different
clients and then configures the actual hardware.

>
> > However, SMD/GLINK is just one of the communication channels to the RPM
> > firmware. For example, the MPM interrupt functionality provided by the
> > RPM does not use SMD/GLINK but writes directly to a special memory
> > region allocated by the RPM firmware in combination with a mailbox.
> > Currently there is no good place in the device tree to describe this
> > functionality. It doesn't belong below SMD/GLINK but it's not an
> > independent top-level device either.
> >
> > Introduce a new "qcom,rpm-proc" compatible that allows describing the
> > RPM as a remote processor/subsystem like all others. The SMD/GLINK node
> > is moved to a "smd-edge"/"glink-edge" subnode consistent with other
> > existing bindings. Additional subnodes (e.g. interrupt-controller for
> > MPM, rpm-master-stats) can be also added there.
>
> If this was about to stay, you should also update the qcom,smd.yaml, so
> there will be no duplication.
>

qcom,smd.yaml is deprecated in the next patch (PATCH 07/14).

> >
> > Signed-off-by: Stephan Gerhold <stephan@xxxxxxxxxxx>
> > ---
> > .../bindings/remoteproc/qcom,rpm-proc.yaml | 125 +++++++++++++++++++++
> > 1 file changed, 125 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml
> > new file mode 100644
> > index 000000000000..c06dd4f66503
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml
> > @@ -0,0 +1,125 @@
> > [...]
> > + interrupt-controller:
> > + type: object
> > + $ref: /schemas/interrupt-controller/qcom,mpm.yaml#
> > + description:
> > + MSM Power Manager (MPM) interrupt controller that monitors interrupts
> > + when the system is asleep.
>
> Isn't this a service of RPM?
>
> > +
> > + master-stats:
> > + $ref: /schemas/soc/qcom/qcom,rpm-master-stats.yaml#
> > + description:
> > + Subsystem-level low-power mode statistics provided by RPM.
>
> The same question.
>

Yes, they are services of the RPM firmware. But they have no relation to
the SMD/GLINK channel.

To clarify this I extend my picture from above with MPM:

+----------------------------------+
| ARM Cortex-M3 |
| +------------------------------+ | +--------------------------------+
| | RPM Firmware | | | Message RAM |
IPC Interrupt 0 | | +----------------------+ | | | +----------------------------+ |
------------------->| SMD Server | | | | | SMD Data Structures & FIFO | |
| | | +--------------+ | | | | | +--------------+ | |
| | | | rpm_requests | ... | | | | | | rpm_requests | ... | |
| | | +--------------+ | ... | | | | +--------------+ | |
| | +----------------------+ | | | +----------------------------+ |
IPC Interrupt 1 | | +----------------------+ | | | +----------------------------+ |
------------------->| MPM virtualization |<-----------| MPM register copy (vMPM) | |
| | +----------------------+ | | | +----------------------------+ |
| +-----------|------------------+ | | ... |
+-------------v--------------------+ +--------------------------------+
+--------------+
| MPM Hardware |
+--------------+

As you can see, SMD and MPM are siblings. The MPM functionality
implemented by the RPM firmware is not a child of the SMD server.

It's a bit like a webserver and emailserver running on the same PC.
Two separate services accessible via different ports and protocols.

Thanks,
Stephan

NOTE: All of this is just my interpretation based on the public hints
that exist. I have no access to internal documentation or source code
that would prove that all of this is correct.