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