root/usr/src/uts/common/sys/visual_io.h
/*
 * CDDL HEADER START
 *
 * 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]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_VISUAL_IO_H
#define _SYS_VISUAL_IO_H

#ifdef __cplusplus
extern "C" {
#endif

#define VIOC    ('V' << 8)
#define VIOCF   ('F' << 8)


/*
 * Device Identification
 *
 * VIS_GETIDENTIFIER returns an identifier string to uniquely identify
 * a device type used in the Solaris VISUAL environment.  The identifier
 * must be unique.  We suggest the convention:
 *
 *      <companysymbol><devicetype>
 *
 * for example: SUNWcg6
 */

#define VIS_MAXNAMELEN 128

struct vis_identifier {
        char name[VIS_MAXNAMELEN];      /* <companysymbol><devicename>  */
};

#define VIS_GETIDENTIFIER       (VIOC | 0)



/*
 * Hardware Cursor Control
 *
 * Devices with hardware cursors may implement these ioctls in their
 * kernel device drivers.
 */


struct vis_cursorpos {
        short x;                /* cursor x coordinate  */
        short y;                /* cursor y coordinate  */
};

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


/*
 * These ioctls fetch and set various cursor attributes, using the
 * vis_cursor struct.
 */

#define VIS_SETCURSOR   (VIOCF|24)
#define VIS_GETCURSOR   (VIOCF|25)

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       */
        struct vis_cursorpos    size;           /* cursor bit map size  */
        char                    *image;         /* cursor image bits    */
        char                    *mask;          /* cursor mask bits     */
};

#define VIS_CURSOR_SETCURSOR    0x01            /* set cursor           */
#define VIS_CURSOR_SETPOSITION  0x02            /* set cursor position  */
#define VIS_CURSOR_SETHOTSPOT   0x04            /* set cursor hot spot  */
#define VIS_CURSOR_SETCOLORMAP  0x08            /* set cursor colormap  */
#define VIS_CURSOR_SETSHAPE     0x10            /* set cursor shape     */

#define VIS_CURSOR_SETALL       (VIS_CURSOR_SETCURSOR | \
    VIS_CURSOR_SETPOSITION      | \
    VIS_CURSOR_SETHOTSPOT       | \
    VIS_CURSOR_SETCOLORMAP      | \
    VIS_CURSOR_SETSHAPE)


/*
 * These ioctls fetch and move the current cursor position, using the
 * vis_cursorposition struct.
 */

#define VIS_MOVECURSOR          (VIOCF|26)
#define VIS_GETCURSORPOS        (VIOCF|27)

/*
 * VIS_SETCMAP:
 * VIS_GETCMAP:
 * Set/Get the indicated color map entries.  The index states the first
 * color to be update and count specifies the number of entries to be
 * updated from index.  red, green, and blue are arrays of color
 * values.  The length of the arrays is count.
 */
#define VIS_GETCMAP     (VIOC|9)
#define VIS_PUTCMAP     (VIOC|10)
struct vis_cmap {
        int             index; /* Index into colormap to start updating */
        int             count; /* Number of entries to update */
        unsigned char   *red; /* List of red values */
        unsigned char   *green; /* List of green values */
        unsigned char   *blue; /* List of blue values */
};


#if defined(_KERNEL) || defined(_STANDALONE)
/*
 * The following ioctls are used for communication between the layered
 * device and the framebuffer.  The layered driver calls the framebuffer
 * with these ioctls.
 *
 * On machines that don't have a prom, kmdb uses the kernel to display
 * characters.  The kernel in turn will use the routines returned by
 * VIS_DEVINIT to ask the framebuffer driver to display the data.  The
 * framebuffer driver CANNOT use any DDI services to display this data.  It
 * must just dump the data to the framebuffer.  In particular, the mutex and
 * copy routines do not work.
 *
 * On machines without a prom, the framebuffer driver must implement all
 * of these ioctls to be a console.  On machines with a prom, the
 * framebuffer driver can set vis_devinit.polledio to NULL.
 */
typedef short screen_pos_t;
typedef short screen_size_t;

/*
 * Union of pixel depths
 */
typedef union {
        unsigned char mono;             /* one-bit */
        unsigned char four;             /* four bit */
        unsigned char eight;            /* eight bit */
        unsigned char sixteen[2];       /* 16 bit */
        unsigned char twentyfour[3];    /* 24 bit */
        unsigned char thirtytwo[4];     /* 32 bit */
} color_t;

/*
 * VIS_DEVINIT:
 * Initialize the framebuffer as a console device.  The terminal emulator
 * will provide the following structure to the device driver to be filled in.
 * The driver is expected to fill it in.
 *
 * ioctl(fd, VIS_DEVINIT, struct vis_devinit *)
 */
#define VIS_DEVINIT     (VIOC|1)
#define VIS_CONS_REV            5 /* Console IO interface version */
/* Modes */
#define VIS_TEXT                0 /* Use text mode when displaying data */
#define VIS_PIXEL               1 /* Use pixel mode when displaying data */

/*
 * VIS_DEVFINI:
 * Tells the framebuffer that it is no longer being used as a console.
 *
 * ioctl(fd, VIS_DEVFINI, unused)
 */
#define VIS_DEVFINI     (VIOC|2)

/*
 * VIS_CONSCURSOR:
 * Display/Hide cursor on the screen.  The layered driver uses this ioctl to
 * display, hide, and move the cursor on the console.  The framebuffer driver
 * is expected to draw a cursor at position (col,row) of size width x height.
 *
 * ioctl(fd, VIS_CONSCURSOR, struct vis_conscursor *)
 */
#define VIS_CONSCURSOR          (VIOC|3)
/* Cursor action - Either display or hide cursor */
#define VIS_HIDE_CURSOR         0
#define VIS_DISPLAY_CURSOR      1
#define VIS_GET_CURSOR          2

/*
 * VIS_CONSDISPLAY:
 * Display data on the framebuffer.  The data will be in the form specified
 * by the driver during console initialization (see VIS_CONSDEVINIT above).
 * The driver is expected to display the data at location (row,col).  Width
 * and height specify the size of the data.
 *
 * ioctl(fd, VIS_CONSDISPLAY, struct vis_consdisplay *)
 */

#define VIS_CONSDISPLAY         (VIOC|5)

/*
 * VIS_CONSCOPY:
 * Move data on the framebuffer.  Used to scroll the screen by the terminal
 * emulator or to move data by applications.  The driver must copy the data
 * specified by the rectangle (s_col,s_row),(e_col,e_row) to the location
 * which starts at (t_col,t_row), handling overlapping copies correctly.
 *
 * ioctl(fd, VIS_CONSCOPY, struct vis_conscopy *)
 */
#define VIS_CONSCOPY            (VIOC|7)

/*
 * VIS_CONSCLEAR:
 * Clear the screen using provided color. Used on VIS_PIXEL mode.
 *
 * ioctl(fd, VIS_CONSCLEAR, struct vis_consclear *)
 */
#define VIS_CONSCLEAR           (VIOC|8)

struct vis_consclear {
        color_t bg_color; /* Background color */
};

struct vis_consdisplay {
        screen_pos_t    row; /* Row to display data at */
        screen_pos_t    col; /* Col to display data at */
        screen_size_t   width; /* Width of data */
        screen_size_t   height; /* Height of data */
        unsigned char   *data; /* Data to display */
        color_t         fg_color; /* Foreground color */
        color_t         bg_color; /* Background color */
};

struct vis_conscopy {
        screen_pos_t    s_row; /* Starting row */
        screen_pos_t    s_col; /* Starting col */
        screen_pos_t    e_row; /* Ending row */
        screen_pos_t    e_col; /* Ending col */
        screen_pos_t    t_row; /* Row to move to */
        screen_pos_t    t_col; /* Col to move to */
};

struct vis_conscursor {
        screen_pos_t    row; /* Row to display cursor at */
        screen_pos_t    col; /* Col to display cursor at */
        screen_size_t   width; /* Width of cursor */
        screen_size_t   height; /* Height of cursor */
        color_t         fg_color; /* Foreground color */
        color_t         bg_color; /* Background color */
        short           action; /* Hide or show cursor */
};

/*
 * Each software-console-capable frame buffer driver defines its own
 * instance of this (with its own name!) and casts to/from this at the
 * interface with the terminal emulator.  These yield somewhat better
 * type checking than "void *".
 */
struct vis_polledio_arg;
struct vis_modechg_arg;

/*
 * Each software-console-capable frame buffer driver supplies these routines
 * for I/O from "polled" contexts - kmdb, OBP, etc.  No system services are
 * available.
 */
struct vis_polledio {
        struct vis_polledio_arg *arg;
        void    (*display)(struct vis_polledio_arg *, struct vis_consdisplay *);
        void    (*copy)(struct vis_polledio_arg *, struct vis_conscopy *);
        void    (*cursor)(struct vis_polledio_arg *, struct vis_conscursor *);
};

struct vis_devinit; /* forward decl. for typedef */

typedef void (*vis_modechg_cb_t)(struct vis_modechg_arg *,
    struct vis_devinit *);

typedef uint32_t (*color_map_fn_t)(uint8_t color);

struct vis_devinit {
        /*
         * This set of fields are used as parameters passed from the
         * layered framebuffer driver to the terminal emulator.
         */
        int             version;        /* Console IO interface version */
        screen_size_t   width;          /* Width of the device */
        screen_size_t   height;         /* Height of the device */
        screen_size_t   linebytes;      /* Bytes per scan line */
        int             depth;          /* Device depth */
        color_map_fn_t  color_map;      /* Color map tem -> fb */
        short           mode;           /* Mode to use when displaying data */
        struct vis_polledio *polledio;  /* Polled output routines */

        /*
         * The following fields are used as parameters passed from the
         * terminal emulator to the underlying framebuffer driver.
         */
        vis_modechg_cb_t modechg_cb;    /* Video mode change callback */
        struct vis_modechg_arg *modechg_arg; /* Mode change cb arg */
};

struct visual_ops {
        const struct vis_identifier *ident;
        int (*kdsetmode)(int);
        int (*devinit)(struct vis_devinit *);
        void (*cons_copy)(struct vis_conscopy *);
        void (*cons_display)(struct vis_consdisplay *);
        void (*cons_cursor)(struct vis_conscursor *);
        int (*cons_clear)(struct vis_consclear *);
        int (*cons_put_cmap)(struct vis_cmap *);
};

#endif  /* _KERNEL || _STANDALONE */

#ifdef __cplusplus
}
#endif

#endif  /* !_SYS_VISUAL_IO_H */