Skip to content

Commit

Permalink
[MIPS] DECstation: Optimised early printk()
Browse files Browse the repository at this point in the history
 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 <macro@linux-mips.org>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
  • Loading branch information
Maciej W. Rozycki authored and Ralf Baechle committed Jul 10, 2007
1 parent d388d68 commit 36de48d
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 7 deletions.
1 change: 0 additions & 1 deletion arch/mips/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
32 changes: 26 additions & 6 deletions arch/mips/dec/prom/console.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}
3 changes: 3 additions & 0 deletions arch/mips/dec/prom/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) ||
Expand Down

0 comments on commit 36de48d

Please sign in to comment.