include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[safe/jmp/linux-2.6] / arch / s390 / kernel / setup.c
index 024180e..91625f7 100644 (file)
@@ -14,6 +14,9 @@
  * This file handles the architecture-dependent parts of initialization
  */
 
+#define KMSG_COMPONENT "setup"
+#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
+
 #include <linux/errno.h>
 #include <linux/module.h>
 #include <linux/sched.h>
@@ -22,7 +25,6 @@
 #include <linux/stddef.h>
 #include <linux/unistd.h>
 #include <linux/ptrace.h>
-#include <linux/slab.h>
 #include <linux/user.h>
 #include <linux/tty.h>
 #include <linux/ioport.h>
@@ -32,7 +34,6 @@
 #include <linux/bootmem.h>
 #include <linux/root_dev.h>
 #include <linux/console.h>
-#include <linux/seq_file.h>
 #include <linux/kernel_stat.h>
 #include <linux/device.h>
 #include <linux/notifier.h>
@@ -40,6 +41,7 @@
 #include <linux/ctype.h>
 #include <linux/reboot.h>
 #include <linux/topology.h>
+#include <linux/ftrace.h>
 
 #include <asm/ipl.h>
 #include <asm/uaccess.h>
@@ -54,6 +56,7 @@
 #include <asm/sections.h>
 #include <asm/ebcdic.h>
 #include <asm/compat.h>
+#include <asm/kvm_virtio.h>
 
 long psw_kernel_bits   = (PSW_BASE_BITS | PSW_MASK_DAT | PSW_ASC_PRIMARY |
                           PSW_MASK_MCHECK | PSW_DEFAULT_KEY);
@@ -71,15 +74,25 @@ EXPORT_SYMBOL(uaccess);
  * Machine setup..
  */
 unsigned int console_mode = 0;
+EXPORT_SYMBOL(console_mode);
+
 unsigned int console_devno = -1;
+EXPORT_SYMBOL(console_devno);
+
 unsigned int console_irq = -1;
-unsigned long machine_flags = 0;
+EXPORT_SYMBOL(console_irq);
+
 unsigned long elf_hwcap = 0;
 char elf_platform[ELF_PLATFORM_SIZE];
 
-struct mem_chunk __meminitdata memory_chunk[MEMORY_CHUNKS];
-volatile int __cpu_logical_map[NR_CPUS]; /* logical cpu to cpu address */
-static unsigned long __initdata memory_end;
+struct mem_chunk __initdata memory_chunk[MEMORY_CHUNKS];
+
+int __initdata memory_end_set;
+unsigned long __initdata memory_end;
+
+/* An array with a pointer to the lowcore of every CPU. */
+struct _lowcore *lowcore_ptr[NR_CPUS];
+EXPORT_SYMBOL(lowcore_ptr);
 
 /*
  * This is set up by the setup-routine at boot-time
@@ -104,24 +117,14 @@ static struct resource data_resource = {
  */
 void __cpuinit cpu_init(void)
 {
-        int addr = hard_smp_processor_id();
-
         /*
          * Store processor id in lowcore (used e.g. in timer_interrupt)
          */
-       get_cpu_id(&S390_lowcore.cpu_data.cpu_id);
-        S390_lowcore.cpu_data.cpu_addr = addr;
-
-        /*
-         * Force FPU initialization:
-         */
-        clear_thread_flag(TIF_USEDFPU);
-        clear_used_math();
+       get_cpu_id(&S390_lowcore.cpu_id);
 
        atomic_inc(&init_mm.mm_count);
        current->active_mm = &init_mm;
-        if (current->mm)
-                BUG();
+       BUG_ON(current->mm);
         enter_lazy_tlb(&init_mm, current);
 }
 
@@ -143,6 +146,16 @@ static int __init condev_setup(char *str)
 
 __setup("condev=", condev_setup);
 
+static void __init set_preferred_console(void)
+{
+       if (MACHINE_IS_KVM)
+               add_preferred_console("hvc", 0, NULL);
+       else if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP)
+               add_preferred_console("ttyS", 0, NULL);
+       else if (CONSOLE_IS_3270)
+               add_preferred_console("tty3270", 0, NULL);
+}
+
 static int __init conmode_setup(char *str)
 {
 #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
@@ -157,6 +170,7 @@ static int __init conmode_setup(char *str)
        if (strncmp(str, "3270", 5) == 0)
                SET_CONSOLE_3270;
 #endif
+       set_preferred_console();
         return 1;
 }
 
@@ -205,12 +219,6 @@ static void __init conmode_default(void)
                        SET_CONSOLE_SCLP;
 #endif
                }
-        } else if (MACHINE_IS_P390) {
-#if defined(CONFIG_TN3215_CONSOLE)
-               SET_CONSOLE_3215;
-#elif defined(CONFIG_TN3270_CONSOLE)
-               SET_CONSOLE_3270;
-#endif
        } else {
 #if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
                SET_CONSOLE_SCLP;
@@ -218,21 +226,20 @@ static void __init conmode_default(void)
        }
 }
 
-#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
+#ifdef CONFIG_ZFCPDUMP
 static void __init setup_zfcpdump(unsigned int console_devno)
 {
-       static char str[64];
+       static char str[41];
 
        if (ipl_info.type != IPL_TYPE_FCP_DUMP)
                return;
        if (console_devno != -1)
-               sprintf(str, "cio_ignore=all,!0.0.%04x,!0.0.%04x",
+               sprintf(str, " cio_ignore=all,!0.0.%04x,!0.0.%04x",
                        ipl_info.data.fcp.dev_id.devno, console_devno);
        else
-               sprintf(str, "cio_ignore=all,!0.0.%04x",
+               sprintf(str, " cio_ignore=all,!0.0.%04x",
                        ipl_info.data.fcp.dev_id.devno);
-       strcat(COMMAND_LINE, " ");
-       strcat(COMMAND_LINE, str);
+       strcat(boot_command_line, str);
        console_loglevel = 2;
 }
 #else
@@ -285,46 +292,16 @@ void (*pm_power_off)(void) = machine_power_off;
 static int __init early_parse_mem(char *p)
 {
        memory_end = memparse(p, &p);
+       memory_end_set = 1;
        return 0;
 }
 early_param("mem", early_parse_mem);
 
-/*
- * "ipldelay=XXX[sm]" sets ipl delay in seconds or minutes
- */
-static int __init early_parse_ipldelay(char *p)
-{
-       unsigned long delay = 0;
-
-       delay = simple_strtoul(p, &p, 0);
+unsigned int user_mode = HOME_SPACE_MODE;
+EXPORT_SYMBOL_GPL(user_mode);
 
-       switch (*p) {
-       case 's':
-       case 'S':
-               delay *= 1000000;
-               break;
-       case 'm':
-       case 'M':
-               delay *= 60 * 1000000;
-       }
-
-       /* now wait for the requested amount of time */
-       udelay(delay);
-
-       return 0;
-}
-early_param("ipldelay", early_parse_ipldelay);
-
-#ifdef CONFIG_S390_SWITCH_AMODE
-#ifdef CONFIG_PGSTE
-unsigned int switch_amode = 1;
-#else
-unsigned int switch_amode = 0;
-#endif
-EXPORT_SYMBOL_GPL(switch_amode);
-
-static void set_amode_and_uaccess(unsigned long user_amode,
-                                 unsigned long user32_amode)
+static int set_amode_and_uaccess(unsigned long user_amode,
+                                unsigned long user32_amode)
 {
        psw_user_bits = PSW_BASE_BITS | PSW_MASK_DAT | user_amode |
                        PSW_MASK_IO | PSW_MASK_EXT | PSW_MASK_MCHECK |
@@ -341,11 +318,11 @@ static void set_amode_and_uaccess(unsigned long user_amode,
                          PSW_MASK_MCHECK | PSW_DEFAULT_KEY;
 
        if (MACHINE_HAS_MVCOS) {
-               printk("mvcos available.\n");
                memcpy(&uaccess, &uaccess_mvcos_switch, sizeof(uaccess));
+               return 1;
        } else {
-               printk("mvcos not available.\n");
                memcpy(&uaccess, &uaccess_pt, sizeof(uaccess));
+               return 0;
        }
 }
 
@@ -354,22 +331,29 @@ static void set_amode_and_uaccess(unsigned long user_amode,
  */
 static int __init early_parse_switch_amode(char *p)
 {
-       switch_amode = 1;
+       if (user_mode != SECONDARY_SPACE_MODE)
+               user_mode = PRIMARY_SPACE_MODE;
        return 0;
 }
 early_param("switch_amode", early_parse_switch_amode);
 
-#else /* CONFIG_S390_SWITCH_AMODE */
-static inline void set_amode_and_uaccess(unsigned long user_amode,
-                                        unsigned long user32_amode)
+static int __init early_parse_user_mode(char *p)
 {
+       if (p && strcmp(p, "primary") == 0)
+               user_mode = PRIMARY_SPACE_MODE;
+#ifdef CONFIG_S390_EXEC_PROTECT
+       else if (p && strcmp(p, "secondary") == 0)
+               user_mode = SECONDARY_SPACE_MODE;
+#endif
+       else if (!p || strcmp(p, "home") == 0)
+               user_mode = HOME_SPACE_MODE;
+       else
+               return 1;
+       return 0;
 }
-#endif /* CONFIG_S390_SWITCH_AMODE */
+early_param("user_mode", early_parse_user_mode);
 
 #ifdef CONFIG_S390_EXEC_PROTECT
-unsigned int s390_noexec = 0;
-EXPORT_SYMBOL_GPL(s390_noexec);
-
 /*
  * Enable execute protection?
  */
@@ -377,8 +361,7 @@ static int __init early_parse_noexec(char *p)
 {
        if (!strncmp(p, "off", 3))
                return 0;
-       switch_amode = 1;
-       s390_noexec = 1;
+       user_mode = SECONDARY_SPACE_MODE;
        return 0;
 }
 early_param("noexec", early_parse_noexec);
@@ -386,12 +369,21 @@ early_param("noexec", early_parse_noexec);
 
 static void setup_addressing_mode(void)
 {
-       if (s390_noexec) {
-               printk("S390 execute protection active, ");
-               set_amode_and_uaccess(PSW_ASC_SECONDARY, PSW32_ASC_SECONDARY);
-       } else if (switch_amode) {
-               printk("S390 address spaces switched, ");
-               set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY);
+       if (user_mode == SECONDARY_SPACE_MODE) {
+               if (set_amode_and_uaccess(PSW_ASC_SECONDARY,
+                                         PSW32_ASC_SECONDARY))
+                       pr_info("Execute protection active, "
+                               "mvcos available\n");
+               else
+                       pr_info("Execute protection active, "
+                               "mvcos not available\n");
+       } else if (user_mode == PRIMARY_SPACE_MODE) {
+               if (set_amode_and_uaccess(PSW_ASC_PRIMARY, PSW32_ASC_PRIMARY))
+                       pr_info("Address spaces switched, "
+                               "mvcos available\n");
+               else
+                       pr_info("Address spaces switched, "
+                               "mvcos not available\n");
        }
 #ifdef CONFIG_TRACE_IRQFLAGS
        sysc_restore_trace_psw.mask = psw_kernel_bits & ~PSW_MASK_MCHECK;
@@ -403,19 +395,16 @@ static void __init
 setup_lowcore(void)
 {
        struct _lowcore *lc;
-       int lc_pages;
 
        /*
         * Setup lowcore for boot cpu
         */
-       lc_pages = sizeof(void *) == 8 ? 2 : 1;
-       lc = (struct _lowcore *)
-               __alloc_bootmem(lc_pages * PAGE_SIZE, lc_pages * PAGE_SIZE, 0);
-       memset(lc, 0, lc_pages * PAGE_SIZE);
+       BUILD_BUG_ON(sizeof(struct _lowcore) != LC_PAGES * 4096);
+       lc = __alloc_bootmem_low(LC_PAGES * PAGE_SIZE, LC_PAGES * PAGE_SIZE, 0);
        lc->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY;
        lc->restart_psw.addr =
                PSW_ADDR_AMODE | (unsigned long) restart_int_handler;
-       if (switch_amode)
+       if (user_mode != HOME_SPACE_MODE)
                lc->restart_psw.mask |= PSW_ASC_HOME;
        lc->external_new_psw.mask = psw_kernel_bits;
        lc->external_new_psw.addr =
@@ -431,7 +420,6 @@ setup_lowcore(void)
                PSW_ADDR_AMODE | (unsigned long) mcck_int_handler;
        lc->io_new_psw.mask = psw_kernel_bits;
        lc->io_new_psw.addr = PSW_ADDR_AMODE | (unsigned long) io_int_handler;
-       lc->ipl_device = S390_lowcore.ipl_device;
        lc->clock_comparator = -1ULL;
        lc->kernel_stack = ((unsigned long) &init_thread_union) + THREAD_SIZE;
        lc->async_stack = (unsigned long)
@@ -440,15 +428,28 @@ setup_lowcore(void)
                __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0) + PAGE_SIZE;
        lc->current_task = (unsigned long) init_thread_union.thread_info.task;
        lc->thread_info = (unsigned long) &init_thread_union;
+       lc->machine_flags = S390_lowcore.machine_flags;
 #ifndef CONFIG_64BIT
        if (MACHINE_HAS_IEEE) {
                lc->extended_save_area_addr = (__u32)
-                       __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, 0);
+                       __alloc_bootmem_low(PAGE_SIZE, PAGE_SIZE, 0);
                /* enable extended save area */
                __ctl_set_bit(14, 29);
        }
+#else
+       lc->vdso_per_cpu_data = (unsigned long) &lc->paste[0];
 #endif
+       lc->sync_enter_timer = S390_lowcore.sync_enter_timer;
+       lc->async_enter_timer = S390_lowcore.async_enter_timer;
+       lc->exit_timer = S390_lowcore.exit_timer;
+       lc->user_timer = S390_lowcore.user_timer;
+       lc->system_timer = S390_lowcore.system_timer;
+       lc->steal_timer = S390_lowcore.steal_timer;
+       lc->last_update_timer = S390_lowcore.last_update_timer;
+       lc->last_update_clock = S390_lowcore.last_update_clock;
+       lc->ftrace_func = S390_lowcore.ftrace_func;
        set_prefix((u32)(unsigned long) lc);
+       lowcore_ptr[0] = lc;
 }
 
 static void __init
@@ -525,9 +526,11 @@ static void __init setup_memory_end(void)
        unsigned long max_mem;
        int i;
 
-#if defined(CONFIG_ZFCPDUMP) || defined(CONFIG_ZFCPDUMP_MODULE)
-       if (ipl_info.type == IPL_TYPE_FCP_DUMP)
+#ifdef CONFIG_ZFCPDUMP
+       if (ipl_info.type == IPL_TYPE_FCP_DUMP) {
                memory_end = ZFCPDUMP_HSA_SIZE;
+               memory_end_set = 1;
+       }
 #endif
        memory_size = 0;
        memory_end &= PAGE_MASK;
@@ -604,15 +607,15 @@ setup_memory(void)
                        start = PFN_PHYS(start_pfn) + bmap_size + PAGE_SIZE;
 
                        if (start + INITRD_SIZE > memory_end) {
-                               printk("initrd extends beyond end of memory "
-                                      "(0x%08lx > 0x%08lx)\n"
+                               pr_err("initrd extends beyond end of "
+                                      "memory (0x%08lx > 0x%08lx) "
                                       "disabling initrd\n",
                                       start + INITRD_SIZE, memory_end);
                                INITRD_START = INITRD_SIZE = 0;
                        } else {
-                               printk("Moving initrd (0x%08lx -> 0x%08lx, "
-                                      "size: %ld)\n",
-                                      INITRD_START, start, INITRD_SIZE);
+                               pr_info("Moving initrd (0x%08lx -> "
+                                       "0x%08lx, size: %ld)\n",
+                                       INITRD_START, start, INITRD_SIZE);
                                memmove((void *) start, (void *) INITRD_START,
                                        INITRD_SIZE);
                                INITRD_START = start;
@@ -636,13 +639,13 @@ setup_memory(void)
                if (memory_chunk[i].type != CHUNK_READ_WRITE)
                        continue;
                start_chunk = PFN_DOWN(memory_chunk[i].addr);
-               end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size) - 1;
+               end_chunk = start_chunk + PFN_DOWN(memory_chunk[i].size);
                end_chunk = min(end_chunk, end_pfn);
                if (start_chunk >= end_chunk)
                        continue;
                add_active_range(0, start_chunk, end_chunk);
                pfn = max(start_chunk, start_pfn);
-               for (; pfn <= end_chunk; pfn++)
+               for (; pfn < end_chunk; pfn++)
                        page_set_storage_key(PFN_PHYS(pfn), PAGE_DEFAULT_KEY);
        }
 
@@ -674,8 +677,9 @@ setup_memory(void)
                        initrd_start = INITRD_START;
                        initrd_end = initrd_start + INITRD_SIZE;
                } else {
-                       printk("initrd extends beyond end of memory "
-                              "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
+                       pr_err("initrd extends beyond end of "
+                              "memory (0x%08lx > 0x%08lx) "
+                              "disabling initrd\n",
                               initrd_start + INITRD_SIZE, memory_end);
                        initrd_start = initrd_end = 0;
                }
@@ -683,30 +687,12 @@ setup_memory(void)
 #endif
 }
 
-static int __init __stfle(unsigned long long *list, int doublewords)
-{
-       typedef struct { unsigned long long _[doublewords]; } addrtype;
-       register unsigned long __nr asm("0") = doublewords - 1;
-
-       asm volatile(".insn s,0xb2b00000,%0" /* stfle */
-                    : "=m" (*(addrtype *) list), "+d" (__nr) : : "cc");
-       return __nr + 1;
-}
-
-int __init stfle(unsigned long long *list, int doublewords)
-{
-       if (!(stfl() & (1UL << 24)))
-               return -EOPNOTSUPP;
-       return __stfle(list, doublewords);
-}
-
 /*
  * Setup hardware capabilities.
  */
 static void __init setup_hwcaps(void)
 {
        static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 };
-       struct cpuinfo_S390 *cpuinfo = &S390_lowcore.cpu_data;
        unsigned long long facility_list_extended;
        unsigned int facility_list;
        int i;
@@ -722,15 +708,22 @@ static void __init setup_hwcaps(void)
         *   Bit 17: the message-security assist is installed
         *   Bit 19: the long-displacement facility is installed
         *   Bit 21: the extended-immediate facility is installed
+        *   Bit 22: extended-translation facility 3 is installed
+        *   Bit 30: extended-translation facility 3 enhancement facility
         * These get translated to:
         *   HWCAP_S390_ESAN3 bit 0, HWCAP_S390_ZARCH bit 1,
         *   HWCAP_S390_STFLE bit 2, HWCAP_S390_MSA bit 3,
-        *   HWCAP_S390_LDISP bit 4, and HWCAP_S390_EIMM bit 5.
+        *   HWCAP_S390_LDISP bit 4, HWCAP_S390_EIMM bit 5 and
+        *   HWCAP_S390_ETF3EH bit 8 (22 && 30).
         */
        for (i = 0; i < 6; i++)
                if (facility_list & (1UL << (31 - stfl_bits[i])))
                        elf_hwcap |= 1UL << i;
 
+       if ((facility_list & (1UL << (31 - 22)))
+           && (facility_list & (1UL << (31 - 30))))
+               elf_hwcap |= HWCAP_S390_ETF3EH;
+
        /*
         * Check for additional facilities with store-facility-list-extended.
         * stfle stores doublewords (8 byte) with bit 1ULL<<63 as bit 0
@@ -739,17 +732,31 @@ static void __init setup_hwcaps(void)
         * How many facility words are stored depends on the number of
         * doublewords passed to the instruction. The additional facilites
         * are:
-        *   Bit 43: decimal floating point facility is installed
+        *   Bit 42: decimal floating point facility is installed
+        *   Bit 44: perform floating point operation facility is installed
         * translated to:
-        *   HWCAP_S390_DFP bit 6.
+        *   HWCAP_S390_DFP bit 6 (42 && 44).
         */
        if ((elf_hwcap & (1UL << 2)) &&
            __stfle(&facility_list_extended, 1) > 0) {
-               if (facility_list_extended & (1ULL << (64 - 43)))
-                       elf_hwcap |= 1UL << 6;
+               if ((facility_list_extended & (1ULL << (63 - 42)))
+                   && (facility_list_extended & (1ULL << (63 - 44))))
+                       elf_hwcap |= HWCAP_S390_DFP;
        }
 
-       switch (cpuinfo->cpu_id.machine) {
+       /*
+        * Huge page support HWCAP_S390_HPAGE is bit 7.
+        */
+       if (MACHINE_HAS_HPAGE)
+               elf_hwcap |= HWCAP_S390_HPAGE;
+
+       /*
+        * 64-bit register support for 31-bit processes
+        * HWCAP_S390_HIGH_GPRS is bit 9.
+        */
+       elf_hwcap |= HWCAP_S390_HIGH_GPRS;
+
+       switch (S390_lowcore.cpu_id.machine) {
        case 0x9672:
 #if !defined(CONFIG_64BIT)
        default:        /* Use "g5" as default for 31 bit kernels. */
@@ -768,8 +775,13 @@ static void __init setup_hwcaps(void)
                strcpy(elf_platform, "z990");
                break;
        case 0x2094:
+       case 0x2096:
                strcpy(elf_platform, "z9-109");
                break;
+       case 0x2097:
+       case 0x2098:
+               strcpy(elf_platform, "z10");
+               break;
        }
 }
 
@@ -785,27 +797,30 @@ setup_arch(char **cmdline_p)
          * print what head.S has found out about the machine
          */
 #ifndef CONFIG_64BIT
-       printk((MACHINE_IS_VM) ?
-              "We are running under VM (31 bit mode)\n" :
-              "We are running native (31 bit mode)\n");
-       printk((MACHINE_HAS_IEEE) ?
-              "This machine has an IEEE fpu\n" :
-              "This machine has no IEEE fpu\n");
+       if (MACHINE_IS_VM)
+               pr_info("Linux is running as a z/VM "
+                       "guest operating system in 31-bit mode\n");
+       else if (MACHINE_IS_LPAR)
+               pr_info("Linux is running natively in 31-bit mode\n");
+       if (MACHINE_HAS_IEEE)
+               pr_info("The hardware system has IEEE compatible "
+                       "floating point units\n");
+       else
+               pr_info("The hardware system has no IEEE compatible "
+                       "floating point units\n");
 #else /* CONFIG_64BIT */
        if (MACHINE_IS_VM)
-               printk("We are running under VM (64 bit mode)\n");
-       else if (MACHINE_IS_KVM) {
-               printk("We are running under KVM (64 bit mode)\n");
-               add_preferred_console("ttyS", 1, NULL);
-       } else
-               printk("We are running native (64 bit mode)\n");
+               pr_info("Linux is running as a z/VM "
+                       "guest operating system in 64-bit mode\n");
+       else if (MACHINE_IS_KVM)
+               pr_info("Linux is running under KVM in 64-bit mode\n");
+       else if (MACHINE_IS_LPAR)
+               pr_info("Linux is running natively in 64-bit mode\n");
 #endif /* CONFIG_64BIT */
 
-       /* Save unparsed command line copy for /proc/cmdline */
-       strlcpy(boot_command_line, COMMAND_LINE, COMMAND_LINE_SIZE);
-
-       *cmdline_p = COMMAND_LINE;
-       *(*cmdline_p + COMMAND_LINE_SIZE - 1) = '\0';
+       /* Have one command line that is parsed and saved in /proc/cmdline */
+       /* boot_command_line has been already set up in early.c */
+       *cmdline_p = boot_command_line;
 
         ROOT_DEV = Root_RAM0;
 
@@ -829,7 +844,6 @@ setup_arch(char **cmdline_p)
        setup_lowcore();
 
         cpu_init();
-        __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr;
        s390_init_cpu_topology();
 
        /*
@@ -844,93 +858,8 @@ setup_arch(char **cmdline_p)
 
         /* Setup default console */
        conmode_default();
+       set_preferred_console();
 
        /* Setup zfcpdump support */
        setup_zfcpdump(console_devno);
 }
-
-void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo)
-{
-   printk(KERN_INFO "cpu %d "
-#ifdef CONFIG_SMP
-           "phys_idx=%d "
-#endif
-           "vers=%02X ident=%06X machine=%04X unused=%04X\n",
-           cpuinfo->cpu_nr,
-#ifdef CONFIG_SMP
-           cpuinfo->cpu_addr,
-#endif
-           cpuinfo->cpu_id.version,
-           cpuinfo->cpu_id.ident,
-           cpuinfo->cpu_id.machine,
-           cpuinfo->cpu_id.unused);
-}
-
-/*
- * show_cpuinfo - Get information on one CPU for use by procfs.
- */
-
-static int show_cpuinfo(struct seq_file *m, void *v)
-{
-       static const char *hwcap_str[7] = {
-               "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp"
-       };
-        struct cpuinfo_S390 *cpuinfo;
-       unsigned long n = (unsigned long) v - 1;
-       int i;
-
-       s390_adjust_jiffies();
-       preempt_disable();
-       if (!n) {
-               seq_printf(m, "vendor_id       : IBM/S390\n"
-                              "# processors    : %i\n"
-                              "bogomips per cpu: %lu.%02lu\n",
-                              num_online_cpus(), loops_per_jiffy/(500000/HZ),
-                              (loops_per_jiffy/(5000/HZ))%100);
-               seq_puts(m, "features\t: ");
-               for (i = 0; i < 7; i++)
-                       if (hwcap_str[i] && (elf_hwcap & (1UL << i)))
-                               seq_printf(m, "%s ", hwcap_str[i]);
-               seq_puts(m, "\n");
-       }
-
-       if (cpu_online(n)) {
-#ifdef CONFIG_SMP
-               if (smp_processor_id() == n)
-                       cpuinfo = &S390_lowcore.cpu_data;
-               else
-                       cpuinfo = &lowcore_ptr[n]->cpu_data;
-#else
-               cpuinfo = &S390_lowcore.cpu_data;
-#endif
-               seq_printf(m, "processor %li: "
-                              "version = %02X,  "
-                              "identification = %06X,  "
-                              "machine = %04X\n",
-                              n, cpuinfo->cpu_id.version,
-                              cpuinfo->cpu_id.ident,
-                              cpuinfo->cpu_id.machine);
-       }
-       preempt_enable();
-        return 0;
-}
-
-static void *c_start(struct seq_file *m, loff_t *pos)
-{
-       return *pos < NR_CPUS ? (void *)((unsigned long) *pos + 1) : NULL;
-}
-static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-{
-       ++*pos;
-       return c_start(m, pos);
-}
-static void c_stop(struct seq_file *m, void *v)
-{
-}
-const struct seq_operations cpuinfo_op = {
-       .start  = c_start,
-       .next   = c_next,
-       .stop   = c_stop,
-       .show   = show_cpuinfo,
-};
-