tile: various console improvements
This change improves and cleans up the tile console. - We enable HVC_IRQ support on tilegx, with the addition of a new Tilera hypervisor API for tilegx to allow a console IPI. If IPI support is not available we fall back to the previous polling mode. - We simplify the earlyprintk code to use CON_BOOT and eliminate some of the other supporting earlyprintk code. - A new tile_console_write() primitive is used to send output to the console and is factored out of the hvc_tile driver. This lets us support a "sim_console" boot argument to allow using simulator hooks to send output to the "console" as a slightly faster alternative to emulating the hardware more directly. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -23,19 +23,24 @@
|
||||
|
||||
static void early_hv_write(struct console *con, const char *s, unsigned n)
|
||||
{
|
||||
hv_console_write((HV_VirtAddr) s, n);
|
||||
tile_console_write(s, n);
|
||||
|
||||
/*
|
||||
* Convert NL to NLCR (close enough to CRNL) during early boot.
|
||||
* We assume newlines are at the ends of strings, which turns out
|
||||
* to be good enough for early boot console output.
|
||||
*/
|
||||
if (n && s[n-1] == '\n')
|
||||
tile_console_write("\r", 1);
|
||||
}
|
||||
|
||||
static struct console early_hv_console = {
|
||||
.name = "earlyhv",
|
||||
.write = early_hv_write,
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.flags = CON_PRINTBUFFER | CON_BOOT,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
/* Direct interface for emergencies */
|
||||
static int early_console_complete;
|
||||
|
||||
void early_panic(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -43,51 +48,21 @@ void early_panic(const char *fmt, ...)
|
||||
va_start(ap, fmt);
|
||||
early_printk("Kernel panic - not syncing: ");
|
||||
early_vprintk(fmt, ap);
|
||||
early_console->write(early_console, "\n", 1);
|
||||
early_printk("\n");
|
||||
va_end(ap);
|
||||
dump_stack();
|
||||
hv_halt();
|
||||
}
|
||||
|
||||
static int __initdata keep_early;
|
||||
|
||||
static int __init setup_early_printk(char *str)
|
||||
{
|
||||
if (early_console)
|
||||
return 1;
|
||||
|
||||
if (str != NULL && strncmp(str, "keep", 4) == 0)
|
||||
keep_early = 1;
|
||||
|
||||
early_console = &early_hv_console;
|
||||
register_console(early_console);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init disable_early_printk(void)
|
||||
{
|
||||
early_console_complete = 1;
|
||||
if (!early_console)
|
||||
return;
|
||||
if (!keep_early) {
|
||||
early_printk("disabling early console\n");
|
||||
unregister_console(early_console);
|
||||
early_console = NULL;
|
||||
} else {
|
||||
early_printk("keeping early console\n");
|
||||
}
|
||||
}
|
||||
|
||||
void warn_early_printk(void)
|
||||
{
|
||||
if (early_console_complete || early_console)
|
||||
return;
|
||||
early_printk("\
|
||||
Machine shutting down before console output is fully initialized.\n\
|
||||
You may wish to reboot and add the option 'earlyprintk' to your\n\
|
||||
boot command line to see any diagnostic early console output.\n\
|
||||
");
|
||||
}
|
||||
|
||||
early_param("earlyprintk", setup_early_printk);
|
||||
|
@@ -56,4 +56,5 @@ hv_inquire_realpa = TEXT_OFFSET + 0x106c0;
|
||||
hv_flush_all = TEXT_OFFSET + 0x106e0;
|
||||
hv_get_ipi_pte = TEXT_OFFSET + 0x10700;
|
||||
hv_set_pte_super_shift = TEXT_OFFSET + 0x10720;
|
||||
hv_glue_internals = TEXT_OFFSET + 0x10740;
|
||||
hv_console_set_ipi = TEXT_OFFSET + 0x107e0;
|
||||
hv_glue_internals = TEXT_OFFSET + 0x10800;
|
||||
|
@@ -27,7 +27,6 @@
|
||||
|
||||
void machine_halt(void)
|
||||
{
|
||||
warn_early_printk();
|
||||
arch_local_irq_disable_all();
|
||||
smp_send_stop();
|
||||
hv_halt();
|
||||
@@ -35,7 +34,6 @@ void machine_halt(void)
|
||||
|
||||
void machine_power_off(void)
|
||||
{
|
||||
warn_early_printk();
|
||||
arch_local_irq_disable_all();
|
||||
smp_send_stop();
|
||||
hv_power_off();
|
||||
|
Reference in New Issue
Block a user