291
grub_linux_setup_video (struct linux_kernel_params *params)
293
struct grub_video_mode_info mode_info;
297
err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
302
params->lfb_width = mode_info.width;
303
params->lfb_height = mode_info.height;
304
params->lfb_depth = mode_info.bpp;
305
params->lfb_line_len = mode_info.pitch;
307
params->lfb_base = (grub_size_t) framebuffer;
308
params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height,
311
params->red_mask_size = mode_info.red_mask_size;
312
params->red_field_pos = mode_info.red_field_pos;
313
params->green_mask_size = mode_info.green_mask_size;
314
params->green_field_pos = mode_info.green_field_pos;
315
params->blue_mask_size = mode_info.blue_mask_size;
316
params->blue_field_pos = mode_info.blue_field_pos;
317
params->reserved_mask_size = mode_info.reserved_mask_size;
318
params->reserved_field_pos = mode_info.reserved_field_pos;
320
params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
322
#ifdef GRUB_MACHINE_PCBIOS
323
/* VESA packed modes may come with zeroed mask sizes, which need
324
to be set here according to DAC Palette width. If we don't,
325
this results in Linux displaying a black screen. */
326
if (mode_info.bpp <= 8)
328
struct grub_vbe_info_block controller_info;
332
status = grub_vbe_bios_get_controller_info (&controller_info);
334
if (status == GRUB_VBE_STATUS_OK &&
335
(controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH))
336
status = grub_vbe_bios_set_dac_palette_width (&width);
338
if (status != GRUB_VBE_STATUS_OK)
339
/* 6 is default after mode reset. */
342
params->red_mask_size = params->green_mask_size
343
= params->blue_mask_size = width;
344
params->reserved_mask_size = 0;
289
351
#ifdef __x86_64__
290
352
extern grub_uint8_t grub_linux_trampoline_start[];
291
353
extern grub_uint8_t grub_linux_trampoline_end[];
353
418
grub_mmap_iterate (hook);
354
419
params->mmap_size = e820_num;
421
grub_dprintf ("linux", "Trampoline at %p. code32=%x, real_mode_mem=%p\n",
422
((char *) prot_mode_mem + (prot_mode_pages << 12)),
423
(unsigned) params->code32_start, real_mode_mem);
425
modevar = grub_env_get ("gfxpayload");
427
/* Now all graphical modes are acceptable.
428
May change in future if we have modes without framebuffer. */
429
if (modevar && *modevar != 0)
431
tmp = grub_xasprintf ("%s;auto", modevar);
434
err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
438
err = grub_video_set_mode ("auto", GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
441
err = grub_linux_setup_video (params);
446
grub_printf ("Booting however\n");
447
grub_errno = GRUB_ERR_NONE;
356
450
mmap_size = find_mmap_size ();
357
451
if (grub_efi_get_memory_map (&mmap_size, mmap_buf, &map_key,
358
452
&desc_size, &desc_version) <= 0)
425
519
return GRUB_ERR_NONE;
428
static grub_efi_guid_t uga_draw_guid = GRUB_EFI_UGA_DRAW_GUID;
431
#define RGB_MASK 0xffffff
432
#define RGB_MAGIC 0x121314
434
#define LINE_MAX 4096
435
#define FBTEST_STEP (0x10000 >> 2)
436
#define FBTEST_COUNT 8
439
find_line_len (grub_uint32_t *fb_base, grub_uint32_t *line_len)
441
grub_uint32_t *base = (grub_uint32_t *) (grub_target_addr_t) *fb_base;
444
for (i = 0; i < FBTEST_COUNT; i++, base += FBTEST_STEP)
446
if ((*base & RGB_MASK) == RGB_MAGIC)
450
for (j = LINE_MIN; j <= LINE_MAX; j++)
452
if ((base[j] & RGB_MASK) == RGB_MAGIC)
454
*fb_base = (grub_uint32_t) (grub_target_addr_t) base;
469
find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
473
auto int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
474
grub_pci_id_t pciid);
476
int NESTED_FUNC_ATTR find_card (grub_pci_device_t dev,
479
grub_pci_address_t addr;
481
addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
482
if (grub_pci_read (addr) >> 24 == 0x3)
486
grub_printf ("Display controller: %d:%d.%d\nDevice id: %x\n",
487
grub_pci_get_bus (dev), grub_pci_get_device (dev),
488
grub_pci_get_function (dev), pciid);
490
for (i = 0; i < 6; i++, addr += 4)
492
grub_uint32_t old_bar1, old_bar2, type;
493
grub_uint64_t base64;
495
old_bar1 = grub_pci_read (addr);
496
if ((! old_bar1) || (old_bar1 & GRUB_PCI_ADDR_SPACE_IO))
499
type = old_bar1 & GRUB_PCI_ADDR_MEM_TYPE_MASK;
500
if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
505
old_bar2 = grub_pci_read (addr + 4);
512
base64 |= (old_bar1 & GRUB_PCI_ADDR_MEM_MASK);
514
grub_printf ("%s(%d): 0x%llx\n",
515
((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) ?
517
(unsigned long long) base64);
519
if ((old_bar1 & GRUB_PCI_ADDR_MEM_PREFETCH) && (! found))
522
if (find_line_len (fb_base, line_len))
526
if (type == GRUB_PCI_ADDR_MEM_TYPE_64)
537
grub_pci_iterate (find_card);
542
grub_linux_setup_video (struct linux_kernel_params *params)
544
grub_efi_uga_draw_protocol_t *c;
545
grub_uint32_t width, height, depth, rate, pixel, fb_base, line_len;
548
c = grub_efi_locate_protocol (&uga_draw_guid, 0);
552
if (efi_call_5 (c->get_mode, c, &width, &height, &depth, &rate))
555
grub_printf ("Video mode: %ux%u-%u@%u\n", width, height, depth, rate);
557
grub_efi_set_text_mode (0);
559
efi_call_10 (c->blt, c, (struct grub_efi_uga_pixel *) &pixel,
560
GRUB_EFI_UGA_VIDEO_FILL, 0, 0, 0, 0, 1, height, 0);
561
ret = find_framebuf (&fb_base, &line_len);
562
grub_efi_set_text_mode (1);
566
grub_printf ("Can\'t find frame buffer address\n");
570
grub_printf ("Frame buffer base: 0x%x\n", fb_base);
571
grub_printf ("Video line length: %d\n", line_len);
573
params->lfb_width = width;
574
params->lfb_height = height;
575
params->lfb_depth = depth;
576
params->lfb_line_len = line_len;
578
params->lfb_base = fb_base;
579
params->lfb_size = ALIGN_UP (line_len * params->lfb_height, 65536);
581
params->red_mask_size = 8;
582
params->red_field_pos = 16;
583
params->green_mask_size = 8;
584
params->green_field_pos = 8;
585
params->blue_mask_size = 8;
586
params->blue_field_pos = 0;
587
params->reserved_mask_size = 8;
588
params->reserved_field_pos = 24;
590
params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
591
params->vid_mode = 0x338; /* 1024x768x32 */
596
522
static grub_err_t
597
523
grub_cmd_linux (grub_command_t cmd __attribute__ ((unused)),
598
524
int argc, char *argv[])