2020-03-01 20:04:25 +03:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
2006-03-27 23:25:16 +04:00
|
|
|
/*
|
|
|
|
* hvc_console.h
|
|
|
|
* Copyright (C) 2005 IBM Corporation
|
|
|
|
*
|
|
|
|
* Author(s):
|
|
|
|
* Ryan S. Arnold <rsa@us.ibm.com>
|
|
|
|
*
|
|
|
|
* hvc_console header information:
|
2008-08-01 09:20:30 +04:00
|
|
|
* moved here from arch/powerpc/include/asm/hvconsole.h
|
2006-03-27 23:25:16 +04:00
|
|
|
* and drivers/char/hvc_console.c
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HVC_CONSOLE_H
|
|
|
|
#define HVC_CONSOLE_H
|
2008-06-20 17:24:08 +04:00
|
|
|
#include <linux/kref.h>
|
2008-10-14 09:02:09 +04:00
|
|
|
#include <linux/tty.h>
|
2009-08-27 05:45:39 +04:00
|
|
|
#include <linux/spinlock.h>
|
2006-03-27 23:25:16 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* This is the max number of console adapters that can/will be found as
|
|
|
|
* console devices on first stage console init. Any number beyond this range
|
|
|
|
* can't be used as a console device but is still a valid tty device.
|
|
|
|
*/
|
|
|
|
#define MAX_NR_HVC_CONSOLES 16
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The Linux TTY code does not support dynamic addition of tty derived devices
|
|
|
|
* so we need to know how many tty devices we might need when space is allocated
|
|
|
|
* for the tty device. Since this driver supports hotplug of vty adapters we
|
|
|
|
* need to make sure we have enough allocated.
|
|
|
|
*/
|
|
|
|
#define HVC_ALLOC_TTY_ADAPTERS 8
|
|
|
|
|
2008-06-20 17:24:08 +04:00
|
|
|
struct hvc_struct {
|
2012-04-02 15:54:21 +04:00
|
|
|
struct tty_port port;
|
2008-06-20 17:24:08 +04:00
|
|
|
spinlock_t lock;
|
|
|
|
int index;
|
|
|
|
int do_wakeup;
|
|
|
|
char *outbuf;
|
|
|
|
int outbuf_size;
|
|
|
|
int n_outbuf;
|
|
|
|
uint32_t vtermno;
|
2010-01-18 06:44:57 +03:00
|
|
|
const struct hv_ops *ops;
|
2008-06-20 17:24:08 +04:00
|
|
|
int irq_requested;
|
|
|
|
int data;
|
2008-10-14 09:02:09 +04:00
|
|
|
struct winsize ws;
|
|
|
|
struct work_struct tty_resize;
|
2008-06-20 17:24:08 +04:00
|
|
|
struct list_head next;
|
2016-07-11 06:38:57 +03:00
|
|
|
unsigned long flags;
|
2008-06-20 17:24:08 +04:00
|
|
|
};
|
2006-03-27 23:25:16 +04:00
|
|
|
|
|
|
|
/* implemented by a low level driver */
|
|
|
|
struct hv_ops {
|
|
|
|
int (*get_chars)(uint32_t vtermno, char *buf, int count);
|
|
|
|
int (*put_chars)(uint32_t vtermno, const char *buf, int count);
|
2018-04-30 17:55:57 +03:00
|
|
|
int (*flush)(uint32_t vtermno, bool wait);
|
2006-03-27 23:25:16 +04:00
|
|
|
|
2008-10-14 03:12:48 +04:00
|
|
|
/* Callbacks for notification. Called in open, close and hangup */
|
2008-06-20 17:24:08 +04:00
|
|
|
int (*notifier_add)(struct hvc_struct *hp, int irq);
|
|
|
|
void (*notifier_del)(struct hvc_struct *hp, int irq);
|
2008-10-14 03:12:48 +04:00
|
|
|
void (*notifier_hangup)(struct hvc_struct *hp, int irq);
|
powerpc/pseries: Re-implement HVSI as part of hvc_vio
On pseries machines, consoles are provided by the hypervisor using
a low level get_chars/put_chars type interface. However, this is
really just a transport to the service processor which implements
them either as "raw" console (networked consoles, HMC, ...) or as
"hvsi" serial ports.
The later is a simple packet protocol on top of the raw character
interface that is supposed to convey additional "serial port" style
semantics. In practice however, all it does is provide a way to
read the CD line and set/clear our DTR line, that's it.
We currently implement the "raw" protocol as an hvc console backend
(/dev/hvcN) and the "hvsi" protocol using a separate tty driver
(/dev/hvsi0).
However this is quite impractical. The arbitrary difference between
the two type of devices has been a major source of user (and distro)
confusion. Additionally, there's an additional mini -hvsi implementation
in the pseries platform code for our low level debug console and early
boot kernel messages, which means code duplication, though that low
level variant is impractical as it's incapable of doing the initial
protocol negociation to establish the link to the FSP.
This essentially replaces the dedicated hvsi driver and the platform
udbg code completely by extending the existing hvc_vio backend used
in "raw" mode so that:
- It now supports HVSI as well
- We add support for hvc backend providing tiocm{get,set}
- It also provides a udbg interface for early debug and boot console
This is overall less code, though this will only be obvious once we
remove the old "hvsi" driver, which is still available for now. When
the old driver is enabled, the new code still kicks in for the low
level udbg console, replacing the old mini implementation in the platform
code, it just doesn't provide the higher level "hvc" interface.
In addition to producing generally simler code, this has several benefits
over our current situation:
- The user/distro only has to deal with /dev/hvcN for the hypervisor
console, avoiding all sort of confusion that has plagued us in the past
- The tty, kernel and low level debug console all use the same code
base which supports the full protocol establishment process, thus the
console is now available much earlier than it used to be with the
old HVSI driver. The kernel console works much earlier and udbg is
available much earlier too. Hackers can enable a hard coded very-early
debug console as well that works with HVSI (previously that was only
supported for the "raw" mode).
I've tried to keep the same semantics as hvsi relative to how I react
to things like CD changes, with some subtle differences though:
- I clear DTR on close if HUPCL is set
- Current hvsi triggers a hangup if it detects a up->down transition
on CD (you can still open a console with CD down). My new implementation
triggers a hangup if the link to the FSP is severed, and severs it upon
detecting a up->down transition on CD.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2011-05-12 07:46:38 +04:00
|
|
|
|
|
|
|
/* tiocmget/set implementation */
|
|
|
|
int (*tiocmget)(struct hvc_struct *hp);
|
|
|
|
int (*tiocmset)(struct hvc_struct *hp, unsigned int set, unsigned int clear);
|
2013-07-02 19:07:14 +04:00
|
|
|
|
|
|
|
/* Callbacks to handle tty ports */
|
|
|
|
void (*dtr_rts)(struct hvc_struct *hp, int raise);
|
2008-06-20 17:24:08 +04:00
|
|
|
};
|
2006-03-27 23:25:16 +04:00
|
|
|
|
|
|
|
/* Register a vterm and a slot index for use as a console (console_init) */
|
2010-01-18 06:44:57 +03:00
|
|
|
extern int hvc_instantiate(uint32_t vtermno, int index,
|
|
|
|
const struct hv_ops *ops);
|
2006-03-27 23:25:16 +04:00
|
|
|
|
|
|
|
/* register a vterm for hvc tty operation (module_init or hotplug add) */
|
2010-01-18 06:44:58 +03:00
|
|
|
extern struct hvc_struct * hvc_alloc(uint32_t vtermno, int data,
|
|
|
|
const struct hv_ops *ops, int outbuf_size);
|
2008-06-20 17:24:08 +04:00
|
|
|
/* remove a vterm from hvc tty operation (module_exit or hotplug remove) */
|
2008-10-14 03:12:52 +04:00
|
|
|
extern int hvc_remove(struct hvc_struct *hp);
|
2006-03-27 23:25:16 +04:00
|
|
|
|
2008-06-20 17:24:08 +04:00
|
|
|
/* data available */
|
|
|
|
int hvc_poll(struct hvc_struct *hp);
|
|
|
|
void hvc_kick(void);
|
|
|
|
|
2008-10-14 09:02:09 +04:00
|
|
|
/* Resize hvc tty terminal window */
|
2009-08-27 05:45:39 +04:00
|
|
|
extern void __hvc_resize(struct hvc_struct *hp, struct winsize ws);
|
|
|
|
|
|
|
|
static inline void hvc_resize(struct hvc_struct *hp, struct winsize ws)
|
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&hp->lock, flags);
|
|
|
|
__hvc_resize(hp, ws);
|
|
|
|
spin_unlock_irqrestore(&hp->lock, flags);
|
|
|
|
}
|
2008-10-14 09:02:09 +04:00
|
|
|
|
2008-06-20 17:24:08 +04:00
|
|
|
/* default notifier for irq based notification */
|
|
|
|
extern int notifier_add_irq(struct hvc_struct *hp, int data);
|
|
|
|
extern void notifier_del_irq(struct hvc_struct *hp, int data);
|
2008-10-14 03:12:48 +04:00
|
|
|
extern void notifier_hangup_irq(struct hvc_struct *hp, int data);
|
2008-06-20 17:24:08 +04:00
|
|
|
|
2008-05-08 08:27:17 +04:00
|
|
|
|
|
|
|
#if defined(CONFIG_XMON) && defined(CONFIG_SMP)
|
|
|
|
#include <asm/xmon.h>
|
|
|
|
#else
|
|
|
|
static inline int cpus_are_in_xmon(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2006-03-27 23:25:16 +04:00
|
|
|
#endif // HVC_CONSOLE_H
|