vesa.c (39287) | vesa.c (39591) |
---|---|
1/*- 2 * Copyright (c) 1998 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp) 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * | 1/*- 2 * Copyright (c) 1998 Kazutaka YOKOTA (yokota@zodiac.mech.utsunomiya-u.ac.jp) 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 12 unchanged lines hidden (view full) --- 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * |
29 * $Id$ | 29 * $Id: vesa.c,v 1.1 1998/09/15 18:16:38 sos Exp $ |
30 */ 31 32#include "sc.h" 33#include "opt_vesa.h" 34#include "opt_vm86.h" 35 36#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(VESA_MODULE) 37 --- 90 unchanged lines hidden (view full) --- 128#define STATE_HW (1<<0) 129#define STATE_DATA (1<<1) 130#define STATE_DAC (1<<2) 131#define STATE_REG (1<<3) 132#define STATE_MOST (STATE_HW | STATE_DATA | STATE_REG) 133#define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG) 134static int vesa_bios_state_buf_size(void); 135static int vesa_bios_save_restore(int code, void *p, size_t size); | 30 */ 31 32#include "sc.h" 33#include "opt_vesa.h" 34#include "opt_vm86.h" 35 36#if (NSC > 0 && defined(VESA) && defined(VM86)) || defined(VESA_MODULE) 37 --- 90 unchanged lines hidden (view full) --- 128#define STATE_HW (1<<0) 129#define STATE_DATA (1<<1) 130#define STATE_DAC (1<<2) 131#define STATE_REG (1<<3) 132#define STATE_MOST (STATE_HW | STATE_DATA | STATE_REG) 133#define STATE_ALL (STATE_HW | STATE_DATA | STATE_DAC | STATE_REG) 134static int vesa_bios_state_buf_size(void); 135static int vesa_bios_save_restore(int code, void *p, size_t size); |
136static int translate_flags(u_int16_t vflags); | 136static int vesa_map_gen_mode_num(int type, int color, int mode); 137static int vesa_translate_flags(u_int16_t vflags); |
137static int vesa_bios_init(void); | 138static int vesa_bios_init(void); |
138static void clear_modes(video_info_t *info, int color); | 139static void vesa_clear_modes(video_info_t *info, int color); |
139 140static void 141dump_buffer(u_char *buf, size_t len) 142{ 143 int i; 144 145 for(i = 0; i < len;) { 146 printf("%02x ", buf[i]); --- 130 unchanged lines hidden (view full) --- 277 vmf.vmf_eax = 0x4f04; 278 vmf.vmf_ecx = STATE_MOST; 279 vmf.vmf_edx = code; /* STATE_SAVE/STATE_LOAD */ 280 err = vm86_datacall(0x10, &vmf, (char *)p, size, 281 &vmf.vmf_es, &vmf.vmf_bx); 282 return ((err != 0) || (vmf.vmf_eax != 0x4f)); 283} 284 | 140 141static void 142dump_buffer(u_char *buf, size_t len) 143{ 144 int i; 145 146 for(i = 0; i < len;) { 147 printf("%02x ", buf[i]); --- 130 unchanged lines hidden (view full) --- 278 vmf.vmf_eax = 0x4f04; 279 vmf.vmf_ecx = STATE_MOST; 280 vmf.vmf_edx = code; /* STATE_SAVE/STATE_LOAD */ 281 err = vm86_datacall(0x10, &vmf, (char *)p, size, 282 &vmf.vmf_es, &vmf.vmf_bx); 283 return ((err != 0) || (vmf.vmf_eax != 0x4f)); 284} 285 |
286/* map a generic video mode to a known mode */ |
|
285static int | 287static int |
286translate_flags(u_int16_t vflags) | 288vesa_map_gen_mode_num(int type, int color, int mode) |
287{ | 289{ |
290 static struct { 291 int from; 292 int to; 293 } mode_map[] = { 294 { M_TEXT_132x25, M_VESA_C132x25 }, 295 { M_TEXT_132x43, M_VESA_C132x43 }, 296 { M_TEXT_132x50, M_VESA_C132x50 }, 297 { M_TEXT_132x60, M_VESA_C132x60 }, 298 }; 299 int i; 300 301 for (i = 0; i < sizeof(mode_map)/sizeof(mode_map[0]); ++i) { 302 if (mode_map[i].from == mode) 303 return mode_map[i].to; 304 } 305 return mode; 306} 307 308static int 309vesa_translate_flags(u_int16_t vflags) 310{ |
|
288 static struct { 289 u_int16_t mask; 290 int set; 291 int reset; 292 } ftable[] = { 293 { V_MODECOLOR, V_INFO_COLOR, 0 }, 294 { V_MODEGRAPHICS, V_INFO_GRAPHICS, 0 }, 295 { V_MODELFB, V_INFO_LENEAR, 0 }, --- 72 unchanged lines hidden (view full) --- 368 vesa_vmode[modes].vi_cheight = vmode.v_cheight; 369 vesa_vmode[modes].vi_window = (u_int)vmode.v_waseg << 4; 370 /* XXX window B */ 371 vesa_vmode[modes].vi_window_size = vmode.v_wsize; 372 vesa_vmode[modes].vi_window_gran = vmode.v_wgran; 373 vesa_vmode[modes].vi_buffer = vmode.v_lfb; 374 vesa_vmode[modes].vi_buffer_size = vmode.v_offscreen; 375 /* pixel format, memory model... */ | 311 static struct { 312 u_int16_t mask; 313 int set; 314 int reset; 315 } ftable[] = { 316 { V_MODECOLOR, V_INFO_COLOR, 0 }, 317 { V_MODEGRAPHICS, V_INFO_GRAPHICS, 0 }, 318 { V_MODELFB, V_INFO_LENEAR, 0 }, --- 72 unchanged lines hidden (view full) --- 391 vesa_vmode[modes].vi_cheight = vmode.v_cheight; 392 vesa_vmode[modes].vi_window = (u_int)vmode.v_waseg << 4; 393 /* XXX window B */ 394 vesa_vmode[modes].vi_window_size = vmode.v_wsize; 395 vesa_vmode[modes].vi_window_gran = vmode.v_wgran; 396 vesa_vmode[modes].vi_buffer = vmode.v_lfb; 397 vesa_vmode[modes].vi_buffer_size = vmode.v_offscreen; 398 /* pixel format, memory model... */ |
376 vesa_vmode[modes].vi_flags = translate_flags(vmode.v_modeattr) 377 | V_INFO_VESA; | 399 vesa_vmode[modes].vi_flags 400 = vesa_translate_flags(vmode.v_modeattr) | V_INFO_VESA; |
378 ++modes; 379 } 380 vesa_vmode[modes].vi_mode = EOT; 381 if (bootverbose) 382 printf("VESA: %d mode(s) found\n", modes); 383 384 has_vesa_bios = TRUE; 385 return 0; 386} 387 388static void | 401 ++modes; 402 } 403 vesa_vmode[modes].vi_mode = EOT; 404 if (bootverbose) 405 printf("VESA: %d mode(s) found\n", modes); 406 407 has_vesa_bios = TRUE; 408 return 0; 409} 410 411static void |
389clear_modes(video_info_t *info, int color) | 412vesa_clear_modes(video_info_t *info, int color) |
390{ 391 while (info->vi_mode != EOT) { 392 if ((info->vi_flags & V_INFO_COLOR) != color) 393 info->vi_mode = NA; 394 ++info; 395 } 396} 397 --- 29 unchanged lines hidden (view full) --- 427{ 428 int i; 429 430 if ((*prevvidsw.get_info)(ad, mode, info) == 0) 431 return 0; 432 433 if (ad != vesa_adp->va_index) 434 return 1; | 413{ 414 while (info->vi_mode != EOT) { 415 if ((info->vi_flags & V_INFO_COLOR) != color) 416 info->vi_mode = NA; 417 ++info; 418 } 419} 420 --- 29 unchanged lines hidden (view full) --- 450{ 451 int i; 452 453 if ((*prevvidsw.get_info)(ad, mode, info) == 0) 454 return 0; 455 456 if (ad != vesa_adp->va_index) 457 return 1; |
458 459 mode = vesa_map_gen_mode_num(vesa_adp->va_type, 460 vesa_adp->va_flags & V_ADP_COLOR, mode); |
|
435 for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) { 436 if (vesa_vmode[i].vi_mode == NA) 437 continue; 438 if (vesa_vmode[i].vi_mode == mode) { 439 *info = vesa_vmode[i]; 440 return 0; 441 } 442 } --- 42 unchanged lines hidden (view full) --- 485vesa_set_mode(int ad, int mode) 486{ 487 video_info_t info; 488 size_t len; 489 490 if (ad != vesa_adp->va_index) 491 return (*prevvidsw.set_mode)(ad, mode); 492 | 461 for (i = 0; vesa_vmode[i].vi_mode != EOT; ++i) { 462 if (vesa_vmode[i].vi_mode == NA) 463 continue; 464 if (vesa_vmode[i].vi_mode == mode) { 465 *info = vesa_vmode[i]; 466 return 0; 467 } 468 } --- 42 unchanged lines hidden (view full) --- 511vesa_set_mode(int ad, int mode) 512{ 513 video_info_t info; 514 size_t len; 515 516 if (ad != vesa_adp->va_index) 517 return (*prevvidsw.set_mode)(ad, mode); 518 |
519 mode = vesa_map_gen_mode_num(vesa_adp->va_type, 520 vesa_adp->va_flags & V_ADP_COLOR, mode); |
|
493#ifdef SC_VIDEO_DEBUG 494 printf("VESA: set_mode(): %d(%x) -> %d(%x)\n", 495 vesa_adp->va_mode, vesa_adp->va_mode, mode, mode); 496#endif 497 /* 498 * If the current mode is a VESA mode and the new mode is not, 499 * restore the state of the adapter first, so that non-standard, 500 * extended SVGA registers are set to the state compatible with --- 191 unchanged lines hidden (view full) --- 692 693static int 694vesa_diag(int level) 695{ 696 struct vesa_mode vmode; 697 u_int32_t p; 698 int i; 699 | 521#ifdef SC_VIDEO_DEBUG 522 printf("VESA: set_mode(): %d(%x) -> %d(%x)\n", 523 vesa_adp->va_mode, vesa_adp->va_mode, mode, mode); 524#endif 525 /* 526 * If the current mode is a VESA mode and the new mode is not, 527 * restore the state of the adapter first, so that non-standard, 528 * extended SVGA registers are set to the state compatible with --- 191 unchanged lines hidden (view full) --- 720 721static int 722vesa_diag(int level) 723{ 724 struct vesa_mode vmode; 725 u_int32_t p; 726 int i; 727 |
728#ifndef VESA_MODULE 729 /* call the previous handler first */ 730 (*prevvidsw.diag)(level); 731#endif 732 |
|
700 /* general adapter information */ 701 printf("VESA: v%d.%d, %dk memory, flags:0x%x, mode table:%p (%x)\n", 702 ((vesa_adp_info->v_version & 0xf000) >> 12) * 10 703 + ((vesa_adp_info->v_version & 0x0f00) >> 8), 704 ((vesa_adp_info->v_version & 0x00f0) >> 4) * 10 705 + (vesa_adp_info->v_version & 0x000f), 706 vesa_adp_info->v_memsize * 64, vesa_adp_info->v_flags, 707 vesa_vmodetab, vesa_adp_info->v_modetable); --- 93 unchanged lines hidden (view full) --- 801 return ENXIO; 802 803 if (vesa_bios_init()) 804 return ENXIO; 805 vesa_adp->va_flags |= V_ADP_VESA; 806 807 /* remove conflicting modes if we have more than one adapter */ 808 if (adapters > 1) { | 733 /* general adapter information */ 734 printf("VESA: v%d.%d, %dk memory, flags:0x%x, mode table:%p (%x)\n", 735 ((vesa_adp_info->v_version & 0xf000) >> 12) * 10 736 + ((vesa_adp_info->v_version & 0x0f00) >> 8), 737 ((vesa_adp_info->v_version & 0x00f0) >> 4) * 10 738 + (vesa_adp_info->v_version & 0x000f), 739 vesa_adp_info->v_memsize * 64, vesa_adp_info->v_flags, 740 vesa_vmodetab, vesa_adp_info->v_modetable); --- 93 unchanged lines hidden (view full) --- 834 return ENXIO; 835 836 if (vesa_bios_init()) 837 return ENXIO; 838 vesa_adp->va_flags |= V_ADP_VESA; 839 840 /* remove conflicting modes if we have more than one adapter */ 841 if (adapters > 1) { |
809 clear_modes(vesa_vmode, 810 (vesa_adp->va_flags & V_ADP_COLOR) ? 811 V_INFO_COLOR : 0); | 842 vesa_clear_modes(vesa_vmode, 843 (vesa_adp->va_flags & V_ADP_COLOR) ? 844 V_INFO_COLOR : 0); |
812 } 813 814#ifdef VESA_MODULE 815 s = spltty(); 816#endif 817 if ((error = vesa_load_ioctl()) == 0) { 818 bcopy(&biosvidsw, &prevvidsw, sizeof(prevvidsw)); 819 bcopy(&vesavidsw, &biosvidsw, sizeof(vesavidsw)); --- 49 unchanged lines hidden --- | 845 } 846 847#ifdef VESA_MODULE 848 s = spltty(); 849#endif 850 if ((error = vesa_load_ioctl()) == 0) { 851 bcopy(&biosvidsw, &prevvidsw, sizeof(prevvidsw)); 852 bcopy(&vesavidsw, &biosvidsw, sizeof(vesavidsw)); --- 49 unchanged lines hidden --- |