|
@@ -35,7 +35,6 @@
|
|
#include <linux/pci.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/lockdep.h>
|
|
#include <linux/lockdep.h>
|
|
#include <linux/memblock.h>
|
|
#include <linux/memblock.h>
|
|
-#include <linux/hugetlb.h>
|
|
|
|
#include <linux/memory.h>
|
|
#include <linux/memory.h>
|
|
#include <linux/nmi.h>
|
|
#include <linux/nmi.h>
|
|
|
|
|
|
@@ -64,12 +63,10 @@
|
|
#include <asm/xmon.h>
|
|
#include <asm/xmon.h>
|
|
#include <asm/udbg.h>
|
|
#include <asm/udbg.h>
|
|
#include <asm/kexec.h>
|
|
#include <asm/kexec.h>
|
|
-#include <asm/mmu_context.h>
|
|
|
|
#include <asm/code-patching.h>
|
|
#include <asm/code-patching.h>
|
|
-#include <asm/kvm_ppc.h>
|
|
|
|
-#include <asm/hugetlb.h>
|
|
|
|
#include <asm/livepatch.h>
|
|
#include <asm/livepatch.h>
|
|
#include <asm/opal.h>
|
|
#include <asm/opal.h>
|
|
|
|
+#include <asm/cputhreads.h>
|
|
|
|
|
|
#ifdef DEBUG
|
|
#ifdef DEBUG
|
|
#define DBG(fmt...) udbg_printf(fmt)
|
|
#define DBG(fmt...) udbg_printf(fmt)
|
|
@@ -100,7 +97,7 @@ int icache_bsize;
|
|
int ucache_bsize;
|
|
int ucache_bsize;
|
|
|
|
|
|
#if defined(CONFIG_PPC_BOOK3E) && defined(CONFIG_SMP)
|
|
#if defined(CONFIG_PPC_BOOK3E) && defined(CONFIG_SMP)
|
|
-static void setup_tlb_core_data(void)
|
|
|
|
|
|
+void __init setup_tlb_core_data(void)
|
|
{
|
|
{
|
|
int cpu;
|
|
int cpu;
|
|
|
|
|
|
@@ -133,10 +130,6 @@ static void setup_tlb_core_data(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-#else
|
|
|
|
-static void setup_tlb_core_data(void)
|
|
|
|
-{
|
|
|
|
-}
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
@@ -144,7 +137,7 @@ static void setup_tlb_core_data(void)
|
|
static char *smt_enabled_cmdline;
|
|
static char *smt_enabled_cmdline;
|
|
|
|
|
|
/* Look for ibm,smt-enabled OF option */
|
|
/* Look for ibm,smt-enabled OF option */
|
|
-static void check_smt_enabled(void)
|
|
|
|
|
|
+void __init check_smt_enabled(void)
|
|
{
|
|
{
|
|
struct device_node *dn;
|
|
struct device_node *dn;
|
|
const char *smt_option;
|
|
const char *smt_option;
|
|
@@ -193,8 +186,6 @@ static int __init early_smt_enabled(char *p)
|
|
}
|
|
}
|
|
early_param("smt-enabled", early_smt_enabled);
|
|
early_param("smt-enabled", early_smt_enabled);
|
|
|
|
|
|
-#else
|
|
|
|
-#define check_smt_enabled()
|
|
|
|
#endif /* CONFIG_SMP */
|
|
#endif /* CONFIG_SMP */
|
|
|
|
|
|
/** Fix up paca fields required for the boot cpu */
|
|
/** Fix up paca fields required for the boot cpu */
|
|
@@ -408,7 +399,7 @@ void smp_release_cpus(void)
|
|
* cache informations about the CPU that will be used by cache flush
|
|
* cache informations about the CPU that will be used by cache flush
|
|
* routines and/or provided to userland
|
|
* routines and/or provided to userland
|
|
*/
|
|
*/
|
|
-static void __init initialize_cache_info(void)
|
|
|
|
|
|
+void __init initialize_cache_info(void)
|
|
{
|
|
{
|
|
struct device_node *np;
|
|
struct device_node *np;
|
|
unsigned long num_cpus = 0;
|
|
unsigned long num_cpus = 0;
|
|
@@ -480,38 +471,6 @@ static void __init initialize_cache_info(void)
|
|
DBG(" <- initialize_cache_info()\n");
|
|
DBG(" <- initialize_cache_info()\n");
|
|
}
|
|
}
|
|
|
|
|
|
-static __init void print_system_info(void)
|
|
|
|
-{
|
|
|
|
- pr_info("-----------------------------------------------------\n");
|
|
|
|
- pr_info("ppc64_pft_size = 0x%llx\n", ppc64_pft_size);
|
|
|
|
- pr_info("phys_mem_size = 0x%llx\n", memblock_phys_mem_size());
|
|
|
|
-
|
|
|
|
- if (ppc64_caches.dline_size != 0x80)
|
|
|
|
- pr_info("dcache_line_size = 0x%x\n", ppc64_caches.dline_size);
|
|
|
|
- if (ppc64_caches.iline_size != 0x80)
|
|
|
|
- pr_info("icache_line_size = 0x%x\n", ppc64_caches.iline_size);
|
|
|
|
-
|
|
|
|
- pr_info("cpu_features = 0x%016lx\n", cur_cpu_spec->cpu_features);
|
|
|
|
- pr_info(" possible = 0x%016lx\n", CPU_FTRS_POSSIBLE);
|
|
|
|
- pr_info(" always = 0x%016lx\n", CPU_FTRS_ALWAYS);
|
|
|
|
- pr_info("cpu_user_features = 0x%08x 0x%08x\n", cur_cpu_spec->cpu_user_features,
|
|
|
|
- cur_cpu_spec->cpu_user_features2);
|
|
|
|
- pr_info("mmu_features = 0x%08x\n", cur_cpu_spec->mmu_features);
|
|
|
|
- pr_info("firmware_features = 0x%016lx\n", powerpc_firmware_features);
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_PPC_STD_MMU_64
|
|
|
|
- if (htab_address)
|
|
|
|
- pr_info("htab_address = 0x%p\n", htab_address);
|
|
|
|
-
|
|
|
|
- pr_info("htab_hash_mask = 0x%lx\n", htab_hash_mask);
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- if (PHYSICAL_START > 0)
|
|
|
|
- pr_info("physical_start = 0x%llx\n",
|
|
|
|
- (unsigned long long)PHYSICAL_START);
|
|
|
|
- pr_info("-----------------------------------------------------\n");
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
/* This returns the limit below which memory accesses to the linear
|
|
/* This returns the limit below which memory accesses to the linear
|
|
* mapping are guarnateed not to cause a TLB or SLB miss. This is
|
|
* mapping are guarnateed not to cause a TLB or SLB miss. This is
|
|
* used to allocate interrupt or emergency stacks for which our
|
|
* used to allocate interrupt or emergency stacks for which our
|
|
@@ -533,7 +492,7 @@ static __init u64 safe_stack_limit(void)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init irqstack_early_init(void)
|
|
|
|
|
|
+void __init irqstack_early_init(void)
|
|
{
|
|
{
|
|
u64 limit = safe_stack_limit();
|
|
u64 limit = safe_stack_limit();
|
|
unsigned int i;
|
|
unsigned int i;
|
|
@@ -553,7 +512,7 @@ static void __init irqstack_early_init(void)
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
#ifdef CONFIG_PPC_BOOK3E
|
|
-static void __init exc_lvl_early_init(void)
|
|
|
|
|
|
+void __init exc_lvl_early_init(void)
|
|
{
|
|
{
|
|
unsigned int i;
|
|
unsigned int i;
|
|
unsigned long sp;
|
|
unsigned long sp;
|
|
@@ -575,8 +534,6 @@ static void __init exc_lvl_early_init(void)
|
|
if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
|
|
if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
|
|
patch_exception(0x040, exc_debug_debug_book3e);
|
|
patch_exception(0x040, exc_debug_debug_book3e);
|
|
}
|
|
}
|
|
-#else
|
|
|
|
-#define exc_lvl_early_init()
|
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -584,7 +541,7 @@ static void __init exc_lvl_early_init(void)
|
|
* early in SMP boots before relocation is enabled. Exclusive emergency
|
|
* early in SMP boots before relocation is enabled. Exclusive emergency
|
|
* stack for machine checks.
|
|
* stack for machine checks.
|
|
*/
|
|
*/
|
|
-static void __init emergency_stack_init(void)
|
|
|
|
|
|
+void __init emergency_stack_init(void)
|
|
{
|
|
{
|
|
u64 limit;
|
|
u64 limit;
|
|
unsigned int i;
|
|
unsigned int i;
|
|
@@ -615,124 +572,6 @@ static void __init emergency_stack_init(void)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * Called into from start_kernel this initializes memblock, which is used
|
|
|
|
- * to manage page allocation until mem_init is called.
|
|
|
|
- */
|
|
|
|
-void __init setup_arch(char **cmdline_p)
|
|
|
|
-{
|
|
|
|
- *cmdline_p = boot_command_line;
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Unflatten the device-tree passed by prom_init or kexec
|
|
|
|
- */
|
|
|
|
- unflatten_device_tree();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Fill the ppc64_caches & systemcfg structures with informations
|
|
|
|
- * retrieved from the device-tree.
|
|
|
|
- */
|
|
|
|
- initialize_cache_info();
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_PPC_RTAS
|
|
|
|
- /*
|
|
|
|
- * Initialize RTAS if available
|
|
|
|
- */
|
|
|
|
- rtas_initialize();
|
|
|
|
-#endif /* CONFIG_PPC_RTAS */
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Check if we have an initrd provided via the device-tree
|
|
|
|
- */
|
|
|
|
- check_for_initrd();
|
|
|
|
-
|
|
|
|
- /* Probe the machine type */
|
|
|
|
- probe_machine();
|
|
|
|
-
|
|
|
|
- setup_panic();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * We can discover serial ports now since the above did setup the
|
|
|
|
- * hash table management for us, thus ioremap works. We do that early
|
|
|
|
- * so that further code can be debugged
|
|
|
|
- */
|
|
|
|
- find_legacy_serial_ports();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Register early console
|
|
|
|
- */
|
|
|
|
- register_early_udbg_console();
|
|
|
|
-
|
|
|
|
- smp_setup_cpu_maps();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Initialize xmon
|
|
|
|
- */
|
|
|
|
- xmon_setup();
|
|
|
|
-
|
|
|
|
- check_smt_enabled();
|
|
|
|
- setup_tlb_core_data();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Freescale Book3e parts spin in a loop provided by firmware,
|
|
|
|
- * so smp_release_cpus() does nothing for them
|
|
|
|
- */
|
|
|
|
-#if defined(CONFIG_SMP)
|
|
|
|
- /*
|
|
|
|
- * Release secondary cpus out of their spinloops at 0x60 now that
|
|
|
|
- * we can map physical -> logical CPU ids
|
|
|
|
- */
|
|
|
|
- smp_release_cpus();
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- /* Print various info about the machine that has been gathered so far. */
|
|
|
|
- print_system_info();
|
|
|
|
-
|
|
|
|
- /* Reserve large chunks of memory for use by CMA for KVM */
|
|
|
|
- kvm_cma_reserve();
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Reserve any gigantic pages requested on the command line.
|
|
|
|
- * memblock needs to have been initialized by the time this is
|
|
|
|
- * called since this will reserve memory.
|
|
|
|
- */
|
|
|
|
- reserve_hugetlb_gpages();
|
|
|
|
-
|
|
|
|
- klp_init_thread_info(&init_thread_info);
|
|
|
|
-
|
|
|
|
- init_mm.start_code = (unsigned long)_stext;
|
|
|
|
- init_mm.end_code = (unsigned long) _etext;
|
|
|
|
- init_mm.end_data = (unsigned long) _edata;
|
|
|
|
- init_mm.brk = klimit;
|
|
|
|
-#ifdef CONFIG_PPC_64K_PAGES
|
|
|
|
- init_mm.context.pte_frag = NULL;
|
|
|
|
-#endif
|
|
|
|
-#ifdef CONFIG_SPAPR_TCE_IOMMU
|
|
|
|
- mm_iommu_init(&init_mm.context);
|
|
|
|
-#endif
|
|
|
|
- irqstack_early_init();
|
|
|
|
- exc_lvl_early_init();
|
|
|
|
- emergency_stack_init();
|
|
|
|
-
|
|
|
|
- initmem_init();
|
|
|
|
-
|
|
|
|
-#ifdef CONFIG_DUMMY_CONSOLE
|
|
|
|
- conswitchp = &dummy_con;
|
|
|
|
-#endif
|
|
|
|
- if (ppc_md.setup_arch)
|
|
|
|
- ppc_md.setup_arch();
|
|
|
|
-
|
|
|
|
- paging_init();
|
|
|
|
-
|
|
|
|
- /* Initialize the MMU context management stuff */
|
|
|
|
- mmu_context_init();
|
|
|
|
-
|
|
|
|
- /* Interrupt code needs to be 64K-aligned */
|
|
|
|
- if ((unsigned long)_stext & 0xffff)
|
|
|
|
- panic("Kernelbase not 64K-aligned (0x%lx)!\n",
|
|
|
|
- (unsigned long)_stext);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_SMP
|
|
#ifdef CONFIG_SMP
|
|
#define PCPU_DYN_SIZE ()
|
|
#define PCPU_DYN_SIZE ()
|
|
|
|
|