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