]> err.no Git - linux-2.6/blobdiff - drivers/video/console/vgacon.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[linux-2.6] / drivers / video / console / vgacon.c
index 53c22197b63128632d20c6c7639f851d058eff0c..f65bcd314d54118b0b8d5fd69847fd060a352f69 100644 (file)
@@ -86,8 +86,6 @@ static int vgacon_set_origin(struct vc_data *c);
 static void vgacon_save_screen(struct vc_data *c);
 static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
                         int lines);
-static u8 vgacon_build_attr(struct vc_data *c, u8 color, u8 intensity,
-                           u8 blink, u8 underline, u8 reverse, u8);
 static void vgacon_invert_region(struct vc_data *c, u16 * p, int count);
 static unsigned long vgacon_uni_pagedir[2];
 
@@ -189,7 +187,11 @@ static void vgacon_scrollback_init(int pitch)
        }
 }
 
-static void vgacon_scrollback_startup(void)
+/*
+ * Called only duing init so call of alloc_bootmen is ok.
+ * Marked __init_refok to silence modpost.
+ */
+static void __init_refok vgacon_scrollback_startup(void)
 {
        vgacon_scrollback = alloc_bootmem(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE
                                          * 1024);
@@ -360,7 +362,7 @@ static const char *vgacon_startup(void)
        u16 saved1, saved2;
        volatile u16 *p;
 
-       if (ORIG_VIDEO_ISVGA == VIDEO_TYPE_VLFB) {
+       if (screen_info.orig_video_isVGA == VIDEO_TYPE_VLFB) {
              no_vga:
 #ifdef CONFIG_DUMMY_CONSOLE
                conswitchp = &dummy_con;
@@ -370,24 +372,30 @@ static const char *vgacon_startup(void)
 #endif
        }
 
+       /* boot_params.screen_info initialized? */
+       if ((screen_info.orig_video_mode  == 0) &&
+           (screen_info.orig_video_lines == 0) &&
+           (screen_info.orig_video_cols  == 0))
+               goto no_vga;
+
        /* VGA16 modes are not handled by VGACON */
-       if ((ORIG_VIDEO_MODE == 0x00) ||        /* SCREEN_INFO not initialized */
-           (ORIG_VIDEO_MODE == 0x0D) ||        /* 320x200/4 */
-           (ORIG_VIDEO_MODE == 0x0E) ||        /* 640x200/4 */
-           (ORIG_VIDEO_MODE == 0x10) ||        /* 640x350/4 */
-           (ORIG_VIDEO_MODE == 0x12) ||        /* 640x480/4 */
-           (ORIG_VIDEO_MODE == 0x6A))  /* 800x600/4, 0x6A is very common */
+       if ((screen_info.orig_video_mode == 0x0D) ||    /* 320x200/4 */
+           (screen_info.orig_video_mode == 0x0E) ||    /* 640x200/4 */
+           (screen_info.orig_video_mode == 0x10) ||    /* 640x350/4 */
+           (screen_info.orig_video_mode == 0x12) ||    /* 640x480/4 */
+           (screen_info.orig_video_mode == 0x6A))      /* 800x600/4 (VESA) */
                goto no_vga;
 
-       vga_video_num_lines = ORIG_VIDEO_LINES;
-       vga_video_num_columns = ORIG_VIDEO_COLS;
+       vga_video_num_lines = screen_info.orig_video_lines;
+       vga_video_num_columns = screen_info.orig_video_cols;
        state.vgabase = NULL;
 
-       if (ORIG_VIDEO_MODE == 7) {     /* Is this a monochrome display? */
+       if (screen_info.orig_video_mode == 7) {
+               /* Monochrome display */
                vga_vram_base = 0xb0000;
                vga_video_port_reg = VGA_CRT_IM;
                vga_video_port_val = VGA_CRT_DM;
-               if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) {
+               if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) {
                        static struct resource ega_console_resource =
                            { .name = "ega", .start = 0x3B0, .end = 0x3BF };
                        vga_video_type = VIDEO_TYPE_EGAM;
@@ -415,12 +423,12 @@ static const char *vgacon_startup(void)
                vga_vram_base = 0xb8000;
                vga_video_port_reg = VGA_CRT_IC;
                vga_video_port_val = VGA_CRT_DC;
-               if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10) {
+               if ((screen_info.orig_video_ega_bx & 0xff) != 0x10) {
                        int i;
 
                        vga_vram_size = 0x8000;
 
-                       if (!ORIG_VIDEO_ISVGA) {
+                       if (!screen_info.orig_video_isVGA) {
                                static struct resource ega_console_resource
                                    = { .name = "ega", .start = 0x3C0, .end = 0x3DF };
                                vga_video_type = VIDEO_TYPE_EGAC;
@@ -514,14 +522,14 @@ static const char *vgacon_startup(void)
            || vga_video_type == VIDEO_TYPE_VGAC
            || vga_video_type == VIDEO_TYPE_EGAM) {
                vga_hardscroll_enabled = vga_hardscroll_user_enable;
-               vga_default_font_height = ORIG_VIDEO_POINTS;
-               vga_video_font_height = ORIG_VIDEO_POINTS;
+               vga_default_font_height = screen_info.orig_video_points;
+               vga_video_font_height = screen_info.orig_video_points;
                /* This may be suboptimal but is a safe bet - go with it */
                vga_scan_lines =
                    vga_video_font_height * vga_video_num_lines;
        }
 
-       vgacon_xres = ORIG_VIDEO_COLS * VGA_FONTWIDTH;
+       vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
        vgacon_yres = vga_scan_lines;
 
        if (!vga_init_done) {
@@ -662,6 +670,9 @@ static void vgacon_set_cursor_size(int xpos, int from, int to)
 
 static void vgacon_cursor(struct vc_data *c, int mode)
 {
+       if (c->vc_mode != KD_TEXT)
+               return;
+
        vgacon_restore_screen(c);
 
        switch (mode) {
@@ -788,7 +799,7 @@ static int vgacon_switch(struct vc_data *c)
 {
        int x = c->vc_cols * VGA_FONTWIDTH;
        int y = c->vc_rows * c->vc_font.height;
-       int rows = ORIG_VIDEO_LINES * vga_default_font_height/
+       int rows = screen_info.orig_video_lines * vga_default_font_height/
                c->vc_font.height;
        /*
         * We need to save screen size here as it's the only way
@@ -808,7 +819,7 @@ static int vgacon_switch(struct vc_data *c)
 
                if ((vgacon_xres != x || vgacon_yres != y) &&
                    (!(vga_video_num_columns % 2) &&
-                    vga_video_num_columns <= ORIG_VIDEO_COLS &&
+                    vga_video_num_columns <= screen_info.orig_video_cols &&
                     vga_video_num_lines <= rows))
                        vgacon_doresize(c, c->vc_cols, c->vc_rows);
        }
@@ -1268,13 +1279,14 @@ static int vgacon_font_get(struct vc_data *c, struct console_font *font)
 #endif
 
 static int vgacon_resize(struct vc_data *c, unsigned int width,
-                               unsigned int height)
+                        unsigned int height, unsigned int user)
 {
-       if (width % 2 || width > ORIG_VIDEO_COLS ||
-           height > (ORIG_VIDEO_LINES * vga_default_font_height)/
+       if (width % 2 || width > screen_info.orig_video_cols ||
+           height > (screen_info.orig_video_lines * vga_default_font_height)/
            c->vc_font.height)
-               /* let svgatextmode tinker with video timings */
-               return 0;
+               /* let svgatextmode tinker with video timings and
+                  return success */
+               return (user) ? 0 : -EINVAL;
 
        if (CON_IS_VISIBLE(c) && !vga_is_gfx) /* who knows */
                vgacon_doresize(c, width, height);
@@ -1302,8 +1314,8 @@ static void vgacon_save_screen(struct vc_data *c)
                 * console initialization routines.
                 */
                vga_bootup_console = 1;
-               c->vc_x = ORIG_X;
-               c->vc_y = ORIG_Y;
+               c->vc_x = screen_info.orig_x;
+               c->vc_y = screen_info.orig_y;
        }
 
        /* We can't copy in more then the size of the video buffer,
@@ -1320,7 +1332,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
        unsigned long oldo;
        unsigned int delta;
 
-       if (t || b != c->vc_rows || vga_is_gfx)
+       if (t || b != c->vc_rows || vga_is_gfx || c->vc_mode != KD_TEXT)
                return 0;
 
        if (!vga_hardscroll_enabled || lines >= c->vc_rows / 2)