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 <[email protected]>
> 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 <[email protected]>
>
>   - 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 <[email protected]>
> ---
>  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 -- 
> [email protected]
>
> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to