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

Geert Uytterhoeven
2014-05-25T16:57:52Z

Hi Michael, Andreas,

On Wed, 30 Apr 2014, Michael Schmitz wrote:
> first off - thanks for the patch!

Indeed.

> > Geert Uytterhoeven <geert@linux-m68k.org> writes:
> >
> > > Always increases the initial mapping to 16 MiB.
> > 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 ;-)

Andreas, I amended your patch like below, and plan to queue it for 3.16.
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@linux-m68k.org>
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@linux-m68k.org>

- 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@linux-m68k.org>
---
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@linux-m68k.org

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