2 * The PCI Utilities -- Show Vendor-specific Capabilities
4 * Copyright (c) 2014 Gerd Hoffmann <kraxel@redhat.com>
6 * Can be freely distributed and used under the terms of the GNU GPL v2+.
8 * SPDX-License-Identifier: GPL-2.0-or-later
17 show_vendor_caps_virtio(struct device *d, int where, int cap)
19 int length = BITS(cap, 0, 8);
20 int type = BITS(cap, 8, 8);
29 if (!config_fetch(d, where, length))
47 tname = "SharedMemory";
54 printf("VirtIO: %s\n", tname);
59 offset = get_conf_long(d, where + 8);
60 size = get_conf_long(d, where + 12);
62 printf("\t\tBAR=%d offset=%08x size=%08x",
63 get_conf_byte(d, where + 4), offset, size);
65 offset_hi = get_conf_long(d, where + 16);
66 size_hi = get_conf_long(d, where + 20);
67 printf("\t\tBAR=%d offset=%016lx size=%016lx id=%d",
68 get_conf_byte(d, where + 4),
69 (u64) offset | (u64) offset_hi << 32,
70 (u64) size | (u64) size_hi << 32,
71 get_conf_byte(d, where + 5));
74 if (type == 2 && length >= 20)
75 printf(" multiplier=%08x", get_conf_long(d, where+16));
82 show_vendor_caps_intel(struct device *d, int where, int cap)
84 int length = BITS(cap, 0, 8);
85 int version = BITS(cap, 8, 4);
86 int type = BITS(cap, 12, 4);
91 printf("Intel Capabilities v%d\n", version);
93 * Intel Capabilities is used at least on Intel Host Bridge / DRAM Controller
94 * and Intel Integrated Graphics Controller. Format of the CAPID0_<X>
95 * registers parsed below matches Cap Version 1 which is used since second
96 * generation of the Intel Core processors (Sandy Bridge). Parsing of other
97 * versions is not currently supported.
104 printf("Intel Feature Detection\n");
106 * Intel Feature Detection Capabilities is used on Intel LPC Controller.
107 * Capabilities are accessed indirectly by writing indirect capability
108 * register to PCI config space. Because lspci cannot write to PCI config
109 * space, it is not possible to read or parse Intel Feature Vector Space.
115 printf("Intel <unknown>\n");
119 if (!config_fetch(d, where, length))
125 l = get_conf_long(d, where + 4);
127 printf(" Peg60Dis%c", FLAG(l, BIT(31)));
128 printf(" Peg12Dis%c", FLAG(l, BIT(30)));
129 printf(" Peg11Dis%c", FLAG(l, BIT(29)));
130 printf(" Peg10Dis%c", FLAG(l, BIT(28)));
131 printf(" PeLWUDis%c", FLAG(l, BIT(27)));
132 printf(" DmiWidth=x%u", (l & BIT(26)) ? 2 : 4);
134 printf(" EccDis%c", FLAG(l, BIT(25)));
135 printf(" ForceEccEn%c", FLAG(l, BIT(24)));
136 printf(" VTdDis%c", FLAG(l, BIT(23)));
137 printf(" DmiG2Dis%c", FLAG(l, BIT(22)));
138 printf(" PegG2Dis%c", FLAG(l, BIT(21)));
139 printf(" DDRMaxSize=");
140 if (BITS(l, 19, 2) == 0)
143 printf("%gGB/chan", 512 * (1 << ((3-BITS(l, 19, 2))*2)) / 1024.0);
145 printf(" 1NDis%c", FLAG(l, BIT(17)));
146 printf(" CDDis%c", FLAG(l, BIT(15)));
147 printf(" DDPCDis%c", FLAG(l, BIT(14)));
148 printf(" X2APICEn%c", FLAG(l, BIT(13)));
149 printf(" PDCDis%c", FLAG(l, BIT(12)));
150 printf(" IGDis%c", FLAG(l, BIT(11)));
151 printf(" CDID=%u", BITS(l, 8, 2));
152 printf(" CRID=%u", BITS(l, 4, 4));
154 printf(" DDROCCAP%c", FLAG(l, BIT(3)));
155 printf(" OCEn%c", FLAG(l, BIT(2)));
156 printf(" DDRWrtVrefEn%c", FLAG(l, BIT(1)));
157 printf(" DDR3LEn%c", FLAG(l, BIT(0)));
164 l = get_conf_long(d, where + 8);
166 printf(" ImguDis%c", FLAG(l, BIT(31)));
167 printf(" OCbySSKUCap%c", FLAG(l, BIT(30)));
168 printf(" OCbySSKUEn%c", FLAG(l, BIT(29)));
169 printf(" SMTCap%c", FLAG(l, BIT(28)));
170 printf(" CacheSzCap 0x%x", BITS(l, 25, 3));
172 printf(" SoftBinCap%c", FLAG(l, BIT(24)));
173 printf(" DDR3MaxFreqWithRef100=");
174 if (BITS(l, 21, 3) == 0)
176 else if (BITS(l, 21, 3) == 7)
179 printf("%uMHz", (6+BITS(l, 21, 3)) * 200);
180 printf(" PegG3Dis%c", FLAG(l, BIT(20)));
182 printf(" PkgTyp%c", FLAG(l, BIT(19)));
183 printf(" AddGfxEn%c", FLAG(l, BIT(18)));
184 printf(" AddGfxCap%c", FLAG(l, BIT(17)));
185 printf(" PegX16Dis%c", FLAG(l, BIT(16)));
186 printf(" DmiG3Dis%c", FLAG(l, BIT(15)));
187 printf(" GmmDis%c", FLAG(l, BIT(8)));
189 printf(" DDR3MaxFreq=%uMHz", (11-BITS(l, 4, 2)) * 2666 / 10);
190 printf(" LPDDR3En%c", FLAG(l, BIT(2)));
197 l = get_conf_long(d, where + 12);
199 printf(" PegG4Dis%c", FLAG(l, BIT(28)));
200 printf(" DDR4MaxFreq=");
201 if (BITS(l, 23, 4) == 0)
204 printf("%uMHz", BITS(l, 0, 4) * 2666 / 10);
205 printf(" LPDDREn%c", FLAG(l, BIT(22)));
206 printf(" LPDDR4MaxFreq=");
207 if (BITS(l, 17, 4) == 0)
210 printf("%uMHz", BITS(l, 0, 4) * 2666 / 10);
211 printf(" LPDDR4En%c", FLAG(l, BIT(16)));
213 printf(" QClkGvDis%c", FLAG(l, BIT(14)));
214 printf(" SgxDis%c", FLAG(l, BIT(9)));
215 printf(" BClkOC=%s", BITS(l, 7, 2) == 0 ? "Disabled" :
216 BITS(l, 7, 2) == 1 ? "115MHz" :
217 BITS(l, 7, 2) == 2 ? "130MHz" :
219 printf(" IddDis%c", FLAG(l, BIT(6)));
220 printf(" Pipe3Dis%c", FLAG(l, BIT(5)));
221 printf(" Gear1MaxFreq=");
222 if (BITS(l, 0, 4) == 0)
225 printf("%uMHz", BITS(l, 0, 4) * 2666 / 10);
233 do_show_vendor_caps(struct device *d, int where, int cap)
235 switch (d->dev->vendor_id)
237 case 0x1af4: /* Red Hat */
238 if (d->dev->device_id >= 0x1000 &&
239 d->dev->device_id <= 0x107f)
240 return show_vendor_caps_virtio(d, where, cap);
242 case 0x8086: /* Intel */
243 return show_vendor_caps_intel(d, where, cap);
249 show_vendor_caps(struct device *d, int where, int cap)
251 printf("Vendor Specific Information: ");
252 if (!do_show_vendor_caps(d, where, cap))
253 printf("Len=%02x <?>\n", BITS(cap, 0, 8));