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(_BOOT)
 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 #endif  /* _KERNEL || _BOOT */
 323 
 324 #ifdef __cplusplus
 325 }
 326 #endif
 327 
 328 #endif  /* !_SYS_VISUAL_IO_H */