Linux 6.9-rc1
[linux-2.6-microblaze.git] / arch / powerpc / kernel / setup-common.c
index 1a02629..01ed126 100644 (file)
 #include <linux/delay.h>
 #include <linux/initrd.h>
 #include <linux/platform_device.h>
+#include <linux/printk.h>
 #include <linux/seq_file.h>
 #include <linux/ioport.h>
 #include <linux/console.h>
-#include <linux/screen_info.h>
 #include <linux/root_dev.h>
 #include <linux/cpu.h>
 #include <linux/unistd.h>
+#include <linux/seq_buf.h>
 #include <linux/serial.h>
 #include <linux/serial_8250.h>
 #include <linux/percpu.h>
 #include <linux/memblock.h>
-#include <linux/of_irq.h>
+#include <linux/of.h>
 #include <linux/of_fdt.h>
-#include <linux/of_platform.h>
+#include <linux/of_irq.h>
 #include <linux/hugetlb.h>
 #include <linux/pgtable.h>
 #include <asm/io.h>
@@ -57,6 +58,7 @@
 #include <asm/xmon.h>
 #include <asm/cputhreads.h>
 #include <mm/mmu_decl.h>
+#include <asm/archrandom.h>
 #include <asm/fadump.h>
 #include <asm/udbg.h>
 #include <asm/hugetlb.h>
@@ -83,6 +85,11 @@ EXPORT_SYMBOL(machine_id);
 
 int boot_cpuid = -1;
 EXPORT_SYMBOL_GPL(boot_cpuid);
+int __initdata boot_core_hwid = -1;
+
+#ifdef CONFIG_PPC64
+int boot_cpu_hwid = -1;
+#endif
 
 /*
  * These are used in binfmt_elf.c to put aux entries on the stack
@@ -91,21 +98,6 @@ EXPORT_SYMBOL_GPL(boot_cpuid);
 int dcache_bsize;
 int icache_bsize;
 
-/*
- * This still seems to be needed... -- paulus
- */ 
-struct screen_info screen_info = {
-       .orig_x = 0,
-       .orig_y = 25,
-       .orig_video_cols = 80,
-       .orig_video_lines = 25,
-       .orig_video_isVGA = 1,
-       .orig_video_points = 16
-};
-#if defined(CONFIG_FB_VGA16_MODULE)
-EXPORT_SYMBOL(screen_info);
-#endif
-
 /* Variables required to store legacy IO irq routing */
 int of_i8042_kbd_irq;
 EXPORT_SYMBOL_GPL(of_i8042_kbd_irq);
@@ -118,7 +110,7 @@ int ppc_do_canonicalize_irqs;
 EXPORT_SYMBOL(ppc_do_canonicalize_irqs);
 #endif
 
-#ifdef CONFIG_CRASH_CORE
+#ifdef CONFIG_CRASH_DUMP
 /* This keeps a track of which one is the crashing cpu. */
 int crashing_cpu = -1;
 #endif
@@ -171,6 +163,14 @@ EXPORT_SYMBOL_GPL(machine_power_off);
 void (*pm_power_off)(void);
 EXPORT_SYMBOL_GPL(pm_power_off);
 
+size_t __must_check arch_get_random_seed_longs(unsigned long *v, size_t max_longs)
+{
+       if (max_longs && ppc_md.get_random_seed && ppc_md.get_random_seed(v))
+               return 1;
+       return 0;
+}
+EXPORT_SYMBOL(arch_get_random_seed_longs);
+
 void machine_halt(void)
 {
        machine_shutdown();
@@ -412,6 +412,25 @@ static void __init cpu_init_thread_core_maps(int tpc)
 
 u32 *cpu_to_phys_id = NULL;
 
+static int assign_threads(unsigned int cpu, unsigned int nthreads, bool present,
+                         const __be32 *hw_ids)
+{
+       for (int i = 0; i < nthreads && cpu < nr_cpu_ids; i++) {
+               __be32 hwid;
+
+               hwid = be32_to_cpu(hw_ids[i]);
+
+               DBG("    thread %d -> cpu %d (hard id %d)\n", i, cpu, hwid);
+
+               set_cpu_present(cpu, present);
+               set_cpu_possible(cpu, true);
+               cpu_to_phys_id[cpu] = hwid;
+               cpu++;
+       }
+
+       return cpu;
+}
+
 /**
  * setup_cpu_maps - initialize the following cpu maps:
  *                  cpu_possible_mask
@@ -447,7 +466,7 @@ void __init smp_setup_cpu_maps(void)
        for_each_node_by_type(dn, "cpu") {
                const __be32 *intserv;
                __be32 cpu_be;
-               int j, len;
+               int len;
 
                DBG("  * %pOF...\n", dn);
 
@@ -469,27 +488,31 @@ void __init smp_setup_cpu_maps(void)
 
                nthreads = len / sizeof(int);
 
-               for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) {
-                       bool avail;
+               bool avail = of_device_is_available(dn);
+               if (!avail)
+                       avail = !of_property_match_string(dn,
+                                       "enable-method", "spin-table");
 
-                       DBG("    thread %d -> cpu %d (hard id %d)\n",
-                           j, cpu, be32_to_cpu(intserv[j]));
-
-                       avail = of_device_is_available(dn);
-                       if (!avail)
-                               avail = !of_property_match_string(dn,
-                                               "enable-method", "spin-table");
-
-                       set_cpu_present(cpu, avail);
-                       set_cpu_possible(cpu, true);
-                       cpu_to_phys_id[cpu] = be32_to_cpu(intserv[j]);
-                       cpu++;
-               }
+               if (boot_core_hwid >= 0) {
+                       if (cpu == 0) {
+                               pr_info("Skipping CPU node %pOF to allow for boot core.\n", dn);
+                               cpu = nthreads;
+                               continue;
+                       }
 
-               if (cpu >= nr_cpu_ids) {
+                       if (be32_to_cpu(intserv[0]) == boot_core_hwid) {
+                               pr_info("Renumbered boot core %pOF to logical 0\n", dn);
+                               assign_threads(0, nthreads, avail, intserv);
+                               of_node_put(dn);
+                               break;
+                       }
+               } else if (cpu >= nr_cpu_ids) {
                        of_node_put(dn);
                        break;
                }
+
+               if (cpu < nr_cpu_ids)
+                       cpu = assign_threads(cpu, nthreads, avail, intserv);
        }
 
        /* If no SMT supported, nthreads is forced to 1 */
@@ -580,6 +603,14 @@ static __init int add_pcspkr(void)
 device_initcall(add_pcspkr);
 #endif /* CONFIG_PCSPKR_PLATFORM */
 
+static char ppc_hw_desc_buf[128] __initdata;
+
+struct seq_buf ppc_hw_desc __initdata = {
+       .buffer = ppc_hw_desc_buf,
+       .size = sizeof(ppc_hw_desc_buf),
+       .len = 0,
+};
+
 static __init void probe_machine(void)
 {
        extern struct machdep_calls __machine_desc_start;
@@ -606,13 +637,16 @@ static __init void probe_machine(void)
        for (machine_id = &__machine_desc_start;
             machine_id < &__machine_desc_end;
             machine_id++) {
-               DBG("  %s ...", machine_id->name);
+               DBG("  %s ...\n", machine_id->name);
+               if (machine_id->compatible && !of_machine_is_compatible(machine_id->compatible))
+                       continue;
+               if (machine_id->compatibles && !of_machine_compatible_match(machine_id->compatibles))
+                       continue;
                memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls));
-               if (ppc_md.probe()) {
-                       DBG(" match !\n");
-                       break;
-               }
-               DBG("\n");
+               if (ppc_md.probe && !ppc_md.probe())
+                       continue;
+               DBG("   %s match !\n", machine_id->name);
+               break;
        }
        /* What can we do if we didn't find ? */
        if (machine_id >= &__machine_desc_end) {
@@ -620,7 +654,13 @@ static __init void probe_machine(void)
                for (;;);
        }
 
-       printk(KERN_INFO "Using %s machine description\n", ppc_md.name);
+       // Append the machine name to other info we've gathered
+       seq_buf_puts(&ppc_hw_desc, ppc_md.name);
+
+       // Set the generic hardware description shown in oopses
+       dump_stack_set_arch_desc(ppc_hw_desc.buffer);
+
+       pr_info("Hardware name: %s\n", ppc_hw_desc.buffer);
 }
 
 /* Match a class of boards, not a specific device configuration. */
@@ -917,6 +957,8 @@ void __init setup_arch(char **cmdline_p)
 
        /* Parse memory topology */
        mem_topology_setup();
+       /* Set max_mapnr before paging_init() */
+       set_max_mapnr(max_pfn);
 
        /*
         * Release secondary cpus out of their spinloops at 0x60 now that
@@ -938,8 +980,12 @@ void __init setup_arch(char **cmdline_p)
        klp_init_thread_info(&init_task);
 
        setup_initial_init_mm(_stext, _etext, _edata, _end);
-
+       /* sched_init() does the mmgrab(&init_mm) for the primary CPU */
+       VM_WARN_ON(cpumask_test_cpu(smp_processor_id(), mm_cpumask(&init_mm)));
+       cpumask_set_cpu(smp_processor_id(), mm_cpumask(&init_mm));
+       inc_mm_active_cpus(&init_mm);
        mm_iommu_init(&init_mm);
+
        irqstack_early_init();
        exc_lvl_early_init();
        emergency_stack_init();