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
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 );
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 */
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 \
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 = \
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)
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,
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;
+ /*@}*/
+
};
#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 )
{
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. */
+ }
+ }
}
}