Re: [PATCH] m68k: Increase initial mapping to 16MB if possible

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Geert,


You can't map more than is available.

How about trying for 16, then 8, then 4? Would help my 14 MB ST-RAM Falcon.

I had a patch half prepared for that which I forgot to send ...

And thus I never saw it ;-)

Sorry - I just didn't want to send out assembly code patches I never
attempted to compile. Happy to do that for C code, but that's bad
enough for me.

Andreas, I amended your patch like below, and plan to queue it for 3.16.

Definitely more elegant than my version :-)

Cheers,

  Michael


This allows me to boot a multi_defconfig kernel on ARAnyM, with 14 MiB
ST-RAM in the first chunk, which didn't work with your 16 MiB-only version.

From fac30ceba841cd5e076f4c0e83b05ca3ba9d3eb2 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@xxxxxxxxxxxxxx>
Date: Thu, 24 Apr 2014 12:24:48 +0200
Subject: [PATCH] m68k: Increase initial mapping to 8 or 16 MiB if possible

If the size of the first memory chunk is at least 8 or 16 MiB increase the
initial mapping to 8 resp. 16 MiB instead of 4 MiB.
This makes it possible to
  1. Map more memory in the first node without running out of space for the
     page tables,
  2. Boot kernels that don't fit in 4 MiB (e.g. multi_defconfig).

Signed-off-by: Andreas Schwab <schwab@xxxxxxxxxxxxxx>

  - Add support for 8 MiB,
  - Store initial mapping size in head.S for later reuse,
  - Add comment about large kernels.

Signed-off-by: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
---
 arch/m68k/kernel/head.S | 19 +++++++++++++++++--
 arch/m68k/mm/motorola.c | 10 ++++++----
 2 files changed, 23 insertions(+), 6 deletions(-)

diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S
index 145bc3d5b3da..9745156b1db8 100644
--- a/arch/m68k/kernel/head.S
+++ b/arch/m68k/kernel/head.S
@@ -292,6 +292,7 @@

 .globl kernel_pg_dir
 .globl availmem
+.globl m68k_init_mapped_size
 .globl m68k_pgtable_cachemode
 .globl m68k_supervisor_cachemode
 #ifdef CONFIG_MVME16x
@@ -907,10 +908,21 @@ L(nocon):
  *
  *     This block of code does what's necessary to map in the various kinds
  *     of machines for execution of Linux.
- *     First map the first 4 MB of kernel code & data
+ *     First map the first 4, 8, or 16 MB of kernel code & data
  */

-       mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),#4*1024*1024,\
+       get_bi_record BI_MEMCHUNK
+       movel   %a0@(4),%d0
+       movel   #16*1024*1024,%d1
+       cmpl    %d0,%d1
+       jls     1f
+       lsrl    #1,%d1
+       cmpl    %d0,%d1
+       jls     1f
+       lsrl    #1,%d1
+1:
+       movel   %d1,m68k_init_mapped_size
+       mmu_map #PAGE_OFFSET,%pc@(L(phys_kernel_start)),%d1,\
                %pc@(m68k_supervisor_cachemode)

        putc    'C'
@@ -3729,6 +3741,9 @@ func_return       console_plot_pixel
 __INITDATA
        .align  4

+m68k_init_mapped_size:
+       .long   0
+
 #if defined(CONFIG_ATARI) || defined(CONFIG_AMIGA) || \
     defined(CONFIG_HP300) || defined(CONFIG_APOLLO)
 L(custom):
diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
index cf4dfc7eeb29..3bdc56a882fd 100644
--- a/arch/m68k/mm/motorola.c
+++ b/arch/m68k/mm/motorola.c
@@ -45,7 +45,7 @@ EXPORT_SYMBOL(mm_cachebits);
 #endif

 /* size of memory already mapped in head.S */
-#define INIT_MAPPED_SIZE       (4UL<<20)
+extern __initdata unsigned long m68k_init_mapped_size;

 extern unsigned long availmem;

@@ -273,10 +273,12 @@ printk("*** m68k_virt_to_node_shift = %d\n", m68k_virt_to_node_shift);
         */
        addr = m68k_memory[0].addr;
        size = m68k_memory[0].size;
-       free_bootmem_node(NODE_DATA(0), availmem, min(INIT_MAPPED_SIZE, size) - (availmem - addr));
+       free_bootmem_node(NODE_DATA(0), availmem,
+                         min(m68k_init_mapped_size, size) - (availmem - addr));
        map_node(0);
-       if (size > INIT_MAPPED_SIZE)
-               free_bootmem_node(NODE_DATA(0), addr + INIT_MAPPED_SIZE, size - INIT_MAPPED_SIZE);
+       if (size > m68k_init_mapped_size)
+               free_bootmem_node(NODE_DATA(0), addr + m68k_init_mapped_size,
+                                 size - m68k_init_mapped_size);

        for (i = 1; i < m68k_num_memory; i++)
                map_node(i);
--
1.9.1

Gr{oetje,eeting}s,

                                                Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                                            -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Video for Linux]     [Yosemite News]     [Linux S/390]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux