diff options
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r-- | arch/sparc64/mm/init.c | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index f37078d96407..21e9267608c7 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -883,6 +883,37 @@ static void __init trim_pavail(unsigned long *cur_size_p, | |||
883 | } | 883 | } |
884 | } | 884 | } |
885 | 885 | ||
886 | static void __init find_ramdisk(unsigned long phys_base) | ||
887 | { | ||
888 | #ifdef CONFIG_BLK_DEV_INITRD | ||
889 | if (sparc_ramdisk_image || sparc_ramdisk_image64) { | ||
890 | unsigned long ramdisk_image; | ||
891 | |||
892 | /* Older versions of the bootloader only supported a | ||
893 | * 32-bit physical address for the ramdisk image | ||
894 | * location, stored at sparc_ramdisk_image. Newer | ||
895 | * SILO versions set sparc_ramdisk_image to zero and | ||
896 | * provide a full 64-bit physical address at | ||
897 | * sparc_ramdisk_image64. | ||
898 | */ | ||
899 | ramdisk_image = sparc_ramdisk_image; | ||
900 | if (!ramdisk_image) | ||
901 | ramdisk_image = sparc_ramdisk_image64; | ||
902 | |||
903 | /* Another bootloader quirk. The bootloader normalizes | ||
904 | * the physical address to KERNBASE, so we have to | ||
905 | * factor that back out and add in the lowest valid | ||
906 | * physical page address to get the true physical address. | ||
907 | */ | ||
908 | ramdisk_image -= KERNBASE; | ||
909 | ramdisk_image += phys_base; | ||
910 | |||
911 | initrd_start = ramdisk_image; | ||
912 | initrd_end = ramdisk_image + sparc_ramdisk_size; | ||
913 | } | ||
914 | #endif | ||
915 | } | ||
916 | |||
886 | /* About pages_avail, this is the value we will use to calculate | 917 | /* About pages_avail, this is the value we will use to calculate |
887 | * the zholes_size[] argument given to free_area_init_node(). The | 918 | * the zholes_size[] argument given to free_area_init_node(). The |
888 | * page allocator uses this to calculate nr_kernel_pages, | 919 | * page allocator uses this to calculate nr_kernel_pages, |
@@ -912,30 +943,6 @@ static unsigned long __init bootmem_init(unsigned long *pages_avail, | |||
912 | bytes_avail += pavail[i].reg_size; | 943 | bytes_avail += pavail[i].reg_size; |
913 | } | 944 | } |
914 | 945 | ||
915 | /* Determine the location of the initial ramdisk before trying | ||
916 | * to honor the "mem=xxx" command line argument. We must know | ||
917 | * where the kernel image and the ramdisk image are so that we | ||
918 | * do not trim those two areas from the physical memory map. | ||
919 | */ | ||
920 | |||
921 | #ifdef CONFIG_BLK_DEV_INITRD | ||
922 | /* Now have to check initial ramdisk, so that bootmap does not overwrite it */ | ||
923 | if (sparc_ramdisk_image || sparc_ramdisk_image64) { | ||
924 | unsigned long ramdisk_image = sparc_ramdisk_image ? | ||
925 | sparc_ramdisk_image : sparc_ramdisk_image64; | ||
926 | ramdisk_image -= KERNBASE; | ||
927 | initrd_start = ramdisk_image + phys_base; | ||
928 | initrd_end = initrd_start + sparc_ramdisk_size; | ||
929 | if (initrd_end > end_of_phys_memory) { | ||
930 | printk(KERN_CRIT "initrd extends beyond end of memory " | ||
931 | "(0x%016lx > 0x%016lx)\ndisabling initrd\n", | ||
932 | initrd_end, end_of_phys_memory); | ||
933 | initrd_start = 0; | ||
934 | initrd_end = 0; | ||
935 | } | ||
936 | } | ||
937 | #endif | ||
938 | |||
939 | if (cmdline_memory_size && | 946 | if (cmdline_memory_size && |
940 | bytes_avail > cmdline_memory_size) | 947 | bytes_avail > cmdline_memory_size) |
941 | trim_pavail(&bytes_avail, | 948 | trim_pavail(&bytes_avail, |
@@ -1337,6 +1344,8 @@ void __init paging_init(void) | |||
1337 | for (i = 0; i < pavail_ents; i++) | 1344 | for (i = 0; i < pavail_ents; i++) |
1338 | phys_base = min(phys_base, pavail[i].phys_addr); | 1345 | phys_base = min(phys_base, pavail[i].phys_addr); |
1339 | 1346 | ||
1347 | find_ramdisk(phys_base); | ||
1348 | |||
1340 | set_bit(0, mmu_context_bmap); | 1349 | set_bit(0, mmu_context_bmap); |
1341 | 1350 | ||
1342 | shift = kern_base + PAGE_OFFSET - ((unsigned long)KERNBASE); | 1351 | shift = kern_base + PAGE_OFFSET - ((unsigned long)KERNBASE); |