| ============================================================================== | 
 | 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 - Empty memory nodes | 
 | ============================================================================== | 
 |  | 
 | Empty memory nodes, which no memory resides in, are allowed. There are no | 
 | device nodes for these empty memory nodes. However, the NUMA node IDs and | 
 | distance maps are still valid and memory may be added into them through | 
 | hotplug afterwards. | 
 |  | 
 | Example: | 
 |  | 
 | 	memory@0 { | 
 | 		device_type = "memory"; | 
 | 		reg = <0x0 0x0 0x0 0x80000000>; | 
 | 		numa-node-id = <0>; | 
 | 	}; | 
 |  | 
 | 	memory@80000000 { | 
 | 		device_type = "memory"; | 
 | 		reg = <0x0 0x80000000 0x0 0x80000000>; | 
 | 		numa-node-id = <1>; | 
 | 	}; | 
 |  | 
 | 	/* Empty memory node 2 and 3 */ | 
 | 	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>; | 
 | 	}; | 
 |  | 
 | ============================================================================== | 
 | 5 - 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>; | 
 | 	}; |