]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Byte-addressable PCI config space
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 22 Dec 2009 14:09:25 +0000 (15:09 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 22 Dec 2009 14:09:25 +0000 (15:09 +0100)
13 files changed:
ChangeLog.pciclean [new file with mode: 0644]
bus/pci.c
bus/usb/ohci.c
bus/usb/uhci.c
commands/efi/fixvideo.c
commands/efi/loadbios.c
commands/lspci.c
disk/ata.c
include/grub/pci.h
loader/i386/efi/linux.c
loader/i386/efi/xnu.c
util/pci.c
video/efi_uga.c

diff --git a/ChangeLog.pciclean b/ChangeLog.pciclean
new file mode 100644 (file)
index 0000000..f50a488
--- /dev/null
@@ -0,0 +1,52 @@
+2009-12-22  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       Byte-addressable PCI configuration space.
+
+       * bus/pci.c (grub_pci_make_address): Use byte address instead of
+       dword address.
+       (grub_pci_iterate): Use macroses GRUB_PCI_REG_PCI_ID and
+       GRUB_PCI_REG_CACHELINE.
+       * bus/usb/ohci.c (grub_ohci_pci_iter): Use macroses
+       GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESS_REG0.
+       * bus/usb/uhci.c (grub_ohci_pci_iter): Use macroses
+       GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESS_REG4.
+       * commands/efi/fixvideo.c (scan_card): Use macros GRUB_PCI_REG_CLASS.
+       * commands/efi/loadbios.c (enable_rom_area): Pass byte-address to
+       grub_pci_make_address.
+       (lock_rom_area): Likewise.
+       * commands/lspci.c (grub_lspci_iter): Use macroses
+       GRUB_PCI_REG_CLASS and GRUB_PCI_REG_ADDRESSES. Handle byte-addressing
+       of grub_pci_make_address.
+       * disk/ata.c (grub_ata_pciinit): Likewise.
+       * include/grub/pci.h (GRUB_PCI_REG_PCI_ID): New macro.
+       (GRUB_PCI_REG_VENDOR): Likewise.
+       (GRUB_PCI_REG_DEVICE): Likewise.
+       (GRUB_PCI_REG_COMMAND): Likewise.
+       (GRUB_PCI_REG_STATUS): Likewise.
+       (GRUB_PCI_REG_REVISION): Likewise.
+       (GRUB_PCI_REG_CLASS): Likewise.
+       (GRUB_PCI_REG_CACHELINE): Likewise.
+       (GRUB_PCI_REG_LAT_TIMER): Likewise.
+       (GRUB_PCI_REG_HEADER_TYPE): Likewise.
+       (GRUB_PCI_REG_BIST): Likewise.
+       (GRUB_PCI_REG_ADDRESSES): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_ADDRESS_REG): Likewise.
+       (GRUB_PCI_REG_CIS_POINTER): Likewise.
+       (GRUB_PCI_REG_SUBVENDOR): Likewise.
+       (GRUB_PCI_REG_SUBSYSTEM): Likewise.
+       (GRUB_PCI_REG_ROM_ADDRESS): Likewise.
+       (GRUB_PCI_REG_CAP_POINTER): Likewise.
+       (GRUB_PCI_REG_IRQ_LINE): Likewise.
+       (GRUB_PCI_REG_IRQ_PIN): Likewise.
+       (GRUB_PCI_REG_MIN_GNT): Likewise.
+       (GRUB_PCI_REG_MAX_LAT): Likewise.
+       * loader/i386/efi/linux.c (find_framebuf): Use GRUB_PCI_REG_CLASS.
+       * loader/i386/efi/xnu.c (find_framebuf): Likewise.
+       * video/efi_uga.c (find_framebuf): Likewise.
+       * util/pci.c (grub_pci_make_address): Use byte-addressed configuration
+       space.
index fe4cad181f4a684cbfc24dad1cc0def319a1c6a8..13b67c908bb2d2748f48bb822bb8cc1fba7e79d4 100644 (file)
--- a/bus/pci.c
+++ b/bus/pci.c
@@ -24,7 +24,7 @@ grub_pci_address_t
 grub_pci_make_address (grub_pci_device_t dev, int reg)
 {
   return (1 << 31) | (dev.bus << 16) | (dev.device << 11)
-    | (dev.function << 8) | (reg << 2);
+    | (dev.function << 8) | reg;
 }
 
 void
@@ -41,7 +41,7 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
        {
          for (dev.function = 0; dev.function < 8; dev.function++)
            {
-             addr = grub_pci_make_address (dev, 0);
+             addr = grub_pci_make_address (dev, GRUB_PCI_REG_PCI_ID);
              id = grub_pci_read (addr);
 
              /* Check if there is a device present.  */
@@ -54,7 +54,7 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
              /* Probe only func = 0 if the device if not multifunction */
              if (dev.function == 0)
                {
-                 addr = grub_pci_make_address (dev, 3);
+                 addr = grub_pci_make_address (dev, GRUB_PCI_REG_CACHELINE);
                  hdr = grub_pci_read (addr);
                  if (!(hdr & 0x800000))
                    break;
index 5fe9c95079ec0f0a9554cb09e943a3dbaf01da4b..6d185bc7f3bbac64a1ea9e3189a7468806a309bc 100644 (file)
@@ -126,7 +126,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev,
   grub_uint32_t revision;
   grub_uint32_t frame_interval;
 
-  addr = grub_pci_make_address (dev, 2);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
   class_code = grub_pci_read (addr) >> 8;
 
   interf = class_code & 0xFF;
@@ -138,7 +138,7 @@ grub_ohci_pci_iter (grub_pci_device_t dev,
     return 0;
 
   /* Determine IO base address.  */
-  addr = grub_pci_make_address (dev, 4);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG0);
   base = grub_pci_read (addr);
 
 #if 0
index e83fccc1d310729881ad2a92c457a3f5f1c69aba..947f2367b22179821ff5a690494dc5aaafc5059b 100644 (file)
@@ -150,7 +150,7 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
   struct grub_uhci *u;
   int i;
 
-  addr = grub_pci_make_address (dev, 2);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
   class_code = grub_pci_read (addr) >> 8;
 
   interf = class_code & 0xFF;
@@ -162,7 +162,7 @@ grub_uhci_pci_iter (grub_pci_device_t dev,
     return 0;
 
   /* Determine IO base address.  */
-  addr = grub_pci_make_address (dev, 8);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESS_REG4);
   base = grub_pci_read (addr);
   /* Stop if there is no IO space base address defined.  */
   if (! (base & 1))
index 68566223753765edfae93888478469c756471ce3..dea69c8b11b513b4b4ecdd6f28f204d573387f90 100644 (file)
@@ -42,7 +42,7 @@ scan_card (grub_pci_device_t dev, grub_pci_id_t pciid)
 {
   grub_pci_address_t addr;
 
-  addr = grub_pci_make_address (dev, 2);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
   if (grub_pci_read_byte (addr + 3) == 0x3)
     {
       struct grub_video_patch *p = video_patches;
index d7ad4269068c06bdee6ceac11a922bb151eb5fab..183ba7e8533868beedfc5076d8a8f9bee9753ca2 100644 (file)
@@ -50,7 +50,7 @@ enable_rom_area (void)
       return 0;
     }
 
-  addr = grub_pci_make_address (dev, 36);
+  addr = grub_pci_make_address (dev, 144);
   grub_pci_write_byte (addr++, 0x30);
   grub_pci_write_byte (addr++, 0x33);
   grub_pci_write_byte (addr++, 0x33);
@@ -76,7 +76,7 @@ lock_rom_area (void)
   grub_pci_address_t addr;
   grub_pci_device_t dev = { .bus = 0, .device = 0, .function = 0};
 
-  addr = grub_pci_make_address (dev, 36);
+  addr = grub_pci_make_address (dev, 144);
   grub_pci_write_byte (addr++, 0x10);
   grub_pci_write_byte (addr++, 0x11);
   grub_pci_write_byte (addr++, 0x11);
index 559bb8242b65a45149b4c186956e011848c6df88..c515da762b3a4c52d5e65ea14e0eb6fc40b67521 100644 (file)
@@ -134,7 +134,7 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
   grub_printf ("%02x:%02x.%x %04x:%04x", grub_pci_get_bus (dev),
               grub_pci_get_device (dev), grub_pci_get_function (dev),
               pciid & 0xFFFF, pciid >> 16);
-  addr = grub_pci_make_address (dev, 2);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
   class = grub_pci_read (addr);
 
   /* Lookup the class name, if there isn't a specific one,
@@ -155,14 +155,14 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
 
   if (iospace)
     {
-      reg = 4;
-      while (reg < 10)
+      reg = GRUB_PCI_REG_ADDRESSES;
+      while (reg < GRUB_PCI_REG_CIS_POINTER)
        {
          grub_uint64_t space;
          addr = grub_pci_make_address (dev, reg);
          space = grub_pci_read (addr);
 
-         reg++;
+         reg += sizeof (grub_uint32_t);
          
          if (space == 0)
            continue;
@@ -170,7 +170,9 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
          switch (space & GRUB_PCI_ADDR_SPACE_MASK)
            {
            case GRUB_PCI_ADDR_SPACE_IO:
-             grub_printf ("\tIO space %d at 0x%llx\n", (reg - 1) - 4,
+             grub_printf ("\tIO space %d at 0x%llx\n",
+                          ((reg - GRUB_PCI_REG_ADDRESSES)
+                           / sizeof (grub_uint32_t)) - 1,
                           (unsigned long long)
                           (space & GRUB_PCI_ADDR_IO_MASK));
              break;
@@ -180,9 +182,11 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
                {
                  addr = grub_pci_make_address (dev, reg);
                  space |= ((grub_uint64_t) grub_pci_read (addr)) << 32;
-                 reg++;
+                 reg += sizeof (grub_uint32_t);
                  grub_printf ("\t64-bit memory space %d at 0x%016llx [%s]\n",
-                              (reg - 2) - 4, (unsigned long long)
+                              ((reg - GRUB_PCI_REG_ADDRESSES)
+                               / sizeof (grub_uint32_t)) - 2,
+                              (unsigned long long)
                               (space & GRUB_PCI_ADDR_MEM_MASK),
                               space & GRUB_PCI_ADDR_MEM_PREFETCH
                               ? "prefetchable" : "non-prefetchable");
@@ -190,7 +194,9 @@ grub_lspci_iter (grub_pci_device_t dev, grub_pci_id_t pciid)
                }
              else
                grub_printf ("\t32-bit memory space %d at 0x%016llx [%s]\n",
-                            (reg - 1) - 4, (unsigned long long) 
+                            ((reg - GRUB_PCI_REG_ADDRESSES)
+                             / sizeof (grub_uint32_t)) - 1,
+                            (unsigned long long) 
                             (space & GRUB_PCI_ADDR_MEM_MASK),
                             space & GRUB_PCI_ADDR_MEM_PREFETCH
                             ? "prefetchable" : "non-prefetchable");
index af8c87180913e4144781271c28d1085793c296b4..bc8383d4ee02443cc90c8bc1c482ecc715710a2e 100644 (file)
@@ -402,7 +402,7 @@ grub_ata_pciinit (grub_pci_device_t dev,
   static int controller = 0;
 
   /* Read class.  */
-  addr = grub_pci_make_address (dev, 2);
+  addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
   class = grub_pci_read (addr);
 
   /* Check if this class ID matches that of a PCI IDE Controller.  */
@@ -429,9 +429,12 @@ grub_ata_pciinit (grub_pci_device_t dev,
        {
          /* Read the BARs, which either contain a mmapped IO address
             or the IO port address.  */
-         addr = grub_pci_make_address (dev, 4 + 2 * i);
+         addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESSES
+                                       + sizeof (grub_uint64_t) * i);
          bar1 = grub_pci_read (addr);
-         addr = grub_pci_make_address (dev, 5 + 2 * i);
+         addr = grub_pci_make_address (dev, GRUB_PCI_REG_ADDRESSES
+                                       + sizeof (grub_uint64_t) * i
+                                       + sizeof (grub_uint32_t));
          bar2 = grub_pci_read (addr);
 
          /* Check if the BARs describe an IO region.  */
index 2bea0541021a4800516abfd9f6ca0e97cd1d33f4..1f3ac7fc795126b936c2564dc8b0cf0d0331b7df 100644 (file)
 #define  GRUB_PCI_ADDR_MEM_MASK                ~0xf
 #define  GRUB_PCI_ADDR_IO_MASK         ~0x03
 
+#define  GRUB_PCI_REG_PCI_ID       0x00
+#define  GRUB_PCI_REG_VENDOR       0x00
+#define  GRUB_PCI_REG_DEVICE       0x02
+#define  GRUB_PCI_REG_COMMAND      0x04
+#define  GRUB_PCI_REG_STATUS       0x06
+#define  GRUB_PCI_REG_REVISION     0x08
+#define  GRUB_PCI_REG_CLASS        0x08
+#define  GRUB_PCI_REG_CACHELINE    0x0c
+#define  GRUB_PCI_REG_LAT_TIMER    0x0d
+#define  GRUB_PCI_REG_HEADER_TYPE  0x0e
+#define  GRUB_PCI_REG_BIST         0x0f
+#define  GRUB_PCI_REG_ADDRESSES    0x10
+
+/* Beware that 64-bit address takes 2 registers.  */
+#define  GRUB_PCI_REG_ADDRESS_REG0 0x10
+#define  GRUB_PCI_REG_ADDRESS_REG1 0x14
+#define  GRUB_PCI_REG_ADDRESS_REG2 0x18
+#define  GRUB_PCI_REG_ADDRESS_REG3 0x1c
+#define  GRUB_PCI_REG_ADDRESS_REG4 0x20
+#define  GRUB_PCI_REG_ADDRESS_REG5 0x24
+
+#define  GRUB_PCI_REG_CIS_POINTER  0x28
+#define  GRUB_PCI_REG_SUBVENDOR    0x2c
+#define  GRUB_PCI_REG_SUBSYSTEM    0x2e
+#define  GRUB_PCI_REG_ROM_ADDRESS  0x30
+#define  GRUB_PCI_REG_CAP_POINTER  0x34
+#define  GRUB_PCI_REG_IRQ_LINE     0x3c
+#define  GRUB_PCI_REG_IRQ_PIN      0x3d
+#define  GRUB_PCI_REG_MIN_GNT      0x3e
+#define  GRUB_PCI_REG_MAX_LAT      0x3f
+
 typedef grub_uint32_t grub_pci_id_t;
 
 #ifdef GRUB_UTIL
index 8cd4d23f2c22e6f7ec4c7a321aa3c1b15c80d87d..ad09f7c36e6f72e3cd2e387c3db925cfe358ab7b 100644 (file)
@@ -477,7 +477,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
     {
       grub_pci_address_t addr;
 
-      addr = grub_pci_make_address (dev, 2);
+      addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
       if (grub_pci_read (addr) >> 24 == 0x3)
        {
          int i;
index 236732804ae626165c106858d18a4174e67ff6ef..af54ac5c12e6841519eaad371c0da33dfb0370a6 100644 (file)
@@ -79,7 +79,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
     {
       grub_pci_address_t addr;
 
-      addr = grub_pci_make_address (dev, 2);
+      addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
       if (grub_pci_read (addr) >> 24 == 0x3)
        {
          int i;
index a0c1867be335bb75e21fc20969bc67cd2ab2ebfb..420ae320ba52aa20d697436d5c7df8adead8e847 100644 (file)
@@ -26,7 +26,7 @@ grub_pci_make_address (grub_pci_device_t dev, int reg)
 {
   grub_pci_address_t ret;
   ret.dev = dev;
-  ret.pos = reg << 2;
+  ret.pos = reg;
   return ret;
 }
 
index 9bca6430652d1ff8755f7b2ff5e042e76d48d73c..959b266a9f2cf3f84860761658a42ce1d776686e 100644 (file)
@@ -92,7 +92,7 @@ find_framebuf (grub_uint32_t *fb_base, grub_uint32_t *line_len)
     {
       grub_pci_address_t addr;
 
-      addr = grub_pci_make_address (dev, 2);
+      addr = grub_pci_make_address (dev, GRUB_PCI_REG_CLASS);
       if (grub_pci_read (addr) >> 24 == 0x3)
        {
          int i;