summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>2018-08-10 12:28:49 +0200
committerMartin Mares <mj@ucw.cz>2018-08-10 12:28:49 +0200
commitd0458b46689dbab16de5f6e45faae15f955d39fb (patch)
treea47f8dc2078ce87031f88d4e6929f743989c5b8d
parent6b056c8ec7ae4b2d49b80d701409eff9f14ce7cc (diff)
downloadpciutils-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.c39
-rw-r--r--lspci.man3
2 files changed, 38 insertions, 4 deletions
diff --git a/lspci.c b/lspci.c
index 241b57a..701f50d 100644
--- a/lspci.c
+++ b/lspci.c
@@ -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();
diff --git a/lspci.man b/lspci.man
index 35b3620..78b5c96 100644
--- a/lspci.man
+++ b/lspci.man
@@ -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