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