microblaze: Get early printk console earlier
authorMichal Simek <monstr@monstr.eu>
Mon, 4 Apr 2011 13:45:06 +0000 (15:45 +0200)
committerMichal Simek <monstr@monstr.eu>
Mon, 25 Jul 2011 07:23:47 +0000 (09:23 +0200)
1. Register early console as standard console
2. Enable CON_BOOT console flag to ensure auto-unregistering by the kernel
3. remap_early_printk function remap physical console baseaddr to virtual space

Usage specific function for console remap is done after memory initialization
with IRQ turn off that's why there is not necessary to protect it.

The reason for remapping is that the kernel use TLB 63 for 1:1 address mapping
to be able to use console in very early boot-up phase. But allocating one TLB
just for console caused performance degression that's why ioremaps create new
mapping and TLB 63 is automatically released and ready to use.

Signed-off-by: Michal Simek <monstr@monstr.eu>
CC: Russell King <linux@arm.linux.org.uk>
CC: Ralf Baechle <ralf@linux-mips.org>
CC: Ingo Molnar <mingo@redhat.com>
CC: Alan Cox <alan@linux.intel.com>
CC: <linux-serial@vger.kernel.org>
CC: Arnd Bergmann <arnd@arndb.de>
arch/microblaze/include/asm/setup.h
arch/microblaze/kernel/early_printk.c
arch/microblaze/kernel/setup.c

index 8f3968971e4eef6334b5f014fd1d0aef1cf27537..904e5ef6a11b2e958f0b33c29b4f7d3794cecb38 100644 (file)
@@ -23,6 +23,7 @@ extern char cmd_line[COMMAND_LINE_SIZE];
 void early_printk(const char *fmt, ...);
 
 int setup_early_printk(char *opt);
+void remap_early_printk(void);
 void disable_early_printk(void);
 
 #if defined(CONFIG_EARLY_PRINTK)
index c3616a080ebfcad71bbc9b950b40ba64e6da8218..8f8384e98bf739b331b6839771998930df68dec4 100644 (file)
@@ -60,7 +60,7 @@ static void early_printk_uartlite_write(struct console *unused,
 static struct console early_serial_uartlite_console = {
        .name = "earlyser",
        .write = early_printk_uartlite_write,
-       .flags = CON_PRINTBUFFER,
+       .flags = CON_PRINTBUFFER | CON_BOOT,
        .index = -1,
 };
 #endif /* CONFIG_SERIAL_UARTLITE_CONSOLE */
@@ -104,7 +104,7 @@ static void early_printk_uart16550_write(struct console *unused,
 static struct console early_serial_uart16550_console = {
        .name = "earlyser",
        .write = early_printk_uart16550_write,
-       .flags = CON_PRINTBUFFER,
+       .flags = CON_PRINTBUFFER | CON_BOOT,
        .index = -1,
 };
 #endif /* CONFIG_SERIAL_8250_CONSOLE */
@@ -141,7 +141,7 @@ int __init setup_early_printk(char *opt)
                early_printk("early_printk_console is enabled at 0x%08x\n",
                                                        base_addr);
 
-               /* register_console(early_console); */
+               register_console(early_console);
 
                return 0;
        }
@@ -160,7 +160,7 @@ int __init setup_early_printk(char *opt)
                early_printk("early_printk_console is enabled at 0x%08x\n",
                                                        base_addr);
 
-               /* register_console(early_console); */
+               register_console(early_console);
 
                return 0;
        }
@@ -169,6 +169,18 @@ int __init setup_early_printk(char *opt)
        return 1;
 }
 
+/* Remap early console to virtual address and do not allocate one TLB
+ * only for early console because of performance degression */
+void __init remap_early_printk(void)
+{
+       if (!early_console_initialized || !early_console)
+               return;
+       printk(KERN_INFO "early_printk_console remaping from 0x%x to ",
+                                                               base_addr);
+       base_addr = (u32) ioremap(base_addr, PAGE_SIZE);
+       printk(KERN_CONT "0x%x\n", base_addr);
+}
+
 void __init disable_early_printk(void)
 {
        if (!early_console_initialized || !early_console)
index 8e2c09b7ff2679db8ad0ce903519cced7a3ec7f8..0e654a12d37e18136caa965bfbbe729f87349d60 100644 (file)
@@ -59,6 +59,11 @@ void __init setup_arch(char **cmdline_p)
 
        setup_memory();
 
+#ifdef CONFIG_EARLY_PRINTK
+       /* remap early console to virtual address */
+       remap_early_printk();
+#endif
+
        xilinx_pci_init();
 
 #if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER)