Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=36de48de85bdb9bc8c35c1eb513737c187d70a46
Commit:     36de48de85bdb9bc8c35c1eb513737c187d70a46
Parent:     d388d6853f1b584b8606cb3f2f9f9e4fa2e52258
Author:     Maciej W. Rozycki <[EMAIL PROTECTED]>
AuthorDate: Tue Jun 5 11:45:07 2007 +0100
Committer:  Ralf Baechle <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 17:33:00 2007 +0100

    [MIPS] DECstation: Optimised early printk()
    
     This is an optimised implementation of early printk() for the DECstation.
    After the recent conversion to a MIPS-specific generic routine using a
    character-by-character output the performance dropped significantly.
    This change reverts to the previous speed -- even at 9600 bps of the
    serial console the difference is visible with a naked eye; I presume for a
    framebuffer it is even worse (it may depend on exactly which one is used
    though).
    
     Additionally the change includes a fix for a problem that the old
    implementation had -- the format used would not actually limit the length
    of the string output.  This new implementation uses a local buffer to deal
    with it -- even with this additional copying it is much faster than the
    generic function.
    
     Plus this driver is registered much earlier than the generic one,
    allowing one to see critical messages, such as one about an incorrect CPU
    setting used, that are produced beforehand. :-)
    
    Signed-off-by: Maciej W. Rozycki <[EMAIL PROTECTED]>
    Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>
---
 arch/mips/Kconfig            |    1 -
 arch/mips/dec/prom/console.c |   32 ++++++++++++++++++++++++++------
 arch/mips/dec/prom/init.c    |    3 +++
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 7080e71..beff105 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -64,7 +64,6 @@ config MACH_DECSTATION
        select BOOT_ELF32
        select DMA_NONCOHERENT
        select NO_IOPORT
-       select SYS_HAS_EARLY_PRINTK
        select IRQ_CPU
        select SYS_HAS_CPU_R3000
        select SYS_HAS_CPU_R4X00
diff --git a/arch/mips/dec/prom/console.c b/arch/mips/dec/prom/console.c
index 65419bf..078e1a1 100644
--- a/arch/mips/dec/prom/console.c
+++ b/arch/mips/dec/prom/console.c
@@ -3,7 +3,7 @@
  *
  *     DECstation PROM-based early console support.
  *
- *     Copyright (C) 2004  Maciej W. Rozycki
+ *     Copyright (C) 2004, 2007  Maciej W. Rozycki
  *
  *     This program is free software; you can redistribute it and/or
  *     modify it under the terms of the GNU General Public License
@@ -13,15 +13,35 @@
 #include <linux/console.h>
 #include <linux/init.h>
 #include <linux/kernel.h>
+#include <linux/string.h>
 
 #include <asm/dec/prom.h>
 
-void prom_putchar(char c)
+static void __init prom_console_write(struct console *con, const char *s,
+                                     unsigned int c)
 {
-       char s[2];
+       char buf[81];
+       unsigned int chunk = sizeof(buf) - 1;
 
-       s[0] = c;
-       s[1] = '\0';
+       while (c > 0) {
+               if (chunk > c)
+                       chunk = c;
+               memcpy(buf, s, chunk);
+               buf[chunk] = '\0';
+               prom_printf("%s", buf);
+               s += chunk;
+               c -= chunk;
+       }
+}
+
+static struct console promcons __initdata = {
+       .name   = "prom",
+       .write  = prom_console_write,
+       .flags  = CON_BOOT | CON_PRINTBUFFER,
+       .index  = -1,
+};
 
-       prom_printf( s);
+void __init register_prom_console(void)
+{
+       register_console(&promcons);
 }
diff --git a/arch/mips/dec/prom/init.c b/arch/mips/dec/prom/init.c
index 4828cac..808c182 100644
--- a/arch/mips/dec/prom/init.c
+++ b/arch/mips/dec/prom/init.c
@@ -103,6 +103,9 @@ void __init prom_init(void)
        if (prom_is_rex(magic))
                rex_clear_cache();
 
+       /* Register the early console.  */
+       register_prom_console();
+
        /* Were we compiled with the right CPU option? */
 #if defined(CONFIG_CPU_R3000)
        if ((current_cpu_data.cputype == CPU_R4000SC) ||
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to