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 <rsa@us.ibm.com> |
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 | char *outbuf; |
41 | int outbuf_size; |
42 | int n_outbuf; |
43 | uint32_t vtermno; |
44 | const struct hv_ops *ops; |
45 | int irq_requested; |
46 | int data; |
47 | struct winsize ws; |
48 | struct work_struct tty_resize; |
49 | struct list_head next; |
50 | unsigned long flags; |
51 | }; |
52 | |
53 | /* implemented by a low level driver */ |
54 | struct hv_ops { |
55 | int (*get_chars)(uint32_t vtermno, char *buf, int count); |
56 | int (*put_chars)(uint32_t vtermno, const char *buf, int 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 int 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(lock: &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 | static inline int cpus_are_in_xmon(void) |
108 | { |
109 | return 0; |
110 | } |
111 | #endif |
112 | |
113 | #endif // HVC_CONSOLE_H |
114 | |