GRUB-1.98 changes
[grub2/jjazz.git] / commands / efi / fixvideo.c
blob6430be5e34aec36aa88de291a1946ef274acd609
1 /* fixvideo.c - fix video problem in efi */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 Free Software Foundation, Inc.
6 * GRUB is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * GRUB is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
20 #include <grub/dl.h>
21 #include <grub/misc.h>
22 #include <grub/file.h>
23 #include <grub/pci.h>
24 #include <grub/command.h>
25 #include <grub/i18n.h>
27 static struct grub_video_patch
29 const char *name;
30 grub_uint32_t pci_id;
31 grub_uint32_t mmio_bar;
32 grub_uint32_t mmio_reg;
33 grub_uint32_t mmio_old;
34 } video_patches[] =
36 {"Intel 945GM", 0x27a28086, 0, 0x71184, 0x1000000}, /* DSPBBASE */
37 {"Intel 965GM", 0x2a028086, 0, 0x7119C, 0x1000000}, /* DSPBSURF */
38 {0, 0, 0, 0, 0}
41 static int NESTED_FUNC_ATTR
42 scan_card (grub_pci_device_t dev, grub_pci_id_t pciid)
44 grub_pci_address_t addr;
46 addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
47 if (grub_pci_read_byte (addr + 3) == 0x3)
49 struct grub_video_patch *p = video_patches;
51 while (p->name)
53 if (p->pci_id == pciid)
55 grub_target_addr_t base;
57 grub_printf ("Found graphic card: %s\n", p->name);
58 addr += 8 + p->mmio_bar * 4;
59 base = grub_pci_read (addr);
60 if ((! base) || (base & GRUB_PCI_ADDR_SPACE_IO) ||
61 (base & GRUB_PCI_ADDR_MEM_PREFETCH))
62 grub_printf ("Invalid MMIO bar %d\n", p->mmio_bar);
63 else
65 base &= GRUB_PCI_ADDR_MEM_MASK;
66 base += p->mmio_reg;
68 if (*((volatile grub_uint32_t *) base) != p->mmio_old)
69 grub_printf ("Old value don't match\n");
70 else
72 *((volatile grub_uint32_t *) base) = 0;
73 if (*((volatile grub_uint32_t *) base))
74 grub_printf ("Set MMIO fails\n");
78 return 1;
80 p++;
83 grub_printf ("Unknown graphic card: %x\n", pciid);
86 return 0;
89 static grub_err_t
90 grub_cmd_fixvideo (grub_command_t cmd __attribute__ ((unused)),
91 int argc __attribute__ ((unused)),
92 char *argv[] __attribute__ ((unused)))
94 grub_pci_iterate (scan_card);
95 return 0;
98 static grub_command_t cmd_fixvideo;
100 GRUB_MOD_INIT(fixvideo)
102 cmd_fixvideo = grub_register_command ("fix_video", grub_cmd_fixvideo,
103 0, N_("Fix video problem."));
107 GRUB_MOD_FINI(fixvideo)
109 grub_unregister_command (cmd_fixvideo);