Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[cascardo/linux.git] / arch / powerpc / kernel / setup_64.c
index f55c25d..eafb9a7 100644 (file)
@@ -35,7 +35,6 @@
 #include <linux/pci.h>
 #include <linux/lockdep.h>
 #include <linux/memblock.h>
-#include <linux/hugetlb.h>
 #include <linux/memory.h>
 #include <linux/nmi.h>
 
 #include <asm/xmon.h>
 #include <asm/udbg.h>
 #include <asm/kexec.h>
-#include <asm/mmu_context.h>
 #include <asm/code-patching.h>
-#include <asm/kvm_ppc.h>
-#include <asm/hugetlb.h>
 #include <asm/livepatch.h>
 #include <asm/opal.h>
+#include <asm/cputhreads.h>
 
 #ifdef DEBUG
 #define DBG(fmt...) udbg_printf(fmt)
@@ -100,7 +97,7 @@ int icache_bsize;
 int ucache_bsize;
 
 #if defined(CONFIG_PPC_BOOK3E) && defined(CONFIG_SMP)
-static void setup_tlb_core_data(void)
+void __init setup_tlb_core_data(void)
 {
        int cpu;
 
@@ -133,10 +130,6 @@ static void setup_tlb_core_data(void)
                }
        }
 }
-#else
-static void setup_tlb_core_data(void)
-{
-}
 #endif
 
 #ifdef CONFIG_SMP
@@ -144,7 +137,7 @@ static void setup_tlb_core_data(void)
 static char *smt_enabled_cmdline;
 
 /* Look for ibm,smt-enabled OF option */
-static void check_smt_enabled(void)
+void __init check_smt_enabled(void)
 {
        struct device_node *dn;
        const char *smt_option;
@@ -193,12 +186,10 @@ static int __init early_smt_enabled(char *p)
 }
 early_param("smt-enabled", early_smt_enabled);
 
-#else
-#define check_smt_enabled()
 #endif /* CONFIG_SMP */
 
 /** Fix up paca fields required for the boot cpu */
-static void fixup_boot_paca(void)
+static void __init fixup_boot_paca(void)
 {
        /* The boot cpu is started */
        get_paca()->cpu_start = 1;
@@ -206,7 +197,7 @@ static void fixup_boot_paca(void)
        get_paca()->data_offset = 0;
 }
 
-static void configure_exceptions(void)
+static void __init configure_exceptions(void)
 {
        /*
         * Setup the trampolines from the lowmem exception vectors
@@ -236,8 +227,8 @@ static void configure_exceptions(void)
                        opal_configure_cores();
 
                /* Enable AIL if supported, and we are in hypervisor mode */
-               if (cpu_has_feature(CPU_FTR_HVMODE) &&
-                   cpu_has_feature(CPU_FTR_ARCH_207S)) {
+               if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
+                   early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
                        unsigned long lpcr = mfspr(SPRN_LPCR);
                        mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
                }
@@ -307,12 +298,12 @@ void __init early_setup(unsigned long dt_ptr)
         */
        configure_exceptions();
 
-       /* Initialize the hash table or TLB handling */
-       early_init_mmu();
-
        /* Apply all the dynamic patching */
        apply_feature_fixups();
 
+       /* Initialize the hash table or TLB handling */
+       early_init_mmu();
+
        /*
         * At this point, we can let interrupts switch to virtual mode
         * (the MMU has been setup), so adjust the MSR in the PACA to
@@ -408,7 +399,7 @@ void smp_release_cpus(void)
  * cache informations about the CPU that will be used by cache flush
  * routines and/or provided to userland
  */
-static void __init initialize_cache_info(void)
+void __init initialize_cache_info(void)
 {
        struct device_node *np;
        unsigned long num_cpus = 0;
@@ -480,44 +471,12 @@ static void __init initialize_cache_info(void)
        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
  * mapping are guarnateed not to cause a TLB or SLB miss. This is
  * used to allocate interrupt or emergency stacks for which our
  * exception entry path doesn't deal with being interrupted.
  */
-static u64 safe_stack_limit(void)
+static __init u64 safe_stack_limit(void)
 {
 #ifdef CONFIG_PPC_BOOK3E
        /* Freescale BookE bolts the entire linear mapping */
@@ -533,7 +492,7 @@ static u64 safe_stack_limit(void)
 #endif
 }
 
-static void __init irqstack_early_init(void)
+void __init irqstack_early_init(void)
 {
        u64 limit = safe_stack_limit();
        unsigned int i;
@@ -553,7 +512,7 @@ static void __init irqstack_early_init(void)
 }
 
 #ifdef CONFIG_PPC_BOOK3E
-static void __init exc_lvl_early_init(void)
+void __init exc_lvl_early_init(void)
 {
        unsigned int i;
        unsigned long sp;
@@ -575,8 +534,6 @@ static void __init exc_lvl_early_init(void)
        if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
                patch_exception(0x040, exc_debug_debug_book3e);
 }
-#else
-#define exc_lvl_early_init()
 #endif
 
 /*
@@ -584,7 +541,7 @@ static void __init exc_lvl_early_init(void)
  * early in SMP boots before relocation is enabled. Exclusive emergency
  * stack for machine checks.
  */
-static void __init emergency_stack_init(void)
+void __init emergency_stack_init(void)
 {
        u64 limit;
        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
 #define PCPU_DYN_SIZE          ()