From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1LgIl8-0004c8-0o for mharc-grub-devel@gnu.org; Sun, 08 Mar 2009 09:09:38 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LgIl5-0004ZQ-QN for grub-devel@gnu.org; Sun, 08 Mar 2009 09:09:35 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LgIl3-0004WR-Kz for grub-devel@gnu.org; Sun, 08 Mar 2009 09:09:35 -0400 Received: from [199.232.76.173] (port=45797 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LgIl3-0004W0-Bd for grub-devel@gnu.org; Sun, 08 Mar 2009 09:09:33 -0400 Received: from aybabtu.com ([69.60.117.155]:59950) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LgIl2-0002kl-B8 for grub-devel@gnu.org; Sun, 08 Mar 2009 09:09:32 -0400 Received: from [192.168.10.10] (helo=thorin) by aybabtu.com with esmtp (Exim 4.69) (envelope-from ) id 1LgId4-0004LA-QN for grub-devel@gnu.org; Sun, 08 Mar 2009 14:01:19 +0100 Received: from rmh by thorin with local (Exim 4.69) (envelope-from ) id 1LgIkz-0003da-Nv for grub-devel@gnu.org; Sun, 08 Mar 2009 14:09:29 +0100 Date: Sun, 8 Mar 2009 14:09:29 +0100 From: Robert Millan To: grub-devel@gnu.org Message-ID: <20090308130929.GA13928@thorin> References: <20090306195735.GA9992@thorin> <20090308130106.GC28707@thorin> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="X1bOJ3K7DJ5YkBrT" Content-Disposition: inline In-Reply-To: <20090308130106.GC28707@thorin> Organization: free as in freedom X-Message-Flag: Worried about Outlook viruses? Switch to Thunderbird! www.mozilla.com/thunderbird X-Debbugs-No-Ack: true User-Agent: Mutt/1.5.18 (2008-05-17) X-detected-operating-system: by monty-python.gnu.org: Genre and OS details not recognized. Subject: Re: [PATCH] linux/gfxterm integration X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 08 Mar 2009 13:09:36 -0000 --X1bOJ3K7DJ5YkBrT Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Sorry, forgot to attach it. On Sun, Mar 08, 2009 at 02:01:06PM +0100, Robert Millan wrote: > On Fri, Mar 06, 2009 at 08:57:35PM +0100, Robert Millan wrote: > > > > This patch integrates the generic Linux loader with gfxterm. The result is > > that graphical mode becomes usable with this loader. Our loader gets the > > screen settings from the video subsystem (as per gfxterm setup), and passes > > them to Linux. > > > > This way GRUB/gfxterm can transition to Linux/fb with no further mode > > setting. Perhaps this can be exploited to make the transition seamless > > by using the same background image in both places, but I haven't explored > > this possibility yet :-) > > > > Note: As the comment in grub/video.h says, struct grub_video_render_target > > didn't really want to be moved. My code only needs to access it to find > > the framebuffer address. Perhaps it'd be better to move this information > > elsewhere? Or split it in a separate structure / getter? > > New patch. This one calls grub_linux_setup_video() from grub_linux32_boot > instead of grub_rescue_cmd_linux. This way it gets the video status we have > when "boot" is issued instead of the one we have when linux is loaded. > > Any comments on my question about struct grub_video_render_target ? > > -- > Robert Millan > > The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and > how) you may access your data; but nobody's threatening your freedom: we > still allow you to remove your data and not access it at all." -- Robert Millan The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and how) you may access your data; but nobody's threatening your freedom: we still allow you to remove your data and not access it at all." --X1bOJ3K7DJ5YkBrT Content-Type: text/x-diff; charset=us-ascii Content-Disposition: attachment; filename="linux_gfxterm.diff" 2009-03-06 Robert Millan * include/grub/i386/pc/vbe.h (struct grub_video_render_target): Move from here ... * include/grub/video.h (struct grub_video_render_target): ... to here. * loader/i386/linux.c: Inclue `'. (grub_linux_setup_video): New function. Loosely based on the EFI one. (grub_linux32_boot): Attempt to configure video settings with grub_linux_setup_video(). (grub_rescue_cmd_linux): Set noreturn=0 in grub_loader_set, in order to avoid grub_console_fini() which would step out of graphical mode unconditionally. Index: include/grub/i386/pc/vbe.h =================================================================== --- include/grub/i386/pc/vbe.h (revision 2021) +++ include/grub/i386/pc/vbe.h (working copy) @@ -227,29 +227,6 @@ grub_err_t grub_vbe_get_video_mode_info /* VBE module internal prototypes (should not be used from elsewhere). */ struct grub_video_i386_vbeblit_info; -struct grub_video_render_target -{ - /* Copy of the screen's mode info structure, except that width, height and - mode_type has been re-adjusted to requested render target settings. */ - struct grub_video_mode_info mode_info; - - struct - { - unsigned int x; - unsigned int y; - unsigned int width; - unsigned int height; - } viewport; - - /* Indicates whether the data has been allocated by us and must be freed - when render target is destroyed. */ - int is_allocated; - - /* Pointer to data. Can either be in video card memory or in local host's - memory. */ - void *data; -}; - grub_uint8_t * grub_video_vbe_get_video_ptr (struct grub_video_i386_vbeblit_info *source, grub_uint32_t x, grub_uint32_t y); Index: include/grub/video.h =================================================================== --- include/grub/video.h (revision 2021) +++ include/grub/video.h (working copy) @@ -26,10 +26,6 @@ specific coding format. */ typedef grub_uint32_t grub_video_color_t; -/* This structure is driver specific and should not be accessed directly by - outside code. */ -struct grub_video_render_target; - /* Forward declarations for used data structures. */ struct grub_video_bitmap; @@ -152,6 +148,29 @@ struct grub_video_mode_info grub_uint8_t fg_alpha; }; +struct grub_video_render_target +{ + /* Copy of the screen's mode info structure, except that width, height and + mode_type has been re-adjusted to requested render target settings. */ + struct grub_video_mode_info mode_info; + + struct + { + unsigned int x; + unsigned int y; + unsigned int width; + unsigned int height; + } viewport; + + /* Indicates whether the data has been allocated by us and must be freed + when render target is destroyed. */ + int is_allocated; + + /* Pointer to data. Can either be in video card memory or in local host's + memory. */ + void *data; +}; + struct grub_video_palette_data { grub_uint8_t r; /* Red color value (0-255). */ Index: loader/i386/linux.c =================================================================== --- loader/i386/linux.c (revision 2022) +++ loader/i386/linux.c (working copy) @@ -1,6 +1,6 @@ /* * GRUB -- GRand Unified Bootloader - * Copyright (C) 2006,2007,2008 Free Software Foundation, Inc. + * Copyright (C) 2006,2007,2008,2009 Free Software Foundation, Inc. * * GRUB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ #include #include #include +#include #define GRUB_LINUX_CL_OFFSET 0x1000 #define GRUB_LINUX_CL_END_OFFSET 0x2000 @@ -215,6 +216,41 @@ grub_e820_add_region (struct grub_e820_m } } +static int +grub_linux_setup_video (struct linux_kernel_params *params) +{ + struct grub_video_mode_info mode_info; + struct grub_video_render_target *render_target; + int ret; + + ret = grub_video_get_info (&mode_info); + if (ret) + return 1; + + ret = grub_video_get_active_render_target (&render_target); + if (ret) + return 1; + + params->lfb_width = mode_info.width; + params->lfb_height = mode_info.height; + params->lfb_depth = mode_info.bpp; + params->lfb_line_len = mode_info.pitch; + + params->lfb_base = (void *) render_target->data; + params->lfb_size = (params->lfb_line_len * params->lfb_height + 65535) >> 16; + + params->red_mask_size = 8; + params->red_field_pos = 16; + params->green_mask_size = 8; + params->green_field_pos = 8; + params->blue_mask_size = 8; + params->blue_field_pos = 0; + params->reserved_mask_size = 8; + params->reserved_field_pos = 24; + + return 0; +} + #ifdef __x86_64__ struct { @@ -231,6 +267,9 @@ grub_linux32_boot (void) params = real_mode_mem; + if (! grub_linux_setup_video (params)) + params->have_vga = GRUB_VIDEO_TYPE_VLFB; + grub_dprintf ("linux", "code32_start = %x, idt_desc = %lx, gdt_desc = %lx\n", (unsigned) params->code32_start, (unsigned long) &(idt_desc.limit), @@ -314,7 +353,6 @@ grub_rescue_cmd_linux (int argc, char *a grub_ssize_t len; int i; char *dest; - int video_type; grub_dl_ref (my_mod); @@ -422,7 +460,6 @@ grub_rescue_cmd_linux (int argc, char *a /* Detect explicitly specified memory size, if any. */ linux_mem_size = 0; - video_type = 0; for (i = 1; i < argc; i++) if (grub_memcmp (argv[i], "mem=", 4) == 0) { @@ -481,7 +518,8 @@ grub_rescue_cmd_linux (int argc, char *a if (grub_errno == GRUB_ERR_NONE) { - grub_loader_set (grub_linux32_boot, grub_linux_unload, 1); + grub_loader_set (grub_linux32_boot, grub_linux_unload, + 0 /* set noreturn=0 in order to avoid grub_console_fini() */); loaded = 1; } --X1bOJ3K7DJ5YkBrT--