|
@@ -0,0 +1,137 @@
|
|
|
+RPMH RSC:
|
|
|
+------------
|
|
|
+
|
|
|
+Resource Power Manager Hardened (RPMH) is the mechanism for communicating with
|
|
|
+the hardened resource accelerators on Qualcomm SoCs. Requests to the resources
|
|
|
+can be written to the Trigger Command Set (TCS) registers and using a (addr,
|
|
|
+val) pair and triggered. Messages in the TCS are then sent in sequence over an
|
|
|
+internal bus.
|
|
|
+
|
|
|
+The hardware block (Direct Resource Voter or DRV) is a part of the h/w entity
|
|
|
+(Resource State Coordinator a.k.a RSC) that can handle multiple sleep and
|
|
|
+active/wake resource requests. Multiple such DRVs can exist in a SoC and can
|
|
|
+be written to from Linux. The structure of each DRV follows the same template
|
|
|
+with a few variations that are captured by the properties here.
|
|
|
+
|
|
|
+A TCS may be triggered from Linux or triggered by the F/W after all the CPUs
|
|
|
+have powered off to facilitate idle power saving. TCS could be classified as -
|
|
|
+
|
|
|
+ ACTIVE /* Triggered by Linux */
|
|
|
+ SLEEP /* Triggered by F/W */
|
|
|
+ WAKE /* Triggered by F/W */
|
|
|
+ CONTROL /* Triggered by F/W */
|
|
|
+
|
|
|
+The order in which they are described in the DT, should match the hardware
|
|
|
+configuration.
|
|
|
+
|
|
|
+Requests can be made for the state of a resource, when the subsystem is active
|
|
|
+or idle. When all subsystems like Modem, GPU, CPU are idle, the resource state
|
|
|
+will be an aggregate of the sleep votes from each of those subsystems. Clients
|
|
|
+may request a sleep value for their shared resources in addition to the active
|
|
|
+mode requests.
|
|
|
+
|
|
|
+Properties:
|
|
|
+
|
|
|
+- compatible:
|
|
|
+ Usage: required
|
|
|
+ Value type: <string>
|
|
|
+ Definition: Should be "qcom,rpmh-rsc".
|
|
|
+
|
|
|
+- reg:
|
|
|
+ Usage: required
|
|
|
+ Value type: <prop-encoded-array>
|
|
|
+ Definition: The first register specifies the base address of the
|
|
|
+ DRV(s). The number of DRVs in the dependent on the RSC.
|
|
|
+ The tcs-offset specifies the start address of the
|
|
|
+ TCS in the DRVs.
|
|
|
+
|
|
|
+- reg-names:
|
|
|
+ Usage: required
|
|
|
+ Value type: <string>
|
|
|
+ Definition: Maps the register specified in the reg property. Must be
|
|
|
+ "drv-0", "drv-1", "drv-2" etc and "tcs-offset". The
|
|
|
+
|
|
|
+- interrupts:
|
|
|
+ Usage: required
|
|
|
+ Value type: <prop-encoded-interrupt>
|
|
|
+ Definition: The interrupt that trips when a message complete/response
|
|
|
+ is received for this DRV from the accelerators.
|
|
|
+
|
|
|
+- qcom,drv-id:
|
|
|
+ Usage: required
|
|
|
+ Value type: <u32>
|
|
|
+ Definition: The id of the DRV in the RSC block that will be used by
|
|
|
+ this controller.
|
|
|
+
|
|
|
+- qcom,tcs-config:
|
|
|
+ Usage: required
|
|
|
+ Value type: <prop-encoded-array>
|
|
|
+ Definition: The tuple defining the configuration of TCS.
|
|
|
+ Must have 2 cells which describe each TCS type.
|
|
|
+ <type number_of_tcs>.
|
|
|
+ The order of the TCS must match the hardware
|
|
|
+ configuration.
|
|
|
+ - Cell #1 (TCS Type): TCS types to be specified -
|
|
|
+ ACTIVE_TCS
|
|
|
+ SLEEP_TCS
|
|
|
+ WAKE_TCS
|
|
|
+ CONTROL_TCS
|
|
|
+ - Cell #2 (Number of TCS): <u32>
|
|
|
+
|
|
|
+- label:
|
|
|
+ Usage: optional
|
|
|
+ Value type: <string>
|
|
|
+ Definition: Name for the RSC. The name would be used in trace logs.
|
|
|
+
|
|
|
+Drivers that want to use the RSC to communicate with RPMH must specify their
|
|
|
+bindings as child nodes of the RSC controllers they wish to communicate with.
|
|
|
+
|
|
|
+Example 1:
|
|
|
+
|
|
|
+For a TCS whose RSC base address is is 0x179C0000 and is at a DRV id of 2, the
|
|
|
+register offsets for DRV2 start at 0D00, the register calculations are like
|
|
|
+this -
|
|
|
+DRV0: 0x179C0000
|
|
|
+DRV2: 0x179C0000 + 0x10000 = 0x179D0000
|
|
|
+DRV2: 0x179C0000 + 0x10000 * 2 = 0x179E0000
|
|
|
+TCS-OFFSET: 0xD00
|
|
|
+
|
|
|
+ apps_rsc: rsc@179c0000 {
|
|
|
+ label = "apps_rsc";
|
|
|
+ compatible = "qcom,rpmh-rsc";
|
|
|
+ reg = <0x179c0000 0x10000>,
|
|
|
+ <0x179d0000 0x10000>,
|
|
|
+ <0x179e0000 0x10000>;
|
|
|
+ reg-names = "drv-0", "drv-1", "drv-2";
|
|
|
+ interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
|
|
+ <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
|
|
+ <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
|
|
+ qcom,tcs-offset = <0xd00>;
|
|
|
+ qcom,drv-id = <2>;
|
|
|
+ qcom,tcs-config = <ACTIVE_TCS 2>,
|
|
|
+ <SLEEP_TCS 3>,
|
|
|
+ <WAKE_TCS 3>,
|
|
|
+ <CONTROL_TCS 1>;
|
|
|
+ };
|
|
|
+
|
|
|
+Example 2:
|
|
|
+
|
|
|
+For a TCS whose RSC base address is 0xAF20000 and is at DRV id of 0, the
|
|
|
+register offsets for DRV0 start at 01C00, the register calculations are like
|
|
|
+this -
|
|
|
+DRV0: 0xAF20000
|
|
|
+TCS-OFFSET: 0x1C00
|
|
|
+
|
|
|
+ disp_rsc: rsc@af20000 {
|
|
|
+ label = "disp_rsc";
|
|
|
+ compatible = "qcom,rpmh-rsc";
|
|
|
+ reg = <0xaf20000 0x10000>;
|
|
|
+ reg-names = "drv-0";
|
|
|
+ interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_HIGH>;
|
|
|
+ qcom,tcs-offset = <0x1c00>;
|
|
|
+ qcom,drv-id = <0>;
|
|
|
+ qcom,tcs-config = <ACTIVE_TCS 0>,
|
|
|
+ <SLEEP_TCS 1>,
|
|
|
+ <WAKE_TCS 1>,
|
|
|
+ <CONTROL_TCS 0>;
|
|
|
+ };
|