* kexec and framebuffer
@ 2006-07-17 14:11 Kalev Lember
2006-07-17 14:29 ` Gerd Hoffmann
0 siblings, 1 reply; 5+ messages in thread
From: Kalev Lember @ 2006-07-17 14:11 UTC (permalink / raw)
To: linux-kernel
Hello,
Kexec skips video initialization code and because of that framebuffer
does not work with relocated kernels.
Like Eric W. Biederman pointed out in
http://www.ussg.iu.edu/hypermail/linux/kernel/0508.0/1674.html ,
screen_info structure from include/linux/tty.h must be passed along to
maintain current video mode.
I made some testing and it's enough to dump screen_info structure from
running kernel and overwrite this info in kexec' x86-linux-setup.c.
I am wondering what would be the preferred method to extract screen_info
from running kernel. Should this be made available from sysfs or maybe a
new system call be created?
--
Kalev Lember
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: kexec and framebuffer
2006-07-17 14:11 kexec and framebuffer Kalev Lember
@ 2006-07-17 14:29 ` Gerd Hoffmann
2006-07-20 20:42 ` Kalev Lember
0 siblings, 1 reply; 5+ messages in thread
From: Gerd Hoffmann @ 2006-07-17 14:29 UTC (permalink / raw)
To: Kalev Lember; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 338 bytes --]
Hi,
> I am wondering what would be the preferred method to extract screen_info
> from running kernel. Should this be made available from sysfs or maybe a
> new system call be created?
Simply ask /dev/fb0?
Patch for kexec tools attached.
cheers,
Gerd
--
Gerd Hoffmann <kraxel@suse.de>
http://www.suse.de/~kraxel/julika-dora.jpeg
[-- Attachment #2: kexec-vesafb.diff --]
[-- Type: text/x-patch, Size: 2480 bytes --]
Index: kexec-tools-1.101/kexec/arch/i386/x86-linux-setup.c
===================================================================
--- kexec-tools-1.101.orig/kexec/arch/i386/x86-linux-setup.c 2006-03-03 10:51:31.000000000 +0100
+++ kexec-tools-1.101/kexec/arch/i386/x86-linux-setup.c 2006-03-10 14:02:20.000000000 +0100
@@ -24,6 +24,8 @@
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/fb.h>
#include <unistd.h>
#include <x86/x86-linux.h>
#include "../../kexec.h"
@@ -94,6 +96,56 @@ void setup_linux_bootloader_parameters(
cmdline_ptr[cmdline_len - 1] = '\0';
}
+int setup_linux_vesafb(struct x86_linux_param_header *real_mode)
+{
+ struct fb_fix_screeninfo fix;
+ struct fb_var_screeninfo var;
+ int fd;
+
+ fd = open("/dev/fb0", O_RDONLY);
+ if (-1 == fd)
+ return -1;
+
+ if (-1 == ioctl(fd, FBIOGET_FSCREENINFO, &fix))
+ goto out;
+ if (-1 == ioctl(fd, FBIOGET_VSCREENINFO, &var))
+ goto out;
+ if (0 != strcmp(fix.id, "vesafb"))
+ goto out;
+ close(fd);
+
+ real_mode->orig_video_isVGA = 0x23 /* VIDEO_TYPE_VLFB */;
+ real_mode->lfb_width = var.xres;
+ real_mode->lfb_height = var.yres;
+ real_mode->lfb_depth = var.bits_per_pixel;
+ real_mode->lfb_base = fix.smem_start;
+ real_mode->lfb_linelength = fix.line_length;
+ real_mode->vesapm_seg = 0;
+
+ /* fixme: better get size from /proc/iomem */
+ real_mode->lfb_size = (fix.smem_len + 65535) / 65536;
+ real_mode->pages = (fix.smem_len + 4095) / 4096;
+
+ if (var.bits_per_pixel > 8) {
+ real_mode->red_pos = var.red.offset;
+ real_mode->red_size = var.red.length;
+ real_mode->green_pos = var.green.offset;
+ real_mode->green_size = var.green.length;
+ real_mode->blue_pos = var.blue.offset;
+ real_mode->blue_size = var.blue.length;
+ real_mode->rsvd_pos = var.transp.offset;
+ real_mode->rsvd_size = var.transp.length;
+ }
+ fprintf(stderr, "%s: %dx%dx%d @ %lx +%lx\n", __FUNCTION__,
+ var.xres, var.yres, var.bits_per_pixel,
+ fix.smem_start, fix.smem_len);
+ return 0;
+
+ out:
+ close(fd);
+ return -1;
+}
+
void setup_linux_system_parameters(struct x86_linux_param_header *real_mode,
unsigned long kexec_flags)
{
@@ -111,6 +163,7 @@ void setup_linux_system_parameters(struc
real_mode->orig_video_ega_bx = 0;
real_mode->orig_video_isVGA = 1;
real_mode->orig_video_points = 16;
+ setup_linux_vesafb(real_mode);
/* Fill in the memsize later */
real_mode->ext_mem_k = 0;
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: kexec and framebuffer
2006-07-17 14:29 ` Gerd Hoffmann
@ 2006-07-20 20:42 ` Kalev Lember
2006-07-20 23:28 ` Antonino A. Daplas
0 siblings, 1 reply; 5+ messages in thread
From: Kalev Lember @ 2006-07-20 20:42 UTC (permalink / raw)
To: Gerd Hoffmann; +Cc: linux-kernel
Gerd Hoffmann wrote:
>> I am wondering what would be the preferred method to extract screen_info
>> from running kernel. Should this be made available from sysfs or maybe a
>> new system call be created?
>>
>
> Simply ask /dev/fb0?
> Patch for kexec tools attached.
>
Thank you, this was really helpful.
> + if (0 != strcmp(fix.id, "vesafb"))
> + goto out;
I think this check should be removed so that other framebuffer drivers
besides vesafb would also work. Additionally the fix.id is "VESA VGA",
not "vesafb".
Could you please submit this for inclusion in kexec-tools or do you want
me to do it?
--
Kalev Lember
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: kexec and framebuffer
2006-07-20 20:42 ` Kalev Lember
@ 2006-07-20 23:28 ` Antonino A. Daplas
2006-07-21 6:54 ` Gerd Hoffmann
0 siblings, 1 reply; 5+ messages in thread
From: Antonino A. Daplas @ 2006-07-20 23:28 UTC (permalink / raw)
To: Kalev Lember; +Cc: Gerd Hoffmann, linux-kernel
Kalev Lember wrote:
> Gerd Hoffmann wrote:
>>> I am wondering what would be the preferred method to extract screen_info
>>> from running kernel. Should this be made available from sysfs or maybe a
>>> new system call be created?
>>>
>> Simply ask /dev/fb0?
>> Patch for kexec tools attached.
>>
> Thank you, this was really helpful.
>> + if (0 != strcmp(fix.id, "vesafb"))
>> + goto out;
> I think this check should be removed so that other framebuffer drivers
> besides vesafb would also work.
I think having the check is correct, only vesafb relies totally on
screen_info. If you remove the check, you can get the wrong information
from other framebuffer drivers.
> + /* fixme: better get size from /proc/iomem */
> + real_mode->lfb_size = (fix.smem_len + 65535) / 65536;
> + real_mode->pages = (fix.smem_len + 4095) / 4096;
Note that fix.smem_len is the size of the remapped memory which can be
smaller than the actual framebuffer length. But there's a fixme comment
there so you probably know about this.
> Additionally the fix.id is "VESA VGA",
> not "vesafb".
Yes.
Tony
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: kexec and framebuffer
2006-07-20 23:28 ` Antonino A. Daplas
@ 2006-07-21 6:54 ` Gerd Hoffmann
0 siblings, 0 replies; 5+ messages in thread
From: Gerd Hoffmann @ 2006-07-21 6:54 UTC (permalink / raw)
To: Antonino A. Daplas; +Cc: Kalev Lember, linux-kernel
Antonino A. Daplas wrote:
> Kalev Lember wrote:
>> Thank you, this was really helpful.
>>> + if (0 != strcmp(fix.id, "vesafb"))
>>> + goto out;
>> I think this check should be removed so that other framebuffer drivers
>> besides vesafb would also work.
>
> I think having the check is correct, only vesafb relies totally on
> screen_info. If you remove the check, you can get the wrong information
> from other framebuffer drivers.
Exactly.
>> + /* fixme: better get size from /proc/iomem */
>> + real_mode->lfb_size = (fix.smem_len + 65535) / 65536;
>> + real_mode->pages = (fix.smem_len + 4095) / 4096;
>
> Note that fix.smem_len is the size of the remapped memory which can be
> smaller than the actual framebuffer length. But there's a fixme comment
> there so you probably know about this.
Yep, that is the reason for the fixme. kexec-tools already parse
/proc/iomem, but keep the info private in some other source file, so I
decided to solve it this way for the first cut. Shouln't be that hard
to fix it up though.
I've mailed it some time ago to the maintainer, no feedback. Feel free
to polish the patch a bit and try submitting it again ...
cheers,
Gerd
--
Gerd Hoffmann <kraxel@suse.de>
http://www.suse.de/~kraxel/julika-dora.jpeg
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2006-07-21 6:54 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-17 14:11 kexec and framebuffer Kalev Lember
2006-07-17 14:29 ` Gerd Hoffmann
2006-07-20 20:42 ` Kalev Lember
2006-07-20 23:28 ` Antonino A. Daplas
2006-07-21 6:54 ` Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox