hvc_console.h (3303B)
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 35struct 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 */ 54struct 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) */ 73extern 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) */ 77extern 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) */ 80extern int hvc_remove(struct hvc_struct *hp); 81 82/* data available */ 83int hvc_poll(struct hvc_struct *hp); 84void hvc_kick(void); 85 86/* Resize hvc tty terminal window */ 87extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws); 88 89static 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 */ 99extern int notifier_add_irq(struct hvc_struct *hp, int data); 100extern void notifier_del_irq(struct hvc_struct *hp, int data); 101extern 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 107static inline int cpus_are_in_xmon(void) 108{ 109 return 0; 110} 111#endif 112 113#endif // HVC_CONSOLE_H