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 2009 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #ifndef _SYS_CONSDEV_H
  28 #define _SYS_CONSDEV_H
  29 
  30 #include <sys/isa_defs.h>
  31 #include <sys/dditypes.h>
  32 
  33 #ifdef  __cplusplus
  34 extern "C" {
  35 #endif
  36 
  37 
  38 #if defined(_KERNEL) || defined(_KMDB)
  39 
  40 /*
  41  * Paths to console devices
  42  */
  43 #define CONSKBD_PATH    "/pseudo/conskbd@0:conskbd"
  44 #define CONSMS_PATH     "/pseudo/consms@0:mouse"
  45 #define WC_PATH         "/pseudo/wc@0:wscons"
  46 #define IWSCN_PATH      "/pseudo/iwscn@0:iwscn"
  47 #define CVC_PATH        "/pseudo/cvc@0:cvc"
  48 
  49 /*
  50  * Console redirection.
  51  */
  52 extern dev_t    rconsdev;       /* real (underlying) console */
  53 extern struct vnode *rconsvp;   /* pointer to vnode for that device */
  54 
  55 /*
  56  * Virtual Serial Console redirection.
  57  */
  58 extern struct vnode *vsconsvp;  /* pointer to vnode for virtual console */
  59 
  60 /*
  61  * Mouse, keyboard, and frame buffer configuration information.
  62  *
  63  * XXX: Assumes a single mouse/keyboard/frame buffer triple.
  64  */
  65 extern dev_t    mousedev;       /* default mouse device */
  66 extern dev_t    kbddev;         /* default (actual) keyboard device */
  67 extern dev_t    stdindev;       /* default standard input device */
  68 extern dev_t    fbdev;          /* default framebuffer device */
  69 extern struct vnode *fbvp;      /* pointer to vnode for that device */
  70 extern dev_info_t *fbdip;       /* pointer to dev_info for fbdev (optional) */
  71 
  72 extern int      consmode;       /* CONS_FW or CONS_KFB */
  73 extern int      cons_tem_disable;
  74 #define CONS_FW         0
  75 #define CONS_KFB        1
  76 
  77 /*
  78  * Workstation console redirection.
  79  *
  80  * The workstation console device is the multiplexor that hooks keyboard and
  81  * frame buffer together into a single tty-like device.  Access to it is
  82  * through the redirecting driver, so that frame buffer output can be
  83  * redirected to other devices.  wsconsvp names the redirecting access point,
  84  * and rwsconsvp names the workstation console itself.
  85  *
  86  * XXX: Assumes a single workstation console.
  87  */
  88 extern struct vnode *wsconsvp;  /* vnode for redirecting ws cons access */
  89 extern struct vnode *rwsconsvp; /* vnode for underlying workstation console */
  90 
  91 /*
  92  * Generic console ioctls.
  93  *
  94  * On systems without OBP, all potential console devices should implement these.
  95  *
  96  * On systems with OBP, all potential console devices should implement
  97  * the ABORTENABLE ioctls.  All potential console devices that cannot share
  98  * their hardware with OBP should implement the POLLEDIO ioctls.
  99  */
 100 #define _CONSIOC        (('C'<<24)|('O'<<16)|('N'<<8))
 101 
 102 /*
 103  * Get the structure of function pointers to be used for polled I/O
 104  *
 105  *      struct cons_polledio *polledio;
 106  *      struct strioctl str;
 107  *
 108  *      str.ic_cmd = CONS_OPENPOLLEDIO;
 109  *      str.ic_timout = INFTIM;
 110  *      str.ic_len = sizeof (polledio);
 111  *      str.ic_dp = (char *)&polledio;
 112  *      ioctl(fd, I_STR, &str);
 113  */
 114 #define CONSOPENPOLLEDIO        (_CONSIOC|0)
 115 
 116 /*
 117  * Get the current state of abort enable
 118  * enable = ioctl(fd, CONSGETABORTENABLE, 0)
 119  */
 120 #define CONSGETABORTENABLE      (_CONSIOC|1)
 121 
 122 /*
 123  * Set the current state of abort enable
 124  * ioctl(fd, CONSSETABORTENABLE, boolean_t)
 125  */
 126 #define CONSSETABORTENABLE      (_CONSIOC|2)
 127 
 128 /*
 129  * Undo anything that was done with CONSOPENPOLLEDIO
 130  * ioctl(fd, CONSCLOSEPOLLEDIO, 0)
 131  */
 132 #define CONSCLOSEPOLLEDIO       (_CONSIOC|3)
 133 
 134 /*
 135  * Set the type simulated by hardwares
 136  * ioctl(fd, CONSSETKBDTYPE, kbdtype)
 137  * kbdtype:
 138  *      KB_PC or KB_USB
 139  */
 140 #define CONSSETKBDTYPE          (_CONSIOC|4)
 141 
 142 #define CONSPOLLEDIO_V0         0
 143 #define CONSPOLLEDIO_V1         1
 144 
 145 typedef int kbtrans_key_t;
 146 
 147 enum keystate { KEY_PRESSED = 0, KEY_RELEASED = 1 };
 148 
 149 
 150 /*
 151  * Opaque state structure for driver state.  Each driver has its own
 152  * implementation (with different names!), and casts to/from this.
 153  * This allows better type-checking than "void *", helping to ensure
 154  * that the structure passed in is the structure used in the callback.
 155  */
 156 typedef struct __cons_polledio_arg      *cons_polledio_arg_t;
 157 
 158 /*
 159  * This is the structure that is used to handle polled I/O.  It is filled
 160  * in by a lower driver, passed up, and eventually registered with the
 161  * debugger that needs to do polled I/O.
 162  */
 163 typedef struct cons_polledio {
 164 
 165         /*
 166          * version of this structure
 167          */
 168         unsigned        cons_polledio_version;
 169 
 170         /*
 171          * Argument that is passed to the following routines.
 172          */
 173         cons_polledio_arg_t     cons_polledio_argument;
 174 
 175         /*
 176          * Pointer to the routine and its argument that handles putting
 177          * characters out to the polled device.
 178          */
 179         void            (*cons_polledio_putchar)(cons_polledio_arg_t,
 180                                 uchar_t);
 181 
 182         /*
 183          * Pointer to the routine and its argument that handles getting
 184          * characters from the polled device.  This routine is blocking.
 185          */
 186         int             (*cons_polledio_getchar)(cons_polledio_arg_t);
 187 
 188         /*
 189          * Pointer to the routine and its argument that checks to see
 190          * if a character is pending input.  This routine is non-blocking.
 191          */
 192         boolean_t       (*cons_polledio_ischar)(cons_polledio_arg_t);
 193 
 194         /*
 195          * Initialize the polled subsystem.  This routine is called once
 196          * per mode change from non-polled to polled mode.
 197          */
 198         void            (*cons_polledio_enter)(cons_polledio_arg_t);
 199 
 200         /*
 201          * Restore the non-polled subsystem.  This routine is called once
 202          * per mode change from non-polled to polled mode.
 203          */
 204         void            (*cons_polledio_exit)(cons_polledio_arg_t);
 205 
 206 
 207         /* Routine to set the LED's in polled mode */
 208         void    (*cons_polledio_setled)(cons_polledio_arg_t, int);
 209 
 210         /* Routine to indicate that a scande is available in polled mode */
 211         boolean_t       (*cons_polledio_keycheck)(
 212                             cons_polledio_arg_t,
 213                             kbtrans_key_t *, enum keystate *);
 214 } cons_polledio_t;
 215 
 216 extern cons_polledio_t *cons_polledio;
 217 
 218 /*
 219  * Workstation Console
 220  */
 221 #define _WCIOC          (('W'<<24)|('C'<<16))
 222 #define WC_OPEN_FB      (_WCIOC | 0)
 223 #define WC_CLOSE_FB     (_WCIOC | 1)
 224 
 225 #endif  /* _KERNEL || _KMDB */
 226 
 227 #ifdef  __cplusplus
 228 }
 229 #endif
 230 
 231 #endif  /* _SYS_CONSDEV_H */