1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/remoteproc/ti,pru-rproc.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: TI Programmable Realtime Unit (PRU) cores
8
9maintainers:
10  - Suman Anna <s-anna@ti.com>
11
12description: |
13  Each Programmable Real-Time Unit and Industrial Communication Subsystem
14  (PRU-ICSS or PRUSS) has two 32-bit load/store RISC CPU cores called
15  Programmable Real-Time Units (PRUs), each represented by a node. Each PRU
16  core has a dedicated Instruction RAM, Control and Debug register sets, and
17  use the Data RAMs present within the PRU-ICSS for code execution.
18
19  The K3 SoCs containing ICSSG v1.0 (eg: AM65x SR1.0) also have two Auxiliary
20  PRU cores called RTUs with slightly different IP integration. The K3 SoCs
21  containing the revised ICSSG v1.1 (eg: J721E, AM65x SR2.0) have an extra two
22  auxiliary Transmit PRU cores called Tx_PRUs that augment the PRUs. Each RTU
23  or Tx_PRU core can also be used independently like a PRU, or alongside a
24  corresponding PRU core to provide/implement auxiliary functionality/support.
25
26  Each PRU, RTU or Tx_PRU core node should be defined as a child node of the
27  corresponding PRU-ICSS node. Each node can optionally be rendered inactive by
28  using the standard DT string property, "status".
29
30  Please see the overall PRU-ICSS bindings document for additional details
31  including a complete example,
32    Documentation/devicetree/bindings/soc/ti/ti,pruss.yaml
33
34properties:
35  compatible:
36    enum:
37      - ti,am3356-pru   # for AM335x SoC family (AM3356+ SoCs only)
38      - ti,am4376-pru   # for AM437x SoC family (AM4376+ SoCs only)
39      - ti,am5728-pru   # for AM57xx SoC family
40      - ti,am625-pru    # for PRUs in K3 AM62x SoC family
41      - ti,am642-pru    # for PRUs in K3 AM64x SoC family
42      - ti,am642-rtu    # for RTUs in K3 AM64x SoC family
43      - ti,am642-tx-pru # for Tx_PRUs in K3 AM64x SoC family
44      - ti,am654-pru    # for PRUs in K3 AM65x SoC family
45      - ti,am654-rtu    # for RTUs in K3 AM65x SoC family
46      - ti,am654-tx-pru # for Tx_PRUs in K3 AM65x SR2.0 SoCs
47      - ti,j721e-pru    # for PRUs in K3 J721E SoC family
48      - ti,j721e-rtu    # for RTUs in K3 J721E SoC family
49      - ti,j721e-tx-pru # for Tx_PRUs in K3 J721E SoC family
50      - ti,k2g-pru      # for 66AK2G SoC family
51
52  reg:
53    items:
54      - description: Address and Size of the PRU Instruction RAM
55      - description: Address and Size of the PRU CTRL sub-module registers
56      - description: Address and Size of the PRU Debug sub-module registers
57
58  reg-names:
59    items:
60      - const: iram
61      - const: control
62      - const: debug
63
64  firmware-name:
65    description: |
66      Should contain the name of the default firmware image
67      file located on the firmware search path.
68
69  interrupts:
70    maxItems: 1
71    description:
72      Interrupt specifiers enable the virtio/rpmsg communication between MPU
73      and the PRU/RTU cores. For the values of the interrupt cells please refer
74      to interrupt-controller/ti,pruss-intc.yaml schema.
75
76  interrupt-names:
77    items:
78      - const: vring
79
80if:
81  properties:
82    compatible:
83      enum:
84        - ti,am654-rtu
85        - ti,j721e-rtu
86        - ti,am642-rtu
87then:
88  properties:
89    $nodename:
90      pattern: "^rtu@[0-9a-f]+$"
91else:
92  if:
93    properties:
94      compatible:
95        enum:
96          - ti,am654-tx-pru
97          - ti,j721e-tx-pru
98          - ti,am642-tx-pru
99  then:
100    properties:
101      $nodename:
102        pattern: "^txpru@[0-9a-f]+"
103  else:
104    properties:
105      $nodename:
106        pattern: "^pru@[0-9a-f]+$"
107
108required:
109  - compatible
110  - reg
111  - reg-names
112  - firmware-name
113
114additionalProperties: false
115
116examples:
117  - |
118    /* AM33xx PRU-ICSS */
119    pruss_tm: target-module@300000 {  /* 0x4a300000, ap 9 04.0 */
120      compatible = "ti,sysc-pruss", "ti,sysc";
121      #address-cells = <1>;
122      #size-cells = <1>;
123      ranges = <0x0 0x300000 0x80000>;
124
125      pruss: pruss@0 {
126        compatible = "ti,am3356-pruss";
127        reg = <0x0 0x80000>;
128        #address-cells = <1>;
129        #size-cells = <1>;
130        ranges;
131
132        pruss_mem: memories@0 {
133          reg = <0x0 0x2000>,
134                <0x2000 0x2000>,
135                <0x10000 0x3000>;
136          reg-names = "dram0", "dram1", "shrdram2";
137        };
138
139        pru0: pru@34000 {
140          compatible = "ti,am3356-pru";
141          reg = <0x34000 0x2000>,
142                <0x22000 0x400>,
143                <0x22400 0x100>;
144          reg-names = "iram", "control", "debug";
145          firmware-name = "am335x-pru0-fw";
146        };
147
148        pru1: pru@38000 {
149          compatible = "ti,am3356-pru";
150          reg = <0x38000 0x2000>,
151                <0x24000 0x400>,
152                <0x24400 0x100>;
153          reg-names = "iram", "control", "debug";
154          firmware-name = "am335x-pru1-fw";
155        };
156      };
157    };
158
159  - |
160    /* AM65x SR2.0 ICSSG */
161    #include <dt-bindings/soc/ti,sci_pm_domain.h>
162
163    icssg0: icssg@b000000 {
164      compatible = "ti,am654-icssg";
165      reg = <0xb000000 0x80000>;
166      power-domains = <&k3_pds 62 TI_SCI_PD_EXCLUSIVE>;
167      #address-cells = <1>;
168      #size-cells = <1>;
169      ranges = <0x0 0xb000000 0x80000>;
170
171      icssg0_mem: memories@0 {
172        reg = <0x0 0x2000>,
173              <0x2000 0x2000>,
174              <0x10000 0x10000>;
175        reg-names = "dram0", "dram1", "shrdram2";
176      };
177
178      pru0_0: pru@34000 {
179        compatible = "ti,am654-pru";
180        reg = <0x34000 0x4000>,
181              <0x22000 0x100>,
182              <0x22400 0x100>;
183        reg-names = "iram", "control", "debug";
184        firmware-name = "am65x-pru0_0-fw";
185        interrupt-parent = <&icssg0_intc>;
186        interrupts = <16 2 2>;
187        interrupt-names = "vring";
188      };
189
190      rtu0_0: rtu@4000 {
191        compatible = "ti,am654-rtu";
192        reg = <0x4000 0x2000>,
193              <0x23000 0x100>,
194              <0x23400 0x100>;
195        reg-names = "iram", "control", "debug";
196        firmware-name = "am65x-rtu0_0-fw";
197        interrupt-parent = <&icssg0_intc>;
198        interrupts = <20 4 4>;
199        interrupt-names = "vring";
200      };
201
202      tx_pru0_0: txpru@a000 {
203        compatible = "ti,am654-tx-pru";
204        reg = <0xa000 0x1800>,
205              <0x25000 0x100>,
206              <0x25400 0x100>;
207        reg-names = "iram", "control", "debug";
208        firmware-name = "am65x-txpru0_0-fw";
209      };
210
211      pru0_1: pru@38000 {
212        compatible = "ti,am654-pru";
213        reg = <0x38000 0x4000>,
214              <0x24000 0x100>,
215              <0x24400 0x100>;
216        reg-names = "iram", "control", "debug";
217        firmware-name = "am65x-pru0_1-fw";
218        interrupt-parent = <&icssg0_intc>;
219        interrupts = <18 3 3>;
220        interrupt-names = "vring";
221      };
222
223      rtu0_1: rtu@6000 {
224        compatible = "ti,am654-rtu";
225        reg = <0x6000 0x2000>,
226              <0x23800 0x100>,
227              <0x23c00 0x100>;
228        reg-names = "iram", "control", "debug";
229        firmware-name = "am65x-rtu0_1-fw";
230        interrupt-parent = <&icssg0_intc>;
231        interrupts = <22 5 5>;
232        interrupt-names = "vring";
233      };
234
235      tx_pru0_1: txpru@c000 {
236        compatible = "ti,am654-tx-pru";
237        reg = <0xc000 0x1800>,
238              <0x25800 0x100>,
239              <0x25c00 0x100>;
240        reg-names = "iram", "control", "debug";
241        firmware-name = "am65x-txpru0_1-fw";
242      };
243    };
244