1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_SYS_CONSDEV_H
28#define	_SYS_CONSDEV_H
29
30#include <sys/isa_defs.h>
31#include <sys/dditypes.h>
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37
38#if defined(_KERNEL) || defined(_KMDB)
39
40/*
41 * Paths to console devices
42 */
43#define	CONSKBD_PATH	"/pseudo/conskbd@0:conskbd"
44#define	CONSMS_PATH	"/pseudo/consms@0:mouse"
45#define	WC_PATH		"/pseudo/wc@0:wscons"
46#define	IWSCN_PATH	"/pseudo/iwscn@0:iwscn"
47#define	CVC_PATH	"/pseudo/cvc@0:cvc"
48
49/*
50 * Console redirection.
51 */
52extern dev_t	rconsdev;	/* real (underlying) console */
53extern struct vnode *rconsvp;	/* pointer to vnode for that device */
54
55/*
56 * Virtual Serial Console redirection.
57 */
58extern struct vnode *vsconsvp;	/* pointer to vnode for virtual console */
59
60/*
61 * Mouse, keyboard, and frame buffer configuration information.
62 *
63 * XXX:	Assumes a single mouse/keyboard/frame buffer triple.
64 */
65extern dev_t	mousedev;	/* default mouse device */
66extern dev_t	kbddev;		/* default (actual) keyboard device */
67extern dev_t	stdindev;	/* default standard input device */
68extern dev_t	fbdev;		/* default framebuffer device */
69extern struct vnode *fbvp;	/* pointer to vnode for that device */
70extern dev_info_t *fbdip;	/* pointer to dev_info for fbdev (optional) */
71
72extern int	consmode;	/* CONS_FW or CONS_KFB */
73extern int	cons_tem_disable;
74#define	CONS_FW		0
75#define	CONS_KFB	1
76
77/*
78 * Workstation console redirection.
79 *
80 * The workstation console device is the multiplexor that hooks keyboard and
81 * frame buffer together into a single tty-like device.  Access to it is
82 * through the redirecting driver, so that frame buffer output can be
83 * redirected to other devices.  wsconsvp names the redirecting access point,
84 * and rwsconsvp names the workstation console itself.
85 *
86 * XXX:	Assumes a single workstation console.
87 */
88extern struct vnode *wsconsvp;	/* vnode for redirecting ws cons access */
89extern struct vnode *rwsconsvp;	/* vnode for underlying workstation console */
90
91/*
92 * Generic console ioctls.
93 *
94 * On systems without OBP, all potential console devices should implement these.
95 *
96 * On systems with OBP, all potential console devices should implement
97 * the ABORTENABLE ioctls.  All potential console devices that cannot share
98 * their hardware with OBP should implement the POLLEDIO ioctls.
99 */
100#define	_CONSIOC	(('C'<<24)|('O'<<16)|('N'<<8))
101
102/*
103 * Get the structure of function pointers to be used for polled I/O
104 *
105 *	struct cons_polledio *polledio;
106 *	struct strioctl str;
107 *
108 *	str.ic_cmd = CONS_OPENPOLLEDIO;
109 *	str.ic_timout = INFTIM;
110 *	str.ic_len = sizeof (polledio);
111 *	str.ic_dp = (char *)&polledio;
112 *	ioctl(fd, I_STR, &str);
113 */
114#define	CONSOPENPOLLEDIO	(_CONSIOC|0)
115
116/*
117 * Get the current state of abort enable
118 * enable = ioctl(fd, CONSGETABORTENABLE, 0)
119 */
120#define	CONSGETABORTENABLE	(_CONSIOC|1)
121
122/*
123 * Set the current state of abort enable
124 * ioctl(fd, CONSSETABORTENABLE, boolean_t)
125 */
126#define	CONSSETABORTENABLE	(_CONSIOC|2)
127
128/*
129 * Undo anything that was done with CONSOPENPOLLEDIO
130 * ioctl(fd, CONSCLOSEPOLLEDIO, 0)
131 */
132#define	CONSCLOSEPOLLEDIO	(_CONSIOC|3)
133
134/*
135 * Set the type simulated by hardwares
136 * ioctl(fd, CONSSETKBDTYPE, kbdtype)
137 * kbdtype:
138 * 	KB_PC or KB_USB
139 */
140#define	CONSSETKBDTYPE		(_CONSIOC|4)
141
142#define	CONSPOLLEDIO_V0		0
143#define	CONSPOLLEDIO_V1		1
144
145typedef int kbtrans_key_t;
146
147enum keystate { KEY_PRESSED = 0, KEY_RELEASED = 1 };
148
149
150/*
151 * Opaque state structure for driver state.  Each driver has its own
152 * implementation (with different names!), and casts to/from this.
153 * This allows better type-checking than "void *", helping to ensure
154 * that the structure passed in is the structure used in the callback.
155 */
156typedef struct __cons_polledio_arg	*cons_polledio_arg_t;
157
158/*
159 * This is the structure that is used to handle polled I/O.  It is filled
160 * in by a lower driver, passed up, and eventually registered with the
161 * debugger that needs to do polled I/O.
162 */
163typedef struct cons_polledio {
164
165	/*
166	 * version of this structure
167	 */
168	unsigned	cons_polledio_version;
169
170	/*
171	 * Argument that is passed to the following routines.
172	 */
173	cons_polledio_arg_t	cons_polledio_argument;
174
175	/*
176	 * Pointer to the routine and its argument that handles putting
177	 * characters out to the polled device.
178	 */
179	void		(*cons_polledio_putchar)(cons_polledio_arg_t,
180				uchar_t);
181
182	/*
183	 * Pointer to the routine and its argument that handles getting
184	 * characters from the polled device.  This routine is blocking.
185	 */
186	int		(*cons_polledio_getchar)(cons_polledio_arg_t);
187
188	/*
189	 * Pointer to the routine and its argument that checks to see
190	 * if a character is pending input.  This routine is non-blocking.
191	 */
192	boolean_t	(*cons_polledio_ischar)(cons_polledio_arg_t);
193
194	/*
195	 * Initialize the polled subsystem.  This routine is called once
196	 * per mode change from non-polled to polled mode.
197	 */
198	void		(*cons_polledio_enter)(cons_polledio_arg_t);
199
200	/*
201	 * Restore the non-polled subsystem.  This routine is called once
202	 * per mode change from non-polled to polled mode.
203	 */
204	void		(*cons_polledio_exit)(cons_polledio_arg_t);
205
206
207	/* Routine to set the LED's in polled mode */
208	void	(*cons_polledio_setled)(cons_polledio_arg_t, int);
209
210	/* Routine to indicate that a scande is available in polled mode */
211	boolean_t	(*cons_polledio_keycheck)(
212			    cons_polledio_arg_t,
213			    kbtrans_key_t *, enum keystate *);
214} cons_polledio_t;
215
216extern cons_polledio_t *cons_polledio;
217
218/*
219 * Workstation Console
220 */
221#define	_WCIOC		(('W'<<24)|('C'<<16))
222#define	WC_OPEN_FB	(_WCIOC | 0)
223#define	WC_CLOSE_FB	(_WCIOC | 1)
224
225#endif	/* _KERNEL || _KMDB */
226
227#ifdef	__cplusplus
228}
229#endif
230
231#endif	/* _SYS_CONSDEV_H */
232