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 <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, int raise); 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 0 : static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws) 90 : { 91 0 : unsigned long flags; 92 : 93 0 : spin_lock_irqsave(&hp->lock, flags); 94 0 : __hvc_resize(hp, ws); 95 0 : spin_unlock_irqrestore(&hp->lock, flags); 96 0 : } 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