18c2ecf20Sopenharmony_ci============================================================================== 28c2ecf20Sopenharmony_ciNUMA binding description. 38c2ecf20Sopenharmony_ci============================================================================== 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci============================================================================== 68c2ecf20Sopenharmony_ci1 - Introduction 78c2ecf20Sopenharmony_ci============================================================================== 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ciSystems employing a Non Uniform Memory Access (NUMA) architecture contain 108c2ecf20Sopenharmony_cicollections of hardware resources including processors, memory, and I/O buses, 118c2ecf20Sopenharmony_cithat comprise what is commonly known as a NUMA node. 128c2ecf20Sopenharmony_ciProcessor accesses to memory within the local NUMA node is generally faster 138c2ecf20Sopenharmony_cithan processor accesses to memory outside of the local NUMA node. 148c2ecf20Sopenharmony_ciDT defines interfaces that allow the platform to convey NUMA node 158c2ecf20Sopenharmony_citopology information to OS. 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci============================================================================== 188c2ecf20Sopenharmony_ci2 - numa-node-id 198c2ecf20Sopenharmony_ci============================================================================== 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciFor the purpose of identification, each NUMA node is associated with a unique 228c2ecf20Sopenharmony_citoken known as a node id. For the purpose of this binding 238c2ecf20Sopenharmony_cia node id is a 32-bit integer. 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ciA device node is associated with a NUMA node by the presence of a 268c2ecf20Sopenharmony_cinuma-node-id property which contains the node id of the device. 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ciExample: 298c2ecf20Sopenharmony_ci /* numa node 0 */ 308c2ecf20Sopenharmony_ci numa-node-id = <0>; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci /* numa node 1 */ 338c2ecf20Sopenharmony_ci numa-node-id = <1>; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci============================================================================== 368c2ecf20Sopenharmony_ci3 - distance-map 378c2ecf20Sopenharmony_ci============================================================================== 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ciThe optional device tree node distance-map describes the relative 408c2ecf20Sopenharmony_cidistance (memory latency) between all numa nodes. 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci- compatible : Should at least contain "numa-distance-map-v1". 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci- distance-matrix 458c2ecf20Sopenharmony_ci This property defines a matrix to describe the relative distances 468c2ecf20Sopenharmony_ci between all numa nodes. 478c2ecf20Sopenharmony_ci It is represented as a list of node pairs and their relative distance. 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci Note: 508c2ecf20Sopenharmony_ci 1. Each entry represents distance from first node to second node. 518c2ecf20Sopenharmony_ci The distances are equal in either direction. 528c2ecf20Sopenharmony_ci 2. The distance from a node to self (local distance) is represented 538c2ecf20Sopenharmony_ci with value 10 and all internode distance should be represented with 548c2ecf20Sopenharmony_ci a value greater than 10. 558c2ecf20Sopenharmony_ci 3. distance-matrix should have entries in lexicographical ascending 568c2ecf20Sopenharmony_ci order of nodes. 578c2ecf20Sopenharmony_ci 4. There must be only one device node distance-map which must 588c2ecf20Sopenharmony_ci reside in the root node. 598c2ecf20Sopenharmony_ci 5. If the distance-map node is not present, a default 608c2ecf20Sopenharmony_ci distance-matrix is used. 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ciExample: 638c2ecf20Sopenharmony_ci 4 nodes connected in mesh/ring topology as below, 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci 0_______20______1 668c2ecf20Sopenharmony_ci | | 678c2ecf20Sopenharmony_ci | | 688c2ecf20Sopenharmony_ci 20 20 698c2ecf20Sopenharmony_ci | | 708c2ecf20Sopenharmony_ci | | 718c2ecf20Sopenharmony_ci |_______________| 728c2ecf20Sopenharmony_ci 3 20 2 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci if relative distance for each hop is 20, 758c2ecf20Sopenharmony_ci then internode distance would be, 768c2ecf20Sopenharmony_ci 0 -> 1 = 20 778c2ecf20Sopenharmony_ci 1 -> 2 = 20 788c2ecf20Sopenharmony_ci 2 -> 3 = 20 798c2ecf20Sopenharmony_ci 3 -> 0 = 20 808c2ecf20Sopenharmony_ci 0 -> 2 = 40 818c2ecf20Sopenharmony_ci 1 -> 3 = 40 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci and dt presentation for this distance matrix is, 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci distance-map { 868c2ecf20Sopenharmony_ci compatible = "numa-distance-map-v1"; 878c2ecf20Sopenharmony_ci distance-matrix = <0 0 10>, 888c2ecf20Sopenharmony_ci <0 1 20>, 898c2ecf20Sopenharmony_ci <0 2 40>, 908c2ecf20Sopenharmony_ci <0 3 20>, 918c2ecf20Sopenharmony_ci <1 0 20>, 928c2ecf20Sopenharmony_ci <1 1 10>, 938c2ecf20Sopenharmony_ci <1 2 20>, 948c2ecf20Sopenharmony_ci <1 3 40>, 958c2ecf20Sopenharmony_ci <2 0 40>, 968c2ecf20Sopenharmony_ci <2 1 20>, 978c2ecf20Sopenharmony_ci <2 2 10>, 988c2ecf20Sopenharmony_ci <2 3 20>, 998c2ecf20Sopenharmony_ci <3 0 20>, 1008c2ecf20Sopenharmony_ci <3 1 40>, 1018c2ecf20Sopenharmony_ci <3 2 20>, 1028c2ecf20Sopenharmony_ci <3 3 10>; 1038c2ecf20Sopenharmony_ci }; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci============================================================================== 1068c2ecf20Sopenharmony_ci4 - Example dts 1078c2ecf20Sopenharmony_ci============================================================================== 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ciDual socket system consists of 2 boards connected through ccn bus and 1108c2ecf20Sopenharmony_cieach board having one socket/soc of 8 cpus, memory and pci bus. 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci memory@c00000 { 1138c2ecf20Sopenharmony_ci device_type = "memory"; 1148c2ecf20Sopenharmony_ci reg = <0x0 0xc00000 0x0 0x80000000>; 1158c2ecf20Sopenharmony_ci /* node 0 */ 1168c2ecf20Sopenharmony_ci numa-node-id = <0>; 1178c2ecf20Sopenharmony_ci }; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_ci memory@10000000000 { 1208c2ecf20Sopenharmony_ci device_type = "memory"; 1218c2ecf20Sopenharmony_ci reg = <0x100 0x0 0x0 0x80000000>; 1228c2ecf20Sopenharmony_ci /* node 1 */ 1238c2ecf20Sopenharmony_ci numa-node-id = <1>; 1248c2ecf20Sopenharmony_ci }; 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci cpus { 1278c2ecf20Sopenharmony_ci #address-cells = <2>; 1288c2ecf20Sopenharmony_ci #size-cells = <0>; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci cpu@0 { 1318c2ecf20Sopenharmony_ci device_type = "cpu"; 1328c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1338c2ecf20Sopenharmony_ci reg = <0x0 0x0>; 1348c2ecf20Sopenharmony_ci enable-method = "psci"; 1358c2ecf20Sopenharmony_ci /* node 0 */ 1368c2ecf20Sopenharmony_ci numa-node-id = <0>; 1378c2ecf20Sopenharmony_ci }; 1388c2ecf20Sopenharmony_ci cpu@1 { 1398c2ecf20Sopenharmony_ci device_type = "cpu"; 1408c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1418c2ecf20Sopenharmony_ci reg = <0x0 0x1>; 1428c2ecf20Sopenharmony_ci enable-method = "psci"; 1438c2ecf20Sopenharmony_ci numa-node-id = <0>; 1448c2ecf20Sopenharmony_ci }; 1458c2ecf20Sopenharmony_ci cpu@2 { 1468c2ecf20Sopenharmony_ci device_type = "cpu"; 1478c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1488c2ecf20Sopenharmony_ci reg = <0x0 0x2>; 1498c2ecf20Sopenharmony_ci enable-method = "psci"; 1508c2ecf20Sopenharmony_ci numa-node-id = <0>; 1518c2ecf20Sopenharmony_ci }; 1528c2ecf20Sopenharmony_ci cpu@3 { 1538c2ecf20Sopenharmony_ci device_type = "cpu"; 1548c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1558c2ecf20Sopenharmony_ci reg = <0x0 0x3>; 1568c2ecf20Sopenharmony_ci enable-method = "psci"; 1578c2ecf20Sopenharmony_ci numa-node-id = <0>; 1588c2ecf20Sopenharmony_ci }; 1598c2ecf20Sopenharmony_ci cpu@4 { 1608c2ecf20Sopenharmony_ci device_type = "cpu"; 1618c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1628c2ecf20Sopenharmony_ci reg = <0x0 0x4>; 1638c2ecf20Sopenharmony_ci enable-method = "psci"; 1648c2ecf20Sopenharmony_ci numa-node-id = <0>; 1658c2ecf20Sopenharmony_ci }; 1668c2ecf20Sopenharmony_ci cpu@5 { 1678c2ecf20Sopenharmony_ci device_type = "cpu"; 1688c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1698c2ecf20Sopenharmony_ci reg = <0x0 0x5>; 1708c2ecf20Sopenharmony_ci enable-method = "psci"; 1718c2ecf20Sopenharmony_ci numa-node-id = <0>; 1728c2ecf20Sopenharmony_ci }; 1738c2ecf20Sopenharmony_ci cpu@6 { 1748c2ecf20Sopenharmony_ci device_type = "cpu"; 1758c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1768c2ecf20Sopenharmony_ci reg = <0x0 0x6>; 1778c2ecf20Sopenharmony_ci enable-method = "psci"; 1788c2ecf20Sopenharmony_ci numa-node-id = <0>; 1798c2ecf20Sopenharmony_ci }; 1808c2ecf20Sopenharmony_ci cpu@7 { 1818c2ecf20Sopenharmony_ci device_type = "cpu"; 1828c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1838c2ecf20Sopenharmony_ci reg = <0x0 0x7>; 1848c2ecf20Sopenharmony_ci enable-method = "psci"; 1858c2ecf20Sopenharmony_ci numa-node-id = <0>; 1868c2ecf20Sopenharmony_ci }; 1878c2ecf20Sopenharmony_ci cpu@8 { 1888c2ecf20Sopenharmony_ci device_type = "cpu"; 1898c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1908c2ecf20Sopenharmony_ci reg = <0x0 0x8>; 1918c2ecf20Sopenharmony_ci enable-method = "psci"; 1928c2ecf20Sopenharmony_ci /* node 1 */ 1938c2ecf20Sopenharmony_ci numa-node-id = <1>; 1948c2ecf20Sopenharmony_ci }; 1958c2ecf20Sopenharmony_ci cpu@9 { 1968c2ecf20Sopenharmony_ci device_type = "cpu"; 1978c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 1988c2ecf20Sopenharmony_ci reg = <0x0 0x9>; 1998c2ecf20Sopenharmony_ci enable-method = "psci"; 2008c2ecf20Sopenharmony_ci numa-node-id = <1>; 2018c2ecf20Sopenharmony_ci }; 2028c2ecf20Sopenharmony_ci cpu@a { 2038c2ecf20Sopenharmony_ci device_type = "cpu"; 2048c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2058c2ecf20Sopenharmony_ci reg = <0x0 0xa>; 2068c2ecf20Sopenharmony_ci enable-method = "psci"; 2078c2ecf20Sopenharmony_ci numa-node-id = <1>; 2088c2ecf20Sopenharmony_ci }; 2098c2ecf20Sopenharmony_ci cpu@b { 2108c2ecf20Sopenharmony_ci device_type = "cpu"; 2118c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2128c2ecf20Sopenharmony_ci reg = <0x0 0xb>; 2138c2ecf20Sopenharmony_ci enable-method = "psci"; 2148c2ecf20Sopenharmony_ci numa-node-id = <1>; 2158c2ecf20Sopenharmony_ci }; 2168c2ecf20Sopenharmony_ci cpu@c { 2178c2ecf20Sopenharmony_ci device_type = "cpu"; 2188c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2198c2ecf20Sopenharmony_ci reg = <0x0 0xc>; 2208c2ecf20Sopenharmony_ci enable-method = "psci"; 2218c2ecf20Sopenharmony_ci numa-node-id = <1>; 2228c2ecf20Sopenharmony_ci }; 2238c2ecf20Sopenharmony_ci cpu@d { 2248c2ecf20Sopenharmony_ci device_type = "cpu"; 2258c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2268c2ecf20Sopenharmony_ci reg = <0x0 0xd>; 2278c2ecf20Sopenharmony_ci enable-method = "psci"; 2288c2ecf20Sopenharmony_ci numa-node-id = <1>; 2298c2ecf20Sopenharmony_ci }; 2308c2ecf20Sopenharmony_ci cpu@e { 2318c2ecf20Sopenharmony_ci device_type = "cpu"; 2328c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2338c2ecf20Sopenharmony_ci reg = <0x0 0xe>; 2348c2ecf20Sopenharmony_ci enable-method = "psci"; 2358c2ecf20Sopenharmony_ci numa-node-id = <1>; 2368c2ecf20Sopenharmony_ci }; 2378c2ecf20Sopenharmony_ci cpu@f { 2388c2ecf20Sopenharmony_ci device_type = "cpu"; 2398c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2408c2ecf20Sopenharmony_ci reg = <0x0 0xf>; 2418c2ecf20Sopenharmony_ci enable-method = "psci"; 2428c2ecf20Sopenharmony_ci numa-node-id = <1>; 2438c2ecf20Sopenharmony_ci }; 2448c2ecf20Sopenharmony_ci }; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci pcie0: pcie0@848000000000 { 2478c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2488c2ecf20Sopenharmony_ci device_type = "pci"; 2498c2ecf20Sopenharmony_ci bus-range = <0 255>; 2508c2ecf20Sopenharmony_ci #size-cells = <2>; 2518c2ecf20Sopenharmony_ci #address-cells = <3>; 2528c2ecf20Sopenharmony_ci reg = <0x8480 0x00000000 0 0x10000000>; /* Configuration space */ 2538c2ecf20Sopenharmony_ci ranges = <0x03000000 0x8010 0x00000000 0x8010 0x00000000 0x70 0x00000000>; 2548c2ecf20Sopenharmony_ci /* node 0 */ 2558c2ecf20Sopenharmony_ci numa-node-id = <0>; 2568c2ecf20Sopenharmony_ci }; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci pcie1: pcie1@948000000000 { 2598c2ecf20Sopenharmony_ci compatible = "arm,armv8"; 2608c2ecf20Sopenharmony_ci device_type = "pci"; 2618c2ecf20Sopenharmony_ci bus-range = <0 255>; 2628c2ecf20Sopenharmony_ci #size-cells = <2>; 2638c2ecf20Sopenharmony_ci #address-cells = <3>; 2648c2ecf20Sopenharmony_ci reg = <0x9480 0x00000000 0 0x10000000>; /* Configuration space */ 2658c2ecf20Sopenharmony_ci ranges = <0x03000000 0x9010 0x00000000 0x9010 0x00000000 0x70 0x00000000>; 2668c2ecf20Sopenharmony_ci /* node 1 */ 2678c2ecf20Sopenharmony_ci numa-node-id = <1>; 2688c2ecf20Sopenharmony_ci }; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci distance-map { 2718c2ecf20Sopenharmony_ci compatible = "numa-distance-map-v1"; 2728c2ecf20Sopenharmony_ci distance-matrix = <0 0 10>, 2738c2ecf20Sopenharmony_ci <0 1 20>, 2748c2ecf20Sopenharmony_ci <1 1 10>; 2758c2ecf20Sopenharmony_ci }; 276