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 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 static inline int cpus_are_in_xmon(void) 108 { 109 return 0; 110 } 111 #endif 112 113 #endif // HVC_CONSOLE_H 114