2005-04-17 06:20:36 +08:00
|
|
|
/*
|
|
|
|
* linux/include/linux/console.h
|
|
|
|
*
|
|
|
|
* Copyright (C) 1993 Hamish Macdonald
|
|
|
|
*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file COPYING in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*
|
|
|
|
* Changed:
|
|
|
|
* 10-Mar-94: Arno Griffioen: Conversion for vt100 emulator port from PC LINUX
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _LINUX_CONSOLE_H_
|
|
|
|
#define _LINUX_CONSOLE_H_ 1
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
|
|
struct vc_data;
|
|
|
|
struct console_font_op;
|
|
|
|
struct console_font;
|
|
|
|
struct module;
|
2007-02-10 17:45:02 +08:00
|
|
|
struct tty_struct;
|
2005-04-17 06:20:36 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* this is what the terminal answers to a ESC-Z or csi0c query.
|
|
|
|
*/
|
|
|
|
#define VT100ID "\033[?1;2c"
|
|
|
|
#define VT102ID "\033[?6c"
|
|
|
|
|
|
|
|
struct consw {
|
|
|
|
struct module *owner;
|
|
|
|
const char *(*con_startup)(void);
|
|
|
|
void (*con_init)(struct vc_data *, int);
|
|
|
|
void (*con_deinit)(struct vc_data *);
|
|
|
|
void (*con_clear)(struct vc_data *, int, int, int, int);
|
|
|
|
void (*con_putc)(struct vc_data *, int, int, int);
|
|
|
|
void (*con_putcs)(struct vc_data *, const unsigned short *, int, int, int);
|
|
|
|
void (*con_cursor)(struct vc_data *, int);
|
|
|
|
int (*con_scroll)(struct vc_data *, int, int, int, int);
|
|
|
|
void (*con_bmove)(struct vc_data *, int, int, int, int, int, int);
|
|
|
|
int (*con_switch)(struct vc_data *);
|
|
|
|
int (*con_blank)(struct vc_data *, int, int);
|
|
|
|
int (*con_font_set)(struct vc_data *, struct console_font *, unsigned);
|
|
|
|
int (*con_font_get)(struct vc_data *, struct console_font *);
|
|
|
|
int (*con_font_default)(struct vc_data *, struct console_font *, char *);
|
|
|
|
int (*con_font_copy)(struct vc_data *, int);
|
vt/vgacon: Check if screen resize request comes from userspace
Various console drivers are able to resize the screen via the con_resize()
hook. This hook is also visible in userspace via the TIOCWINSZ, VT_RESIZE and
VT_RESIZEX ioctl's. One particular utility, SVGATextMode, expects that
con_resize() of the VGA console will always return success even if the
resulting screen is not compatible with the hardware. However, this
particular behavior of the VGA console, as reported in Kernel Bugzilla Bug
7513, can cause undefined behavior if the user starts with a console size
larger than 80x25.
To work around this problem, add an extra parameter to con_resize(). This
parameter is ignored by drivers except for vgacon. If this parameter is
non-zero, then the resize request came from a VT_RESIZE or VT_RESIZEX ioctl
and vgacon will always return success. If this parameter is zero, vgacon will
return -EINVAL if the requested size is not compatible with the hardware. The
latter is the more correct behavior.
With this change, SVGATextMode should still work correctly while in-kernel and
stty resize calls can expect correct behavior from vgacon.
Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-10-16 16:29:35 +08:00
|
|
|
int (*con_resize)(struct vc_data *, unsigned int, unsigned int,
|
|
|
|
unsigned int);
|
2005-04-17 06:20:36 +08:00
|
|
|
int (*con_set_palette)(struct vc_data *, unsigned char *);
|
|
|
|
int (*con_scrolldelta)(struct vc_data *, int);
|
|
|
|
int (*con_set_origin)(struct vc_data *);
|
|
|
|
void (*con_save_screen)(struct vc_data *);
|
2007-05-08 15:38:04 +08:00
|
|
|
u8 (*con_build_attr)(struct vc_data *, u8, u8, u8, u8, u8, u8);
|
2005-04-17 06:20:36 +08:00
|
|
|
void (*con_invert_region)(struct vc_data *, u16 *, int);
|
|
|
|
u16 *(*con_screen_pos)(struct vc_data *, int);
|
|
|
|
unsigned long (*con_getxy)(struct vc_data *, unsigned long, int *, int *);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern const struct consw *conswitchp;
|
|
|
|
|
|
|
|
extern const struct consw dummy_con; /* dummy console buffer */
|
|
|
|
extern const struct consw vga_con; /* VGA text console */
|
|
|
|
extern const struct consw newport_con; /* SGI Newport console */
|
|
|
|
extern const struct consw prom_con; /* SPARC PROM console */
|
|
|
|
|
[PATCH] VT binding: Add binding/unbinding support for the VT console
The framebuffer console is now able to dynamically bind and unbind from the VT
console layer. Due to the way the VT console layer works, the drivers
themselves decide when to bind or unbind. However, it was decided that
binding must be controlled, not by the drivers themselves, but by the VT
console layer. With this, dynamic binding is possible for all VT console
drivers, not just fbcon.
Thus, the VT console layer will impose the following to all VT console
drivers:
- all registered VT console drivers will be entered in a private list
- drivers can register themselves to the VT console layer, but they cannot
decide when to bind or unbind. (Exception: To maintain backwards
compatibility, take_over_console() will automatically bind the driver after
registration.)
- drivers can remove themselves from the list by unregistering from the VT
console layer. A prerequisite for unregistration is that the driver must not
be bound.
The following functions are new in the vt.c:
register_con_driver() - public function, this function adds the VT console
driver to an internal list maintained by the VT console
bind_con_driver() - private function, it binds the driver to the console
take_over_console() is changed to call register_con_driver() followed by a
bind_con_driver(). This is the only time drivers can decide when to bind to
the VT layer. This is to maintain backwards compatibility.
unbind_con_driver() - private function, it unbinds the driver from its
console. The vacated consoles will be taken over by the default boot console
driver.
unregister_con_driver() - public function, removes the driver from the
internal list maintained by the VT console. It will only succeed if the
driver is currently unbound.
con_is_bound() checks if the driver is currently bound or not
give_up_console() is just a wrapper to unregister_con_driver().
There are also 3 additional functions meant to be called only by the tty layer
for sysfs control:
vt_bind() - calls bind_con_driver()
vt_unbind() - calls unbind_con_driver()
vt_show_drivers() - shows the list of registered drivers
Most VT console drivers will continue to work as is, but might have problems
when unbinding or binding which should be fixable with minimal changes.
Signed-off-by: Antonino Daplas <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-26 15:27:08 +08:00
|
|
|
int con_is_bound(const struct consw *csw);
|
|
|
|
int register_con_driver(const struct consw *csw, int first, int last);
|
|
|
|
int unregister_con_driver(const struct consw *csw);
|
2005-04-17 06:20:36 +08:00
|
|
|
int take_over_console(const struct consw *sw, int first, int last, int deflt);
|
|
|
|
void give_up_console(const struct consw *sw);
|
|
|
|
/* scroll */
|
|
|
|
#define SM_UP (1)
|
|
|
|
#define SM_DOWN (2)
|
|
|
|
|
|
|
|
/* cursor */
|
|
|
|
#define CM_DRAW (1)
|
|
|
|
#define CM_ERASE (2)
|
|
|
|
#define CM_MOVE (3)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The interface for a console, or any other device that wants to capture
|
|
|
|
* console messages (printer driver?)
|
|
|
|
*
|
|
|
|
* If a console driver is marked CON_BOOT then it will be auto-unregistered
|
|
|
|
* when the first real console is registered. This is for early-printk drivers.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define CON_PRINTBUFFER (1)
|
|
|
|
#define CON_CONSDEV (2) /* Last on the command line */
|
|
|
|
#define CON_ENABLED (4)
|
|
|
|
#define CON_BOOT (8)
|
2006-06-25 20:47:40 +08:00
|
|
|
#define CON_ANYTIME (16) /* Safe to call when cpu is offline */
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-05-08 15:26:47 +08:00
|
|
|
struct console {
|
|
|
|
char name[16];
|
2005-04-17 06:20:36 +08:00
|
|
|
void (*write)(struct console *, const char *, unsigned);
|
|
|
|
int (*read)(struct console *, char *, unsigned);
|
|
|
|
struct tty_driver *(*device)(struct console *, int *);
|
|
|
|
void (*unblank)(void);
|
|
|
|
int (*setup)(struct console *, char *);
|
serial: convert early_uart to earlycon for 8250
Beacuse SERIAL_PORT_DFNS is removed from include/asm-i386/serial.h and
include/asm-x86_64/serial.h. the serial8250_ports need to be probed late in
serial initializing stage. the console_init=>serial8250_console_init=>
register_console=>serial8250_console_setup will return -ENDEV, and console
ttyS0 can not be enabled at that time. need to wait till uart_add_one_port in
drivers/serial/serial_core.c to call register_console to get console ttyS0.
that is too late.
Make early_uart to use early_param, so uart console can be used earlier. Make
it to be bootconsole with CON_BOOT flag, so can use console handover feature.
and it will switch to corresponding normal serial console automatically.
new command line will be:
console=uart8250,io,0x3f8,9600n8
console=uart8250,mmio,0xff5e0000,115200n8
or
earlycon=uart8250,io,0x3f8,9600n8
earlycon=uart8250,mmio,0xff5e0000,115200n8
it will print in very early stage:
Early serial console at I/O port 0x3f8 (options '9600n8')
console [uart0] enabled
later for console it will print:
console handover: boot [uart0] -> real [ttyS0]
Signed-off-by: <yinghai.lu@sun.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:37:59 +08:00
|
|
|
int (*early_setup)(void);
|
2005-04-17 06:20:36 +08:00
|
|
|
short flags;
|
|
|
|
short index;
|
|
|
|
int cflag;
|
|
|
|
void *data;
|
|
|
|
struct console *next;
|
|
|
|
};
|
|
|
|
|
|
|
|
extern int add_preferred_console(char *name, int idx, char *options);
|
serial: convert early_uart to earlycon for 8250
Beacuse SERIAL_PORT_DFNS is removed from include/asm-i386/serial.h and
include/asm-x86_64/serial.h. the serial8250_ports need to be probed late in
serial initializing stage. the console_init=>serial8250_console_init=>
register_console=>serial8250_console_setup will return -ENDEV, and console
ttyS0 can not be enabled at that time. need to wait till uart_add_one_port in
drivers/serial/serial_core.c to call register_console to get console ttyS0.
that is too late.
Make early_uart to use early_param, so uart console can be used earlier. Make
it to be bootconsole with CON_BOOT flag, so can use console handover feature.
and it will switch to corresponding normal serial console automatically.
new command line will be:
console=uart8250,io,0x3f8,9600n8
console=uart8250,mmio,0xff5e0000,115200n8
or
earlycon=uart8250,io,0x3f8,9600n8
earlycon=uart8250,mmio,0xff5e0000,115200n8
it will print in very early stage:
Early serial console at I/O port 0x3f8 (options '9600n8')
console [uart0] enabled
later for console it will print:
console handover: boot [uart0] -> real [ttyS0]
Signed-off-by: <yinghai.lu@sun.com>
Cc: Andi Kleen <ak@suse.de>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Gerd Hoffmann <kraxel@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2007-07-16 14:37:59 +08:00
|
|
|
extern int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options);
|
2005-04-17 06:20:36 +08:00
|
|
|
extern void register_console(struct console *);
|
|
|
|
extern int unregister_console(struct console *);
|
|
|
|
extern struct console *console_drivers;
|
|
|
|
extern void acquire_console_sem(void);
|
|
|
|
extern int try_acquire_console_sem(void);
|
|
|
|
extern void release_console_sem(void);
|
|
|
|
extern void console_conditional_schedule(void);
|
|
|
|
extern void console_unblank(void);
|
|
|
|
extern struct tty_driver *console_device(int *);
|
|
|
|
extern void console_stop(struct console *);
|
|
|
|
extern void console_start(struct console *);
|
|
|
|
extern int is_console_locked(void);
|
|
|
|
|
2007-10-18 18:04:50 +08:00
|
|
|
extern int console_suspend_enabled;
|
|
|
|
|
2006-06-20 09:16:01 +08:00
|
|
|
/* Suspend and resume console messages over PM events */
|
|
|
|
extern void suspend_console(void);
|
|
|
|
extern void resume_console(void);
|
|
|
|
|
2006-10-03 16:15:06 +08:00
|
|
|
int mda_console_init(void);
|
|
|
|
void prom_con_init(void);
|
|
|
|
|
2007-02-10 17:45:02 +08:00
|
|
|
void vcs_make_sysfs(struct tty_struct *tty);
|
|
|
|
void vcs_remove_sysfs(struct tty_struct *tty);
|
|
|
|
|
2005-04-17 06:20:36 +08:00
|
|
|
/* Some debug stub to catch some of the obvious races in the VT code */
|
|
|
|
#if 1
|
|
|
|
#define WARN_CONSOLE_UNLOCKED() WARN_ON(!is_console_locked() && !oops_in_progress)
|
|
|
|
#else
|
|
|
|
#define WARN_CONSOLE_UNLOCKED()
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* VESA Blanking Levels */
|
|
|
|
#define VESA_NO_BLANKING 0
|
|
|
|
#define VESA_VSYNC_SUSPEND 1
|
|
|
|
#define VESA_HSYNC_SUSPEND 2
|
|
|
|
#define VESA_POWERDOWN 3
|
|
|
|
|
|
|
|
#endif /* _LINUX_CONSOLE_H */
|