Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /* -*- linux-c -*- ------------------------------------------------------- *
  2  *
  3  *   Copyright (C) 1991, 1992 Linus Torvalds
  4  *   Copyright 2007 rPath, Inc. - All Rights Reserved
  5  *
  6  *   This file is part of the Linux kernel, and is made available under
  7  *   the terms of the GNU General Public License version 2.
  8  *
  9  * ----------------------------------------------------------------------- */
 10 
 11 /*
 12  * arch/i386/boot/video-bios.c
 13  *
 14  * Standard video BIOS modes
 15  *
 16  * We have two options for this; silent and scanned.
 17  */
 18 
 19 #include "boot.h"
 20 #include "video.h"
 21 
 22 __videocard video_bios;
 23 
 24 /* Set a conventional BIOS mode */
 25 static int set_bios_mode(u8 mode);
 26 
 27 static int bios_set_mode(struct mode_info *mi)
 28 {
 29         return set_bios_mode(mi->mode - VIDEO_FIRST_BIOS);
 30 }
 31 
 32 static int set_bios_mode(u8 mode)
 33 {
 34         u16 ax;
 35         u8 new_mode;
 36 
 37         ax = mode;              /* AH=0x00 Set Video Mode */
 38         asm volatile(INT10
 39                      : "+a" (ax)
 40                      : : "ebx", "ecx", "edx", "esi", "edi");
 41 
 42         ax = 0x0f00;            /* Get Current Video Mode */
 43         asm volatile(INT10
 44                      : "+a" (ax)
 45                      : : "ebx", "ecx", "edx", "esi", "edi");
 46 
 47         do_restore = 1;         /* Assume video contents were lost */
 48         new_mode = ax & 0x7f;   /* Not all BIOSes are clean with the top bit */
 49 
 50         if (new_mode == mode)
 51                 return 0;       /* Mode change OK */
 52 
 53         if (new_mode != boot_params.screen_info.orig_video_mode) {
 54                 /* Mode setting failed, but we didn't end up where we
 55                    started.  That's bad.  Try to revert to the original
 56                    video mode. */
 57                 ax = boot_params.screen_info.orig_video_mode;
 58                 asm volatile(INT10
 59                              : "+a" (ax)
 60                              : : "ebx", "ecx", "edx", "esi", "edi");
 61         }
 62         return -1;
 63 }
 64 
 65 static int bios_probe(void)
 66 {
 67         u8 mode;
 68         u8 saved_mode = boot_params.screen_info.orig_video_mode;
 69         u16 crtc;
 70         struct mode_info *mi;
 71         int nmodes = 0;
 72 
 73         if (adapter != ADAPTER_EGA && adapter != ADAPTER_VGA)
 74                 return 0;
 75 
 76         set_fs(0);
 77         crtc = vga_crtc();
 78 
 79         video_bios.modes = GET_HEAP(struct mode_info, 0);
 80 
 81         for (mode = 0x14; mode <= 0x7f; mode++) {
 82                 if (!heap_free(sizeof(struct mode_info)))
 83                         break;
 84 
 85                 if (mode_defined(VIDEO_FIRST_BIOS+mode))
 86                         continue;
 87 
 88                 if (set_bios_mode(mode))
 89                         continue;
 90 
 91                 /* Try to verify that it's a text mode. */
 92 
 93                 /* Attribute Controller: make graphics controller disabled */
 94                 if (in_idx(0x3c0, 0x10) & 0x01)
 95                         continue;
 96 
 97                 /* Graphics Controller: verify Alpha addressing enabled */
 98                 if (in_idx(0x3ce, 0x06) & 0x01)
 99                         continue;
100 
101                 /* CRTC cursor location low should be zero(?) */
102                 if (in_idx(crtc, 0x0f))
103                         continue;
104 
105                 mi = GET_HEAP(struct mode_info, 1);
106                 mi->mode = VIDEO_FIRST_BIOS+mode;
107                 mi->depth = 0;  /* text */
108                 mi->x = rdfs16(0x44a);
109                 mi->y = rdfs8(0x484)+1;
110                 nmodes++;
111         }
112 
113         set_bios_mode(saved_mode);
114 
115         return nmodes;
116 }
117 
118 __videocard video_bios =
119 {
120         .card_name      = "BIOS",
121         .probe          = bios_probe,
122         .set_mode       = bios_set_mode,
123         .unsafe         = 1,
124         .xmode_first    = VIDEO_FIRST_BIOS,
125         .xmode_n        = 0x80,
126 };
127 
  This page was automatically generated by the LXR engine.