|  | ============================================================================== | 
|  | 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>; | 
|  | }; |