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 ---