forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
219 lines
7.0 KiB
219 lines
7.0 KiB
System Control and Power Interface (SCPI) Message Protocol |
|
---------------------------------------------------------- |
|
|
|
Firmware implementing the SCPI described in ARM document number ARM DUI 0922B |
|
("ARM Compute Subsystem SCP: Message Interface Protocols")[0] can be used |
|
by Linux to initiate various system control and power operations. |
|
|
|
Required properties: |
|
|
|
- compatible : should be |
|
* "arm,scpi" : For implementations complying to SCPI v1.0 or above |
|
* "arm,scpi-pre-1.0" : For implementations complying to all |
|
unversioned releases prior to SCPI v1.0 |
|
- mboxes: List of phandle and mailbox channel specifiers |
|
All the channels reserved by remote SCP firmware for use by |
|
SCPI message protocol should be specified in any order |
|
- shmem : List of phandle pointing to the shared memory(SHM) area between the |
|
processors using these mailboxes for IPC, one for each mailbox |
|
SHM can be any memory reserved for the purpose of this communication |
|
between the processors. |
|
|
|
See Documentation/devicetree/bindings/mailbox/mailbox.txt |
|
for more details about the generic mailbox controller and |
|
client driver bindings. |
|
|
|
Clock bindings for the clocks based on SCPI Message Protocol |
|
------------------------------------------------------------ |
|
|
|
This binding uses the common clock binding[1]. |
|
|
|
Container Node |
|
============== |
|
Required properties: |
|
- compatible : should be "arm,scpi-clocks" |
|
All the clocks provided by SCP firmware via SCPI message |
|
protocol much be listed as sub-nodes under this node. |
|
|
|
Sub-nodes |
|
========= |
|
Required properties: |
|
- compatible : shall include one of the following |
|
"arm,scpi-dvfs-clocks" - all the clocks that are variable and index based. |
|
These clocks don't provide an entire range of values between the |
|
limits but only discrete points within the range. The firmware |
|
provides the mapping for each such operating frequency and the |
|
index associated with it. The firmware also manages the |
|
voltage scaling appropriately with the clock scaling. |
|
"arm,scpi-variable-clocks" - all the clocks that are variable and provide full |
|
range within the specified range. The firmware provides the |
|
range of values within a specified range. |
|
|
|
Other required properties for all clocks(all from common clock binding): |
|
- #clock-cells : Should be 1. Contains the Clock ID value used by SCPI commands. |
|
- clock-output-names : shall be the corresponding names of the outputs. |
|
- clock-indices: The identifying number for the clocks(i.e.clock_id) in the |
|
node. It can be non linear and hence provide the mapping of identifiers |
|
into the clock-output-names array. |
|
|
|
SRAM and Shared Memory for SCPI |
|
------------------------------- |
|
|
|
A small area of SRAM is reserved for SCPI communication between application |
|
processors and SCP. |
|
|
|
The properties should follow the generic mmio-sram description found in [3] |
|
|
|
Each sub-node represents the reserved area for SCPI. |
|
|
|
Required sub-node properties: |
|
- reg : The base offset and size of the reserved area with the SRAM |
|
- compatible : should be "arm,scp-shmem" for Non-secure SRAM based |
|
shared memory |
|
|
|
Sensor bindings for the sensors based on SCPI Message Protocol |
|
-------------------------------------------------------------- |
|
SCPI provides an API to access the various sensors on the SoC. |
|
|
|
Required properties: |
|
- compatible : should be "arm,scpi-sensors". |
|
- #thermal-sensor-cells: should be set to 1. This property follows the |
|
thermal device tree bindings[2]. |
|
|
|
Valid cell values are raw identifiers (Sensor ID) |
|
as used by the firmware. Refer to platform details |
|
for your implementation for the IDs to use. |
|
|
|
Power domain bindings for the power domains based on SCPI Message Protocol |
|
------------------------------------------------------------ |
|
|
|
This binding uses the generic power domain binding[4]. |
|
|
|
PM domain providers |
|
=================== |
|
|
|
Required properties: |
|
- #power-domain-cells : Should be 1. Contains the device or the power |
|
domain ID value used by SCPI commands. |
|
- num-domains: Total number of power domains provided by SCPI. This is |
|
needed as the SCPI message protocol lacks a mechanism to |
|
query this information at runtime. |
|
|
|
PM domain consumers |
|
=================== |
|
|
|
Required properties: |
|
- power-domains : A phandle and PM domain specifier as defined by bindings of |
|
the power controller specified by phandle. |
|
|
|
[0] http://infocenter.arm.com/help/topic/com.arm.doc.dui0922b/index.html |
|
[1] Documentation/devicetree/bindings/clock/clock-bindings.txt |
|
[2] Documentation/devicetree/bindings/thermal/thermal*.yaml |
|
[3] Documentation/devicetree/bindings/sram/sram.yaml |
|
[4] Documentation/devicetree/bindings/power/power-domain.yaml |
|
|
|
Example: |
|
|
|
sram: sram@50000000 { |
|
compatible = "arm,juno-sram-ns", "mmio-sram"; |
|
reg = <0x0 0x50000000 0x0 0x10000>; |
|
|
|
#address-cells = <1>; |
|
#size-cells = <1>; |
|
ranges = <0 0x0 0x50000000 0x10000>; |
|
|
|
cpu_scp_lpri: scp-shmem@0 { |
|
compatible = "arm,juno-scp-shmem"; |
|
reg = <0x0 0x200>; |
|
}; |
|
|
|
cpu_scp_hpri: scp-shmem@200 { |
|
compatible = "arm,juno-scp-shmem"; |
|
reg = <0x200 0x200>; |
|
}; |
|
}; |
|
|
|
mailbox: mailbox0@40000000 { |
|
.... |
|
#mbox-cells = <1>; |
|
}; |
|
|
|
scpi_protocol: scpi@2e000000 { |
|
compatible = "arm,scpi"; |
|
mboxes = <&mailbox 0 &mailbox 1>; |
|
shmem = <&cpu_scp_lpri &cpu_scp_hpri>; |
|
|
|
clocks { |
|
compatible = "arm,scpi-clocks"; |
|
|
|
scpi_dvfs: scpi_clocks@0 { |
|
compatible = "arm,scpi-dvfs-clocks"; |
|
#clock-cells = <1>; |
|
clock-indices = <0>, <1>, <2>; |
|
clock-output-names = "atlclk", "aplclk","gpuclk"; |
|
}; |
|
scpi_clk: scpi_clocks@3 { |
|
compatible = "arm,scpi-variable-clocks"; |
|
#clock-cells = <1>; |
|
clock-indices = <3>, <4>; |
|
clock-output-names = "pxlclk0", "pxlclk1"; |
|
}; |
|
}; |
|
|
|
scpi_sensors0: sensors { |
|
compatible = "arm,scpi-sensors"; |
|
#thermal-sensor-cells = <1>; |
|
}; |
|
|
|
scpi_devpd: scpi-power-domains { |
|
compatible = "arm,scpi-power-domains"; |
|
num-domains = <2>; |
|
#power-domain-cells = <1>; |
|
}; |
|
}; |
|
|
|
cpu@0 { |
|
... |
|
reg = <0 0>; |
|
clocks = <&scpi_dvfs 0>; |
|
}; |
|
|
|
hdlcd@7ff60000 { |
|
... |
|
reg = <0 0x7ff60000 0 0x1000>; |
|
clocks = <&scpi_clk 4>; |
|
power-domains = <&scpi_devpd 1>; |
|
}; |
|
|
|
thermal-zones { |
|
soc_thermal { |
|
polling-delay-passive = <100>; |
|
polling-delay = <1000>; |
|
|
|
/* sensor ID */ |
|
thermal-sensors = <&scpi_sensors0 3>; |
|
... |
|
}; |
|
}; |
|
|
|
In the above example, the #clock-cells is set to 1 as required. |
|
scpi_dvfs has 3 output clocks namely: atlclk, aplclk, and gpuclk with 0, |
|
1 and 2 as clock-indices. scpi_clk has 2 output clocks namely: pxlclk0 |
|
and pxlclk1 with 3 and 4 as clock-indices. |
|
|
|
The first consumer in the example is cpu@0 and it has '0' as the clock |
|
specifier which points to the first entry in the output clocks of |
|
scpi_dvfs i.e. "atlclk". |
|
|
|
Similarly the second example is hdlcd@7ff60000 and it has pxlclk1 as input |
|
clock. '4' in the clock specifier here points to the second entry |
|
in the output clocks of scpi_clocks i.e. "pxlclk1" |
|
|
|
The thermal-sensors property in the soc_thermal node uses the |
|
temperature sensor provided by SCP firmware to setup a thermal |
|
zone. The ID "3" is the sensor identifier for the temperature sensor |
|
as used by the firmware. |
|
|
|
The num-domains property in scpi-power-domains domain specifies that |
|
SCPI provides 2 power domains. The hdlcd node uses the power domain with |
|
domain ID 1.
|
|
|