Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0+ */
2 : /*
3 : * hvc_console.h
4 : * Copyright (C) 2005 IBM Corporation
5 : *
6 : * Author(s):
7 : * Ryan S. Arnold <[email protected]>
8 : *
9 : * hvc_console header information:
10 : * moved here from arch/powerpc/include/asm/hvconsole.h
11 : * and drivers/char/hvc_console.c
12 : */
13 :
14 : #ifndef HVC_CONSOLE_H
15 : #define HVC_CONSOLE_H
16 : #include <linux/kref.h>
17 : #include <linux/tty.h>
18 : #include <linux/spinlock.h>
19 :
20 : /*
21 : * This is the max number of console adapters that can/will be found as
22 : * console devices on first stage console init. Any number beyond this range
23 : * can't be used as a console device but is still a valid tty device.
24 : */
25 : #define MAX_NR_HVC_CONSOLES 16
26 :
27 : /*
28 : * The Linux TTY code does not support dynamic addition of tty derived devices
29 : * so we need to know how many tty devices we might need when space is allocated
30 : * for the tty device. Since this driver supports hotplug of vty adapters we
31 : * need to make sure we have enough allocated.
32 : */
33 : #define HVC_ALLOC_TTY_ADAPTERS 8
34 :
35 : struct hvc_struct {
36 : struct tty_port port;
37 : spinlock_t lock;
38 : int index;
39 : int do_wakeup;
40 : int outbuf_size;
41 : int n_outbuf;
42 : uint32_t vtermno;
43 : const struct hv_ops *ops;
44 : int irq_requested;
45 : int data;
46 : struct winsize ws;
47 : struct work_struct tty_resize;
48 : struct list_head next;
49 : unsigned long flags;
50 : u8 outbuf[] __aligned(sizeof(long));
51 : };
52 :
53 : /* implemented by a low level driver */
54 : struct hv_ops {
55 : ssize_t (*get_chars)(uint32_t vtermno, u8 *buf, size_t count);
56 : ssize_t (*put_chars)(uint32_t vtermno, const u8 *buf, size_t count);
57 : int (*flush)(uint32_t vtermno, bool wait);
58 :
59 : /* Callbacks for notification. Called in open, close and hangup */
60 : int (*notifier_add)(struct hvc_struct *hp, int irq);
61 : void (*notifier_del)(struct hvc_struct *hp, int irq);
62 : void (*notifier_hangup)(struct hvc_struct *hp, int irq);
63 :
64 : /* tiocmget/set implementation */
65 : int (*tiocmget)(struct hvc_struct *hp);
66 : int (*tiocmset)(struct hvc_struct *hp, unsigned int set, unsigned int clear);
67 :
68 : /* Callbacks to handle tty ports */
69 : void (*dtr_rts)(struct hvc_struct *hp, bool active);
70 : };
71 :
72 : /* Register a vterm and a slot index for use as a console (console_init) */
73 : extern int hvc_instantiate(uint32_t vtermno, int index,
74 : const struct hv_ops *ops);
75 :
76 : /* register a vterm for hvc tty operation (module_init or hotplug add) */
77 : extern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data,
78 : const struct hv_ops *ops, int outbuf_size);
79 : /* remove a vterm from hvc tty operation (module_exit or hotplug remove) */
80 : extern void hvc_remove(struct hvc_struct *hp);
81 :
82 : /* data available */
83 : int hvc_poll(struct hvc_struct *hp);
84 : void hvc_kick(void);
85 :
86 : /* Resize hvc tty terminal window */
87 : extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws);
88 :
89 : static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws)
90 : {
91 : unsigned long flags;
92 :
93 : spin_lock_irqsave(&hp->lock, flags);
94 : __hvc_resize(hp, ws);
95 : spin_unlock_irqrestore(&hp->lock, flags);
96 : }
97 :
98 : /* default notifier for irq based notification */
99 : extern int notifier_add_irq(struct hvc_struct *hp, int data);
100 : extern void notifier_del_irq(struct hvc_struct *hp, int data);
101 : extern void notifier_hangup_irq(struct hvc_struct *hp, int data);
102 :
103 :
104 : #if defined(CONFIG_XMON) && defined(CONFIG_SMP)
105 : #include <asm/xmon.h>
106 : #else
107 0 : static inline int cpus_are_in_xmon(void)
108 : {
109 0 : return 0;
110 : }
111 : #endif
112 :
113 : #endif // HVC_CONSOLE_H
|