diff options
author | Rob Herring <rob.herring@calxeda.com> | 2013-11-06 17:06:28 -0500 |
---|---|---|
committer | Rob Herring <rob.herring@calxeda.com> | 2013-11-06 17:06:28 -0500 |
commit | 47869f5d11e96bf4480635279abc2be30632ca6a (patch) | |
tree | fde1497749bcca81e45ce354e216030580d0e49b /Documentation | |
parent | b6d4eeb18a863a9613f49adf2a59db3beeaf1bca (diff) | |
parent | deeea72860012324448c779b2f85371b2ebbf80b (diff) |
Merge branch 'cpu-bindings' into for-next
Diffstat (limited to 'Documentation')
-rw-r--r-- | Documentation/devicetree/bindings/arm/cpus.txt | 401 | ||||
-rw-r--r-- | Documentation/devicetree/bindings/arm/topology.txt | 474 |
2 files changed, 828 insertions, 47 deletions
diff --git a/Documentation/devicetree/bindings/arm/cpus.txt b/Documentation/devicetree/bindings/arm/cpus.txt index f32494dbfe19..91304353eea4 100644 --- a/Documentation/devicetree/bindings/arm/cpus.txt +++ b/Documentation/devicetree/bindings/arm/cpus.txt | |||
@@ -1,77 +1,384 @@ | |||
1 | * ARM CPUs binding description | 1 | ================= |
2 | ARM CPUs bindings | ||
3 | ================= | ||
2 | 4 | ||
3 | The device tree allows to describe the layout of CPUs in a system through | 5 | The device tree allows to describe the layout of CPUs in a system through |
4 | the "cpus" node, which in turn contains a number of subnodes (ie "cpu") | 6 | the "cpus" node, which in turn contains a number of subnodes (ie "cpu") |
5 | defining properties for every cpu. | 7 | defining properties for every cpu. |
6 | 8 | ||
7 | Bindings for CPU nodes follow the ePAPR standard, available from: | 9 | Bindings for CPU nodes follow the ePAPR v1.1 standard, available from: |
8 | 10 | ||
9 | http://devicetree.org | 11 | https://www.power.org/documentation/epapr-version-1-1/ |
10 | 12 | ||
11 | For the ARM architecture every CPU node must contain the following properties: | 13 | with updates for 32-bit and 64-bit ARM systems provided in this document. |
12 | 14 | ||
13 | - device_type: must be "cpu" | 15 | ================================ |
14 | - reg: property matching the CPU MPIDR[23:0] register bits | 16 | Convention used in this document |
15 | reg[31:24] bits must be set to 0 | 17 | ================================ |
16 | - compatible: should be one of: | 18 | |
17 | "arm,arm1020" | 19 | This document follows the conventions described in the ePAPR v1.1, with |
18 | "arm,arm1020e" | 20 | the addition: |
19 | "arm,arm1022" | 21 | |
20 | "arm,arm1026" | 22 | - square brackets define bitfields, eg reg[7:0] value of the bitfield in |
21 | "arm,arm720" | 23 | the reg property contained in bits 7 down to 0 |
22 | "arm,arm740" | 24 | |
23 | "arm,arm7tdmi" | 25 | ===================================== |
24 | "arm,arm920" | 26 | cpus and cpu node bindings definition |
25 | "arm,arm922" | 27 | ===================================== |
26 | "arm,arm925" | 28 | |
27 | "arm,arm926" | 29 | The ARM architecture, in accordance with the ePAPR, requires the cpus and cpu |
28 | "arm,arm940" | 30 | nodes to be present and contain the properties described below. |
29 | "arm,arm946" | 31 | |
30 | "arm,arm9tdmi" | 32 | - cpus node |
31 | "arm,cortex-a5" | 33 | |
32 | "arm,cortex-a7" | 34 | Description: Container of cpu nodes |
33 | "arm,cortex-a8" | 35 | |
34 | "arm,cortex-a9" | 36 | The node name must be "cpus". |
35 | "arm,cortex-a15" | 37 | |
36 | "arm,arm1136" | 38 | A cpus node must define the following properties: |
37 | "arm,arm1156" | 39 | |
38 | "arm,arm1176" | 40 | - #address-cells |
39 | "arm,arm11mpcore" | 41 | Usage: required |
40 | "faraday,fa526" | 42 | Value type: <u32> |
41 | "intel,sa110" | 43 | |
42 | "intel,sa1100" | 44 | Definition depends on ARM architecture version and |
43 | "marvell,feroceon" | 45 | configuration: |
44 | "marvell,mohawk" | 46 | |
45 | "marvell,xsc3" | 47 | # On uniprocessor ARM architectures previous to v7 |
46 | "marvell,xscale" | 48 | value must be 1, to enable a simple enumeration |
47 | 49 | scheme for processors that do not have a HW CPU | |
48 | Example: | 50 | identification register. |
51 | # On 32-bit ARM 11 MPcore, ARM v7 or later systems | ||
52 | value must be 1, that corresponds to CPUID/MPIDR | ||
53 | registers sizes. | ||
54 | # On ARM v8 64-bit systems value should be set to 2, | ||
55 | that corresponds to the MPIDR_EL1 register size. | ||
56 | If MPIDR_EL1[63:32] value is equal to 0 on all CPUs | ||
57 | in the system, #address-cells can be set to 1, since | ||
58 | MPIDR_EL1[63:32] bits are not used for CPUs | ||
59 | identification. | ||
60 | - #size-cells | ||
61 | Usage: required | ||
62 | Value type: <u32> | ||
63 | Definition: must be set to 0 | ||
64 | |||
65 | - cpu node | ||
66 | |||
67 | Description: Describes a CPU in an ARM based system | ||
68 | |||
69 | PROPERTIES | ||
70 | |||
71 | - device_type | ||
72 | Usage: required | ||
73 | Value type: <string> | ||
74 | Definition: must be "cpu" | ||
75 | - reg | ||
76 | Usage and definition depend on ARM architecture version and | ||
77 | configuration: | ||
78 | |||
79 | # On uniprocessor ARM architectures previous to v7 | ||
80 | this property is required and must be set to 0. | ||
81 | |||
82 | # On ARM 11 MPcore based systems this property is | ||
83 | required and matches the CPUID[11:0] register bits. | ||
84 | |||
85 | Bits [11:0] in the reg cell must be set to | ||
86 | bits [11:0] in CPU ID register. | ||
87 | |||
88 | All other bits in the reg cell must be set to 0. | ||
89 | |||
90 | # On 32-bit ARM v7 or later systems this property is | ||
91 | required and matches the CPU MPIDR[23:0] register | ||
92 | bits. | ||
93 | |||
94 | Bits [23:0] in the reg cell must be set to | ||
95 | bits [23:0] in MPIDR. | ||
96 | |||
97 | All other bits in the reg cell must be set to 0. | ||
98 | |||
99 | # On ARM v8 64-bit systems this property is required | ||
100 | and matches the MPIDR_EL1 register affinity bits. | ||
101 | |||
102 | * If cpus node's #address-cells property is set to 2 | ||
103 | |||
104 | The first reg cell bits [7:0] must be set to | ||
105 | bits [39:32] of MPIDR_EL1. | ||
106 | |||
107 | The second reg cell bits [23:0] must be set to | ||
108 | bits [23:0] of MPIDR_EL1. | ||
109 | |||
110 | * If cpus node's #address-cells property is set to 1 | ||
111 | |||
112 | The reg cell bits [23:0] must be set to bits [23:0] | ||
113 | of MPIDR_EL1. | ||
114 | |||
115 | All other bits in the reg cells must be set to 0. | ||
116 | |||
117 | - compatible: | ||
118 | Usage: required | ||
119 | Value type: <string> | ||
120 | Definition: should be one of: | ||
121 | "arm,arm710t" | ||
122 | "arm,arm720t" | ||
123 | "arm,arm740t" | ||
124 | "arm,arm7ej-s" | ||
125 | "arm,arm7tdmi" | ||
126 | "arm,arm7tdmi-s" | ||
127 | "arm,arm9es" | ||
128 | "arm,arm9ej-s" | ||
129 | "arm,arm920t" | ||
130 | "arm,arm922t" | ||
131 | "arm,arm925" | ||
132 | "arm,arm926e-s" | ||
133 | "arm,arm926ej-s" | ||
134 | "arm,arm940t" | ||
135 | "arm,arm946e-s" | ||
136 | "arm,arm966e-s" | ||
137 | "arm,arm968e-s" | ||
138 | "arm,arm9tdmi" | ||
139 | "arm,arm1020e" | ||
140 | "arm,arm1020t" | ||
141 | "arm,arm1022e" | ||
142 | "arm,arm1026ej-s" | ||
143 | "arm,arm1136j-s" | ||
144 | "arm,arm1136jf-s" | ||
145 | "arm,arm1156t2-s" | ||
146 | "arm,arm1156t2f-s" | ||
147 | "arm,arm1176jzf" | ||
148 | "arm,arm1176jz-s" | ||
149 | "arm,arm1176jzf-s" | ||
150 | "arm,arm11mpcore" | ||
151 | "arm,cortex-a5" | ||
152 | "arm,cortex-a7" | ||
153 | "arm,cortex-a8" | ||
154 | "arm,cortex-a9" | ||
155 | "arm,cortex-a15" | ||
156 | "arm,cortex-a53" | ||
157 | "arm,cortex-a57" | ||
158 | "arm,cortex-m0" | ||
159 | "arm,cortex-m0+" | ||
160 | "arm,cortex-m1" | ||
161 | "arm,cortex-m3" | ||
162 | "arm,cortex-m4" | ||
163 | "arm,cortex-r4" | ||
164 | "arm,cortex-r5" | ||
165 | "arm,cortex-r7" | ||
166 | "faraday,fa526" | ||
167 | "intel,sa110" | ||
168 | "intel,sa1100" | ||
169 | "marvell,feroceon" | ||
170 | "marvell,mohawk" | ||
171 | "marvell,pj4a" | ||
172 | "marvell,pj4b" | ||
173 | "marvell,sheeva-v5" | ||
174 | "qcom,krait" | ||
175 | "qcom,scorpion" | ||
176 | - enable-method | ||
177 | Value type: <stringlist> | ||
178 | Usage and definition depend on ARM architecture version. | ||
179 | # On ARM v8 64-bit this property is required and must | ||
180 | be one of: | ||
181 | "spin-table" | ||
182 | "psci" | ||
183 | # On ARM 32-bit systems this property is optional. | ||
184 | |||
185 | - cpu-release-addr | ||
186 | Usage: required for systems that have an "enable-method" | ||
187 | property value of "spin-table". | ||
188 | Value type: <prop-encoded-array> | ||
189 | Definition: | ||
190 | # On ARM v8 64-bit systems must be a two cell | ||
191 | property identifying a 64-bit zero-initialised | ||
192 | memory location. | ||
193 | |||
194 | Example 1 (dual-cluster big.LITTLE system 32-bit): | ||
49 | 195 | ||
50 | cpus { | 196 | cpus { |
51 | #size-cells = <0>; | 197 | #size-cells = <0>; |
52 | #address-cells = <1>; | 198 | #address-cells = <1>; |
53 | 199 | ||
54 | CPU0: cpu@0 { | 200 | cpu@0 { |
55 | device_type = "cpu"; | 201 | device_type = "cpu"; |
56 | compatible = "arm,cortex-a15"; | 202 | compatible = "arm,cortex-a15"; |
57 | reg = <0x0>; | 203 | reg = <0x0>; |
58 | }; | 204 | }; |
59 | 205 | ||
60 | CPU1: cpu@1 { | 206 | cpu@1 { |
61 | device_type = "cpu"; | 207 | device_type = "cpu"; |
62 | compatible = "arm,cortex-a15"; | 208 | compatible = "arm,cortex-a15"; |
63 | reg = <0x1>; | 209 | reg = <0x1>; |
64 | }; | 210 | }; |
65 | 211 | ||
66 | CPU2: cpu@100 { | 212 | cpu@100 { |
67 | device_type = "cpu"; | 213 | device_type = "cpu"; |
68 | compatible = "arm,cortex-a7"; | 214 | compatible = "arm,cortex-a7"; |
69 | reg = <0x100>; | 215 | reg = <0x100>; |
70 | }; | 216 | }; |
71 | 217 | ||
72 | CPU3: cpu@101 { | 218 | cpu@101 { |
73 | device_type = "cpu"; | 219 | device_type = "cpu"; |
74 | compatible = "arm,cortex-a7"; | 220 | compatible = "arm,cortex-a7"; |
75 | reg = <0x101>; | 221 | reg = <0x101>; |
76 | }; | 222 | }; |
77 | }; | 223 | }; |
224 | |||
225 | Example 2 (Cortex-A8 uniprocessor 32-bit system): | ||
226 | |||
227 | cpus { | ||
228 | #size-cells = <0>; | ||
229 | #address-cells = <1>; | ||
230 | |||
231 | cpu@0 { | ||
232 | device_type = "cpu"; | ||
233 | compatible = "arm,cortex-a8"; | ||
234 | reg = <0x0>; | ||
235 | }; | ||
236 | }; | ||
237 | |||
238 | Example 3 (ARM 926EJ-S uniprocessor 32-bit system): | ||
239 | |||
240 | cpus { | ||
241 | #size-cells = <0>; | ||
242 | #address-cells = <1>; | ||
243 | |||
244 | cpu@0 { | ||
245 | device_type = "cpu"; | ||
246 | compatible = "arm,arm926ej-s"; | ||
247 | reg = <0x0>; | ||
248 | }; | ||
249 | }; | ||
250 | |||
251 | Example 4 (ARM Cortex-A57 64-bit system): | ||
252 | |||
253 | cpus { | ||
254 | #size-cells = <0>; | ||
255 | #address-cells = <2>; | ||
256 | |||
257 | cpu@0 { | ||
258 | device_type = "cpu"; | ||
259 | compatible = "arm,cortex-a57"; | ||
260 | reg = <0x0 0x0>; | ||
261 | enable-method = "spin-table"; | ||
262 | cpu-release-addr = <0 0x20000000>; | ||
263 | }; | ||
264 | |||
265 | cpu@1 { | ||
266 | device_type = "cpu"; | ||
267 | compatible = "arm,cortex-a57"; | ||
268 | reg = <0x0 0x1>; | ||
269 | enable-method = "spin-table"; | ||
270 | cpu-release-addr = <0 0x20000000>; | ||
271 | }; | ||
272 | |||
273 | cpu@100 { | ||
274 | device_type = "cpu"; | ||
275 | compatible = "arm,cortex-a57"; | ||
276 | reg = <0x0 0x100>; | ||
277 | enable-method = "spin-table"; | ||
278 | cpu-release-addr = <0 0x20000000>; | ||
279 | }; | ||
280 | |||
281 | cpu@101 { | ||
282 | device_type = "cpu"; | ||
283 | compatible = "arm,cortex-a57"; | ||
284 | reg = <0x0 0x101>; | ||
285 | enable-method = "spin-table"; | ||
286 | cpu-release-addr = <0 0x20000000>; | ||
287 | }; | ||
288 | |||
289 | cpu@10000 { | ||
290 | device_type = "cpu"; | ||
291 | compatible = "arm,cortex-a57"; | ||
292 | reg = <0x0 0x10000>; | ||
293 | enable-method = "spin-table"; | ||
294 | cpu-release-addr = <0 0x20000000>; | ||
295 | }; | ||
296 | |||
297 | cpu@10001 { | ||
298 | device_type = "cpu"; | ||
299 | compatible = "arm,cortex-a57"; | ||
300 | reg = <0x0 0x10001>; | ||
301 | enable-method = "spin-table"; | ||
302 | cpu-release-addr = <0 0x20000000>; | ||
303 | }; | ||
304 | |||
305 | cpu@10100 { | ||
306 | device_type = "cpu"; | ||
307 | compatible = "arm,cortex-a57"; | ||
308 | reg = <0x0 0x10100>; | ||
309 | enable-method = "spin-table"; | ||
310 | cpu-release-addr = <0 0x20000000>; | ||
311 | }; | ||
312 | |||
313 | cpu@10101 { | ||
314 | device_type = "cpu"; | ||
315 | compatible = "arm,cortex-a57"; | ||
316 | reg = <0x0 0x10101>; | ||
317 | enable-method = "spin-table"; | ||
318 | cpu-release-addr = <0 0x20000000>; | ||
319 | }; | ||
320 | |||
321 | cpu@100000000 { | ||
322 | device_type = "cpu"; | ||
323 | compatible = "arm,cortex-a57"; | ||
324 | reg = <0x1 0x0>; | ||
325 | enable-method = "spin-table"; | ||
326 | cpu-release-addr = <0 0x20000000>; | ||
327 | }; | ||
328 | |||
329 | cpu@100000001 { | ||
330 | device_type = "cpu"; | ||
331 | compatible = "arm,cortex-a57"; | ||
332 | reg = <0x1 0x1>; | ||
333 | enable-method = "spin-table"; | ||
334 | cpu-release-addr = <0 0x20000000>; | ||
335 | }; | ||
336 | |||
337 | cpu@100000100 { | ||
338 | device_type = "cpu"; | ||
339 | compatible = "arm,cortex-a57"; | ||
340 | reg = <0x1 0x100>; | ||
341 | enable-method = "spin-table"; | ||
342 | cpu-release-addr = <0 0x20000000>; | ||
343 | }; | ||
344 | |||
345 | cpu@100000101 { | ||
346 | device_type = "cpu"; | ||
347 | compatible = "arm,cortex-a57"; | ||
348 | reg = <0x1 0x101>; | ||
349 | enable-method = "spin-table"; | ||
350 | cpu-release-addr = <0 0x20000000>; | ||
351 | }; | ||
352 | |||
353 | cpu@100010000 { | ||
354 | device_type = "cpu"; | ||
355 | compatible = "arm,cortex-a57"; | ||
356 | reg = <0x1 0x10000>; | ||
357 | enable-method = "spin-table"; | ||
358 | cpu-release-addr = <0 0x20000000>; | ||
359 | }; | ||
360 | |||
361 | cpu@100010001 { | ||
362 | device_type = "cpu"; | ||
363 | compatible = "arm,cortex-a57"; | ||
364 | reg = <0x1 0x10001>; | ||
365 | enable-method = "spin-table"; | ||
366 | cpu-release-addr = <0 0x20000000>; | ||
367 | }; | ||
368 | |||
369 | cpu@100010100 { | ||
370 | device_type = "cpu"; | ||
371 | compatible = "arm,cortex-a57"; | ||
372 | reg = <0x1 0x10100>; | ||
373 | enable-method = "spin-table"; | ||
374 | cpu-release-addr = <0 0x20000000>; | ||
375 | }; | ||
376 | |||
377 | cpu@100010101 { | ||
378 | device_type = "cpu"; | ||
379 | compatible = "arm,cortex-a57"; | ||
380 | reg = <0x1 0x10101>; | ||
381 | enable-method = "spin-table"; | ||
382 | cpu-release-addr = <0 0x20000000>; | ||
383 | }; | ||
384 | }; | ||
diff --git a/Documentation/devicetree/bindings/arm/topology.txt b/Documentation/devicetree/bindings/arm/topology.txt new file mode 100644 index 000000000000..4aa20e7a424e --- /dev/null +++ b/Documentation/devicetree/bindings/arm/topology.txt | |||
@@ -0,0 +1,474 @@ | |||
1 | =========================================== | ||
2 | ARM topology binding description | ||
3 | =========================================== | ||
4 | |||
5 | =========================================== | ||
6 | 1 - Introduction | ||
7 | =========================================== | ||
8 | |||
9 | In an ARM system, the hierarchy of CPUs is defined through three entities that | ||
10 | are used to describe the layout of physical CPUs in the system: | ||
11 | |||
12 | - cluster | ||
13 | - core | ||
14 | - thread | ||
15 | |||
16 | The cpu nodes (bindings defined in [1]) represent the devices that | ||
17 | correspond to physical CPUs and are to be mapped to the hierarchy levels. | ||
18 | |||
19 | The bottom hierarchy level sits at core or thread level depending on whether | ||
20 | symmetric multi-threading (SMT) is supported or not. | ||
21 | |||
22 | For instance in a system where CPUs support SMT, "cpu" nodes represent all | ||
23 | threads existing in the system and map to the hierarchy level "thread" above. | ||
24 | In systems where SMT is not supported "cpu" nodes represent all cores present | ||
25 | in the system and map to the hierarchy level "core" above. | ||
26 | |||
27 | ARM topology bindings allow one to associate cpu nodes with hierarchical groups | ||
28 | corresponding to the system hierarchy; syntactically they are defined as device | ||
29 | tree nodes. | ||
30 | |||
31 | The remainder of this document provides the topology bindings for ARM, based | ||
32 | on the ePAPR standard, available from: | ||
33 | |||
34 | http://www.power.org/documentation/epapr-version-1-1/ | ||
35 | |||
36 | If not stated otherwise, whenever a reference to a cpu node phandle is made its | ||
37 | value must point to a cpu node compliant with the cpu node bindings as | ||
38 | documented in [1]. | ||
39 | A topology description containing phandles to cpu nodes that are not compliant | ||
40 | with bindings standardized in [1] is therefore considered invalid. | ||
41 | |||
42 | =========================================== | ||
43 | 2 - cpu-map node | ||
44 | =========================================== | ||
45 | |||
46 | The ARM CPU topology is defined within the cpu-map node, which is a direct | ||
47 | child of the cpus node and provides a container where the actual topology | ||
48 | nodes are listed. | ||
49 | |||
50 | - cpu-map node | ||
51 | |||
52 | Usage: Optional - On ARM SMP systems provide CPUs topology to the OS. | ||
53 | ARM uniprocessor systems do not require a topology | ||
54 | description and therefore should not define a | ||
55 | cpu-map node. | ||
56 | |||
57 | Description: The cpu-map node is just a container node where its | ||
58 | subnodes describe the CPU topology. | ||
59 | |||
60 | Node name must be "cpu-map". | ||
61 | |||
62 | The cpu-map node's parent node must be the cpus node. | ||
63 | |||
64 | The cpu-map node's child nodes can be: | ||
65 | |||
66 | - one or more cluster nodes | ||
67 | |||
68 | Any other configuration is considered invalid. | ||
69 | |||
70 | The cpu-map node can only contain three types of child nodes: | ||
71 | |||
72 | - cluster node | ||
73 | - core node | ||
74 | - thread node | ||
75 | |||
76 | whose bindings are described in paragraph 3. | ||
77 | |||
78 | The nodes describing the CPU topology (cluster/core/thread) can only be | ||
79 | defined within the cpu-map node. | ||
80 | Any other configuration is consider invalid and therefore must be ignored. | ||
81 | |||
82 | =========================================== | ||
83 | 2.1 - cpu-map child nodes naming convention | ||
84 | =========================================== | ||
85 | |||
86 | cpu-map child nodes must follow a naming convention where the node name | ||
87 | must be "clusterN", "coreN", "threadN" depending on the node type (ie | ||
88 | cluster/core/thread) (where N = {0, 1, ...} is the node number; nodes which | ||
89 | are siblings within a single common parent node must be given a unique and | ||
90 | sequential N value, starting from 0). | ||
91 | cpu-map child nodes which do not share a common parent node can have the same | ||
92 | name (ie same number N as other cpu-map child nodes at different device tree | ||
93 | levels) since name uniqueness will be guaranteed by the device tree hierarchy. | ||
94 | |||
95 | =========================================== | ||
96 | 3 - cluster/core/thread node bindings | ||
97 | =========================================== | ||
98 | |||
99 | Bindings for cluster/cpu/thread nodes are defined as follows: | ||
100 | |||
101 | - cluster node | ||
102 | |||
103 | Description: must be declared within a cpu-map node, one node | ||
104 | per cluster. A system can contain several layers of | ||
105 | clustering and cluster nodes can be contained in parent | ||
106 | cluster nodes. | ||
107 | |||
108 | The cluster node name must be "clusterN" as described in 2.1 above. | ||
109 | A cluster node can not be a leaf node. | ||
110 | |||
111 | A cluster node's child nodes must be: | ||
112 | |||
113 | - one or more cluster nodes; or | ||
114 | - one or more core nodes | ||
115 | |||
116 | Any other configuration is considered invalid. | ||
117 | |||
118 | - core node | ||
119 | |||
120 | Description: must be declared in a cluster node, one node per core in | ||
121 | the cluster. If the system does not support SMT, core | ||
122 | nodes are leaf nodes, otherwise they become containers of | ||
123 | thread nodes. | ||
124 | |||
125 | The core node name must be "coreN" as described in 2.1 above. | ||
126 | |||
127 | A core node must be a leaf node if SMT is not supported. | ||
128 | |||
129 | Properties for core nodes that are leaf nodes: | ||
130 | |||
131 | - cpu | ||
132 | Usage: required | ||
133 | Value type: <phandle> | ||
134 | Definition: a phandle to the cpu node that corresponds to the | ||
135 | core node. | ||
136 | |||
137 | If a core node is not a leaf node (CPUs supporting SMT) a core node's | ||
138 | child nodes can be: | ||
139 | |||
140 | - one or more thread nodes | ||
141 | |||
142 | Any other configuration is considered invalid. | ||
143 | |||
144 | - thread node | ||
145 | |||
146 | Description: must be declared in a core node, one node per thread | ||
147 | in the core if the system supports SMT. Thread nodes are | ||
148 | always leaf nodes in the device tree. | ||
149 | |||
150 | The thread node name must be "threadN" as described in 2.1 above. | ||
151 | |||
152 | A thread node must be a leaf node. | ||
153 | |||
154 | A thread node must contain the following property: | ||
155 | |||
156 | - cpu | ||
157 | Usage: required | ||
158 | Value type: <phandle> | ||
159 | Definition: a phandle to the cpu node that corresponds to | ||
160 | the thread node. | ||
161 | |||
162 | =========================================== | ||
163 | 4 - Example dts | ||
164 | =========================================== | ||
165 | |||
166 | Example 1 (ARM 64-bit, 16-cpu system, two clusters of clusters): | ||
167 | |||
168 | cpus { | ||
169 | #size-cells = <0>; | ||
170 | #address-cells = <2>; | ||
171 | |||
172 | cpu-map { | ||
173 | cluster0 { | ||
174 | cluster0 { | ||
175 | core0 { | ||
176 | thread0 { | ||
177 | cpu = <&CPU0>; | ||
178 | }; | ||
179 | thread1 { | ||
180 | cpu = <&CPU1>; | ||
181 | }; | ||
182 | }; | ||
183 | |||
184 | core1 { | ||
185 | thread0 { | ||
186 | cpu = <&CPU2>; | ||
187 | }; | ||
188 | thread1 { | ||
189 | cpu = <&CPU3>; | ||
190 | }; | ||
191 | }; | ||
192 | }; | ||
193 | |||
194 | cluster1 { | ||
195 | core0 { | ||
196 | thread0 { | ||
197 | cpu = <&CPU4>; | ||
198 | }; | ||
199 | thread1 { | ||
200 | cpu = <&CPU5>; | ||
201 | }; | ||
202 | }; | ||
203 | |||
204 | core1 { | ||
205 | thread0 { | ||
206 | cpu = <&CPU6>; | ||
207 | }; | ||
208 | thread1 { | ||
209 | cpu = <&CPU7>; | ||
210 | }; | ||
211 | }; | ||
212 | }; | ||
213 | }; | ||
214 | |||
215 | cluster1 { | ||
216 | cluster0 { | ||
217 | core0 { | ||
218 | thread0 { | ||
219 | cpu = <&CPU8>; | ||
220 | }; | ||
221 | thread1 { | ||
222 | cpu = <&CPU9>; | ||
223 | }; | ||
224 | }; | ||
225 | core1 { | ||
226 | thread0 { | ||
227 | cpu = <&CPU10>; | ||
228 | }; | ||
229 | thread1 { | ||
230 | cpu = <&CPU11>; | ||
231 | }; | ||
232 | }; | ||
233 | }; | ||
234 | |||
235 | cluster1 { | ||
236 | core0 { | ||
237 | thread0 { | ||
238 | cpu = <&CPU12>; | ||
239 | }; | ||
240 | thread1 { | ||
241 | cpu = <&CPU13>; | ||
242 | }; | ||
243 | }; | ||
244 | core1 { | ||
245 | thread0 { | ||
246 | cpu = <&CPU14>; | ||
247 | }; | ||
248 | thread1 { | ||
249 | cpu = <&CPU15>; | ||
250 | }; | ||
251 | }; | ||
252 | }; | ||
253 | }; | ||
254 | }; | ||
255 | |||
256 | CPU0: cpu@0 { | ||
257 | device_type = "cpu"; | ||
258 | compatible = "arm,cortex-a57"; | ||
259 | reg = <0x0 0x0>; | ||
260 | enable-method = "spin-table"; | ||
261 | cpu-release-addr = <0 0x20000000>; | ||
262 | }; | ||
263 | |||
264 | CPU1: cpu@1 { | ||
265 | device_type = "cpu"; | ||
266 | compatible = "arm,cortex-a57"; | ||
267 | reg = <0x0 0x1>; | ||
268 | enable-method = "spin-table"; | ||
269 | cpu-release-addr = <0 0x20000000>; | ||
270 | }; | ||
271 | |||
272 | CPU2: cpu@100 { | ||
273 | device_type = "cpu"; | ||
274 | compatible = "arm,cortex-a57"; | ||
275 | reg = <0x0 0x100>; | ||
276 | enable-method = "spin-table"; | ||
277 | cpu-release-addr = <0 0x20000000>; | ||
278 | }; | ||
279 | |||
280 | CPU3: cpu@101 { | ||
281 | device_type = "cpu"; | ||
282 | compatible = "arm,cortex-a57"; | ||
283 | reg = <0x0 0x101>; | ||
284 | enable-method = "spin-table"; | ||
285 | cpu-release-addr = <0 0x20000000>; | ||
286 | }; | ||
287 | |||
288 | CPU4: cpu@10000 { | ||
289 | device_type = "cpu"; | ||
290 | compatible = "arm,cortex-a57"; | ||
291 | reg = <0x0 0x10000>; | ||
292 | enable-method = "spin-table"; | ||
293 | cpu-release-addr = <0 0x20000000>; | ||
294 | }; | ||
295 | |||
296 | CPU5: cpu@10001 { | ||
297 | device_type = "cpu"; | ||
298 | compatible = "arm,cortex-a57"; | ||
299 | reg = <0x0 0x10001>; | ||
300 | enable-method = "spin-table"; | ||
301 | cpu-release-addr = <0 0x20000000>; | ||
302 | }; | ||
303 | |||
304 | CPU6: cpu@10100 { | ||
305 | device_type = "cpu"; | ||
306 | compatible = "arm,cortex-a57"; | ||
307 | reg = <0x0 0x10100>; | ||
308 | enable-method = "spin-table"; | ||
309 | cpu-release-addr = <0 0x20000000>; | ||
310 | }; | ||
311 | |||
312 | CPU7: cpu@10101 { | ||
313 | device_type = "cpu"; | ||
314 | compatible = "arm,cortex-a57"; | ||
315 | reg = <0x0 0x10101>; | ||
316 | enable-method = "spin-table"; | ||
317 | cpu-release-addr = <0 0x20000000>; | ||
318 | }; | ||
319 | |||
320 | CPU8: cpu@100000000 { | ||
321 | device_type = "cpu"; | ||
322 | compatible = "arm,cortex-a57"; | ||
323 | reg = <0x1 0x0>; | ||
324 | enable-method = "spin-table"; | ||
325 | cpu-release-addr = <0 0x20000000>; | ||
326 | }; | ||
327 | |||
328 | CPU9: cpu@100000001 { | ||
329 | device_type = "cpu"; | ||
330 | compatible = "arm,cortex-a57"; | ||
331 | reg = <0x1 0x1>; | ||
332 | enable-method = "spin-table"; | ||
333 | cpu-release-addr = <0 0x20000000>; | ||
334 | }; | ||
335 | |||
336 | CPU10: cpu@100000100 { | ||
337 | device_type = "cpu"; | ||
338 | compatible = "arm,cortex-a57"; | ||
339 | reg = <0x1 0x100>; | ||
340 | enable-method = "spin-table"; | ||
341 | cpu-release-addr = <0 0x20000000>; | ||
342 | }; | ||
343 | |||
344 | CPU11: cpu@100000101 { | ||
345 | device_type = "cpu"; | ||
346 | compatible = "arm,cortex-a57"; | ||
347 | reg = <0x1 0x101>; | ||
348 | enable-method = "spin-table"; | ||
349 | cpu-release-addr = <0 0x20000000>; | ||
350 | }; | ||
351 | |||
352 | CPU12: cpu@100010000 { | ||
353 | device_type = "cpu"; | ||
354 | compatible = "arm,cortex-a57"; | ||
355 | reg = <0x1 0x10000>; | ||
356 | enable-method = "spin-table"; | ||
357 | cpu-release-addr = <0 0x20000000>; | ||
358 | }; | ||
359 | |||
360 | CPU13: cpu@100010001 { | ||
361 | device_type = "cpu"; | ||
362 | compatible = "arm,cortex-a57"; | ||
363 | reg = <0x1 0x10001>; | ||
364 | enable-method = "spin-table"; | ||
365 | cpu-release-addr = <0 0x20000000>; | ||
366 | }; | ||
367 | |||
368 | CPU14: cpu@100010100 { | ||
369 | device_type = "cpu"; | ||
370 | compatible = "arm,cortex-a57"; | ||
371 | reg = <0x1 0x10100>; | ||
372 | enable-method = "spin-table"; | ||
373 | cpu-release-addr = <0 0x20000000>; | ||
374 | }; | ||
375 | |||
376 | CPU15: cpu@100010101 { | ||
377 | device_type = "cpu"; | ||
378 | compatible = "arm,cortex-a57"; | ||
379 | reg = <0x1 0x10101>; | ||
380 | enable-method = "spin-table"; | ||
381 | cpu-release-addr = <0 0x20000000>; | ||
382 | }; | ||
383 | }; | ||
384 | |||
385 | Example 2 (ARM 32-bit, dual-cluster, 8-cpu system, no SMT): | ||
386 | |||
387 | cpus { | ||
388 | #size-cells = <0>; | ||
389 | #address-cells = <1>; | ||
390 | |||
391 | cpu-map { | ||
392 | cluster0 { | ||
393 | core0 { | ||
394 | cpu = <&CPU0>; | ||
395 | }; | ||
396 | core1 { | ||
397 | cpu = <&CPU1>; | ||
398 | }; | ||
399 | core2 { | ||
400 | cpu = <&CPU2>; | ||
401 | }; | ||
402 | core3 { | ||
403 | cpu = <&CPU3>; | ||
404 | }; | ||
405 | }; | ||
406 | |||
407 | cluster1 { | ||
408 | core0 { | ||
409 | cpu = <&CPU4>; | ||
410 | }; | ||
411 | core1 { | ||
412 | cpu = <&CPU5>; | ||
413 | }; | ||
414 | core2 { | ||
415 | cpu = <&CPU6>; | ||
416 | }; | ||
417 | core3 { | ||
418 | cpu = <&CPU7>; | ||
419 | }; | ||
420 | }; | ||
421 | }; | ||
422 | |||
423 | CPU0: cpu@0 { | ||
424 | device_type = "cpu"; | ||
425 | compatible = "arm,cortex-a15"; | ||
426 | reg = <0x0>; | ||
427 | }; | ||
428 | |||
429 | CPU1: cpu@1 { | ||
430 | device_type = "cpu"; | ||
431 | compatible = "arm,cortex-a15"; | ||
432 | reg = <0x1>; | ||
433 | }; | ||
434 | |||
435 | CPU2: cpu@2 { | ||
436 | device_type = "cpu"; | ||
437 | compatible = "arm,cortex-a15"; | ||
438 | reg = <0x2>; | ||
439 | }; | ||
440 | |||
441 | CPU3: cpu@3 { | ||
442 | device_type = "cpu"; | ||
443 | compatible = "arm,cortex-a15"; | ||
444 | reg = <0x3>; | ||
445 | }; | ||
446 | |||
447 | CPU4: cpu@100 { | ||
448 | device_type = "cpu"; | ||
449 | compatible = "arm,cortex-a7"; | ||
450 | reg = <0x100>; | ||
451 | }; | ||
452 | |||
453 | CPU5: cpu@101 { | ||
454 | device_type = "cpu"; | ||
455 | compatible = "arm,cortex-a7"; | ||
456 | reg = <0x101>; | ||
457 | }; | ||
458 | |||
459 | CPU6: cpu@102 { | ||
460 | device_type = "cpu"; | ||
461 | compatible = "arm,cortex-a7"; | ||
462 | reg = <0x102>; | ||
463 | }; | ||
464 | |||
465 | CPU7: cpu@103 { | ||
466 | device_type = "cpu"; | ||
467 | compatible = "arm,cortex-a7"; | ||
468 | reg = <0x103>; | ||
469 | }; | ||
470 | }; | ||
471 | |||
472 | =============================================================================== | ||
473 | [1] ARM Linux kernel documentation | ||
474 | Documentation/devicetree/bindings/arm/cpus.txt | ||