[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
efigfx branch ready for merging?
From: |
Colin Watson |
Subject: |
efigfx branch ready for merging? |
Date: |
Thu, 17 Jun 2010 16:40:44 +0100 |
User-agent: |
Mutt/1.5.18 (2008-05-17) |
After discussion with Vladimir on IRC, I've brought his efigfx branch
(sftp://bzr.sv.gnu.org/srv/bzr/grub/branches/efigfx/) up to date with
trunk and added some more features to it. It now seems pretty good and
I think it's ready to be merged. Could others review it and let us know
what you think?
Here's a ChangeLog fragment for the parts I was responsible for.
Vladimir said that he would write a ChangeLog for the parts he wrote
(i.e. most of the branch ...). Following that is a diff of the branch
against trunk.
2010-06-17 Colin Watson <address@hidden>
* util/grub-mkconfig.in: Capitalise and export GRUB_PREFIX. Stop
setting GRUB_VIDEO_BACKEND. Make it available as a user override
instead. Replace the gfxterm backend check with a check that
${GRUB_PREFIX}/video.lst is non-empty.
* util/grub.d/00_header.in: Use GRUB_PREFIX rather than computing it
again.
(load_video): New generated function. Call it before loading
gfxterm rather than loading ${GRUB_VIDEO_BACKEND}.
* util/grub.d/10_linux.in (linux_entry): Call load_video.
* util/grub.d/30_os-prober.in (osx_entry): Likewise.
* docs/grub.texi (Simple configuration): Document
GRUB_VIDEO_BACKEND.
=== modified file 'conf/i386-pc.rmk'
--- conf/i386-pc.rmk 2010-06-11 20:31:16 +0000
+++ conf/i386-pc.rmk 2010-06-12 10:30:21 +0000
@@ -147,7 +147,7 @@ linux_mod_CFLAGS = $(COMMON_CFLAGS)
linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
pkglib_MODULES += xnu.mod
-xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/pc/xnu.c \
+xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c \
loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
xnu_mod_CFLAGS = $(COMMON_CFLAGS)
xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
=== modified file 'conf/x86-efi.rmk'
--- conf/x86-efi.rmk 2010-06-11 20:31:16 +0000
+++ conf/x86-efi.rmk 2010-06-12 10:37:26 +0000
@@ -102,7 +102,7 @@ efi_gop_mod_CFLAGS = $(COMMON_CFLAGS)
efi_gop_mod_LDFLAGS = $(COMMON_LDFLAGS)
pkglib_MODULES += xnu.mod
-xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c \
+xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c \
loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
xnu_mod_CFLAGS = $(COMMON_CFLAGS)
xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
=== modified file 'docs/grub.texi'
--- docs/grub.texi 2010-06-13 12:17:23 +0000
+++ docs/grub.texi 2010-06-17 15:12:28 +0000
@@ -934,6 +934,16 @@ Disable the generation of recovery mode
@item GRUB_DISABLE_NETBSD_RECOVERY
Disable the generation of recovery mode menu entries for NetBSD.
address@hidden GRUB_VIDEO_BACKEND
+If graphical video support is required, either because the @samp{gfxterm}
+graphical terminal is in use or because @samp{GRUB_GFXPAYLOAD_LINUX} is set,
+then @command{grub-mkconfig} will normally load all available GRUB video
+drivers and use the one most appropriate for your hardware. If you need to
+override this for some reason, then you can set this option.
+
+After @command{grub-install} has been run, the available video drivers are
+listed in @file{/boot/grub/video.lst}.
+
@item GRUB_GFXMODE
Set the resolution used on the @samp{gfxterm} graphical terminal. Note that
you can only use modes which your graphics card supports via VESA BIOS
=== modified file 'include/grub/i386/xnu.h'
--- include/grub/i386/xnu.h 2009-12-18 02:57:32 +0000
+++ include/grub/i386/xnu.h 2010-06-11 21:06:30 +0000
@@ -114,8 +114,6 @@ extern grub_uint32_t grub_xnu_stack;
extern grub_uint32_t grub_xnu_arg1;
extern char grub_xnu_cmdline[1024];
grub_err_t grub_xnu_boot (void);
-grub_err_t grub_xnu_set_video (struct grub_xnu_boot_params *bootparams_relloc);
-grub_err_t
-grub_cpu_xnu_fill_devicetree (void);
+grub_err_t grub_cpu_xnu_fill_devicetree (void);
extern grub_uint32_t grub_xnu_heap_will_be_at;
#endif
=== modified file 'include/grub/video.h'
--- include/grub/video.h 2010-06-12 13:33:09 +0000
+++ include/grub/video.h 2010-06-12 17:49:14 +0000
@@ -183,9 +183,19 @@ typedef enum grub_video_driver_id
GRUB_VIDEO_DRIVER_EFI_UGA,
GRUB_VIDEO_DRIVER_EFI_GOP,
GRUB_VIDEO_DRIVER_SM712,
- GRUB_VIDEO_DRIVER_VGA
+ GRUB_VIDEO_DRIVER_VGA,
+ GRUB_VIDEO_DRIVER_SDL
} grub_video_driver_id_t;
+typedef enum grub_video_adapter_prio
+ {
+ GRUB_VIDEO_ADAPTER_PRIO_FALLBACK = 60,
+ GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE_DIRTY = 70,
+ GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE = 80,
+ GRUB_VIDEO_ADAPTER_PRIO_NATIVE = 100
+ } grub_video_adapter_prio_t;
+
+
struct grub_video_adapter
{
/* The next video adapter. */
@@ -195,6 +205,8 @@ struct grub_video_adapter
const char *name;
grub_video_driver_id_t id;
+ grub_video_adapter_prio_t prio;
+
/* Initialize the video adapter. */
grub_err_t (*init) (void);
@@ -269,8 +281,11 @@ extern grub_video_adapter_t EXPORT_VAR(g
static inline void
grub_video_register (grub_video_adapter_t adapter)
{
- grub_list_push (GRUB_AS_LIST_P (&grub_video_adapter_list),
- GRUB_AS_LIST (adapter));
+ grub_video_adapter_t *p;
+ for (p = &grub_video_adapter_list; *p && (*p)->prio > adapter->prio;
+ p = &((*p)->next));
+ adapter->next = *p;
+ *p = adapter;
}
#endif
=== modified file 'loader/i386/efi/linux.c'
--- loader/i386/efi/linux.c 2010-02-10 19:27:12 +0000
+++ loader/i386/efi/linux.c 2010-06-17 15:18:08 +0000
@@ -29,10 +29,11 @@
#include <grub/cpu/linux.h>
#include <grub/efi/api.h>
#include <grub/efi/efi.h>
-#include <grub/efi/uga_draw.h>
-#include <grub/pci.h>
#include <grub/command.h>
#include <grub/memory.h>
+#include <grub/env.h>
+#include <grub/video.h>
+#include <grub/time.h>
#include <grub/i18n.h>
#define GRUB_LINUX_CL_OFFSET 0x1000
@@ -286,6 +287,67 @@ grub_e820_add_region (struct grub_e820_m
}
}
+static grub_err_t
+grub_linux_setup_video (struct linux_kernel_params *params)
+{
+ struct grub_video_mode_info mode_info;
+ void *framebuffer;
+ grub_err_t err;
+
+ err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
+
+ if (err)
+ return err;
+
+ 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 = (grub_size_t) framebuffer;
+ params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height,
+ 65536);
+
+ params->red_mask_size = mode_info.red_mask_size;
+ params->red_field_pos = mode_info.red_field_pos;
+ params->green_mask_size = mode_info.green_mask_size;
+ params->green_field_pos = mode_info.green_field_pos;
+ params->blue_mask_size = mode_info.blue_mask_size;
+ params->blue_field_pos = mode_info.blue_field_pos;
+ params->reserved_mask_size = mode_info.reserved_mask_size;
+ params->reserved_field_pos = mode_info.reserved_field_pos;
+
+ params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
+
+#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)
+ {
+ struct grub_vbe_info_block controller_info;
+ int status;
+ int width = 8;
+
+ status = grub_vbe_bios_get_controller_info (&controller_info);
+
+ if (status == GRUB_VBE_STATUS_OK &&
+ (controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH))
+ status = grub_vbe_bios_set_dac_palette_width (&width);
+
+ if (status != GRUB_VBE_STATUS_OK)
+ /* 6 is default after mode reset. */
+ width = 6;
+
+ params->red_mask_size = params->green_mask_size
+ = params->blue_mask_size = width;
+ params->reserved_mask_size = 0;
+ }
+#endif
+
+ return 0;
+}
+
#ifdef __x86_64__
extern grub_uint8_t grub_linux_trampoline_start[];
extern grub_uint8_t grub_linux_trampoline_end[];
@@ -300,6 +362,9 @@ grub_linux_boot (void)
grub_efi_uintn_t desc_size;
grub_efi_uint32_t desc_version;
int e820_num;
+ const char *modevar;
+ char *tmp;
+ grub_err_t err;
params = real_mode_mem;
@@ -353,6 +418,35 @@ grub_linux_boot (void)
grub_mmap_iterate (hook);
params->mmap_size = e820_num;
+ grub_printf ("Trampoline at %p. code32=%x, real_mode_mem=%p\n",
+ ((char *) prot_mode_mem + (prot_mode_pages << 12)),
+ (unsigned) params->code32_start, real_mode_mem);
+
+ modevar = grub_env_get ("gfxpayload");
+
+ /* Now all graphical modes are acceptable.
+ May change in future if we have modes without framebuffer. */
+ if (modevar && *modevar != 0)
+ {
+ tmp = grub_xasprintf ("%s;auto", modevar);
+ if (! tmp)
+ return grub_errno;
+ err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
+ grub_free (tmp);
+ }
+ else
+ err = grub_video_set_mode ("auto", GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
+
+ if (!err)
+ err = grub_linux_setup_video (params);
+
+ if (err)
+ {
+ grub_print_error ();
+ grub_printf ("Booting however\n");
+ grub_errno = GRUB_ERR_NONE;
+ }
+
mmap_size = find_mmap_size ();
if (grub_efi_get_memory_map (&mmap_size, mmap_buf, &map_key,
&desc_size, &desc_version) <= 0)
@@ -425,174 +519,6 @@ grub_linux_unload (void)
return GRUB_ERR_NONE;
}
-static grub_efi_guid_t uga_draw_guid = GRUB_EFI_UGA_DRAW_GUID;
-
-
-#define RGB_MASK 0xffffff
-#define RGB_MAGIC 0x121314
-#define LINE_MIN 800
-#define LINE_MAX 4096
-#define FBTEST_STEP (0x10000 >> 2)
-#define FBTEST_COUNT 8
-
-static int
-find_line_len (grub_uint32_t *fb_base, grub_uint32_t *line_len)
-{
- grub_uint32_t *base = (grub_uint32_t *) (grub_target_addr_t) *fb_base;
- int i;
-
- for (i = 0; i < FBTEST_COUNT; i++, base += FBTEST_STEP)
- {
- if ((*base & RGB_MASK) == RGB_MAGIC)
- {
- int j;
-
- for (j = LINE_MIN; j <= LINE_MAX; j++)
- {
- if ((base[j] & RGB_MASK) == RGB_MAGIC)
- {
- *fb_base = (grub_uint32_t) (grub_target_addr_t) base;
- *line_len = j << 2;
-
- return 1;
- }
- }
-
- break;
- }
- }
-
- return 0;
-}
-
-static int
-find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
-{
- int found = 0;
-
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid);
-
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- if (grub_pci_read (addr) >> 24 == 0x3)
- {
- int i;
-
- grub_printf ("Display controller: %d:%d.%d\nDevice id: %x\n",
- grub_pci_get_bus (dev), grub_pci_get_device (dev),
- grub_pci_get_function (dev), pciid);
- addr += 8;
- for (i = 0; i < 6; i++, addr += 4)
- {
- grub_uint32_t old_bar1, old_bar2, type;
- grub_uint64_t base64;
-
- old_bar1 = grub_pci_read (addr);
- if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
- continue;
-
- type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- if (i == 5)
- break;
-
- old_bar2 = grub_pci_read (addr + 4);
- }
- else
- old_bar2 = 0;
-
- base64 = old_bar2;
- base64 <<= 32;
- base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
-
- grub_printf ("%s(%d): 0x%llx\n",
- ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
- "VMEM" : "MMIO"), i,
- (unsigned long long) base64);
-
- if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! found))
- {
- *fb_base = base64;
- if (find_line_len (fb_base, line_len))
- found++;
- }
-
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- i++;
- addr += 4;
- }
- }
- }
-
- return found;
- }
-
- grub_pci_iterate (find_card);
- return found;
-}
-
-static int
-grub_linux_setup_video (struct linux_kernel_params *params)
-{
- grub_efi_uga_draw_protocol_t *c;
- grub_uint32_t width, height, depth, rate, pixel, fb_base, line_len;
- int ret;
-
- c = grub_efi_locate_protocol (&uga_draw_guid, 0);
- if (! c)
- return 1;
-
- if (efi_call_5 (c->get_mode, c, &width, &height, &depth, &rate))
- return 1;
-
- grub_printf ("Video mode: address@hidden", width, height, depth, rate);
-
- grub_efi_set_text_mode (0);
- pixel = RGB_MAGIC;
- efi_call_10 (c->blt, c, (struct grub_efi_uga_pixel *) &pixel,
- GRUB_EFI_UGA_VIDEO_FILL, 0, 0, 0, 0, 1, height, 0);
- ret = find_framebuf (&fb_base, &line_len);
- grub_efi_set_text_mode (1);
-
- if (! ret)
- {
- grub_printf ("Can\'t find frame buffer address\n");
- return 1;
- }
-
- grub_printf ("Frame buffer base: 0x%x\n", fb_base);
- grub_printf ("Video line length: %d\n", line_len);
-
- params->lfb_width = width;
- params->lfb_height = height;
- params->lfb_depth = depth;
- params->lfb_line_len = line_len;
-
- params->lfb_base = fb_base;
- params->lfb_size = ALIGN_UP (line_len * params->lfb_height, 65536);
-
- 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;
-
- params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
- params->vid_mode = 0x338; /* 1024x768x32 */
-
- return 0;
-}
-
static grub_err_t
grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
int argc, char *argv[])
@@ -809,8 +735,6 @@ grub_cmd_linux (grub_command_t cmd __att
grub_printf (" [Linux-bzImage, setup=0x%x, size=0x%x]\n",
(unsigned) real_size, (unsigned) prot_size);
- grub_linux_setup_video (params);
-
/* Detect explicitly specified memory size, if any. */
linux_mem_size = 0;
for (i = 1; i < argc; i++)
@@ -876,7 +800,7 @@ grub_cmd_linux (grub_command_t cmd __att
if (grub_errno == GRUB_ERR_NONE)
{
- grub_loader_set (grub_linux_boot, grub_linux_unload, 1);
+ grub_loader_set (grub_linux_boot, grub_linux_unload, 0);
loaded = 1;
}
=== removed file 'loader/i386/efi/xnu.c'
--- loader/i386/efi/xnu.c 2010-01-20 19:40:30 +0000
+++ loader/i386/efi/xnu.c 1970-01-01 00:00:00 +0000
@@ -1,178 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * GRUB is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <grub/env.h>
-#include <grub/xnu.h>
-#include <grub/cpu/xnu.h>
-#include <grub/efi/api.h>
-#include <grub/efi/efi.h>
-#include <grub/efi/uga_draw.h>
-#include <grub/pci.h>
-#include <grub/misc.h>
-
-/* Setup video for xnu. Big parts are copied from linux.c. */
-
-static grub_efi_guid_t uga_draw_guid = GRUB_EFI_UGA_DRAW_GUID;
-
-#define RGB_MASK 0xffffff
-#define RGB_MAGIC 0x121314
-#define LINE_MIN 800
-#define LINE_MAX 4096
-#define FBTEST_STEP (0x10000 >> 2)
-#define FBTEST_COUNT 8
-
-static int
-find_line_len (grub_uint32_t *fb_base, grub_uint32_t *line_len)
-{
- grub_uint32_t *base = (grub_uint32_t *) (grub_target_addr_t) *fb_base;
- int i;
-
- for (i = 0; i < FBTEST_COUNT; i++, base += FBTEST_STEP)
- {
- if ((*base & RGB_MASK) == RGB_MAGIC)
- {
- int j;
-
- for (j = LINE_MIN; j <= LINE_MAX; j++)
- {
- if ((base[j] & RGB_MASK) == RGB_MAGIC)
- {
- *fb_base = (grub_uint32_t) (grub_target_addr_t) base;
- *line_len = j << 2;
-
- return 1;
- }
- }
-
- break;
- }
- }
-
- return 0;
-}
-
-static int
-find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
-{
- int found = 0;
-
- auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid);
-
- int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
- grub_pci_id_t pciid)
- {
- grub_pci_address_t addr;
-
- addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
- if (grub_pci_read (addr) >> 24 == 0x3)
- {
- int i;
-
- grub_printf ("Display controller: %d:%d.%d\nDevice id: %x\n",
- grub_pci_get_bus (dev), grub_pci_get_device (dev),
- grub_pci_get_function (dev), pciid);
- addr += 8;
- for (i = 0; i < 6; i++, addr += 4)
- {
- grub_uint32_t old_bar1, old_bar2, type;
- grub_uint64_t base64;
-
- old_bar1 = grub_pci_read (addr);
- if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
- continue;
-
- type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- if (i == 5)
- break;
-
- old_bar2 = grub_pci_read (addr + 4);
- }
- else
- old_bar2 = 0;
-
- base64 = old_bar2;
- base64 <<= 32;
- base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
-
- grub_printf ("%s(%d): 0x%llx\n",
- ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
- "VMEM" : "MMIO"), i,
- (unsigned long long) base64);
-
- if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! found))
- {
- *fb_base = base64;
- if (find_line_len (fb_base, line_len))
- found++;
- }
-
- if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
- {
- i++;
- addr += 4;
- }
- }
- }
-
- return found;
- }
-
- grub_pci_iterate (find_card);
- return found;
-}
-
-grub_err_t
-grub_xnu_set_video (struct grub_xnu_boot_params *params)
-{
- grub_efi_uga_draw_protocol_t *c;
- grub_uint32_t width, height, depth, rate, pixel, fb_base, line_len;
- int ret;
-
- c = grub_efi_locate_protocol (&uga_draw_guid, 0);
- if (! c)
- return grub_error (GRUB_ERR_IO, "couldn't find UGADraw");
-
- if (efi_call_5 (c->get_mode, c, &width, &height, &depth, &rate))
- return grub_error (GRUB_ERR_IO, "couldn't retrieve video mode");
-
- grub_printf ("Video mode: address@hidden", width, height, depth, rate);
-
- grub_efi_set_text_mode (0);
- pixel = RGB_MAGIC;
- efi_call_10 (c->blt, c, (struct grub_efi_uga_pixel *) &pixel,
- GRUB_EFI_UGA_VIDEO_FILL, 0, 0, 0, 0, 1, height, 0);
- ret = find_framebuf (&fb_base, &line_len);
- grub_efi_set_text_mode (1);
-
- if (! ret)
- return grub_error (GRUB_ERR_IO, "can\'t find frame buffer address");
-
- grub_printf ("Frame buffer base: 0x%x\n", fb_base);
- grub_printf ("Video line length: %d\n", line_len);
-
- params->lfb_width = width;
- params->lfb_height = height;
- params->lfb_depth = depth;
- params->lfb_line_len = line_len;
- params->lfb_mode = GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
- params->lfb_base = fb_base;
- return GRUB_ERR_NONE;
-}
=== removed file 'loader/i386/pc/xnu.c'
--- loader/i386/pc/xnu.c 2010-02-06 15:32:45 +0000
+++ loader/i386/pc/xnu.c 1970-01-01 00:00:00 +0000
@@ -1,123 +0,0 @@
-/*
- * GRUB -- GRand Unified Bootloader
- * Copyright (C) 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
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * GRUB is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <grub/env.h>
-#include <grub/misc.h>
-#include <grub/xnu.h>
-#include <grub/mm.h>
-#include <grub/cpu/xnu.h>
-#include <grub/video_fb.h>
-#include <grub/bitmap_scale.h>
-
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#define max(a,b) (((a) > (b)) ? (a) : (b))
-
-#define DEFAULT_VIDEO_MODE "auto"
-
-/* Setup video for xnu. */
-grub_err_t
-grub_xnu_set_video (struct grub_xnu_boot_params *params)
-{
- struct grub_video_mode_info mode_info;
- int ret;
- char *tmp;
- const char *modevar;
- void *framebuffer;
- grub_err_t err;
- struct grub_video_bitmap *bitmap = NULL;
-
- modevar = grub_env_get ("gfxpayload");
- /* Consider only graphical 32-bit deep modes. */
- if (! modevar || *modevar == 0)
- err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
- GRUB_VIDEO_MODE_TYPE_PURE_TEXT
- | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
- 32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
- else
- {
- tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
- if (! tmp)
- return grub_errno;
- err = grub_video_set_mode (tmp,
- GRUB_VIDEO_MODE_TYPE_PURE_TEXT
- | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
- 32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
- grub_free (tmp);
- }
-
- if (err)
- return err;
-
- ret = grub_video_get_info (&mode_info);
- if (ret)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
-
- if (grub_xnu_bitmap)
- {
- if (grub_xnu_bitmap_mode == GRUB_XNU_BITMAP_STRETCH)
- err = grub_video_bitmap_create_scaled (&bitmap,
- mode_info.width,
- mode_info.height,
- grub_xnu_bitmap,
-
GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST);
- else
- bitmap = grub_xnu_bitmap;
- }
-
- if (bitmap)
- {
- int x, y;
-
- x = mode_info.width - bitmap->mode_info.width;
- x /= 2;
- y = mode_info.height - bitmap->mode_info.height;
- y /= 2;
- err = grub_video_blit_bitmap (bitmap,
- GRUB_VIDEO_BLIT_REPLACE,
- x > 0 ? x : 0,
- y > 0 ? y : 0,
- x < 0 ? -x : 0,
- y < 0 ? -y : 0,
- min (bitmap->mode_info.width,
- mode_info.width),
- min (bitmap->mode_info.height,
- mode_info.height));
- }
- if (err)
- {
- grub_print_error ();
- grub_errno = GRUB_ERR_NONE;
- bitmap = 0;
- }
-
- ret = grub_video_get_info_and_fini (&mode_info, &framebuffer);
- if (ret)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
-
- 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 = PTR_TO_UINT32 (framebuffer);
- params->lfb_mode = bitmap ? GRUB_XNU_VIDEO_SPLASH
- : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
-
- return GRUB_ERR_NONE;
-}
-
=== modified file 'loader/i386/xnu.c'
--- loader/i386/xnu.c 2010-01-20 06:36:17 +0000
+++ loader/i386/xnu.c 2010-06-12 10:44:55 +0000
@@ -33,6 +33,12 @@
#include <grub/command.h>
#include <grub/gzio.h>
#include <grub/i18n.h>
+#include <grub/bitmap_scale.h>
+
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+
+#define DEFAULT_VIDEO_MODE "auto"
char grub_xnu_cmdline[1024];
grub_uint32_t grub_xnu_heap_will_be_at;
@@ -838,6 +844,98 @@ grub_xnu_boot_resume (void)
state);
}
+/* Setup video for xnu. */
+static grub_err_t
+grub_xnu_set_video (struct grub_xnu_boot_params *params)
+{
+ struct grub_video_mode_info mode_info;
+ int ret;
+ char *tmp;
+ const char *modevar;
+ void *framebuffer;
+ grub_err_t err;
+ struct grub_video_bitmap *bitmap = NULL;
+
+ modevar = grub_env_get ("gfxpayload");
+ /* Consider only graphical 32-bit deep modes. */
+ if (! modevar || *modevar == 0)
+ err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
+ GRUB_VIDEO_MODE_TYPE_PURE_TEXT
+ | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
+ 32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
+ else
+ {
+ tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
+ if (! tmp)
+ return grub_errno;
+ err = grub_video_set_mode (tmp,
+ GRUB_VIDEO_MODE_TYPE_PURE_TEXT
+ | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
+ 32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
+ grub_free (tmp);
+ }
+
+ if (err)
+ return err;
+
+ ret = grub_video_get_info (&mode_info);
+ if (ret)
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
+
+ if (grub_xnu_bitmap)
+ {
+ if (grub_xnu_bitmap_mode == GRUB_XNU_BITMAP_STRETCH)
+ err = grub_video_bitmap_create_scaled (&bitmap,
+ mode_info.width,
+ mode_info.height,
+ grub_xnu_bitmap,
+
GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST);
+ else
+ bitmap = grub_xnu_bitmap;
+ }
+
+ if (bitmap)
+ {
+ int x, y;
+
+ x = mode_info.width - bitmap->mode_info.width;
+ x /= 2;
+ y = mode_info.height - bitmap->mode_info.height;
+ y /= 2;
+ err = grub_video_blit_bitmap (bitmap,
+ GRUB_VIDEO_BLIT_REPLACE,
+ x > 0 ? x : 0,
+ y > 0 ? y : 0,
+ x < 0 ? -x : 0,
+ y < 0 ? -y : 0,
+ min (bitmap->mode_info.width,
+ mode_info.width),
+ min (bitmap->mode_info.height,
+ mode_info.height));
+ }
+ if (err)
+ {
+ grub_print_error ();
+ grub_errno = GRUB_ERR_NONE;
+ bitmap = 0;
+ }
+
+ ret = grub_video_get_info_and_fini (&mode_info, &framebuffer);
+ if (ret)
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
+
+ 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 = PTR_TO_UINT32 (framebuffer);
+ params->lfb_mode = bitmap ? GRUB_XNU_VIDEO_SPLASH
+ : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
+
+ return GRUB_ERR_NONE;
+}
+
/* Boot xnu. */
grub_err_t
grub_xnu_boot (void)
=== modified file 'util/grub-mkconfig.in'
--- util/grub-mkconfig.in 2010-06-16 11:51:26 +0000
+++ util/grub-mkconfig.in 2010-06-17 15:12:28 +0000
@@ -96,11 +96,11 @@ case "$host_os" in
netbsd* | openbsd*)
# Because /boot is used for the boot block in NetBSD and OpenBSD, use /grub
# instead of /boot/grub.
- grub_prefix=`echo /grub | sed ${transform}`
+ GRUB_PREFIX=`echo /grub | sed ${transform}`
;;
*)
# Use /boot/grub by default.
- grub_prefix=`echo /boot/grub | sed ${transform}`
+ GRUB_PREFIX=`echo /boot/grub | sed ${transform}`
;;
esac
@@ -141,9 +141,9 @@ else
exit 1
fi
-mkdir -p ${grub_prefix}
+mkdir -p ${GRUB_PREFIX}
-if test -e ${grub_prefix}/device.map ; then : ; else
+if test -e ${GRUB_PREFIX}/device.map ; then : ; else
${grub_mkdevicemap}
fi
@@ -178,17 +178,14 @@ fi
for x in ${GRUB_TERMINAL_OUTPUT}; do
if [ "x${x}" = "xgfxterm" ]; then
# If this platform supports gfxterm, try to use it.
- if ! test -e ${grub_prefix}/gfxterm.mod ; then
+ if ! test -e ${GRUB_PREFIX}/gfxterm.mod ; then
if [ "x$termoutdefault" != "x1" ]; then
echo "gfxterm isn't available on your platform" >&2 ; exit 1
fi
GRUB_TERMINAL_OUTPUT=
break;
fi
- # FIXME: this should do something smarter than just loading first
- # video backend.
- GRUB_VIDEO_BACKEND=$(head -n 1 ${grub_prefix}/video.lst || true)
- if [ -z "${GRUB_VIDEO_BACKEND}" ] ; then
+ if [ ! -s "${GRUB_PREFIX}/video.lst" ] ; then
if [ "x$termoutdefault" != "x1" ]; then
echo "No suitable backend could be found for gfxterm." >&2 ;
exit 1
fi
@@ -246,7 +243,7 @@ export GRUB_DEVICE \
GRUB_FS \
GRUB_FONT_PATH \
GRUB_PRELOAD_MODULES \
- GRUB_VIDEO_BACKEND
+ GRUB_PREFIX
# These are optional, user-defined variables.
export GRUB_DEFAULT \
@@ -268,6 +265,7 @@ export GRUB_DEFAULT \
GRUB_DISABLE_LINUX_UUID \
GRUB_DISABLE_LINUX_RECOVERY \
GRUB_DISABLE_NETBSD_RECOVERY \
+ GRUB_VIDEO_BACKEND \
GRUB_GFXMODE \
GRUB_BACKGROUND \
GRUB_THEME \
=== modified file 'util/grub.d/00_header.in'
--- util/grub.d/00_header.in 2010-06-07 13:22:40 +0000
+++ util/grub.d/00_header.in 2010-06-17 14:52:56 +0000
@@ -21,8 +21,7 @@ transform="@program_transform_name@"
address@hidden@
address@hidden@
address@hidden@
-grub_prefix=`echo /boot/grub | sed ${transform}`
-locale_dir=`echo /boot/grub/locale | sed ${transform}`
+locale_dir=`echo ${GRUB_PREFIX}/locale | sed ${transform}`
grub_lang=`echo $LANG | cut -d _ -f 1`
. ${libdir}/grub/grub-mkconfig_lib
@@ -75,6 +74,24 @@ function savedefault {
save_env saved_entry
fi
}
+
+function load_video {
+EOF
+if [ -n "${GRUB_VIDEO_BACKEND}" ]; then
+ cat <<EOF
+ insmod ${GRUB_VIDEO_BACKEND}
+EOF
+else
+ # Insert all available backends; GRUB will use the most appropriate.
+ for backend in $(cat "${GRUB_PREFIX}/video.lst"); do
+ cat <<EOF
+ insmod ${backend}
+EOF
+ done
+fi
+cat <<EOF
+}
+
EOF
serial=0;
@@ -89,7 +106,7 @@ for x in ${GRUB_TERMINAL_INPUT} ${GRUB_T
done
if [ "x$serial" = x1 ]; then
- if ! test -e ${grub_prefix}/serial.mod ; then
+ if ! test -e ${GRUB_PREFIX}/serial.mod ; then
echo "Serial terminal not available on this platform." >&2 ; exit 1
fi
@@ -107,8 +124,8 @@ if [ "x$gfxterm" = x1 ]; then
cat << EOF
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT_PATH}"` ; then
set gfxmode=${GRUB_GFXMODE}
+ load_video
insmod gfxterm
- insmod ${GRUB_VIDEO_BACKEND}
EOF
if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
&& is_path_readable_by_grub "$GRUB_THEME"; then
=== modified file 'util/grub.d/10_linux.in'
--- util/grub.d/10_linux.in 2010-06-09 18:43:25 +0000
+++ util/grub.d/10_linux.in 2010-06-17 14:44:43 +0000
@@ -66,6 +66,9 @@ linux_entry ()
# Use ELILO's generic "efifb" when it's known to be available.
# FIXME: We need an interface to select vesafb in case efifb can't be used.
if [ "x$GRUB_GFXPAYLOAD_LINUX" = x ]; then
+ cat << EOF
+ load_video
+EOF
if grep -qx "CONFIG_FB_EFI=y" /boot/config-${version} 2> /dev/null \
&& grep -qx "CONFIG_VT_HW_CONSOLE_BINDING=y" /boot/config-${version}
2> /dev/null; then
cat << EOF
=== modified file 'util/grub.d/30_os-prober.in'
--- util/grub.d/30_os-prober.in 2010-02-03 00:24:07 +0000
+++ util/grub.d/30_os-prober.in 2010-06-17 14:18:39 +0000
@@ -44,7 +44,7 @@ EOF
save_default_entry | sed -e "s/^/\t/"
prepare_grub_to_access_device ${DEVICE} | sed -e "s/^/\t/"
cat << EOF
- insmod ${GRUB_VIDEO_BACKEND}
+ load_video
set do_resume=0
if [ /var/vm/sleepimage -nt10 / ]; then
if xnu_resume /var/vm/sleepimage; then
=== modified file 'video/efi_gop.c'
--- video/efi_gop.c 2010-03-07 12:01:43 +0000
+++ video/efi_gop.c 2010-06-12 17:49:14 +0000
@@ -355,6 +355,8 @@ static struct grub_video_adapter grub_vi
.name = "EFI GOP driver",
.id = GRUB_VIDEO_DRIVER_EFI_GOP,
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE,
+
.init = grub_video_gop_init,
.fini = grub_video_gop_fini,
.setup = grub_video_gop_setup,
=== modified file 'video/efi_uga.c'
--- video/efi_uga.c 2010-03-07 12:01:43 +0000
+++ video/efi_uga.c 2010-06-12 17:49:14 +0000
@@ -302,6 +302,8 @@ static struct grub_video_adapter grub_vi
.name = "EFI UGA driver",
.id = GRUB_VIDEO_DRIVER_EFI_UGA,
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE_DIRTY,
+
.init = grub_video_uga_init,
.fini = grub_video_uga_fini,
.setup = grub_video_uga_setup,
=== modified file 'video/emu/sdl.c'
--- video/emu/sdl.c 2010-04-27 05:20:28 +0000
+++ video/emu/sdl.c 2010-06-12 17:49:14 +0000
@@ -200,6 +200,9 @@ grub_video_sdl_set_active_render_target
static struct grub_video_adapter grub_video_sdl_adapter =
{
.name = "SDL Video Driver",
+ .id = GRUB_VIDEO_DRIVER_SDL,
+
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE,
.init = grub_video_sdl_init,
.fini = grub_video_sdl_fini,
=== modified file 'video/i386/pc/vbe.c'
--- video/i386/pc/vbe.c 2010-03-07 12:01:43 +0000
+++ video/i386/pc/vbe.c 2010-06-12 17:49:14 +0000
@@ -783,6 +783,8 @@ static struct grub_video_adapter grub_vi
.name = "VESA BIOS Extension Video Driver",
.id = GRUB_VIDEO_DRIVER_VBE,
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE,
+
.init = grub_video_vbe_init,
.fini = grub_video_vbe_fini,
.setup = grub_video_vbe_setup,
=== modified file 'video/i386/pc/vga.c'
--- video/i386/pc/vga.c 2010-05-09 09:00:21 +0000
+++ video/i386/pc/vga.c 2010-06-12 17:49:14 +0000
@@ -375,6 +375,8 @@ static struct grub_video_adapter grub_vi
.name = "VGA Video Driver",
.id = GRUB_VIDEO_DRIVER_VGA,
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FALLBACK,
+
.init = grub_video_vga_init,
.fini = grub_video_vga_fini,
.setup = grub_video_vga_setup,
=== modified file 'video/ieee1275.c'
--- video/ieee1275.c 2010-03-14 15:32:50 +0000
+++ video/ieee1275.c 2010-06-12 17:49:14 +0000
@@ -254,6 +254,8 @@ static struct grub_video_adapter grub_vi
{
.name = "IEEE1275 video driver",
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_FIRMWARE,
+
.init = grub_video_ieee1275_init,
.fini = grub_video_ieee1275_fini,
.setup = grub_video_ieee1275_setup,
=== modified file 'video/sm712.c'
--- video/sm712.c 2010-04-03 12:12:43 +0000
+++ video/sm712.c 2010-06-12 17:49:14 +0000
@@ -193,6 +193,8 @@ static struct grub_video_adapter grub_vi
.name = "SM712 Video Driver",
.id = GRUB_VIDEO_DRIVER_SM712,
+ .prio = GRUB_VIDEO_ADAPTER_PRIO_NATIVE,
+
.init = grub_video_sm712_video_init,
.fini = grub_video_sm712_video_fini,
.setup = grub_video_sm712_setup,
--
Colin Watson address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- efigfx branch ready for merging?,
Colin Watson <=