dt-bindings: remoteproc: Add Qualcomm RPM processor/subsystem
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> Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Link: https://lore.kernel.org/r/20230531-rpm-rproc-v3-6-a07dcdefd918@gerhold.net Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
parent
b3a12c2996
commit
9a2c674ee7
|
@ -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-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
|
||||
|
||||
oneOf:
|
||||
- required:
|
||||
- smd-edge
|
||||
- required:
|
||||
- glink-edge
|
||||
|
||||
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-edge {
|
||||
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";
|
||||
/* ... */
|
||||
};
|
||||
};
|
||||
};
|
|
@ -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>;
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
Loading…
Reference in New Issue