]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Add PCI command activation to all PCI drivers as required for coreboot
authorVladimir Serbinenko <phcoder@gmail.com>
Tue, 26 Nov 2013 13:21:11 +0000 (14:21 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Tue, 26 Nov 2013 13:21:11 +0000 (14:21 +0100)
and maybe some other firmwares.

ChangeLog
grub-core/bus/usb/ehci.c
grub-core/bus/usb/ohci.c
grub-core/bus/usb/uhci.c
grub-core/disk/pata.c
grub-core/video/bochs.c
grub-core/video/cirrus.c

index edb86307ee32087bfe47c1543ffba13fde66d7bc..279cc23734f0b172db0f50d7a6ef178e75a6e692 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-11-26  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Add PCI command activation to all PCI drivers as required for coreboot
+       and maybe some other firmwares.
+
 2013-11-26  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/Makefile.am: Reduce gratuituous differences between Apple
index b592f088cf313436251488c7fc2e37af7059e1a0..593a55ac2be00f0f01576207e2642b4ad4a84b97 100644 (file)
@@ -534,11 +534,20 @@ grub_ehci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
                        "EHCI grub_ehci_pci_iter: registers above 4G are not supported\n");
          return 0;
        }
+      base &= GRUB_PCI_ADDR_MEM_MASK;
+      if (!base)
+       {
+         grub_dprintf ("ehci",
+                       "EHCI: EHCI is not mapped\n");
+         return 0;
+       }
 
       /* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */
       addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
       grub_pci_write_word(addr,
-          GRUB_PCI_COMMAND_BUS_MASTER | grub_pci_read_word(addr));
+                         GRUB_PCI_COMMAND_MEM_ENABLED
+                         | GRUB_PCI_COMMAND_BUS_MASTER
+                         | grub_pci_read_word(addr));
       
       grub_dprintf ("ehci", "EHCI grub_ehci_pci_iter: 32-bit EHCI OK\n");
     }
index a173e40562e389f202cc1bbd74e454d56fb7b9de..3b552d7fc7211288621ce139b7dc08371a6f5656 100644 (file)
@@ -265,16 +265,20 @@ grub_ohci_pci_iter (grub_pci_device_t dev, grub_pci_id_t pciid,
       addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
       base = grub_pci_read (addr);
 
-#if 0
-      /* Stop if there is no IO space base address defined.  */
-      if (! (base & 1))
-       return 0;
-#endif
+      base &= GRUB_PCI_ADDR_MEM_MASK;
+      if (!base)
+       {
+         grub_dprintf ("ehci",
+                       "EHCI: EHCI is not mapper\n");
+         return 0;
+       }
 
       /* Set bus master - needed for coreboot, VMware, broken BIOSes etc. */
       addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
       grub_pci_write_word(addr,
-          GRUB_PCI_COMMAND_BUS_MASTER | grub_pci_read_word(addr));
+                         GRUB_PCI_COMMAND_MEM_ENABLED
+                         | GRUB_PCI_COMMAND_BUS_MASTER
+                         | grub_pci_read_word(addr));
 
       grub_dprintf ("ohci", "class=0x%02x 0x%02x interface 0x%02x\n",
                    class, subclass, interf);
index 0fb9365beae69e232035da05d40b0a3e2d6f285c..978cb3f90e1f0a1766df4d996781defafe2b262e 100644 (file)
@@ -217,12 +217,6 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
   if (class != 0x0c || subclass != 0x03 || interf != 0x00)
     return 0;
 
-  /* Set bus master - needed for coreboot or broken BIOSes */
-  addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
-  grub_pci_write_word(addr, GRUB_PCI_COMMAND_IO_ENABLED
-                     | GRUB_PCI_COMMAND_BUS_MASTER
-                     | grub_pci_read_word (addr));
-
   /* Determine IO base address.  */
   addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG4);
   base = grub_pci_read (addr);
@@ -233,6 +227,13 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
   if ((base & GRUB_UHCI_IOMASK) == 0)
     return 0;
 
+  /* Set bus master - needed for coreboot or broken BIOSes */
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+  grub_pci_write_word(addr, GRUB_PCI_COMMAND_IO_ENABLED
+                     | GRUB_PCI_COMMAND_BUS_MASTER
+                     | GRUB_PCI_COMMAND_MEM_ENABLED
+                     | grub_pci_read_word (addr));
+
   grub_dprintf ("uhci", "base = %x\n", base);
 
   /* Allocate memory for the controller and register it.  */
index 8c4b27b7e98c0da91b3be4796b0838f1527a4228..23eef2be18c2dc1b88fc4edfe4d9e480a549eadf 100644 (file)
@@ -402,9 +402,15 @@ grub_pata_pciinit (grub_pci_device_t dev,
          bar2 = grub_pci_read (addr);
 
          /* Check if the BARs describe an IO region.  */
-         if ((bar1 & 1) && (bar2 & 1))
+         if ((bar1 & 1) && (bar2 & 1) && (bar1 & ~3))
            {
              rega = bar1 & ~3;
+             addr = grub_pci_make_address (dev, GRUB_PCI_REG_COMMAND);
+             grub_pci_write_word (addr, grub_pci_read_word (addr)
+                                  | GRUB_PCI_COMMAND_IO_ENABLED
+                                  | GRUB_PCI_COMMAND_MEM_ENABLED
+                                  | GRUB_PCI_COMMAND_BUS_MASTER);
+
            }
        }
 
index 4b8c205fbad0439e13af15af67cc8196e1051369..9098f90d1cafb3ad879180feee8886305ee6cbe5 100644 (file)
@@ -213,12 +213,17 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
   if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x11111234)
     return 0;
   
-  *found = 1;
-
   addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
   framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+  if (!framebuffer.base)
+    return 0;
+  *found = 1;
   framebuffer.dev = dev;
 
+  /* Enable address spaces.  */
+  addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_COMMAND);
+  grub_pci_write (addr, 0x7);
+
   return 1;
 }
 
index 41baae4904afdf77186e45345f4efc80d963df25..4913084fa01cc9e42d635b9bf7803de3d544cd2c 100644 (file)
@@ -248,11 +248,18 @@ find_card (grub_pci_device_t dev, grub_pci_id_t pciid, void *data)
 
   if (((class >> 16) & 0xffff) != 0x0300 || pciid != 0x00b81013)
     return 0;
-  
-  *found = 1;
 
   addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
   framebuffer.base = grub_pci_read (addr) & GRUB_PCI_ADDR_MEM_MASK;
+  if (!framebuffer.base)
+    return 0;
+
+  *found = 1;
+
+  /* Enable address spaces.  */
+  addr = grub_pci_make_address (framebuffer.dev, GRUB_PCI_REG_COMMAND);
+  grub_pci_write (addr, 0x7);
+
   framebuffer.dev = dev;
 
   return 1;