summaryrefslogtreecommitdiff
path: root/usr/src/man/man7i/visual_io.7i
blob: 56cb1da663038141a83fe95c8479e9ef8cd1886b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
.\" Copyright (c) 2005, Sun Microsystems, Inc.  All Rights Reserved
.\" Copyright 2018, Joyent, Inc.
.\" The contents of this file are subject to the terms of the
.\" Common Development and Distribution License (the "License").
.\" You may not use this file except in compliance with the License.
.\"
.\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
.\" or http://www.opensolaris.org/os/licensing.
.\" See the License for the specific language governing permissions
.\" and limitations under the License.
.\"
.\" When distributing Covered Code, include this CDDL HEADER in each
.\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
.\" If applicable, add the following below this CDDL HEADER, with the
.\" fields enclosed by brackets "[]" replaced with your own identifying
.\" information: Portions Copyright [yyyy] [name of copyright owner]
.Dd August 31, 2018
.Dt VISUAL_IO 7I
.Os
.Sh NAME
.Nm visual_io
.Nd illumos VISUAL I/O control operations
.Sh SYNOPSIS
.In sys/visual_io.h
.Sh DESCRIPTION
The illumos VISUAL environment defines a small set of ioctls for controlling
graphics and imaging devices.
.Pp
The
.Dv VIS_GETIDENTIFIER
ioctl is mandatory and must be implemented in
device drivers for graphics devices using the illumos VISUAL environment.
The
.Dv VIS_GETIDENTIFIER
ioctl is defined to return a device identifier from the device driver.
This identifier must be a uniquely-defined string.
.Pp
There are two additional sets of ioctls.
One supports mouse tracking via hardware cursor operations.
Use of this set is optional, however, if a graphics
device has hardware cursor support and implements these ioctls, the mouse
tracking performance is improved.
The remaining set supports the device acting
as the system console device.
Use of this set is optional, but if a graphics device is to be used as the
system console device, it must implement these ioctls.
.Pp
The VISUAL environment also defines interfaces for non-ioctl entry points into
the driver that the illumos operating environment calls when it is running in
standalone mode (for example, when using a stand-alone debugger, entering
the PROM monitor, or when the system panicking).
These are also known as
.Dq Polled I/O
entry points, which operate under an an explicit set of restrictions, described below.
.Sh IOCTLS
.Bl -tag -width VIS_GETIDENTIFIER -compact
.It Dv VIS_GETIDENTIFIER
This
.Xr ioctl 2
returns an identifier string to uniquely identify a device
used in the illumos VISUAL environment.
This is a mandatory ioctl and must return a unique string.
We suggest that the name be formed as
.Ao companysymbol Ac Ns Ao devicetype Ac .
For example, the
.Xr cgsix 7D
driver
returns
.Sy SUNWcg6 .
.Pp
.Dv VIS_GETIDENTIFIER
takes a
.Vt vis_identifier
structure as its parameter.
This structure has the form:
.Bd -literal -offset 2n
#define VIS_MAXNAMELEN 128
struct vis_identifier {
       char name[VIS_MAXNAMELEN];
};
.Ed
.Pp
.It Dv VIS_GETCURSOR
.It Dv VIS_SETCURSOR
These ioctls fetch and set various cursor attributes, using the
.Vt vis_cursor
structure.
.Bd -literal -offset 2n
struct vis_cursorpos {
   short x; /* cursor x coordinate */
   short y; /* cursor y coordinate */
};

struct vis_cursorcmap {
    int	version;          /* version */
    int	reserved;
    /* red color map elements */
    unsigned char *red;
    /* green color map elements */
    unsigned char *green;
    /* blue color map elements */
    unsigned char *blue;
};

#define VIS_CURSOR_SETCURSOR   0x01  /* set cursor */
        /* set cursor position */
#define VIS_CURSOR_SETPOSITION 0x02
        /* set cursur hot spot */
#define VIS_CURSOR_SETHOTSPOT  0x04
        /* set cursor colormap */
#define VIS_CURSOR_SETCOLORMAP 0x08
        /* set cursor shape */
#define VIS_CURSOR_SETSHAPE 0x10
#define VIS_CURSOR_SETALL	\e
    (VIS_CURSOR_SETCURSOR | VIS_CURSOR_SETPOSITION | \e
    VIS_CURSOR_SETHOTSPOT | VIS_CURSOR_SETCOLORMAP | \e
    VIS_CURSOR_SETSHAPE)

struct vis_cursor {
    short set;                  /* what to set */
    short enable;               /* cursor on/off */
    struct vis_cursorpos pos;   /* cursor position */
    struct  vis_cursorpos hot;  /* cursor hot spot */
    struct vis_cursorcmap cmap; /* color map info */
    /* cursor bitmap size */
    struct vis_cursorpos size;
    char  *image;              /* cursor image bits */
    char  *mask;               /* cursor mask bits */
};
.Ed
.Pp
The
.Vt vis_cursorcmap
structure should contain pointers to two elements,
specifying the red, green, and blue values for foreground and background.
.Pp
.It Dv VIS_SETCURSORPOS
.It Dv VIS_MOVECURSOR
These ioctls fetch and move the current cursor position, using the
.Vt vis_cursorpos
structure.
.El
.Ss "Console Optional Ioctls"
The following ioctl sets are used by graphics drivers that are part of the
system console device.
All of the ioctls must be implemented to be a console device.
In addition, if the system does not have a prom or the prom goes away
during boot, the special standalone ioctls (listed below) must also be
implemented.
.Pp
The coordinate system for the console device places 0,0 at the upper left
corner of the device, with rows increasing toward the bottom of the device and
columns increasing from left to right.
.Pp
.Bl -tag -width VIS_CONSDISPLAY -compact -offset 2n
.It Dv VIS_PUTCMAP
.It Dv VIS_GETCMAP
Set or get color map entries.
.Pp
The argument is a pointer to a
.Vt vis_cmap
structure, which contains the
following fields:
.Bd -literal -offset 2n
struct vis_cmap {
    int		index;
    int		count;
    uchar_t	*red;
    uchar_t	*green;
    uchar_t	*blue;
}
.Ed
.Pp
.Fa index
is the starting index in the color map where you want to start
setting or getting color map entries.
.Pp
.Fa count
is the number of color map entries to set or get.
It also is the
size of the
.Fa red ,
.Fa green ,
and
.Fa blue
color arrays.
.Pp
.Fa *red ,
.Fa *green ,
and
.Fa *blue
are pointers to unsigned character arrays which contain the color map info to
set or where the color map info is placed on a get.
.Pp
.It Dv VIS_DEVINIT
Initializes the graphics driver as a console device.
.Pp
The argument is a pointer to a
.Vt vis_devinit
structure.
The graphics driver
is expected to allocate any local state information needed to be a console
device and fill in this structure.
.Bd -literal -offset 2n
struct vis_devinit {
    int  version;
    screen_size_t  width;
    screen_size_t  height;
    screen_size_t  linebytes;
    unit_t	   size;
    int	           depth;
    short          mode;
    struct vis_polledio    *polledio;
    vis_modechg_cb_t       modechg_cb;
    struct vis_modechg_arg *modechg_arg;
};
.Ed
.Pp
.Fa version
is the version of this structure and should be set to
.Dv VIS_CONS_REV .
.Pp
.Fa width
and
.Fa height
are the width and height of the device.
If
.Fa mode
(see below) is
.Dv VIS_TEXT
then
.Fa width
and
.Fa height
are the number of characters wide and high of the device.
If
.Fa mode
is
.Dv VIS_PIXEL
then
.Fa width
and
.Fa height
are the number of pixels wide and high of the device.
.Pp
.Fa linebytes
is the number of bytes per line of the device.
.Pp
.Fa size
is the total size of the device in pixels.
.Pp
.Fa depth
is the pixel depth in device bits.
Currently supported depths are:
.Sy 1 ,
.Sy 4 ,
.Sy 8
and
.Sy 24 .
.Pp
.Fa mode
is the mode of the device.
Either
.Dv VIS_PIXEL
(data to be displayed is in bitmap format) or
.Dv VIS_TEXT
(data to be displayed is in ascii format).
.Pp
.Fa polledio
is used to pass the address of the structure containing the
standalone mode polled I/O entry points to the device driver back to the
terminal emulator.
The
.Vt vis_polledio
interfaces are described in the
Console Standalone Entry Points section of this manpage.
These entry points are where the operating system enters the driver when the
system is running in standalone mode.
These functions perform identically to the
.Dv VIS_CONSDISPLAY ,
.Dv VIS_CONSCURSOR ,
and
.Dv VIS_CONSCOPY
ioctls, but are called directly by the illumos
operating environment and must operate under a very strict set of assumptions.
.Pp
.Fa modechg_cb
is a callback function passed from the terminal emulator to
the framebuffer driver which the frame-buffer driver must call whenever a video
mode change event occurs that changes the screen height, width or depth.
The callback takes two arguments, an opaque handle,
.Fa modechg_arg ,
and the address of a
.Vt vis_devinit
struct containing the new video mode information.
.Pp
.Fa modechg_arg
is an opaque handle passed from the terminal emulator to the
driver, which the driver must pass back to the terminal emulator as an argument
to the
.Fa modechg_cb
function when the driver notifies the terminal emulator of a video mode change.
.Pp
.It Dv VIS_DEVFINI
Tells the graphics driver that it is no longer the system console device.
There is no argument to this ioctl.
The driver is expected to free any locally kept
state information related to the console.
.Pp
.It Dv VIS_CONSCURSOR
Describes the size and placement of the cursor on the screen.
The graphics
driver is expected to display or hide the cursor at the indicated position.
.Pp
The argument is a pointer to a
.Vt vis_conscursor
structure which contains
the following fields:
.Bd -literal -offset 2n
struct vis_conscursor {
    screen_pos_t   row;
    screen_pos_t   col;
    screen_size_t  width;
    screen_size_t  height
    color_t        fg_color;
    color_t        bg_color;
    short          action;
};
.Ed
.Pp
.Fa row
and
.Fa col
are the first row and column (upper left corner of the cursor).
.Pp
.Fa width
and
.Fa height
are the width and height of the cursor.
.Pp
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl is set to
.Dv VIS_PIXEL ,
then
.Fa col ,
.Fa row ,
.Fa width
and
.Fa height
are in pixels.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_TEXT ,
then
.Fa col ,
.Fa row ,
.Fa width
and
.Fa height
are in characters.
.Pp
.Fa fg_color
and
.Fa bg_color
are the foreground and background color map
indexes to use when the
.Fa action
(see below) is set to
.Dv VIS_DISPLAY_CURSOR .
.Pp
.Fa action
indicates whether to display or hide the cursor.
It is set to either
.Dv VIS_HIDE_CURSOR
or
.Dv VIS_DISPLAY_CURSOR .
.Pp
.It Dv VIS_CONSDISPLAY
Display data on the graphics device.
The graphics driver is expected to display the data contained in the
.Vt vis_display
structure at the specified position on the console.
.Pp
The
.Vt vis_display
structure contains the following fields:
.Bd -literal -offset 2n
struct vis_display {
    screen_pos_t   row;
    screen_pos_t   col;
    screen_size_t  width;
    screen_size_t  height;
    uchar_t        *data;
    color_t        fg_color;
    color_t        bg_color;
};
.Ed
.Pp
.Fa row
and
.Fa col
specify at which starting row and column the date is to be displayed.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_TEXT ,
.Fa row
and
.Fa col
are defined to be a character offset
from the starting position of the console device.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_PIXEL ,
.Fa row
and
.Fa col
are defined to be a pixel offset from the starting position of the console
device.
.Pp
.Fa width
and
.Fa height
specify the size of the
.Fa data
to be displayed.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_TEXT ,
.Fa width
and
.Fa height
define the size of
.Fa data
as rectangle that is
.Fa width
characters wide and
.Fa height
characters high.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_PIXEL ,
.Fa width
and
.Fa height
define the size of
.Fa data
as a rectangle that is
.Fa width
pixels wide and
.Fa height
pixels high.
.Pp
.Fa *data
is a pointer to the data to be displayed on the console device.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_TEXT ,
.Fa data
is an array of
.Sy ASCII
characters to be displayed on the console device.
The driver must break these characters up appropriately and display it in the
rectangle defined by
.Fa row ,
.Fa col ,
.Fa width ,
and
.Fa height .
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_PIXEL ,
.Fa data
is an array of bitmap data to be displayed on the console device.
The driver must break this data up appropriately and display it in the retangle
defined by
.Fa row ,
.Fa col ,
.Fa width ,
and
.Fa height .
.Pp
The
.Fa fg_color
and
.Fa bg_color
fields define the foreground and
background color map indexes to use when displaying the data.
.Fa fb_color
is used for
.Dq on
pixels and
.Fa bg_color
is used for
.Dq off
pixels.
.Pp
.It Dv VIS_CONSCOPY
Copy data from one location on the device to another.
The driver is expected to copy the specified data.
The source data should not be modified.
Any modifications to the source data should be as a side effect of the copy
destination overlapping the copy source.
.Pp
The argument is a pointer to a
.Vt vis_copy
structure which contains the following fields:
.Bd -literal -offset 2n
struct vis_copy {
    screen_pos_t  s_row;
    screen_pos_t  s_col;
    screen_pos_t  e_row;
    screen_pos_t  e_col;
    screen_pos_t  t_row;
    screen_pos_t  t_col;
    short         direction;
};
.Ed
.Pp
.Fa s_row ,
.Fa s_col ,
.Fa e_row ,
and
.Fa e_col
define the source rectangle of the copy.
.Fa s_row
and
.Fa s_col
are the upper left corner of the source rectangle.
.Fa e_row
and
.Fa e_col
are the lower right corner of the source rectangle.
If
.Fa mode
in the
.Dv VIS_DEVINIT
.Fn ioctl
was set to
.Dv VIS_TEXT ,
.Fa s_row ,
.Fa s_col ,
.Fa e_row ,
and
.Fa e_col
are defined to be character offsets from the starting position of the console
device.
If
.Fa mode
in the
.Dv VIS_DEVINIT
.Fn ioctl
was set to
.Dv VIS_PIXEL ,
.Fa s_row ,
.Fa s_col ,
.Fa e_row ,
and
.Fa e_col
are
defined to be pixel offsets from the starting position of the console device.
.Pp
.Fa t_row
and
.Fa t_col
define the upper left corner of the destination rectangle of the copy.
The entire rectangle is copied to this location.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_TEXT ,
.Fa t_row ,
and
.Fa t_col
are defined to be character offsets from the
starting position of the console device.
If
.Fa mode
in the
.Dv VIS_DEVINIT
ioctl was set to
.Dv VIS_PIXEL ,
.Fa t_row ,
and
.Fa t_col
are defined to be pixel offsets from the starting position of the
onssole device.
.Pp
.Fa direction
specifies which way to do the copy.
If direction is
.Dv VIS_COPY_FORWARD
the graphics driver should copy data from position
.Po
.Fa s_row ,
.Fa s_col
.Pc
in the source rectangle to position
.Po
.Fa t_row ,
.Fa t_col
.Pc
in the destination rectangle.
If direction is
.Dv VIS_COPY_BACKWARDS
the graphics driver should copy data from position
.Po
.Fa e_row ,
.Fa e_col
.Pc
in the source rectangle to position
.Po
.Fa t_row Ns + Ns
.Po
.Fa e_row Ns \- Ns
.Fa s_row
.Pc ,
.Fa t_col Ns + Ns
.Po
.Fa e_col Ns \- Ns
.Fa s_col
.Pc
.Pc
in the destination rectangle.
.El
.Ss "Console Standalone Entry Points  (Polled I/O Interfaces)"
Console standalone entry points are necessary only if the driver is
implementing console-compatible extensions.
All console vectored standalone
entry points must be implemented along with all console-related ioctls if the
console extension is implemented.
.Bd -literal -offset 2n
struct vis_polledio {
    struct vis_polledio_arg *arg;
    void    (*display)(vis_polledio_arg *, struct vis_consdisplay *);
    void    (*copy)(vis_polledio_arg *, struct vis_conscopy *);
    void    (*cursor)(vis_polledio_arg *, struct vis_conscursor *);
};
.Ed
.Pp
The
.Vt vis_polledio
structure is passed from the driver to the illumos
operating environment, conveying the entry point addresses of three functions
which perform the same operations of their similarly named ioctl counterparts.
The rendering parameters for each entry point are derived from the same
structure passed as the respective ioctl.
See the
.Sx "Console Optional Ioctls"
section of this manpage for an explanation of the specific function each of the
entry points,
.Fn display ,
.Fn copy ,
and
.Fn cursor
are required to implement.
In
addition to performing the prescribed function of their ioctl counterparts, the
standalone vectors operate in a special context and must adhere to a strict set
of rules.
The polled I/O vectors are called directly whenever the system is
quisced (running in a limited context) and must send output to the display.
Standalone mode describes the state in which the system is running in
single-threaded mode and only one processor is active.
illumos operating
environment services are stopped, along with all other threads on the system,
prior to entering any of the polled I/O interfaces.
The polled I/O vectors are
called when the system is running in a standalone debugger, when executing the
PROM monitor (OBP) or when panicking.
.Pp
The following restrictions must be observed in the polled I/O functions:
.Bl -enum -offset indent
.It
The driver must not allocate memory.
.It
The driver must not wait on mutexes.
.It
The driver must not wait for interrupts.
.It
The driver must not call any DDI or LDI services.
.It
The driver must not call any system services.
.El
.Pp
The system is single-threaded when calling these functions, meaning that all
other threads are effectively halted.
Single-threading makes mutexes (which
cannot be held) easier to deal with, so long as the driver does not disturb any
shared state.
See
.%T Writing Device Drivers
for more information about implementing polled I/O entry points.
.Sh SEE ALSO
.Xr ioctl 2
.Rs
.%T Writing Device Drivers
.Re
.Sh NOTES
On SPARC systems, compatible drivers supporting the kernel terminal emulator
should export the
.Sy tem-support
DDI property.
.Sy tem-support
indicates that the driver supports the kernel terminal emulator.
By exporting
.Sy tem-support
it's possible to avoid premature handling of an incompatible driver.
.Bl -tag -width tem-support
.It Sy tem-support
This DDI property, set to 1, means driver is compatible with the console
kernel framebuffer interface.
.El