1a8445737SSøren Schmidt /*- 2a3cd0185SKazutaka YOKOTA * Copyright (c) 1998 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 3a8445737SSøren Schmidt * All rights reserved. 4a8445737SSøren Schmidt * 5a8445737SSøren Schmidt * Redistribution and use in source and binary forms, with or without 6a8445737SSøren Schmidt * modification, are permitted provided that the following conditions 7a8445737SSøren Schmidt * are met: 8a8445737SSøren Schmidt * 1. Redistributions of source code must retain the above copyright 9a3cd0185SKazutaka YOKOTA * notice, this list of conditions and the following disclaimer as 10a3cd0185SKazutaka YOKOTA * the first lines of this file unmodified. 11a8445737SSøren Schmidt * 2. Redistributions in binary form must reproduce the above copyright 12a8445737SSøren Schmidt * notice, this list of conditions and the following disclaimer in the 13a8445737SSøren Schmidt * documentation and/or other materials provided with the distribution. 14a8445737SSøren Schmidt * 15a3cd0185SKazutaka YOKOTA * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16a3cd0185SKazutaka YOKOTA * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17a3cd0185SKazutaka YOKOTA * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18a3cd0185SKazutaka YOKOTA * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19a3cd0185SKazutaka YOKOTA * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20a3cd0185SKazutaka YOKOTA * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21a3cd0185SKazutaka YOKOTA * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22a3cd0185SKazutaka YOKOTA * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23a3cd0185SKazutaka YOKOTA * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24a3cd0185SKazutaka YOKOTA * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25a8445737SSøren Schmidt * 262ad872c5SKazutaka YOKOTA * $Id: $ 27a8445737SSøren Schmidt */ 28a8445737SSøren Schmidt 29a8445737SSøren Schmidt #include "sc.h" 30a8445737SSøren Schmidt #include "opt_syscons.h" 31a8445737SSøren Schmidt 32a8445737SSøren Schmidt #if NSC > 0 33a8445737SSøren Schmidt 34a8445737SSøren Schmidt #include <sys/param.h> 35a8445737SSøren Schmidt #include <sys/systm.h> 36a8445737SSøren Schmidt #include <sys/signalvar.h> 37a8445737SSøren Schmidt #include <sys/tty.h> 38a8445737SSøren Schmidt #include <sys/kernel.h> 39a8445737SSøren Schmidt 40a8445737SSøren Schmidt #include <machine/apm_bios.h> 41a8445737SSøren Schmidt #include <machine/console.h> 42a8445737SSøren Schmidt 432ad872c5SKazutaka YOKOTA #include <dev/fb/fbreg.h> 442ad872c5SKazutaka YOKOTA #include <dev/syscons/syscons.h> 45a8445737SSøren Schmidt 462ad872c5SKazutaka YOKOTA /* for compatibility with previous versions */ 472ad872c5SKazutaka YOKOTA typedef struct old_video_adapter { 482ad872c5SKazutaka YOKOTA int va_index; 492ad872c5SKazutaka YOKOTA int va_type; 502ad872c5SKazutaka YOKOTA int va_flags; 512ad872c5SKazutaka YOKOTA #define V_ADP_COLOR (1<<0) 522ad872c5SKazutaka YOKOTA #define V_ADP_MODECHANGE (1<<1) 532ad872c5SKazutaka YOKOTA #define V_ADP_STATESAVE (1<<2) 542ad872c5SKazutaka YOKOTA #define V_ADP_STATELOAD (1<<3) 552ad872c5SKazutaka YOKOTA #define V_ADP_FONT (1<<4) 562ad872c5SKazutaka YOKOTA #define V_ADP_PALETTE (1<<5) 572ad872c5SKazutaka YOKOTA #define V_ADP_BORDER (1<<6) 582ad872c5SKazutaka YOKOTA #define V_ADP_VESA (1<<7) 592ad872c5SKazutaka YOKOTA int va_crtc_addr; 602ad872c5SKazutaka YOKOTA u_int va_window; /* virtual address */ 612ad872c5SKazutaka YOKOTA size_t va_window_size; 622ad872c5SKazutaka YOKOTA size_t va_window_gran; 632ad872c5SKazutaka YOKOTA u_int va_buffer; /* virtual address */ 642ad872c5SKazutaka YOKOTA size_t va_buffer_size; 652ad872c5SKazutaka YOKOTA int va_initial_mode; 662ad872c5SKazutaka YOKOTA int va_initial_bios_mode; 672ad872c5SKazutaka YOKOTA int va_mode; 682ad872c5SKazutaka YOKOTA } old_video_adapter_t; 69a8445737SSøren Schmidt 702ad872c5SKazutaka YOKOTA #define OLD_CONS_ADPINFO _IOWR('c', 101, old_video_adapter_t) 712ad872c5SKazutaka YOKOTA 722ad872c5SKazutaka YOKOTA /* variables */ 73a8445737SSøren Schmidt extern scr_stat *cur_console; 74a8445737SSøren Schmidt extern int fonts_loaded; 75a8445737SSøren Schmidt extern int sc_history_size; 76a8445737SSøren Schmidt extern u_char palette[]; 77a8445737SSøren Schmidt 78a8445737SSøren Schmidt int 79a8445737SSøren Schmidt sc_set_text_mode(scr_stat *scp, struct tty *tp, int mode, int xsize, int ysize, 80a8445737SSøren Schmidt int fontsize) 81a8445737SSøren Schmidt { 82a8445737SSøren Schmidt video_info_t info; 83a8445737SSøren Schmidt int error; 84a8445737SSøren Schmidt int s; 85a8445737SSøren Schmidt int i; 86a8445737SSøren Schmidt 872ad872c5SKazutaka YOKOTA if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info)) 88a8445737SSøren Schmidt return ENODEV; 89a8445737SSøren Schmidt 90a8445737SSøren Schmidt /* adjust argument values */ 91a8445737SSøren Schmidt if (fontsize <= 0) 92a8445737SSøren Schmidt fontsize = info.vi_cheight; 93a8445737SSøren Schmidt if (fontsize < 14) { 94a8445737SSøren Schmidt fontsize = 8; 95a8445737SSøren Schmidt if (!(fonts_loaded & FONT_8)) 96a8445737SSøren Schmidt return EINVAL; 97a8445737SSøren Schmidt } else if (fontsize >= 16) { 98a8445737SSøren Schmidt fontsize = 16; 99a8445737SSøren Schmidt if (!(fonts_loaded & FONT_16)) 100a8445737SSøren Schmidt return EINVAL; 101a8445737SSøren Schmidt } else { 102a8445737SSøren Schmidt fontsize = 14; 103a8445737SSøren Schmidt if (!(fonts_loaded & FONT_14)) 104a8445737SSøren Schmidt return EINVAL; 105a8445737SSøren Schmidt } 106a8445737SSøren Schmidt if ((xsize <= 0) || (xsize > info.vi_width)) 107a8445737SSøren Schmidt xsize = info.vi_width; 108a8445737SSøren Schmidt if ((ysize <= 0) || (ysize > info.vi_height)) 109a8445737SSøren Schmidt ysize = info.vi_height; 110a8445737SSøren Schmidt 111a8445737SSøren Schmidt /* stop screen saver, etc */ 112a8445737SSøren Schmidt s = spltty(); 113a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 114a8445737SSøren Schmidt splx(s); 115a8445737SSøren Schmidt return error; 116a8445737SSøren Schmidt } 117a8445737SSøren Schmidt 118a8445737SSøren Schmidt /* set up scp */ 119a8445737SSøren Schmidt if (scp->history != NULL) 120a8445737SSøren Schmidt i = imax(scp->history_size / scp->xsize 121a8445737SSøren Schmidt - imax(sc_history_size, scp->ysize), 0); 122a8445737SSøren Schmidt else 123a8445737SSøren Schmidt i = 0; 124a8445737SSøren Schmidt /* 125a8445737SSøren Schmidt * This is a kludge to fend off scrn_update() while we 126a8445737SSøren Schmidt * muck around with scp. XXX 127a8445737SSøren Schmidt */ 128a8445737SSøren Schmidt scp->status |= UNKNOWN_MODE; 129a8445737SSøren Schmidt scp->status &= ~(GRAPHICS_MODE | PIXEL_MODE); 130a8445737SSøren Schmidt scp->mode = mode; 131a8445737SSøren Schmidt scp->font_size = fontsize; 132a8445737SSøren Schmidt scp->xsize = xsize; 133a8445737SSøren Schmidt scp->ysize = ysize; 1342ad872c5SKazutaka YOKOTA scp->xoff = 0; 1352ad872c5SKazutaka YOKOTA scp->yoff = 0; 136a8445737SSøren Schmidt scp->xpixel = scp->xsize*8; 137a8445737SSøren Schmidt scp->ypixel = scp->ysize*fontsize; 138a8445737SSøren Schmidt 139a8445737SSøren Schmidt /* allocate buffers */ 140a8445737SSøren Schmidt sc_alloc_scr_buffer(scp, TRUE, TRUE); 1412ad872c5SKazutaka YOKOTA if (ISMOUSEAVAIL(scp->adp->va_flags)) 142a8445737SSøren Schmidt sc_alloc_cut_buffer(scp, FALSE); 143a8445737SSøren Schmidt sc_alloc_history_buffer(scp, sc_history_size, i, FALSE); 144a8445737SSøren Schmidt splx(s); 145a8445737SSøren Schmidt 146a8445737SSøren Schmidt if (scp == cur_console) 147a8445737SSøren Schmidt set_mode(scp); 148a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 149a8445737SSøren Schmidt 150a8445737SSøren Schmidt if (tp == NULL) 151a8445737SSøren Schmidt return 0; 152a8445737SSøren Schmidt if (tp->t_winsize.ws_col != scp->xsize 153a8445737SSøren Schmidt || tp->t_winsize.ws_row != scp->ysize) { 154a8445737SSøren Schmidt tp->t_winsize.ws_col = scp->xsize; 155a8445737SSøren Schmidt tp->t_winsize.ws_row = scp->ysize; 156a8445737SSøren Schmidt pgsignal(tp->t_pgrp, SIGWINCH, 1); 157a8445737SSøren Schmidt } 158a8445737SSøren Schmidt 159a8445737SSøren Schmidt return 0; 160a8445737SSøren Schmidt } 161a8445737SSøren Schmidt 162a8445737SSøren Schmidt int 163a8445737SSøren Schmidt sc_set_graphics_mode(scr_stat *scp, struct tty *tp, int mode) 164a8445737SSøren Schmidt { 165a8445737SSøren Schmidt video_info_t info; 166a8445737SSøren Schmidt int error; 167a8445737SSøren Schmidt int s; 168a8445737SSøren Schmidt 1692ad872c5SKazutaka YOKOTA if ((*vidsw[scp->ad]->get_info)(scp->adp, mode, &info)) 170a8445737SSøren Schmidt return ENODEV; 171a8445737SSøren Schmidt 172a8445737SSøren Schmidt /* stop screen saver, etc */ 173a8445737SSøren Schmidt s = spltty(); 174a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 175a8445737SSøren Schmidt splx(s); 176a8445737SSøren Schmidt return error; 177a8445737SSøren Schmidt } 178a8445737SSøren Schmidt 179a8445737SSøren Schmidt /* set up scp */ 180a8445737SSøren Schmidt scp->status |= (UNKNOWN_MODE | GRAPHICS_MODE); 181a8445737SSøren Schmidt scp->status &= ~PIXEL_MODE; 182a8445737SSøren Schmidt scp->mode = mode; 1832ad872c5SKazutaka YOKOTA scp->xoff = 0; 1842ad872c5SKazutaka YOKOTA scp->yoff = 0; 185a8445737SSøren Schmidt scp->xpixel = info.vi_width; 186a8445737SSøren Schmidt scp->ypixel = info.vi_height; 187a8445737SSøren Schmidt scp->xsize = info.vi_width/8; 188a8445737SSøren Schmidt scp->ysize = info.vi_height/info.vi_cheight; 189a8445737SSøren Schmidt scp->font_size = FONT_NONE; 190a8445737SSøren Schmidt /* move the mouse cursor at the center of the screen */ 191a8445737SSøren Schmidt sc_move_mouse(scp, scp->xpixel / 2, scp->ypixel / 2); 192a8445737SSøren Schmidt splx(s); 193a8445737SSøren Schmidt 194a8445737SSøren Schmidt if (scp == cur_console) 195a8445737SSøren Schmidt set_mode(scp); 196a8445737SSøren Schmidt /* clear_graphics();*/ 197a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 198a8445737SSøren Schmidt 199a8445737SSøren Schmidt if (tp == NULL) 200a8445737SSøren Schmidt return 0; 201a8445737SSøren Schmidt if (tp->t_winsize.ws_xpixel != scp->xpixel 202a8445737SSøren Schmidt || tp->t_winsize.ws_ypixel != scp->ypixel) { 203a8445737SSøren Schmidt tp->t_winsize.ws_xpixel = scp->xpixel; 204a8445737SSøren Schmidt tp->t_winsize.ws_ypixel = scp->ypixel; 205a8445737SSøren Schmidt pgsignal(tp->t_pgrp, SIGWINCH, 1); 206a8445737SSøren Schmidt } 207a8445737SSøren Schmidt 208a8445737SSøren Schmidt return 0; 209a8445737SSøren Schmidt } 210a8445737SSøren Schmidt 211a8445737SSøren Schmidt int 212a8445737SSøren Schmidt sc_set_pixel_mode(scr_stat *scp, struct tty *tp, int xsize, int ysize, 213a8445737SSøren Schmidt int fontsize) 214a8445737SSøren Schmidt { 215a8445737SSøren Schmidt video_info_t info; 216a8445737SSøren Schmidt int error; 217a8445737SSøren Schmidt int s; 218a8445737SSøren Schmidt int i; 219a8445737SSøren Schmidt 2202ad872c5SKazutaka YOKOTA if ((*vidsw[scp->ad]->get_info)(scp->adp, scp->mode, &info)) 221a8445737SSøren Schmidt return ENODEV; /* this shouldn't happen */ 222a8445737SSøren Schmidt 223a8445737SSøren Schmidt #ifdef SC_VIDEO_DEBUG 224a8445737SSøren Schmidt if (scp->scr_buf != NULL) { 225a8445737SSøren Schmidt printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n", 226a8445737SSøren Schmidt scp->mode, xsize, ysize, fontsize); 227a8445737SSøren Schmidt } 228a8445737SSøren Schmidt #endif 229a8445737SSøren Schmidt 230a8445737SSøren Schmidt /* adjust argument values */ 231a8445737SSøren Schmidt if ((fontsize <= 0) || (fontsize == FONT_NONE)) 232a8445737SSøren Schmidt fontsize = info.vi_cheight; 233a8445737SSøren Schmidt if (fontsize < 14) { 234a8445737SSøren Schmidt fontsize = 8; 235a8445737SSøren Schmidt if (!(fonts_loaded & FONT_8)) 236a8445737SSøren Schmidt return EINVAL; 237a8445737SSøren Schmidt } else if (fontsize >= 16) { 238a8445737SSøren Schmidt fontsize = 16; 239a8445737SSøren Schmidt if (!(fonts_loaded & FONT_16)) 240a8445737SSøren Schmidt return EINVAL; 241a8445737SSøren Schmidt } else { 242a8445737SSøren Schmidt fontsize = 14; 243a8445737SSøren Schmidt if (!(fonts_loaded & FONT_14)) 244a8445737SSøren Schmidt return EINVAL; 245a8445737SSøren Schmidt } 246a8445737SSøren Schmidt if (xsize <= 0) 247a8445737SSøren Schmidt xsize = info.vi_width/8; 248a8445737SSøren Schmidt if (ysize <= 0) 249a8445737SSøren Schmidt ysize = info.vi_height/fontsize; 250a8445737SSøren Schmidt 251a8445737SSøren Schmidt #ifdef SC_VIDEO_DEBUG 252a8445737SSøren Schmidt if (scp->scr_buf != NULL) { 253a8445737SSøren Schmidt printf("set_pixel_mode(): mode:%x, col:%d, row:%d, font:%d\n", 254a8445737SSøren Schmidt scp->mode, xsize, ysize, fontsize); 25595bafc8fSKazutaka YOKOTA printf("set_pixel_mode(): window:%x, %dx%d, xoff:%d, yoff:%d\n", 2562ad872c5SKazutaka YOKOTA scp->adp->va_window, info.vi_width, info.vi_height, 257a8445737SSøren Schmidt (info.vi_width/8 - xsize)/2, 258a8445737SSøren Schmidt (info.vi_height/fontsize - ysize)/2); 259a8445737SSøren Schmidt } 260a8445737SSøren Schmidt #endif 261a8445737SSøren Schmidt 26295bafc8fSKazutaka YOKOTA if ((info.vi_width < xsize*8) || (info.vi_height < ysize*fontsize)) 26395bafc8fSKazutaka YOKOTA return EINVAL; 26495bafc8fSKazutaka YOKOTA 26595bafc8fSKazutaka YOKOTA /* only 16 color, 4 plane modes are supported XXX */ 26695bafc8fSKazutaka YOKOTA if ((info.vi_depth != 4) || (info.vi_planes != 4)) 26795bafc8fSKazutaka YOKOTA return ENODEV; 26895bafc8fSKazutaka YOKOTA 26995bafc8fSKazutaka YOKOTA /* 27095bafc8fSKazutaka YOKOTA * set_pixel_mode() currently does not support video modes whose 27195bafc8fSKazutaka YOKOTA * memory size is larger than 64K. Because such modes require 27295bafc8fSKazutaka YOKOTA * bank switching to access the entire screen. XXX 27395bafc8fSKazutaka YOKOTA */ 274def80244SKazutaka YOKOTA if (info.vi_width*info.vi_height/8 > info.vi_window_size) 27595bafc8fSKazutaka YOKOTA return ENODEV; 27695bafc8fSKazutaka YOKOTA 277a8445737SSøren Schmidt /* stop screen saver, etc */ 278a8445737SSøren Schmidt s = spltty(); 279a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 280a8445737SSøren Schmidt splx(s); 281a8445737SSøren Schmidt return error; 282a8445737SSøren Schmidt } 283a8445737SSøren Schmidt 284a8445737SSøren Schmidt /* set up scp */ 285a8445737SSøren Schmidt if (scp->history != NULL) 286a8445737SSøren Schmidt i = imax(scp->history_size / scp->xsize 287a8445737SSøren Schmidt - imax(sc_history_size, scp->ysize), 0); 288a8445737SSøren Schmidt else 289a8445737SSøren Schmidt i = 0; 290a8445737SSøren Schmidt scp->status |= (UNKNOWN_MODE | PIXEL_MODE); 291a8445737SSøren Schmidt scp->status &= ~(GRAPHICS_MODE | MOUSE_ENABLED); 292a8445737SSøren Schmidt scp->xsize = xsize; 293a8445737SSøren Schmidt scp->ysize = ysize; 294a8445737SSøren Schmidt scp->font_size = fontsize; 295a8445737SSøren Schmidt scp->xoff = (scp->xpixel/8 - xsize)/2; 296a8445737SSøren Schmidt scp->yoff = (scp->ypixel/fontsize - ysize)/2; 297a8445737SSøren Schmidt 298a8445737SSøren Schmidt /* allocate buffers */ 299a8445737SSøren Schmidt sc_alloc_scr_buffer(scp, TRUE, TRUE); 3002ad872c5SKazutaka YOKOTA if (ISMOUSEAVAIL(scp->adp->va_flags)) 301a8445737SSøren Schmidt sc_alloc_cut_buffer(scp, FALSE); 302a8445737SSøren Schmidt sc_alloc_history_buffer(scp, sc_history_size, i, FALSE); 303a8445737SSøren Schmidt splx(s); 304a8445737SSøren Schmidt 305a8445737SSøren Schmidt if (scp == cur_console) 30695bafc8fSKazutaka YOKOTA set_border(scp, scp->border); 307a8445737SSøren Schmidt 308a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 309a8445737SSøren Schmidt 310a8445737SSøren Schmidt #ifdef SC_VIDEO_DEBUG 311a8445737SSøren Schmidt printf("set_pixel_mode(): status:%x\n", scp->status); 312a8445737SSøren Schmidt #endif 313a8445737SSøren Schmidt 314a8445737SSøren Schmidt if (tp == NULL) 315a8445737SSøren Schmidt return 0; 316a8445737SSøren Schmidt if (tp->t_winsize.ws_col != scp->xsize 317a8445737SSøren Schmidt || tp->t_winsize.ws_row != scp->ysize) { 318a8445737SSøren Schmidt tp->t_winsize.ws_col = scp->xsize; 319a8445737SSøren Schmidt tp->t_winsize.ws_row = scp->ysize; 320a8445737SSøren Schmidt pgsignal(tp->t_pgrp, SIGWINCH, 1); 321a8445737SSøren Schmidt } 322a8445737SSøren Schmidt 323a8445737SSøren Schmidt return 0; 324a8445737SSøren Schmidt } 325a8445737SSøren Schmidt 326a8445737SSøren Schmidt int 327a8445737SSøren Schmidt sc_vid_ioctl(struct tty *tp, u_long cmd, caddr_t data, int flag, struct proc *p) 328a8445737SSøren Schmidt { 329a8445737SSøren Schmidt scr_stat *scp; 330a8445737SSøren Schmidt int error; 331a8445737SSøren Schmidt int s; 332a8445737SSøren Schmidt 333a8445737SSøren Schmidt scp = sc_get_scr_stat(tp->t_dev); 334a8445737SSøren Schmidt 335a8445737SSøren Schmidt switch (cmd) { 336a8445737SSøren Schmidt 337a8445737SSøren Schmidt case CONS_CURRENT: /* get current adapter type */ 3382ad872c5SKazutaka YOKOTA if (scp->adp == NULL) 3392ad872c5SKazutaka YOKOTA return ENODEV; 3402ad872c5SKazutaka YOKOTA *(int *)data = scp->adp->va_type; 341a8445737SSøren Schmidt return 0; 342a8445737SSøren Schmidt 343a8445737SSøren Schmidt case CONS_CURRENTADP: /* get current adapter index */ 3442ad872c5SKazutaka YOKOTA *(int *)data = scp->ad; 3452ad872c5SKazutaka YOKOTA return 0; 3462ad872c5SKazutaka YOKOTA 3472ad872c5SKazutaka YOKOTA case OLD_CONS_ADPINFO: /* adapter information */ 3482ad872c5SKazutaka YOKOTA if (scp->adp == NULL) 3492ad872c5SKazutaka YOKOTA return ENODEV; 3502ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_index = scp->adp->va_index; 3512ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_type = scp->adp->va_type; 3522ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_flags = scp->adp->va_flags; 3532ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr; 3542ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window = scp->adp->va_window; 3552ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window_size 3562ad872c5SKazutaka YOKOTA = scp->adp->va_window_size; 3572ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_window_gran 3582ad872c5SKazutaka YOKOTA = scp->adp->va_window_gran; 3592ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_buffer = scp->adp->va_buffer; 3602ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_buffer_size 3612ad872c5SKazutaka YOKOTA = scp->adp->va_buffer_size; 3622ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_mode = scp->adp->va_mode; 3632ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_initial_mode 3642ad872c5SKazutaka YOKOTA = scp->adp->va_initial_mode; 3652ad872c5SKazutaka YOKOTA ((old_video_adapter_t *)data)->va_initial_bios_mode 3662ad872c5SKazutaka YOKOTA = scp->adp->va_initial_bios_mode; 367a8445737SSøren Schmidt return 0; 368a8445737SSøren Schmidt 369a8445737SSøren Schmidt case CONS_ADPINFO: /* adapter information */ 3702ad872c5SKazutaka YOKOTA if (scp->adp == NULL) 371a8445737SSøren Schmidt return ENODEV; 3722ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_index = scp->adp->va_index; 3732ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_type = scp->adp->va_type; 3742ad872c5SKazutaka YOKOTA bcopy(scp->adp->va_name, ((video_adapter_info_t *)data)->va_name, 3752ad872c5SKazutaka YOKOTA imin(strlen(scp->adp->va_name) + 1, 3762ad872c5SKazutaka YOKOTA sizeof(((video_adapter_info_t *)data)->va_name))); 3772ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_unit = scp->adp->va_unit; 3782ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_flags = scp->adp->va_flags; 3792ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_io_base = scp->adp->va_io_base; 3802ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_io_size = scp->adp->va_io_size; 3812ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_crtc_addr = scp->adp->va_crtc_addr; 3822ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_mem_base = scp->adp->va_mem_base; 3832ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_mem_size = scp->adp->va_mem_size; 3842ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_window = scp->adp->va_window; 3852ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_window_size 3862ad872c5SKazutaka YOKOTA = scp->adp->va_window_size; 3872ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_window_gran 3882ad872c5SKazutaka YOKOTA = scp->adp->va_window_gran; 3892ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_buffer = scp->adp->va_buffer; 3902ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_buffer_size 3912ad872c5SKazutaka YOKOTA = scp->adp->va_buffer_size; 3922ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_mode = scp->adp->va_mode; 3932ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_mode_flags = scp->adp->va_mode_flags; 3942ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_initial_mode 3952ad872c5SKazutaka YOKOTA = scp->adp->va_initial_mode; 3962ad872c5SKazutaka YOKOTA ((video_adapter_info_t *)data)->va_initial_bios_mode 3972ad872c5SKazutaka YOKOTA = scp->adp->va_initial_bios_mode; 398a8445737SSøren Schmidt return 0; 399a8445737SSøren Schmidt 400a8445737SSøren Schmidt case CONS_GET: /* get current video mode */ 401a8445737SSøren Schmidt *(int *)data = scp->mode; 402a8445737SSøren Schmidt return 0; 403a8445737SSøren Schmidt 404a8445737SSøren Schmidt case CONS_MODEINFO: /* get mode information */ 4052ad872c5SKazutaka YOKOTA return ((*vidsw[scp->ad]->get_info)(scp->adp, 406a8445737SSøren Schmidt ((video_info_t *)data)->vi_mode, (video_info_t *)data) 407a8445737SSøren Schmidt ? ENODEV : 0); 408a8445737SSøren Schmidt 409a8445737SSøren Schmidt case CONS_FINDMODE: /* find a matching video mode */ 4102ad872c5SKazutaka YOKOTA return ((*vidsw[scp->ad]->query_mode)(scp->adp, (video_info_t *)data) 411a8445737SSøren Schmidt ? ENODEV : 0); 412a8445737SSøren Schmidt 413a8445737SSøren Schmidt case CONS_SETWINORG: 4142ad872c5SKazutaka YOKOTA return ((*vidsw[scp->ad]->set_win_org)(scp->adp, *(u_int *)data) 415a8445737SSøren Schmidt ? ENODEV : 0); 416a8445737SSøren Schmidt 41795bafc8fSKazutaka YOKOTA /* generic text modes */ 41895bafc8fSKazutaka YOKOTA case SW_TEXT_80x25: case SW_TEXT_80x30: 41995bafc8fSKazutaka YOKOTA case SW_TEXT_80x43: case SW_TEXT_80x50: 42095bafc8fSKazutaka YOKOTA case SW_TEXT_80x60: 42195bafc8fSKazutaka YOKOTA /* FALL THROUGH */ 42295bafc8fSKazutaka YOKOTA 423a8445737SSøren Schmidt /* VGA TEXT MODES */ 424a8445737SSøren Schmidt case SW_VGA_C40x25: 425a8445737SSøren Schmidt case SW_VGA_C80x25: case SW_VGA_M80x25: 426a8445737SSøren Schmidt case SW_VGA_C80x30: case SW_VGA_M80x30: 427a8445737SSøren Schmidt case SW_VGA_C80x50: case SW_VGA_M80x50: 428a8445737SSøren Schmidt case SW_VGA_C80x60: case SW_VGA_M80x60: 429a8445737SSøren Schmidt case SW_B40x25: case SW_C40x25: 430a8445737SSøren Schmidt case SW_B80x25: case SW_C80x25: 431a8445737SSøren Schmidt case SW_ENH_B40x25: case SW_ENH_C40x25: 432a8445737SSøren Schmidt case SW_ENH_B80x25: case SW_ENH_C80x25: 433a8445737SSøren Schmidt case SW_ENH_B80x43: case SW_ENH_C80x43: 434a8445737SSøren Schmidt case SW_EGAMONO80x25: 4352ad872c5SKazutaka YOKOTA 4362ad872c5SKazutaka YOKOTA #ifdef PC98 4372ad872c5SKazutaka YOKOTA /* PC98 TEXT MODES */ 4382ad872c5SKazutaka YOKOTA case SW_PC98_80x25: 4392ad872c5SKazutaka YOKOTA case SW_PC98_80x30: 4402ad872c5SKazutaka YOKOTA #endif 4412ad872c5SKazutaka YOKOTA if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) 442a8445737SSøren Schmidt return ENODEV; 443a8445737SSøren Schmidt return sc_set_text_mode(scp, tp, cmd & 0xff, 0, 0, 0); 444a8445737SSøren Schmidt 445a8445737SSøren Schmidt /* GRAPHICS MODES */ 446a8445737SSøren Schmidt case SW_BG320: case SW_BG640: 447a8445737SSøren Schmidt case SW_CG320: case SW_CG320_D: case SW_CG640_E: 448a8445737SSøren Schmidt case SW_CG640x350: case SW_ENH_CG640: 449a8445737SSøren Schmidt case SW_BG640x480: case SW_CG640x480: case SW_VGA_CG320: 450a8445737SSøren Schmidt case SW_VGA_MODEX: 4512ad872c5SKazutaka YOKOTA if (!(scp->adp->va_flags & V_ADP_MODECHANGE)) 452a8445737SSøren Schmidt return ENODEV; 453a8445737SSøren Schmidt return sc_set_graphics_mode(scp, tp, cmd & 0xff); 454a8445737SSøren Schmidt 455a8445737SSøren Schmidt case KDSETMODE: /* set current mode of this (virtual) console */ 456def80244SKazutaka YOKOTA switch (*(int *)data) { 457a8445737SSøren Schmidt case KD_TEXT: /* switch to TEXT (known) mode */ 458a8445737SSøren Schmidt /* 459a8445737SSøren Schmidt * If scp->mode is of graphics modes, we don't know which 460a8445737SSøren Schmidt * text mode to switch back to... 461a8445737SSøren Schmidt */ 462a8445737SSøren Schmidt if (scp->status & GRAPHICS_MODE) 463a8445737SSøren Schmidt return EINVAL; 464a8445737SSøren Schmidt /* restore fonts & palette ! */ 465a8445737SSøren Schmidt #if 0 4662ad872c5SKazutaka YOKOTA if (ISFONTAVAIL(scp->adp->va_flags) 467a8445737SSøren Schmidt && !(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) 468a8445737SSøren Schmidt /* 469a8445737SSøren Schmidt * FONT KLUDGE 470a8445737SSøren Schmidt * Don't load fonts for now... XXX 471a8445737SSøren Schmidt */ 472a8445737SSøren Schmidt if (fonts_loaded & FONT_8) 473a8445737SSøren Schmidt copy_font(scp, LOAD, 8, font_8); 474a8445737SSøren Schmidt if (fonts_loaded & FONT_14) 475a8445737SSøren Schmidt copy_font(scp, LOAD, 14, font_14); 476a8445737SSøren Schmidt if (fonts_loaded & FONT_16) 477a8445737SSøren Schmidt copy_font(scp, LOAD, 16, font_16); 478a8445737SSøren Schmidt } 479a8445737SSøren Schmidt #endif 4802ad872c5SKazutaka YOKOTA load_palette(scp->adp, palette); 481a8445737SSøren Schmidt 482a8445737SSøren Schmidt /* move hardware cursor out of the way */ 4832ad872c5SKazutaka YOKOTA (*vidsw[scp->ad]->set_hw_cursor)(scp->adp, -1, -1); 484a8445737SSøren Schmidt 485a8445737SSøren Schmidt /* FALL THROUGH */ 486a8445737SSøren Schmidt 487a8445737SSøren Schmidt case KD_TEXT1: /* switch to TEXT (known) mode */ 488a8445737SSøren Schmidt /* 489a8445737SSøren Schmidt * If scp->mode is of graphics modes, we don't know which 490a8445737SSøren Schmidt * text/pixel mode to switch back to... 491a8445737SSøren Schmidt */ 492a8445737SSøren Schmidt if (scp->status & GRAPHICS_MODE) 493a8445737SSøren Schmidt return EINVAL; 494a8445737SSøren Schmidt s = spltty(); 495a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 496a8445737SSøren Schmidt splx(s); 497a8445737SSøren Schmidt return error; 498a8445737SSøren Schmidt } 4992ad872c5SKazutaka YOKOTA #ifndef PC98 500a8445737SSøren Schmidt scp->status |= UNKNOWN_MODE; 501a8445737SSøren Schmidt splx(s); 502a8445737SSøren Schmidt /* no restore fonts & palette */ 50395bafc8fSKazutaka YOKOTA if (scp == cur_console) 504a8445737SSøren Schmidt set_mode(scp); 505a8445737SSøren Schmidt sc_clear_screen(scp); 506a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 5072ad872c5SKazutaka YOKOTA #else /* PC98 */ 5082ad872c5SKazutaka YOKOTA scp->status &= ~UNKNOWN_MODE; 5092ad872c5SKazutaka YOKOTA /* no restore fonts & palette */ 5102ad872c5SKazutaka YOKOTA if (scp == cur_console) 5112ad872c5SKazutaka YOKOTA set_mode(scp); 5122ad872c5SKazutaka YOKOTA sc_clear_screen(scp); 5132ad872c5SKazutaka YOKOTA splx(s); 5142ad872c5SKazutaka YOKOTA #endif /* PC98 */ 515a8445737SSøren Schmidt return 0; 516a8445737SSøren Schmidt 517a8445737SSøren Schmidt case KD_PIXEL: /* pixel (raster) display */ 518a8445737SSøren Schmidt if (!(scp->status & (GRAPHICS_MODE | PIXEL_MODE))) 519a8445737SSøren Schmidt return EINVAL; 52095bafc8fSKazutaka YOKOTA if (scp->status & GRAPHICS_MODE) 521a8445737SSøren Schmidt return sc_set_pixel_mode(scp, tp, scp->xsize, scp->ysize, 522a8445737SSøren Schmidt scp->font_size); 523a8445737SSøren Schmidt s = spltty(); 524a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 525a8445737SSøren Schmidt splx(s); 526a8445737SSøren Schmidt return error; 527a8445737SSøren Schmidt } 528a8445737SSøren Schmidt scp->status |= (UNKNOWN_MODE | PIXEL_MODE); 529a8445737SSøren Schmidt splx(s); 530a8445737SSøren Schmidt if (scp == cur_console) { 531a8445737SSøren Schmidt set_mode(scp); 5322ad872c5SKazutaka YOKOTA load_palette(scp->adp, palette); 533a8445737SSøren Schmidt } 534a8445737SSøren Schmidt sc_clear_screen(scp); 535a8445737SSøren Schmidt scp->status &= ~UNKNOWN_MODE; 536a8445737SSøren Schmidt return 0; 537a8445737SSøren Schmidt 538a8445737SSøren Schmidt case KD_GRAPHICS: /* switch to GRAPHICS (unknown) mode */ 539a8445737SSøren Schmidt s = spltty(); 540a8445737SSøren Schmidt if ((error = sc_clean_up(scp))) { 541a8445737SSøren Schmidt splx(s); 542a8445737SSøren Schmidt return error; 543a8445737SSøren Schmidt } 544a8445737SSøren Schmidt scp->status |= UNKNOWN_MODE; 545a8445737SSøren Schmidt splx(s); 5462ad872c5SKazutaka YOKOTA #ifdef PC98 5472ad872c5SKazutaka YOKOTA if (scp == cur_console) 5482ad872c5SKazutaka YOKOTA set_mode(scp); 5492ad872c5SKazutaka YOKOTA #endif 550a8445737SSøren Schmidt return 0; 551a8445737SSøren Schmidt 552a8445737SSøren Schmidt default: 553a8445737SSøren Schmidt return EINVAL; 554a8445737SSøren Schmidt } 555a8445737SSøren Schmidt /* NOT REACHED */ 556a8445737SSøren Schmidt 557a8445737SSøren Schmidt case KDRASTER: /* set pixel (raster) display mode */ 558a8445737SSøren Schmidt if (ISUNKNOWNSC(scp) || ISTEXTSC(scp)) 559a8445737SSøren Schmidt return ENODEV; 560a8445737SSøren Schmidt return sc_set_pixel_mode(scp, tp, ((int *)data)[0], ((int *)data)[1], 561a8445737SSøren Schmidt ((int *)data)[2]); 562a8445737SSøren Schmidt 563a8445737SSøren Schmidt case KDGETMODE: /* get current mode of this (virtual) console */ 564a8445737SSøren Schmidt /* 565a8445737SSøren Schmidt * From the user program's point of view, KD_PIXEL is the same 566a8445737SSøren Schmidt * as KD_TEXT... 567a8445737SSøren Schmidt */ 568a8445737SSøren Schmidt *data = ISGRAPHSC(scp) ? KD_GRAPHICS : KD_TEXT; 569a8445737SSøren Schmidt return 0; 570a8445737SSøren Schmidt 571a8445737SSøren Schmidt case KDSBORDER: /* set border color of this (virtual) console */ 572a8445737SSøren Schmidt scp->border = *data; 573a8445737SSøren Schmidt if (scp == cur_console) 5742ad872c5SKazutaka YOKOTA set_border(scp, scp->border); 575a8445737SSøren Schmidt return 0; 576a8445737SSøren Schmidt } 577a8445737SSøren Schmidt 578a8445737SSøren Schmidt return ENOIOCTL; 579a8445737SSøren Schmidt } 580a8445737SSøren Schmidt 581a8445737SSøren Schmidt #endif /* NSC > 0 */ 582