1  /*
2   *  linux/include/linux/console.h
3   *
4   *  Copyright (C) 1993        Hamish Macdonald
5   *
6   * This file is subject to the terms and conditions of the GNU General Public
7   * License.  See the file COPYING in the main directory of this archive
8   * for more details.
9   *
10   * Changed:
11   * 10-Mar-94: Arno Griffioen: Conversion for vt100 emulator port from PC LINUX
12   */
13  
14  #ifndef _LINUX_CONSOLE_H_
15  #define _LINUX_CONSOLE_H_ 1
16  
17  #include <linux/atomic.h>
18  #include <linux/bits.h>
19  #include <linux/rculist.h>
20  #include <linux/types.h>
21  
22  struct vc_data;
23  struct console_font_op;
24  struct console_font;
25  struct module;
26  struct tty_struct;
27  struct notifier_block;
28  
29  enum con_scroll {
30  	SM_UP,
31  	SM_DOWN,
32  };
33  
34  enum vc_intensity;
35  
36  /**
37   * struct consw - callbacks for consoles
38   *
39   * @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
40   *		Return true if no generic handling should be done.
41   *		Invoked by csi_M and printing to the console.
42   * @con_set_palette: sets the palette of the console to @table (optional)
43   * @con_scrolldelta: the contents of the console should be scrolled by @lines.
44   *		     Invoked by user. (optional)
45   */
46  struct consw {
47  	struct module *owner;
48  	const char *(*con_startup)(void);
49  	void	(*con_init)(struct vc_data *vc, int init);
50  	void	(*con_deinit)(struct vc_data *vc);
51  	void	(*con_clear)(struct vc_data *vc, int sy, int sx, int height,
52  			int width);
53  	void	(*con_putc)(struct vc_data *vc, int c, int ypos, int xpos);
54  	void	(*con_putcs)(struct vc_data *vc, const unsigned short *s,
55  			int count, int ypos, int xpos);
56  	void	(*con_cursor)(struct vc_data *vc, int mode);
57  	bool	(*con_scroll)(struct vc_data *vc, unsigned int top,
58  			unsigned int bottom, enum con_scroll dir,
59  			unsigned int lines);
60  	int	(*con_switch)(struct vc_data *vc);
61  	int	(*con_blank)(struct vc_data *vc, int blank, int mode_switch);
62  	int	(*con_font_set)(struct vc_data *vc, struct console_font *font,
63  			unsigned int vpitch, unsigned int flags);
64  	int	(*con_font_get)(struct vc_data *vc, struct console_font *font,
65  			unsigned int vpitch);
66  	int	(*con_font_default)(struct vc_data *vc,
67  			struct console_font *font, char *name);
68  	int     (*con_resize)(struct vc_data *vc, unsigned int width,
69  			unsigned int height, unsigned int user);
70  	void	(*con_set_palette)(struct vc_data *vc,
71  			const unsigned char *table);
72  	void	(*con_scrolldelta)(struct vc_data *vc, int lines);
73  	int	(*con_set_origin)(struct vc_data *vc);
74  	void	(*con_save_screen)(struct vc_data *vc);
75  	u8	(*con_build_attr)(struct vc_data *vc, u8 color,
76  			enum vc_intensity intensity,
77  			bool blink, bool underline, bool reverse, bool italic);
78  	void	(*con_invert_region)(struct vc_data *vc, u16 *p, int count);
79  	u16    *(*con_screen_pos)(const struct vc_data *vc, int offset);
80  	unsigned long (*con_getxy)(struct vc_data *vc, unsigned long position,
81  			int *px, int *py);
82  	/*
83  	 * Flush the video console driver's scrollback buffer
84  	 */
85  	void	(*con_flush_scrollback)(struct vc_data *vc);
86  	/*
87  	 * Prepare the console for the debugger.  This includes, but is not
88  	 * limited to, unblanking the console, loading an appropriate
89  	 * palette, and allowing debugger generated output.
90  	 */
91  	int	(*con_debug_enter)(struct vc_data *vc);
92  	/*
93  	 * Restore the console to its pre-debug state as closely as possible.
94  	 */
95  	int	(*con_debug_leave)(struct vc_data *vc);
96  };
97  
98  extern const struct consw *conswitchp;
99  
100  extern const struct consw dummy_con;	/* dummy console buffer */
101  extern const struct consw vga_con;	/* VGA text console */
102  extern const struct consw newport_con;	/* SGI Newport console  */
103  
104  int con_is_bound(const struct consw *csw);
105  int do_unregister_con_driver(const struct consw *csw);
106  int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
107  void give_up_console(const struct consw *sw);
108  #ifdef CONFIG_HW_CONSOLE
109  int con_debug_enter(struct vc_data *vc);
110  int con_debug_leave(void);
111  #else
con_debug_enter(struct vc_data * vc)112  static inline int con_debug_enter(struct vc_data *vc)
113  {
114  	return 0;
115  }
con_debug_leave(void)116  static inline int con_debug_leave(void)
117  {
118  	return 0;
119  }
120  #endif
121  
122  /* cursor */
123  #define CM_DRAW     (1)
124  #define CM_ERASE    (2)
125  #define CM_MOVE     (3)
126  
127  /*
128   * The interface for a console, or any other device that wants to capture
129   * console messages (printer driver?)
130   */
131  
132  /**
133   * cons_flags - General console flags
134   * @CON_PRINTBUFFER:	Used by newly registered consoles to avoid duplicate
135   *			output of messages that were already shown by boot
136   *			consoles or read by userspace via syslog() syscall.
137   * @CON_CONSDEV:	Indicates that the console driver is backing
138   *			/dev/console.
139   * @CON_ENABLED:	Indicates if a console is allowed to print records. If
140   *			false, the console also will not advance to later
141   *			records.
142   * @CON_BOOT:		Marks the console driver as early console driver which
143   *			is used during boot before the real driver becomes
144   *			available. It will be automatically unregistered
145   *			when the real console driver is registered unless
146   *			"keep_bootcon" parameter is used.
147   * @CON_ANYTIME:	A misnomed historical flag which tells the core code
148   *			that the legacy @console::write callback can be invoked
149   *			on a CPU which is marked OFFLINE. That is misleading as
150   *			it suggests that there is no contextual limit for
151   *			invoking the callback. The original motivation was
152   *			readiness of the per-CPU areas.
153   * @CON_BRL:		Indicates a braille device which is exempt from
154   *			receiving the printk spam for obvious reasons.
155   * @CON_EXTENDED:	The console supports the extended output format of
156   *			/dev/kmesg which requires a larger output buffer.
157   */
158  enum cons_flags {
159  	CON_PRINTBUFFER		= BIT(0),
160  	CON_CONSDEV		= BIT(1),
161  	CON_ENABLED		= BIT(2),
162  	CON_BOOT		= BIT(3),
163  	CON_ANYTIME		= BIT(4),
164  	CON_BRL			= BIT(5),
165  	CON_EXTENDED		= BIT(6),
166  };
167  
168  /**
169   * struct console - The console descriptor structure
170   * @name:		The name of the console driver
171   * @write:		Write callback to output messages (Optional)
172   * @read:		Read callback for console input (Optional)
173   * @device:		The underlying TTY device driver (Optional)
174   * @unblank:		Callback to unblank the console (Optional)
175   * @setup:		Callback for initializing the console (Optional)
176   * @exit:		Callback for teardown of the console (Optional)
177   * @match:		Callback for matching a console (Optional)
178   * @flags:		Console flags. See enum cons_flags
179   * @index:		Console index, e.g. port number
180   * @cflag:		TTY control mode flags
181   * @ispeed:		TTY input speed
182   * @ospeed:		TTY output speed
183   * @seq:		Sequence number of the next ringbuffer record to print
184   * @dropped:		Number of unreported dropped ringbuffer records
185   * @data:		Driver private data
186   * @node:		hlist node for the console list
187   */
188  struct console {
189  	char			name[16];
190  	void			(*write)(struct console *co, const char *s, unsigned int count);
191  	int			(*read)(struct console *co, char *s, unsigned int count);
192  	struct tty_driver	*(*device)(struct console *co, int *index);
193  	void			(*unblank)(void);
194  	int			(*setup)(struct console *co, char *options);
195  	int			(*exit)(struct console *co);
196  	int			(*match)(struct console *co, char *name, int idx, char *options);
197  	short			flags;
198  	short			index;
199  	int			cflag;
200  	uint			ispeed;
201  	uint			ospeed;
202  	u64			seq;
203  	unsigned long		dropped;
204  	void			*data;
205  	struct hlist_node	node;
206  };
207  
208  #ifdef CONFIG_LOCKDEP
209  extern void lockdep_assert_console_list_lock_held(void);
210  #else
lockdep_assert_console_list_lock_held(void)211  static inline void lockdep_assert_console_list_lock_held(void)
212  {
213  }
214  #endif
215  
216  #ifdef CONFIG_DEBUG_LOCK_ALLOC
217  extern bool console_srcu_read_lock_is_held(void);
218  #else
console_srcu_read_lock_is_held(void)219  static inline bool console_srcu_read_lock_is_held(void)
220  {
221  	return 1;
222  }
223  #endif
224  
225  extern int console_srcu_read_lock(void);
226  extern void console_srcu_read_unlock(int cookie);
227  
228  extern void console_list_lock(void) __acquires(console_mutex);
229  extern void console_list_unlock(void) __releases(console_mutex);
230  
231  extern struct hlist_head console_list;
232  
233  /**
234   * console_srcu_read_flags - Locklessly read the console flags
235   * @con:	struct console pointer of console to read flags from
236   *
237   * This function provides the necessary READ_ONCE() and data_race()
238   * notation for locklessly reading the console flags. The READ_ONCE()
239   * in this function matches the WRITE_ONCE() when @flags are modified
240   * for registered consoles with console_srcu_write_flags().
241   *
242   * Only use this function to read console flags when locklessly
243   * iterating the console list via srcu.
244   *
245   * Context: Any context.
246   */
console_srcu_read_flags(const struct console * con)247  static inline short console_srcu_read_flags(const struct console *con)
248  {
249  	WARN_ON_ONCE(!console_srcu_read_lock_is_held());
250  
251  	/*
252  	 * Locklessly reading console->flags provides a consistent
253  	 * read value because there is at most one CPU modifying
254  	 * console->flags and that CPU is using only read-modify-write
255  	 * operations to do so.
256  	 */
257  	return data_race(READ_ONCE(con->flags));
258  }
259  
260  /**
261   * console_srcu_write_flags - Write flags for a registered console
262   * @con:	struct console pointer of console to write flags to
263   * @flags:	new flags value to write
264   *
265   * Only use this function to write flags for registered consoles. It
266   * requires holding the console_list_lock.
267   *
268   * Context: Any context.
269   */
console_srcu_write_flags(struct console * con,short flags)270  static inline void console_srcu_write_flags(struct console *con, short flags)
271  {
272  	lockdep_assert_console_list_lock_held();
273  
274  	/* This matches the READ_ONCE() in console_srcu_read_flags(). */
275  	WRITE_ONCE(con->flags, flags);
276  }
277  
278  /* Variant of console_is_registered() when the console_list_lock is held. */
console_is_registered_locked(const struct console * con)279  static inline bool console_is_registered_locked(const struct console *con)
280  {
281  	lockdep_assert_console_list_lock_held();
282  	return !hlist_unhashed(&con->node);
283  }
284  
285  /*
286   * console_is_registered - Check if the console is registered
287   * @con:	struct console pointer of console to check
288   *
289   * Context: Process context. May sleep while acquiring console list lock.
290   * Return: true if the console is in the console list, otherwise false.
291   *
292   * If false is returned for a console that was previously registered, it
293   * can be assumed that the console's unregistration is fully completed,
294   * including the exit() callback after console list removal.
295   */
console_is_registered(const struct console * con)296  static inline bool console_is_registered(const struct console *con)
297  {
298  	bool ret;
299  
300  	console_list_lock();
301  	ret = console_is_registered_locked(con);
302  	console_list_unlock();
303  	return ret;
304  }
305  
306  /**
307   * for_each_console_srcu() - Iterator over registered consoles
308   * @con:	struct console pointer used as loop cursor
309   *
310   * Although SRCU guarantees the console list will be consistent, the
311   * struct console fields may be updated by other CPUs while iterating.
312   *
313   * Requires console_srcu_read_lock to be held. Can be invoked from
314   * any context.
315   */
316  #define for_each_console_srcu(con)					\
317  	hlist_for_each_entry_srcu(con, &console_list, node,		\
318  				  console_srcu_read_lock_is_held())
319  
320  /**
321   * for_each_console() - Iterator over registered consoles
322   * @con:	struct console pointer used as loop cursor
323   *
324   * The console list and the console->flags are immutable while iterating.
325   *
326   * Requires console_list_lock to be held.
327   */
328  #define for_each_console(con)						\
329  	lockdep_assert_console_list_lock_held();			\
330  	hlist_for_each_entry(con, &console_list, node)
331  
332  extern int console_set_on_cmdline;
333  extern struct console *early_console;
334  
335  enum con_flush_mode {
336  	CONSOLE_FLUSH_PENDING,
337  	CONSOLE_REPLAY_ALL,
338  };
339  
340  extern int add_preferred_console(char *name, int idx, char *options);
341  extern void console_force_preferred_locked(struct console *con);
342  extern void register_console(struct console *);
343  extern int unregister_console(struct console *);
344  extern void console_lock(void);
345  extern int console_trylock(void);
346  extern void console_unlock(void);
347  extern void console_conditional_schedule(void);
348  extern void console_unblank(void);
349  extern void console_flush_on_panic(enum con_flush_mode mode);
350  extern struct tty_driver *console_device(int *);
351  extern void console_stop(struct console *);
352  extern void console_start(struct console *);
353  extern int is_console_locked(void);
354  extern int braille_register_console(struct console *, int index,
355  		char *console_options, char *braille_options);
356  extern int braille_unregister_console(struct console *);
357  #ifdef CONFIG_TTY
358  extern void console_sysfs_notify(void);
359  #else
console_sysfs_notify(void)360  static inline void console_sysfs_notify(void)
361  { }
362  #endif
363  extern bool console_suspend_enabled;
364  
365  /* Suspend and resume console messages over PM events */
366  extern void suspend_console(void);
367  extern void resume_console(void);
368  
369  int mda_console_init(void);
370  
371  void vcs_make_sysfs(int index);
372  void vcs_remove_sysfs(int index);
373  
374  /* Some debug stub to catch some of the obvious races in the VT code */
375  #define WARN_CONSOLE_UNLOCKED()						\
376  	WARN_ON(!atomic_read(&ignore_console_lock_warning) &&		\
377  		!is_console_locked() && !oops_in_progress)
378  /*
379   * Increment ignore_console_lock_warning if you need to quiet
380   * WARN_CONSOLE_UNLOCKED() for debugging purposes.
381   */
382  extern atomic_t ignore_console_lock_warning;
383  
384  /* VESA Blanking Levels */
385  #define VESA_NO_BLANKING        0
386  #define VESA_VSYNC_SUSPEND      1
387  #define VESA_HSYNC_SUSPEND      2
388  #define VESA_POWERDOWN          3
389  
390  extern void console_init(void);
391  
392  /* For deferred console takeover */
393  void dummycon_register_output_notifier(struct notifier_block *nb);
394  void dummycon_unregister_output_notifier(struct notifier_block *nb);
395  
396  #endif /* _LINUX_CONSOLE_H */
397