]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
pciaccess
authorphcoder <phcoder@debian.bg45.phnet>
Wed, 14 Oct 2009 16:17:18 +0000 (18:17 +0200)
committerphcoder <phcoder@debian.bg45.phnet>
Wed, 14 Oct 2009 16:17:18 +0000 (18:17 +0200)
Makefile.in
conf/i386-pc.rmk
configure.ac
include/grub/i386/pci.h
include/grub/pciutils.h
util/pci.c

index 4e45dc5691031c157aee8ef9fa7452e543cc9d5e..1733f1c0149a73f09e6483f78e2685512ce7eef3 100644 (file)
@@ -100,7 +100,7 @@ endif
 AWK = @AWK@
 LIBCURSES = @LIBCURSES@
 LIBUSB = @LIBUSB@
-LIBPCI = @LIBPCI@
+LIBPCIACCESS = @LIBPCIACCESS@
 YACC = @YACC@
 UNIFONT_BDF = @UNIFONT_BDF@
 
index 107ae7a22e5a8ffc37c2f54237bc6d2906b99403..e4b89a8b9f85a175de2892e91b063ce8c61b229c 100644 (file)
@@ -170,7 +170,7 @@ endif
 
 ifeq ($(enable_grub_emu_pci), yes)
 grub_emu_SOURCES += util/pci.c commands/lspci.c
-grub_emu_LDFLAGS += $(LIBPCI)
+grub_emu_LDFLAGS += $(LIBPCIACCESS)
 endif
 
 # Scripts.
index ceb81881aa526a28bcb9a749993050d307726c0f..5473ac3a365c3eccb66bfc6bde4d82b94bb350b9 100644 (file)
@@ -569,14 +569,14 @@ fi
 
 [if [ x"$grub_emu_pci_excuse" = x ]; then
       # Check for libpci libraries.]
-   AC_CHECK_LIB([pci], [pci_alloc], [LIBPCI="-lpci"],
-      [grub_emu_pci_excuse=["need libpci library"]])
-    AC_SUBST([LIBPCI])
+   AC_CHECK_LIB([pciaccess], [pci_system_init], [LIBPCIACCESS="-lpciaccess"],
+      [grub_emu_pci_excuse=["need libpciaccess library"]])
+    AC_SUBST([LIBPCIACCESS])
 [fi]
 [if [ x"$grub_emu_pci_excuse" = x ]; then
     # Check for headers.]
     AC_CHECK_HEADERS([pci/pci.h], [],
-      [grub_emu_pci_excuse=["need libpci headers"]])
+      [grub_emu_pci_excuse=["need libpciaccess headers"]])
 [fi]
 
 if test x"$grub_emu_pci_excuse" = x ; then
index 996f642455fa043f0488665fcb26d30f382cc5c4..5b5f5f0dfa4d7bc432ce2cc1c3e523992d97f10d 100644 (file)
@@ -67,4 +67,20 @@ grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data)
   grub_outb (data, GRUB_PCI_DATA_REG + (addr & 3));
 }
 
+static inline void *
+grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)),
+                          grub_addr_t base,
+                          grub_size_t size __attribute__ ((unused)))
+{
+  return (void *) base;
+}
+
+static inline void
+grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)),
+                            void *mem __attribute__ ((unused)),
+                            grub_size_t size __attribute__ ((unused)))
+{
+}
+
+
 #endif /* GRUB_CPU_PCI_H */
index 5ce612fee1d75d161f67676f8e881e3db789145b..36d47e5c86787b6a0594644d29185733a9a4d561 100644 (file)
@@ -19,9 +19,9 @@
 #ifndef        GRUB_PCIUTILS_H
 #define        GRUB_PCIUTILS_H 1
 
-#include <pci/pci.h>
+#include <pciaccess.h>
 
-typedef struct pci_dev *grub_pci_device_t;
+typedef struct pci_device *grub_pci_device_t;
 
 static inline int
 grub_pci_get_bus (grub_pci_device_t dev)
@@ -52,37 +52,52 @@ typedef struct grub_pci_address grub_pci_address_t;
 static inline grub_uint32_t
 grub_pci_read (grub_pci_address_t addr)
 {
-  return pci_read_long (addr.dev, addr.pos);
+  grub_uint32_t ret;
+  pci_device_cfg_read_u32 (addr.dev, &ret, addr.pos);
+  return ret;
 }
 
 static inline grub_uint16_t
 grub_pci_read_word (grub_pci_address_t addr)
 {
-  return pci_read_word (addr.dev, addr.pos);
+  grub_uint16_t ret;
+  pci_device_cfg_read_u16 (addr.dev, &ret, addr.pos);
+  return ret;
 }
 
 static inline grub_uint8_t
 grub_pci_read_byte (grub_pci_address_t addr)
 {
-  return pci_read_byte (addr.dev, addr.pos);
+  grub_uint8_t ret;
+  pci_device_cfg_read_u8 (addr.dev, &ret, addr.pos);
+  return ret;
 }
 
 static inline void
 grub_pci_write (grub_pci_address_t addr, grub_uint32_t data)
 {
-  pci_write_long (addr.dev, addr.pos, data);
+  pci_device_cfg_write_u32 (addr.dev, data, addr.pos);
 }
 
 static inline void
 grub_pci_write_word (grub_pci_address_t addr, grub_uint16_t data)
 {
-  pci_write_word (addr.dev, addr.pos, data);
+  pci_device_cfg_write_u16 (addr.dev, data, addr.pos);
 }
 
 static inline void
 grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data)
 {
-  pci_write_byte (addr.dev, addr.pos, data);
+  pci_device_cfg_write_u8 (addr.dev, data, addr.pos);
 }
 
+void *
+grub_pci_device_map_range (grub_pci_device_t dev, grub_addr_t base,
+                          grub_size_t size);
+
+void
+grub_pci_device_unmap_range (grub_pci_device_t dev, void *mem,
+                            grub_size_t size);
+
+
 #endif /* GRUB_PCIUTILS_H */
index e1706814929609e2dd09b261f17da0197fc2bba2..8915068aaaed6daadb71e4ac4b18730cb265926a 100644 (file)
@@ -19,8 +19,7 @@
 
 #include <grub/pci.h>
 #include <grub/dl.h>
-
-struct pci_access *acc = 0;
+#include <grub/util/misc.h>
 
 grub_pci_address_t
 grub_pci_make_address (grub_pci_device_t dev, int reg)
@@ -34,19 +33,44 @@ grub_pci_make_address (grub_pci_device_t dev, int reg)
 void
 grub_pci_iterate (grub_pci_iteratefunc_t hook)
 {
-  grub_pci_device_t cur;
-  for (cur = acc->devices; cur; cur = cur->next)
-    hook (cur, cur->vendor_id|(cur->device_id << 16));
+  struct pci_device_iterator *iter;
+  struct pci_slot_match slot;
+  struct pci_device *dev;
+  slot.domain = PCI_MATCH_ANY;
+  slot.bus = PCI_MATCH_ANY;
+  slot.dev = PCI_MATCH_ANY;
+  slot.func = PCI_MATCH_ANY;
+  iter = pci_slot_match_iterator_create (&slot);
+  while ((dev = pci_device_next (iter)))
+    hook (dev, dev->vendor_id | (dev->device_id << 16));
+  pci_iterator_destroy (iter);
+}
+
+void *
+grub_pci_device_map_range (grub_pci_device_t dev, grub_addr_t base,
+                          grub_size_t size)
+{
+  void *addr;
+  int err;
+  err = pci_device_map_range(dev, base, size, PCI_DEV_MAP_FLAG_WRITABLE, &addr);
+  if (err)
+    grub_util_error ("mapping 0x%x failed (error %d)\n", base, err);
+  return addr;
+}
+
+void
+grub_pci_device_unmap_range (grub_pci_device_t dev, void *mem,
+                            grub_size_t size)
+{
+  pci_device_unmap_range (dev, mem, size);
 }
 
 GRUB_MOD_INIT (pci)
 {
-  acc = pci_alloc ();
-  pci_init (acc);
-  pci_scan_bus (acc);
+  pci_system_init ();
 }
 
 GRUB_MOD_FINI (pci)
 {
-  pci_cleanup (acc);
+  pci_system_cleanup ();
 }