diff options
Diffstat (limited to 'arch/sparc/mm/init_64.c')
-rw-r--r-- | arch/sparc/mm/init_64.c | 68 |
1 files changed, 29 insertions, 39 deletions
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index f0434513df15..3fd8e18bed80 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -88,7 +88,7 @@ static void __init read_obp_memory(const char *property, | |||
88 | struct linux_prom64_registers *regs, | 88 | struct linux_prom64_registers *regs, |
89 | int *num_ents) | 89 | int *num_ents) |
90 | { | 90 | { |
91 | int node = prom_finddevice("/memory"); | 91 | phandle node = prom_finddevice("/memory"); |
92 | int prop_size = prom_getproplen(node, property); | 92 | int prop_size = prom_getproplen(node, property); |
93 | int ents, ret, i; | 93 | int ents, ret, i; |
94 | 94 | ||
@@ -785,8 +785,7 @@ static int find_node(unsigned long addr) | |||
785 | return -1; | 785 | return -1; |
786 | } | 786 | } |
787 | 787 | ||
788 | static unsigned long long nid_range(unsigned long long start, | 788 | u64 memblock_nid_range(u64 start, u64 end, int *nid) |
789 | unsigned long long end, int *nid) | ||
790 | { | 789 | { |
791 | *nid = find_node(start); | 790 | *nid = find_node(start); |
792 | start += PAGE_SIZE; | 791 | start += PAGE_SIZE; |
@@ -804,8 +803,7 @@ static unsigned long long nid_range(unsigned long long start, | |||
804 | return start; | 803 | return start; |
805 | } | 804 | } |
806 | #else | 805 | #else |
807 | static unsigned long long nid_range(unsigned long long start, | 806 | u64 memblock_nid_range(u64 start, u64 end, int *nid) |
808 | unsigned long long end, int *nid) | ||
809 | { | 807 | { |
810 | *nid = 0; | 808 | *nid = 0; |
811 | return end; | 809 | return end; |
@@ -822,8 +820,7 @@ static void __init allocate_node_data(int nid) | |||
822 | struct pglist_data *p; | 820 | struct pglist_data *p; |
823 | 821 | ||
824 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 822 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
825 | paddr = memblock_alloc_nid(sizeof(struct pglist_data), | 823 | paddr = memblock_alloc_try_nid(sizeof(struct pglist_data), SMP_CACHE_BYTES, nid); |
826 | SMP_CACHE_BYTES, nid, nid_range); | ||
827 | if (!paddr) { | 824 | if (!paddr) { |
828 | prom_printf("Cannot allocate pglist_data for nid[%d]\n", nid); | 825 | prom_printf("Cannot allocate pglist_data for nid[%d]\n", nid); |
829 | prom_halt(); | 826 | prom_halt(); |
@@ -843,8 +840,7 @@ static void __init allocate_node_data(int nid) | |||
843 | if (p->node_spanned_pages) { | 840 | if (p->node_spanned_pages) { |
844 | num_pages = bootmem_bootmap_pages(p->node_spanned_pages); | 841 | num_pages = bootmem_bootmap_pages(p->node_spanned_pages); |
845 | 842 | ||
846 | paddr = memblock_alloc_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid, | 843 | paddr = memblock_alloc_try_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid); |
847 | nid_range); | ||
848 | if (!paddr) { | 844 | if (!paddr) { |
849 | prom_printf("Cannot allocate bootmap for nid[%d]\n", | 845 | prom_printf("Cannot allocate bootmap for nid[%d]\n", |
850 | nid); | 846 | nid); |
@@ -866,7 +862,7 @@ static void init_node_masks_nonnuma(void) | |||
866 | for (i = 0; i < NR_CPUS; i++) | 862 | for (i = 0; i < NR_CPUS; i++) |
867 | numa_cpu_lookup_table[i] = 0; | 863 | numa_cpu_lookup_table[i] = 0; |
868 | 864 | ||
869 | numa_cpumask_lookup_table[0] = CPU_MASK_ALL; | 865 | cpumask_setall(&numa_cpumask_lookup_table[0]); |
870 | } | 866 | } |
871 | 867 | ||
872 | #ifdef CONFIG_NEED_MULTIPLE_NODES | 868 | #ifdef CONFIG_NEED_MULTIPLE_NODES |
@@ -972,19 +968,19 @@ int of_node_to_nid(struct device_node *dp) | |||
972 | 968 | ||
973 | static void __init add_node_ranges(void) | 969 | static void __init add_node_ranges(void) |
974 | { | 970 | { |
975 | int i; | 971 | struct memblock_region *reg; |
976 | 972 | ||
977 | for (i = 0; i < memblock.memory.cnt; i++) { | 973 | for_each_memblock(memory, reg) { |
978 | unsigned long size = memblock_size_bytes(&memblock.memory, i); | 974 | unsigned long size = reg->size; |
979 | unsigned long start, end; | 975 | unsigned long start, end; |
980 | 976 | ||
981 | start = memblock.memory.region[i].base; | 977 | start = reg->base; |
982 | end = start + size; | 978 | end = start + size; |
983 | while (start < end) { | 979 | while (start < end) { |
984 | unsigned long this_end; | 980 | unsigned long this_end; |
985 | int nid; | 981 | int nid; |
986 | 982 | ||
987 | this_end = nid_range(start, end, &nid); | 983 | this_end = memblock_nid_range(start, end, &nid); |
988 | 984 | ||
989 | numadbg("Adding active range nid[%d] " | 985 | numadbg("Adding active range nid[%d] " |
990 | "start[%lx] end[%lx]\n", | 986 | "start[%lx] end[%lx]\n", |
@@ -1084,7 +1080,7 @@ static void __init numa_parse_mdesc_group_cpus(struct mdesc_handle *md, | |||
1084 | { | 1080 | { |
1085 | u64 arc; | 1081 | u64 arc; |
1086 | 1082 | ||
1087 | cpus_clear(*mask); | 1083 | cpumask_clear(mask); |
1088 | 1084 | ||
1089 | mdesc_for_each_arc(arc, md, grp, MDESC_ARC_TYPE_BACK) { | 1085 | mdesc_for_each_arc(arc, md, grp, MDESC_ARC_TYPE_BACK) { |
1090 | u64 target = mdesc_arc_target(md, arc); | 1086 | u64 target = mdesc_arc_target(md, arc); |
@@ -1095,7 +1091,7 @@ static void __init numa_parse_mdesc_group_cpus(struct mdesc_handle *md, | |||
1095 | continue; | 1091 | continue; |
1096 | id = mdesc_get_property(md, target, "id", NULL); | 1092 | id = mdesc_get_property(md, target, "id", NULL); |
1097 | if (*id < nr_cpu_ids) | 1093 | if (*id < nr_cpu_ids) |
1098 | cpu_set(*id, *mask); | 1094 | cpumask_set_cpu(*id, mask); |
1099 | } | 1095 | } |
1100 | } | 1096 | } |
1101 | 1097 | ||
@@ -1157,13 +1153,13 @@ static int __init numa_parse_mdesc_group(struct mdesc_handle *md, u64 grp, | |||
1157 | 1153 | ||
1158 | numa_parse_mdesc_group_cpus(md, grp, &mask); | 1154 | numa_parse_mdesc_group_cpus(md, grp, &mask); |
1159 | 1155 | ||
1160 | for_each_cpu_mask(cpu, mask) | 1156 | for_each_cpu(cpu, &mask) |
1161 | numa_cpu_lookup_table[cpu] = index; | 1157 | numa_cpu_lookup_table[cpu] = index; |
1162 | numa_cpumask_lookup_table[index] = mask; | 1158 | cpumask_copy(&numa_cpumask_lookup_table[index], &mask); |
1163 | 1159 | ||
1164 | if (numa_debug) { | 1160 | if (numa_debug) { |
1165 | printk(KERN_INFO "NUMA GROUP[%d]: cpus [ ", index); | 1161 | printk(KERN_INFO "NUMA GROUP[%d]: cpus [ ", index); |
1166 | for_each_cpu_mask(cpu, mask) | 1162 | for_each_cpu(cpu, &mask) |
1167 | printk("%d ", cpu); | 1163 | printk("%d ", cpu); |
1168 | printk("]\n"); | 1164 | printk("]\n"); |
1169 | } | 1165 | } |
@@ -1222,7 +1218,7 @@ static int __init numa_parse_jbus(void) | |||
1222 | index = 0; | 1218 | index = 0; |
1223 | for_each_present_cpu(cpu) { | 1219 | for_each_present_cpu(cpu) { |
1224 | numa_cpu_lookup_table[cpu] = index; | 1220 | numa_cpu_lookup_table[cpu] = index; |
1225 | numa_cpumask_lookup_table[index] = cpumask_of_cpu(cpu); | 1221 | cpumask_copy(&numa_cpumask_lookup_table[index], cpumask_of(cpu)); |
1226 | node_masks[index].mask = ~((1UL << 36UL) - 1UL); | 1222 | node_masks[index].mask = ~((1UL << 36UL) - 1UL); |
1227 | node_masks[index].val = cpu << 36UL; | 1223 | node_masks[index].val = cpu << 36UL; |
1228 | 1224 | ||
@@ -1281,7 +1277,7 @@ static void __init bootmem_init_nonnuma(void) | |||
1281 | { | 1277 | { |
1282 | unsigned long top_of_ram = memblock_end_of_DRAM(); | 1278 | unsigned long top_of_ram = memblock_end_of_DRAM(); |
1283 | unsigned long total_ram = memblock_phys_mem_size(); | 1279 | unsigned long total_ram = memblock_phys_mem_size(); |
1284 | unsigned int i; | 1280 | struct memblock_region *reg; |
1285 | 1281 | ||
1286 | numadbg("bootmem_init_nonnuma()\n"); | 1282 | numadbg("bootmem_init_nonnuma()\n"); |
1287 | 1283 | ||
@@ -1292,15 +1288,14 @@ static void __init bootmem_init_nonnuma(void) | |||
1292 | 1288 | ||
1293 | init_node_masks_nonnuma(); | 1289 | init_node_masks_nonnuma(); |
1294 | 1290 | ||
1295 | for (i = 0; i < memblock.memory.cnt; i++) { | 1291 | for_each_memblock(memory, reg) { |
1296 | unsigned long size = memblock_size_bytes(&memblock.memory, i); | ||
1297 | unsigned long start_pfn, end_pfn; | 1292 | unsigned long start_pfn, end_pfn; |
1298 | 1293 | ||
1299 | if (!size) | 1294 | if (!reg->size) |
1300 | continue; | 1295 | continue; |
1301 | 1296 | ||
1302 | start_pfn = memblock.memory.region[i].base >> PAGE_SHIFT; | 1297 | start_pfn = memblock_region_memory_base_pfn(reg); |
1303 | end_pfn = start_pfn + memblock_size_pages(&memblock.memory, i); | 1298 | end_pfn = memblock_region_memory_end_pfn(reg); |
1304 | add_active_range(0, start_pfn, end_pfn); | 1299 | add_active_range(0, start_pfn, end_pfn); |
1305 | } | 1300 | } |
1306 | 1301 | ||
@@ -1318,7 +1313,7 @@ static void __init reserve_range_in_node(int nid, unsigned long start, | |||
1318 | unsigned long this_end; | 1313 | unsigned long this_end; |
1319 | int n; | 1314 | int n; |
1320 | 1315 | ||
1321 | this_end = nid_range(start, end, &n); | 1316 | this_end = memblock_nid_range(start, end, &n); |
1322 | if (n == nid) { | 1317 | if (n == nid) { |
1323 | numadbg(" MATCH reserving range [%lx:%lx]\n", | 1318 | numadbg(" MATCH reserving range [%lx:%lx]\n", |
1324 | start, this_end); | 1319 | start, this_end); |
@@ -1334,17 +1329,12 @@ static void __init reserve_range_in_node(int nid, unsigned long start, | |||
1334 | 1329 | ||
1335 | static void __init trim_reserved_in_node(int nid) | 1330 | static void __init trim_reserved_in_node(int nid) |
1336 | { | 1331 | { |
1337 | int i; | 1332 | struct memblock_region *reg; |
1338 | 1333 | ||
1339 | numadbg(" trim_reserved_in_node(%d)\n", nid); | 1334 | numadbg(" trim_reserved_in_node(%d)\n", nid); |
1340 | 1335 | ||
1341 | for (i = 0; i < memblock.reserved.cnt; i++) { | 1336 | for_each_memblock(reserved, reg) |
1342 | unsigned long start = memblock.reserved.region[i].base; | 1337 | reserve_range_in_node(nid, reg->base, reg->base + reg->size); |
1343 | unsigned long size = memblock_size_bytes(&memblock.reserved, i); | ||
1344 | unsigned long end = start + size; | ||
1345 | |||
1346 | reserve_range_in_node(nid, start, end); | ||
1347 | } | ||
1348 | } | 1338 | } |
1349 | 1339 | ||
1350 | static void __init bootmem_init_one_node(int nid) | 1340 | static void __init bootmem_init_one_node(int nid) |
@@ -1635,7 +1625,7 @@ static void __init sun4v_ktsb_init(void) | |||
1635 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; | 1625 | ktsb_descr[0].pgsz_idx = HV_PGSZ_IDX_4MB; |
1636 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; | 1626 | ktsb_descr[0].pgsz_mask = HV_PGSZ_MASK_4MB; |
1637 | break; | 1627 | break; |
1638 | }; | 1628 | } |
1639 | 1629 | ||
1640 | ktsb_descr[0].assoc = 1; | 1630 | ktsb_descr[0].assoc = 1; |
1641 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; | 1631 | ktsb_descr[0].num_ttes = KERNEL_TSB_NENTRIES; |
@@ -2276,7 +2266,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
2276 | return _PAGE_SZ512K_4V; | 2266 | return _PAGE_SZ512K_4V; |
2277 | case 4 * 1024 * 1024: | 2267 | case 4 * 1024 * 1024: |
2278 | return _PAGE_SZ4MB_4V; | 2268 | return _PAGE_SZ4MB_4V; |
2279 | }; | 2269 | } |
2280 | } else { | 2270 | } else { |
2281 | switch (sz) { | 2271 | switch (sz) { |
2282 | case 8 * 1024: | 2272 | case 8 * 1024: |
@@ -2288,7 +2278,7 @@ unsigned long pte_sz_bits(unsigned long sz) | |||
2288 | return _PAGE_SZ512K_4U; | 2278 | return _PAGE_SZ512K_4U; |
2289 | case 4 * 1024 * 1024: | 2279 | case 4 * 1024 * 1024: |
2290 | return _PAGE_SZ4MB_4U; | 2280 | return _PAGE_SZ4MB_4U; |
2291 | }; | 2281 | } |
2292 | } | 2282 | } |
2293 | } | 2283 | } |
2294 | 2284 | ||