]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
efi/uga: Fix PCIe LER when GRUB2 accesses non-enabled MMIO data from VGA
authormike.travis@hpe.com <mike.travis@hpe.com>
Wed, 28 Mar 2018 16:42:18 +0000 (11:42 -0500)
committerDaniel Kiper <daniel.kiper@oracle.com>
Wed, 4 Apr 2018 19:48:52 +0000 (21:48 +0200)
A GPU inserted into a PCIe I/O slot disappears during system startup.
The problem centers around GRUB and a specific VGA init function in
efi_uga.c. This causes an LER (Link Error Recorvery) because the MMIO
memory has not been enabled before attempting access.

The fix is to add the same coding used in other VGA drivers, specifically
to add a check to insure that it is indeed a VGA controller. And then
enable the MMIO address space with the specific bits.

Signed-off-by: Mike Travis <mike.travis@hpe.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/video/efi_uga.c

index 464ede874daff480fb4199927cb30d48f0558e8b..044af1d20d38f08e3b5c5dcec4281c0b452cf8ea 100644 (file)
@@ -94,10 +94,19 @@ static int
 find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
 {
   struct find_framebuf_ctx *ctx = data;
-  grub_pci_address_t addr;
+  grub_pci_address_t addr, rcaddr;
+  grub_uint32_t subclass;
 
   addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
-  if (grub_pci_read (addr) >> 24 == 0x3)
+  subclass = (grub_pci_read (addr) >> 16) & 0xffff;
+
+  if (subclass != GRUB_PCI_CLASS_SUBCLASS_VGA)
+    return 0;
+
+  /* Enable MEM address spaces */
+  rcaddr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+  grub_pci_write_word (rcaddr, grub_pci_read_word (rcaddr) | GRUB_PCI_COMMAND_MEM_ENABLED);
+
     {
       int i;