Message ID | 20230531-rpm-rproc-v2-5-56a4a00c8260@gerhold.net (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add dedicated device tree node for RPM processor/subsystem | expand |
On Thu, 08 Jun 2023 09:10:25 +0200, 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. > > 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. > > Deprecate using the old top-level /smd node since all SMD edges > are now specified as subnodes of the remote processor. > > Signed-off-by: Stephan Gerhold <stephan@gerhold.net> > --- > This patch is based on qcom/for-next, since it needs the new > qcom,rpm-master-stats.yaml schema that is only applied there. > --- > .../bindings/remoteproc/qcom,rpm-proc.yaml | 171 +++++++++++++++++++++ > .../devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml | 6 +- > .../devicetree/bindings/soc/qcom/qcom,smd.yaml | 7 + > 3 files changed, 181 insertions(+), 3 deletions(-) > My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13): yamllint warnings/errors: dtschema/dtc warnings/errors: ./Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml: Unable to find schema file matching $id: http://devicetree.org/schemas/soc/qcom/qcom,rpm-master-stats.yaml doc reference errors (make refcheckdocs): See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20230531-rpm-rproc-v2-5-56a4a00c8260@gerhold.net The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch. If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date: pip3 install dtschema --upgrade Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema.
On 08/06/2023 09:10, 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. Thank you for your patch. There is something to discuss/improve. > + > + smd-edge: > + $ref: /schemas/remoteproc/qcom,smd-edge.yaml# > + description: > + Qualcomm Shared Memory subnode which represents communication edge, > + channels and devices related to the RPM subsystem. > + > + glink-rpm: This should be "glink-edge", to be a bit more generic and match existing smd-edge. > + $ref: /schemas/remoteproc/qcom,glink-rpm-edge.yaml# > + description: > + Qualcomm G-Link subnode which represents communication edge, > + channels and devices related to the RPM subsystem. > + > + 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. > + > + master-stats: > + $ref: /schemas/soc/qcom/qcom,rpm-master-stats.yaml# > + description: > + Subsystem-level low-power mode statistics provided by RPM. > + > +required: > + - compatible > + Best regards, Krzysztof
On Sat, Jun 10, 2023 at 06:43:17PM +0200, Krzysztof Kozlowski wrote: > On 08/06/2023 09:10, 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. > > + > > + smd-edge: > > + $ref: /schemas/remoteproc/qcom,smd-edge.yaml# > > + description: > > + Qualcomm Shared Memory subnode which represents communication edge, > > + channels and devices related to the RPM subsystem. > > + > > + glink-rpm: > > This should be "glink-edge", to be a bit more generic and match existing > smd-edge. > I fully agree and I actually made that change at some point before sending v1. Unfortunately, it doesn't work: The node name "glink-edge" is already reserved by qcom,glink-edge.yaml. While it's very similar it has some subtle differences to glink-rpm-edge.yaml. For example, there is no qcom,remote-pid in the RPM variant which is required by the normal glink-edge. Would "glink-rpm-edge" sound better? Thanks, Stephan
On 10/06/2023 18:52, Stephan Gerhold wrote: > On Sat, Jun 10, 2023 at 06:43:17PM +0200, Krzysztof Kozlowski wrote: >> On 08/06/2023 09:10, 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. >>> + >>> + smd-edge: >>> + $ref: /schemas/remoteproc/qcom,smd-edge.yaml# >>> + description: >>> + Qualcomm Shared Memory subnode which represents communication edge, >>> + channels and devices related to the RPM subsystem. >>> + >>> + glink-rpm: >> >> This should be "glink-edge", to be a bit more generic and match existing >> smd-edge. >> > > I fully agree and I actually made that change at some point before > sending v1. Unfortunately, it doesn't work: The node name "glink-edge" > is already reserved by qcom,glink-edge.yaml. While it's very similar it > has some subtle differences to glink-rpm-edge.yaml. For example, there > is no qcom,remote-pid in the RPM variant which is required by the normal > glink-edge. But the other variant has, so they are pretty similar. It could be one binding or some common part. Anyway we can as well drop the nodename from the qcom,glink-edge.yaml binding. Anyway the binding is referenced by each specific remote proc, so this nodename brings nothing. > Would "glink-rpm-edge" sound better? > > Thanks, > Stephan > Best regards, Krzysztof
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..9c016613463f --- /dev/null +++ b/Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml @@ -0,0 +1,171 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/remoteproc/qcom,rpm-proc.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm Resource Power Manager (RPM) Processor/Subsystem + +maintainers: + - Bjorn Andersson <andersson@kernel.org> + - Konrad Dybcio <konrad.dybcio@linaro.org> + - Stephan Gerhold <stephan@gerhold.net> + +description: | + Resource Power Manager (RPM) subsystem found in various Qualcomm platforms: + + +--------------------------------------------+ + | RPM subsystem (qcom,rpm-proc) | + | | + reset | +---------------+ +-----+ +-----+ | + --------->| | | MPM | | CPR | ... | + IPC interrupts | | ARM Cortex-M3 |--- +-----+ +-----+ | + ----------------->| | | | | | + | +---------------+ |---------------------- | + | +---------------+ | | + | | Code RAM |--| +------------------+ | + | +---------------+ | | | | + | +---------------+ |--| Message RAM | | + | | Data RAM |--| | | | + | +---------------+ | +------------------+ | + +--------------------|-----------------------+ + v + NoC + + The firmware running on the processor inside the RPM subsystem allows each + component in the system to vote for state of the system resources, such as + clocks, regulators and bus frequencies. It implements multiple separate + communication interfaces that are described in subnodes, e.g. SMD and MPM: + + +------------------------------+ + | ARM Cortex-M3 | + | | +------------------------------+ + | +--------------------------+ | | Message RAM | + | | RPM firmware | | | | + IPC IRQ 0 | | +----------------------+ | | | +--------------------------+ | + -------------->| SMD server |<------->| SMD data structures | | + | | | +--------------+ | | | | | +--------------+ | | + | | | | rpm_requests | ... | | | | | | rpm_requests | ... | | + | | | +--------------+ | | | | | +--------------+ | | + IPC IRQ 1 | | +----------------------+ | | | +--------------------------+ | + -------------->| MPM virtualization |<--------| MPM register copy (vMPM) | | + | | +----------------------+ | | | +--------------------------+ | + | | ... | | | | ... | + | +--------------------|-----+ | +------------------------------+ + +----------------------|-------+ + v + +--------------+ + | MPM Hardware | + +--------------+ + + The services provided by the firmware are only available after the firmware + has been loaded and the processor has been released from reset. Usually this + happens early in the boot process before the operating system is started. + +properties: + compatible: + items: + - enum: + - qcom,apq8084-rpm-proc + - qcom,ipq6018-rpm-proc + - qcom,ipq9574-rpm-proc + - qcom,mdm9607-rpm-proc + - qcom,msm8226-rpm-proc + - qcom,msm8610-rpm-proc + - qcom,msm8909-rpm-proc + - qcom,msm8916-rpm-proc + - qcom,msm8917-rpm-proc + - qcom,msm8936-rpm-proc + - qcom,msm8937-rpm-proc + - qcom,msm8952-rpm-proc + - qcom,msm8953-rpm-proc + - qcom,msm8974-rpm-proc + - qcom,msm8976-rpm-proc + - qcom,msm8994-rpm-proc + - qcom,msm8996-rpm-proc + - qcom,msm8998-rpm-proc + - qcom,qcm2290-rpm-proc + - qcom,qcs404-rpm-proc + - qcom,sdm660-rpm-proc + - qcom,sm6115-rpm-proc + - qcom,sm6125-rpm-proc + - qcom,sm6375-rpm-proc + - const: qcom,rpm-proc + + smd-edge: + $ref: /schemas/remoteproc/qcom,smd-edge.yaml# + description: + Qualcomm Shared Memory subnode which represents communication edge, + channels and devices related to the RPM subsystem. + + glink-rpm: + $ref: /schemas/remoteproc/qcom,glink-rpm-edge.yaml# + description: + Qualcomm G-Link subnode which represents communication edge, + channels and devices related to the RPM subsystem. + + 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. + + master-stats: + $ref: /schemas/soc/qcom/qcom,rpm-master-stats.yaml# + description: + Subsystem-level low-power mode statistics provided by RPM. + +required: + - compatible + +oneOf: + - required: + - smd-edge + - required: + - glink-rpm + +additionalProperties: false + +examples: + # SMD + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/interrupt-controller/irq.h> + + remoteproc { + compatible = "qcom,msm8916-rpm-proc", "qcom,rpm-proc"; + + smd-edge { + interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>; + qcom,ipc = <&apcs 8 0>; + qcom,smd-edge = <15>; + + rpm-requests { + compatible = "qcom,rpm-msm8916"; + qcom,smd-channels = "rpm_requests"; + /* ... */ + }; + }; + }; + # GLINK + - | + #include <dt-bindings/interrupt-controller/arm-gic.h> + #include <dt-bindings/interrupt-controller/irq.h> + + remoteproc { + compatible = "qcom,qcm2290-rpm-proc", "qcom,rpm-proc"; + + glink-rpm { + compatible = "qcom,glink-rpm"; + interrupts = <GIC_SPI 194 IRQ_TYPE_EDGE_RISING>; + qcom,rpm-msg-ram = <&rpm_msg_ram>; + mboxes = <&apcs_glb 0>; + + rpm-requests { + compatible = "qcom,rpm-qcm2290"; + qcom,glink-channels = "rpm_requests"; + /* ... */ + }; + }; + }; diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml b/Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml index c6930706bfa9..2fa725b8af5d 100644 --- a/Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml +++ b/Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml @@ -120,10 +120,10 @@ examples: #include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/irq.h> - smd { - compatible = "qcom,smd"; + remoteproc { + compatible = "qcom,msm8916-rpm-proc", "qcom,rpm-proc"; - rpm { + smd-edge { interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>; qcom,ipc = <&apcs 8 0>; qcom,smd-edge = <15>; diff --git a/Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml b/Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml index 063e595c12f7..4819ce90d206 100644 --- a/Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml +++ b/Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml @@ -15,6 +15,12 @@ description: The Qualcomm Shared Memory Driver is a FIFO based communication channel for sending data between the various subsystems in Qualcomm platforms. + Using the top-level SMD node is deprecated. Instead, the SMD edges are defined + directly below the device node representing the respective remote subsystem + or remote processor. + +deprecated: true + properties: compatible: const: qcom,smd @@ -37,6 +43,7 @@ examples: # The following example represents a smd node, with one edge representing the # "rpm" subsystem. For the "rpm" subsystem we have a device tied to the # "rpm_request" channel. + # NOTE: This is deprecated, represent the RPM using "qcom,rpm-proc" instead. - | #include <dt-bindings/interrupt-controller/arm-gic.h>
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. 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. Deprecate using the old top-level /smd node since all SMD edges are now specified as subnodes of the remote processor. Signed-off-by: Stephan Gerhold <stephan@gerhold.net> --- This patch is based on qcom/for-next, since it needs the new qcom,rpm-master-stats.yaml schema that is only applied there. --- .../bindings/remoteproc/qcom,rpm-proc.yaml | 171 +++++++++++++++++++++ .../devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml | 6 +- .../devicetree/bindings/soc/qcom/qcom,smd.yaml | 7 + 3 files changed, 181 insertions(+), 3 deletions(-)