1 /* 2 * The PCI Utilities -- List All PCI Devices 3 * 4 * Copyright (c) 1997--2018 Martin Mares <[email protected]> 5 * 6 * Can be freely distributed and used under the terms of the GNU GPL v2+ 7 * 8 * SPDX-License-Identifier: GPL-2.0-or-later 9 */ 10 11 #define PCIUTILS_LSPCI 12 #include "pciutils.h" 13 14 /* 15 * If we aren't being compiled by GCC, use xmalloc() instead of alloca(). 16 * This increases our memory footprint, but only slightly since we don't 17 * use alloca() much. 18 */ 19 #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__DragonFly__) || defined (__DJGPP__) 20 /* alloca() is defined in stdlib.h */ 21 #elif defined(__GNUC__) && !defined(PCI_OS_WINDOWS) 22 #include <alloca.h> 23 #else 24 #undef alloca 25 #define alloca xmalloc 26 #endif 27 28 /*** Options ***/ 29 30 extern int verbose; 31 extern struct pci_filter filter; 32 extern char *opt_pcimap; 33 34 /*** PCI devices and access to their config space ***/ 35 36 struct device { 37 struct device *next; 38 struct pci_dev *dev; 39 /* Bus topology calculated by grow_tree() */ 40 struct device *bus_next; 41 struct bus *parent_bus; 42 struct bridge *bridge; 43 /* Cache */ 44 int no_config_access; 45 unsigned int config_cached, config_bufsize; 46 byte *config; /* Cached configuration space data */ 47 byte *present; /* Maps which configuration bytes are present */ 48 }; 49 50 extern struct device *first_dev; 51 extern struct pci_access *pacc; 52 53 struct device *scan_device(struct pci_dev *p); 54 void show_device(struct device *d); 55 56 int config_fetch(struct device *d, unsigned int pos, unsigned int len); 57 u32 get_conf_long(struct device *d, unsigned int pos); 58 word get_conf_word(struct device *d, unsigned int pos); 59 byte get_conf_byte(struct device *d, unsigned int pos); 60 61 /* ls-vpd.c */ 62 63 void cap_vpd(struct device *d); 64 65 /* ls-caps.c */ 66 67 void show_caps(struct device *d, int where); 68 69 /* ls-ecaps.c */ 70 71 void show_ext_caps(struct device *d, int type); 72 73 /* ls-caps-vendor.c */ 74 75 void show_vendor_caps(struct device *d, int where, int cap); 76 77 /* ls-kernel.c */ 78 79 void show_kernel_machine(struct device *d UNUSED); 80 void show_kernel(struct device *d UNUSED); 81 void show_kernel_cleanup(void); 82 83 /* ls-tree.c */ 84 85 struct bridge { 86 struct bridge *chain; /* Single-linked list of bridges */ 87 struct bridge *next, *prev, *child; /* Tree of bridges */ 88 struct bus *first_bus, *last_bus; /* List of buses connected to this bridge */ 89 unsigned int domain; 90 unsigned int primary, secondary, subordinate; /* Bus numbers */ 91 struct device *br_dev; 92 }; 93 94 struct bus { 95 unsigned int domain; 96 unsigned int number; 97 struct bus *sibling; 98 struct bridge *parent_bridge; 99 struct device *first_dev, **last_dev; 100 }; 101 102 extern struct bridge host_bridge; 103 104 void grow_tree(void); 105 void show_forest(struct pci_filter *filter); 106 107 /* ls-map.c */ 108 109 void map_the_bus(void); 110