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 58 /* Callbacks for notification. Called in open, close and hangup */ 59 int (*notifier_add)(struct hvc_struct *hp, int irq); 60 void (*notifier_del)(struct hvc_struct *hp, int irq); 61 void (*notifier_hangup)(struct hvc_struct *hp, int irq); 62 63 /* tiocmget/set implementation */ 64 int (*tiocmget)(struct hvc_struct *hp); 65 int (*tiocmset)(struct hvc_struct *hp, unsigned int set, unsigned int clear); 66 67 /* Callbacks to handle tty ports */ 68 void (*dtr_rts)(struct hvc_struct *hp, int raise); 69 }; 70 71 /* Register a vterm and a slot index for use as a console (console_init) */ 72 extern int hvc_instantiate(uint32_t vtermno, int index, 73 const struct hv_ops *ops); 74 75 /* register a vterm for hvc tty operation (module_init or hotplug add) */ 76 extern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data, 77 const struct hv_ops *ops, int outbuf_size); 78 /* remove a vterm from hvc tty operation (module_exit or hotplug remove) */ 79 extern int hvc_remove(struct hvc_struct *hp); 80 81 /* data available */ 82 int hvc_poll(struct hvc_struct *hp); 83 void hvc_kick(void); 84 85 /* Resize hvc tty terminal window */ 86 extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws); 87 88 static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws) 89 { 90 unsigned long flags; 91 92 spin_lock_irqsave(&hp->lock, flags); 93 __hvc_resize(hp, ws); 94 spin_unlock_irqrestore(&hp->lock, flags); 95 } 96 97 /* default notifier for irq based notification */ 98 extern int notifier_add_irq(struct hvc_struct *hp, int data); 99 extern void notifier_del_irq(struct hvc_struct *hp, int data); 100 extern void notifier_hangup_irq(struct hvc_struct *hp, int data); 101 102 103 #if defined(CONFIG_XMON) && defined(CONFIG_SMP) 104 #include <asm/xmon.h> 105 #else 106 static inline int cpus_are_in_xmon(void) 107 { 108 return 0; 109 } 110 #endif 111 112 #endif // HVC_CONSOLE_H 113