diff options
author | Martin Mares <mj@ucw.cz> | 2018-08-10 12:28:49 +0200 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 2018-08-10 12:28:49 +0200 |
commit | d0458b46689dbab16de5f6e45faae15f955d39fb (patch) | |
tree | a47f8dc2078ce87031f88d4e6929f743989c5b8d | |
parent | 6b056c8ec7ae4b2d49b80d701409eff9f14ce7cc (diff) | |
download | pciutils-d0458b46689dbab16de5f6e45faae15f955d39fb.tar.gz |
Added an option for displaying bus paths
Originally implemented by Matthew Wilcox as a stand-alone feature.
I modified it to make use of bus topology calculated by ls-tree.c.
-rw-r--r-- | lspci.c | 39 | ||||
-rw-r--r-- | lspci.man | 3 |
2 files changed, 38 insertions, 4 deletions
@@ -1,7 +1,7 @@ /* * The PCI Utilities -- List All PCI Devices * - * Copyright (c) 1997--2016 Martin Mares <mj@ucw.cz> + * Copyright (c) 1997--2018 Martin Mares <mj@ucw.cz> * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -19,6 +19,7 @@ int verbose; /* Show detailed information */ static int opt_hex; /* Show contents of config space as hexadecimal numbers */ struct pci_filter filter; /* Device filter */ static int opt_tree; /* Show bus tree */ +static int opt_path; /* Show bridge path */ static int opt_machine; /* Generate machine-readable output */ static int opt_map_mode; /* Bus mapping mode enabled */ static int opt_domains; /* Show domain numbers (0=disabled, 1=auto-detected, 2=requested) */ @@ -29,7 +30,7 @@ char *opt_pcimap; /* Override path to Linux modules.pcimap */ const char program_name[] = "lspci"; -static char options[] = "nvbxs:d:ti:mgp:qkMDQ" GENERIC_OPTIONS ; +static char options[] = "nvbxs:d:tPi:mgp:qkMDQ" GENERIC_OPTIONS ; static char help_msg[] = "Usage: lspci [<switches>]\n" @@ -48,6 +49,7 @@ static char help_msg[] = "-xxxx\t\tShow hex-dump of the 4096-byte extended config space (root only)\n" "-b\t\tBus-centric view (addresses and IRQ's as seen by the bus)\n" "-D\t\tAlways show domain numbers\n" +"-P\t\tDisplay bus path in addition to bus and device number\n" "\n" "Resolving of device ID's to names:\n" "-n\t\tShow numeric ID's\n" @@ -248,13 +250,33 @@ sort_them(void) /*** Normal output ***/ static void +show_slot_path(struct device *d) +{ + struct pci_dev *p = d->dev; + + if (opt_path) + { + struct bus *bus = d->parent_bus; + struct bridge *br = bus->parent_bridge; + + if (br && br->br_dev) + { + show_slot_path(br->br_dev); + printf("/%02x.%d", p->dev, p->func); + return; + } + } + printf("%02x:%02x.%d", p->bus, p->dev, p->func); +} + +static void show_slot_name(struct device *d) { struct pci_dev *p = d->dev; if (!opt_machine ? opt_domains : (p->domain || opt_domains >= 2)) printf("%04x:", p->domain); - printf("%02x:%02x.%d", p->bus, p->dev, p->func); + show_slot_path(d); } void @@ -951,6 +973,8 @@ show(void) { struct device *d; + if (opt_path) + grow_tree(); for (d=first_dev; d; d=d->next) show_device(d); } @@ -996,6 +1020,9 @@ main(int argc, char **argv) case 'x': opt_hex++; break; + case 'P': + opt_path++; + break; case 't': opt_tree++; break; @@ -1052,7 +1079,11 @@ main(int argc, char **argv) pci_init(pacc); if (opt_map_mode) - map_the_bus(); + { + if (opt_path) + die("Bus paths cannot be shown in bus mapping mode"); + map_the_bus(); + } else { scan_devices(); @@ -95,6 +95,9 @@ PCI bus instead of as seen by the kernel. .B -D Always show PCI domain numbers. By default, lspci suppresses them on machines which have only domain 0. +.TP +.B -P +Identify PCI devices by path through each bridge, instead of by bus number. .SS Options to control resolving ID's to names .TP |