Skip to content

Commit

Permalink
early_printk: consolidate random copies of identical code
Browse files Browse the repository at this point in the history
The early console implementations are the same all over the place.  Move
the print function to kernel/printk and get rid of the copies.

[akpm@linux-foundation.org: arch/mips/kernel/early_printk.c needs kernel.h for va_list]
[paul.gortmaker@windriver.com: sh4: make the bios early console support depend on EARLY_PRINTK]
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Russell King <linux@arm.linux.org.uk>
Acked-by: Mike Frysinger <vapier@gentoo.org>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Richard Weinberger <richard@nod.at>
Reviewed-by: Ingo Molnar <mingo@kernel.org>
Tested-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Thomas Gleixner authored and Linus Torvalds committed Apr 30, 2013
1 parent 07c65f4 commit d0380e6
Show file tree
Hide file tree
Showing 13 changed files with 63 additions and 109 deletions.
17 changes: 3 additions & 14 deletions arch/arm/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,28 +29,17 @@ static void early_console_write(struct console *con, const char *s, unsigned n)
early_write(s, n);
}

static struct console early_console = {
static struct console early_console_dev = {
.name = "earlycon",
.write = early_console_write,
.flags = CON_PRINTBUFFER | CON_BOOT,
.index = -1,
};

asmlinkage void early_printk(const char *fmt, ...)
{
char buf[512];
int n;
va_list ap;

va_start(ap, fmt);
n = vscnprintf(buf, sizeof(buf), fmt, ap);
early_write(buf, n);
va_end(ap);
}

static int __init setup_early_printk(char *buf)
{
register_console(&early_console);
early_console = &early_console_dev;
register_console(&early_console_dev);
return 0;
}

Expand Down
2 changes: 0 additions & 2 deletions arch/blackfin/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ extern struct console *bfin_earlyserial_init(unsigned int port,
extern struct console *bfin_jc_early_init(void);
#endif

static struct console *early_console;

/* Default console */
#define DEFAULT_PORT 0
#define DEFAULT_CFLAG CS8|B57600
Expand Down
26 changes: 4 additions & 22 deletions arch/microblaze/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include <asm/setup.h>
#include <asm/prom.h>

static u32 early_console_initialized;
static u32 base_addr;

#ifdef CONFIG_SERIAL_UARTLITE_CONSOLE
Expand Down Expand Up @@ -109,27 +108,11 @@ static struct console early_serial_uart16550_console = {
};
#endif /* CONFIG_SERIAL_8250_CONSOLE */

static struct console *early_console;

void early_printk(const char *fmt, ...)
{
char buf[512];
int n;
va_list ap;

if (early_console_initialized) {
va_start(ap, fmt);
n = vscnprintf(buf, 512, fmt, ap);
early_console->write(early_console, buf, n);
va_end(ap);
}
}

int __init setup_early_printk(char *opt)
{
int version = 0;

if (early_console_initialized)
if (early_console)
return 1;

base_addr = of_early_console(&version);
Expand Down Expand Up @@ -159,7 +142,6 @@ int __init setup_early_printk(char *opt)
}

register_console(early_console);
early_console_initialized = 1;
return 0;
}
return 1;
Expand All @@ -169,7 +151,7 @@ int __init setup_early_printk(char *opt)
* only for early console because of performance degression */
void __init remap_early_printk(void)
{
if (!early_console_initialized || !early_console)
if (!early_console)
return;
pr_info("early_printk_console remapping from 0x%x to ", base_addr);
base_addr = (u32) ioremap(base_addr, PAGE_SIZE);
Expand All @@ -194,9 +176,9 @@ void __init remap_early_printk(void)

void __init disable_early_printk(void)
{
if (!early_console_initialized || !early_console)
if (!early_console)
return;
pr_warn("disabling early console\n");
unregister_console(early_console);
early_console_initialized = 0;
early_console = NULL;
}
12 changes: 6 additions & 6 deletions arch/mips/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
* Copyright (C) 2007 MIPS Technologies, Inc.
* written by Ralf Baechle (ralf@linux-mips.org)
*/
#include <linux/kernel.h>
#include <linux/console.h>
#include <linux/printk.h>
#include <linux/init.h>

#include <asm/setup.h>
Expand All @@ -24,20 +26,18 @@ static void early_console_write(struct console *con, const char *s, unsigned n)
}
}

static struct console early_console = {
static struct console early_console_prom = {
.name = "early",
.write = early_console_write,
.flags = CON_PRINTBUFFER | CON_BOOT,
.index = -1
};

static int early_console_initialized __initdata;

void __init setup_early_printk(void)
{
if (early_console_initialized)
if (early_console)
return;
early_console_initialized = 1;
early_console = &early_console_prom;

register_console(&early_console);
register_console(&early_console_prom);
}
6 changes: 2 additions & 4 deletions arch/powerpc/kernel/udbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,15 +156,13 @@ static struct console udbg_console = {
.index = 0,
};

static int early_console_initialized;

/*
* Called by setup_system after ppc_md->probe and ppc_md->early_init.
* Call it again after setting udbg_putc in ppc_md->setup_arch.
*/
void __init register_early_udbg_console(void)
{
if (early_console_initialized)
if (early_console)
return;

if (!udbg_putc)
Expand All @@ -174,7 +172,7 @@ void __init register_early_udbg_console(void)
printk(KERN_INFO "early console immortal !\n");
udbg_console.flags &= ~CON_BOOT;
}
early_console_initialized = 1;
early_console = &udbg_console;
register_console(&udbg_console);
}

Expand Down
4 changes: 2 additions & 2 deletions arch/sh/kernel/sh_bios.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ void sh_bios_vbr_reload(void)
);
}

#ifdef CONFIG_EARLY_PRINTK
/*
* Print a string through the BIOS
*/
Expand Down Expand Up @@ -144,8 +145,6 @@ static struct console bios_console = {
.index = -1,
};

static struct console *early_console;

static int __init setup_early_printk(char *buf)
{
int keep_early = 0;
Expand All @@ -170,3 +169,4 @@ static int __init setup_early_printk(char *buf)
return 0;
}
early_param("earlyprintk", setup_early_printk);
#endif
27 changes: 5 additions & 22 deletions arch/tile/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/init.h>
#include <linux/string.h>
#include <linux/irqflags.h>
#include <linux/printk.h>
#include <asm/setup.h>
#include <hv/hypervisor.h>

Expand All @@ -33,25 +34,8 @@ static struct console early_hv_console = {
};

/* Direct interface for emergencies */
static struct console *early_console = &early_hv_console;
static int early_console_initialized;
static int early_console_complete;

static void early_vprintk(const char *fmt, va_list ap)
{
char buf[512];
int n = vscnprintf(buf, sizeof(buf), fmt, ap);
early_console->write(early_console, buf, n);
}

void early_printk(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
early_vprintk(fmt, ap);
va_end(ap);
}

void early_panic(const char *fmt, ...)
{
va_list ap;
Expand All @@ -69,14 +53,13 @@ static int __initdata keep_early;

static int __init setup_early_printk(char *str)
{
if (early_console_initialized)
if (early_console)
return 1;

if (str != NULL && strncmp(str, "keep", 4) == 0)
keep_early = 1;

early_console = &early_hv_console;
early_console_initialized = 1;
register_console(early_console);

return 0;
Expand All @@ -85,20 +68,20 @@ static int __init setup_early_printk(char *str)
void __init disable_early_printk(void)
{
early_console_complete = 1;
if (!early_console_initialized || !early_console)
if (!early_console)
return;
if (!keep_early) {
early_printk("disabling early console\n");
unregister_console(early_console);
early_console_initialized = 0;
early_console = NULL;
} else {
early_printk("keeping early console\n");
}
}

void warn_early_printk(void)
{
if (early_console_complete || early_console_initialized)
if (early_console_complete || early_console)
return;
early_printk("\
Machine shutting down before console output is fully initialized.\n\
Expand Down
8 changes: 5 additions & 3 deletions arch/um/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ static void early_console_write(struct console *con, const char *s, unsigned int
um_early_printk(s, n);
}

static struct console early_console = {
static struct console early_console_dev = {
.name = "earlycon",
.write = early_console_write,
.flags = CON_BOOT,
Expand All @@ -25,8 +25,10 @@ static struct console early_console = {

static int __init setup_early_printk(char *buf)
{
register_console(&early_console);

if (!early_console) {
early_console = &early_console_dev;
register_console(&early_console_dev);
}
return 0;
}

Expand Down
12 changes: 4 additions & 8 deletions arch/unicore32/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,17 @@ static struct console early_ocd_console = {
.index = -1,
};

/* Direct interface for emergencies */
static struct console *early_console = &early_ocd_console;

static int __initdata keep_early;

static int __init setup_early_printk(char *buf)
{
if (!buf)
int keep_early;

if (!buf || early_console)
return 0;

if (strstr(buf, "keep"))
keep_early = 1;

if (!strncmp(buf, "ocd", 3))
early_console = &early_ocd_console;
early_console = &early_ocd_console;

if (keep_early)
early_console->flags &= ~CON_BOOT;
Expand Down
21 changes: 2 additions & 19 deletions arch/x86/kernel/early_printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -169,25 +169,9 @@ static struct console early_serial_console = {
.index = -1,
};

/* Direct interface for emergencies */
static struct console *early_console = &early_vga_console;
static int __initdata early_console_initialized;

asmlinkage void early_printk(const char *fmt, ...)
{
char buf[512];
int n;
va_list ap;

va_start(ap, fmt);
n = vscnprintf(buf, sizeof(buf), fmt, ap);
early_console->write(early_console, buf, n);
va_end(ap);
}

static inline void early_console_register(struct console *con, int keep_early)
{
if (early_console->index != -1) {
if (con->index != -1) {
printk(KERN_CRIT "ERROR: earlyprintk= %s already used\n",
con->name);
return;
Expand All @@ -207,9 +191,8 @@ static int __init setup_early_printk(char *buf)
if (!buf)
return 0;

if (early_console_initialized)
if (early_console)
return 0;
early_console_initialized = 1;

keep = (strstr(buf, "keep") != NULL);

Expand Down
1 change: 1 addition & 0 deletions include/linux/console.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ struct console {
for (con = console_drivers; con != NULL; con = con->next)

extern int console_set_on_cmdline;
extern struct console *early_console;

extern int add_preferred_console(char *name, int idx, char *options);
extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options);
Expand Down
6 changes: 6 additions & 0 deletions include/linux/printk.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,14 @@ int no_printk(const char *fmt, ...)
return 0;
}

#ifdef CONFIG_EARLY_PRINTK
extern asmlinkage __printf(1, 2)
void early_printk(const char *fmt, ...);
void early_vprintk(const char *fmt, va_list ap);
#else
static inline __printf(1, 2) __cold
void early_printk(const char *s, ...) { }
#endif

#ifdef CONFIG_PRINTK
asmlinkage __printf(5, 0)
Expand Down
Loading

0 comments on commit d0380e6

Please sign in to comment.