]> git.ipfire.org Git - thirdparty/pciutils.git/blobdiff - lib/pci.h
Add device-tree node path to the verbose output
[thirdparty/pciutils.git] / lib / pci.h
index 8f4773fbeb429cb4e8955b5e0a5c48926b926ade..3abb5d5cc9f0d441db2b3fd9bfd014b2e36fbe35 100644 (file)
--- a/lib/pci.h
+++ b/lib/pci.h
@@ -1,7 +1,7 @@
 /*
  *     The PCI Library
  *
- *     Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
+ *     Copyright (c) 1997--2017 Martin Mares <mj@ucw.cz>
  *
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
@@ -16,7 +16,7 @@
 #include "header.h"
 #include "types.h"
 
-#define PCI_LIB_VERSION 0x030000
+#define PCI_LIB_VERSION 0x030506
 
 #ifndef PCI_ABI
 #define PCI_ABI
@@ -29,7 +29,7 @@
 struct pci_methods;
 
 enum pci_access_type {
-  /* Known access methods, remember to update access.c as well */
+  /* Known access methods, remember to update init.c as well */
   PCI_ACCESS_AUTO,                     /* Autodetection */
   PCI_ACCESS_SYS_BUS_PCI,              /* Linux /sys/bus/pci */
   PCI_ACCESS_PROC_BUS_PCI,             /* Linux /proc/bus/pci */
@@ -40,6 +40,8 @@ enum pci_access_type {
   PCI_ACCESS_NBSD_LIBPCI,              /* NetBSD libpci */
   PCI_ACCESS_OBSD_DEVICE,              /* OpenBSD /dev/pci */
   PCI_ACCESS_DUMP,                     /* Dump file */
+  PCI_ACCESS_DARWIN,                   /* Darwin */
+  PCI_ACCESS_SYLIXOS_DEVICE,   /* SylixOS pci */
   PCI_ACCESS_MAX
 };
 
@@ -72,10 +74,13 @@ struct pci_access {
   struct id_bucket *current_id_bucket;
   int id_load_failed;
   int id_cache_status;                 /* 0=not read, 1=read, 2=dirty */
-  int fd;                              /* proc: fd */
-  int fd_rw;                           /* proc: fd opened read-write */
-  struct pci_dev *cached_dev;          /* proc: device the fd is for */
-  int fd_pos;                          /* proc: current position */
+  struct udev *id_udev;                        /* names-hwdb.c */
+  struct udev_hwdb *id_udev_hwdb;
+  int fd;                              /* proc/sys: fd for config space */
+  int fd_rw;                           /* proc/sys: fd opened read-write */
+  int fd_pos;                          /* proc/sys: current position */
+  int fd_vpd;                          /* sys: fd for VPD */
+  struct pci_dev *cached_dev;          /* proc/sys: device the fds are for */
 };
 
 /* Initialize PCI access */
@@ -115,7 +120,8 @@ struct pci_param *pci_walk_params(struct pci_access *acc, struct pci_param *prev
 
 struct pci_dev {
   struct pci_dev *next;                        /* Next device in the chain */
-  u16 domain;                          /* PCI domain (host bridge) */
+  u16 domain_16;                       /* 16-bit version of the PCI domain for backward compatibility */
+                                       /* 0xffff if the real domain doesn't fit in 16 bits */
   u8 bus, dev, func;                   /* Bus inside domain, device and function */
 
   /* These fields are set by pci_fill_info() */
@@ -123,10 +129,19 @@ struct pci_dev {
   u16 vendor_id, device_id;            /* Identity of the device */
   u16 device_class;                    /* PCI device class */
   int irq;                             /* IRQ number */
-  pciaddr_t base_addr[6];              /* Base addresses */
+  pciaddr_t base_addr[6];              /* Base addresses including flags in lower bits */
   pciaddr_t size[6];                   /* Region sizes */
   pciaddr_t rom_base_addr;             /* Expansion ROM base address */
   pciaddr_t rom_size;                  /* Expansion ROM size */
+  struct pci_cap *first_cap;           /* List of capabilities */
+  char *phy_slot;                      /* Physical slot */
+  char *module_alias;                  /* Linux kernel module alias */
+  char *label;                         /* Device name as exported by BIOS */
+  char *dt_node;                       /* Path to the device-tree node for this device */
+  int numa_node;                       /* NUMA node */
+  pciaddr_t flags[6];                  /* PCI_IORESOURCE_* flags for regions */
+  pciaddr_t rom_flags;                 /* PCI_IORESOURCE_* flags for expansion ROM */
+  int domain;                          /* PCI domain (host bridge) */
 
   /* Fields used internally: */
   struct pci_access *access;
@@ -134,16 +149,18 @@ struct pci_dev {
   u8 *cache;                           /* Cached config registers */
   int cache_len;
   int hdrtype;                         /* Cached low 7 bits of header type, -1 if unknown */
-  void *aux;                           /* Auxillary data */
+  void *aux;                           /* Auxiliary data */
 };
 
 #define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3)
 #define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf)
+#define PCI_ADDR_FLAG_MASK 0xf
 
 u8 pci_read_byte(struct pci_dev *, int pos) PCI_ABI; /* Access to configuration space */
 u16 pci_read_word(struct pci_dev *, int pos) PCI_ABI;
 u32 pci_read_long(struct pci_dev *, int pos) PCI_ABI;
 int pci_read_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
+int pci_read_vpd(struct pci_dev *d, int pos, u8 *buf, int len) PCI_ABI;
 int pci_write_byte(struct pci_dev *, int pos, u8 data) PCI_ABI;
 int pci_write_word(struct pci_dev *, int pos, u16 data) PCI_ABI;
 int pci_write_long(struct pci_dev *, int pos, u32 data) PCI_ABI;
@@ -151,23 +168,48 @@ int pci_write_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;
 
 int pci_fill_info(struct pci_dev *, int flags) PCI_ABI; /* Fill in device information */
 
-#define PCI_FILL_IDENT         1
-#define PCI_FILL_IRQ           2
-#define PCI_FILL_BASES         4
-#define PCI_FILL_ROM_BASE      8
-#define PCI_FILL_SIZES         16
-#define PCI_FILL_CLASS         32
-#define PCI_FILL_RESCAN                0x10000
+#define PCI_FILL_IDENT         0x0001
+#define PCI_FILL_IRQ           0x0002
+#define PCI_FILL_BASES         0x0004
+#define PCI_FILL_ROM_BASE      0x0008
+#define PCI_FILL_SIZES         0x0010
+#define PCI_FILL_CLASS         0x0020
+#define PCI_FILL_CAPS          0x0040
+#define PCI_FILL_EXT_CAPS      0x0080
+#define PCI_FILL_PHYS_SLOT     0x0100
+#define PCI_FILL_MODULE_ALIAS  0x0200
+#define PCI_FILL_LABEL         0x0400
+#define PCI_FILL_NUMA_NODE     0x0800
+#define PCI_FILL_IO_FLAGS      0x1000
+#define PCI_FILL_DT_NODE       0x2000
+#define PCI_FILL_RESCAN                0x00010000
 
 void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI;
 
+/*
+ *     Capabilities
+ */
+
+struct pci_cap {
+  struct pci_cap *next;
+  u16 id;                              /* PCI_CAP_ID_xxx */
+  u16 type;                            /* PCI_CAP_xxx */
+  unsigned int addr;                   /* Position in the config space */
+};
+
+#define PCI_CAP_NORMAL         1       /* Traditional PCI capabilities */
+#define PCI_CAP_EXTENDED       2       /* PCIe extended capabilities */
+
+struct pci_cap *pci_find_cap(struct pci_dev *, unsigned int id, unsigned int type) PCI_ABI;
+
 /*
  *     Filters
  */
 
 struct pci_filter {
   int domain, bus, slot, func;                 /* -1 = ANY */
-  int vendor, device;
+  int vendor, device, device_class;
+  int rfu[3];
 };
 
 void pci_filter_init(struct pci_access *, struct pci_filter *) PCI_ABI;
@@ -211,6 +253,7 @@ enum pci_lookup_mode {
   PCI_LOOKUP_SKIP_LOCAL = 0x100000,    /* Do not consult local database */
   PCI_LOOKUP_CACHE = 0x200000,         /* Consult the local cache before using DNS */
   PCI_LOOKUP_REFRESH_CACHE = 0x400000, /* Forget all previously cached entries, but still allow updating the cache */
+  PCI_LOOKUP_NO_HWDB = 0x800000,       /* Do not ask udev's hwdb */
 };
 
 #endif