[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[2049] 2009-03-29 Robert Millan <address@hidden>
From: |
Robert Millan |
Subject: |
[2049] 2009-03-29 Robert Millan <address@hidden> |
Date: |
Sun, 29 Mar 2009 19:52:35 +0000 |
Revision: 2049
http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2049
Author: robertmh
Date: 2009-03-29 19:52:35 +0000 (Sun, 29 Mar 2009)
Log Message:
-----------
2009-03-29 Robert Millan <address@hidden>
* loader/i386/linux.c (grub_cmd_linux): Parse "vga=" parameter and
set `vid_mode' accordingly.
(grub_linux_boot): Process `vid_mode' and set video mode.
Modified Paths:
--------------
trunk/grub2/ChangeLog
trunk/grub2/loader/i386/linux.c
Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog 2009-03-29 02:23:12 UTC (rev 2048)
+++ trunk/grub2/ChangeLog 2009-03-29 19:52:35 UTC (rev 2049)
@@ -1,5 +1,11 @@
2009-03-29 Robert Millan <address@hidden>
+ * loader/i386/linux.c (grub_cmd_linux): Parse "vga=" parameter and
+ set `vid_mode' accordingly.
+ (grub_linux_boot): Process `vid_mode' and set video mode.
+
+2009-03-29 Robert Millan <address@hidden>
+
* util/grub.d/10_linux.in (linux_entry): New function.
Factorize generation of Linux boot entries.
Modified: trunk/grub2/loader/i386/linux.c
===================================================================
--- trunk/grub2/loader/i386/linux.c 2009-03-29 02:23:12 UTC (rev 2048)
+++ trunk/grub2/loader/i386/linux.c 2009-03-29 19:52:35 UTC (rev 2049)
@@ -85,6 +85,68 @@
0
};
+static grub_uint16_t vid_mode;
+
+struct linux_vesafb_res
+{
+ grub_uint16_t width;
+ grub_uint16_t height;
+};
+
+enum vga_modes
+ {
+ VGA_640_480,
+ VGA_800_600,
+ VGA_1024_768,
+ VGA_1280_1024,
+ };
+
+struct linux_vesafb_mode
+{
+ grub_uint8_t res_index;
+ grub_uint8_t depth;
+};
+
+static struct linux_vesafb_res linux_vesafb_res[] =
+ {
+ { 640, 480 },
+ { 800, 600 },
+ { 1024, 768 },
+ { 1280, 1024 }
+ };
+
+/* This is the reverse of the table in [linux]/Documentation/fb/vesafb.txt. */
+struct linux_vesafb_mode linux_vesafb_modes[] =
+ {
+ { VGA_640_480, 8 }, /* 0x301 */
+ { 0, 0 },
+ { VGA_800_600, 8 }, /* 0x303 */
+ { 0, 0 },
+ { VGA_1024_768, 8 }, /* 0x305 */
+ { 0, 0 },
+ { VGA_1280_1024, 8 }, /* 0x307 */
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { 0, 0 },
+ { VGA_640_480, 15 }, /* 0x310 */
+ { VGA_640_480, 16 }, /* 0x311 */
+ { VGA_640_480, 24 }, /* 0x312 */
+ { VGA_800_600, 15 }, /* 0x313 */
+ { VGA_800_600, 16 }, /* 0x314 */
+ { VGA_800_600, 24 }, /* 0x315 */
+ { VGA_1024_768, 15 }, /* 0x316 */
+ { VGA_1024_768, 16 }, /* 0x317 */
+ { VGA_1024_768, 24 }, /* 0x318 */
+ { VGA_1280_1024, 15 }, /* 0x319 */
+ { VGA_1280_1024, 16 }, /* 0x31a */
+ { VGA_1280_1024, 24 }, /* 0x31b */
+ };
+
static inline grub_size_t
page_align (grub_size_t size)
{
@@ -270,8 +332,50 @@
params = real_mode_mem;
+ if (vid_mode == GRUB_LINUX_VID_MODE_NORMAL || vid_mode ==
GRUB_LINUX_VID_MODE_EXTENDED)
+ grub_video_restore ();
+ else if (vid_mode)
+ {
+ struct linux_vesafb_mode *linux_mode;
+ int depth, flags;
+
+ flags = 0;
+ linux_mode = &linux_vesafb_modes[vid_mode - 0x301];
+ depth = linux_mode->depth;
+
+ /* If we have 8 or less bits, then assume that it is indexed color mode.
*/
+ if ((depth <= 8) && (depth != -1))
+ flags |= GRUB_VIDEO_MODE_TYPE_INDEX_COLOR;
+
+ /* We have more than 8 bits, then assume that it is RGB color mode. */
+ if (depth > 8)
+ flags |= GRUB_VIDEO_MODE_TYPE_RGB;
+
+ /* If user requested specific depth, forward that information to driver.
*/
+ if (depth != -1)
+ flags |= (depth << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
+ & GRUB_VIDEO_MODE_TYPE_DEPTH_MASK;
+
+ /* Try to initialize requested mode. */
+ if (grub_video_setup (linux_vesafb_res[linux_mode->res_index].width,
+ linux_vesafb_res[linux_mode->res_index].height,
+ flags) != GRUB_ERR_NONE)
+ {
+ grub_printf ("Unable to initialize requested video mode
(vga=0x%x)\n", vid_mode);
+ return grub_errno;
+ }
+ }
+
if (! grub_linux_setup_video (params))
params->have_vga = GRUB_VIDEO_TYPE_VLFB;
+ else
+ {
+ params->have_vga = 0;
+ params->video_cursor_x = grub_getxy () >> 8;
+ params->video_cursor_y = grub_getxy () & 0xff;
+ params->video_width = 80;
+ params->video_height = 25;
+ }
grub_dprintf ("linux", "code32_start = %x, idt_desc = %lx, gdt_desc = %lx\n",
(unsigned) params->code32_start,
@@ -445,14 +549,9 @@
params->ext_mem = ((32 * 0x100000) >> 10);
params->alt_mem = ((32 * 0x100000) >> 10);
- params->video_cursor_x = grub_getxy () >> 8;
- params->video_cursor_y = grub_getxy () & 0xff;
params->video_page = 0; /* ??? */
params->video_mode = 0;
- params->video_width = (grub_getwh () >> 8);
params->video_ega_bx = 0;
- params->video_height = (grub_getwh () & 0xff);
- params->have_vga = 0;
params->font_size = 16; /* XXX */
/* The other parameters are filled when booting. */
@@ -465,9 +564,24 @@
/* Detect explicitly specified memory size, if any. */
linux_mem_size = 0;
for (i = 1; i < argc; i++)
- if (grub_memcmp (argv[i], "mem=", 4) == 0)
+ if (grub_memcmp (argv[i], "vga=", 4) == 0)
{
+ /* Video mode selection support. */
char *val = argv[i] + 4;
+
+ if (grub_strcmp (val, "normal") == 0)
+ vid_mode = GRUB_LINUX_VID_MODE_NORMAL;
+ else if (grub_strcmp (val, "ext") == 0)
+ vid_mode = GRUB_LINUX_VID_MODE_EXTENDED;
+ else
+ vid_mode = (grub_uint16_t) grub_strtoul (val, 0, 0);
+
+ if (grub_errno)
+ goto fail;
+ }
+ else if (grub_memcmp (argv[i], "mem=", 4) == 0)
+ {
+ char *val = argv[i] + 4;
linux_mem_size = grub_strtoul (val, &val, 0);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [2049] 2009-03-29 Robert Millan <address@hidden>,
Robert Millan <=