145d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/*
245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * hvc_console.h
345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * Copyright (C) 2005 IBM Corporation
445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *
545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * Author(s):
645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * 	Ryan S. Arnold <rsa@us.ibm.com>
745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *
845d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * hvc_console header information:
9b8b572e1015f81b4e748417be2629dfe51ab99f9Stephen Rothwell *      moved here from arch/powerpc/include/asm/hvconsole.h
1045d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *      and drivers/char/hvc_console.c
1145d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *
1245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * This program is free software; you can redistribute it and/or modify
1345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * it under the terms of the GNU General Public License as published by
1445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * the Free Software Foundation; either version 2 of the License, or
1545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * (at your option) any later version.
1645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *
1745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * This program is distributed in the hope that it will be useful,
1845d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * but WITHOUT ANY WARRANTY; without even the implied warranty of
1945d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2045d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * GNU General Public License for more details.
2145d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold *
2245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * You should have received a copy of the GNU General Public License
2345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * along with this program; if not, write to the Free Software
2445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
2545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold */
2645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
2745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold#ifndef HVC_CONSOLE_H
2845d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold#define HVC_CONSOLE_H
29611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger#include <linux/kref.h>
30febde3711992a64ea83a47a719f68a90c4b0927aHendrik Brueckner#include <linux/tty.h>
31254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner#include <linux/spinlock.h>
3245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
3345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/*
3445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * This is the max number of console adapters that can/will be found as
3545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * console devices on first stage console init.  Any number beyond this range
3645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * can't be used as a console device but is still a valid tty device.
3745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold */
3845d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold#define MAX_NR_HVC_CONSOLES	16
3945d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
4045d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/*
4145d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * The Linux TTY code does not support dynamic addition of tty derived devices
4245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * so we need to know how many tty devices we might need when space is allocated
4345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * for the tty device.  Since this driver supports hotplug of vty adapters we
4445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold * need to make sure we have enough allocated.
4545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold */
4645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold#define HVC_ALLOC_TTY_ADAPTERS	8
4745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
48611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraegerstruct hvc_struct {
49f3d9f25097b62eaeb9e5b71358b863c7bf54c600Jiri Slaby	struct tty_port port;
50611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	spinlock_t lock;
51611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int index;
52611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int do_wakeup;
53611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	char *outbuf;
54611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int outbuf_size;
55611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int n_outbuf;
56611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	uint32_t vtermno;
57b51130685817d8c1b56386f9957405b5be2cdfe0Rusty Russell	const struct hv_ops *ops;
58611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int irq_requested;
59611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int data;
60febde3711992a64ea83a47a719f68a90c4b0927aHendrik Brueckner	struct winsize ws;
61febde3711992a64ea83a47a719f68a90c4b0927aHendrik Brueckner	struct work_struct tty_resize;
62611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	struct list_head next;
63611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger};
6445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
6545d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/* implemented by a low level driver */
6645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnoldstruct hv_ops {
6745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold	int (*get_chars)(uint32_t vtermno, char *buf, int count);
6845d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold	int (*put_chars)(uint32_t vtermno, const char *buf, int count);
6945d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
70fc362e2e0efd8b652ebfb409a4e43e6189c04f6fHendrik Brueckner	/* Callbacks for notification. Called in open, close and hangup */
71611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	int (*notifier_add)(struct hvc_struct *hp, int irq);
72611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger	void (*notifier_del)(struct hvc_struct *hp, int irq);
73fc362e2e0efd8b652ebfb409a4e43e6189c04f6fHendrik Brueckner	void (*notifier_hangup)(struct hvc_struct *hp, int irq);
744d2bb3f5003617cb42b89faefd0009c505c3abd5Benjamin Herrenschmidt
754d2bb3f5003617cb42b89faefd0009c505c3abd5Benjamin Herrenschmidt	/* tiocmget/set implementation */
764d2bb3f5003617cb42b89faefd0009c505c3abd5Benjamin Herrenschmidt	int (*tiocmget)(struct hvc_struct *hp);
774d2bb3f5003617cb42b89faefd0009c505c3abd5Benjamin Herrenschmidt	int (*tiocmset)(struct hvc_struct *hp, unsigned int set, unsigned int clear);
7833e745a192c272130b02b86d5dea5b577a291ed7Hendrik Brueckner
7933e745a192c272130b02b86d5dea5b577a291ed7Hendrik Brueckner	/* Callbacks to handle tty ports */
8033e745a192c272130b02b86d5dea5b577a291ed7Hendrik Brueckner	void (*dtr_rts)(struct hvc_struct *hp, int raise);
81611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger};
8245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
8345d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/* Register a vterm and a slot index for use as a console (console_init) */
84b51130685817d8c1b56386f9957405b5be2cdfe0Rusty Russellextern int hvc_instantiate(uint32_t vtermno, int index,
85b51130685817d8c1b56386f9957405b5be2cdfe0Rusty Russell			   const struct hv_ops *ops);
8645d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
8745d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold/* register a vterm for hvc tty operation (module_init or hotplug add) */
88119ea10947cc1402abbf9d6200815b0606536906Amit Shahextern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data,
89119ea10947cc1402abbf9d6200815b0606536906Amit Shah				     const struct hv_ops *ops, int outbuf_size);
90611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger/* remove a vterm from hvc tty operation (module_exit or hotplug remove) */
91934752d8a4aaae4bee7a1b46944f30a55178ec91Hendrik Bruecknerextern int hvc_remove(struct hvc_struct *hp);
9245d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold
93611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger/* data available */
94611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraegerint hvc_poll(struct hvc_struct *hp);
95611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraegervoid hvc_kick(void);
96611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger
97febde3711992a64ea83a47a719f68a90c4b0927aHendrik Brueckner/* Resize hvc tty terminal window */
98254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Bruecknerextern void __hvc_resize(struct hvc_struct *hp, struct winsize ws);
99254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner
100254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Bruecknerstatic inline void hvc_resize(struct hvc_struct *hp, struct winsize ws)
101254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner{
102254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner	unsigned long flags;
103254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner
104254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner	spin_lock_irqsave(&hp->lock, flags);
105254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner	__hvc_resize(hp, ws);
106254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner	spin_unlock_irqrestore(&hp->lock, flags);
107254be490f257fc3f76ca5f869ac8d107b3827025Hendrik Brueckner}
108febde3711992a64ea83a47a719f68a90c4b0927aHendrik Brueckner
109611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger/* default notifier for irq based notification */
110611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraegerextern int notifier_add_irq(struct hvc_struct *hp, int data);
111611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraegerextern void notifier_del_irq(struct hvc_struct *hp, int data);
112fc362e2e0efd8b652ebfb409a4e43e6189c04f6fHendrik Bruecknerextern void notifier_hangup_irq(struct hvc_struct *hp, int data);
113611e097d7707741a336a0677d9d69bec40f29f3dChristian Borntraeger
1141c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman
1151c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman#if defined(CONFIG_XMON) && defined(CONFIG_SMP)
1161c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman#include <asm/xmon.h>
1171c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman#else
1181c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellermanstatic inline int cpus_are_in_xmon(void)
1191c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman{
1201c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman	return 0;
1211c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman}
1221c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman#endif
1231c8950ff87de950a3b6ccfb26650fc0a56278836Michael Ellerman
12445d607ed92695d7543f5e1fc5b133cd69834e3e4Ryan S. Arnold#endif // HVC_CONSOLE_H
125