1a8445737SSøren Schmidt /*- 2718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3718cf2ccSPedro F. Giffuni * 4a3cd0185SKazutaka YOKOTA * Copyright (c) 1998 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 5a8445737SSøren Schmidt * All rights reserved. 6a8445737SSøren Schmidt * 7f1121206SXin LI * This code is derived from software contributed to The DragonFly Project 8f1121206SXin LI * by Sascha Wildner <saw@online.de> 9f1121206SXin LI * 10a8445737SSøren Schmidt * Redistribution and use in source and binary forms, with or without 11a8445737SSøren Schmidt * modification, are permitted provided that the following conditions 12a8445737SSøren Schmidt * are met: 13a8445737SSøren Schmidt * 1. Redistributions of source code must retain the above copyright 14a3cd0185SKazutaka YOKOTA * notice, this list of conditions and the following disclaimer as 15a3cd0185SKazutaka YOKOTA * the first lines of this file unmodified. 16a8445737SSøren Schmidt * 2. Redistributions in binary form must reproduce the above copyright 17a8445737SSøren Schmidt * notice, this list of conditions and the following disclaimer in the 18a8445737SSøren Schmidt * documentation and/or other materials provided with the distribution. 19a8445737SSøren Schmidt * 20a3cd0185SKazutaka YOKOTA * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21a3cd0185SKazutaka YOKOTA * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22a3cd0185SKazutaka YOKOTA * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23a3cd0185SKazutaka YOKOTA * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24a3cd0185SKazutaka YOKOTA * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25a3cd0185SKazutaka YOKOTA * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26a3cd0185SKazutaka YOKOTA * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27a3cd0185SKazutaka YOKOTA * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28a3cd0185SKazutaka YOKOTA * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29a3cd0185SKazutaka YOKOTA * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30a8445737SSøren Schmidt */ 31a8445737SSøren Schmidt 3242af95a3SDavid E. O'Brien #include <sys/cdefs.h> 3342af95a3SDavid E. O'Brien __FBSDID("$FreeBSD$"); 3442af95a3SDavid E. O'Brien 35a8445737SSøren Schmidt #include "opt_syscons.h" 36a8445737SSøren Schmidt 37a8445737SSøren Schmidt #include <sys/param.h> 38a8445737SSøren Schmidt #include <sys/systm.h> 398c12242cSKazutaka YOKOTA #include <sys/conf.h> 40a8445737SSøren Schmidt #include <sys/signalvar.h> 41a8445737SSøren Schmidt #include <sys/tty.h> 42a8445737SSøren Schmidt #include <sys/kernel.h> 4300d25f51SPoul-Henning Kamp #include <sys/fbio.h> 4400d25f51SPoul-Henning Kamp #include <sys/consio.h> 45f591779bSSeigo Tanimura #include <sys/filedesc.h> 46f591779bSSeigo Tanimura #include <sys/lock.h> 47f591779bSSeigo Tanimura #include <sys/sx.h> 48f591779bSSeigo Tanimura #include <sys/mutex.h> 49f591779bSSeigo Tanimura #include <sys/proc.h> 50a8445737SSøren Schmidt 512ad872c5SKazutaka YOKOTA #include <dev/fb/fbreg.h> 522ad872c5SKazutaka YOKOTA #include <dev/syscons/syscons.h> 53a8445737SSøren Schmidt 54f41325dbSPeter Wemm SET_DECLARE(scrndr_set, const sc_renderer_t); 55f41325dbSPeter Wemm 562ad872c5SKazutaka YOKOTA /* for compatibility with previous versions */ 576e8394b8SKazutaka YOKOTA /* 3.0-RELEASE used the following structure */ 582ad872c5SKazutaka YOKOTA typedef struct old_video_adapter { 592ad872c5SKazutaka YOKOTA int va_index; 602ad872c5SKazutaka YOKOTA int va_type; 612ad872c5SKazutaka YOKOTA int va_flags; 626e8394b8SKazutaka YOKOTA /* flag bits are the same as the -CURRENT 632ad872c5SKazutaka YOKOTA #define V_ADP_COLOR (1<<0) 642ad872c5SKazutaka YOKOTA #define V_ADP_MODECHANGE (1<<1) 652ad872c5SKazutaka YOKOTA #define V_ADP_STATESAVE (1<<2) 662ad872c5SKazutaka YOKOTA #define V_ADP_STATELOAD (1<<3) 672ad872c5SKazutaka YOKOTA #define V_ADP_FONT (1<<4) 682ad872c5SKazutaka YOKOTA #define V_ADP_PALETTE (1<<5) 692ad872c5SKazutaka YOKOTA #define V_ADP_BORDER (1<<6) 702ad872c5SKazutaka YOKOTA #define V_ADP_VESA (1<<7) 716e8394b8SKazutaka YOKOTA */ 722ad872c5SKazutaka YOKOTA int va_crtc_addr; 732ad872c5SKazutaka YOKOTA u_int va_window; /* virtual address */ 742ad872c5SKazutaka YOKOTA size_t va_window_size; 752ad872c5SKazutaka YOKOTA size_t va_window_gran; 762ad872c5SKazutaka YOKOTA u_int va_buffer; /* virtual address */ 772ad872c5SKazutaka YOKOTA size_t va_buffer_size; 782ad872c5SKazutaka YOKOTA int va_initial_mode; 792ad872c5SKazutaka YOKOTA int va_initial_bios_mode; 802ad872c5SKazutaka YOKOTA int va_mode; 812ad872c5SKazutaka YOKOTA } old_video_adapter_t; 82a8445737SSøren Schmidt 832ad872c5SKazutaka YOKOTA #define OLD_CONS_ADPINFO _IOWR('c', 101, old_video_adapter_t) 842ad872c5SKazutaka YOKOTA 856e8394b8SKazutaka YOKOTA /* 3.1-RELEASE used the following structure */ 866e8394b8SKazutaka YOKOTA typedef struct old_video_adapter_info { 876e8394b8SKazutaka YOKOTA int va_index; 886e8394b8SKazutaka YOKOTA int va_type; 896e8394b8SKazutaka YOKOTA char va_name[16]; 906e8394b8SKazutaka YOKOTA int va_unit; 916e8394b8SKazutaka YOKOTA int va_flags; 926e8394b8SKazutaka YOKOTA int va_io_base; 936e8394b8SKazutaka YOKOTA int va_io_size; 946e8394b8SKazutaka YOKOTA int va_crtc_addr; 956e8394b8SKazutaka YOKOTA int va_mem_base; 966e8394b8SKazutaka YOKOTA int va_mem_size; 976e8394b8SKazutaka YOKOTA u_int va_window; /* virtual address */ 986e8394b8SKazutaka YOKOTA size_t va_window_size; 996e8394b8SKazutaka YOKOTA size_t va_window_gran; 100439dfb0cSStefan Farfeleder u_int va_buffer; 1016e8394b8SKazutaka YOKOTA size_t va_buffer_size; 1026e8394b8SKazutaka YOKOTA int va_initial_mode; 1036e8394b8SKazutaka YOKOTA int va_initial_bios_mode; 1046e8394b8SKazutaka YOKOTA int va_mode; 1056e8394b8SKazutaka YOKOTA int va_line_width; 1066e8394b8SKazutaka YOKOTA } old_video_adapter_info_t; 1076e8394b8SKazutaka YOKOTA 1086e8394b8SKazutaka YOKOTA #define OLD_CONS_ADPINFO2 _IOWR('c', 101, old_video_adapter_info_t) 1096e8394b8SKazutaka YOKOTA 1106e8394b8SKazutaka YOKOTA /* 3.0-RELEASE and 3.1-RELEASE used the following structure */ 1116e8394b8SKazutaka YOKOTA typedef struct old_video_info { 1126e8394b8SKazutaka YOKOTA int vi_mode; 1136e8394b8SKazutaka YOKOTA int vi_flags; 1146e8394b8SKazutaka YOKOTA /* flag bits are the same as the -CURRENT 1156e8394b8SKazutaka YOKOTA #define V_INFO_COLOR (1<<0) 1166e8394b8SKazutaka YOKOTA #define V_INFO_GRAPHICS (1<<1) 1176e8394b8SKazutaka YOKOTA #define V_INFO_LINEAR (1<<2) 1186e8394b8SKazutaka YOKOTA #define V_INFO_VESA (1<<3) 1196e8394b8SKazutaka YOKOTA */ 1206e8394b8SKazutaka YOKOTA int vi_width; 1216e8394b8SKazutaka YOKOTA int vi_height; 1226e8394b8SKazutaka YOKOTA int vi_cwidth; 1236e8394b8SKazutaka YOKOTA int vi_cheight; 1246e8394b8SKazutaka YOKOTA int vi_depth; 1256e8394b8SKazutaka YOKOTA int vi_planes; 1266e8394b8SKazutaka YOKOTA u_int vi_window; /* physical address */ 1276e8394b8SKazutaka YOKOTA size_t vi_window_size; 1286e8394b8SKazutaka YOKOTA size_t vi_window_gran; 1296e8394b8SKazutaka YOKOTA u_int vi_buffer; /* physical address */ 1306e8394b8SKazutaka YOKOTA size_t vi_buffer_size; 1316e8394b8SKazutaka YOKOTA } old_video_info_t; 1326e8394b8SKazutaka YOKOTA 1336e8394b8SKazutaka YOKOTA #define OLD_CONS_MODEINFO _IOWR('c', 102, old_video_info_t) 1346e8394b8SKazutaka YOKOTA #define OLD_CONS_FINDMODE _IOWR('c', 103, old_video_info_t) 135a8445737SSøren Schmidt 136a8445737SSøren Schmidt int 137a8445737SSøren Schmidt sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize, 13886330afeSCraig Rodrigues int fontsize, int fontwidth) 139a8445737SSøren Schmidt { 140a8445737SSøren Schmidt video_info_t info; 141305921c4SEd Schouten struct winsize wsz; 1426e8394b8SKazutaka YOKOTA u_char *font; 143*fdf288f3SJohn Baldwin #ifndef SC_NO_HISTORY 144c4c9400bSKazutaka YOKOTA int prev_ysize; 145*fdf288f3SJohn Baldwin #endif 146a8445737SSøren Schmidt int error; 147a8445737SSøren Schmidt int s; 148a8445737SSøren Schmidt 1499336e069SWojciech A. Koszek if (vidd_get_info(scp->sc->adp, mode, &info)) 150a8445737SSøren Schmidt return ENODEV; 151a8445737SSøren Schmidt 152a8445737SSøren Schmidt /* adjust argument values */ 1534506b763SCraig Rodrigues if (fontwidth <= 0) 1544506b763SCraig Rodrigues fontwidth = info.vi_cwidth; 155a8445737SSøren Schmidt if (fontsize <= 0) 156a8445737SSøren Schmidt fontsize = info.vi_cheight; 157fd7a9ebcSJung-uk Kim if (fontsize < 14) 158a8445737SSøren Schmidt fontsize = 8; 159fd7a9ebcSJung-uk Kim else if (fontsize >= 16) 160a8445737SSøren Schmidt fontsize = 16; 161fd7a9ebcSJung-uk Kim else 162a8445737SSøren Schmidt fontsize = 14; 1636e8394b8SKazutaka YOKOTA #ifndef SC_NO_FONT_LOADING 164fd7a9ebcSJung-uk Kim switch (fontsize) { 165fd7a9ebcSJung-uk Kim case 8: 166fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_8) == 0) 167fd7a9ebcSJung-uk Kim return (EINVAL); 168fd7a9ebcSJung-uk Kim font = scp->sc->font_8; 169fd7a9ebcSJung-uk Kim break; 170fd7a9ebcSJung-uk Kim case 14: 171fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_14) == 0) 172fd7a9ebcSJung-uk Kim return (EINVAL); 1736e8394b8SKazutaka YOKOTA font = scp->sc->font_14; 174fd7a9ebcSJung-uk Kim break; 175fd7a9ebcSJung-uk Kim case 16: 176fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_16) == 0) 177fd7a9ebcSJung-uk Kim return (EINVAL); 178fd7a9ebcSJung-uk Kim font = scp->sc->font_16; 179fd7a9ebcSJung-uk Kim break; 180fd7a9ebcSJung-uk Kim } 1816e8394b8SKazutaka YOKOTA #else 1826e8394b8SKazutaka YOKOTA font = NULL; 1836e8394b8SKazutaka YOKOTA #endif 184a8445737SSøren Schmidt if ((xsize <= 0) || (xsize > info.vi_width)) 185a8445737SSøren Schmidt xsize = info.vi_width; 186a8445737SSøren Schmidt if ((ysize <= 0) || (ysize > info.vi_height)) 187a8445737SSøren Schmidt ysize = info.vi_height; 188a8445737SSøren Schmidt 189a8445737SSøren Schmidt /* stop screen saver, etc */ 190a8445737SSøren Schmidt s = spltty(); 191a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 192a8445737SSøren Schmidt splx(s); 193a8445737SSøren Schmidt return error; 194a8445737SSøren Schmidt } 195a8445737SSøren Schmidt 1962b944ee2SKazutaka YOKOTA if (sc_render_match(scp, scp->sc->adp->va_name, 0) == NULL) { 1976e8394b8SKazutaka YOKOTA splx(s); 1986e8394b8SKazutaka YOKOTA return ENODEV; 1996e8394b8SKazutaka YOKOTA } 2006e8394b8SKazutaka YOKOTA 201a8445737SSøren Schmidt /* set up scp */ 202d94eccc2SKazutaka YOKOTA #ifndef SC_NO_HISTORY 203d94eccc2SKazutaka YOKOTA if (scp->history != NULL) 204d94eccc2SKazutaka YOKOTA sc_hist_save(scp); 205c4c9400bSKazutaka YOKOTA prev_ysize = scp->ysize; 206*fdf288f3SJohn Baldwin #endif 207a8445737SSøren Schmidt /* 208a8445737SSøren Schmidt * This is a kludge to fend off scrn_update() while we 209a8445737SSøren Schmidt * muck around with scp. XXX 210a8445737SSøren Schmidt */ 21109132359SKazutaka YOKOTA scp->status |= UNKNOWN_MODE | MOUSE_HIDDEN; 21209132359SKazutaka YOKOTA scp->status &= ~(GRAPHICS_MODE | PIXEL_MODE | MOUSE_VISIBLE); 213a8445737SSøren Schmidt scp->mode = mode; 214a8445737SSøren Schmidt scp->xsize = xsize; 215a8445737SSøren Schmidt scp->ysize = ysize; 2162ad872c5SKazutaka YOKOTA scp->xoff = 0; 2172ad872c5SKazutaka YOKOTA scp->yoff = 0; 218a8445737SSøren Schmidt scp->xpixel = scp->xsize*8; 219a8445737SSøren Schmidt scp->ypixel = scp->ysize*fontsize; 2206e8394b8SKazutaka YOKOTA scp->font = font; 2216e8394b8SKazutaka YOKOTA scp->font_size = fontsize; 22286330afeSCraig Rodrigues scp->font_width = fontwidth; 223a8445737SSøren Schmidt 224a8445737SSøren Schmidt /* allocate buffers */ 225a8445737SSøren Schmidt sc_alloc_scr_buffer(scp, TRUE, TRUE); 2262b944ee2SKazutaka YOKOTA sc_init_emulator(scp, NULL); 2276e8394b8SKazutaka YOKOTA #ifndef SC_NO_CUTPASTE 228a8445737SSøren Schmidt sc_alloc_cut_buffer(scp, FALSE); 2296e8394b8SKazutaka YOKOTA #endif 2306e8394b8SKazutaka YOKOTA #ifndef SC_NO_HISTORY 231c4c9400bSKazutaka YOKOTA sc_alloc_history_buffer(scp, 0, prev_ysize, FALSE); 2326e8394b8SKazutaka YOKOTA #endif 233a8445737SSøren Schmidt splx(s); 234a8445737SSøren Schmidt 2356e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) 236a8445737SSøren Schmidt set_mode(scp); 237a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 238a8445737SSøren Schmidt 239a8445737SSøren Schmidt if (tp == NULL) 240a8445737SSøren Schmidt return 0; 241305921c4SEd Schouten wsz.ws_col = scp->xsize; 242305921c4SEd Schouten wsz.ws_row = scp->ysize; 243305921c4SEd Schouten tty_set_winsize(tp, &wsz); 244a8445737SSøren Schmidt return 0; 245a8445737SSøren Schmidt } 246a8445737SSøren Schmidt 247a8445737SSøren Schmidt int 248a8445737SSøren Schmidt sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode) 249a8445737SSøren Schmidt { 2506e8394b8SKazutaka YOKOTA #ifdef SC_NO_MODE_CHANGE 2516e8394b8SKazutaka YOKOTA return ENODEV; 2526e8394b8SKazutaka YOKOTA #else 253a8445737SSøren Schmidt video_info_t info; 254305921c4SEd Schouten struct winsize wsz; 255a8445737SSøren Schmidt int error; 256a8445737SSøren Schmidt int s; 257a8445737SSøren Schmidt 2589336e069SWojciech A. Koszek if (vidd_get_info(scp->sc->adp, mode, &info)) 259a8445737SSøren Schmidt return ENODEV; 260a8445737SSøren Schmidt 261a8445737SSøren Schmidt /* stop screen saver, etc */ 262a8445737SSøren Schmidt s = spltty(); 263a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 264a8445737SSøren Schmidt splx(s); 265a8445737SSøren Schmidt return error; 266a8445737SSøren Schmidt } 267a8445737SSøren Schmidt 2682b944ee2SKazutaka YOKOTA if (sc_render_match(scp, scp->sc->adp->va_name, GRAPHICS_MODE) == NULL) { 2696e8394b8SKazutaka YOKOTA splx(s); 2706e8394b8SKazutaka YOKOTA return ENODEV; 2716e8394b8SKazutaka YOKOTA } 2726e8394b8SKazutaka YOKOTA 273a8445737SSøren Schmidt /* set up scp */ 27409132359SKazutaka YOKOTA scp->status |= (UNKNOWN_MODE | GRAPHICS_MODE | MOUSE_HIDDEN); 27509132359SKazutaka YOKOTA scp->status &= ~(PIXEL_MODE | MOUSE_VISIBLE); 276a8445737SSøren Schmidt scp->mode = mode; 27721f652c5SKazutaka YOKOTA /* 27821f652c5SKazutaka YOKOTA * Don't change xsize and ysize; preserve the previous vty 27921f652c5SKazutaka YOKOTA * and history buffers. 28021f652c5SKazutaka YOKOTA */ 2812ad872c5SKazutaka YOKOTA scp->xoff = 0; 2822ad872c5SKazutaka YOKOTA scp->yoff = 0; 283a8445737SSøren Schmidt scp->xpixel = info.vi_width; 284a8445737SSøren Schmidt scp->ypixel = info.vi_height; 2856e8394b8SKazutaka YOKOTA scp->font = NULL; 286acdf858cSKazutaka YOKOTA scp->font_size = 0; 2876e8394b8SKazutaka YOKOTA #ifndef SC_NO_SYSMOUSE 288a8445737SSøren Schmidt /* move the mouse cursor at the center of the screen */ 2896e8394b8SKazutaka YOKOTA sc_mouse_move(scp, scp->xpixel / 2, scp->ypixel / 2); 2906e8394b8SKazutaka YOKOTA #endif 2912b944ee2SKazutaka YOKOTA sc_init_emulator(scp, NULL); 292a8445737SSøren Schmidt splx(s); 293a8445737SSøren Schmidt 2946e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) 295a8445737SSøren Schmidt set_mode(scp); 296a8445737SSøren Schmidt /* clear_graphics();*/ 297a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 298a8445737SSøren Schmidt 299a8445737SSøren Schmidt if (tp == NULL) 300a8445737SSøren Schmidt return 0; 301305921c4SEd Schouten wsz.ws_col = scp->xsize; 302305921c4SEd Schouten wsz.ws_row = scp->ysize; 303305921c4SEd Schouten tty_set_winsize(tp, &wsz); 304a8445737SSøren Schmidt return 0; 3056e8394b8SKazutaka YOKOTA #endif /* SC_NO_MODE_CHANGE */ 306a8445737SSøren Schmidt } 307a8445737SSøren Schmidt 308a8445737SSøren Schmidt int 309a8445737SSøren Schmidt sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, 31086330afeSCraig Rodrigues int fontsize, int fontwidth) 311a8445737SSøren Schmidt { 3126e8394b8SKazutaka YOKOTA #ifndef SC_PIXEL_MODE 3136e8394b8SKazutaka YOKOTA return ENODEV; 3146e8394b8SKazutaka YOKOTA #else 315a8445737SSøren Schmidt video_info_t info; 316305921c4SEd Schouten struct winsize wsz; 3176e8394b8SKazutaka YOKOTA u_char *font; 318c4c9400bSKazutaka YOKOTA int prev_ysize; 319a8445737SSøren Schmidt int error; 320a8445737SSøren Schmidt int s; 321a8445737SSøren Schmidt 3229336e069SWojciech A. Koszek if (vidd_get_info(scp->sc->adp, scp->mode, &info)) 323a8445737SSøren Schmidt return ENODEV; /* this shouldn't happen */ 324a8445737SSøren Schmidt 325a8445737SSøren Schmidt /* adjust argument values */ 326acdf858cSKazutaka YOKOTA if (fontsize <= 0) 327a8445737SSøren Schmidt fontsize = info.vi_cheight; 328fd7a9ebcSJung-uk Kim if (fontsize < 14) 329a8445737SSøren Schmidt fontsize = 8; 330fd7a9ebcSJung-uk Kim else if (fontsize >= 16) 331a8445737SSøren Schmidt fontsize = 16; 332fd7a9ebcSJung-uk Kim else 333a8445737SSøren Schmidt fontsize = 14; 3346e8394b8SKazutaka YOKOTA #ifndef SC_NO_FONT_LOADING 335fd7a9ebcSJung-uk Kim switch (fontsize) { 336fd7a9ebcSJung-uk Kim case 8: 337fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_8) == 0) 338fd7a9ebcSJung-uk Kim return (EINVAL); 339fd7a9ebcSJung-uk Kim font = scp->sc->font_8; 340fd7a9ebcSJung-uk Kim break; 341fd7a9ebcSJung-uk Kim case 14: 342fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_14) == 0) 343fd7a9ebcSJung-uk Kim return (EINVAL); 3446e8394b8SKazutaka YOKOTA font = scp->sc->font_14; 345fd7a9ebcSJung-uk Kim break; 346fd7a9ebcSJung-uk Kim case 16: 347fd7a9ebcSJung-uk Kim if ((scp->sc->fonts_loaded & FONT_16) == 0) 348fd7a9ebcSJung-uk Kim return (EINVAL); 349fd7a9ebcSJung-uk Kim font = scp->sc->font_16; 350fd7a9ebcSJung-uk Kim break; 351fd7a9ebcSJung-uk Kim } 3526e8394b8SKazutaka YOKOTA #else 3536e8394b8SKazutaka YOKOTA font = NULL; 3546e8394b8SKazutaka YOKOTA #endif 355a8445737SSøren Schmidt if (xsize <= 0) 356a8445737SSøren Schmidt xsize = info.vi_width/8; 357a8445737SSøren Schmidt if (ysize <= 0) 358a8445737SSøren Schmidt ysize = info.vi_height/fontsize; 359a8445737SSøren Schmidt 36095bafc8fSKazutaka YOKOTA if ((info.vi_width < xsize*8) || (info.vi_height < ysize*fontsize)) 36195bafc8fSKazutaka YOKOTA return EINVAL; 36295bafc8fSKazutaka YOKOTA 3634a9b63a4SJung-uk Kim if (!sc_support_pixel_mode(&info)) 364f1121206SXin LI return ENODEV; 36595bafc8fSKazutaka YOKOTA 366a8445737SSøren Schmidt /* stop screen saver, etc */ 367a8445737SSøren Schmidt s = spltty(); 368a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 369a8445737SSøren Schmidt splx(s); 370a8445737SSøren Schmidt return error; 371a8445737SSøren Schmidt } 372a8445737SSøren Schmidt 3732b944ee2SKazutaka YOKOTA if (sc_render_match(scp, scp->sc->adp->va_name, PIXEL_MODE) == NULL) { 3746e8394b8SKazutaka YOKOTA splx(s); 3756e8394b8SKazutaka YOKOTA return ENODEV; 3766e8394b8SKazutaka YOKOTA } 3776e8394b8SKazutaka YOKOTA 3782b944ee2SKazutaka YOKOTA #if 0 3792b944ee2SKazutaka YOKOTA if (scp->tsw) 3802b944ee2SKazutaka YOKOTA (*scp->tsw->te_term)(scp, scp->ts); 3812b944ee2SKazutaka YOKOTA scp->tsw = NULL; 3822b944ee2SKazutaka YOKOTA scp->ts = NULL; 3832b944ee2SKazutaka YOKOTA #endif 3842b944ee2SKazutaka YOKOTA 385a8445737SSøren Schmidt /* set up scp */ 386d94eccc2SKazutaka YOKOTA #ifndef SC_NO_HISTORY 387d94eccc2SKazutaka YOKOTA if (scp->history != NULL) 388d94eccc2SKazutaka YOKOTA sc_hist_save(scp); 389c4c9400bSKazutaka YOKOTA prev_ysize = scp->ysize; 390*fdf288f3SJohn Baldwin #endif 39109132359SKazutaka YOKOTA scp->status |= (UNKNOWN_MODE | PIXEL_MODE | MOUSE_HIDDEN); 39209132359SKazutaka YOKOTA scp->status &= ~(GRAPHICS_MODE | MOUSE_VISIBLE); 393a8445737SSøren Schmidt scp->xsize = xsize; 394a8445737SSøren Schmidt scp->ysize = ysize; 395a8445737SSøren Schmidt scp->xoff = (scp->xpixel/8 - xsize)/2; 396a8445737SSøren Schmidt scp->yoff = (scp->ypixel/fontsize - ysize)/2; 3976e8394b8SKazutaka YOKOTA scp->font = font; 3986e8394b8SKazutaka YOKOTA scp->font_size = fontsize; 39986330afeSCraig Rodrigues scp->font_width = fontwidth; 400a8445737SSøren Schmidt 401a8445737SSøren Schmidt /* allocate buffers */ 402a8445737SSøren Schmidt sc_alloc_scr_buffer(scp, TRUE, TRUE); 4032b944ee2SKazutaka YOKOTA sc_init_emulator(scp, NULL); 4046e8394b8SKazutaka YOKOTA #ifndef SC_NO_CUTPASTE 405a8445737SSøren Schmidt sc_alloc_cut_buffer(scp, FALSE); 4066e8394b8SKazutaka YOKOTA #endif 4076e8394b8SKazutaka YOKOTA #ifndef SC_NO_HISTORY 408c4c9400bSKazutaka YOKOTA sc_alloc_history_buffer(scp, 0, prev_ysize, FALSE); 4096e8394b8SKazutaka YOKOTA #endif 410a8445737SSøren Schmidt splx(s); 411a8445737SSøren Schmidt 4126e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) { 4132b944ee2SKazutaka YOKOTA sc_set_border(scp, scp->border); 4146e8394b8SKazutaka YOKOTA sc_set_cursor_image(scp); 4156e8394b8SKazutaka YOKOTA } 416a8445737SSøren Schmidt 417a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 418a8445737SSøren Schmidt 419a8445737SSøren Schmidt if (tp == NULL) 420a8445737SSøren Schmidt return 0; 421305921c4SEd Schouten wsz.ws_col = scp->xsize; 422305921c4SEd Schouten wsz.ws_row = scp->ysize; 423305921c4SEd Schouten tty_set_winsize(tp, &wsz); 424a8445737SSøren Schmidt return 0; 4256e8394b8SKazutaka YOKOTA #endif /* SC_PIXEL_MODE */ 426a8445737SSøren Schmidt } 427a8445737SSøren Schmidt 4284a9b63a4SJung-uk Kim int 4294a9b63a4SJung-uk Kim sc_support_pixel_mode(void *arg) 4304a9b63a4SJung-uk Kim { 4314a9b63a4SJung-uk Kim #ifdef SC_PIXEL_MODE 4324a9b63a4SJung-uk Kim video_info_t *info = arg; 4334a9b63a4SJung-uk Kim 4344a9b63a4SJung-uk Kim if ((info->vi_flags & V_INFO_GRAPHICS) == 0) 4354a9b63a4SJung-uk Kim return (0); 4364a9b63a4SJung-uk Kim 4374a9b63a4SJung-uk Kim /* 4384a9b63a4SJung-uk Kim * We currently support the following graphic modes: 4394a9b63a4SJung-uk Kim * 4404a9b63a4SJung-uk Kim * - 4 bpp planar modes whose memory size does not exceed 64K 4414a9b63a4SJung-uk Kim * - 15, 16, 24 and 32 bpp linear modes 4424a9b63a4SJung-uk Kim */ 4434a9b63a4SJung-uk Kim switch (info->vi_mem_model) { 4444a9b63a4SJung-uk Kim case V_INFO_MM_PLANAR: 4454a9b63a4SJung-uk Kim if (info->vi_planes != 4) 4464a9b63a4SJung-uk Kim break; 4474a9b63a4SJung-uk Kim /* 4484a9b63a4SJung-uk Kim * A memory size >64K requires bank switching to access 4494a9b63a4SJung-uk Kim * the entire screen. XXX 4504a9b63a4SJung-uk Kim */ 4514a9b63a4SJung-uk Kim if (info->vi_width * info->vi_height / 8 > info->vi_window_size) 4524a9b63a4SJung-uk Kim break; 4534a9b63a4SJung-uk Kim return (1); 4544a9b63a4SJung-uk Kim case V_INFO_MM_DIRECT: 4554a9b63a4SJung-uk Kim if ((info->vi_flags & V_INFO_LINEAR) == 0 && 4564a9b63a4SJung-uk Kim info->vi_depth != 15 && info->vi_depth != 16 && 4574a9b63a4SJung-uk Kim info->vi_depth != 24 && info->vi_depth != 32) 4584a9b63a4SJung-uk Kim break; 4594a9b63a4SJung-uk Kim return (1); 4604a9b63a4SJung-uk Kim case V_INFO_MM_PACKED: 4614a9b63a4SJung-uk Kim if ((info->vi_flags & V_INFO_LINEAR) == 0 && 4624a9b63a4SJung-uk Kim info->vi_depth != 8) 4634a9b63a4SJung-uk Kim break; 4644a9b63a4SJung-uk Kim return (1); 4654a9b63a4SJung-uk Kim } 4664a9b63a4SJung-uk Kim #endif 4674a9b63a4SJung-uk Kim return (0); 4684a9b63a4SJung-uk Kim } 4694a9b63a4SJung-uk Kim 4706e8394b8SKazutaka YOKOTA #define fb_ioctl(a, c, d) \ 4716e8394b8SKazutaka YOKOTA (((a) == NULL) ? ENODEV : \ 4729336e069SWojciech A. Koszek vidd_ioctl((a), (c), (caddr_t)(d))) 4736e8394b8SKazutaka YOKOTA 474a8445737SSøren Schmidt int 475bc093719SEd Schouten sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td) 476a8445737SSøren Schmidt { 477a8445737SSøren Schmidt scr_stat *scp; 4786e8394b8SKazutaka YOKOTA video_adapter_t *adp; 4796e8394b8SKazutaka YOKOTA video_info_t info; 4806e8394b8SKazutaka YOKOTA video_adapter_info_t adp_info; 481a8445737SSøren Schmidt int error; 482a8445737SSøren Schmidt int s; 4839fddcc66SRuslan Ermilov #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 4849fddcc66SRuslan Ermilov defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 4859fddcc66SRuslan Ermilov int ival; 4869fddcc66SRuslan Ermilov #endif 487a8445737SSøren Schmidt 488bc093719SEd Schouten scp = SC_STAT(tp); 4896e8394b8SKazutaka YOKOTA if (scp == NULL) /* tp == SC_MOUSE */ 4906e8394b8SKazutaka YOKOTA return ENOIOCTL; 4916e8394b8SKazutaka YOKOTA adp = scp->sc->adp; 4926e8394b8SKazutaka YOKOTA if (adp == NULL) /* shouldn't happen??? */ 4936e8394b8SKazutaka YOKOTA return ENODEV; 494a8445737SSøren Schmidt 495a8445737SSøren Schmidt switch (cmd) { 496a8445737SSøren Schmidt case CONS_CURRENTADP: /* get current adapter index */ 4976e8394b8SKazutaka YOKOTA case FBIO_ADAPTER: 4986e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_ADAPTER, data); 4996e8394b8SKazutaka YOKOTA 5006e8394b8SKazutaka YOKOTA case CONS_CURRENT: /* get current adapter type */ 5016e8394b8SKazutaka YOKOTA case FBIO_ADPTYPE: 5026e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_ADPTYPE, data); 5036e8394b8SKazutaka YOKOTA 5046e8394b8SKazutaka YOKOTA case OLD_CONS_ADPINFO: /* adapter information (old interface) */ 5056e8394b8SKazutaka YOKOTA if (((old_video_adapter_t *)data)->va_index >= 0) { 5066e8394b8SKazutaka YOKOTA adp = vid_get_adapter(((old_video_adapter_t *)data)->va_index); 5076e8394b8SKazutaka YOKOTA if (adp == NULL) 5086e8394b8SKazutaka YOKOTA return ENODEV; 5096e8394b8SKazutaka YOKOTA } 5106e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_index = adp->va_index; 5116e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_type = adp->va_type; 5126e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_flags = adp->va_flags; 5136e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_crtc_addr = adp->va_crtc_addr; 5146e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window = adp->va_window; 5156e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window_size = adp->va_window_size; 5166e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window_gran = adp->va_window_gran; 5176e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_buffer = adp->va_buffer; 5186e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_buffer_size = adp->va_buffer_size; 5196e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_mode = adp->va_mode; 5206e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_initial_mode = adp->va_initial_mode; 5216e8394b8SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_initial_bios_mode 5226e8394b8SKazutaka YOKOTA = adp->va_initial_bios_mode; 5232ad872c5SKazutaka YOKOTA return 0; 5242ad872c5SKazutaka YOKOTA 5256e8394b8SKazutaka YOKOTA case OLD_CONS_ADPINFO2: /* adapter information (yet another old I/F) */ 5266e8394b8SKazutaka YOKOTA adp_info.va_index = ((old_video_adapter_info_t *)data)->va_index; 5276e8394b8SKazutaka YOKOTA if (adp_info.va_index >= 0) { 5286e8394b8SKazutaka YOKOTA adp = vid_get_adapter(adp_info.va_index); 5296e8394b8SKazutaka YOKOTA if (adp == NULL) 5302ad872c5SKazutaka YOKOTA return ENODEV; 5316e8394b8SKazutaka YOKOTA } 5326e8394b8SKazutaka YOKOTA error = fb_ioctl(adp, FBIO_ADPINFO, &adp_info); 5336e8394b8SKazutaka YOKOTA if (error == 0) 5346e8394b8SKazutaka YOKOTA bcopy(&adp_info, data, sizeof(old_video_adapter_info_t)); 5356e8394b8SKazutaka YOKOTA return error; 536a8445737SSøren Schmidt 537a8445737SSøren Schmidt case CONS_ADPINFO: /* adapter information */ 5386e8394b8SKazutaka YOKOTA case FBIO_ADPINFO: 5396e8394b8SKazutaka YOKOTA if (((video_adapter_info_t *)data)->va_index >= 0) { 5406e8394b8SKazutaka YOKOTA adp = vid_get_adapter(((video_adapter_info_t *)data)->va_index); 5416e8394b8SKazutaka YOKOTA if (adp == NULL) 542a8445737SSøren Schmidt return ENODEV; 5436e8394b8SKazutaka YOKOTA } 5446e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_ADPINFO, data); 545a8445737SSøren Schmidt 546a8445737SSøren Schmidt case CONS_GET: /* get current video mode */ 5476e8394b8SKazutaka YOKOTA case FBIO_GETMODE: 548a8445737SSøren Schmidt *(int *)data = scp->mode; 549a8445737SSøren Schmidt return 0; 550a8445737SSøren Schmidt 5516e8394b8SKazutaka YOKOTA #ifndef SC_NO_MODE_CHANGE 5526e8394b8SKazutaka YOKOTA case FBIO_SETMODE: /* set video mode */ 5536e8394b8SKazutaka YOKOTA if (!(adp->va_flags & V_ADP_MODECHANGE)) 5546e8394b8SKazutaka YOKOTA return ENODEV; 5556e8394b8SKazutaka YOKOTA info.vi_mode = *(int *)data; 5566e8394b8SKazutaka YOKOTA error = fb_ioctl(adp, FBIO_MODEINFO, &info); 5576e8394b8SKazutaka YOKOTA if (error) 5586e8394b8SKazutaka YOKOTA return error; 5596e8394b8SKazutaka YOKOTA if (info.vi_flags & V_INFO_GRAPHICS) 5606e8394b8SKazutaka YOKOTA return sc_set_graphics_mode(scp, tp, *(int *)data); 5616e8394b8SKazutaka YOKOTA else 56286330afeSCraig Rodrigues return sc_set_text_mode(scp, tp, *(int *)data, 0, 0, 0, 0); 5636e8394b8SKazutaka YOKOTA #endif /* SC_NO_MODE_CHANGE */ 5646e8394b8SKazutaka YOKOTA 5656e8394b8SKazutaka YOKOTA case OLD_CONS_MODEINFO: /* get mode information (old infterface) */ 5666e8394b8SKazutaka YOKOTA info.vi_mode = ((old_video_info_t *)data)->vi_mode; 5676e8394b8SKazutaka YOKOTA error = fb_ioctl(adp, FBIO_MODEINFO, &info); 5686e8394b8SKazutaka YOKOTA if (error == 0) 5696e8394b8SKazutaka YOKOTA bcopy(&info, (old_video_info_t *)data, sizeof(old_video_info_t)); 5706e8394b8SKazutaka YOKOTA return error; 5716e8394b8SKazutaka YOKOTA 572a8445737SSøren Schmidt case CONS_MODEINFO: /* get mode information */ 5736e8394b8SKazutaka YOKOTA case FBIO_MODEINFO: 5746e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_MODEINFO, data); 5756e8394b8SKazutaka YOKOTA 5766e8394b8SKazutaka YOKOTA case OLD_CONS_FINDMODE: /* find a matching video mode (old interface) */ 5776e8394b8SKazutaka YOKOTA bzero(&info, sizeof(info)); 5786e8394b8SKazutaka YOKOTA bcopy((old_video_info_t *)data, &info, sizeof(old_video_info_t)); 5796e8394b8SKazutaka YOKOTA error = fb_ioctl(adp, FBIO_FINDMODE, &info); 5806e8394b8SKazutaka YOKOTA if (error == 0) 5816e8394b8SKazutaka YOKOTA bcopy(&info, (old_video_info_t *)data, sizeof(old_video_info_t)); 5826e8394b8SKazutaka YOKOTA return error; 583a8445737SSøren Schmidt 584a8445737SSøren Schmidt case CONS_FINDMODE: /* find a matching video mode */ 5856e8394b8SKazutaka YOKOTA case FBIO_FINDMODE: 5866e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_FINDMODE, data); 587a8445737SSøren Schmidt 5889fddcc66SRuslan Ermilov #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 5899fddcc66SRuslan Ermilov defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 5909fddcc66SRuslan Ermilov case _IO('c', 104): 5919fddcc66SRuslan Ermilov ival = IOCPARM_IVAL(data); 5929fddcc66SRuslan Ermilov data = (caddr_t)&ival; 5939fddcc66SRuslan Ermilov /* FALLTHROUGH */ 5949fddcc66SRuslan Ermilov #endif 5956e8394b8SKazutaka YOKOTA case CONS_SETWINORG: /* set frame buffer window origin */ 5966e8394b8SKazutaka YOKOTA case FBIO_SETWINORG: 5976e8394b8SKazutaka YOKOTA if (scp != scp->sc->cur_scp) 5986e8394b8SKazutaka YOKOTA return ENODEV; /* XXX */ 5996e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_SETWINORG, data); 600a8445737SSøren Schmidt 6016e8394b8SKazutaka YOKOTA case FBIO_GETWINORG: /* get frame buffer window origin */ 6026e8394b8SKazutaka YOKOTA if (scp != scp->sc->cur_scp) 6036e8394b8SKazutaka YOKOTA return ENODEV; /* XXX */ 6046e8394b8SKazutaka YOKOTA return fb_ioctl(adp, FBIO_GETWINORG, data); 6056e8394b8SKazutaka YOKOTA 6066e8394b8SKazutaka YOKOTA case FBIO_GETDISPSTART: 6076e8394b8SKazutaka YOKOTA case FBIO_SETDISPSTART: 6086e8394b8SKazutaka YOKOTA case FBIO_GETLINEWIDTH: 6096e8394b8SKazutaka YOKOTA case FBIO_SETLINEWIDTH: 6106e8394b8SKazutaka YOKOTA if (scp != scp->sc->cur_scp) 6116e8394b8SKazutaka YOKOTA return ENODEV; /* XXX */ 6126e8394b8SKazutaka YOKOTA return fb_ioctl(adp, cmd, data); 6136e8394b8SKazutaka YOKOTA 6146e8394b8SKazutaka YOKOTA case FBIO_GETPALETTE: 6156e8394b8SKazutaka YOKOTA case FBIO_SETPALETTE: 6166e8394b8SKazutaka YOKOTA case FBIOPUTCMAP: 6176e8394b8SKazutaka YOKOTA case FBIOGETCMAP: 6186e8394b8SKazutaka YOKOTA case FBIOGTYPE: 6196e8394b8SKazutaka YOKOTA if (scp != scp->sc->cur_scp) 6206e8394b8SKazutaka YOKOTA return ENODEV; /* XXX */ 6216e8394b8SKazutaka YOKOTA return fb_ioctl(adp, cmd, data); 6226e8394b8SKazutaka YOKOTA 623eac47d67SKazutaka YOKOTA case FBIO_BLANK: 624eac47d67SKazutaka YOKOTA if (scp != scp->sc->cur_scp) 625eac47d67SKazutaka YOKOTA return ENODEV; /* XXX */ 626eac47d67SKazutaka YOKOTA return fb_ioctl(adp, cmd, data); 627eac47d67SKazutaka YOKOTA 6286e8394b8SKazutaka YOKOTA #ifndef SC_NO_MODE_CHANGE 62995bafc8fSKazutaka YOKOTA /* generic text modes */ 63095bafc8fSKazutaka YOKOTA case SW_TEXT_80x25: case SW_TEXT_80x30: 63195bafc8fSKazutaka YOKOTA case SW_TEXT_80x43: case SW_TEXT_80x50: 63295bafc8fSKazutaka YOKOTA case SW_TEXT_80x60: 63395bafc8fSKazutaka YOKOTA /* FALLTHROUGH */ 63495bafc8fSKazutaka YOKOTA 635a8445737SSøren Schmidt /* VGA TEXT MODES */ 636a8445737SSøren Schmidt case SW_VGA_C40x25: 637a8445737SSøren Schmidt case SW_VGA_C80x25: case SW_VGA_M80x25: 638a8445737SSøren Schmidt case SW_VGA_C80x30: case SW_VGA_M80x30: 639a8445737SSøren Schmidt case SW_VGA_C80x50: case SW_VGA_M80x50: 640a8445737SSøren Schmidt case SW_VGA_C80x60: case SW_VGA_M80x60: 6416e8394b8SKazutaka YOKOTA case SW_VGA_C90x25: case SW_VGA_M90x25: 6426e8394b8SKazutaka YOKOTA case SW_VGA_C90x30: case SW_VGA_M90x30: 6436e8394b8SKazutaka YOKOTA case SW_VGA_C90x43: case SW_VGA_M90x43: 6446e8394b8SKazutaka YOKOTA case SW_VGA_C90x50: case SW_VGA_M90x50: 6456e8394b8SKazutaka YOKOTA case SW_VGA_C90x60: case SW_VGA_M90x60: 646a8445737SSøren Schmidt case SW_B40x25: case SW_C40x25: 647a8445737SSøren Schmidt case SW_B80x25: case SW_C80x25: 648a8445737SSøren Schmidt case SW_ENH_B40x25: case SW_ENH_C40x25: 649a8445737SSøren Schmidt case SW_ENH_B80x25: case SW_ENH_C80x25: 650a8445737SSøren Schmidt case SW_ENH_B80x43: case SW_ENH_C80x43: 651a8445737SSøren Schmidt case SW_EGAMONO80x25: 6526e8394b8SKazutaka YOKOTA if (!(adp->va_flags & V_ADP_MODECHANGE)) 653a8445737SSøren Schmidt return ENODEV; 65486330afeSCraig Rodrigues return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0, 0); 655a8445737SSøren Schmidt 656a8445737SSøren Schmidt /* GRAPHICS MODES */ 657a8445737SSøren Schmidt case SW_BG320: case SW_BG640: 658a8445737SSøren Schmidt case SW_CG320: case SW_CG320_D: case SW_CG640_E: 659a8445737SSøren Schmidt case SW_CG640x350: case SW_ENH_CG640: 660a8445737SSøren Schmidt case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320: 661a8445737SSøren Schmidt case SW_VGA_MODEX: 6626e8394b8SKazutaka YOKOTA if (!(adp->va_flags & V_ADP_MODECHANGE)) 663a8445737SSøren Schmidt return ENODEV; 664a8445737SSøren Schmidt return sc_set_graphics_mode(scp, tp, cmd & 0xff); 6656e8394b8SKazutaka YOKOTA #endif /* SC_NO_MODE_CHANGE */ 666a8445737SSøren Schmidt 6679fddcc66SRuslan Ermilov #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 6689fddcc66SRuslan Ermilov defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 6699fddcc66SRuslan Ermilov case _IO('K', 10): 6709fddcc66SRuslan Ermilov ival = IOCPARM_IVAL(data); 6719fddcc66SRuslan Ermilov data = (caddr_t)&ival; 6729fddcc66SRuslan Ermilov /* FALLTHROUGH */ 6739fddcc66SRuslan Ermilov #endif 674a8445737SSøren Schmidt case KDSETMODE: /* set current mode of this (virtual) console */ 6759fddcc66SRuslan Ermilov switch (*(int *)data) { 676a8445737SSøren Schmidt case KD_TEXT: /* switch to TEXT (known) mode */ 677a8445737SSøren Schmidt /* 678a8445737SSøren Schmidt * If scp->mode is of graphics modes, we don't know which 679a8445737SSøren Schmidt * text mode to switch back to... 680a8445737SSøren Schmidt */ 681a8445737SSøren Schmidt if (scp->status & GRAPHICS_MODE) 682a8445737SSøren Schmidt return EINVAL; 683a8445737SSøren Schmidt /* restore fonts & palette ! */ 684a8445737SSøren Schmidt #if 0 6856e8394b8SKazutaka YOKOTA #ifndef SC_NO_FONT_LOADING 6866e8394b8SKazutaka YOKOTA if (ISFONTAVAIL(adp->va_flags) 687a8445737SSøren Schmidt && !(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) 688a8445737SSøren Schmidt /* 689a8445737SSøren Schmidt * FONT KLUDGE 690a8445737SSøren Schmidt * Don't load fonts for now... XXX 691a8445737SSøren Schmidt */ 6926e8394b8SKazutaka YOKOTA if (scp->sc->fonts_loaded & FONT_8) 693b7c96c0dSMarius Strobl sc_load_font(scp, 0, 8, 8, scp->sc->font_8, 0, 256); 6946e8394b8SKazutaka YOKOTA if (scp->sc->fonts_loaded & FONT_14) 695b7c96c0dSMarius Strobl sc_load_font(scp, 0, 14, 8, scp->sc->font_14, 0, 256); 6966e8394b8SKazutaka YOKOTA if (scp->sc->fonts_loaded & FONT_16) 697b7c96c0dSMarius Strobl sc_load_font(scp, 0, 16, 8, scp->sc->font_16, 0, 256); 698a8445737SSøren Schmidt } 6996e8394b8SKazutaka YOKOTA #endif /* SC_NO_FONT_LOADING */ 700a8445737SSøren Schmidt #endif 701a8445737SSøren Schmidt 7026e8394b8SKazutaka YOKOTA #ifndef SC_NO_PALETTE_LOADING 7038d521790SJung-uk Kim #ifdef SC_PIXEL_MODE 7044cc5f38eSJung-uk Kim if (adp->va_info.vi_mem_model == V_INFO_MM_DIRECT) 7058d521790SJung-uk Kim vidd_load_palette(adp, scp->sc->palette2); 7068d521790SJung-uk Kim else 7078d521790SJung-uk Kim #endif 7089336e069SWojciech A. Koszek vidd_load_palette(adp, scp->sc->palette); 7096e8394b8SKazutaka YOKOTA #endif 7106e8394b8SKazutaka YOKOTA 711a8445737SSøren Schmidt /* move hardware cursor out of the way */ 7129336e069SWojciech A. Koszek vidd_set_hw_cursor(adp, -1, -1); 713a8445737SSøren Schmidt 714a8445737SSøren Schmidt /* FALLTHROUGH */ 715a8445737SSøren Schmidt 716a8445737SSøren Schmidt case KD_TEXT1: /* switch to TEXT (known) mode */ 717a8445737SSøren Schmidt /* 718a8445737SSøren Schmidt * If scp->mode is of graphics modes, we don't know which 719a8445737SSøren Schmidt * text/pixel mode to switch back to... 720a8445737SSøren Schmidt */ 721a8445737SSøren Schmidt if (scp->status & GRAPHICS_MODE) 722a8445737SSøren Schmidt return EINVAL; 723a8445737SSøren Schmidt s = spltty(); 724a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 725a8445737SSøren Schmidt splx(s); 726a8445737SSøren Schmidt return error; 727a8445737SSøren Schmidt } 72809132359SKazutaka YOKOTA scp->status |= UNKNOWN_MODE | MOUSE_HIDDEN; 729a8445737SSøren Schmidt splx(s); 730a8445737SSøren Schmidt /* no restore fonts & palette */ 7316e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) 732a8445737SSøren Schmidt set_mode(scp); 733a8445737SSøren Schmidt sc_clear_screen(scp); 734a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 735a8445737SSøren Schmidt return 0; 736a8445737SSøren Schmidt 7376e8394b8SKazutaka YOKOTA #ifdef SC_PIXEL_MODE 738a8445737SSøren Schmidt case KD_PIXEL: /* pixel (raster) display */ 739a8445737SSøren Schmidt if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) 740a8445737SSøren Schmidt return EINVAL; 74195bafc8fSKazutaka YOKOTA if (scp->status & GRAPHICS_MODE) 742a8445737SSøren Schmidt return sc_set_pixel_mode(scp, tp, scp->xsize, scp->ysize, 74386330afeSCraig Rodrigues scp->font_size, scp->font_width); 744a8445737SSøren Schmidt s = spltty(); 745a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 746a8445737SSøren Schmidt splx(s); 747a8445737SSøren Schmidt return error; 748a8445737SSøren Schmidt } 74909132359SKazutaka YOKOTA scp->status |= (UNKNOWN_MODE | PIXEL_MODE | MOUSE_HIDDEN); 750a8445737SSøren Schmidt splx(s); 7516e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) { 752a8445737SSøren Schmidt set_mode(scp); 7536e8394b8SKazutaka YOKOTA #ifndef SC_NO_PALETTE_LOADING 7544cc5f38eSJung-uk Kim if (adp->va_info.vi_mem_model == V_INFO_MM_DIRECT) 7558d521790SJung-uk Kim vidd_load_palette(adp, scp->sc->palette2); 7568d521790SJung-uk Kim else 7579336e069SWojciech A. Koszek vidd_load_palette(adp, scp->sc->palette); 7586e8394b8SKazutaka YOKOTA #endif 759a8445737SSøren Schmidt } 760a8445737SSøren Schmidt sc_clear_screen(scp); 761a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 762a8445737SSøren Schmidt return 0; 7636e8394b8SKazutaka YOKOTA #endif /* SC_PIXEL_MODE */ 764a8445737SSøren Schmidt 765a8445737SSøren Schmidt case KD_GRAPHICS: /* switch to GRAPHICS (unknown) mode */ 766a8445737SSøren Schmidt s = spltty(); 767a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 768a8445737SSøren Schmidt splx(s); 769a8445737SSøren Schmidt return error; 770a8445737SSøren Schmidt } 77109132359SKazutaka YOKOTA scp->status |= UNKNOWN_MODE | MOUSE_HIDDEN; 772a8445737SSøren Schmidt splx(s); 773a8445737SSøren Schmidt return 0; 774a8445737SSøren Schmidt 775a8445737SSøren Schmidt default: 776a8445737SSøren Schmidt return EINVAL; 777a8445737SSøren Schmidt } 778a8445737SSøren Schmidt /* NOT REACHED */ 779a8445737SSøren Schmidt 7806e8394b8SKazutaka YOKOTA #ifdef SC_PIXEL_MODE 781a8445737SSøren Schmidt case KDRASTER: /* set pixel (raster) display mode */ 782a8445737SSøren Schmidt if (ISUNKNOWNSC(scp) || ISTEXTSC(scp)) 783a8445737SSøren Schmidt return ENODEV; 784a8445737SSøren Schmidt return sc_set_pixel_mode(scp, tp, ((int *)data)[0], ((int *)data)[1], 78586330afeSCraig Rodrigues ((int *)data)[2], 8); 7866e8394b8SKazutaka YOKOTA #endif /* SC_PIXEL_MODE */ 787a8445737SSøren Schmidt 788a8445737SSøren Schmidt case KDGETMODE: /* get current mode of this (virtual) console */ 789a8445737SSøren Schmidt /* 790a8445737SSøren Schmidt * From the user program's point of view, KD_PIXEL is the same 791a8445737SSøren Schmidt * as KD_TEXT... 792a8445737SSøren Schmidt */ 793a8445737SSøren Schmidt *data = ISGRAPHSC(scp) ? KD_GRAPHICS : KD_TEXT; 794a8445737SSøren Schmidt return 0; 795a8445737SSøren Schmidt 7969fddcc66SRuslan Ermilov #if defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD5) || \ 7979fddcc66SRuslan Ermilov defined(COMPAT_FREEBSD4) || defined(COMPAT_43) 7989fddcc66SRuslan Ermilov case _IO('K', 13): 7999fddcc66SRuslan Ermilov ival = IOCPARM_IVAL(data); 8009fddcc66SRuslan Ermilov data = (caddr_t)&ival; 8019fddcc66SRuslan Ermilov /* FALLTHROUGH */ 8029fddcc66SRuslan Ermilov #endif 803a8445737SSøren Schmidt case KDSBORDER: /* set border color of this (virtual) console */ 8049fddcc66SRuslan Ermilov scp->border = *(int *)data; 8056e8394b8SKazutaka YOKOTA if (scp == scp->sc->cur_scp) 8062b944ee2SKazutaka YOKOTA sc_set_border(scp, scp->border); 807a8445737SSøren Schmidt return 0; 808a8445737SSøren Schmidt } 809a8445737SSøren Schmidt 810a8445737SSøren Schmidt return ENOIOCTL; 811a8445737SSøren Schmidt } 812a8445737SSøren Schmidt 813e3975643SJake Burkholder static LIST_HEAD(, sc_renderer) sc_rndr_list = 8142b944ee2SKazutaka YOKOTA LIST_HEAD_INITIALIZER(sc_rndr_list); 8152b944ee2SKazutaka YOKOTA 8162b944ee2SKazutaka YOKOTA int 8172b944ee2SKazutaka YOKOTA sc_render_add(sc_renderer_t *rndr) 8182b944ee2SKazutaka YOKOTA { 8192b944ee2SKazutaka YOKOTA LIST_INSERT_HEAD(&sc_rndr_list, rndr, link); 8202b944ee2SKazutaka YOKOTA return 0; 8212b944ee2SKazutaka YOKOTA } 8222b944ee2SKazutaka YOKOTA 8232b944ee2SKazutaka YOKOTA int 8242b944ee2SKazutaka YOKOTA sc_render_remove(sc_renderer_t *rndr) 8252b944ee2SKazutaka YOKOTA { 8262b944ee2SKazutaka YOKOTA /* 8272b944ee2SKazutaka YOKOTA LIST_REMOVE(rndr, link); 8282b944ee2SKazutaka YOKOTA */ 8292b944ee2SKazutaka YOKOTA return EBUSY; /* XXX */ 8302b944ee2SKazutaka YOKOTA } 8312b944ee2SKazutaka YOKOTA 8322b944ee2SKazutaka YOKOTA sc_rndr_sw_t 8332b944ee2SKazutaka YOKOTA *sc_render_match(scr_stat *scp, char *name, int mode) 8342b944ee2SKazutaka YOKOTA { 8352b944ee2SKazutaka YOKOTA const sc_renderer_t **list; 8362b944ee2SKazutaka YOKOTA const sc_renderer_t *p; 8372b944ee2SKazutaka YOKOTA 8382b944ee2SKazutaka YOKOTA if (!LIST_EMPTY(&sc_rndr_list)) { 8392b944ee2SKazutaka YOKOTA LIST_FOREACH(p, &sc_rndr_list, link) { 8402b944ee2SKazutaka YOKOTA if ((strcmp(p->name, name) == 0) 8412b944ee2SKazutaka YOKOTA && (mode == p->mode)) { 8422b944ee2SKazutaka YOKOTA scp->status &= 8432b944ee2SKazutaka YOKOTA ~(VR_CURSOR_ON | VR_CURSOR_BLINK); 8442b944ee2SKazutaka YOKOTA return p->rndrsw; 8452b944ee2SKazutaka YOKOTA } 8462b944ee2SKazutaka YOKOTA } 8472b944ee2SKazutaka YOKOTA } else { 848f41325dbSPeter Wemm SET_FOREACH(list, scrndr_set) { 849f41325dbSPeter Wemm p = *list; 8502b944ee2SKazutaka YOKOTA if ((strcmp(p->name, name) == 0) 8512b944ee2SKazutaka YOKOTA && (mode == p->mode)) { 8522b944ee2SKazutaka YOKOTA scp->status &= 8532b944ee2SKazutaka YOKOTA ~(VR_CURSOR_ON | VR_CURSOR_BLINK); 8542b944ee2SKazutaka YOKOTA return p->rndrsw; 8552b944ee2SKazutaka YOKOTA } 8562b944ee2SKazutaka YOKOTA } 8572b944ee2SKazutaka YOKOTA } 8582b944ee2SKazutaka YOKOTA 8592b944ee2SKazutaka YOKOTA return NULL; 8602b944ee2SKazutaka YOKOTA } 861