OSDN Git Service

Files missed (for reasons I still don't understand) on the previous
authorIan Romanick <idr@umwelt.(none)>
Fri, 7 Jul 2006 00:18:14 +0000 (17:18 -0700)
committerIan Romanick <idr@umwelt.(none)>
Fri, 7 Jul 2006 00:18:14 +0000 (17:18 -0700)
commit.  REALLY add support for querying bridge information.  Bump to
version 0.5.0.

configure.ac
include/pciaccess.h
src/Makefile.am
src/linux_sysfs.c
src/pciaccess_private.h
src/scanpci.c

index c901895..a968291 100644 (file)
@@ -41,7 +41,7 @@ dnl refers to ${prefix}.  Thus we have to use `eval' twice.
 
 AC_PREREQ([2.57])
 
-AC_INIT(libpciaccess, 0.4.0, [none yet], libpciaccess)
+AC_INIT(libpciaccess, 0.5.0, [none yet], libpciaccess)
 AM_INIT_AUTOMAKE([dist-bzip2])
 AM_MAINTAINER_MODE
 
index 97a19a7..c9f46b6 100644 (file)
@@ -51,6 +51,12 @@ int pci_device_probe( struct pci_device * dev );
 
 const struct pci_agp_info * pci_device_get_agp_info( struct pci_device * dev );
 
+const struct pci_bridge_info * pci_device_get_bridge_info(
+    struct pci_device * dev );
+
+const struct pci_pcmcia_bridge_info * pci_device_get_pcmcia_bridge_info(
+    struct pci_device * dev );
+
 int pci_system_init( void );
 
 void pci_system_cleanup( void );
@@ -318,4 +324,58 @@ struct pci_agp_info {
     uint8_t    max_requests;
 };
 
+/**
+ * Description of a PCI-to-PCI bridge device.
+ * 
+ * \sa pci_device_get_bridge_info
+ */
+struct pci_bridge_info {
+    uint8_t    primary_bus;
+    uint8_t    secondary_bus;
+    uint8_t    subordinate_bus;
+    uint8_t    secondary_latency_timer;
+
+    uint8_t     io_type;
+    uint8_t     mem_type;
+    uint8_t     prefetch_mem_type;
+
+    uint16_t    secondary_status;
+    uint16_t    bridge_control;
+
+    uint32_t    io_base;
+    uint32_t    io_limit;
+
+    uint32_t    mem_base;
+    uint32_t    mem_limit;
+
+    uint64_t    prefetch_mem_base;
+    uint64_t    prefetch_mem_limit;
+};
+
+/**
+ * Description of a PCI-to-PCMCIA bridge device.
+ * 
+ * \sa pci_device_get_pcmcia_bridge_info
+ */
+struct pci_pcmcia_bridge_info {
+    uint8_t    primary_bus;
+    uint8_t    card_bus;
+    uint8_t    subordinate_bus;
+    uint8_t    cardbus_latency_timer;
+    
+    uint16_t    secondary_status;
+    uint16_t    bridge_control;
+
+    struct {
+       uint32_t    base;
+       uint32_t    limit;
+    } io[2];
+
+    struct {
+       uint32_t    base;
+       uint32_t    limit;
+    } mem[2];
+
+};
+
 #endif /* PCIACCESS_H */
index 20b864f..ee4d7d2 100644 (file)
@@ -23,7 +23,8 @@
 
 lib_LTLIBRARIES = libpciaccess.la
 
-libpciaccess_la_SOURCES = common_iterator.c \
+libpciaccess_la_SOURCES = common_bridge.c \
+       common_iterator.c \
        common_init.c \
        common_interface.c \
        common_capability.c \
@@ -34,7 +35,7 @@ INCLUDES = -I$(top_srcdir)/include
 
 libpciaccess_la_LIBADD = @PCIACCESS_LIBS@
 
-libpciaccess_la_LDFLAGS = -version-number 0:4:1 -no-undefined
+libpciaccess_la_LDFLAGS = -version-number 0:5:0 -no-undefined
 
 libpciaccessincludedir = $(includedir)
 libpciaccessinclude_HEADERS = \
index cc839c5..abb3f1e 100644 (file)
@@ -179,6 +179,8 @@ pci_device_linux_sysfs_probe( struct pci_device * dev )
 
     err = pci_device_linux_sysfs_read( dev, config, 0, 256, & bytes );
     if ( bytes >= 64 ) {
+       struct pci_device_private *priv = (struct pci_device_private *) dev;
+
        dev->vendor_id = (uint16_t)config[0] + ((uint16_t)config[1] << 8);
        dev->device_id = (uint16_t)config[2] + ((uint16_t)config[3] << 8);
        dev->device_class = (uint32_t)config[9] + ((uint32_t)config[10] << 8)
@@ -188,6 +190,8 @@ pci_device_linux_sysfs_probe( struct pci_device * dev )
        dev->subdevice_id = (uint16_t)config[46] + ((uint16_t)config[47] << 8);
        dev->irq = config[60];
 
+       priv->header_type = config[14];
+
 
        /* The PCI config registers can be used to obtain information
         * about the memory and I/O regions for the device.  However,
index bc35f7f..700036f 100644 (file)
@@ -53,12 +53,25 @@ struct pci_device_private {
     struct pci_device  base;
     const char * device_string;
     
+    uint8_t header_type;
+
     /**
      * \name PCI Capabilities
      */
     /*@{*/
     const struct pci_agp_info * agp;   /**< AGP capability information. */
     /*@}*/
+    
+    /**
+     * \name Bridge information.
+     */
+    /*@{*/
+    union {
+       struct pci_bridge_info * pci;
+       struct pci_pcmcia_bridge_info * pcmcia;
+    } bridge;
+    /*@}*/
+    
 };
 
 
index adec55d..0d2d604 100644 (file)
 #include "pciaccess.h"
 
 
+static void
+print_pci_bridge( const struct pci_bridge_info * info )
+{
+    printf( "  Bus: primary=%02x, secondary=%02x, subordinate=%02x, "
+           "sec-latency=%u\n",
+           info->primary_bus,
+           info->secondary_bus,
+           info->subordinate_bus,
+           info->secondary_latency_timer );
+    printf( "  I/O behind bridge: %08x-%08x\n",
+           info->io_base,
+           info->io_limit );
+    printf( "  Memory behind bridge: %08x-%08x\n",
+           info->mem_base,
+           info->mem_limit );
+    printf( "  Prefetchable memory behind bridge: %08llx-%08llx\n",
+           info->prefetch_mem_base,
+           info->prefetch_mem_limit );
+}
+
 void
 print_pci_device( struct pci_device * dev, int verbose )
 {
@@ -136,6 +156,17 @@ print_pci_device( struct pci_device * dev, int verbose )
                min_grant,
                int_pin,
                dev->irq );
+
+       if ( (dev->device_class >> 16) == 0x06 ) {
+           const void * info;
+
+           if ( (info = pci_device_get_bridge_info(dev)) != NULL ) {
+               print_pci_bridge( (const struct pci_bridge_info *) info );
+           }
+           else if ( (info = pci_device_get_pcmcia_bridge_info(dev)) != NULL ) {
+               /* Nothing yet. */
+           }
+       }
     }
 }