| 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 2 | |
| 3 | #include <linux/memblock.h> |
| 4 | #include <linux/printk.h> |
| 5 | #include <linux/numa.h> |
| 6 | #include <linux/numa_memblks.h> |
| 7 | |
| 8 | struct pglist_data *node_data[MAX_NUMNODES]; |
| 9 | EXPORT_SYMBOL(node_data); |
| 10 | |
| 11 | /* Allocate NODE_DATA for a node on the local memory */ |
| 12 | void __init alloc_node_data(int nid) |
| 13 | { |
| 14 | const size_t nd_size = roundup(sizeof(pg_data_t), SMP_CACHE_BYTES); |
| 15 | u64 nd_pa; |
| 16 | int tnid; |
| 17 | |
| 18 | /* Allocate node data. Try node-local memory and then any node. */ |
| 19 | nd_pa = memblock_phys_alloc_try_nid(size: nd_size, SMP_CACHE_BYTES, nid); |
| 20 | if (!nd_pa) |
| 21 | panic(fmt: "Cannot allocate %zu bytes for node %d data\n" , |
| 22 | nd_size, nid); |
| 23 | |
| 24 | /* report and initialize */ |
| 25 | pr_info("NODE_DATA(%d) allocated [mem %#010Lx-%#010Lx]\n" , nid, |
| 26 | nd_pa, nd_pa + nd_size - 1); |
| 27 | tnid = early_pfn_to_nid(pfn: nd_pa >> PAGE_SHIFT); |
| 28 | if (tnid != nid) |
| 29 | pr_info(" NODE_DATA(%d) on node %d\n" , nid, tnid); |
| 30 | |
| 31 | node_data[nid] = __va(nd_pa); |
| 32 | memset(NODE_DATA(nid), c: 0, n: sizeof(pg_data_t)); |
| 33 | } |
| 34 | |
| 35 | void __init alloc_offline_node_data(int nid) |
| 36 | { |
| 37 | pg_data_t *pgdat; |
| 38 | node_data[nid] = memblock_alloc_or_panic(sizeof(*pgdat), SMP_CACHE_BYTES); |
| 39 | } |
| 40 | |
| 41 | /* Stub functions: */ |
| 42 | |
| 43 | #ifndef memory_add_physaddr_to_nid |
| 44 | int memory_add_physaddr_to_nid(u64 start) |
| 45 | { |
| 46 | pr_info_once("Unknown online node for memory at 0x%llx, assuming node 0\n" , |
| 47 | start); |
| 48 | return 0; |
| 49 | } |
| 50 | EXPORT_SYMBOL_GPL(memory_add_physaddr_to_nid); |
| 51 | #endif |
| 52 | |
| 53 | #ifndef phys_to_target_node |
| 54 | int phys_to_target_node(u64 start) |
| 55 | { |
| 56 | pr_info_once("Unknown target node for memory at 0x%llx, assuming node 0\n" , |
| 57 | start); |
| 58 | return 0; |
| 59 | } |
| 60 | EXPORT_SYMBOL_GPL(phys_to_target_node); |
| 61 | #endif |
| 62 | |