Pass more appropriate video id to Linux.
* grub-core/loader/i386/linux.c (grub_linux_setup_video): Use grub_video_get_driver_id and variable gfxpayloadforcelfb to fill have_vga. (grub_linux_boot): Rely on grub_linux_setup_video to fill have_vga and shift params->lfb_size. * include/grub/i386/linux.h: Make an enume out of have_vga values.
This commit is contained in:
parent
c2fa6cbb42
commit
3395fe5230
4 changed files with 57 additions and 17 deletions
2
BUGS
Normal file
2
BUGS
Normal file
|
@ -0,0 +1,2 @@
|
|||
Currently search and assembling multidevice abstractions scans all the devices which can be slow.
|
||||
Cache isn't used correctly for video which results in slowness.
|
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2011-01-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Pass more appropriate video id to Linux.
|
||||
|
||||
* grub-core/loader/i386/linux.c (grub_linux_setup_video): Use
|
||||
grub_video_get_driver_id and variable gfxpayloadforcelfb to
|
||||
fill have_vga.
|
||||
(grub_linux_boot): Rely on grub_linux_setup_video to fill have_vga and
|
||||
shift params->lfb_size.
|
||||
* include/grub/i386/linux.h: Make an enume out of have_vga values.
|
||||
|
||||
2011-01-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
* util/grub-menulst2cfg.c: Add missing include of misc.h.
|
||||
|
|
|
@ -313,6 +313,13 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
|||
struct grub_video_mode_info mode_info;
|
||||
void *framebuffer;
|
||||
grub_err_t err;
|
||||
grub_video_driver_id_t driver_id;
|
||||
char *gfxlfbvar = grub_env_get ("gfxpayloadforcelfb");
|
||||
|
||||
driver_id = grub_video_get_driver_id ();
|
||||
|
||||
if (driver_id == GRUB_VIDEO_DRIVER_NONE)
|
||||
return 1;
|
||||
|
||||
err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
|
||||
|
||||
|
@ -339,12 +346,40 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
|||
params->reserved_mask_size = mode_info.reserved_mask_size;
|
||||
params->reserved_field_pos = mode_info.reserved_field_pos;
|
||||
|
||||
if (gfxlfbvar && (gfxlfbvar[0] == '1' || gfxlfbvar[0] == 'y'))
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
else
|
||||
{
|
||||
switch (driver_id)
|
||||
{
|
||||
case GRUB_VIDEO_DRIVER_VBE:
|
||||
params->lfb_size >>= 16;
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
||||
break;
|
||||
|
||||
case GRUB_VIDEO_DRIVER_EFI_UGA:
|
||||
case GRUB_VIDEO_DRIVER_EFI_GOP:
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_EFIFB;
|
||||
break;
|
||||
|
||||
/* FIXME: check if better id is available. */
|
||||
case GRUB_VIDEO_DRIVER_SM712:
|
||||
case GRUB_VIDEO_DRIVER_VGA:
|
||||
case GRUB_VIDEO_DRIVER_CIRRUS:
|
||||
case GRUB_VIDEO_DRIVER_BOCHS:
|
||||
/* Make gcc happy. */
|
||||
case GRUB_VIDEO_DRIVER_SDL:
|
||||
case GRUB_VIDEO_DRIVER_NONE:
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GRUB_MACHINE_PCBIOS
|
||||
/* VESA packed modes may come with zeroed mask sizes, which need
|
||||
to be set here according to DAC Palette width. If we don't,
|
||||
this results in Linux displaying a black screen. */
|
||||
if (mode_info.bpp <= 8)
|
||||
if (driver_id == GRUB_VIDEO_DRIVER_VBE && mode_info.bpp <= 8)
|
||||
{
|
||||
struct grub_vbe_info_block controller_info;
|
||||
int status;
|
||||
|
@ -457,15 +492,7 @@ grub_linux_boot (void)
|
|||
grub_errno = GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
if (! grub_linux_setup_video (params))
|
||||
{
|
||||
/* Use generic framebuffer unless VESA is known to be supported. */
|
||||
if (params->have_vga != GRUB_VIDEO_LINUX_TYPE_VESA)
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
|
||||
else
|
||||
params->lfb_size >>= 16;
|
||||
}
|
||||
else
|
||||
if (grub_linux_setup_video (params))
|
||||
{
|
||||
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
|
||||
|
@ -771,10 +798,6 @@ grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
|
|||
break;
|
||||
}
|
||||
|
||||
/* We can't detect VESA, but user is implicitly telling us that it
|
||||
is built-in because `vga=' parameter was used. */
|
||||
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
|
||||
|
||||
linux_mode = &grub_vesa_mode_table[vid_mode
|
||||
- GRUB_VESA_MODE_TABLE_START];
|
||||
|
||||
|
|
|
@ -79,9 +79,13 @@ struct grub_e820_mmap
|
|||
grub_uint32_t type;
|
||||
} __attribute__((packed));
|
||||
|
||||
#define GRUB_VIDEO_LINUX_TYPE_TEXT 0x01
|
||||
#define GRUB_VIDEO_LINUX_TYPE_VESA 0x23 /* VESA VGA in graphic mode. */
|
||||
#define GRUB_VIDEO_LINUX_TYPE_SIMPLE 0x70 /* Linear framebuffer without any additional functions. */
|
||||
enum
|
||||
{
|
||||
GRUB_VIDEO_LINUX_TYPE_TEXT = 0x01,
|
||||
GRUB_VIDEO_LINUX_TYPE_VESA = 0x23, /* VESA VGA in graphic mode. */
|
||||
GRUB_VIDEO_LINUX_TYPE_EFIFB = 0x70, /* EFI Framebuffer. */
|
||||
GRUB_VIDEO_LINUX_TYPE_SIMPLE = 0x70 /* Linear framebuffer without any additional functions. */
|
||||
};
|
||||
|
||||
/* For the Linux/i386 boot protocol version 2.03. */
|
||||
struct linux_kernel_header
|
||||
|
|
Loading…
Reference in a new issue