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