prom.c (0962e8004e97409072bb6caee7b3ba948a5fb93a) | prom.c (c039e3a8ddd52139d0f81711ecd757772f868b22) |
---|---|
1/* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com --- 545 unchanged lines hidden (view full) --- 554 unsigned long end) 555{ 556 initrd_start = (unsigned long)__va(start); 557 initrd_end = (unsigned long)__va(end); 558 initrd_below_start_ok = 1; 559} 560#endif 561 | 1/* 2 * Procedures for creating, accessing and interpreting the device tree. 3 * 4 * Paul Mackerras August 1996. 5 * Copyright (C) 1996-2005 Paul Mackerras. 6 * 7 * Adapted for 64bit PowerPC by Dave Engebretsen and Peter Bergner. 8 * {engebret|bergner}@us.ibm.com --- 545 unchanged lines hidden (view full) --- 554 unsigned long end) 555{ 556 initrd_start = (unsigned long)__va(start); 557 initrd_end = (unsigned long)__va(end); 558 initrd_below_start_ok = 1; 559} 560#endif 561 |
562static bool __init early_reserve_mem_dt(void) | 562static void __init early_reserve_mem_dt(void) |
563{ 564 unsigned long i, len, dt_root; 565 const __be32 *prop; 566 567 dt_root = of_get_flat_dt_root(); 568 569 prop = of_get_flat_dt_prop(dt_root, "reserved-ranges", &len); 570 571 if (!prop) | 563{ 564 unsigned long i, len, dt_root; 565 const __be32 *prop; 566 567 dt_root = of_get_flat_dt_root(); 568 569 prop = of_get_flat_dt_prop(dt_root, "reserved-ranges", &len); 570 571 if (!prop) |
572 return false; | 572 return; |
573 | 573 |
574 DBG("Found new-style reserved-ranges\n"); 575 |
|
574 /* Each reserved range is an (address,size) pair, 2 cells each, 575 * totalling 4 cells per range. */ 576 for (i = 0; i < len / (sizeof(*prop) * 4); i++) { 577 u64 base, size; 578 579 base = of_read_number(prop + (i * 4) + 0, 2); 580 size = of_read_number(prop + (i * 4) + 2, 2); 581 | 576 /* Each reserved range is an (address,size) pair, 2 cells each, 577 * totalling 4 cells per range. */ 578 for (i = 0; i < len / (sizeof(*prop) * 4); i++) { 579 u64 base, size; 580 581 base = of_read_number(prop + (i * 4) + 0, 2); 582 size = of_read_number(prop + (i * 4) + 2, 2); 583 |
582 if (size) | 584 if (size) { 585 DBG("reserving: %llx -> %llx\n", base, size); |
583 memblock_reserve(base, size); | 586 memblock_reserve(base, size); |
587 } |
|
584 } | 588 } |
585 586 return true; | |
587} 588 589static void __init early_reserve_mem(void) 590{ 591 u64 base, size; 592 u64 *reserve_map; 593 unsigned long self_base; 594 unsigned long self_size; 595 596 reserve_map = (u64 *)(((unsigned long)initial_boot_params) + 597 initial_boot_params->off_mem_rsvmap); 598 599 /* before we do anything, lets reserve the dt blob */ 600 self_base = __pa((unsigned long)initial_boot_params); 601 self_size = initial_boot_params->totalsize; 602 memblock_reserve(self_base, self_size); 603 | 589} 590 591static void __init early_reserve_mem(void) 592{ 593 u64 base, size; 594 u64 *reserve_map; 595 unsigned long self_base; 596 unsigned long self_size; 597 598 reserve_map = (u64 *)(((unsigned long)initial_boot_params) + 599 initial_boot_params->off_mem_rsvmap); 600 601 /* before we do anything, lets reserve the dt blob */ 602 self_base = __pa((unsigned long)initial_boot_params); 603 self_size = initial_boot_params->totalsize; 604 memblock_reserve(self_base, self_size); 605 |
604 /* 605 * Try looking for reserved-regions property in the DT first; if 606 * it's present, it'll contain all of the necessary reservation 607 * info 608 */ 609 if (early_reserve_mem_dt()) 610 return; | 606 /* Look for the new "reserved-regions" property in the DT */ 607 early_reserve_mem_dt(); |
611 612#ifdef CONFIG_BLK_DEV_INITRD | 608 609#ifdef CONFIG_BLK_DEV_INITRD |
613 /* then reserve the initrd, if any */ 614 if (initrd_start && (initrd_end > initrd_start)) | 610 /* Then reserve the initrd, if any */ 611 if (initrd_start && (initrd_end > initrd_start)) { |
615 memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE), 616 _ALIGN_UP(initrd_end, PAGE_SIZE) - 617 _ALIGN_DOWN(initrd_start, PAGE_SIZE)); | 612 memblock_reserve(_ALIGN_DOWN(__pa(initrd_start), PAGE_SIZE), 613 _ALIGN_UP(initrd_end, PAGE_SIZE) - 614 _ALIGN_DOWN(initrd_start, PAGE_SIZE)); |
615 } |
|
618#endif /* CONFIG_BLK_DEV_INITRD */ 619 620#ifdef CONFIG_PPC32 621 /* 622 * Handle the case where we might be booting from an old kexec 623 * image that setup the mem_rsvmap as pairs of 32-bit values 624 */ 625 if (*reserve_map > 0xffffffffull) { 626 u32 base_32, size_32; 627 u32 *reserve_map_32 = (u32 *)reserve_map; 628 | 616#endif /* CONFIG_BLK_DEV_INITRD */ 617 618#ifdef CONFIG_PPC32 619 /* 620 * Handle the case where we might be booting from an old kexec 621 * image that setup the mem_rsvmap as pairs of 32-bit values 622 */ 623 if (*reserve_map > 0xffffffffull) { 624 u32 base_32, size_32; 625 u32 *reserve_map_32 = (u32 *)reserve_map; 626 |
627 DBG("Found old 32-bit reserve map\n"); 628 |
|
629 while (1) { 630 base_32 = *(reserve_map_32++); 631 size_32 = *(reserve_map_32++); 632 if (size_32 == 0) 633 break; 634 /* skip if the reservation is for the blob */ 635 if (base_32 == self_base && size_32 == self_size) 636 continue; 637 DBG("reserving: %x -> %x\n", base_32, size_32); 638 memblock_reserve(base_32, size_32); 639 } 640 return; 641 } 642#endif | 629 while (1) { 630 base_32 = *(reserve_map_32++); 631 size_32 = *(reserve_map_32++); 632 if (size_32 == 0) 633 break; 634 /* skip if the reservation is for the blob */ 635 if (base_32 == self_base && size_32 == self_size) 636 continue; 637 DBG("reserving: %x -> %x\n", base_32, size_32); 638 memblock_reserve(base_32, size_32); 639 } 640 return; 641 } 642#endif |
643 DBG("Processing reserve map\n"); 644 645 /* Handle the reserve map in the fdt blob if it exists */ |
|
643 while (1) { 644 base = *(reserve_map++); 645 size = *(reserve_map++); 646 if (size == 0) 647 break; 648 DBG("reserving: %llx -> %llx\n", base, size); 649 memblock_reserve(base, size); 650 } --- 277 unchanged lines hidden --- | 646 while (1) { 647 base = *(reserve_map++); 648 size = *(reserve_map++); 649 if (size == 0) 650 break; 651 DBG("reserving: %llx -> %llx\n", base, size); 652 memblock_reserve(base, size); 653 } --- 277 unchanged lines hidden --- |