xref: /aosp_15_r20/external/pciutils/lspci.c (revision c2e0c6b56a71da9abe8df5c8348fb3eb5c2c9251)
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--2020 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 #include <stdio.h>
12*c2e0c6b5SAndroid Build Coastguard Worker #include <string.h>
13*c2e0c6b5SAndroid Build Coastguard Worker #include <stdlib.h>
14*c2e0c6b5SAndroid Build Coastguard Worker #include <stdarg.h>
15*c2e0c6b5SAndroid Build Coastguard Worker 
16*c2e0c6b5SAndroid Build Coastguard Worker #include "lspci.h"
17*c2e0c6b5SAndroid Build Coastguard Worker 
18*c2e0c6b5SAndroid Build Coastguard Worker /* Options */
19*c2e0c6b5SAndroid Build Coastguard Worker 
20*c2e0c6b5SAndroid Build Coastguard Worker int verbose;				/* Show detailed information */
21*c2e0c6b5SAndroid Build Coastguard Worker static int opt_hex;			/* Show contents of config space as hexadecimal numbers */
22*c2e0c6b5SAndroid Build Coastguard Worker struct pci_filter filter;		/* Device filter */
23*c2e0c6b5SAndroid Build Coastguard Worker static int opt_filter;			/* Any filter was given */
24*c2e0c6b5SAndroid Build Coastguard Worker static int opt_tree;			/* Show bus tree */
25*c2e0c6b5SAndroid Build Coastguard Worker static int opt_path;			/* Show bridge path */
26*c2e0c6b5SAndroid Build Coastguard Worker static int opt_machine;			/* Generate machine-readable output */
27*c2e0c6b5SAndroid Build Coastguard Worker static int opt_map_mode;		/* Bus mapping mode enabled */
28*c2e0c6b5SAndroid Build Coastguard Worker static int opt_domains;			/* Show domain numbers (0=disabled, 1=auto-detected, 2=requested) */
29*c2e0c6b5SAndroid Build Coastguard Worker static int opt_kernel;			/* Show kernel drivers */
30*c2e0c6b5SAndroid Build Coastguard Worker static int opt_query_dns;		/* Query the DNS (0=disabled, 1=enabled, 2=refresh cache) */
31*c2e0c6b5SAndroid Build Coastguard Worker static int opt_query_all;		/* Query the DNS for all entries */
32*c2e0c6b5SAndroid Build Coastguard Worker char *opt_pcimap;			/* Override path to Linux modules.pcimap */
33*c2e0c6b5SAndroid Build Coastguard Worker 
34*c2e0c6b5SAndroid Build Coastguard Worker const char program_name[] = "lspci";
35*c2e0c6b5SAndroid Build Coastguard Worker 
36*c2e0c6b5SAndroid Build Coastguard Worker static char options[] = "nvbxs:d:tPi:mgp:qkMDQ" GENERIC_OPTIONS ;
37*c2e0c6b5SAndroid Build Coastguard Worker 
38*c2e0c6b5SAndroid Build Coastguard Worker static char help_msg[] =
39*c2e0c6b5SAndroid Build Coastguard Worker "Usage: lspci [<switches>]\n"
40*c2e0c6b5SAndroid Build Coastguard Worker "\n"
41*c2e0c6b5SAndroid Build Coastguard Worker "Basic display modes:\n"
42*c2e0c6b5SAndroid Build Coastguard Worker "-mm\t\tProduce machine-readable output (single -m for an obsolete format)\n"
43*c2e0c6b5SAndroid Build Coastguard Worker "-t\t\tShow bus tree\n"
44*c2e0c6b5SAndroid Build Coastguard Worker "\n"
45*c2e0c6b5SAndroid Build Coastguard Worker "Display options:\n"
46*c2e0c6b5SAndroid Build Coastguard Worker "-v\t\tBe verbose (-vv or -vvv for higher verbosity)\n"
47*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_LINUX
48*c2e0c6b5SAndroid Build Coastguard Worker "-k\t\tShow kernel drivers handling each device\n"
49*c2e0c6b5SAndroid Build Coastguard Worker #endif
50*c2e0c6b5SAndroid Build Coastguard Worker "-x\t\tShow hex-dump of the standard part of the config space\n"
51*c2e0c6b5SAndroid Build Coastguard Worker "-xxx\t\tShow hex-dump of the whole config space (dangerous; root only)\n"
52*c2e0c6b5SAndroid Build Coastguard Worker "-xxxx\t\tShow hex-dump of the 4096-byte extended config space (root only)\n"
53*c2e0c6b5SAndroid Build Coastguard Worker "-b\t\tBus-centric view (addresses and IRQ's as seen by the bus)\n"
54*c2e0c6b5SAndroid Build Coastguard Worker "-D\t\tAlways show domain numbers\n"
55*c2e0c6b5SAndroid Build Coastguard Worker "-P\t\tDisplay bridge path in addition to bus and device number\n"
56*c2e0c6b5SAndroid Build Coastguard Worker "-PP\t\tDisplay bus path in addition to bus and device number\n"
57*c2e0c6b5SAndroid Build Coastguard Worker "\n"
58*c2e0c6b5SAndroid Build Coastguard Worker "Resolving of device ID's to names:\n"
59*c2e0c6b5SAndroid Build Coastguard Worker "-n\t\tShow numeric ID's\n"
60*c2e0c6b5SAndroid Build Coastguard Worker "-nn\t\tShow both textual and numeric ID's (names & numbers)\n"
61*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_USE_DNS
62*c2e0c6b5SAndroid Build Coastguard Worker "-q\t\tQuery the PCI ID database for unknown ID's via DNS\n"
63*c2e0c6b5SAndroid Build Coastguard Worker "-qq\t\tAs above, but re-query locally cached entries\n"
64*c2e0c6b5SAndroid Build Coastguard Worker "-Q\t\tQuery the PCI ID database for all ID's via DNS\n"
65*c2e0c6b5SAndroid Build Coastguard Worker #endif
66*c2e0c6b5SAndroid Build Coastguard Worker "\n"
67*c2e0c6b5SAndroid Build Coastguard Worker "Selection of devices:\n"
68*c2e0c6b5SAndroid Build Coastguard Worker "-s [[[[<domain>]:]<bus>]:][<slot>][.[<func>]]\tShow only devices in selected slots\n"
69*c2e0c6b5SAndroid Build Coastguard Worker "-d [<vendor>]:[<device>][:<class>]\t\tShow only devices with specified ID's\n"
70*c2e0c6b5SAndroid Build Coastguard Worker "\n"
71*c2e0c6b5SAndroid Build Coastguard Worker "Other options:\n"
72*c2e0c6b5SAndroid Build Coastguard Worker "-i <file>\tUse specified ID database instead of %s\n"
73*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_LINUX
74*c2e0c6b5SAndroid Build Coastguard Worker "-p <file>\tLook up kernel modules in a given file instead of default modules.pcimap\n"
75*c2e0c6b5SAndroid Build Coastguard Worker #endif
76*c2e0c6b5SAndroid Build Coastguard Worker "-M\t\tEnable `bus mapping' mode (dangerous; root only)\n"
77*c2e0c6b5SAndroid Build Coastguard Worker "\n"
78*c2e0c6b5SAndroid Build Coastguard Worker "PCI access options:\n"
79*c2e0c6b5SAndroid Build Coastguard Worker GENERIC_HELP
80*c2e0c6b5SAndroid Build Coastguard Worker ;
81*c2e0c6b5SAndroid Build Coastguard Worker 
82*c2e0c6b5SAndroid Build Coastguard Worker /*** Our view of the PCI bus ***/
83*c2e0c6b5SAndroid Build Coastguard Worker 
84*c2e0c6b5SAndroid Build Coastguard Worker struct pci_access *pacc;
85*c2e0c6b5SAndroid Build Coastguard Worker struct device *first_dev;
86*c2e0c6b5SAndroid Build Coastguard Worker static int seen_errors;
87*c2e0c6b5SAndroid Build Coastguard Worker static int need_topology;
88*c2e0c6b5SAndroid Build Coastguard Worker 
89*c2e0c6b5SAndroid Build Coastguard Worker int
config_fetch(struct device * d,unsigned int pos,unsigned int len)90*c2e0c6b5SAndroid Build Coastguard Worker config_fetch(struct device *d, unsigned int pos, unsigned int len)
91*c2e0c6b5SAndroid Build Coastguard Worker {
92*c2e0c6b5SAndroid Build Coastguard Worker   unsigned int end = pos+len;
93*c2e0c6b5SAndroid Build Coastguard Worker   int result;
94*c2e0c6b5SAndroid Build Coastguard Worker 
95*c2e0c6b5SAndroid Build Coastguard Worker   while (pos < d->config_bufsize && len && d->present[pos])
96*c2e0c6b5SAndroid Build Coastguard Worker     pos++, len--;
97*c2e0c6b5SAndroid Build Coastguard Worker   while (pos+len <= d->config_bufsize && len && d->present[pos+len-1])
98*c2e0c6b5SAndroid Build Coastguard Worker     len--;
99*c2e0c6b5SAndroid Build Coastguard Worker   if (!len)
100*c2e0c6b5SAndroid Build Coastguard Worker     return 1;
101*c2e0c6b5SAndroid Build Coastguard Worker 
102*c2e0c6b5SAndroid Build Coastguard Worker   if (end > d->config_bufsize)
103*c2e0c6b5SAndroid Build Coastguard Worker     {
104*c2e0c6b5SAndroid Build Coastguard Worker       int orig_size = d->config_bufsize;
105*c2e0c6b5SAndroid Build Coastguard Worker       while (end > d->config_bufsize)
106*c2e0c6b5SAndroid Build Coastguard Worker 	d->config_bufsize *= 2;
107*c2e0c6b5SAndroid Build Coastguard Worker       d->config = xrealloc(d->config, d->config_bufsize);
108*c2e0c6b5SAndroid Build Coastguard Worker       d->present = xrealloc(d->present, d->config_bufsize);
109*c2e0c6b5SAndroid Build Coastguard Worker       memset(d->present + orig_size, 0, d->config_bufsize - orig_size);
110*c2e0c6b5SAndroid Build Coastguard Worker       pci_setup_cache(d->dev, d->config, d->dev->cache_len);
111*c2e0c6b5SAndroid Build Coastguard Worker     }
112*c2e0c6b5SAndroid Build Coastguard Worker   result = pci_read_block(d->dev, pos, d->config + pos, len);
113*c2e0c6b5SAndroid Build Coastguard Worker   if (result)
114*c2e0c6b5SAndroid Build Coastguard Worker     memset(d->present + pos, 1, len);
115*c2e0c6b5SAndroid Build Coastguard Worker   return result;
116*c2e0c6b5SAndroid Build Coastguard Worker }
117*c2e0c6b5SAndroid Build Coastguard Worker 
118*c2e0c6b5SAndroid Build Coastguard Worker struct device *
scan_device(struct pci_dev * p)119*c2e0c6b5SAndroid Build Coastguard Worker scan_device(struct pci_dev *p)
120*c2e0c6b5SAndroid Build Coastguard Worker {
121*c2e0c6b5SAndroid Build Coastguard Worker   struct device *d;
122*c2e0c6b5SAndroid Build Coastguard Worker 
123*c2e0c6b5SAndroid Build Coastguard Worker   if (p->domain && !opt_domains)
124*c2e0c6b5SAndroid Build Coastguard Worker     opt_domains = 1;
125*c2e0c6b5SAndroid Build Coastguard Worker   if (!pci_filter_match(&filter, p) && !need_topology)
126*c2e0c6b5SAndroid Build Coastguard Worker     return NULL;
127*c2e0c6b5SAndroid Build Coastguard Worker   d = xmalloc(sizeof(struct device));
128*c2e0c6b5SAndroid Build Coastguard Worker   memset(d, 0, sizeof(*d));
129*c2e0c6b5SAndroid Build Coastguard Worker   d->dev = p;
130*c2e0c6b5SAndroid Build Coastguard Worker   d->no_config_access = p->no_config_access;
131*c2e0c6b5SAndroid Build Coastguard Worker   d->config_cached = d->config_bufsize = 64;
132*c2e0c6b5SAndroid Build Coastguard Worker   d->config = xmalloc(64);
133*c2e0c6b5SAndroid Build Coastguard Worker   d->present = xmalloc(64);
134*c2e0c6b5SAndroid Build Coastguard Worker   memset(d->present, 1, 64);
135*c2e0c6b5SAndroid Build Coastguard Worker   if (!d->no_config_access && !pci_read_block(p, 0, d->config, 64))
136*c2e0c6b5SAndroid Build Coastguard Worker     {
137*c2e0c6b5SAndroid Build Coastguard Worker       d->no_config_access = 1;
138*c2e0c6b5SAndroid Build Coastguard Worker       d->config_cached = d->config_bufsize = 0;
139*c2e0c6b5SAndroid Build Coastguard Worker       memset(d->present, 0, 64);
140*c2e0c6b5SAndroid Build Coastguard Worker     }
141*c2e0c6b5SAndroid Build Coastguard Worker   if (!d->no_config_access && (d->config[PCI_HEADER_TYPE] & 0x7f) == PCI_HEADER_TYPE_CARDBUS)
142*c2e0c6b5SAndroid Build Coastguard Worker     {
143*c2e0c6b5SAndroid Build Coastguard Worker       /* For cardbus bridges, we need to fetch 64 bytes more to get the
144*c2e0c6b5SAndroid Build Coastguard Worker        * full standard header... */
145*c2e0c6b5SAndroid Build Coastguard Worker       if (config_fetch(d, 64, 64))
146*c2e0c6b5SAndroid Build Coastguard Worker 	d->config_cached += 64;
147*c2e0c6b5SAndroid Build Coastguard Worker     }
148*c2e0c6b5SAndroid Build Coastguard Worker   pci_setup_cache(p, d->config, d->config_cached);
149*c2e0c6b5SAndroid Build Coastguard Worker   pci_fill_info(p, PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_CLASS_EXT | PCI_FILL_SUBSYS | (need_topology ? PCI_FILL_PARENT : 0));
150*c2e0c6b5SAndroid Build Coastguard Worker   return d;
151*c2e0c6b5SAndroid Build Coastguard Worker }
152*c2e0c6b5SAndroid Build Coastguard Worker 
153*c2e0c6b5SAndroid Build Coastguard Worker static void
scan_devices(void)154*c2e0c6b5SAndroid Build Coastguard Worker scan_devices(void)
155*c2e0c6b5SAndroid Build Coastguard Worker {
156*c2e0c6b5SAndroid Build Coastguard Worker   struct device *d;
157*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p;
158*c2e0c6b5SAndroid Build Coastguard Worker 
159*c2e0c6b5SAndroid Build Coastguard Worker   pci_scan_bus(pacc);
160*c2e0c6b5SAndroid Build Coastguard Worker   for (p=pacc->devices; p; p=p->next)
161*c2e0c6b5SAndroid Build Coastguard Worker     if (d = scan_device(p))
162*c2e0c6b5SAndroid Build Coastguard Worker       {
163*c2e0c6b5SAndroid Build Coastguard Worker 	d->next = first_dev;
164*c2e0c6b5SAndroid Build Coastguard Worker 	first_dev = d;
165*c2e0c6b5SAndroid Build Coastguard Worker       }
166*c2e0c6b5SAndroid Build Coastguard Worker }
167*c2e0c6b5SAndroid Build Coastguard Worker 
168*c2e0c6b5SAndroid Build Coastguard Worker /*** Config space accesses ***/
169*c2e0c6b5SAndroid Build Coastguard Worker 
170*c2e0c6b5SAndroid Build Coastguard Worker static void
check_conf_range(struct device * d,unsigned int pos,unsigned int len)171*c2e0c6b5SAndroid Build Coastguard Worker check_conf_range(struct device *d, unsigned int pos, unsigned int len)
172*c2e0c6b5SAndroid Build Coastguard Worker {
173*c2e0c6b5SAndroid Build Coastguard Worker   while (len)
174*c2e0c6b5SAndroid Build Coastguard Worker     if (!d->present[pos])
175*c2e0c6b5SAndroid Build Coastguard Worker       die("Internal bug: Accessing non-read configuration byte at position %x", pos);
176*c2e0c6b5SAndroid Build Coastguard Worker     else
177*c2e0c6b5SAndroid Build Coastguard Worker       pos++, len--;
178*c2e0c6b5SAndroid Build Coastguard Worker }
179*c2e0c6b5SAndroid Build Coastguard Worker 
180*c2e0c6b5SAndroid Build Coastguard Worker byte
get_conf_byte(struct device * d,unsigned int pos)181*c2e0c6b5SAndroid Build Coastguard Worker get_conf_byte(struct device *d, unsigned int pos)
182*c2e0c6b5SAndroid Build Coastguard Worker {
183*c2e0c6b5SAndroid Build Coastguard Worker   check_conf_range(d, pos, 1);
184*c2e0c6b5SAndroid Build Coastguard Worker   return d->config[pos];
185*c2e0c6b5SAndroid Build Coastguard Worker }
186*c2e0c6b5SAndroid Build Coastguard Worker 
187*c2e0c6b5SAndroid Build Coastguard Worker word
get_conf_word(struct device * d,unsigned int pos)188*c2e0c6b5SAndroid Build Coastguard Worker get_conf_word(struct device *d, unsigned int pos)
189*c2e0c6b5SAndroid Build Coastguard Worker {
190*c2e0c6b5SAndroid Build Coastguard Worker   check_conf_range(d, pos, 2);
191*c2e0c6b5SAndroid Build Coastguard Worker   return d->config[pos] | (d->config[pos+1] << 8);
192*c2e0c6b5SAndroid Build Coastguard Worker }
193*c2e0c6b5SAndroid Build Coastguard Worker 
194*c2e0c6b5SAndroid Build Coastguard Worker u32
get_conf_long(struct device * d,unsigned int pos)195*c2e0c6b5SAndroid Build Coastguard Worker get_conf_long(struct device *d, unsigned int pos)
196*c2e0c6b5SAndroid Build Coastguard Worker {
197*c2e0c6b5SAndroid Build Coastguard Worker   check_conf_range(d, pos, 4);
198*c2e0c6b5SAndroid Build Coastguard Worker   return d->config[pos] |
199*c2e0c6b5SAndroid Build Coastguard Worker     (d->config[pos+1] << 8) |
200*c2e0c6b5SAndroid Build Coastguard Worker     (d->config[pos+2] << 16) |
201*c2e0c6b5SAndroid Build Coastguard Worker     (d->config[pos+3] << 24);
202*c2e0c6b5SAndroid Build Coastguard Worker }
203*c2e0c6b5SAndroid Build Coastguard Worker 
204*c2e0c6b5SAndroid Build Coastguard Worker /*** Sorting ***/
205*c2e0c6b5SAndroid Build Coastguard Worker 
206*c2e0c6b5SAndroid Build Coastguard Worker static int
compare_them(const void * A,const void * B)207*c2e0c6b5SAndroid Build Coastguard Worker compare_them(const void *A, const void *B)
208*c2e0c6b5SAndroid Build Coastguard Worker {
209*c2e0c6b5SAndroid Build Coastguard Worker   const struct pci_dev *a = (*(const struct device **)A)->dev;
210*c2e0c6b5SAndroid Build Coastguard Worker   const struct pci_dev *b = (*(const struct device **)B)->dev;
211*c2e0c6b5SAndroid Build Coastguard Worker 
212*c2e0c6b5SAndroid Build Coastguard Worker   if (a->domain < b->domain)
213*c2e0c6b5SAndroid Build Coastguard Worker     return -1;
214*c2e0c6b5SAndroid Build Coastguard Worker   if (a->domain > b->domain)
215*c2e0c6b5SAndroid Build Coastguard Worker     return 1;
216*c2e0c6b5SAndroid Build Coastguard Worker   if (a->bus < b->bus)
217*c2e0c6b5SAndroid Build Coastguard Worker     return -1;
218*c2e0c6b5SAndroid Build Coastguard Worker   if (a->bus > b->bus)
219*c2e0c6b5SAndroid Build Coastguard Worker     return 1;
220*c2e0c6b5SAndroid Build Coastguard Worker   if (a->dev < b->dev)
221*c2e0c6b5SAndroid Build Coastguard Worker     return -1;
222*c2e0c6b5SAndroid Build Coastguard Worker   if (a->dev > b->dev)
223*c2e0c6b5SAndroid Build Coastguard Worker     return 1;
224*c2e0c6b5SAndroid Build Coastguard Worker   if (a->func < b->func)
225*c2e0c6b5SAndroid Build Coastguard Worker     return -1;
226*c2e0c6b5SAndroid Build Coastguard Worker   if (a->func > b->func)
227*c2e0c6b5SAndroid Build Coastguard Worker     return 1;
228*c2e0c6b5SAndroid Build Coastguard Worker   return 0;
229*c2e0c6b5SAndroid Build Coastguard Worker }
230*c2e0c6b5SAndroid Build Coastguard Worker 
231*c2e0c6b5SAndroid Build Coastguard Worker static void
sort_them(void)232*c2e0c6b5SAndroid Build Coastguard Worker sort_them(void)
233*c2e0c6b5SAndroid Build Coastguard Worker {
234*c2e0c6b5SAndroid Build Coastguard Worker   struct device **index, **h, **last_dev;
235*c2e0c6b5SAndroid Build Coastguard Worker   int cnt;
236*c2e0c6b5SAndroid Build Coastguard Worker   struct device *d;
237*c2e0c6b5SAndroid Build Coastguard Worker 
238*c2e0c6b5SAndroid Build Coastguard Worker   cnt = 0;
239*c2e0c6b5SAndroid Build Coastguard Worker   for (d=first_dev; d; d=d->next)
240*c2e0c6b5SAndroid Build Coastguard Worker     cnt++;
241*c2e0c6b5SAndroid Build Coastguard Worker   h = index = alloca(sizeof(struct device *) * cnt);
242*c2e0c6b5SAndroid Build Coastguard Worker   for (d=first_dev; d; d=d->next)
243*c2e0c6b5SAndroid Build Coastguard Worker     *h++ = d;
244*c2e0c6b5SAndroid Build Coastguard Worker   qsort(index, cnt, sizeof(struct device *), compare_them);
245*c2e0c6b5SAndroid Build Coastguard Worker   last_dev = &first_dev;
246*c2e0c6b5SAndroid Build Coastguard Worker   h = index;
247*c2e0c6b5SAndroid Build Coastguard Worker   while (cnt--)
248*c2e0c6b5SAndroid Build Coastguard Worker     {
249*c2e0c6b5SAndroid Build Coastguard Worker       *last_dev = *h;
250*c2e0c6b5SAndroid Build Coastguard Worker       last_dev = &(*h)->next;
251*c2e0c6b5SAndroid Build Coastguard Worker       h++;
252*c2e0c6b5SAndroid Build Coastguard Worker     }
253*c2e0c6b5SAndroid Build Coastguard Worker   *last_dev = NULL;
254*c2e0c6b5SAndroid Build Coastguard Worker }
255*c2e0c6b5SAndroid Build Coastguard Worker 
256*c2e0c6b5SAndroid Build Coastguard Worker /*** Normal output ***/
257*c2e0c6b5SAndroid Build Coastguard Worker 
258*c2e0c6b5SAndroid Build Coastguard Worker static void
show_slot_path(struct device * d)259*c2e0c6b5SAndroid Build Coastguard Worker show_slot_path(struct device *d)
260*c2e0c6b5SAndroid Build Coastguard Worker {
261*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
262*c2e0c6b5SAndroid Build Coastguard Worker 
263*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_path)
264*c2e0c6b5SAndroid Build Coastguard Worker     {
265*c2e0c6b5SAndroid Build Coastguard Worker       struct bus *bus = d->parent_bus;
266*c2e0c6b5SAndroid Build Coastguard Worker       struct bridge *br = bus->parent_bridge;
267*c2e0c6b5SAndroid Build Coastguard Worker 
268*c2e0c6b5SAndroid Build Coastguard Worker       if (br && br->br_dev)
269*c2e0c6b5SAndroid Build Coastguard Worker 	{
270*c2e0c6b5SAndroid Build Coastguard Worker 	  show_slot_path(br->br_dev);
271*c2e0c6b5SAndroid Build Coastguard Worker 	  if (opt_path > 1)
272*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("/%02x:%02x.%d", p->bus, p->dev, p->func);
273*c2e0c6b5SAndroid Build Coastguard Worker 	  else
274*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("/%02x.%d", p->dev, p->func);
275*c2e0c6b5SAndroid Build Coastguard Worker 	  return;
276*c2e0c6b5SAndroid Build Coastguard Worker 	}
277*c2e0c6b5SAndroid Build Coastguard Worker     }
278*c2e0c6b5SAndroid Build Coastguard Worker   printf("%02x:%02x.%d", p->bus, p->dev, p->func);
279*c2e0c6b5SAndroid Build Coastguard Worker }
280*c2e0c6b5SAndroid Build Coastguard Worker 
281*c2e0c6b5SAndroid Build Coastguard Worker static void
show_slot_name(struct device * d)282*c2e0c6b5SAndroid Build Coastguard Worker show_slot_name(struct device *d)
283*c2e0c6b5SAndroid Build Coastguard Worker {
284*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
285*c2e0c6b5SAndroid Build Coastguard Worker 
286*c2e0c6b5SAndroid Build Coastguard Worker   if (!opt_machine ? opt_domains : (p->domain || opt_domains >= 2))
287*c2e0c6b5SAndroid Build Coastguard Worker     printf("%04x:", p->domain);
288*c2e0c6b5SAndroid Build Coastguard Worker   show_slot_path(d);
289*c2e0c6b5SAndroid Build Coastguard Worker }
290*c2e0c6b5SAndroid Build Coastguard Worker 
291*c2e0c6b5SAndroid Build Coastguard Worker static void
show_terse(struct device * d)292*c2e0c6b5SAndroid Build Coastguard Worker show_terse(struct device *d)
293*c2e0c6b5SAndroid Build Coastguard Worker {
294*c2e0c6b5SAndroid Build Coastguard Worker   int c;
295*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
296*c2e0c6b5SAndroid Build Coastguard Worker   char classbuf[256], devbuf[256];
297*c2e0c6b5SAndroid Build Coastguard Worker 
298*c2e0c6b5SAndroid Build Coastguard Worker   show_slot_name(d);
299*c2e0c6b5SAndroid Build Coastguard Worker   printf(" %s: %s",
300*c2e0c6b5SAndroid Build Coastguard Worker 	 pci_lookup_name(pacc, classbuf, sizeof(classbuf),
301*c2e0c6b5SAndroid Build Coastguard Worker 			 PCI_LOOKUP_CLASS,
302*c2e0c6b5SAndroid Build Coastguard Worker 			 p->device_class),
303*c2e0c6b5SAndroid Build Coastguard Worker 	 pci_lookup_name(pacc, devbuf, sizeof(devbuf),
304*c2e0c6b5SAndroid Build Coastguard Worker 			 PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE,
305*c2e0c6b5SAndroid Build Coastguard Worker 			 p->vendor_id, p->device_id));
306*c2e0c6b5SAndroid Build Coastguard Worker   if ((p->known_fields & PCI_FILL_CLASS_EXT) && p->rev_id)
307*c2e0c6b5SAndroid Build Coastguard Worker     printf(" (rev %02x)", p->rev_id);
308*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose)
309*c2e0c6b5SAndroid Build Coastguard Worker     {
310*c2e0c6b5SAndroid Build Coastguard Worker       char *x;
311*c2e0c6b5SAndroid Build Coastguard Worker       c = (p->known_fields & PCI_FILL_CLASS_EXT) ? p->prog_if : 0;
312*c2e0c6b5SAndroid Build Coastguard Worker       x = pci_lookup_name(pacc, devbuf, sizeof(devbuf),
313*c2e0c6b5SAndroid Build Coastguard Worker 			  PCI_LOOKUP_PROGIF | PCI_LOOKUP_NO_NUMBERS,
314*c2e0c6b5SAndroid Build Coastguard Worker 			  p->device_class, c);
315*c2e0c6b5SAndroid Build Coastguard Worker       if (c || x)
316*c2e0c6b5SAndroid Build Coastguard Worker 	{
317*c2e0c6b5SAndroid Build Coastguard Worker 	  printf(" (prog-if %02x", c);
318*c2e0c6b5SAndroid Build Coastguard Worker 	  if (x)
319*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(" [%s]", x);
320*c2e0c6b5SAndroid Build Coastguard Worker 	  putchar(')');
321*c2e0c6b5SAndroid Build Coastguard Worker 	}
322*c2e0c6b5SAndroid Build Coastguard Worker     }
323*c2e0c6b5SAndroid Build Coastguard Worker   putchar('\n');
324*c2e0c6b5SAndroid Build Coastguard Worker 
325*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose || opt_kernel)
326*c2e0c6b5SAndroid Build Coastguard Worker     {
327*c2e0c6b5SAndroid Build Coastguard Worker       char ssnamebuf[256];
328*c2e0c6b5SAndroid Build Coastguard Worker 
329*c2e0c6b5SAndroid Build Coastguard Worker       pci_fill_info(p, PCI_FILL_LABEL);
330*c2e0c6b5SAndroid Build Coastguard Worker 
331*c2e0c6b5SAndroid Build Coastguard Worker       if (p->label)
332*c2e0c6b5SAndroid Build Coastguard Worker         printf("\tDeviceName: %s", p->label);
333*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_SUBSYS) &&
334*c2e0c6b5SAndroid Build Coastguard Worker 	  p->subsys_vendor_id && p->subsys_vendor_id != 0xffff)
335*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tSubsystem: %s\n",
336*c2e0c6b5SAndroid Build Coastguard Worker 		pci_lookup_name(pacc, ssnamebuf, sizeof(ssnamebuf),
337*c2e0c6b5SAndroid Build Coastguard Worker 			PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE,
338*c2e0c6b5SAndroid Build Coastguard Worker 			p->vendor_id, p->device_id, p->subsys_vendor_id, p->subsys_id));
339*c2e0c6b5SAndroid Build Coastguard Worker     }
340*c2e0c6b5SAndroid Build Coastguard Worker }
341*c2e0c6b5SAndroid Build Coastguard Worker 
342*c2e0c6b5SAndroid Build Coastguard Worker /*** Verbose output ***/
343*c2e0c6b5SAndroid Build Coastguard Worker 
344*c2e0c6b5SAndroid Build Coastguard Worker static void
show_size(u64 x)345*c2e0c6b5SAndroid Build Coastguard Worker show_size(u64 x)
346*c2e0c6b5SAndroid Build Coastguard Worker {
347*c2e0c6b5SAndroid Build Coastguard Worker   static const char suffix[][2] = { "", "K", "M", "G", "T" };
348*c2e0c6b5SAndroid Build Coastguard Worker   unsigned i;
349*c2e0c6b5SAndroid Build Coastguard Worker   if (!x)
350*c2e0c6b5SAndroid Build Coastguard Worker     return;
351*c2e0c6b5SAndroid Build Coastguard Worker   for (i = 0; i < (sizeof(suffix) / sizeof(*suffix) - 1); i++) {
352*c2e0c6b5SAndroid Build Coastguard Worker     if (x % 1024)
353*c2e0c6b5SAndroid Build Coastguard Worker       break;
354*c2e0c6b5SAndroid Build Coastguard Worker     x /= 1024;
355*c2e0c6b5SAndroid Build Coastguard Worker   }
356*c2e0c6b5SAndroid Build Coastguard Worker   printf(" [size=%u%s]", (unsigned)x, suffix[i]);
357*c2e0c6b5SAndroid Build Coastguard Worker }
358*c2e0c6b5SAndroid Build Coastguard Worker 
359*c2e0c6b5SAndroid Build Coastguard Worker static void
show_range(const char * prefix,u64 base,u64 limit,int bits,int disabled)360*c2e0c6b5SAndroid Build Coastguard Worker show_range(const char *prefix, u64 base, u64 limit, int bits, int disabled)
361*c2e0c6b5SAndroid Build Coastguard Worker {
362*c2e0c6b5SAndroid Build Coastguard Worker   printf("%s:", prefix);
363*c2e0c6b5SAndroid Build Coastguard Worker   if (base <= limit || verbose > 2)
364*c2e0c6b5SAndroid Build Coastguard Worker     printf(" %0*" PCI_U64_FMT_X "-%0*" PCI_U64_FMT_X, (bits+3)/4, base, (bits+3)/4, limit);
365*c2e0c6b5SAndroid Build Coastguard Worker   if (!disabled && base <= limit)
366*c2e0c6b5SAndroid Build Coastguard Worker     show_size(limit - base + 1);
367*c2e0c6b5SAndroid Build Coastguard Worker   else
368*c2e0c6b5SAndroid Build Coastguard Worker     printf(" [disabled]");
369*c2e0c6b5SAndroid Build Coastguard Worker   if (bits)
370*c2e0c6b5SAndroid Build Coastguard Worker     printf(" [%d-bit]", bits);
371*c2e0c6b5SAndroid Build Coastguard Worker   putchar('\n');
372*c2e0c6b5SAndroid Build Coastguard Worker }
373*c2e0c6b5SAndroid Build Coastguard Worker 
374*c2e0c6b5SAndroid Build Coastguard Worker static u32
ioflg_to_pciflg(pciaddr_t ioflg)375*c2e0c6b5SAndroid Build Coastguard Worker ioflg_to_pciflg(pciaddr_t ioflg)
376*c2e0c6b5SAndroid Build Coastguard Worker {
377*c2e0c6b5SAndroid Build Coastguard Worker   u32 flg;
378*c2e0c6b5SAndroid Build Coastguard Worker 
379*c2e0c6b5SAndroid Build Coastguard Worker   if (ioflg & PCI_IORESOURCE_IO)
380*c2e0c6b5SAndroid Build Coastguard Worker     flg = PCI_BASE_ADDRESS_SPACE_IO;
381*c2e0c6b5SAndroid Build Coastguard Worker   else if (!(ioflg & PCI_IORESOURCE_MEM))
382*c2e0c6b5SAndroid Build Coastguard Worker     flg = 0;
383*c2e0c6b5SAndroid Build Coastguard Worker   else
384*c2e0c6b5SAndroid Build Coastguard Worker     {
385*c2e0c6b5SAndroid Build Coastguard Worker       flg = PCI_BASE_ADDRESS_SPACE_MEMORY;
386*c2e0c6b5SAndroid Build Coastguard Worker       if (ioflg & PCI_IORESOURCE_MEM_64)
387*c2e0c6b5SAndroid Build Coastguard Worker         flg |= PCI_BASE_ADDRESS_MEM_TYPE_64;
388*c2e0c6b5SAndroid Build Coastguard Worker       else
389*c2e0c6b5SAndroid Build Coastguard Worker         flg |= PCI_BASE_ADDRESS_MEM_TYPE_32;
390*c2e0c6b5SAndroid Build Coastguard Worker       if (ioflg & PCI_IORESOURCE_PREFETCH)
391*c2e0c6b5SAndroid Build Coastguard Worker         flg |= PCI_BASE_ADDRESS_MEM_PREFETCH;
392*c2e0c6b5SAndroid Build Coastguard Worker     }
393*c2e0c6b5SAndroid Build Coastguard Worker 
394*c2e0c6b5SAndroid Build Coastguard Worker   return flg;
395*c2e0c6b5SAndroid Build Coastguard Worker }
396*c2e0c6b5SAndroid Build Coastguard Worker 
397*c2e0c6b5SAndroid Build Coastguard Worker static void
show_bases(struct device * d,int cnt,int without_config_data)398*c2e0c6b5SAndroid Build Coastguard Worker show_bases(struct device *d, int cnt, int without_config_data)
399*c2e0c6b5SAndroid Build Coastguard Worker {
400*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
401*c2e0c6b5SAndroid Build Coastguard Worker   word cmd = without_config_data ? (PCI_COMMAND_IO | PCI_COMMAND_MEMORY) : get_conf_word(d, PCI_COMMAND);
402*c2e0c6b5SAndroid Build Coastguard Worker   int i;
403*c2e0c6b5SAndroid Build Coastguard Worker 
404*c2e0c6b5SAndroid Build Coastguard Worker   for (i=0; i<cnt; i++)
405*c2e0c6b5SAndroid Build Coastguard Worker     {
406*c2e0c6b5SAndroid Build Coastguard Worker       pciaddr_t pos = p->base_addr[i];
407*c2e0c6b5SAndroid Build Coastguard Worker       pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->size[i] : 0;
408*c2e0c6b5SAndroid Build Coastguard Worker       pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->flags[i] : 0;
409*c2e0c6b5SAndroid Build Coastguard Worker       u32 flg = (p->known_fields & PCI_FILL_IO_FLAGS) ? ioflg_to_pciflg(ioflg) : without_config_data ? 0 : get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i);
410*c2e0c6b5SAndroid Build Coastguard Worker       u32 hw_lower = 0;
411*c2e0c6b5SAndroid Build Coastguard Worker       u32 hw_upper = 0;
412*c2e0c6b5SAndroid Build Coastguard Worker       int broken = 0;
413*c2e0c6b5SAndroid Build Coastguard Worker       int virtual = 0;
414*c2e0c6b5SAndroid Build Coastguard Worker 
415*c2e0c6b5SAndroid Build Coastguard Worker       if (flg == 0xffffffff)
416*c2e0c6b5SAndroid Build Coastguard Worker 	flg = 0;
417*c2e0c6b5SAndroid Build Coastguard Worker       if (!pos && !flg && !len)
418*c2e0c6b5SAndroid Build Coastguard Worker 	continue;
419*c2e0c6b5SAndroid Build Coastguard Worker 
420*c2e0c6b5SAndroid Build Coastguard Worker       if (verbose > 1)
421*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tRegion %d: ", i);
422*c2e0c6b5SAndroid Build Coastguard Worker       else
423*c2e0c6b5SAndroid Build Coastguard Worker 	putchar('\t');
424*c2e0c6b5SAndroid Build Coastguard Worker 
425*c2e0c6b5SAndroid Build Coastguard Worker       /* Detect virtual regions, which are reported by the OS, but unassigned in the device */
426*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_IO_FLAGS) && !without_config_data)
427*c2e0c6b5SAndroid Build Coastguard Worker 	{
428*c2e0c6b5SAndroid Build Coastguard Worker 	  /* Read address as seen by the hardware */
429*c2e0c6b5SAndroid Build Coastguard Worker 	  hw_lower = get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i);
430*c2e0c6b5SAndroid Build Coastguard Worker 	  if ((hw_lower & PCI_BASE_ADDRESS_SPACE) == (ioflg_to_pciflg(ioflg) & PCI_BASE_ADDRESS_SPACE))
431*c2e0c6b5SAndroid Build Coastguard Worker 	    {
432*c2e0c6b5SAndroid Build Coastguard Worker 	      if ((ioflg & PCI_IORESOURCE_TYPE_BITS) == PCI_IORESOURCE_MEM &&
433*c2e0c6b5SAndroid Build Coastguard Worker 		  (hw_lower & PCI_BASE_ADDRESS_MEM_TYPE_MASK) == PCI_BASE_ADDRESS_MEM_TYPE_64)
434*c2e0c6b5SAndroid Build Coastguard Worker 	        {
435*c2e0c6b5SAndroid Build Coastguard Worker 		  if (i >= cnt - 1)
436*c2e0c6b5SAndroid Build Coastguard Worker 		    broken = 1;
437*c2e0c6b5SAndroid Build Coastguard Worker 		  else
438*c2e0c6b5SAndroid Build Coastguard Worker 		    hw_upper = get_conf_long(d, PCI_BASE_ADDRESS_0 + 4*i + 1);
439*c2e0c6b5SAndroid Build Coastguard Worker 		}
440*c2e0c6b5SAndroid Build Coastguard Worker 	      if (pos && !hw_lower && !hw_upper && !(ioflg & PCI_IORESOURCE_PCI_EA_BEI))
441*c2e0c6b5SAndroid Build Coastguard Worker 		virtual = 1;
442*c2e0c6b5SAndroid Build Coastguard Worker 	    }
443*c2e0c6b5SAndroid Build Coastguard Worker 	}
444*c2e0c6b5SAndroid Build Coastguard Worker 
445*c2e0c6b5SAndroid Build Coastguard Worker       /* Print base address */
446*c2e0c6b5SAndroid Build Coastguard Worker       if (flg & PCI_BASE_ADDRESS_SPACE_IO)
447*c2e0c6b5SAndroid Build Coastguard Worker 	{
448*c2e0c6b5SAndroid Build Coastguard Worker 	  pciaddr_t a = pos & PCI_BASE_ADDRESS_IO_MASK;
449*c2e0c6b5SAndroid Build Coastguard Worker 	  printf("I/O ports at ");
450*c2e0c6b5SAndroid Build Coastguard Worker 	  if (a || (cmd & PCI_COMMAND_IO))
451*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(PCIADDR_PORT_FMT, a);
452*c2e0c6b5SAndroid Build Coastguard Worker 	  else if (hw_lower)
453*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("<ignored>");
454*c2e0c6b5SAndroid Build Coastguard Worker 	  else
455*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("<unassigned>");
456*c2e0c6b5SAndroid Build Coastguard Worker 	  if (virtual)
457*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(" [virtual]");
458*c2e0c6b5SAndroid Build Coastguard Worker 	  else if (!(cmd & PCI_COMMAND_IO))
459*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(" [disabled]");
460*c2e0c6b5SAndroid Build Coastguard Worker 	}
461*c2e0c6b5SAndroid Build Coastguard Worker       else
462*c2e0c6b5SAndroid Build Coastguard Worker 	{
463*c2e0c6b5SAndroid Build Coastguard Worker 	  int t = flg & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
464*c2e0c6b5SAndroid Build Coastguard Worker 	  pciaddr_t a = pos & PCI_ADDR_MEM_MASK;
465*c2e0c6b5SAndroid Build Coastguard Worker 
466*c2e0c6b5SAndroid Build Coastguard Worker 	  printf("Memory at ");
467*c2e0c6b5SAndroid Build Coastguard Worker 	  if (broken)
468*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("<broken-64-bit-slot>");
469*c2e0c6b5SAndroid Build Coastguard Worker 	  else if (a)
470*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(PCIADDR_T_FMT, a);
471*c2e0c6b5SAndroid Build Coastguard Worker 	  else if (hw_lower || hw_upper)
472*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("<ignored>");
473*c2e0c6b5SAndroid Build Coastguard Worker 	  else
474*c2e0c6b5SAndroid Build Coastguard Worker 	    printf("<unassigned>");
475*c2e0c6b5SAndroid Build Coastguard Worker 	  printf(" (%s, %sprefetchable)",
476*c2e0c6b5SAndroid Build Coastguard Worker 		 (t == PCI_BASE_ADDRESS_MEM_TYPE_32) ? "32-bit" :
477*c2e0c6b5SAndroid Build Coastguard Worker 		 (t == PCI_BASE_ADDRESS_MEM_TYPE_64) ? "64-bit" :
478*c2e0c6b5SAndroid Build Coastguard Worker 		 (t == PCI_BASE_ADDRESS_MEM_TYPE_1M) ? "low-1M" : "type 3",
479*c2e0c6b5SAndroid Build Coastguard Worker 		 (flg & PCI_BASE_ADDRESS_MEM_PREFETCH) ? "" : "non-");
480*c2e0c6b5SAndroid Build Coastguard Worker 	  if (virtual)
481*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(" [virtual]");
482*c2e0c6b5SAndroid Build Coastguard Worker 	  else if (!(cmd & PCI_COMMAND_MEMORY))
483*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(" [disabled]");
484*c2e0c6b5SAndroid Build Coastguard Worker 	}
485*c2e0c6b5SAndroid Build Coastguard Worker 
486*c2e0c6b5SAndroid Build Coastguard Worker       if (ioflg & PCI_IORESOURCE_PCI_EA_BEI)
487*c2e0c6b5SAndroid Build Coastguard Worker 	printf(" [enhanced]");
488*c2e0c6b5SAndroid Build Coastguard Worker 
489*c2e0c6b5SAndroid Build Coastguard Worker       show_size(len);
490*c2e0c6b5SAndroid Build Coastguard Worker       putchar('\n');
491*c2e0c6b5SAndroid Build Coastguard Worker     }
492*c2e0c6b5SAndroid Build Coastguard Worker }
493*c2e0c6b5SAndroid Build Coastguard Worker 
494*c2e0c6b5SAndroid Build Coastguard Worker static void
show_rom(struct device * d,int reg)495*c2e0c6b5SAndroid Build Coastguard Worker show_rom(struct device *d, int reg)
496*c2e0c6b5SAndroid Build Coastguard Worker {
497*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
498*c2e0c6b5SAndroid Build Coastguard Worker   pciaddr_t rom = p->rom_base_addr;
499*c2e0c6b5SAndroid Build Coastguard Worker   pciaddr_t len = (p->known_fields & PCI_FILL_SIZES) ? p->rom_size : 0;
500*c2e0c6b5SAndroid Build Coastguard Worker   pciaddr_t ioflg = (p->known_fields & PCI_FILL_IO_FLAGS) ? p->rom_flags : 0;
501*c2e0c6b5SAndroid Build Coastguard Worker   u32 flg = reg >= 0 ? get_conf_long(d, reg) : ioflg_to_pciflg(ioflg);
502*c2e0c6b5SAndroid Build Coastguard Worker   word cmd = reg >= 0 ? get_conf_word(d, PCI_COMMAND) : PCI_COMMAND_MEMORY;
503*c2e0c6b5SAndroid Build Coastguard Worker   int virtual = 0;
504*c2e0c6b5SAndroid Build Coastguard Worker 
505*c2e0c6b5SAndroid Build Coastguard Worker   if (!rom && !flg && !len)
506*c2e0c6b5SAndroid Build Coastguard Worker     return;
507*c2e0c6b5SAndroid Build Coastguard Worker 
508*c2e0c6b5SAndroid Build Coastguard Worker   if (reg >= 0 && (rom & PCI_ROM_ADDRESS_MASK) && !(flg & PCI_ROM_ADDRESS_MASK) && !(ioflg & PCI_IORESOURCE_PCI_EA_BEI))
509*c2e0c6b5SAndroid Build Coastguard Worker     {
510*c2e0c6b5SAndroid Build Coastguard Worker       flg = rom;
511*c2e0c6b5SAndroid Build Coastguard Worker       virtual = 1;
512*c2e0c6b5SAndroid Build Coastguard Worker     }
513*c2e0c6b5SAndroid Build Coastguard Worker 
514*c2e0c6b5SAndroid Build Coastguard Worker   printf("\tExpansion ROM at ");
515*c2e0c6b5SAndroid Build Coastguard Worker   if (rom & PCI_ROM_ADDRESS_MASK)
516*c2e0c6b5SAndroid Build Coastguard Worker     printf(PCIADDR_T_FMT, rom & PCI_ROM_ADDRESS_MASK);
517*c2e0c6b5SAndroid Build Coastguard Worker   else if (flg & PCI_ROM_ADDRESS_MASK)
518*c2e0c6b5SAndroid Build Coastguard Worker     printf("<ignored>");
519*c2e0c6b5SAndroid Build Coastguard Worker   else
520*c2e0c6b5SAndroid Build Coastguard Worker     printf("<unassigned>");
521*c2e0c6b5SAndroid Build Coastguard Worker 
522*c2e0c6b5SAndroid Build Coastguard Worker   if (virtual)
523*c2e0c6b5SAndroid Build Coastguard Worker     printf(" [virtual]");
524*c2e0c6b5SAndroid Build Coastguard Worker 
525*c2e0c6b5SAndroid Build Coastguard Worker   if (!(flg & PCI_ROM_ADDRESS_ENABLE))
526*c2e0c6b5SAndroid Build Coastguard Worker     printf(" [disabled]");
527*c2e0c6b5SAndroid Build Coastguard Worker   else if (!virtual && !(cmd & PCI_COMMAND_MEMORY))
528*c2e0c6b5SAndroid Build Coastguard Worker     printf(" [disabled by cmd]");
529*c2e0c6b5SAndroid Build Coastguard Worker 
530*c2e0c6b5SAndroid Build Coastguard Worker   if (ioflg & PCI_IORESOURCE_PCI_EA_BEI)
531*c2e0c6b5SAndroid Build Coastguard Worker       printf(" [enhanced]");
532*c2e0c6b5SAndroid Build Coastguard Worker 
533*c2e0c6b5SAndroid Build Coastguard Worker   show_size(len);
534*c2e0c6b5SAndroid Build Coastguard Worker   putchar('\n');
535*c2e0c6b5SAndroid Build Coastguard Worker }
536*c2e0c6b5SAndroid Build Coastguard Worker 
537*c2e0c6b5SAndroid Build Coastguard Worker static void
show_htype0(struct device * d)538*c2e0c6b5SAndroid Build Coastguard Worker show_htype0(struct device *d)
539*c2e0c6b5SAndroid Build Coastguard Worker {
540*c2e0c6b5SAndroid Build Coastguard Worker   show_bases(d, 6, 0);
541*c2e0c6b5SAndroid Build Coastguard Worker   show_rom(d, PCI_ROM_ADDRESS);
542*c2e0c6b5SAndroid Build Coastguard Worker   show_caps(d, PCI_CAPABILITY_LIST);
543*c2e0c6b5SAndroid Build Coastguard Worker }
544*c2e0c6b5SAndroid Build Coastguard Worker 
545*c2e0c6b5SAndroid Build Coastguard Worker static void
show_htype1(struct device * d)546*c2e0c6b5SAndroid Build Coastguard Worker show_htype1(struct device *d)
547*c2e0c6b5SAndroid Build Coastguard Worker {
548*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
549*c2e0c6b5SAndroid Build Coastguard Worker   u32 io_base = get_conf_byte(d, PCI_IO_BASE);
550*c2e0c6b5SAndroid Build Coastguard Worker   u32 io_limit = get_conf_byte(d, PCI_IO_LIMIT);
551*c2e0c6b5SAndroid Build Coastguard Worker   u32 io_type = io_base & PCI_IO_RANGE_TYPE_MASK;
552*c2e0c6b5SAndroid Build Coastguard Worker   u32 mem_base = get_conf_word(d, PCI_MEMORY_BASE);
553*c2e0c6b5SAndroid Build Coastguard Worker   u32 mem_limit = get_conf_word(d, PCI_MEMORY_LIMIT);
554*c2e0c6b5SAndroid Build Coastguard Worker   u32 mem_type = mem_base & PCI_MEMORY_RANGE_TYPE_MASK;
555*c2e0c6b5SAndroid Build Coastguard Worker   u32 pref_base = get_conf_word(d, PCI_PREF_MEMORY_BASE);
556*c2e0c6b5SAndroid Build Coastguard Worker   u32 pref_limit = get_conf_word(d, PCI_PREF_MEMORY_LIMIT);
557*c2e0c6b5SAndroid Build Coastguard Worker   u32 pref_type = pref_base & PCI_PREF_RANGE_TYPE_MASK;
558*c2e0c6b5SAndroid Build Coastguard Worker   word sec_stat = get_conf_word(d, PCI_SEC_STATUS);
559*c2e0c6b5SAndroid Build Coastguard Worker   word brc = get_conf_word(d, PCI_BRIDGE_CONTROL);
560*c2e0c6b5SAndroid Build Coastguard Worker   int io_disabled = (p->known_fields & PCI_FILL_BRIDGE_BASES) && !p->bridge_size[0];
561*c2e0c6b5SAndroid Build Coastguard Worker   int mem_disabled = (p->known_fields & PCI_FILL_BRIDGE_BASES) && !p->bridge_size[1];
562*c2e0c6b5SAndroid Build Coastguard Worker   int pref_disabled = (p->known_fields & PCI_FILL_BRIDGE_BASES) && !p->bridge_size[2];
563*c2e0c6b5SAndroid Build Coastguard Worker   int io_bits, pref_bits;
564*c2e0c6b5SAndroid Build Coastguard Worker 
565*c2e0c6b5SAndroid Build Coastguard Worker   show_bases(d, 2, 0);
566*c2e0c6b5SAndroid Build Coastguard Worker   printf("\tBus: primary=%02x, secondary=%02x, subordinate=%02x, sec-latency=%d\n",
567*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_PRIMARY_BUS),
568*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_SECONDARY_BUS),
569*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_SUBORDINATE_BUS),
570*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_SEC_LATENCY_TIMER));
571*c2e0c6b5SAndroid Build Coastguard Worker 
572*c2e0c6b5SAndroid Build Coastguard Worker   if ((p->known_fields & PCI_FILL_BRIDGE_BASES) && !io_disabled)
573*c2e0c6b5SAndroid Build Coastguard Worker     {
574*c2e0c6b5SAndroid Build Coastguard Worker       io_base = p->bridge_base_addr[0] & PCI_IO_RANGE_MASK;
575*c2e0c6b5SAndroid Build Coastguard Worker       io_limit = io_base + p->bridge_size[0] - 1;
576*c2e0c6b5SAndroid Build Coastguard Worker       io_type = p->bridge_base_addr[0] & PCI_IO_RANGE_TYPE_MASK;
577*c2e0c6b5SAndroid Build Coastguard Worker       io_bits = (io_type == PCI_IO_RANGE_TYPE_32) ? 32 : 16;
578*c2e0c6b5SAndroid Build Coastguard Worker       show_range("\tI/O behind bridge", io_base, io_limit, io_bits, io_disabled);
579*c2e0c6b5SAndroid Build Coastguard Worker     }
580*c2e0c6b5SAndroid Build Coastguard Worker   else if (io_type != (io_limit & PCI_IO_RANGE_TYPE_MASK) ||
581*c2e0c6b5SAndroid Build Coastguard Worker       (io_type != PCI_IO_RANGE_TYPE_16 && io_type != PCI_IO_RANGE_TYPE_32))
582*c2e0c6b5SAndroid Build Coastguard Worker     printf("\t!!! Unknown I/O range types %x/%x\n", io_base, io_limit);
583*c2e0c6b5SAndroid Build Coastguard Worker   else
584*c2e0c6b5SAndroid Build Coastguard Worker     {
585*c2e0c6b5SAndroid Build Coastguard Worker       io_base = (io_base & PCI_IO_RANGE_MASK) << 8;
586*c2e0c6b5SAndroid Build Coastguard Worker       io_limit = (io_limit & PCI_IO_RANGE_MASK) << 8;
587*c2e0c6b5SAndroid Build Coastguard Worker       if (io_type == PCI_IO_RANGE_TYPE_32)
588*c2e0c6b5SAndroid Build Coastguard Worker 	{
589*c2e0c6b5SAndroid Build Coastguard Worker 	  io_base |= (get_conf_word(d, PCI_IO_BASE_UPPER16) << 16);
590*c2e0c6b5SAndroid Build Coastguard Worker 	  io_limit |= (get_conf_word(d, PCI_IO_LIMIT_UPPER16) << 16);
591*c2e0c6b5SAndroid Build Coastguard Worker 	}
592*c2e0c6b5SAndroid Build Coastguard Worker       /* I/O is unsupported if both base and limit are zeros and resource is disabled */
593*c2e0c6b5SAndroid Build Coastguard Worker       if (!(io_base == 0x0 && io_limit == 0x0 && io_disabled))
594*c2e0c6b5SAndroid Build Coastguard Worker         {
595*c2e0c6b5SAndroid Build Coastguard Worker           io_limit += 0xfff;
596*c2e0c6b5SAndroid Build Coastguard Worker           io_bits = (io_type == PCI_IO_RANGE_TYPE_32) ? 32 : 16;
597*c2e0c6b5SAndroid Build Coastguard Worker           show_range("\tI/O behind bridge", io_base, io_limit, io_bits, io_disabled);
598*c2e0c6b5SAndroid Build Coastguard Worker         }
599*c2e0c6b5SAndroid Build Coastguard Worker     }
600*c2e0c6b5SAndroid Build Coastguard Worker 
601*c2e0c6b5SAndroid Build Coastguard Worker   if ((p->known_fields & PCI_FILL_BRIDGE_BASES) && !mem_disabled)
602*c2e0c6b5SAndroid Build Coastguard Worker     {
603*c2e0c6b5SAndroid Build Coastguard Worker       mem_base = p->bridge_base_addr[1] & PCI_MEMORY_RANGE_MASK;
604*c2e0c6b5SAndroid Build Coastguard Worker       mem_limit = mem_base + p->bridge_size[1] - 1;
605*c2e0c6b5SAndroid Build Coastguard Worker       show_range("\tMemory behind bridge", mem_base, mem_limit, 32, mem_disabled);
606*c2e0c6b5SAndroid Build Coastguard Worker     }
607*c2e0c6b5SAndroid Build Coastguard Worker   else if (mem_type != (mem_limit & PCI_MEMORY_RANGE_TYPE_MASK) ||
608*c2e0c6b5SAndroid Build Coastguard Worker       mem_type)
609*c2e0c6b5SAndroid Build Coastguard Worker     printf("\t!!! Unknown memory range types %x/%x\n", mem_base, mem_limit);
610*c2e0c6b5SAndroid Build Coastguard Worker   else
611*c2e0c6b5SAndroid Build Coastguard Worker     {
612*c2e0c6b5SAndroid Build Coastguard Worker       mem_base = (mem_base & PCI_MEMORY_RANGE_MASK) << 16;
613*c2e0c6b5SAndroid Build Coastguard Worker       mem_limit = (mem_limit & PCI_MEMORY_RANGE_MASK) << 16;
614*c2e0c6b5SAndroid Build Coastguard Worker       show_range("\tMemory behind bridge", mem_base, mem_limit + 0xfffff, 32, mem_disabled);
615*c2e0c6b5SAndroid Build Coastguard Worker     }
616*c2e0c6b5SAndroid Build Coastguard Worker 
617*c2e0c6b5SAndroid Build Coastguard Worker   if ((p->known_fields & PCI_FILL_BRIDGE_BASES) && !pref_disabled)
618*c2e0c6b5SAndroid Build Coastguard Worker     {
619*c2e0c6b5SAndroid Build Coastguard Worker       u64 pref_base_64 = p->bridge_base_addr[2] & PCI_MEMORY_RANGE_MASK;
620*c2e0c6b5SAndroid Build Coastguard Worker       u64 pref_limit_64 = pref_base_64 + p->bridge_size[2] - 1;
621*c2e0c6b5SAndroid Build Coastguard Worker       pref_type = p->bridge_base_addr[2] & PCI_MEMORY_RANGE_TYPE_MASK;
622*c2e0c6b5SAndroid Build Coastguard Worker       pref_bits = (pref_type == PCI_PREF_RANGE_TYPE_64) ? 64 : 32;
623*c2e0c6b5SAndroid Build Coastguard Worker       show_range("\tPrefetchable memory behind bridge", pref_base_64, pref_limit_64, pref_bits, pref_disabled);
624*c2e0c6b5SAndroid Build Coastguard Worker     }
625*c2e0c6b5SAndroid Build Coastguard Worker   else if (pref_type != (pref_limit & PCI_PREF_RANGE_TYPE_MASK) ||
626*c2e0c6b5SAndroid Build Coastguard Worker       (pref_type != PCI_PREF_RANGE_TYPE_32 && pref_type != PCI_PREF_RANGE_TYPE_64))
627*c2e0c6b5SAndroid Build Coastguard Worker     printf("\t!!! Unknown prefetchable memory range types %x/%x\n", pref_base, pref_limit);
628*c2e0c6b5SAndroid Build Coastguard Worker   else
629*c2e0c6b5SAndroid Build Coastguard Worker     {
630*c2e0c6b5SAndroid Build Coastguard Worker       u64 pref_base_64 = (pref_base & PCI_PREF_RANGE_MASK) << 16;
631*c2e0c6b5SAndroid Build Coastguard Worker       u64 pref_limit_64 = (pref_limit & PCI_PREF_RANGE_MASK) << 16;
632*c2e0c6b5SAndroid Build Coastguard Worker       if (pref_type == PCI_PREF_RANGE_TYPE_64)
633*c2e0c6b5SAndroid Build Coastguard Worker 	{
634*c2e0c6b5SAndroid Build Coastguard Worker 	  pref_base_64 |= (u64) get_conf_long(d, PCI_PREF_BASE_UPPER32) << 32;
635*c2e0c6b5SAndroid Build Coastguard Worker 	  pref_limit_64 |= (u64) get_conf_long(d, PCI_PREF_LIMIT_UPPER32) << 32;
636*c2e0c6b5SAndroid Build Coastguard Worker 	}
637*c2e0c6b5SAndroid Build Coastguard Worker       /* Prefetchable memory is unsupported if both base and limit are zeros and resource is disabled */
638*c2e0c6b5SAndroid Build Coastguard Worker       if (!(pref_base_64 == 0x0 && pref_limit_64 == 0x0 && pref_disabled))
639*c2e0c6b5SAndroid Build Coastguard Worker         {
640*c2e0c6b5SAndroid Build Coastguard Worker           pref_limit_64 += 0xfffff;
641*c2e0c6b5SAndroid Build Coastguard Worker           pref_bits = (pref_type == PCI_PREF_RANGE_TYPE_64) ? 64 : 32;
642*c2e0c6b5SAndroid Build Coastguard Worker           show_range("\tPrefetchable memory behind bridge", pref_base_64, pref_limit_64, pref_bits, pref_disabled);
643*c2e0c6b5SAndroid Build Coastguard Worker         }
644*c2e0c6b5SAndroid Build Coastguard Worker     }
645*c2e0c6b5SAndroid Build Coastguard Worker 
646*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose > 1)
647*c2e0c6b5SAndroid Build Coastguard Worker     printf("\tSecondary status: 66MHz%c FastB2B%c ParErr%c DEVSEL=%s >TAbort%c <TAbort%c <MAbort%c <SERR%c <PERR%c\n",
648*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_66MHZ),
649*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_FAST_BACK),
650*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_PARITY),
651*c2e0c6b5SAndroid Build Coastguard Worker 	     ((sec_stat & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_SLOW) ? "slow" :
652*c2e0c6b5SAndroid Build Coastguard Worker 	     ((sec_stat & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_MEDIUM) ? "medium" :
653*c2e0c6b5SAndroid Build Coastguard Worker 	     ((sec_stat & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_FAST) ? "fast" : "??",
654*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_SIG_TARGET_ABORT),
655*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_REC_TARGET_ABORT),
656*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_REC_MASTER_ABORT),
657*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_SIG_SYSTEM_ERROR),
658*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(sec_stat, PCI_STATUS_DETECTED_PARITY));
659*c2e0c6b5SAndroid Build Coastguard Worker 
660*c2e0c6b5SAndroid Build Coastguard Worker   show_rom(d, PCI_ROM_ADDRESS1);
661*c2e0c6b5SAndroid Build Coastguard Worker 
662*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose > 1)
663*c2e0c6b5SAndroid Build Coastguard Worker     {
664*c2e0c6b5SAndroid Build Coastguard Worker       printf("\tBridgeCtl: Parity%c SERR%c NoISA%c VGA%c VGA16%c MAbort%c >Reset%c FastB2B%c\n",
665*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_PARITY),
666*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_SERR),
667*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_NO_ISA),
668*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_VGA),
669*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_VGA_16BIT),
670*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_MASTER_ABORT),
671*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_BUS_RESET),
672*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_FAST_BACK));
673*c2e0c6b5SAndroid Build Coastguard Worker       printf("\t\tPriDiscTmr%c SecDiscTmr%c DiscTmrStat%c DiscTmrSERREn%c\n",
674*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_PRI_DISCARD_TIMER),
675*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_SEC_DISCARD_TIMER),
676*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_DISCARD_TIMER_STATUS),
677*c2e0c6b5SAndroid Build Coastguard Worker 	FLAG(brc, PCI_BRIDGE_CTL_DISCARD_TIMER_SERR_EN));
678*c2e0c6b5SAndroid Build Coastguard Worker     }
679*c2e0c6b5SAndroid Build Coastguard Worker 
680*c2e0c6b5SAndroid Build Coastguard Worker   show_caps(d, PCI_CAPABILITY_LIST);
681*c2e0c6b5SAndroid Build Coastguard Worker }
682*c2e0c6b5SAndroid Build Coastguard Worker 
683*c2e0c6b5SAndroid Build Coastguard Worker static void
show_htype2(struct device * d)684*c2e0c6b5SAndroid Build Coastguard Worker show_htype2(struct device *d)
685*c2e0c6b5SAndroid Build Coastguard Worker {
686*c2e0c6b5SAndroid Build Coastguard Worker   int i;
687*c2e0c6b5SAndroid Build Coastguard Worker   word cmd = get_conf_word(d, PCI_COMMAND);
688*c2e0c6b5SAndroid Build Coastguard Worker   word brc = get_conf_word(d, PCI_CB_BRIDGE_CONTROL);
689*c2e0c6b5SAndroid Build Coastguard Worker   word exca;
690*c2e0c6b5SAndroid Build Coastguard Worker   int verb = verbose > 2;
691*c2e0c6b5SAndroid Build Coastguard Worker 
692*c2e0c6b5SAndroid Build Coastguard Worker   show_bases(d, 1, 0);
693*c2e0c6b5SAndroid Build Coastguard Worker   printf("\tBus: primary=%02x, secondary=%02x, subordinate=%02x, sec-latency=%d\n",
694*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_CB_PRIMARY_BUS),
695*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_CB_CARD_BUS),
696*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_CB_SUBORDINATE_BUS),
697*c2e0c6b5SAndroid Build Coastguard Worker 	 get_conf_byte(d, PCI_CB_LATENCY_TIMER));
698*c2e0c6b5SAndroid Build Coastguard Worker   for (i=0; i<2; i++)
699*c2e0c6b5SAndroid Build Coastguard Worker     {
700*c2e0c6b5SAndroid Build Coastguard Worker       int p = 8*i;
701*c2e0c6b5SAndroid Build Coastguard Worker       u32 base = get_conf_long(d, PCI_CB_MEMORY_BASE_0 + p);
702*c2e0c6b5SAndroid Build Coastguard Worker       u32 limit = get_conf_long(d, PCI_CB_MEMORY_LIMIT_0 + p);
703*c2e0c6b5SAndroid Build Coastguard Worker       limit = limit + 0xfff;
704*c2e0c6b5SAndroid Build Coastguard Worker       if (base <= limit || verb)
705*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tMemory window %d: %08x-%08x%s%s\n", i, base, limit,
706*c2e0c6b5SAndroid Build Coastguard Worker 	       (cmd & PCI_COMMAND_MEMORY) ? "" : " [disabled]",
707*c2e0c6b5SAndroid Build Coastguard Worker 	       (brc & (PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 << i)) ? " (prefetchable)" : "");
708*c2e0c6b5SAndroid Build Coastguard Worker     }
709*c2e0c6b5SAndroid Build Coastguard Worker   for (i=0; i<2; i++)
710*c2e0c6b5SAndroid Build Coastguard Worker     {
711*c2e0c6b5SAndroid Build Coastguard Worker       int p = 8*i;
712*c2e0c6b5SAndroid Build Coastguard Worker       u32 base = get_conf_long(d, PCI_CB_IO_BASE_0 + p);
713*c2e0c6b5SAndroid Build Coastguard Worker       u32 limit = get_conf_long(d, PCI_CB_IO_LIMIT_0 + p);
714*c2e0c6b5SAndroid Build Coastguard Worker       if (!(base & PCI_IO_RANGE_TYPE_32))
715*c2e0c6b5SAndroid Build Coastguard Worker 	{
716*c2e0c6b5SAndroid Build Coastguard Worker 	  base &= 0xffff;
717*c2e0c6b5SAndroid Build Coastguard Worker 	  limit &= 0xffff;
718*c2e0c6b5SAndroid Build Coastguard Worker 	}
719*c2e0c6b5SAndroid Build Coastguard Worker       base &= PCI_CB_IO_RANGE_MASK;
720*c2e0c6b5SAndroid Build Coastguard Worker       limit = (limit & PCI_CB_IO_RANGE_MASK) + 3;
721*c2e0c6b5SAndroid Build Coastguard Worker       if (base <= limit || verb)
722*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tI/O window %d: %08x-%08x%s\n", i, base, limit,
723*c2e0c6b5SAndroid Build Coastguard Worker 	       (cmd & PCI_COMMAND_IO) ? "" : " [disabled]");
724*c2e0c6b5SAndroid Build Coastguard Worker     }
725*c2e0c6b5SAndroid Build Coastguard Worker 
726*c2e0c6b5SAndroid Build Coastguard Worker   if (get_conf_word(d, PCI_CB_SEC_STATUS) & PCI_STATUS_SIG_SYSTEM_ERROR)
727*c2e0c6b5SAndroid Build Coastguard Worker     printf("\tSecondary status: SERR\n");
728*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose > 1)
729*c2e0c6b5SAndroid Build Coastguard Worker     printf("\tBridgeCtl: Parity%c SERR%c ISA%c VGA%c MAbort%c >Reset%c 16bInt%c PostWrite%c\n",
730*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_PARITY),
731*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_SERR),
732*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_ISA),
733*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_VGA),
734*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_MASTER_ABORT),
735*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_CB_RESET),
736*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_16BIT_INT),
737*c2e0c6b5SAndroid Build Coastguard Worker 	   FLAG(brc, PCI_CB_BRIDGE_CTL_POST_WRITES));
738*c2e0c6b5SAndroid Build Coastguard Worker 
739*c2e0c6b5SAndroid Build Coastguard Worker   if (d->config_cached < 128)
740*c2e0c6b5SAndroid Build Coastguard Worker     {
741*c2e0c6b5SAndroid Build Coastguard Worker       printf("\t<access denied to the rest>\n");
742*c2e0c6b5SAndroid Build Coastguard Worker       return;
743*c2e0c6b5SAndroid Build Coastguard Worker     }
744*c2e0c6b5SAndroid Build Coastguard Worker 
745*c2e0c6b5SAndroid Build Coastguard Worker   exca = get_conf_word(d, PCI_CB_LEGACY_MODE_BASE);
746*c2e0c6b5SAndroid Build Coastguard Worker   if (exca)
747*c2e0c6b5SAndroid Build Coastguard Worker     printf("\t16-bit legacy interface ports at %04x\n", exca);
748*c2e0c6b5SAndroid Build Coastguard Worker   show_caps(d, PCI_CB_CAPABILITY_LIST);
749*c2e0c6b5SAndroid Build Coastguard Worker }
750*c2e0c6b5SAndroid Build Coastguard Worker 
751*c2e0c6b5SAndroid Build Coastguard Worker static void
show_htype_unknown(struct device * d)752*c2e0c6b5SAndroid Build Coastguard Worker show_htype_unknown(struct device *d)
753*c2e0c6b5SAndroid Build Coastguard Worker {
754*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
755*c2e0c6b5SAndroid Build Coastguard Worker   u64 base, limit, flags;
756*c2e0c6b5SAndroid Build Coastguard Worker   const char *str;
757*c2e0c6b5SAndroid Build Coastguard Worker   int i, bits;
758*c2e0c6b5SAndroid Build Coastguard Worker 
759*c2e0c6b5SAndroid Build Coastguard Worker   if (pacc->buscentric)
760*c2e0c6b5SAndroid Build Coastguard Worker     return;
761*c2e0c6b5SAndroid Build Coastguard Worker 
762*c2e0c6b5SAndroid Build Coastguard Worker   show_bases(d, 6, 1);
763*c2e0c6b5SAndroid Build Coastguard Worker   for (i = 0; i < 4; i++)
764*c2e0c6b5SAndroid Build Coastguard Worker     {
765*c2e0c6b5SAndroid Build Coastguard Worker       if (!p->bridge_base_addr[i])
766*c2e0c6b5SAndroid Build Coastguard Worker         continue;
767*c2e0c6b5SAndroid Build Coastguard Worker       base = p->bridge_base_addr[i];
768*c2e0c6b5SAndroid Build Coastguard Worker       limit = base + p->bridge_size[i] - 1;
769*c2e0c6b5SAndroid Build Coastguard Worker       flags = p->bridge_flags[i];
770*c2e0c6b5SAndroid Build Coastguard Worker       if (flags & PCI_IORESOURCE_IO)
771*c2e0c6b5SAndroid Build Coastguard Worker         {
772*c2e0c6b5SAndroid Build Coastguard Worker           bits = (flags & PCI_IORESOURCE_IO_16BIT_ADDR) ? 16 : 32;
773*c2e0c6b5SAndroid Build Coastguard Worker           str = "\tI/O behind bridge";
774*c2e0c6b5SAndroid Build Coastguard Worker         }
775*c2e0c6b5SAndroid Build Coastguard Worker       else if (flags & PCI_IORESOURCE_MEM)
776*c2e0c6b5SAndroid Build Coastguard Worker         {
777*c2e0c6b5SAndroid Build Coastguard Worker           bits = (flags & PCI_IORESOURCE_MEM_64) ? 64 : 32;
778*c2e0c6b5SAndroid Build Coastguard Worker           if (flags & PCI_IORESOURCE_PREFETCH)
779*c2e0c6b5SAndroid Build Coastguard Worker             str = "\tPrefetchable memory behind bridge";
780*c2e0c6b5SAndroid Build Coastguard Worker           else
781*c2e0c6b5SAndroid Build Coastguard Worker             str = "\tMemory behind bridge";
782*c2e0c6b5SAndroid Build Coastguard Worker         }
783*c2e0c6b5SAndroid Build Coastguard Worker       else
784*c2e0c6b5SAndroid Build Coastguard Worker         {
785*c2e0c6b5SAndroid Build Coastguard Worker           bits = 0;
786*c2e0c6b5SAndroid Build Coastguard Worker           str = "\tUnknown resource behind bridge";
787*c2e0c6b5SAndroid Build Coastguard Worker         }
788*c2e0c6b5SAndroid Build Coastguard Worker       show_range(str, base, limit, bits, 0);
789*c2e0c6b5SAndroid Build Coastguard Worker     }
790*c2e0c6b5SAndroid Build Coastguard Worker   show_rom(d, -1);
791*c2e0c6b5SAndroid Build Coastguard Worker }
792*c2e0c6b5SAndroid Build Coastguard Worker 
793*c2e0c6b5SAndroid Build Coastguard Worker static void
show_verbose(struct device * d)794*c2e0c6b5SAndroid Build Coastguard Worker show_verbose(struct device *d)
795*c2e0c6b5SAndroid Build Coastguard Worker {
796*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
797*c2e0c6b5SAndroid Build Coastguard Worker   int unknown_config_data = 0;
798*c2e0c6b5SAndroid Build Coastguard Worker   word class = p->device_class;
799*c2e0c6b5SAndroid Build Coastguard Worker   byte htype = d->no_config_access ? -1 : (get_conf_byte(d, PCI_HEADER_TYPE) & 0x7f);
800*c2e0c6b5SAndroid Build Coastguard Worker   byte bist;
801*c2e0c6b5SAndroid Build Coastguard Worker   byte max_lat, min_gnt;
802*c2e0c6b5SAndroid Build Coastguard Worker   char *dt_node, *iommu_group;
803*c2e0c6b5SAndroid Build Coastguard Worker 
804*c2e0c6b5SAndroid Build Coastguard Worker   show_terse(d);
805*c2e0c6b5SAndroid Build Coastguard Worker 
806*c2e0c6b5SAndroid Build Coastguard Worker   pci_fill_info(p, PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES |
807*c2e0c6b5SAndroid Build Coastguard Worker     PCI_FILL_PHYS_SLOT | PCI_FILL_NUMA_NODE | PCI_FILL_DT_NODE | PCI_FILL_IOMMU_GROUP |
808*c2e0c6b5SAndroid Build Coastguard Worker     PCI_FILL_BRIDGE_BASES | PCI_FILL_CLASS_EXT | PCI_FILL_SUBSYS | PCI_FILL_RCD_LNK);
809*c2e0c6b5SAndroid Build Coastguard Worker 
810*c2e0c6b5SAndroid Build Coastguard Worker   switch (htype)
811*c2e0c6b5SAndroid Build Coastguard Worker     {
812*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_NORMAL:
813*c2e0c6b5SAndroid Build Coastguard Worker       if (class == PCI_CLASS_BRIDGE_PCI)
814*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\t!!! Invalid class %04x for header type %02x\n", class, htype);
815*c2e0c6b5SAndroid Build Coastguard Worker       bist = get_conf_byte(d, PCI_BIST);
816*c2e0c6b5SAndroid Build Coastguard Worker       max_lat = get_conf_byte(d, PCI_MAX_LAT);
817*c2e0c6b5SAndroid Build Coastguard Worker       min_gnt = get_conf_byte(d, PCI_MIN_GNT);
818*c2e0c6b5SAndroid Build Coastguard Worker       break;
819*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_BRIDGE:
820*c2e0c6b5SAndroid Build Coastguard Worker       if ((class >> 8) != PCI_BASE_CLASS_BRIDGE)
821*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\t!!! Invalid class %04x for header type %02x\n", class, htype);
822*c2e0c6b5SAndroid Build Coastguard Worker       bist = get_conf_byte(d, PCI_BIST);
823*c2e0c6b5SAndroid Build Coastguard Worker       min_gnt = max_lat = 0;
824*c2e0c6b5SAndroid Build Coastguard Worker       break;
825*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_CARDBUS:
826*c2e0c6b5SAndroid Build Coastguard Worker       if ((class >> 8) != PCI_BASE_CLASS_BRIDGE)
827*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\t!!! Invalid class %04x for header type %02x\n", class, htype);
828*c2e0c6b5SAndroid Build Coastguard Worker       bist = get_conf_byte(d, PCI_BIST);
829*c2e0c6b5SAndroid Build Coastguard Worker       min_gnt = max_lat = 0;
830*c2e0c6b5SAndroid Build Coastguard Worker       break;
831*c2e0c6b5SAndroid Build Coastguard Worker     default:
832*c2e0c6b5SAndroid Build Coastguard Worker       if (!d->no_config_access)
833*c2e0c6b5SAndroid Build Coastguard Worker       printf("\t!!! Unknown header type %02x\n", htype);
834*c2e0c6b5SAndroid Build Coastguard Worker       bist = 0;
835*c2e0c6b5SAndroid Build Coastguard Worker       min_gnt = max_lat = 0;
836*c2e0c6b5SAndroid Build Coastguard Worker       unknown_config_data = 1;
837*c2e0c6b5SAndroid Build Coastguard Worker     }
838*c2e0c6b5SAndroid Build Coastguard Worker 
839*c2e0c6b5SAndroid Build Coastguard Worker   if (p->phy_slot)
840*c2e0c6b5SAndroid Build Coastguard Worker     printf("\tPhysical Slot: %s\n", p->phy_slot);
841*c2e0c6b5SAndroid Build Coastguard Worker 
842*c2e0c6b5SAndroid Build Coastguard Worker   if (dt_node = pci_get_string_property(p, PCI_FILL_DT_NODE))
843*c2e0c6b5SAndroid Build Coastguard Worker     printf("\tDevice tree node: %s\n", dt_node);
844*c2e0c6b5SAndroid Build Coastguard Worker 
845*c2e0c6b5SAndroid Build Coastguard Worker   if (!unknown_config_data && verbose > 1)
846*c2e0c6b5SAndroid Build Coastguard Worker     {
847*c2e0c6b5SAndroid Build Coastguard Worker       word cmd = get_conf_word(d, PCI_COMMAND);
848*c2e0c6b5SAndroid Build Coastguard Worker       word status = get_conf_word(d, PCI_STATUS);
849*c2e0c6b5SAndroid Build Coastguard Worker       printf("\tControl: I/O%c Mem%c BusMaster%c SpecCycle%c MemWINV%c VGASnoop%c ParErr%c Stepping%c SERR%c FastB2B%c DisINTx%c\n",
850*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_IO),
851*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_MEMORY),
852*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_MASTER),
853*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_SPECIAL),
854*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_INVALIDATE),
855*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_VGA_PALETTE),
856*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_PARITY),
857*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_WAIT),
858*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_SERR),
859*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_FAST_BACK),
860*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(cmd, PCI_COMMAND_DISABLE_INTx));
861*c2e0c6b5SAndroid Build Coastguard Worker       printf("\tStatus: Cap%c 66MHz%c UDF%c FastB2B%c ParErr%c DEVSEL=%s >TAbort%c <TAbort%c <MAbort%c >SERR%c <PERR%c INTx%c\n",
862*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_CAP_LIST),
863*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_66MHZ),
864*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_UDF),
865*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_FAST_BACK),
866*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_PARITY),
867*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_SLOW) ? "slow" :
868*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_MEDIUM) ? "medium" :
869*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_FAST) ? "fast" : "??",
870*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_SIG_TARGET_ABORT),
871*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_REC_TARGET_ABORT),
872*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_REC_MASTER_ABORT),
873*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_SIG_SYSTEM_ERROR),
874*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_DETECTED_PARITY),
875*c2e0c6b5SAndroid Build Coastguard Worker 	     FLAG(status, PCI_STATUS_INTx));
876*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_MASTER)
877*c2e0c6b5SAndroid Build Coastguard Worker 	{
878*c2e0c6b5SAndroid Build Coastguard Worker 	  byte latency = get_conf_byte(d, PCI_LATENCY_TIMER);
879*c2e0c6b5SAndroid Build Coastguard Worker 	  byte cache_line = get_conf_byte(d, PCI_CACHE_LINE_SIZE);
880*c2e0c6b5SAndroid Build Coastguard Worker 	  printf("\tLatency: %d", latency);
881*c2e0c6b5SAndroid Build Coastguard Worker 	  if (min_gnt || max_lat)
882*c2e0c6b5SAndroid Build Coastguard Worker 	    {
883*c2e0c6b5SAndroid Build Coastguard Worker 	      printf(" (");
884*c2e0c6b5SAndroid Build Coastguard Worker 	      if (min_gnt)
885*c2e0c6b5SAndroid Build Coastguard Worker 		printf("%dns min", min_gnt*250);
886*c2e0c6b5SAndroid Build Coastguard Worker 	      if (min_gnt && max_lat)
887*c2e0c6b5SAndroid Build Coastguard Worker 		printf(", ");
888*c2e0c6b5SAndroid Build Coastguard Worker 	      if (max_lat)
889*c2e0c6b5SAndroid Build Coastguard Worker 		printf("%dns max", max_lat*250);
890*c2e0c6b5SAndroid Build Coastguard Worker 	      putchar(')');
891*c2e0c6b5SAndroid Build Coastguard Worker 	    }
892*c2e0c6b5SAndroid Build Coastguard Worker 	  if (cache_line)
893*c2e0c6b5SAndroid Build Coastguard Worker 	    printf(", Cache Line Size: %d bytes", cache_line * 4);
894*c2e0c6b5SAndroid Build Coastguard Worker 	  putchar('\n');
895*c2e0c6b5SAndroid Build Coastguard Worker 	}
896*c2e0c6b5SAndroid Build Coastguard Worker     }
897*c2e0c6b5SAndroid Build Coastguard Worker 
898*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose > 1)
899*c2e0c6b5SAndroid Build Coastguard Worker     {
900*c2e0c6b5SAndroid Build Coastguard Worker       byte int_pin = unknown_config_data ? 0 : get_conf_byte(d, PCI_INTERRUPT_PIN);
901*c2e0c6b5SAndroid Build Coastguard Worker       if (int_pin || p->irq)
902*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tInterrupt: pin %c routed to IRQ " PCIIRQ_FMT "\n",
903*c2e0c6b5SAndroid Build Coastguard Worker 	       (int_pin ? 'A' + int_pin - 1 : '?'), p->irq);
904*c2e0c6b5SAndroid Build Coastguard Worker       if (p->numa_node != -1)
905*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tNUMA node: %d\n", p->numa_node);
906*c2e0c6b5SAndroid Build Coastguard Worker       if (iommu_group = pci_get_string_property(p, PCI_FILL_IOMMU_GROUP))
907*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tIOMMU group: %s\n", iommu_group);
908*c2e0c6b5SAndroid Build Coastguard Worker     }
909*c2e0c6b5SAndroid Build Coastguard Worker 
910*c2e0c6b5SAndroid Build Coastguard Worker   if (!unknown_config_data && verbose <= 1)
911*c2e0c6b5SAndroid Build Coastguard Worker     {
912*c2e0c6b5SAndroid Build Coastguard Worker       word cmd = get_conf_word(d, PCI_COMMAND);
913*c2e0c6b5SAndroid Build Coastguard Worker       word status = get_conf_word(d, PCI_STATUS);
914*c2e0c6b5SAndroid Build Coastguard Worker       byte latency = get_conf_byte(d, PCI_LATENCY_TIMER);
915*c2e0c6b5SAndroid Build Coastguard Worker       printf("\tFlags: ");
916*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_MASTER)
917*c2e0c6b5SAndroid Build Coastguard Worker 	printf("bus master, ");
918*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_VGA_PALETTE)
919*c2e0c6b5SAndroid Build Coastguard Worker 	printf("VGA palette snoop, ");
920*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_WAIT)
921*c2e0c6b5SAndroid Build Coastguard Worker 	printf("stepping, ");
922*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_FAST_BACK)
923*c2e0c6b5SAndroid Build Coastguard Worker 	printf("fast Back2Back, ");
924*c2e0c6b5SAndroid Build Coastguard Worker       if (status & PCI_STATUS_66MHZ)
925*c2e0c6b5SAndroid Build Coastguard Worker 	printf("66MHz, ");
926*c2e0c6b5SAndroid Build Coastguard Worker       if (status & PCI_STATUS_UDF)
927*c2e0c6b5SAndroid Build Coastguard Worker 	printf("user-definable features, ");
928*c2e0c6b5SAndroid Build Coastguard Worker       printf("%s devsel",
929*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_SLOW) ? "slow" :
930*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_MEDIUM) ? "medium" :
931*c2e0c6b5SAndroid Build Coastguard Worker 	     ((status & PCI_STATUS_DEVSEL_MASK) == PCI_STATUS_DEVSEL_FAST) ? "fast" : "??");
932*c2e0c6b5SAndroid Build Coastguard Worker       if (cmd & PCI_COMMAND_MASTER)
933*c2e0c6b5SAndroid Build Coastguard Worker 	printf(", latency %d", latency);
934*c2e0c6b5SAndroid Build Coastguard Worker       if (p->irq)
935*c2e0c6b5SAndroid Build Coastguard Worker 	printf(", IRQ " PCIIRQ_FMT, p->irq);
936*c2e0c6b5SAndroid Build Coastguard Worker       if (p->numa_node != -1)
937*c2e0c6b5SAndroid Build Coastguard Worker 	printf(", NUMA node %d", p->numa_node);
938*c2e0c6b5SAndroid Build Coastguard Worker       if (iommu_group = pci_get_string_property(p, PCI_FILL_IOMMU_GROUP))
939*c2e0c6b5SAndroid Build Coastguard Worker 	printf(", IOMMU group %s", iommu_group);
940*c2e0c6b5SAndroid Build Coastguard Worker       putchar('\n');
941*c2e0c6b5SAndroid Build Coastguard Worker     }
942*c2e0c6b5SAndroid Build Coastguard Worker 
943*c2e0c6b5SAndroid Build Coastguard Worker   if (bist & PCI_BIST_CAPABLE)
944*c2e0c6b5SAndroid Build Coastguard Worker     {
945*c2e0c6b5SAndroid Build Coastguard Worker       if (bist & PCI_BIST_START)
946*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tBIST is running\n");
947*c2e0c6b5SAndroid Build Coastguard Worker       else
948*c2e0c6b5SAndroid Build Coastguard Worker 	printf("\tBIST result: %02x\n", bist & PCI_BIST_CODE_MASK);
949*c2e0c6b5SAndroid Build Coastguard Worker     }
950*c2e0c6b5SAndroid Build Coastguard Worker 
951*c2e0c6b5SAndroid Build Coastguard Worker   switch (htype)
952*c2e0c6b5SAndroid Build Coastguard Worker     {
953*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_NORMAL:
954*c2e0c6b5SAndroid Build Coastguard Worker       show_htype0(d);
955*c2e0c6b5SAndroid Build Coastguard Worker       break;
956*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_BRIDGE:
957*c2e0c6b5SAndroid Build Coastguard Worker       show_htype1(d);
958*c2e0c6b5SAndroid Build Coastguard Worker       break;
959*c2e0c6b5SAndroid Build Coastguard Worker     case PCI_HEADER_TYPE_CARDBUS:
960*c2e0c6b5SAndroid Build Coastguard Worker       show_htype2(d);
961*c2e0c6b5SAndroid Build Coastguard Worker       break;
962*c2e0c6b5SAndroid Build Coastguard Worker     default:
963*c2e0c6b5SAndroid Build Coastguard Worker       show_htype_unknown(d);
964*c2e0c6b5SAndroid Build Coastguard Worker     }
965*c2e0c6b5SAndroid Build Coastguard Worker }
966*c2e0c6b5SAndroid Build Coastguard Worker 
967*c2e0c6b5SAndroid Build Coastguard Worker /*** Machine-readable dumps ***/
968*c2e0c6b5SAndroid Build Coastguard Worker 
969*c2e0c6b5SAndroid Build Coastguard Worker static void
show_hex_dump(struct device * d)970*c2e0c6b5SAndroid Build Coastguard Worker show_hex_dump(struct device *d)
971*c2e0c6b5SAndroid Build Coastguard Worker {
972*c2e0c6b5SAndroid Build Coastguard Worker   unsigned int i, cnt;
973*c2e0c6b5SAndroid Build Coastguard Worker 
974*c2e0c6b5SAndroid Build Coastguard Worker   if (d->no_config_access)
975*c2e0c6b5SAndroid Build Coastguard Worker     {
976*c2e0c6b5SAndroid Build Coastguard Worker       printf("WARNING: Cannot show hex-dump of the config space\n");
977*c2e0c6b5SAndroid Build Coastguard Worker       return;
978*c2e0c6b5SAndroid Build Coastguard Worker     }
979*c2e0c6b5SAndroid Build Coastguard Worker 
980*c2e0c6b5SAndroid Build Coastguard Worker   cnt = d->config_cached;
981*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_hex >= 3 && config_fetch(d, cnt, 256-cnt))
982*c2e0c6b5SAndroid Build Coastguard Worker     {
983*c2e0c6b5SAndroid Build Coastguard Worker       cnt = 256;
984*c2e0c6b5SAndroid Build Coastguard Worker       if (opt_hex >= 4 && config_fetch(d, 256, 4096-256))
985*c2e0c6b5SAndroid Build Coastguard Worker 	cnt = 4096;
986*c2e0c6b5SAndroid Build Coastguard Worker     }
987*c2e0c6b5SAndroid Build Coastguard Worker 
988*c2e0c6b5SAndroid Build Coastguard Worker   for (i=0; i<cnt; i++)
989*c2e0c6b5SAndroid Build Coastguard Worker     {
990*c2e0c6b5SAndroid Build Coastguard Worker       if (! (i & 15))
991*c2e0c6b5SAndroid Build Coastguard Worker 	printf("%02x:", i);
992*c2e0c6b5SAndroid Build Coastguard Worker       printf(" %02x", get_conf_byte(d, i));
993*c2e0c6b5SAndroid Build Coastguard Worker       if ((i & 15) == 15)
994*c2e0c6b5SAndroid Build Coastguard Worker 	putchar('\n');
995*c2e0c6b5SAndroid Build Coastguard Worker     }
996*c2e0c6b5SAndroid Build Coastguard Worker }
997*c2e0c6b5SAndroid Build Coastguard Worker 
998*c2e0c6b5SAndroid Build Coastguard Worker static void
print_shell_escaped(char * c)999*c2e0c6b5SAndroid Build Coastguard Worker print_shell_escaped(char *c)
1000*c2e0c6b5SAndroid Build Coastguard Worker {
1001*c2e0c6b5SAndroid Build Coastguard Worker   printf(" \"");
1002*c2e0c6b5SAndroid Build Coastguard Worker   while (*c)
1003*c2e0c6b5SAndroid Build Coastguard Worker     {
1004*c2e0c6b5SAndroid Build Coastguard Worker       if (*c == '"' || *c == '\\')
1005*c2e0c6b5SAndroid Build Coastguard Worker 	putchar('\\');
1006*c2e0c6b5SAndroid Build Coastguard Worker       putchar(*c++);
1007*c2e0c6b5SAndroid Build Coastguard Worker     }
1008*c2e0c6b5SAndroid Build Coastguard Worker   putchar('"');
1009*c2e0c6b5SAndroid Build Coastguard Worker }
1010*c2e0c6b5SAndroid Build Coastguard Worker 
1011*c2e0c6b5SAndroid Build Coastguard Worker static void
show_machine(struct device * d)1012*c2e0c6b5SAndroid Build Coastguard Worker show_machine(struct device *d)
1013*c2e0c6b5SAndroid Build Coastguard Worker {
1014*c2e0c6b5SAndroid Build Coastguard Worker   struct pci_dev *p = d->dev;
1015*c2e0c6b5SAndroid Build Coastguard Worker   char classbuf[256], vendbuf[256], devbuf[256], svbuf[256], sdbuf[256];
1016*c2e0c6b5SAndroid Build Coastguard Worker   char *dt_node, *iommu_group;
1017*c2e0c6b5SAndroid Build Coastguard Worker 
1018*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose)
1019*c2e0c6b5SAndroid Build Coastguard Worker     {
1020*c2e0c6b5SAndroid Build Coastguard Worker       pci_fill_info(p, PCI_FILL_PHYS_SLOT | PCI_FILL_NUMA_NODE | PCI_FILL_DT_NODE | PCI_FILL_IOMMU_GROUP);
1021*c2e0c6b5SAndroid Build Coastguard Worker       printf((opt_machine >= 2) ? "Slot:\t" : "Device:\t");
1022*c2e0c6b5SAndroid Build Coastguard Worker       show_slot_name(d);
1023*c2e0c6b5SAndroid Build Coastguard Worker       putchar('\n');
1024*c2e0c6b5SAndroid Build Coastguard Worker       printf("Class:\t%s\n",
1025*c2e0c6b5SAndroid Build Coastguard Worker 	     pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, p->device_class));
1026*c2e0c6b5SAndroid Build Coastguard Worker       printf("Vendor:\t%s\n",
1027*c2e0c6b5SAndroid Build Coastguard Worker 	     pci_lookup_name(pacc, vendbuf, sizeof(vendbuf), PCI_LOOKUP_VENDOR, p->vendor_id, p->device_id));
1028*c2e0c6b5SAndroid Build Coastguard Worker       printf("Device:\t%s\n",
1029*c2e0c6b5SAndroid Build Coastguard Worker 	     pci_lookup_name(pacc, devbuf, sizeof(devbuf), PCI_LOOKUP_DEVICE, p->vendor_id, p->device_id));
1030*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_SUBSYS) &&
1031*c2e0c6b5SAndroid Build Coastguard Worker 	  p->subsys_vendor_id && p->subsys_vendor_id != 0xffff)
1032*c2e0c6b5SAndroid Build Coastguard Worker 	{
1033*c2e0c6b5SAndroid Build Coastguard Worker 	  printf("SVendor:\t%s\n",
1034*c2e0c6b5SAndroid Build Coastguard Worker 		 pci_lookup_name(pacc, svbuf, sizeof(svbuf), PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR, p->subsys_vendor_id));
1035*c2e0c6b5SAndroid Build Coastguard Worker 	  printf("SDevice:\t%s\n",
1036*c2e0c6b5SAndroid Build Coastguard Worker 		 pci_lookup_name(pacc, sdbuf, sizeof(sdbuf), PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE, p->vendor_id, p->device_id, p->subsys_vendor_id, p->subsys_id));
1037*c2e0c6b5SAndroid Build Coastguard Worker 	}
1038*c2e0c6b5SAndroid Build Coastguard Worker       if (p->phy_slot)
1039*c2e0c6b5SAndroid Build Coastguard Worker 	printf("PhySlot:\t%s\n", p->phy_slot);
1040*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_CLASS_EXT) && p->rev_id)
1041*c2e0c6b5SAndroid Build Coastguard Worker 	printf("Rev:\t%02x\n", p->rev_id);
1042*c2e0c6b5SAndroid Build Coastguard Worker       if (p->known_fields & PCI_FILL_CLASS_EXT)
1043*c2e0c6b5SAndroid Build Coastguard Worker 	printf("ProgIf:\t%02x\n", p->prog_if);
1044*c2e0c6b5SAndroid Build Coastguard Worker       if (opt_kernel)
1045*c2e0c6b5SAndroid Build Coastguard Worker 	show_kernel_machine(d);
1046*c2e0c6b5SAndroid Build Coastguard Worker       if (p->numa_node != -1)
1047*c2e0c6b5SAndroid Build Coastguard Worker 	printf("NUMANode:\t%d\n", p->numa_node);
1048*c2e0c6b5SAndroid Build Coastguard Worker       if (dt_node = pci_get_string_property(p, PCI_FILL_DT_NODE))
1049*c2e0c6b5SAndroid Build Coastguard Worker         printf("DTNode:\t%s\n", dt_node);
1050*c2e0c6b5SAndroid Build Coastguard Worker       if (iommu_group = pci_get_string_property(p, PCI_FILL_IOMMU_GROUP))
1051*c2e0c6b5SAndroid Build Coastguard Worker 	printf("IOMMUGroup:\t%s\n", iommu_group);
1052*c2e0c6b5SAndroid Build Coastguard Worker     }
1053*c2e0c6b5SAndroid Build Coastguard Worker   else
1054*c2e0c6b5SAndroid Build Coastguard Worker     {
1055*c2e0c6b5SAndroid Build Coastguard Worker       show_slot_name(d);
1056*c2e0c6b5SAndroid Build Coastguard Worker       print_shell_escaped(pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, p->device_class));
1057*c2e0c6b5SAndroid Build Coastguard Worker       print_shell_escaped(pci_lookup_name(pacc, vendbuf, sizeof(vendbuf), PCI_LOOKUP_VENDOR, p->vendor_id, p->device_id));
1058*c2e0c6b5SAndroid Build Coastguard Worker       print_shell_escaped(pci_lookup_name(pacc, devbuf, sizeof(devbuf), PCI_LOOKUP_DEVICE, p->vendor_id, p->device_id));
1059*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_CLASS_EXT) && p->rev_id)
1060*c2e0c6b5SAndroid Build Coastguard Worker 	printf(" -r%02x", p->rev_id);
1061*c2e0c6b5SAndroid Build Coastguard Worker       if (p->known_fields & PCI_FILL_CLASS_EXT)
1062*c2e0c6b5SAndroid Build Coastguard Worker 	printf(" -p%02x", p->prog_if);
1063*c2e0c6b5SAndroid Build Coastguard Worker       if ((p->known_fields & PCI_FILL_SUBSYS) &&
1064*c2e0c6b5SAndroid Build Coastguard Worker 	  p->subsys_vendor_id && p->subsys_vendor_id != 0xffff)
1065*c2e0c6b5SAndroid Build Coastguard Worker 	{
1066*c2e0c6b5SAndroid Build Coastguard Worker 	  print_shell_escaped(pci_lookup_name(pacc, svbuf, sizeof(svbuf), PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR, p->subsys_vendor_id));
1067*c2e0c6b5SAndroid Build Coastguard Worker 	  print_shell_escaped(pci_lookup_name(pacc, sdbuf, sizeof(sdbuf), PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE, p->vendor_id, p->device_id, p->subsys_vendor_id, p->subsys_id));
1068*c2e0c6b5SAndroid Build Coastguard Worker 	}
1069*c2e0c6b5SAndroid Build Coastguard Worker       else
1070*c2e0c6b5SAndroid Build Coastguard Worker 	printf(" \"\" \"\"");
1071*c2e0c6b5SAndroid Build Coastguard Worker       putchar('\n');
1072*c2e0c6b5SAndroid Build Coastguard Worker     }
1073*c2e0c6b5SAndroid Build Coastguard Worker }
1074*c2e0c6b5SAndroid Build Coastguard Worker 
1075*c2e0c6b5SAndroid Build Coastguard Worker /*** Main show function ***/
1076*c2e0c6b5SAndroid Build Coastguard Worker 
1077*c2e0c6b5SAndroid Build Coastguard Worker void
show_device(struct device * d)1078*c2e0c6b5SAndroid Build Coastguard Worker show_device(struct device *d)
1079*c2e0c6b5SAndroid Build Coastguard Worker {
1080*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_machine)
1081*c2e0c6b5SAndroid Build Coastguard Worker     show_machine(d);
1082*c2e0c6b5SAndroid Build Coastguard Worker   else
1083*c2e0c6b5SAndroid Build Coastguard Worker     {
1084*c2e0c6b5SAndroid Build Coastguard Worker       if (verbose)
1085*c2e0c6b5SAndroid Build Coastguard Worker 	show_verbose(d);
1086*c2e0c6b5SAndroid Build Coastguard Worker       else
1087*c2e0c6b5SAndroid Build Coastguard Worker 	show_terse(d);
1088*c2e0c6b5SAndroid Build Coastguard Worker       if (opt_kernel || verbose)
1089*c2e0c6b5SAndroid Build Coastguard Worker 	show_kernel(d);
1090*c2e0c6b5SAndroid Build Coastguard Worker     }
1091*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_hex)
1092*c2e0c6b5SAndroid Build Coastguard Worker     show_hex_dump(d);
1093*c2e0c6b5SAndroid Build Coastguard Worker   if (verbose || opt_hex)
1094*c2e0c6b5SAndroid Build Coastguard Worker     putchar('\n');
1095*c2e0c6b5SAndroid Build Coastguard Worker }
1096*c2e0c6b5SAndroid Build Coastguard Worker 
1097*c2e0c6b5SAndroid Build Coastguard Worker static void
show(void)1098*c2e0c6b5SAndroid Build Coastguard Worker show(void)
1099*c2e0c6b5SAndroid Build Coastguard Worker {
1100*c2e0c6b5SAndroid Build Coastguard Worker   struct device *d;
1101*c2e0c6b5SAndroid Build Coastguard Worker 
1102*c2e0c6b5SAndroid Build Coastguard Worker   for (d=first_dev; d; d=d->next)
1103*c2e0c6b5SAndroid Build Coastguard Worker     if (pci_filter_match(&filter, d->dev))
1104*c2e0c6b5SAndroid Build Coastguard Worker       show_device(d);
1105*c2e0c6b5SAndroid Build Coastguard Worker }
1106*c2e0c6b5SAndroid Build Coastguard Worker 
1107*c2e0c6b5SAndroid Build Coastguard Worker /* Main */
1108*c2e0c6b5SAndroid Build Coastguard Worker 
1109*c2e0c6b5SAndroid Build Coastguard Worker int
main(int argc,char ** argv)1110*c2e0c6b5SAndroid Build Coastguard Worker main(int argc, char **argv)
1111*c2e0c6b5SAndroid Build Coastguard Worker {
1112*c2e0c6b5SAndroid Build Coastguard Worker   int i;
1113*c2e0c6b5SAndroid Build Coastguard Worker   char *msg;
1114*c2e0c6b5SAndroid Build Coastguard Worker 
1115*c2e0c6b5SAndroid Build Coastguard Worker   if (argc == 2 && !strcmp(argv[1], "--version"))
1116*c2e0c6b5SAndroid Build Coastguard Worker     {
1117*c2e0c6b5SAndroid Build Coastguard Worker       puts("lspci version " PCIUTILS_VERSION);
1118*c2e0c6b5SAndroid Build Coastguard Worker       return 0;
1119*c2e0c6b5SAndroid Build Coastguard Worker     }
1120*c2e0c6b5SAndroid Build Coastguard Worker 
1121*c2e0c6b5SAndroid Build Coastguard Worker   pacc = pci_alloc();
1122*c2e0c6b5SAndroid Build Coastguard Worker   pacc->error = die;
1123*c2e0c6b5SAndroid Build Coastguard Worker   pci_filter_init(pacc, &filter);
1124*c2e0c6b5SAndroid Build Coastguard Worker 
1125*c2e0c6b5SAndroid Build Coastguard Worker   while ((i = getopt(argc, argv, options)) != -1)
1126*c2e0c6b5SAndroid Build Coastguard Worker     switch (i)
1127*c2e0c6b5SAndroid Build Coastguard Worker       {
1128*c2e0c6b5SAndroid Build Coastguard Worker       case 'n':
1129*c2e0c6b5SAndroid Build Coastguard Worker 	pacc->numeric_ids++;
1130*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1131*c2e0c6b5SAndroid Build Coastguard Worker       case 'v':
1132*c2e0c6b5SAndroid Build Coastguard Worker 	verbose++;
1133*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1134*c2e0c6b5SAndroid Build Coastguard Worker       case 'b':
1135*c2e0c6b5SAndroid Build Coastguard Worker 	pacc->buscentric = 1;
1136*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1137*c2e0c6b5SAndroid Build Coastguard Worker       case 's':
1138*c2e0c6b5SAndroid Build Coastguard Worker 	if (msg = pci_filter_parse_slot(&filter, optarg))
1139*c2e0c6b5SAndroid Build Coastguard Worker 	  die("-s: %s", msg);
1140*c2e0c6b5SAndroid Build Coastguard Worker 	opt_filter = 1;
1141*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1142*c2e0c6b5SAndroid Build Coastguard Worker       case 'd':
1143*c2e0c6b5SAndroid Build Coastguard Worker 	if (msg = pci_filter_parse_id(&filter, optarg))
1144*c2e0c6b5SAndroid Build Coastguard Worker 	  die("-d: %s", msg);
1145*c2e0c6b5SAndroid Build Coastguard Worker 	opt_filter = 1;
1146*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1147*c2e0c6b5SAndroid Build Coastguard Worker       case 'x':
1148*c2e0c6b5SAndroid Build Coastguard Worker 	opt_hex++;
1149*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1150*c2e0c6b5SAndroid Build Coastguard Worker       case 'P':
1151*c2e0c6b5SAndroid Build Coastguard Worker 	opt_path++;
1152*c2e0c6b5SAndroid Build Coastguard Worker 	need_topology = 1;
1153*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1154*c2e0c6b5SAndroid Build Coastguard Worker       case 't':
1155*c2e0c6b5SAndroid Build Coastguard Worker 	opt_tree++;
1156*c2e0c6b5SAndroid Build Coastguard Worker 	need_topology = 1;
1157*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1158*c2e0c6b5SAndroid Build Coastguard Worker       case 'i':
1159*c2e0c6b5SAndroid Build Coastguard Worker         pci_set_name_list_path(pacc, optarg, 0);
1160*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1161*c2e0c6b5SAndroid Build Coastguard Worker       case 'm':
1162*c2e0c6b5SAndroid Build Coastguard Worker 	opt_machine++;
1163*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1164*c2e0c6b5SAndroid Build Coastguard Worker       case 'p':
1165*c2e0c6b5SAndroid Build Coastguard Worker 	opt_pcimap = optarg;
1166*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1167*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_LINUX
1168*c2e0c6b5SAndroid Build Coastguard Worker       case 'k':
1169*c2e0c6b5SAndroid Build Coastguard Worker 	opt_kernel++;
1170*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1171*c2e0c6b5SAndroid Build Coastguard Worker #endif
1172*c2e0c6b5SAndroid Build Coastguard Worker       case 'M':
1173*c2e0c6b5SAndroid Build Coastguard Worker 	opt_map_mode++;
1174*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1175*c2e0c6b5SAndroid Build Coastguard Worker       case 'D':
1176*c2e0c6b5SAndroid Build Coastguard Worker 	opt_domains = 2;
1177*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1178*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_USE_DNS
1179*c2e0c6b5SAndroid Build Coastguard Worker       case 'q':
1180*c2e0c6b5SAndroid Build Coastguard Worker 	opt_query_dns++;
1181*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1182*c2e0c6b5SAndroid Build Coastguard Worker       case 'Q':
1183*c2e0c6b5SAndroid Build Coastguard Worker 	opt_query_all = 1;
1184*c2e0c6b5SAndroid Build Coastguard Worker 	break;
1185*c2e0c6b5SAndroid Build Coastguard Worker #else
1186*c2e0c6b5SAndroid Build Coastguard Worker       case 'q':
1187*c2e0c6b5SAndroid Build Coastguard Worker       case 'Q':
1188*c2e0c6b5SAndroid Build Coastguard Worker 	die("DNS queries are not available in this version");
1189*c2e0c6b5SAndroid Build Coastguard Worker #endif
1190*c2e0c6b5SAndroid Build Coastguard Worker       default:
1191*c2e0c6b5SAndroid Build Coastguard Worker 	if (parse_generic_option(i, pacc, optarg))
1192*c2e0c6b5SAndroid Build Coastguard Worker 	  break;
1193*c2e0c6b5SAndroid Build Coastguard Worker       bad:
1194*c2e0c6b5SAndroid Build Coastguard Worker 	fprintf(stderr, help_msg, pacc->id_file_name);
1195*c2e0c6b5SAndroid Build Coastguard Worker 	return 1;
1196*c2e0c6b5SAndroid Build Coastguard Worker       }
1197*c2e0c6b5SAndroid Build Coastguard Worker   if (optind < argc)
1198*c2e0c6b5SAndroid Build Coastguard Worker     goto bad;
1199*c2e0c6b5SAndroid Build Coastguard Worker 
1200*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_query_dns)
1201*c2e0c6b5SAndroid Build Coastguard Worker     {
1202*c2e0c6b5SAndroid Build Coastguard Worker       pacc->id_lookup_mode |= PCI_LOOKUP_NETWORK;
1203*c2e0c6b5SAndroid Build Coastguard Worker       if (opt_query_dns > 1)
1204*c2e0c6b5SAndroid Build Coastguard Worker 	pacc->id_lookup_mode |= PCI_LOOKUP_REFRESH_CACHE;
1205*c2e0c6b5SAndroid Build Coastguard Worker     }
1206*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_query_all)
1207*c2e0c6b5SAndroid Build Coastguard Worker     pacc->id_lookup_mode |= PCI_LOOKUP_NETWORK | PCI_LOOKUP_SKIP_LOCAL;
1208*c2e0c6b5SAndroid Build Coastguard Worker 
1209*c2e0c6b5SAndroid Build Coastguard Worker   pci_init(pacc);
1210*c2e0c6b5SAndroid Build Coastguard Worker   if (opt_map_mode)
1211*c2e0c6b5SAndroid Build Coastguard Worker     {
1212*c2e0c6b5SAndroid Build Coastguard Worker       if (need_topology)
1213*c2e0c6b5SAndroid Build Coastguard Worker 	die("Bus mapping mode does not recognize bus topology");
1214*c2e0c6b5SAndroid Build Coastguard Worker       map_the_bus();
1215*c2e0c6b5SAndroid Build Coastguard Worker     }
1216*c2e0c6b5SAndroid Build Coastguard Worker   else
1217*c2e0c6b5SAndroid Build Coastguard Worker     {
1218*c2e0c6b5SAndroid Build Coastguard Worker       scan_devices();
1219*c2e0c6b5SAndroid Build Coastguard Worker       sort_them();
1220*c2e0c6b5SAndroid Build Coastguard Worker       if (need_topology)
1221*c2e0c6b5SAndroid Build Coastguard Worker 	grow_tree();
1222*c2e0c6b5SAndroid Build Coastguard Worker       if (opt_tree)
1223*c2e0c6b5SAndroid Build Coastguard Worker 	show_forest(opt_filter ? &filter : NULL);
1224*c2e0c6b5SAndroid Build Coastguard Worker       else
1225*c2e0c6b5SAndroid Build Coastguard Worker 	show();
1226*c2e0c6b5SAndroid Build Coastguard Worker     }
1227*c2e0c6b5SAndroid Build Coastguard Worker   show_kernel_cleanup();
1228*c2e0c6b5SAndroid Build Coastguard Worker   pci_cleanup(pacc);
1229*c2e0c6b5SAndroid Build Coastguard Worker 
1230*c2e0c6b5SAndroid Build Coastguard Worker   return (seen_errors ? 2 : 0);
1231*c2e0c6b5SAndroid Build Coastguard Worker }
1232