aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/mm/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r--arch/sparc64/mm/init.c52
1 files changed, 49 insertions, 3 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index 1539a8362b6f..513993414747 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -42,6 +42,7 @@
42#include <asm/sections.h> 42#include <asm/sections.h>
43#include <asm/tsb.h> 43#include <asm/tsb.h>
44#include <asm/hypervisor.h> 44#include <asm/hypervisor.h>
45#include <asm/prom.h>
45 46
46extern void device_scan(void); 47extern void device_scan(void);
47 48
@@ -101,8 +102,6 @@ static void __init read_obp_memory(const char *property,
101 prom_halt(); 102 prom_halt();
102 } 103 }
103 104
104 *num_ents = ents;
105
106 /* Sanitize what we got from the firmware, by page aligning 105 /* Sanitize what we got from the firmware, by page aligning
107 * everything. 106 * everything.
108 */ 107 */
@@ -124,6 +123,25 @@ static void __init read_obp_memory(const char *property,
124 regs[i].phys_addr = base; 123 regs[i].phys_addr = base;
125 regs[i].reg_size = size; 124 regs[i].reg_size = size;
126 } 125 }
126
127 for (i = 0; i < ents; i++) {
128 if (regs[i].reg_size == 0UL) {
129 int j;
130
131 for (j = i; j < ents - 1; j++) {
132 regs[j].phys_addr =
133 regs[j+1].phys_addr;
134 regs[j].reg_size =
135 regs[j+1].reg_size;
136 }
137
138 ents--;
139 i--;
140 }
141 }
142
143 *num_ents = ents;
144
127 sort(regs, ents, sizeof(struct linux_prom64_registers), 145 sort(regs, ents, sizeof(struct linux_prom64_registers),
128 cmp_p64, NULL); 146 cmp_p64, NULL);
129} 147}
@@ -1339,6 +1357,8 @@ void __init paging_init(void)
1339 1357
1340 kernel_physical_mapping_init(); 1358 kernel_physical_mapping_init();
1341 1359
1360 prom_build_devicetree();
1361
1342 { 1362 {
1343 unsigned long zones_size[MAX_NR_ZONES]; 1363 unsigned long zones_size[MAX_NR_ZONES];
1344 unsigned long zholes_size[MAX_NR_ZONES]; 1364 unsigned long zholes_size[MAX_NR_ZONES];
@@ -1376,7 +1396,7 @@ static void __init taint_real_pages(void)
1376 while (old_start < old_end) { 1396 while (old_start < old_end) {
1377 int n; 1397 int n;
1378 1398
1379 for (n = 0; pavail_rescan_ents; n++) { 1399 for (n = 0; n < pavail_rescan_ents; n++) {
1380 unsigned long new_start, new_end; 1400 unsigned long new_start, new_end;
1381 1401
1382 new_start = pavail_rescan[n].phys_addr; 1402 new_start = pavail_rescan[n].phys_addr;
@@ -1398,6 +1418,32 @@ static void __init taint_real_pages(void)
1398 } 1418 }
1399} 1419}
1400 1420
1421int __init page_in_phys_avail(unsigned long paddr)
1422{
1423 int i;
1424
1425 paddr &= PAGE_MASK;
1426
1427 for (i = 0; i < pavail_rescan_ents; i++) {
1428 unsigned long start, end;
1429
1430 start = pavail_rescan[i].phys_addr;
1431 end = start + pavail_rescan[i].reg_size;
1432
1433 if (paddr >= start && paddr < end)
1434 return 1;
1435 }
1436 if (paddr >= kern_base && paddr < (kern_base + kern_size))
1437 return 1;
1438#ifdef CONFIG_BLK_DEV_INITRD
1439 if (paddr >= __pa(initrd_start) &&
1440 paddr < __pa(PAGE_ALIGN(initrd_end)))
1441 return 1;
1442#endif
1443
1444 return 0;
1445}
1446
1401void __init mem_init(void) 1447void __init mem_init(void)
1402{ 1448{
1403 unsigned long codepages, datapages, initpages; 1449 unsigned long codepages, datapages, initpages;