1 ===========================================
2 ARM topology binding description
3 ===========================================
5 ===========================================
7 ===========================================
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:
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.
19 The bottom hierarchy level sits at core or thread level depending on whether
20 symmetric multi-threading (SMT) is supported or not.
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.
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
31 The remainder of this document provides the topology bindings for ARM, based
32 on the Devicetree Specification, available from:
34 https://www.devicetree.org/specifications/
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
39 A topology description containing phandles to cpu nodes that are not compliant
40 with bindings standardized in [1] is therefore considered invalid.
42 ===========================================
44 ===========================================
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
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
57 Description: The cpu-map node is just a container node where its
58 subnodes describe the CPU topology.
60 Node name must be "cpu-map".
62 The cpu-map node's parent node must be the cpus node.
64 The cpu-map node's child nodes can be:
66 - one or more cluster nodes
68 Any other configuration is considered invalid.
70 The cpu-map node can only contain three types of child nodes:
76 whose bindings are described in paragraph 3.
78 The nodes describing the CPU topology (cluster/core/thread) can only
79 be defined within the cpu-map node and every core/thread in the system
80 must be defined within the topology. Any other configuration is
81 invalid and therefore must be ignored.
83 ===========================================
84 2.1 - cpu-map child nodes naming convention
85 ===========================================
87 cpu-map child nodes must follow a naming convention where the node name
88 must be "clusterN", "coreN", "threadN" depending on the node type (ie
89 cluster/core/thread) (where N = {0, 1, ...} is the node number; nodes which
90 are siblings within a single common parent node must be given a unique and
91 sequential N value, starting from 0).
92 cpu-map child nodes which do not share a common parent node can have the same
93 name (ie same number N as other cpu-map child nodes at different device tree
94 levels) since name uniqueness will be guaranteed by the device tree hierarchy.
96 ===========================================
97 3 - cluster/core/thread node bindings
98 ===========================================
100 Bindings for cluster/cpu/thread nodes are defined as follows:
104 Description: must be declared within a cpu-map node, one node
105 per cluster. A system can contain several layers of
106 clustering and cluster nodes can be contained in parent
109 The cluster node name must be "clusterN" as described in 2.1 above.
110 A cluster node can not be a leaf node.
112 A cluster node's child nodes must be:
114 - one or more cluster nodes; or
115 - one or more core nodes
117 Any other configuration is considered invalid.
121 Description: must be declared in a cluster node, one node per core in
122 the cluster. If the system does not support SMT, core
123 nodes are leaf nodes, otherwise they become containers of
126 The core node name must be "coreN" as described in 2.1 above.
128 A core node must be a leaf node if SMT is not supported.
130 Properties for core nodes that are leaf nodes:
134 Value type: <phandle>
135 Definition: a phandle to the cpu node that corresponds to the
138 If a core node is not a leaf node (CPUs supporting SMT) a core node's
141 - one or more thread nodes
143 Any other configuration is considered invalid.
147 Description: must be declared in a core node, one node per thread
148 in the core if the system supports SMT. Thread nodes are
149 always leaf nodes in the device tree.
151 The thread node name must be "threadN" as described in 2.1 above.
153 A thread node must be a leaf node.
155 A thread node must contain the following property:
159 Value type: <phandle>
160 Definition: a phandle to the cpu node that corresponds to
163 ===========================================
165 ===========================================
167 Example 1 (ARM 64-bit, 16-cpu system, two clusters of clusters):
171 #address-cells = <2>;
259 compatible = "arm,cortex-a57";
261 enable-method = "spin-table";
262 cpu-release-addr = <0 0x20000000>;
267 compatible = "arm,cortex-a57";
269 enable-method = "spin-table";
270 cpu-release-addr = <0 0x20000000>;
275 compatible = "arm,cortex-a57";
277 enable-method = "spin-table";
278 cpu-release-addr = <0 0x20000000>;
283 compatible = "arm,cortex-a57";
285 enable-method = "spin-table";
286 cpu-release-addr = <0 0x20000000>;
291 compatible = "arm,cortex-a57";
293 enable-method = "spin-table";
294 cpu-release-addr = <0 0x20000000>;
299 compatible = "arm,cortex-a57";
301 enable-method = "spin-table";
302 cpu-release-addr = <0 0x20000000>;
307 compatible = "arm,cortex-a57";
309 enable-method = "spin-table";
310 cpu-release-addr = <0 0x20000000>;
315 compatible = "arm,cortex-a57";
317 enable-method = "spin-table";
318 cpu-release-addr = <0 0x20000000>;
321 CPU8: cpu@100000000 {
323 compatible = "arm,cortex-a57";
325 enable-method = "spin-table";
326 cpu-release-addr = <0 0x20000000>;
329 CPU9: cpu@100000001 {
331 compatible = "arm,cortex-a57";
333 enable-method = "spin-table";
334 cpu-release-addr = <0 0x20000000>;
337 CPU10: cpu@100000100 {
339 compatible = "arm,cortex-a57";
341 enable-method = "spin-table";
342 cpu-release-addr = <0 0x20000000>;
345 CPU11: cpu@100000101 {
347 compatible = "arm,cortex-a57";
349 enable-method = "spin-table";
350 cpu-release-addr = <0 0x20000000>;
353 CPU12: cpu@100010000 {
355 compatible = "arm,cortex-a57";
357 enable-method = "spin-table";
358 cpu-release-addr = <0 0x20000000>;
361 CPU13: cpu@100010001 {
363 compatible = "arm,cortex-a57";
365 enable-method = "spin-table";
366 cpu-release-addr = <0 0x20000000>;
369 CPU14: cpu@100010100 {
371 compatible = "arm,cortex-a57";
373 enable-method = "spin-table";
374 cpu-release-addr = <0 0x20000000>;
377 CPU15: cpu@100010101 {
379 compatible = "arm,cortex-a57";
381 enable-method = "spin-table";
382 cpu-release-addr = <0 0x20000000>;
386 Example 2 (ARM 32-bit, dual-cluster, 8-cpu system, no SMT):
390 #address-cells = <1>;
426 compatible = "arm,cortex-a15";
432 compatible = "arm,cortex-a15";
438 compatible = "arm,cortex-a15";
444 compatible = "arm,cortex-a15";
450 compatible = "arm,cortex-a7";
456 compatible = "arm,cortex-a7";
462 compatible = "arm,cortex-a7";
468 compatible = "arm,cortex-a7";
473 ===============================================================================
474 [1] ARM Linux kernel documentation
475 Documentation/devicetree/bindings/arm/cpus.txt