| 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>; |
| }; |