Deleted Added
full compact
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 ---