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