MIPS: Loongson64: Give chance to build under !CONFIG_NUMA and !CONFIG_SMP
authorTiezhu Yang <yangtiezhu@loongson.cn>
Thu, 3 Dec 2020 12:32:52 +0000 (20:32 +0800)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Mon, 4 Jan 2021 10:15:07 +0000 (11:15 +0100)
In the current code, we can not build under !CONFIG_NUMA and !CONFIG_SMP
on the Loongson64 platform, it seems bad for the users who just want to
use pure single core (not nosmp) to debug, so do the following things to
give them a chance:

(1) Do not select NUMA and SMP for MACH_LOONGSON64 in Kconfig, make NUMA
depends on SMP, and then just set them in the loongson3_defconfig.
(2) Move szmem() from numa.c to init.c and add prom_init_memory() under
!CONFIG_NUMA.
(3) Clean up szmem() due to the statements of case SYSTEM_RAM_LOW and
SYSTEM_RAM_HIGH are the same.
(4) Remove the useless declaration of prom_init_memory() and add the
declaration of szmem() in loongson.h to avoid build error.

Signed-off-by: Youling Tang <tangyouling@loongson.cn>
Signed-off-by: Jinyang He <hejinyang@loongson.cn>
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/Kconfig
arch/mips/configs/loongson3_defconfig
arch/mips/include/asm/mach-loongson64/loongson.h
arch/mips/loongson64/init.c
arch/mips/loongson64/numa.c

index 0a17bedf4f0dbabba58a758f559e3ff08f155a36..102236cb5e0639b35605a3daccdcb4d616140049 100644 (file)
@@ -491,8 +491,6 @@ config MACH_LOONGSON64
        select SYS_SUPPORTS_ZBOOT
        select SYS_SUPPORTS_RELOCATABLE
        select ZONE_DMA32
-       select NUMA
-       select SMP
        select COMMON_CLK
        select USE_OF
        select BUILTIN_DTB
@@ -2758,6 +2756,7 @@ config ARCH_SPARSEMEM_ENABLE
 config NUMA
        bool "NUMA Support"
        depends on SYS_SUPPORTS_NUMA
+       select SMP
        help
          Say Y to compile the kernel to support NUMA (Non-Uniform Memory
          Access).  This option improves performance on systems with more
index 9c5fadef38cba2c0616076e1c914c93142ad34fe..0e79f81217bc94d892b67e05edce40c367eb1b7a 100644 (file)
@@ -31,6 +31,8 @@ CONFIG_PERF_EVENTS=y
 CONFIG_MACH_LOONGSON64=y
 CONFIG_CPU_HAS_MSA=y
 CONFIG_NR_CPUS=16
+CONFIG_NUMA=y
+CONFIG_SMP=y
 CONFIG_HZ_256=y
 CONFIG_KEXEC=y
 CONFIG_MIPS32_O32=y
index fde1b75c45ea056bac5cb4dd973507619f6107f7..ac1c20e172a2b0762fa2ccb2af47a50b7d093a12 100644 (file)
@@ -23,8 +23,8 @@ extern u32 memsize, highmemsize;
 extern const struct plat_smp_ops loongson3_smp_ops;
 
 /* loongson-specific command line, env and memory initialization */
-extern void __init prom_init_memory(void);
 extern void __init prom_init_env(void);
+extern void __init szmem(unsigned int node);
 extern void *loongson_fdt_blob;
 
 /* irq operation functions */
index ed75f7971261bbbfac65bb0a9fe5d0405e434ef8..e13f704bef80d2cb8d6fe0810e4e480c88d1ea1f 100644 (file)
@@ -47,6 +47,51 @@ void virtual_early_config(void)
        node_id_offset = 44;
 }
 
+void __init szmem(unsigned int node)
+{
+       u32 i, mem_type;
+       static unsigned long num_physpages;
+       u64 node_id, node_psize, start_pfn, end_pfn, mem_start, mem_size;
+
+       /* Parse memory information and activate */
+       for (i = 0; i < loongson_memmap->nr_map; i++) {
+               node_id = loongson_memmap->map[i].node_id;
+               if (node_id != node)
+                       continue;
+
+               mem_type = loongson_memmap->map[i].mem_type;
+               mem_size = loongson_memmap->map[i].mem_size;
+               mem_start = loongson_memmap->map[i].mem_start;
+
+               switch (mem_type) {
+               case SYSTEM_RAM_LOW:
+               case SYSTEM_RAM_HIGH:
+                       start_pfn = ((node_id << 44) + mem_start) >> PAGE_SHIFT;
+                       node_psize = (mem_size << 20) >> PAGE_SHIFT;
+                       end_pfn  = start_pfn + node_psize;
+                       num_physpages += node_psize;
+                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
+                               (u32)node_id, mem_type, mem_start, mem_size);
+                       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
+                               start_pfn, end_pfn, num_physpages);
+                       memblock_add_node(PFN_PHYS(start_pfn), PFN_PHYS(node_psize), node);
+                       break;
+               case SYSTEM_RAM_RESERVED:
+                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
+                               (u32)node_id, mem_type, mem_start, mem_size);
+                       memblock_reserve(((node_id << 44) + mem_start), mem_size << 20);
+                       break;
+               }
+       }
+}
+
+#ifndef CONFIG_NUMA
+static void __init prom_init_memory(void)
+{
+       szmem(0);
+}
+#endif
+
 void __init prom_init(void)
 {
        fw_init_cmdline();
@@ -57,7 +102,11 @@ void __init prom_init(void)
 
        loongson_sysconf.early_config();
 
+#ifdef CONFIG_NUMA
        prom_init_numa_memory();
+#else
+       prom_init_memory();
+#endif
 
        /* Hardcode to CPU UART 0 */
        setup_8250_early_printk_port(TO_UNCAC(LOONGSON_REG_BASE + 0x1e0), 0, 1024);
index c6f0c48384f806624175adc2eb7e964fa920fe88..a8f57bf012854c055e99da6eaa3255bf7456c702 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/time.h>
 #include <asm/wbflush.h>
 #include <boot_param.h>
+#include <loongson.h>
 
 static struct pglist_data prealloc__node_data[MAX_NUMNODES];
 unsigned char __node_distances[MAX_NUMNODES][MAX_NUMNODES];
@@ -81,57 +82,6 @@ static void __init init_topology_matrix(void)
        }
 }
 
-static void __init szmem(unsigned int node)
-{
-       u32 i, mem_type;
-       static unsigned long num_physpages;
-       u64 node_id, node_psize, start_pfn, end_pfn, mem_start, mem_size;
-
-       /* Parse memory information and activate */
-       for (i = 0; i < loongson_memmap->nr_map; i++) {
-               node_id = loongson_memmap->map[i].node_id;
-               if (node_id != node)
-                       continue;
-
-               mem_type = loongson_memmap->map[i].mem_type;
-               mem_size = loongson_memmap->map[i].mem_size;
-               mem_start = loongson_memmap->map[i].mem_start;
-
-               switch (mem_type) {
-               case SYSTEM_RAM_LOW:
-                       start_pfn = ((node_id << 44) + mem_start) >> PAGE_SHIFT;
-                       node_psize = (mem_size << 20) >> PAGE_SHIFT;
-                       end_pfn  = start_pfn + node_psize;
-                       num_physpages += node_psize;
-                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
-                               (u32)node_id, mem_type, mem_start, mem_size);
-                       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
-                               start_pfn, end_pfn, num_physpages);
-                       memblock_add_node(PFN_PHYS(start_pfn),
-                               PFN_PHYS(node_psize), node);
-                       break;
-               case SYSTEM_RAM_HIGH:
-                       start_pfn = ((node_id << 44) + mem_start) >> PAGE_SHIFT;
-                       node_psize = (mem_size << 20) >> PAGE_SHIFT;
-                       end_pfn  = start_pfn + node_psize;
-                       num_physpages += node_psize;
-                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
-                               (u32)node_id, mem_type, mem_start, mem_size);
-                       pr_info("       start_pfn:0x%llx, end_pfn:0x%llx, num_physpages:0x%lx\n",
-                               start_pfn, end_pfn, num_physpages);
-                       memblock_add_node(PFN_PHYS(start_pfn),
-                               PFN_PHYS(node_psize), node);
-                       break;
-               case SYSTEM_RAM_RESERVED:
-                       pr_info("Node%d: mem_type:%d, mem_start:0x%llx, mem_size:0x%llx MB\n",
-                               (u32)node_id, mem_type, mem_start, mem_size);
-                       memblock_reserve(((node_id << 44) + mem_start),
-                               mem_size << 20);
-                       break;
-               }
-       }
-}
-
 static void __init node_mem_init(unsigned int node)
 {
        unsigned long node_addrspace_offset;