On Mon, May 13, 2019 at 02:59:52PM +1000, Greg Ungerer wrote:
> Hi Mike,
> 
> On 8/5/19 8:09 pm, Mike Rapoport wrote:
> >Enable SPARSEMEM support for systems with !SINGLE_MEMORY_CHUNK.
> >With SPARSEMEM there is a single node for the entire physical memory and to
> >cope with holes in the physical address space it is divided to sections of
> >up to 16M.
> >
> >Each section has it's own memory map which size depends on actual populated
> >memory.
> >
> >The DISCONTIGMEM is marked BROKEN and will be removed in a couple of
> >releases.
> >
> >Signed-off-by: Mike Rapoport <[email protected]>
> 
> This worked for me on no-MMU ColdFire targets, but failed to
> boot on an MMU enabled M5475 target. I got no console output
> at all. I haven't debugged any further yet.

The ColdFire configs do not seem to enable SINGLE_MEMORY_CHUNK:

config SINGLE_MEMORY_CHUNK
        bool "Use one physical chunk of memory only" if ADVANCED && !SUN3
        depends on MMU
        default y if SUN3

When SINGLE_MEMORY_CHUNK=n, Kconfig enables SPARSEMEM as the only memory
model.

Is it possible for ColdFile to have more than a single memory bank?
If not, the patch below should fix ColdFire boot:

diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu
index 1b056d24c554..2a547c927578 100644
--- a/arch/m68k/Kconfig.cpu
+++ b/arch/m68k/Kconfig.cpu
@@ -375,7 +375,7 @@ config RMW_INSNS
 config SINGLE_MEMORY_CHUNK
        bool "Use one physical chunk of memory only" if ADVANCED && !SUN3
        depends on MMU
-       default y if SUN3
+       default y if SUN3 || MMU_COLDFIRE
        help
          Ignore all but the first contiguous chunk of physical memory for VM
          purposes.  This will save a few bytes kernel size and may speed up

> Regards
> Greg
> 
> 
> >---
> >  arch/m68k/Kconfig.cpu             |  8 +++++
> >  arch/m68k/include/asm/sparsemem.h |  8 +++++
> >  arch/m68k/mm/motorola.c           | 64 
> > ++++++++++++++++++++++++++++++++-------
> >  3 files changed, 69 insertions(+), 11 deletions(-)
> >  create mode 100644 arch/m68k/include/asm/sparsemem.h
> >
> >diff --git a/arch/m68k/Kconfig.cpu b/arch/m68k/Kconfig.cpu
> >index 6542e7a5997b..1b056d24c554 100644
> >--- a/arch/m68k/Kconfig.cpu
> >+++ b/arch/m68k/Kconfig.cpu
> >@@ -21,6 +21,7 @@ choice
> >  config M68KCLASSIC
> >     bool "Classic M68K CPU family support"
> >     select NEED_MULTIPLE_NODES if DISCONTIGMEM
> >+    select SPARSEMEM_STATIC if SPARSEMEM
> >  config COLDFIRE
> >     bool "Coldfire CPU family support"
> >@@ -381,8 +382,15 @@ config SINGLE_MEMORY_CHUNK
> >       some operations.  Say N if not sure.
> >  config ARCH_DISCONTIGMEM_ENABLE
> >+    def_bool no
> >+    depends on BROKEN && MMU && !SINGLE_MEMORY_CHUNK
> >+
> >+config ARCH_SPARSEMEM_ENABLE
> >     def_bool MMU && !SINGLE_MEMORY_CHUNK
> >+config HAVE_ARCH_PFN_VALID
> >+    def_bool SPARSEMEM
> >+
> >  config 060_WRITETHROUGH
> >     bool "Use write-through caching for 68060 supervisor accesses"
> >     depends on ADVANCED && M68060
> >diff --git a/arch/m68k/include/asm/sparsemem.h 
> >b/arch/m68k/include/asm/sparsemem.h
> >new file mode 100644
> >index 000000000000..6645a6420af9
> >--- /dev/null
> >+++ b/arch/m68k/include/asm/sparsemem.h
> >@@ -0,0 +1,8 @@
> >+/* SPDX-License-Identifier: GPL-2.0 */
> >+#ifndef _ASM_M68K_SPARSEMEM_H_
> >+#define _ASM_M68K_SPARSEMEM_H_
> >+
> >+#define MAX_PHYSMEM_BITS    32
> >+#define SECTION_SIZE_BITS   24
> >+
> >+#endif /* _ASM_M68K_SPARSEMEM_H_ */
> >diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
> >index 356601bf96d9..87d09942be5c 100644
> >--- a/arch/m68k/mm/motorola.c
> >+++ b/arch/m68k/mm/motorola.c
> >@@ -207,13 +207,63 @@ static void __init map_node(int node)
> >  #endif
> >  }
> >+#ifdef CONFIG_SPARSEMEM
> >+static void m68k_free_area_init(unsigned long max_addr)
> >+{
> >+    unsigned long zones_size[MAX_NR_ZONES] = { 0, };
> >+    unsigned long zholes_size[MAX_NR_ZONES] = { 0, };
> >+    unsigned long holes_size;
> >+
> >+    m68k_setup_node(0);
> >+
> >+    /*
> >+     * Make sure the memory map is allocated from top of the
> >+     * memory.
> >+     * Otherwise for systems with both ST-RAM and FastRam, ST-RAM
> >+     * gets filled with the memory map leaving no space for
> >+     * framebuffer
> >+     */
> >+    memblock_set_bottom_up(false);
> >+    memblocks_present();
> >+    sparse_init();
> >+    memblock_set_bottom_up(true);
> >+
> >+    zones_size[ZONE_DMA] = max_addr >> PAGE_SHIFT;
> >+    if (m68k_num_memory > 1) {
> >+            holes_size = max_addr - memblock_phys_mem_size();
> >+            zholes_size[ZONE_DMA] = holes_size >> PAGE_SHIFT;
> >+    }
> >+
> >+    free_area_init_node(0, zones_size,
> >+                        m68k_memory[0].addr >> PAGE_SHIFT, zholes_size);
> >+
> >+    if (node_present_pages(0))
> >+            node_set_state(0, N_NORMAL_MEMORY);
> >+}
> >+
> >+#else
> >+static void m68k_free_area_init(unsigned long max_addr)
> >+{
> >+    unsigned long zones_size[MAX_NR_ZONES] = { 0, };
> >+    int i;
> >+
> >+    for (i = 0; i < m68k_num_memory; i++) {
> >+            m68k_setup_node(i);
> >+            zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
> >+            free_area_init_node(i, zones_size,
> >+                                m68k_memory[i].addr >> PAGE_SHIFT, NULL);
> >+            if (node_present_pages(i))
> >+                    node_set_state(i, N_NORMAL_MEMORY);
> >+    }
> >+}
> >+#endif
> >+
> >  /*
> >   * paging_init() continues the virtual memory environment setup which
> >   * was begun by the code in arch/head.S.
> >   */
> >  void __init paging_init(void)
> >  {
> >-    unsigned long zones_size[MAX_NR_ZONES] = { 0, };
> >     unsigned long min_addr, max_addr;
> >     unsigned long addr;
> >     int i;
> >@@ -272,10 +322,8 @@ void __init paging_init(void)
> >      */
> >     memblock_set_bottom_up(true);
> >-    for (i = 0; i < m68k_num_memory; i++) {
> >-            m68k_setup_node(i);
> >+    for (i = 0; i < m68k_num_memory; i++)
> >             map_node(i);
> >-    }
> >     flush_tlb_all();
> >@@ -296,12 +344,6 @@ void __init paging_init(void)
> >  #ifdef DEBUG
> >     printk ("before free_area_init\n");
> >  #endif
> >-    for (i = 0; i < m68k_num_memory; i++) {
> >-            zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
> >-            free_area_init_node(i, zones_size,
> >-                                m68k_memory[i].addr >> PAGE_SHIFT, NULL);
> >-            if (node_present_pages(i))
> >-                    node_set_state(i, N_NORMAL_MEMORY);
> >-    }
> >+    m68k_free_area_init(max_addr);
> >  }
> >
> 

-- 
Sincerely yours,
Mike.

Reply via email to