mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
![Benjamin Herrenschmidt](/assets/img/avatar_default.png)
On pseries machines, consoles are provided by the hypervisor using a low level get_chars/put_chars type interface. However, this is really just a transport to the service processor which implements them either as "raw" console (networked consoles, HMC, ...) or as "hvsi" serial ports. The later is a simple packet protocol on top of the raw character interface that is supposed to convey additional "serial port" style semantics. In practice however, all it does is provide a way to read the CD line and set/clear our DTR line, that's it. We currently implement the "raw" protocol as an hvc console backend (/dev/hvcN) and the "hvsi" protocol using a separate tty driver (/dev/hvsi0). However this is quite impractical. The arbitrary difference between the two type of devices has been a major source of user (and distro) confusion. Additionally, there's an additional mini -hvsi implementation in the pseries platform code for our low level debug console and early boot kernel messages, which means code duplication, though that low level variant is impractical as it's incapable of doing the initial protocol negociation to establish the link to the FSP. This essentially replaces the dedicated hvsi driver and the platform udbg code completely by extending the existing hvc_vio backend used in "raw" mode so that: - It now supports HVSI as well - We add support for hvc backend providing tiocm{get,set} - It also provides a udbg interface for early debug and boot console This is overall less code, though this will only be obvious once we remove the old "hvsi" driver, which is still available for now. When the old driver is enabled, the new code still kicks in for the low level udbg console, replacing the old mini implementation in the platform code, it just doesn't provide the higher level "hvc" interface. In addition to producing generally simler code, this has several benefits over our current situation: - The user/distro only has to deal with /dev/hvcN for the hypervisor console, avoiding all sort of confusion that has plagued us in the past - The tty, kernel and low level debug console all use the same code base which supports the full protocol establishment process, thus the console is now available much earlier than it used to be with the old HVSI driver. The kernel console works much earlier and udbg is available much earlier too. Hackers can enable a hard coded very-early debug console as well that works with HVSI (previously that was only supported for the "raw" mode). I've tried to keep the same semantics as hvsi relative to how I react to things like CD changes, with some subtle differences though: - I clear DTR on close if HUPCL is set - Current hvsi triggers a hangup if it detects a up->down transition on CD (you can still open a console with CD down). My new implementation triggers a hangup if the link to the FSP is severed, and severs it upon detecting a up->down transition on CD. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
59 lines
2 KiB
C
59 lines
2 KiB
C
/*
|
|
* (c) 2001, 2006 IBM Corporation.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#ifndef _ASM_POWERPC_UDBG_H
|
|
#define _ASM_POWERPC_UDBG_H
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/init.h>
|
|
|
|
extern void (*udbg_putc)(char c);
|
|
extern void (*udbg_flush)(void);
|
|
extern int (*udbg_getc)(void);
|
|
extern int (*udbg_getc_poll)(void);
|
|
|
|
extern void udbg_puts(const char *s);
|
|
extern int udbg_write(const char *s, int n);
|
|
extern int udbg_read(char *buf, int buflen);
|
|
|
|
extern void register_early_udbg_console(void);
|
|
extern void udbg_printf(const char *fmt, ...)
|
|
__attribute__ ((format (printf, 1, 2)));
|
|
extern void udbg_progress(char *s, unsigned short hex);
|
|
|
|
extern void udbg_init_uart(void __iomem *comport, unsigned int speed,
|
|
unsigned int clock);
|
|
extern unsigned int udbg_probe_uart_speed(void __iomem *comport,
|
|
unsigned int clock);
|
|
|
|
struct device_node;
|
|
extern void udbg_scc_init(int force_scc);
|
|
extern int udbg_adb_init(int force_btext);
|
|
extern void udbg_adb_init_early(void);
|
|
|
|
extern void __init udbg_early_init(void);
|
|
extern void __init udbg_init_debug_lpar(void);
|
|
extern void __init udbg_init_debug_lpar_hvsi(void);
|
|
extern void __init udbg_init_pmac_realmode(void);
|
|
extern void __init udbg_init_maple_realmode(void);
|
|
extern void __init udbg_init_pas_realmode(void);
|
|
extern void __init udbg_init_iseries(void);
|
|
extern void __init udbg_init_rtas_panel(void);
|
|
extern void __init udbg_init_rtas_console(void);
|
|
extern void __init udbg_init_debug_beat(void);
|
|
extern void __init udbg_init_btext(void);
|
|
extern void __init udbg_init_44x_as1(void);
|
|
extern void __init udbg_init_40x_realmode(void);
|
|
extern void __init udbg_init_cpm(void);
|
|
extern void __init udbg_init_usbgecko(void);
|
|
extern void __init udbg_init_wsp(void);
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_UDBG_H */
|