276 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ==============================================================================
 | |
| NUMA binding description.
 | |
| ==============================================================================
 | |
| 
 | |
| ==============================================================================
 | |
| 1 - Introduction
 | |
| ==============================================================================
 | |
| 
 | |
| Systems employing a Non Uniform Memory Access (NUMA) architecture contain
 | |
| collections of hardware resources including processors, memory, and I/O buses,
 | |
| that comprise what is commonly known as a NUMA node.
 | |
| Processor accesses to memory within the local NUMA node is generally faster
 | |
| than processor accesses to memory outside of the local NUMA node.
 | |
| DT defines interfaces that allow the platform to convey NUMA node
 | |
| topology information to OS.
 | |
| 
 | |
| ==============================================================================
 | |
| 2 - numa-node-id
 | |
| ==============================================================================
 | |
| 
 | |
| For the purpose of identification, each NUMA node is associated with a unique
 | |
| token known as a node id. For the purpose of this binding
 | |
| a node id is a 32-bit integer.
 | |
| 
 | |
| A device node is associated with a NUMA node by the presence of a
 | |
| numa-node-id property which contains the node id of the device.
 | |
| 
 | |
| Example:
 | |
| 	/* numa node 0 */
 | |
| 	numa-node-id = <0>;
 | |
| 
 | |
| 	/* numa node 1 */
 | |
| 	numa-node-id = <1>;
 | |
| 
 | |
| ==============================================================================
 | |
| 3 - distance-map
 | |
| ==============================================================================
 | |
| 
 | |
| The optional device tree node distance-map describes the relative
 | |
| distance (memory latency) between all numa nodes.
 | |
| 
 | |
| - compatible : Should at least contain "numa-distance-map-v1".
 | |
| 
 | |
| - distance-matrix
 | |
|   This property defines a matrix to describe the relative distances
 | |
|   between all numa nodes.
 | |
|   It is represented as a list of node pairs and their relative distance.
 | |
| 
 | |
|   Note:
 | |
| 	1. Each entry represents distance from first node to second node.
 | |
| 	The distances are equal in either direction.
 | |
| 	2. The distance from a node to self (local distance) is represented
 | |
| 	with value 10 and all internode distance should be represented with
 | |
| 	a value greater than 10.
 | |
| 	3. distance-matrix should have entries in lexicographical ascending
 | |
| 	order of nodes.
 | |
| 	4. There must be only one device node distance-map which must
 | |
| 	reside in the root node.
 | |
| 	5. If the distance-map node is not present, a default
 | |
| 	distance-matrix is used.
 | |
| 
 | |
| Example:
 | |
| 	4 nodes connected in mesh/ring topology as below,
 | |
| 
 | |
| 		0_______20______1
 | |
| 		|               |
 | |
| 		|               |
 | |
| 		20             20
 | |
| 		|               |
 | |
| 		|               |
 | |
| 		|_______________|
 | |
| 		3       20      2
 | |
| 
 | |
| 	if relative distance for each hop is 20,
 | |
| 	then internode distance would be,
 | |
| 	      0 -> 1 = 20
 | |
| 	      1 -> 2 = 20
 | |
| 	      2 -> 3 = 20
 | |
| 	      3 -> 0 = 20
 | |
| 	      0 -> 2 = 40
 | |
| 	      1 -> 3 = 40
 | |
| 
 | |
|      and dt presentation for this distance matrix is,
 | |
| 
 | |
| 		distance-map {
 | |
| 			 compatible = "numa-distance-map-v1";
 | |
| 			 distance-matrix = <0 0  10>,
 | |
| 					   <0 1  20>,
 | |
| 					   <0 2  40>,
 | |
| 					   <0 3  20>,
 | |
| 					   <1 0  20>,
 | |
| 					   <1 1  10>,
 | |
| 					   <1 2  20>,
 | |
| 					   <1 3  40>,
 | |
| 					   <2 0  40>,
 | |
| 					   <2 1  20>,
 | |
| 					   <2 2  10>,
 | |
| 					   <2 3  20>,
 | |
| 					   <3 0  20>,
 | |
| 					   <3 1  40>,
 | |
| 					   <3 2  20>,
 | |
| 					   <3 3  10>;
 | |
| 		};
 | |
| 
 | |
| ==============================================================================
 | |
| 4 - Example dts
 | |
| ==============================================================================
 | |
| 
 | |
| Dual socket system consists of 2 boards connected through ccn bus and
 | |
| each board having one socket/soc of 8 cpus, memory and pci bus.
 | |
| 
 | |
| 	memory@c00000 {
 | |
| 		device_type = "memory";
 | |
| 		reg = <0x0 0xc00000 0x0 0x80000000>;
 | |
| 		/* node 0 */
 | |
| 		numa-node-id = <0>;
 | |
| 	};
 | |
| 
 | |
| 	memory@10000000000 {
 | |
| 		device_type = "memory";
 | |
| 		reg = <0x100 0x0 0x0 0x80000000>;
 | |
| 		/* node 1 */
 | |
| 		numa-node-id = <1>;
 | |
| 	};
 | |
| 
 | |
| 	cpus {
 | |
| 		#address-cells = <2>;
 | |
| 		#size-cells = <0>;
 | |
| 
 | |
| 		cpu@0 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x0>;
 | |
| 			enable-method = "psci";
 | |
| 			/* node 0 */
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@1 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x1>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@2 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x2>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@3 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x3>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@4 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x4>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@5 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x5>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@6 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x6>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@7 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x7>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <0>;
 | |
| 		};
 | |
| 		cpu@8 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x8>;
 | |
| 			enable-method = "psci";
 | |
| 			/* node 1 */
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@9 {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0x9>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@a {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xa>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@b {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xb>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@c {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xc>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@d {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xd>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@e {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xe>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 		cpu@f {
 | |
| 			device_type = "cpu";
 | |
| 			compatible =  "arm,armv8";
 | |
| 			reg = <0x0 0xf>;
 | |
| 			enable-method = "psci";
 | |
| 			numa-node-id = <1>;
 | |
| 		};
 | |
| 	};
 | |
| 
 | |
| 	pcie0: pcie0@848000000000 {
 | |
| 		compatible = "arm,armv8";
 | |
| 		device_type = "pci";
 | |
| 		bus-range = <0 255>;
 | |
| 		#size-cells = <2>;
 | |
| 		#address-cells = <3>;
 | |
| 		reg = <0x8480 0x00000000 0 0x10000000>;  /* Configuration space */
 | |
| 		ranges = <0x03000000 0x8010 0x00000000 0x8010 0x00000000 0x70 0x00000000>;
 | |
| 		/* node 0 */
 | |
| 		numa-node-id = <0>;
 | |
|         };
 | |
| 
 | |
| 	pcie1: pcie1@948000000000 {
 | |
| 		compatible = "arm,armv8";
 | |
| 		device_type = "pci";
 | |
| 		bus-range = <0 255>;
 | |
| 		#size-cells = <2>;
 | |
| 		#address-cells = <3>;
 | |
| 		reg = <0x9480 0x00000000 0 0x10000000>;  /* Configuration space */
 | |
| 		ranges = <0x03000000 0x9010 0x00000000 0x9010 0x00000000 0x70 0x00000000>;
 | |
| 		/* node 1 */
 | |
| 		numa-node-id = <1>;
 | |
|         };
 | |
| 
 | |
| 	distance-map {
 | |
| 		compatible = "numa-distance-map-v1";
 | |
| 		distance-matrix = <0 0 10>,
 | |
| 				  <0 1 20>,
 | |
| 				  <1 1 10>;
 | |
| 	};
 |