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