xref: /illumos-gate/usr/src/uts/common/sys/visual_io.h (revision 66582b606a8194f7f3ba5b3a3a6dca5b0d346361)
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 2006 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _SYS_VISUAL_IO_H
28 #define	_SYS_VISUAL_IO_H
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #define	VIOC	('V' << 8)
35 #define	VIOCF	('F' << 8)
36 
37 
38 /*
39  * Device Identification
40  *
41  * VIS_GETIDENTIFIER returns an identifier string to uniquely identify
42  * a device type used in the Solaris VISUAL environment.  The identifier
43  * must be unique.  We suggest the convention:
44  *
45  *	<companysymbol><devicetype>
46  *
47  * for example: SUNWcg6
48  */
49 
50 #define	VIS_MAXNAMELEN 128
51 
52 struct vis_identifier {
53 	char name[VIS_MAXNAMELEN];	/* <companysymbol><devicename>	*/
54 };
55 
56 #define	VIS_GETIDENTIFIER	(VIOC | 0)
57 
58 
59 
60 /*
61  * Hardware Cursor Control
62  *
63  * Devices with hardware cursors may implement these ioctls in their
64  * kernel device drivers.
65  */
66 
67 
68 struct vis_cursorpos {
69 	short x;		/* cursor x coordinate	*/
70 	short y;		/* cursor y coordinate	*/
71 };
72 
73 struct vis_cursorcmap {
74 	int		version;	/* version			*/
75 	int		reserved;
76 	unsigned char	*red;		/* red color map elements	*/
77 	unsigned char	*green;		/* green color map elements	*/
78 	unsigned char	*blue;		/* blue color map elements	*/
79 };
80 
81 
82 /*
83  * These ioctls fetch and set various cursor attributes, using the
84  * vis_cursor struct.
85  */
86 
87 #define	VIS_SETCURSOR	(VIOCF|24)
88 #define	VIS_GETCURSOR	(VIOCF|25)
89 
90 struct vis_cursor {
91 	short			set;		/* what to set		*/
92 	short			enable;		/* cursor on/off	*/
93 	struct vis_cursorpos	pos;		/* cursor position	*/
94 	struct vis_cursorpos	hot;		/* cursor hot spot	*/
95 	struct vis_cursorcmap	cmap;		/* color map info	*/
96 	struct vis_cursorpos	size;		/* cursor bit map size	*/
97 	char			*image;		/* cursor image bits	*/
98 	char			*mask;		/* cursor mask bits	*/
99 };
100 
101 #define	VIS_CURSOR_SETCURSOR	0x01		/* set cursor		*/
102 #define	VIS_CURSOR_SETPOSITION	0x02		/* set cursor position	*/
103 #define	VIS_CURSOR_SETHOTSPOT	0x04		/* set cursor hot spot	*/
104 #define	VIS_CURSOR_SETCOLORMAP	0x08		/* set cursor colormap	*/
105 #define	VIS_CURSOR_SETSHAPE	0x10		/* set cursor shape	*/
106 
107 #define	VIS_CURSOR_SETALL	(VIS_CURSOR_SETCURSOR | \
108     VIS_CURSOR_SETPOSITION	| \
109     VIS_CURSOR_SETHOTSPOT	| \
110     VIS_CURSOR_SETCOLORMAP	| \
111     VIS_CURSOR_SETSHAPE)
112 
113 
114 /*
115  * These ioctls fetch and move the current cursor position, using the
116  * vis_cursorposition struct.
117  */
118 
119 #define	VIS_MOVECURSOR		(VIOCF|26)
120 #define	VIS_GETCURSORPOS	(VIOCF|27)
121 
122 /*
123  * VIS_SETCMAP:
124  * VIS_GETCMAP:
125  * Set/Get the indicated color map entries.  The index states the first
126  * color to be update and count specifies the number of entries to be
127  * updated from index.  red, green, and blue are arrays of color
128  * values.  The length of the arrays is count.
129  */
130 #define	VIS_GETCMAP	(VIOC|9)
131 #define	VIS_PUTCMAP	(VIOC|10)
132 struct vis_cmap {
133 	int		index; /* Index into colormap to start updating */
134 	int		count; /* Number of entries to update */
135 	unsigned char	*red; /* List of red values */
136 	unsigned char	*green; /* List of green values */
137 	unsigned char	*blue; /* List of blue values */
138 };
139 
140 
141 #if defined(_KERNEL) || defined(_STANDALONE)
142 /*
143  * The following ioctls are used for communication between the layered
144  * device and the framebuffer.  The layered driver calls the framebuffer
145  * with these ioctls.
146  *
147  * On machines that don't have a prom, kmdb uses the kernel to display
148  * characters.  The kernel in turn will use the routines returned by
149  * VIS_DEVINIT to ask the framebuffer driver to display the data.  The
150  * framebuffer driver CANNOT use any DDI services to display this data.  It
151  * must just dump the data to the framebuffer.  In particular, the mutex and
152  * copy routines do not work.
153  *
154  * On machines without a prom, the framebuffer driver must implement all
155  * of these ioctls to be a console.  On machines with a prom, the
156  * framebuffer driver can set vis_devinit.polledio to NULL.
157  */
158 typedef short screen_pos_t;
159 typedef short screen_size_t;
160 
161 /*
162  * Union of pixel depths
163  */
164 typedef union {
165 	unsigned char mono;		/* one-bit */
166 	unsigned char four;		/* four bit */
167 	unsigned char eight;		/* eight bit */
168 	unsigned char sixteen[2];	/* 16 bit */
169 	unsigned char twentyfour[3];	/* 24 bit */
170 } color_t;
171 
172 /*
173  * VIS_DEVINIT:
174  * Initialize the framebuffer as a console device.  The terminal emulator
175  * will provide the following structure to the device driver to be filled in.
176  * The driver is expected to fill it in.
177  *
178  * ioctl(fd, VIS_DEVINIT, struct vis_devinit *)
179  */
180 #define	VIS_DEVINIT	(VIOC|1)
181 #define	VIS_CONS_REV		4 /* Console IO interface version */
182 /* Modes */
183 #define	VIS_TEXT		0 /* Use text mode when displaying data */
184 #define	VIS_PIXEL		1 /* Use pixel mode when displaying data */
185 
186 /*
187  * VIS_DEVFINI:
188  * Tells the framebuffer that it is no longer being used as a console.
189  *
190  * ioctl(fd, VIS_DEVFINI, unused)
191  */
192 #define	VIS_DEVFINI	(VIOC|2)
193 
194 /*
195  * VIS_CONSCURSOR:
196  * Display/Hide cursor on the screen.  The layered driver uses this ioctl to
197  * display, hide, and move the cursor on the console.  The framebuffer driver
198  * is expected to draw a cursor at position (col,row) of size width x height.
199  *
200  * ioctl(fd, VIS_CONSCURSOR, struct vis_conscursor *)
201  */
202 #define	VIS_CONSCURSOR		(VIOC|3)
203 /* Cursor action - Either display or hide cursor */
204 #define	VIS_HIDE_CURSOR		0
205 #define	VIS_DISPLAY_CURSOR	1
206 #define	VIS_GET_CURSOR		2
207 
208 /*
209  * VIS_CONSDISPLAY:
210  * Display data on the framebuffer.  The data will be in the form specified
211  * by the driver during console initialization (see VIS_CONSDEVINIT above).
212  * The driver is expected to display the data at location (row,col).  Width
213  * and height specify the size of the data.
214  *
215  * ioctl(fd, VIS_CONSDISPLAY, struct vis_consdisplay *)
216  */
217 
218 #define	VIS_CONSDISPLAY		(VIOC|5)
219 
220 /*
221  * VIS_CONSCOPY:
222  * Move data on the framebuffer.  Used to scroll the screen by the terminal
223  * emulator or to move data by applications.  The driver must copy the data
224  * specified by the rectangle (s_col,s_row),(e_col,e_row) to the location
225  * which starts at (t_col,t_row), handling overlapping copies correctly.
226  *
227  * ioctl(fd, VIS_CONSCOPY, struct vis_conscopy *)
228  */
229 #define	VIS_CONSCOPY		(VIOC|7)
230 
231 /*
232  * VIS_CONSCLEAR:
233  * Clear the screen using provided color. Used on VIS_PIXEL mode.
234  *
235  * ioctl(fd, VIS_CONSCLEAR, struct vis_consclear *)
236  */
237 #define	VIS_CONSCLEAR		(VIOC|8)
238 
239 struct vis_consclear {
240 	unsigned char	bg_color; /* Background color */
241 };
242 
243 struct vis_consdisplay {
244 	screen_pos_t	row; /* Row to display data at */
245 	screen_pos_t	col; /* Col to display data at */
246 	screen_size_t	width; /* Width of data */
247 	screen_size_t	height; /* Height of data */
248 	unsigned char	*data; /* Data to display */
249 	unsigned char	fg_color; /* Foreground color */
250 	unsigned char	bg_color; /* Background color */
251 };
252 
253 struct vis_conscopy {
254 	screen_pos_t	s_row; /* Starting row */
255 	screen_pos_t	s_col; /* Starting col */
256 	screen_pos_t	e_row; /* Ending row */
257 	screen_pos_t	e_col; /* Ending col */
258 	screen_pos_t	t_row; /* Row to move to */
259 	screen_pos_t	t_col; /* Col to move to */
260 };
261 
262 struct vis_conscursor {
263 	screen_pos_t	row; /* Row to display cursor at */
264 	screen_pos_t	col; /* Col to display cursor at */
265 	screen_size_t	width; /* Width of cursor */
266 	screen_size_t	height; /* Height of cursor */
267 	color_t		fg_color; /* Foreground color */
268 	color_t		bg_color; /* Background color */
269 	short		action; /* Hide or show cursor */
270 };
271 
272 /*
273  * Each software-console-capable frame buffer driver defines its own
274  * instance of this (with its own name!) and casts to/from this at the
275  * interface with the terminal emulator.  These yield somewhat better
276  * type checking than "void *".
277  */
278 struct vis_polledio_arg;
279 struct vis_modechg_arg;
280 
281 /*
282  * Each software-console-capable frame buffer driver supplies these routines
283  * for I/O from "polled" contexts - kmdb, OBP, etc.  No system services are
284  * available.
285  */
286 struct vis_polledio {
287 	struct vis_polledio_arg	*arg;
288 	void	(*display)(struct vis_polledio_arg *, struct vis_consdisplay *);
289 	void	(*copy)(struct vis_polledio_arg *, struct vis_conscopy *);
290 	void	(*cursor)(struct vis_polledio_arg *, struct vis_conscursor *);
291 };
292 
293 struct vis_devinit; /* forward decl. for typedef */
294 
295 typedef void (*vis_modechg_cb_t)(struct vis_modechg_arg *,
296     struct vis_devinit *);
297 
298 typedef uint32_t (*color_map_fn_t)(uint8_t color);
299 
300 struct vis_devinit {
301 	/*
302 	 * This set of fields are used as parameters passed from the
303 	 * layered framebuffer driver to the terminal emulator.
304 	 */
305 	int		version;	/* Console IO interface version */
306 	screen_size_t	width;		/* Width of the device */
307 	screen_size_t	height;		/* Height of the device */
308 	screen_size_t	linebytes;	/* Bytes per scan line */
309 	int		depth;		/* Device depth */
310 	color_map_fn_t	color_map;	/* Color map tem -> fb */
311 	short		mode;		/* Mode to use when displaying data */
312 	struct vis_polledio *polledio;	/* Polled output routines */
313 
314 	/*
315 	 * The following fields are used as parameters passed from the
316 	 * terminal emulator to the underlying framebuffer driver.
317 	 */
318 	vis_modechg_cb_t modechg_cb;	/* Video mode change callback */
319 	struct vis_modechg_arg *modechg_arg; /* Mode change cb arg */
320 };
321 
322 struct visual_ops {
323 	const struct vis_identifier *ident;
324 	int (*kdsetmode)(int);
325 	int (*devinit)(struct vis_devinit *);
326 	void (*cons_copy)(struct vis_conscopy *);
327 	void (*cons_display)(struct vis_consdisplay *);
328 	void (*cons_cursor)(struct vis_conscursor *);
329 	int (*cons_clear)(struct vis_consclear *);
330 	int (*cons_put_cmap)(struct vis_cmap *);
331 };
332 
333 #endif	/* _KERNEL || _STANDALONE */
334 
335 #ifdef __cplusplus
336 }
337 #endif
338 
339 #endif	/* !_SYS_VISUAL_IO_H */
340