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