1==============================================================================
2NUMA binding description.
3==============================================================================
4
5==============================================================================
61 - Introduction
7==============================================================================
8
9Systems employing a Non Uniform Memory Access (NUMA) architecture contain
10collections of hardware resources including processors, memory, and I/O buses,
11that comprise what is commonly known as a NUMA node.
12Processor accesses to memory within the local NUMA node is generally faster
13than processor accesses to memory outside of the local NUMA node.
14DT defines interfaces that allow the platform to convey NUMA node
15topology information to OS.
16
17==============================================================================
182 - numa-node-id
19==============================================================================
20
21For the purpose of identification, each NUMA node is associated with a unique
22token known as a node id. For the purpose of this binding
23a node id is a 32-bit integer.
24
25A device node is associated with a NUMA node by the presence of a
26numa-node-id property which contains the node id of the device.
27
28Example:
29	/* numa node 0 */
30	numa-node-id = <0>;
31
32	/* numa node 1 */
33	numa-node-id = <1>;
34
35==============================================================================
363 - distance-map
37==============================================================================
38
39The optional device tree node distance-map describes the relative
40distance (memory latency) between all numa nodes.
41
42- compatible : Should at least contain "numa-distance-map-v1".
43
44- distance-matrix
45  This property defines a matrix to describe the relative distances
46  between all numa nodes.
47  It is represented as a list of node pairs and their relative distance.
48
49  Note:
50	1. Each entry represents distance from first node to second node.
51	The distances are equal in either direction.
52	2. The distance from a node to self (local distance) is represented
53	with value 10 and all internode distance should be represented with
54	a value greater than 10.
55	3. distance-matrix should have entries in lexicographical ascending
56	order of nodes.
57	4. There must be only one device node distance-map which must
58	reside in the root node.
59	5. If the distance-map node is not present, a default
60	distance-matrix is used.
61
62Example:
63	4 nodes connected in mesh/ring topology as below,
64
65		0_______20______1
66		|               |
67		|               |
68		20             20
69		|               |
70		|               |
71		|_______________|
72		3       20      2
73
74	if relative distance for each hop is 20,
75	then internode distance would be,
76	      0 -> 1 = 20
77	      1 -> 2 = 20
78	      2 -> 3 = 20
79	      3 -> 0 = 20
80	      0 -> 2 = 40
81	      1 -> 3 = 40
82
83     and dt presentation for this distance matrix is,
84
85		distance-map {
86			 compatible = "numa-distance-map-v1";
87			 distance-matrix = <0 0  10>,
88					   <0 1  20>,
89					   <0 2  40>,
90					   <0 3  20>,
91					   <1 0  20>,
92					   <1 1  10>,
93					   <1 2  20>,
94					   <1 3  40>,
95					   <2 0  40>,
96					   <2 1  20>,
97					   <2 2  10>,
98					   <2 3  20>,
99					   <3 0  20>,
100					   <3 1  40>,
101					   <3 2  20>,
102					   <3 3  10>;
103		};
104
105==============================================================================
1064 - Empty memory nodes
107==============================================================================
108
109Empty memory nodes, which no memory resides in, are allowed. There are no
110device nodes for these empty memory nodes. However, the NUMA node IDs and
111distance maps are still valid and memory may be added into them through
112hotplug afterwards.
113
114Example:
115
116	memory@0 {
117		device_type = "memory";
118		reg = <0x0 0x0 0x0 0x80000000>;
119		numa-node-id = <0>;
120	};
121
122	memory@80000000 {
123		device_type = "memory";
124		reg = <0x0 0x80000000 0x0 0x80000000>;
125		numa-node-id = <1>;
126	};
127
128	/* Empty memory node 2 and 3 */
129	distance-map {
130		compatible = "numa-distance-map-v1";
131		distance-matrix = <0 0  10>,
132				  <0 1  20>,
133				  <0 2  40>,
134				  <0 3  20>,
135				  <1 0  20>,
136				  <1 1  10>,
137				  <1 2  20>,
138				  <1 3  40>,
139				  <2 0  40>,
140				  <2 1  20>,
141				  <2 2  10>,
142				  <2 3  20>,
143				  <3 0  20>,
144				  <3 1  40>,
145				  <3 2  20>,
146				  <3 3  10>;
147	};
148
149==============================================================================
1505 - Example dts
151==============================================================================
152
153Dual socket system consists of 2 boards connected through ccn bus and
154each board having one socket/soc of 8 cpus, memory and pci bus.
155
156	memory@c00000 {
157		device_type = "memory";
158		reg = <0x0 0xc00000 0x0 0x80000000>;
159		/* node 0 */
160		numa-node-id = <0>;
161	};
162
163	memory@10000000000 {
164		device_type = "memory";
165		reg = <0x100 0x0 0x0 0x80000000>;
166		/* node 1 */
167		numa-node-id = <1>;
168	};
169
170	cpus {
171		#address-cells = <2>;
172		#size-cells = <0>;
173
174		cpu@0 {
175			device_type = "cpu";
176			compatible =  "arm,armv8";
177			reg = <0x0 0x0>;
178			enable-method = "psci";
179			/* node 0 */
180			numa-node-id = <0>;
181		};
182		cpu@1 {
183			device_type = "cpu";
184			compatible =  "arm,armv8";
185			reg = <0x0 0x1>;
186			enable-method = "psci";
187			numa-node-id = <0>;
188		};
189		cpu@2 {
190			device_type = "cpu";
191			compatible =  "arm,armv8";
192			reg = <0x0 0x2>;
193			enable-method = "psci";
194			numa-node-id = <0>;
195		};
196		cpu@3 {
197			device_type = "cpu";
198			compatible =  "arm,armv8";
199			reg = <0x0 0x3>;
200			enable-method = "psci";
201			numa-node-id = <0>;
202		};
203		cpu@4 {
204			device_type = "cpu";
205			compatible =  "arm,armv8";
206			reg = <0x0 0x4>;
207			enable-method = "psci";
208			numa-node-id = <0>;
209		};
210		cpu@5 {
211			device_type = "cpu";
212			compatible =  "arm,armv8";
213			reg = <0x0 0x5>;
214			enable-method = "psci";
215			numa-node-id = <0>;
216		};
217		cpu@6 {
218			device_type = "cpu";
219			compatible =  "arm,armv8";
220			reg = <0x0 0x6>;
221			enable-method = "psci";
222			numa-node-id = <0>;
223		};
224		cpu@7 {
225			device_type = "cpu";
226			compatible =  "arm,armv8";
227			reg = <0x0 0x7>;
228			enable-method = "psci";
229			numa-node-id = <0>;
230		};
231		cpu@8 {
232			device_type = "cpu";
233			compatible =  "arm,armv8";
234			reg = <0x0 0x8>;
235			enable-method = "psci";
236			/* node 1 */
237			numa-node-id = <1>;
238		};
239		cpu@9 {
240			device_type = "cpu";
241			compatible =  "arm,armv8";
242			reg = <0x0 0x9>;
243			enable-method = "psci";
244			numa-node-id = <1>;
245		};
246		cpu@a {
247			device_type = "cpu";
248			compatible =  "arm,armv8";
249			reg = <0x0 0xa>;
250			enable-method = "psci";
251			numa-node-id = <1>;
252		};
253		cpu@b {
254			device_type = "cpu";
255			compatible =  "arm,armv8";
256			reg = <0x0 0xb>;
257			enable-method = "psci";
258			numa-node-id = <1>;
259		};
260		cpu@c {
261			device_type = "cpu";
262			compatible =  "arm,armv8";
263			reg = <0x0 0xc>;
264			enable-method = "psci";
265			numa-node-id = <1>;
266		};
267		cpu@d {
268			device_type = "cpu";
269			compatible =  "arm,armv8";
270			reg = <0x0 0xd>;
271			enable-method = "psci";
272			numa-node-id = <1>;
273		};
274		cpu@e {
275			device_type = "cpu";
276			compatible =  "arm,armv8";
277			reg = <0x0 0xe>;
278			enable-method = "psci";
279			numa-node-id = <1>;
280		};
281		cpu@f {
282			device_type = "cpu";
283			compatible =  "arm,armv8";
284			reg = <0x0 0xf>;
285			enable-method = "psci";
286			numa-node-id = <1>;
287		};
288	};
289
290	pcie0: pcie0@848000000000 {
291		compatible = "arm,armv8";
292		device_type = "pci";
293		bus-range = <0 255>;
294		#size-cells = <2>;
295		#address-cells = <3>;
296		reg = <0x8480 0x00000000 0 0x10000000>;  /* Configuration space */
297		ranges = <0x03000000 0x8010 0x00000000 0x8010 0x00000000 0x70 0x00000000>;
298		/* node 0 */
299		numa-node-id = <0>;
300        };
301
302	pcie1: pcie1@948000000000 {
303		compatible = "arm,armv8";
304		device_type = "pci";
305		bus-range = <0 255>;
306		#size-cells = <2>;
307		#address-cells = <3>;
308		reg = <0x9480 0x00000000 0 0x10000000>;  /* Configuration space */
309		ranges = <0x03000000 0x9010 0x00000000 0x9010 0x00000000 0x70 0x00000000>;
310		/* node 1 */
311		numa-node-id = <1>;
312        };
313
314	distance-map {
315		compatible = "numa-distance-map-v1";
316		distance-matrix = <0 0 10>,
317				  <0 1 20>,
318				  <1 1 10>;
319	};
320