xref: /pciutils/lspci.h (revision 7d23054d)
1c7a34993SMartin Mares /*
2c7a34993SMartin Mares  *	The PCI Utilities -- List All PCI Devices
3c7a34993SMartin Mares  *
46b056c8eSMartin Mares  *	Copyright (c) 1997--2018 Martin Mares <[email protected]>
5c7a34993SMartin Mares  *
6*61829219SMartin Mares  *	Can be freely distributed and used under the terms of the GNU GPL v2+
7*61829219SMartin Mares  *
8*61829219SMartin Mares  *	SPDX-License-Identifier: GPL-2.0-or-later
9c7a34993SMartin Mares  */
10c7a34993SMartin Mares 
11c7a34993SMartin Mares #define PCIUTILS_LSPCI
12c7a34993SMartin Mares #include "pciutils.h"
13c7a34993SMartin Mares 
14c7a34993SMartin Mares /*
15c7a34993SMartin Mares  *  If we aren't being compiled by GCC, use xmalloc() instead of alloca().
16c7a34993SMartin Mares  *  This increases our memory footprint, but only slightly since we don't
17c7a34993SMartin Mares  *  use alloca() much.
18c7a34993SMartin Mares  */
195c5ce192SRudolf Marek #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__DragonFly__) || defined (__DJGPP__)
20c7a34993SMartin Mares /* alloca() is defined in stdlib.h */
21c7a34993SMartin Mares #elif defined(__GNUC__) && !defined(PCI_OS_WINDOWS)
22c7a34993SMartin Mares #include <alloca.h>
23c7a34993SMartin Mares #else
24c7a34993SMartin Mares #undef alloca
25c7a34993SMartin Mares #define alloca xmalloc
26c7a34993SMartin Mares #endif
27c7a34993SMartin Mares 
28c7a34993SMartin Mares /*** Options ***/
29c7a34993SMartin Mares 
30c7a34993SMartin Mares extern int verbose;
31c7a34993SMartin Mares extern struct pci_filter filter;
32c7a34993SMartin Mares extern char *opt_pcimap;
33c7a34993SMartin Mares 
34c7a34993SMartin Mares /*** PCI devices and access to their config space ***/
35c7a34993SMartin Mares 
36c7a34993SMartin Mares struct device {
37c7a34993SMartin Mares   struct device *next;
38c7a34993SMartin Mares   struct pci_dev *dev;
396b056c8eSMartin Mares   /* Bus topology calculated by grow_tree() */
406b056c8eSMartin Mares   struct device *bus_next;
416b056c8eSMartin Mares   struct bus *parent_bus;
426b056c8eSMartin Mares   struct bridge *bridge;
436b056c8eSMartin Mares   /* Cache */
44832b07a8SPali Rohár   int no_config_access;
45c7a34993SMartin Mares   unsigned int config_cached, config_bufsize;
46c7a34993SMartin Mares   byte *config;				/* Cached configuration space data */
47c7a34993SMartin Mares   byte *present;			/* Maps which configuration bytes are present */
48c7a34993SMartin Mares };
49c7a34993SMartin Mares 
50c7a34993SMartin Mares extern struct device *first_dev;
51c7a34993SMartin Mares extern struct pci_access *pacc;
52c7a34993SMartin Mares 
53c7a34993SMartin Mares struct device *scan_device(struct pci_dev *p);
54c7a34993SMartin Mares void show_device(struct device *d);
55c7a34993SMartin Mares 
56c7a34993SMartin Mares int config_fetch(struct device *d, unsigned int pos, unsigned int len);
57c7a34993SMartin Mares u32 get_conf_long(struct device *d, unsigned int pos);
58c7a34993SMartin Mares word get_conf_word(struct device *d, unsigned int pos);
59c7a34993SMartin Mares byte get_conf_byte(struct device *d, unsigned int pos);
60c7a34993SMartin Mares 
61c7a34993SMartin Mares /* ls-vpd.c */
62c7a34993SMartin Mares 
63c7a34993SMartin Mares void cap_vpd(struct device *d);
64c7a34993SMartin Mares 
65c7a34993SMartin Mares /* ls-caps.c */
66c7a34993SMartin Mares 
6721510591SMatthew Wilcox void show_caps(struct device *d, int where);
68c7a34993SMartin Mares 
69c7a34993SMartin Mares /* ls-ecaps.c */
70c7a34993SMartin Mares 
71a1492b88SBjorn Helgaas void show_ext_caps(struct device *d, int type);
72c7a34993SMartin Mares 
737ff8a323SGerd Hoffmann /* ls-caps-vendor.c */
747ff8a323SGerd Hoffmann 
757ff8a323SGerd Hoffmann void show_vendor_caps(struct device *d, int where, int cap);
767ff8a323SGerd Hoffmann 
77c7a34993SMartin Mares /* ls-kernel.c */
78c7a34993SMartin Mares 
79c7a34993SMartin Mares void show_kernel_machine(struct device *d UNUSED);
80c7a34993SMartin Mares void show_kernel(struct device *d UNUSED);
8117ec7e70SMartin Mares void show_kernel_cleanup(void);
82c7a34993SMartin Mares 
83c7a34993SMartin Mares /* ls-tree.c */
84c7a34993SMartin Mares 
856b056c8eSMartin Mares struct bridge {
866b056c8eSMartin Mares   struct bridge *chain;			/* Single-linked list of bridges */
876662052fSPali Rohár   struct bridge *next, *prev, *child;	/* Tree of bridges */
88b1cff3a4SPali Rohár   struct bus *first_bus, *last_bus;	/* List of buses connected to this bridge */
896b056c8eSMartin Mares   unsigned int domain;
906b056c8eSMartin Mares   unsigned int primary, secondary, subordinate;	/* Bus numbers */
916b056c8eSMartin Mares   struct device *br_dev;
926b056c8eSMartin Mares };
936b056c8eSMartin Mares 
946b056c8eSMartin Mares struct bus {
956b056c8eSMartin Mares   unsigned int domain;
966b056c8eSMartin Mares   unsigned int number;
976b056c8eSMartin Mares   struct bus *sibling;
986b056c8eSMartin Mares   struct bridge *parent_bridge;
996b056c8eSMartin Mares   struct device *first_dev, **last_dev;
1006b056c8eSMartin Mares };
1016b056c8eSMartin Mares 
1026b056c8eSMartin Mares extern struct bridge host_bridge;
1036b056c8eSMartin Mares 
1046b056c8eSMartin Mares void grow_tree(void);
105888ddf0eSGera Kazakov void show_forest(struct pci_filter *filter);
106c7a34993SMartin Mares 
107c7a34993SMartin Mares /* ls-map.c */
108c7a34993SMartin Mares 
109c7a34993SMartin Mares void map_the_bus(void);
110