]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/Pci.c
ShellPkg/comp: Use proper parameter names
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Pci.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for Pci shell Debug1 function.\r
3\r
0c84a69f 4 Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>\r
231ad7d8
QS
5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
6 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR> \r
5d73d92f 7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "UefiShellDebug1CommandsLib.h"\r
18#include <Protocol/PciRootBridgeIo.h>\r
19#include <Library/ShellLib.h>\r
20#include <IndustryStandard/Pci.h>\r
21#include <IndustryStandard/Acpi.h>\r
22#include "Pci.h"\r
23\r
5d73d92f 24//\r
25// Printable strings for Pci class code\r
26//\r
27typedef struct {\r
28 CHAR16 *BaseClass; // Pointer to the PCI base class string\r
29 CHAR16 *SubClass; // Pointer to the PCI sub class string\r
30 CHAR16 *PIFClass; // Pointer to the PCI programming interface string\r
31} PCI_CLASS_STRINGS;\r
32\r
33//\r
34// a structure holding a single entry, which also points to its lower level\r
35// class\r
36//\r
37typedef struct PCI_CLASS_ENTRY_TAG {\r
38 UINT8 Code; // Class, subclass or I/F code\r
39 CHAR16 *DescText; // Description string\r
40 struct PCI_CLASS_ENTRY_TAG *LowerLevelClass; // Subclass or I/F if any\r
41} PCI_CLASS_ENTRY;\r
42\r
43//\r
44// Declarations of entries which contain printable strings for class codes\r
45// in PCI configuration space\r
46//\r
47PCI_CLASS_ENTRY PCIBlankEntry[];\r
48PCI_CLASS_ENTRY PCISubClass_00[];\r
49PCI_CLASS_ENTRY PCISubClass_01[];\r
50PCI_CLASS_ENTRY PCISubClass_02[];\r
51PCI_CLASS_ENTRY PCISubClass_03[];\r
52PCI_CLASS_ENTRY PCISubClass_04[];\r
53PCI_CLASS_ENTRY PCISubClass_05[];\r
54PCI_CLASS_ENTRY PCISubClass_06[];\r
55PCI_CLASS_ENTRY PCISubClass_07[];\r
56PCI_CLASS_ENTRY PCISubClass_08[];\r
57PCI_CLASS_ENTRY PCISubClass_09[];\r
58PCI_CLASS_ENTRY PCISubClass_0a[];\r
59PCI_CLASS_ENTRY PCISubClass_0b[];\r
60PCI_CLASS_ENTRY PCISubClass_0c[];\r
61PCI_CLASS_ENTRY PCISubClass_0d[];\r
62PCI_CLASS_ENTRY PCISubClass_0e[];\r
63PCI_CLASS_ENTRY PCISubClass_0f[];\r
64PCI_CLASS_ENTRY PCISubClass_10[];\r
65PCI_CLASS_ENTRY PCISubClass_11[];\r
f056e4c1
JC
66PCI_CLASS_ENTRY PCISubClass_12[];\r
67PCI_CLASS_ENTRY PCISubClass_13[];\r
68PCI_CLASS_ENTRY PCIPIFClass_0100[];\r
5d73d92f 69PCI_CLASS_ENTRY PCIPIFClass_0101[];\r
f056e4c1
JC
70PCI_CLASS_ENTRY PCIPIFClass_0105[];\r
71PCI_CLASS_ENTRY PCIPIFClass_0106[];\r
72PCI_CLASS_ENTRY PCIPIFClass_0107[];\r
73PCI_CLASS_ENTRY PCIPIFClass_0108[];\r
74PCI_CLASS_ENTRY PCIPIFClass_0109[];\r
5d73d92f 75PCI_CLASS_ENTRY PCIPIFClass_0300[];\r
76PCI_CLASS_ENTRY PCIPIFClass_0604[];\r
f056e4c1
JC
77PCI_CLASS_ENTRY PCIPIFClass_0609[];\r
78PCI_CLASS_ENTRY PCIPIFClass_060b[];\r
5d73d92f 79PCI_CLASS_ENTRY PCIPIFClass_0700[];\r
80PCI_CLASS_ENTRY PCIPIFClass_0701[];\r
81PCI_CLASS_ENTRY PCIPIFClass_0703[];\r
82PCI_CLASS_ENTRY PCIPIFClass_0800[];\r
83PCI_CLASS_ENTRY PCIPIFClass_0801[];\r
84PCI_CLASS_ENTRY PCIPIFClass_0802[];\r
85PCI_CLASS_ENTRY PCIPIFClass_0803[];\r
86PCI_CLASS_ENTRY PCIPIFClass_0904[];\r
87PCI_CLASS_ENTRY PCIPIFClass_0c00[];\r
88PCI_CLASS_ENTRY PCIPIFClass_0c03[];\r
f056e4c1
JC
89PCI_CLASS_ENTRY PCIPIFClass_0c07[];\r
90PCI_CLASS_ENTRY PCIPIFClass_0d01[];\r
5d73d92f 91PCI_CLASS_ENTRY PCIPIFClass_0e00[];\r
92\r
93//\r
94// Base class strings entries\r
95//\r
96PCI_CLASS_ENTRY gClassStringList[] = {\r
97 {\r
98 0x00,\r
99 L"Pre 2.0 device",\r
100 PCISubClass_00\r
101 },\r
102 {\r
103 0x01,\r
104 L"Mass Storage Controller",\r
105 PCISubClass_01\r
106 },\r
107 {\r
108 0x02,\r
109 L"Network Controller",\r
110 PCISubClass_02\r
111 },\r
112 {\r
113 0x03,\r
114 L"Display Controller",\r
115 PCISubClass_03\r
116 },\r
117 {\r
118 0x04,\r
119 L"Multimedia Device",\r
120 PCISubClass_04\r
121 },\r
122 {\r
123 0x05,\r
124 L"Memory Controller",\r
125 PCISubClass_05\r
126 },\r
127 {\r
128 0x06,\r
129 L"Bridge Device",\r
130 PCISubClass_06\r
131 },\r
132 {\r
133 0x07,\r
134 L"Simple Communications Controllers",\r
135 PCISubClass_07\r
136 },\r
137 {\r
138 0x08,\r
139 L"Base System Peripherals",\r
140 PCISubClass_08\r
141 },\r
142 {\r
143 0x09,\r
144 L"Input Devices",\r
145 PCISubClass_09\r
146 },\r
147 {\r
148 0x0a,\r
149 L"Docking Stations",\r
150 PCISubClass_0a\r
151 },\r
152 {\r
153 0x0b,\r
154 L"Processors",\r
155 PCISubClass_0b\r
156 },\r
157 {\r
158 0x0c,\r
159 L"Serial Bus Controllers",\r
160 PCISubClass_0c\r
161 },\r
162 {\r
163 0x0d,\r
164 L"Wireless Controllers",\r
165 PCISubClass_0d\r
166 },\r
167 {\r
168 0x0e,\r
169 L"Intelligent IO Controllers",\r
170 PCISubClass_0e\r
171 },\r
172 {\r
173 0x0f,\r
174 L"Satellite Communications Controllers",\r
175 PCISubClass_0f\r
176 },\r
177 {\r
178 0x10,\r
179 L"Encryption/Decryption Controllers",\r
180 PCISubClass_10\r
181 },\r
182 {\r
183 0x11,\r
184 L"Data Acquisition & Signal Processing Controllers",\r
185 PCISubClass_11\r
186 },\r
f056e4c1
JC
187 {\r
188 0x12,\r
189 L"Processing Accelerators",\r
190 PCISubClass_12\r
191 },\r
192 {\r
193 0x13,\r
194 L"Non-Essential Instrumentation",\r
195 PCISubClass_13\r
196 },\r
5d73d92f 197 {\r
198 0xff,\r
199 L"Device does not fit in any defined classes",\r
200 PCIBlankEntry\r
201 },\r
202 {\r
203 0x00,\r
204 NULL,\r
205 /* null string ends the list */NULL\r
206 }\r
207};\r
208\r
209//\r
210// Subclass strings entries\r
211//\r
212PCI_CLASS_ENTRY PCIBlankEntry[] = {\r
213 {\r
214 0x00,\r
215 L"",\r
216 PCIBlankEntry\r
217 },\r
218 {\r
219 0x00,\r
220 NULL,\r
221 /* null string ends the list */NULL\r
222 }\r
223};\r
224\r
225PCI_CLASS_ENTRY PCISubClass_00[] = {\r
226 {\r
227 0x00,\r
228 L"All devices other than VGA",\r
229 PCIBlankEntry\r
230 },\r
231 {\r
232 0x01,\r
233 L"VGA-compatible devices",\r
234 PCIBlankEntry\r
235 },\r
236 {\r
237 0x00,\r
238 NULL,\r
239 /* null string ends the list */NULL\r
240 }\r
241};\r
242\r
243PCI_CLASS_ENTRY PCISubClass_01[] = {\r
244 {\r
245 0x00,\r
f056e4c1
JC
246 L"SCSI",\r
247 PCIPIFClass_0100\r
5d73d92f 248 },\r
249 {\r
250 0x01,\r
251 L"IDE controller",\r
252 PCIPIFClass_0101\r
253 },\r
254 {\r
255 0x02,\r
256 L"Floppy disk controller",\r
257 PCIBlankEntry\r
258 },\r
259 {\r
260 0x03,\r
261 L"IPI controller",\r
262 PCIBlankEntry\r
263 },\r
264 {\r
265 0x04,\r
266 L"RAID controller",\r
267 PCIBlankEntry\r
268 },\r
f056e4c1
JC
269 {\r
270 0x05,\r
271 L"ATA controller with ADMA interface",\r
272 PCIPIFClass_0105\r
273 },\r
274 {\r
275 0x06,\r
276 L"Serial ATA controller",\r
277 PCIPIFClass_0106\r
278 },\r
279 {\r
280 0x07,\r
281 L"Serial Attached SCSI (SAS) controller ",\r
282 PCIPIFClass_0107\r
283 },\r
284 {\r
285 0x08,\r
286 L"Non-volatile memory subsystem",\r
287 PCIPIFClass_0108\r
288 },\r
289 {\r
290 0x09,\r
291 L"Universal Flash Storage (UFS) controller ",\r
292 PCIPIFClass_0109\r
293 },\r
5d73d92f 294 {\r
295 0x80,\r
296 L"Other mass storage controller",\r
297 PCIBlankEntry\r
298 },\r
299 {\r
300 0x00,\r
301 NULL,\r
302 /* null string ends the list */NULL\r
303 }\r
304};\r
305\r
306PCI_CLASS_ENTRY PCISubClass_02[] = {\r
307 {\r
308 0x00,\r
309 L"Ethernet controller",\r
310 PCIBlankEntry\r
311 },\r
312 {\r
313 0x01,\r
314 L"Token ring controller",\r
315 PCIBlankEntry\r
316 },\r
317 {\r
318 0x02,\r
319 L"FDDI controller",\r
320 PCIBlankEntry\r
321 },\r
322 {\r
323 0x03,\r
324 L"ATM controller",\r
325 PCIBlankEntry\r
326 },\r
327 {\r
328 0x04,\r
329 L"ISDN controller",\r
330 PCIBlankEntry\r
331 },\r
f056e4c1
JC
332 {\r
333 0x05,\r
334 L"WorldFip controller",\r
335 PCIBlankEntry\r
336 },\r
337 {\r
338 0x06,\r
339 L"PICMG 2.14 Multi Computing",\r
340 PCIBlankEntry\r
341 },\r
342 {\r
343 0x07,\r
344 L"InfiniBand controller",\r
345 PCIBlankEntry\r
346 },\r
5d73d92f 347 {\r
348 0x80,\r
349 L"Other network controller",\r
350 PCIBlankEntry\r
351 },\r
352 {\r
353 0x00,\r
354 NULL,\r
355 /* null string ends the list */NULL\r
356 }\r
357};\r
358\r
359PCI_CLASS_ENTRY PCISubClass_03[] = {\r
360 {\r
361 0x00,\r
362 L"VGA/8514 controller",\r
363 PCIPIFClass_0300\r
364 },\r
365 {\r
366 0x01,\r
367 L"XGA controller",\r
368 PCIBlankEntry\r
369 },\r
370 {\r
371 0x02,\r
372 L"3D controller",\r
373 PCIBlankEntry\r
374 },\r
375 {\r
376 0x80,\r
377 L"Other display controller",\r
378 PCIBlankEntry\r
379 },\r
380 {\r
381 0x00,\r
382 NULL,\r
383 /* null string ends the list */PCIBlankEntry\r
384 }\r
385};\r
386\r
387PCI_CLASS_ENTRY PCISubClass_04[] = {\r
388 {\r
389 0x00,\r
390 L"Video device",\r
391 PCIBlankEntry\r
392 },\r
393 {\r
394 0x01,\r
395 L"Audio device",\r
396 PCIBlankEntry\r
397 },\r
398 {\r
399 0x02,\r
400 L"Computer Telephony device",\r
401 PCIBlankEntry\r
402 },\r
f056e4c1
JC
403 {\r
404 0x03,\r
405 L"Mixed mode device",\r
406 PCIBlankEntry\r
407 },\r
5d73d92f 408 {\r
409 0x80,\r
410 L"Other multimedia device",\r
411 PCIBlankEntry\r
412 },\r
413 {\r
414 0x00,\r
415 NULL,\r
416 /* null string ends the list */NULL\r
417 }\r
418};\r
419\r
420PCI_CLASS_ENTRY PCISubClass_05[] = {\r
421 {\r
422 0x00,\r
423 L"RAM memory controller",\r
424 PCIBlankEntry\r
425 },\r
426 {\r
427 0x01,\r
428 L"Flash memory controller",\r
429 PCIBlankEntry\r
430 },\r
431 {\r
432 0x80,\r
433 L"Other memory controller",\r
434 PCIBlankEntry\r
435 },\r
436 {\r
437 0x00,\r
438 NULL,\r
439 /* null string ends the list */NULL\r
440 }\r
441};\r
442\r
443PCI_CLASS_ENTRY PCISubClass_06[] = {\r
444 {\r
445 0x00,\r
446 L"Host/PCI bridge",\r
447 PCIBlankEntry\r
448 },\r
449 {\r
450 0x01,\r
451 L"PCI/ISA bridge",\r
452 PCIBlankEntry\r
453 },\r
454 {\r
455 0x02,\r
456 L"PCI/EISA bridge",\r
457 PCIBlankEntry\r
458 },\r
459 {\r
460 0x03,\r
461 L"PCI/Micro Channel bridge",\r
462 PCIBlankEntry\r
463 },\r
464 {\r
465 0x04,\r
466 L"PCI/PCI bridge",\r
467 PCIPIFClass_0604\r
468 },\r
469 {\r
470 0x05,\r
471 L"PCI/PCMCIA bridge",\r
472 PCIBlankEntry\r
473 },\r
474 {\r
475 0x06,\r
476 L"NuBus bridge",\r
477 PCIBlankEntry\r
478 },\r
479 {\r
480 0x07,\r
481 L"CardBus bridge",\r
482 PCIBlankEntry\r
483 },\r
484 {\r
485 0x08,\r
486 L"RACEway bridge",\r
487 PCIBlankEntry\r
488 },\r
f056e4c1
JC
489 {\r
490 0x09,\r
491 L"Semi-transparent PCI-to-PCI bridge",\r
492 PCIPIFClass_0609\r
493 },\r
494 {\r
495 0x0A,\r
496 L"InfiniBand-to-PCI host bridge",\r
497 PCIBlankEntry\r
498 },\r
499 {\r
500 0x0B,\r
501 L"Advanced Switching to PCI host bridge",\r
502 PCIPIFClass_060b\r
503 },\r
5d73d92f 504 {\r
505 0x80,\r
506 L"Other bridge type",\r
507 PCIBlankEntry\r
508 },\r
509 {\r
510 0x00,\r
511 NULL,\r
512 /* null string ends the list */NULL\r
513 }\r
514};\r
515\r
516PCI_CLASS_ENTRY PCISubClass_07[] = {\r
517 {\r
518 0x00,\r
519 L"Serial controller",\r
520 PCIPIFClass_0700\r
521 },\r
522 {\r
523 0x01,\r
524 L"Parallel port",\r
525 PCIPIFClass_0701\r
526 },\r
527 {\r
528 0x02,\r
529 L"Multiport serial controller",\r
530 PCIBlankEntry\r
531 },\r
532 {\r
533 0x03,\r
534 L"Modem",\r
535 PCIPIFClass_0703\r
536 },\r
f056e4c1
JC
537 {\r
538 0x04,\r
539 L"GPIB (IEEE 488.1/2) controller",\r
540 PCIBlankEntry\r
541 },\r
542 {\r
543 0x05,\r
544 L"Smart Card",\r
545 PCIBlankEntry\r
546 },\r
5d73d92f 547 {\r
548 0x80,\r
549 L"Other communication device",\r
550 PCIBlankEntry\r
551 },\r
552 {\r
553 0x00,\r
554 NULL,\r
555 /* null string ends the list */NULL\r
556 }\r
557};\r
558\r
559PCI_CLASS_ENTRY PCISubClass_08[] = {\r
560 {\r
561 0x00,\r
562 L"PIC",\r
563 PCIPIFClass_0800\r
564 },\r
565 {\r
566 0x01,\r
567 L"DMA controller",\r
568 PCIPIFClass_0801\r
569 },\r
570 {\r
571 0x02,\r
572 L"System timer",\r
573 PCIPIFClass_0802\r
574 },\r
575 {\r
576 0x03,\r
577 L"RTC controller",\r
578 PCIPIFClass_0803\r
579 },\r
580 {\r
581 0x04,\r
582 L"Generic PCI Hot-Plug controller",\r
583 PCIBlankEntry\r
584 },\r
f056e4c1
JC
585 {\r
586 0x05,\r
587 L"SD Host controller",\r
588 PCIBlankEntry\r
589 },\r
590 {\r
591 0x06,\r
592 L"IOMMU",\r
593 PCIBlankEntry\r
594 },\r
595 {\r
596 0x07,\r
597 L"Root Complex Event Collector",\r
598 PCIBlankEntry\r
599 },\r
5d73d92f 600 {\r
601 0x80,\r
602 L"Other system peripheral",\r
603 PCIBlankEntry\r
604 },\r
605 {\r
606 0x00,\r
607 NULL,\r
608 /* null string ends the list */NULL\r
609 }\r
610};\r
611\r
612PCI_CLASS_ENTRY PCISubClass_09[] = {\r
613 {\r
614 0x00,\r
615 L"Keyboard controller",\r
616 PCIBlankEntry\r
617 },\r
618 {\r
619 0x01,\r
620 L"Digitizer (pen)",\r
621 PCIBlankEntry\r
622 },\r
623 {\r
624 0x02,\r
625 L"Mouse controller",\r
626 PCIBlankEntry\r
627 },\r
628 {\r
629 0x03,\r
630 L"Scanner controller",\r
631 PCIBlankEntry\r
632 },\r
633 {\r
634 0x04,\r
635 L"Gameport controller",\r
636 PCIPIFClass_0904\r
637 },\r
638 {\r
639 0x80,\r
640 L"Other input controller",\r
641 PCIBlankEntry\r
642 },\r
643 {\r
644 0x00,\r
645 NULL,\r
646 /* null string ends the list */NULL\r
647 }\r
648};\r
649\r
650PCI_CLASS_ENTRY PCISubClass_0a[] = {\r
651 {\r
652 0x00,\r
653 L"Generic docking station",\r
654 PCIBlankEntry\r
655 },\r
656 {\r
657 0x80,\r
658 L"Other type of docking station",\r
659 PCIBlankEntry\r
660 },\r
661 {\r
662 0x00,\r
663 NULL,\r
664 /* null string ends the list */NULL\r
665 }\r
666};\r
667\r
668PCI_CLASS_ENTRY PCISubClass_0b[] = {\r
669 {\r
670 0x00,\r
671 L"386",\r
672 PCIBlankEntry\r
673 },\r
674 {\r
675 0x01,\r
676 L"486",\r
677 PCIBlankEntry\r
678 },\r
679 {\r
680 0x02,\r
681 L"Pentium",\r
682 PCIBlankEntry\r
683 },\r
684 {\r
685 0x10,\r
686 L"Alpha",\r
687 PCIBlankEntry\r
688 },\r
689 {\r
690 0x20,\r
691 L"PowerPC",\r
692 PCIBlankEntry\r
693 },\r
694 {\r
695 0x30,\r
696 L"MIPS",\r
697 PCIBlankEntry\r
698 },\r
699 {\r
700 0x40,\r
701 L"Co-processor",\r
702 PCIBlankEntry\r
703 },\r
704 {\r
705 0x80,\r
706 L"Other processor",\r
707 PCIBlankEntry\r
708 },\r
709 {\r
710 0x00,\r
711 NULL,\r
712 /* null string ends the list */NULL\r
713 }\r
714};\r
715\r
716PCI_CLASS_ENTRY PCISubClass_0c[] = {\r
717 {\r
718 0x00,\r
f056e4c1
JC
719 L"IEEE 1394",\r
720 PCIPIFClass_0c00\r
5d73d92f 721 },\r
722 {\r
723 0x01,\r
724 L"ACCESS.bus",\r
725 PCIBlankEntry\r
726 },\r
727 {\r
728 0x02,\r
729 L"SSA",\r
730 PCIBlankEntry\r
731 },\r
732 {\r
733 0x03,\r
734 L"USB",\r
f056e4c1 735 PCIPIFClass_0c03\r
5d73d92f 736 },\r
737 {\r
738 0x04,\r
739 L"Fibre Channel",\r
740 PCIBlankEntry\r
741 },\r
742 {\r
743 0x05,\r
744 L"System Management Bus",\r
745 PCIBlankEntry\r
746 },\r
f056e4c1
JC
747 {\r
748 0x06,\r
749 L"InfiniBand",\r
750 PCIBlankEntry\r
751 },\r
752 {\r
753 0x07,\r
754 L"IPMI",\r
755 PCIPIFClass_0c07\r
756 },\r
757 {\r
758 0x08,\r
759 L"SERCOS Interface Standard (IEC 61491)",\r
760 PCIBlankEntry\r
761 },\r
762 {\r
763 0x09,\r
764 L"CANbus",\r
765 PCIBlankEntry\r
766 },\r
5d73d92f 767 {\r
768 0x80,\r
769 L"Other bus type",\r
770 PCIBlankEntry\r
771 },\r
772 {\r
773 0x00,\r
774 NULL,\r
775 /* null string ends the list */NULL\r
776 }\r
777};\r
778\r
779PCI_CLASS_ENTRY PCISubClass_0d[] = {\r
780 {\r
781 0x00,\r
782 L"iRDA compatible controller",\r
783 PCIBlankEntry\r
784 },\r
785 {\r
786 0x01,\r
f056e4c1
JC
787 L"",\r
788 PCIPIFClass_0d01\r
5d73d92f 789 },\r
790 {\r
791 0x10,\r
792 L"RF controller",\r
793 PCIBlankEntry\r
794 },\r
f056e4c1
JC
795 {\r
796 0x11,\r
797 L"Bluetooth",\r
798 PCIBlankEntry\r
799 },\r
800 {\r
801 0x12,\r
802 L"Broadband",\r
803 PCIBlankEntry\r
804 },\r
805 {\r
806 0x20,\r
59577231 807 L"Ethernet (802.11a - 5 GHz)",\r
f056e4c1
JC
808 PCIBlankEntry\r
809 },\r
810 {\r
811 0x21,\r
59577231 812 L"Ethernet (802.11b - 2.4 GHz)",\r
f056e4c1
JC
813 PCIBlankEntry\r
814 },\r
5d73d92f 815 {\r
816 0x80,\r
817 L"Other type of wireless controller",\r
818 PCIBlankEntry\r
819 },\r
820 {\r
821 0x00,\r
822 NULL,\r
823 /* null string ends the list */NULL\r
824 }\r
825};\r
826\r
827PCI_CLASS_ENTRY PCISubClass_0e[] = {\r
828 {\r
829 0x00,\r
830 L"I2O Architecture",\r
831 PCIPIFClass_0e00\r
832 },\r
833 {\r
834 0x00,\r
835 NULL,\r
836 /* null string ends the list */NULL\r
837 }\r
838};\r
839\r
840PCI_CLASS_ENTRY PCISubClass_0f[] = {\r
841 {\r
f056e4c1 842 0x01,\r
5d73d92f 843 L"TV",\r
844 PCIBlankEntry\r
845 },\r
846 {\r
f056e4c1 847 0x02,\r
5d73d92f 848 L"Audio",\r
849 PCIBlankEntry\r
850 },\r
851 {\r
f056e4c1 852 0x03,\r
5d73d92f 853 L"Voice",\r
854 PCIBlankEntry\r
855 },\r
856 {\r
f056e4c1 857 0x04,\r
5d73d92f 858 L"Data",\r
859 PCIBlankEntry\r
860 },\r
f056e4c1
JC
861 {\r
862 0x80,\r
863 L"Other satellite communication controller",\r
864 PCIBlankEntry\r
865 },\r
5d73d92f 866 {\r
867 0x00,\r
868 NULL,\r
869 /* null string ends the list */NULL\r
870 }\r
871};\r
872\r
873PCI_CLASS_ENTRY PCISubClass_10[] = {\r
874 {\r
875 0x00,\r
876 L"Network & computing Encrypt/Decrypt",\r
877 PCIBlankEntry\r
878 },\r
879 {\r
880 0x01,\r
881 L"Entertainment Encrypt/Decrypt",\r
882 PCIBlankEntry\r
883 },\r
884 {\r
885 0x80,\r
886 L"Other Encrypt/Decrypt",\r
887 PCIBlankEntry\r
888 },\r
889 {\r
890 0x00,\r
891 NULL,\r
892 /* null string ends the list */NULL\r
893 }\r
894};\r
895\r
896PCI_CLASS_ENTRY PCISubClass_11[] = {\r
897 {\r
898 0x00,\r
899 L"DPIO modules",\r
900 PCIBlankEntry\r
901 },\r
f056e4c1
JC
902 {\r
903 0x01,\r
904 L"Performance Counters",\r
905 PCIBlankEntry\r
906 },\r
907 {\r
908 0x10,\r
909 L"Communications synchronization plus time and frequency test/measurement ",\r
910 PCIBlankEntry\r
911 },\r
912 {\r
913 0x20,\r
914 L"Management card",\r
915 PCIBlankEntry\r
916 },\r
5d73d92f 917 {\r
918 0x80,\r
919 L"Other DAQ & SP controllers",\r
920 PCIBlankEntry\r
921 },\r
922 {\r
923 0x00,\r
924 NULL,\r
925 /* null string ends the list */NULL\r
926 }\r
927};\r
928\r
f056e4c1
JC
929PCI_CLASS_ENTRY PCISubClass_12[] = {\r
930 {\r
931 0x00,\r
932 L"Processing Accelerator",\r
933 PCIBlankEntry\r
934 },\r
935 {\r
936 0x00,\r
937 NULL,\r
938 /* null string ends the list */NULL\r
939 }\r
940};\r
941\r
942PCI_CLASS_ENTRY PCISubClass_13[] = {\r
943 {\r
944 0x00,\r
945 L"Non-Essential Instrumentation Function",\r
946 PCIBlankEntry\r
947 },\r
948 {\r
949 0x00,\r
950 NULL,\r
951 /* null string ends the list */NULL\r
952 }\r
953};\r
954\r
5d73d92f 955//\r
956// Programming Interface entries\r
957//\r
f056e4c1
JC
958PCI_CLASS_ENTRY PCIPIFClass_0100[] = {\r
959 {\r
960 0x00,\r
961 L"SCSI controller",\r
962 PCIBlankEntry\r
963 },\r
964 {\r
965 0x11,\r
966 L"SCSI storage device SOP using PQI",\r
967 PCIBlankEntry\r
968 },\r
969 {\r
970 0x12,\r
971 L"SCSI controller SOP using PQI",\r
972 PCIBlankEntry\r
973 },\r
974 {\r
975 0x13,\r
976 L"SCSI storage device and controller SOP using PQI",\r
977 PCIBlankEntry\r
978 },\r
979 {\r
980 0x21,\r
981 L"SCSI storage device SOP using NVMe",\r
982 PCIBlankEntry\r
983 },\r
984 {\r
985 0x00,\r
986 NULL,\r
987 /* null string ends the list */NULL\r
988 }\r
989};\r
990\r
5d73d92f 991PCI_CLASS_ENTRY PCIPIFClass_0101[] = {\r
992 {\r
993 0x00,\r
994 L"",\r
995 PCIBlankEntry\r
996 },\r
997 {\r
998 0x01,\r
999 L"OM-primary",\r
1000 PCIBlankEntry\r
1001 },\r
1002 {\r
1003 0x02,\r
1004 L"PI-primary",\r
1005 PCIBlankEntry\r
1006 },\r
1007 {\r
1008 0x03,\r
1009 L"OM/PI-primary",\r
1010 PCIBlankEntry\r
1011 },\r
1012 {\r
1013 0x04,\r
1014 L"OM-secondary",\r
1015 PCIBlankEntry\r
1016 },\r
1017 {\r
1018 0x05,\r
1019 L"OM-primary, OM-secondary",\r
1020 PCIBlankEntry\r
1021 },\r
1022 {\r
1023 0x06,\r
1024 L"PI-primary, OM-secondary",\r
1025 PCIBlankEntry\r
1026 },\r
1027 {\r
1028 0x07,\r
1029 L"OM/PI-primary, OM-secondary",\r
1030 PCIBlankEntry\r
1031 },\r
1032 {\r
1033 0x08,\r
1034 L"OM-secondary",\r
1035 PCIBlankEntry\r
1036 },\r
1037 {\r
1038 0x09,\r
1039 L"OM-primary, PI-secondary",\r
1040 PCIBlankEntry\r
1041 },\r
1042 {\r
1043 0x0a,\r
1044 L"PI-primary, PI-secondary",\r
1045 PCIBlankEntry\r
1046 },\r
1047 {\r
1048 0x0b,\r
1049 L"OM/PI-primary, PI-secondary",\r
1050 PCIBlankEntry\r
1051 },\r
1052 {\r
1053 0x0c,\r
1054 L"OM-secondary",\r
1055 PCIBlankEntry\r
1056 },\r
1057 {\r
1058 0x0d,\r
1059 L"OM-primary, OM/PI-secondary",\r
1060 PCIBlankEntry\r
1061 },\r
1062 {\r
1063 0x0e,\r
1064 L"PI-primary, OM/PI-secondary",\r
1065 PCIBlankEntry\r
1066 },\r
1067 {\r
1068 0x0f,\r
1069 L"OM/PI-primary, OM/PI-secondary",\r
1070 PCIBlankEntry\r
1071 },\r
1072 {\r
1073 0x80,\r
1074 L"Master",\r
1075 PCIBlankEntry\r
1076 },\r
1077 {\r
1078 0x81,\r
1079 L"Master, OM-primary",\r
1080 PCIBlankEntry\r
1081 },\r
1082 {\r
1083 0x82,\r
1084 L"Master, PI-primary",\r
1085 PCIBlankEntry\r
1086 },\r
1087 {\r
1088 0x83,\r
1089 L"Master, OM/PI-primary",\r
1090 PCIBlankEntry\r
1091 },\r
1092 {\r
1093 0x84,\r
1094 L"Master, OM-secondary",\r
1095 PCIBlankEntry\r
1096 },\r
1097 {\r
1098 0x85,\r
1099 L"Master, OM-primary, OM-secondary",\r
1100 PCIBlankEntry\r
1101 },\r
1102 {\r
1103 0x86,\r
1104 L"Master, PI-primary, OM-secondary",\r
1105 PCIBlankEntry\r
1106 },\r
1107 {\r
1108 0x87,\r
1109 L"Master, OM/PI-primary, OM-secondary",\r
1110 PCIBlankEntry\r
1111 },\r
1112 {\r
1113 0x88,\r
1114 L"Master, OM-secondary",\r
1115 PCIBlankEntry\r
1116 },\r
1117 {\r
1118 0x89,\r
1119 L"Master, OM-primary, PI-secondary",\r
1120 PCIBlankEntry\r
1121 },\r
1122 {\r
1123 0x8a,\r
1124 L"Master, PI-primary, PI-secondary",\r
1125 PCIBlankEntry\r
1126 },\r
1127 {\r
1128 0x8b,\r
1129 L"Master, OM/PI-primary, PI-secondary",\r
1130 PCIBlankEntry\r
1131 },\r
1132 {\r
1133 0x8c,\r
1134 L"Master, OM-secondary",\r
1135 PCIBlankEntry\r
1136 },\r
1137 {\r
1138 0x8d,\r
1139 L"Master, OM-primary, OM/PI-secondary",\r
1140 PCIBlankEntry\r
1141 },\r
1142 {\r
1143 0x8e,\r
1144 L"Master, PI-primary, OM/PI-secondary",\r
1145 PCIBlankEntry\r
1146 },\r
1147 {\r
1148 0x8f,\r
1149 L"Master, OM/PI-primary, OM/PI-secondary",\r
1150 PCIBlankEntry\r
1151 },\r
1152 {\r
1153 0x00,\r
1154 NULL,\r
1155 /* null string ends the list */NULL\r
1156 }\r
1157};\r
1158\r
f056e4c1
JC
1159PCI_CLASS_ENTRY PCIPIFClass_0105[] = {\r
1160 {\r
1161 0x20,\r
1162 L"Single stepping",\r
1163 PCIBlankEntry\r
1164 },\r
1165 {\r
1166 0x30,\r
1167 L"Continuous operation",\r
1168 PCIBlankEntry\r
1169 },\r
1170 {\r
1171 0x00,\r
1172 NULL,\r
1173 /* null string ends the list */NULL\r
1174 }\r
1175};\r
1176\r
1177PCI_CLASS_ENTRY PCIPIFClass_0106[] = {\r
1178 {\r
1179 0x00,\r
1180 L"",\r
1181 PCIBlankEntry\r
1182 },\r
1183 {\r
1184 0x01,\r
1185 L"AHCI",\r
1186 PCIBlankEntry\r
1187 },\r
1188 {\r
1189 0x02,\r
1190 L"Serial Storage Bus",\r
1191 PCIBlankEntry\r
1192 },\r
1193 {\r
1194 0x00,\r
1195 NULL,\r
1196 /* null string ends the list */NULL\r
1197 }\r
1198};\r
1199\r
1200PCI_CLASS_ENTRY PCIPIFClass_0107[] = {\r
1201 {\r
1202 0x00,\r
1203 L"",\r
1204 PCIBlankEntry\r
1205 },\r
1206 {\r
1207 0x01,\r
1208 L"Obsolete",\r
1209 PCIBlankEntry\r
1210 },\r
1211 {\r
1212 0x00,\r
1213 NULL,\r
1214 /* null string ends the list */NULL\r
1215 }\r
1216};\r
1217\r
1218PCI_CLASS_ENTRY PCIPIFClass_0108[] = {\r
1219 {\r
1220 0x00,\r
1221 L"",\r
1222 PCIBlankEntry\r
1223 },\r
1224 {\r
1225 0x01,\r
1226 L"NVMHCI",\r
1227 PCIBlankEntry\r
1228 },\r
1229 {\r
1230 0x02,\r
1231 L"NVM Express",\r
1232 PCIBlankEntry\r
1233 },\r
1234 {\r
1235 0x00,\r
1236 NULL,\r
1237 /* null string ends the list */NULL\r
1238 }\r
1239};\r
1240\r
1241PCI_CLASS_ENTRY PCIPIFClass_0109[] = {\r
1242 {\r
1243 0x00,\r
1244 L"",\r
1245 PCIBlankEntry\r
1246 },\r
1247 {\r
1248 0x01,\r
1249 L"UFSHCI",\r
1250 PCIBlankEntry\r
1251 },\r
1252 {\r
1253 0x00,\r
1254 NULL,\r
1255 /* null string ends the list */NULL\r
1256 }\r
1257};\r
1258\r
5d73d92f 1259PCI_CLASS_ENTRY PCIPIFClass_0300[] = {\r
1260 {\r
1261 0x00,\r
1262 L"VGA compatible",\r
1263 PCIBlankEntry\r
1264 },\r
1265 {\r
1266 0x01,\r
1267 L"8514 compatible",\r
1268 PCIBlankEntry\r
1269 },\r
1270 {\r
1271 0x00,\r
1272 NULL,\r
1273 /* null string ends the list */NULL\r
1274 }\r
1275};\r
1276\r
1277PCI_CLASS_ENTRY PCIPIFClass_0604[] = {\r
1278 {\r
1279 0x00,\r
1280 L"",\r
1281 PCIBlankEntry\r
1282 },\r
1283 {\r
1284 0x01,\r
1285 L"Subtractive decode",\r
1286 PCIBlankEntry\r
1287 },\r
1288 {\r
1289 0x00,\r
1290 NULL,\r
1291 /* null string ends the list */NULL\r
1292 }\r
1293};\r
1294\r
f056e4c1
JC
1295PCI_CLASS_ENTRY PCIPIFClass_0609[] = {\r
1296 {\r
1297 0x40,\r
1298 L"Primary PCI bus side facing the system host processor",\r
1299 PCIBlankEntry\r
1300 },\r
1301 {\r
1302 0x80,\r
1303 L"Secondary PCI bus side facing the system host processor",\r
1304 PCIBlankEntry\r
1305 },\r
1306 {\r
1307 0x00,\r
1308 NULL,\r
1309 /* null string ends the list */NULL\r
1310 }\r
1311};\r
1312\r
1313PCI_CLASS_ENTRY PCIPIFClass_060b[] = {\r
1314 {\r
1315 0x00,\r
1316 L"Custom",\r
1317 PCIBlankEntry\r
1318 },\r
1319 {\r
1320 0x01,\r
1321 L"ASI-SIG Defined Portal",\r
1322 PCIBlankEntry\r
1323 },\r
1324 {\r
1325 0x00,\r
1326 NULL,\r
1327 /* null string ends the list */NULL\r
1328 }\r
1329};\r
1330\r
5d73d92f 1331PCI_CLASS_ENTRY PCIPIFClass_0700[] = {\r
1332 {\r
1333 0x00,\r
1334 L"Generic XT-compatible",\r
1335 PCIBlankEntry\r
1336 },\r
1337 {\r
1338 0x01,\r
1339 L"16450-compatible",\r
1340 PCIBlankEntry\r
1341 },\r
1342 {\r
1343 0x02,\r
1344 L"16550-compatible",\r
1345 PCIBlankEntry\r
1346 },\r
1347 {\r
1348 0x03,\r
1349 L"16650-compatible",\r
1350 PCIBlankEntry\r
1351 },\r
1352 {\r
1353 0x04,\r
1354 L"16750-compatible",\r
1355 PCIBlankEntry\r
1356 },\r
1357 {\r
1358 0x05,\r
1359 L"16850-compatible",\r
1360 PCIBlankEntry\r
1361 },\r
1362 {\r
1363 0x06,\r
1364 L"16950-compatible",\r
1365 PCIBlankEntry\r
1366 },\r
1367 {\r
1368 0x00,\r
1369 NULL,\r
1370 /* null string ends the list */NULL\r
1371 }\r
1372};\r
1373\r
1374PCI_CLASS_ENTRY PCIPIFClass_0701[] = {\r
1375 {\r
1376 0x00,\r
1377 L"",\r
1378 PCIBlankEntry\r
1379 },\r
1380 {\r
1381 0x01,\r
1382 L"Bi-directional",\r
1383 PCIBlankEntry\r
1384 },\r
1385 {\r
1386 0x02,\r
1387 L"ECP 1.X-compliant",\r
1388 PCIBlankEntry\r
1389 },\r
1390 {\r
1391 0x03,\r
1392 L"IEEE 1284",\r
1393 PCIBlankEntry\r
1394 },\r
1395 {\r
1396 0xfe,\r
1397 L"IEEE 1284 target (not a controller)",\r
1398 PCIBlankEntry\r
1399 },\r
1400 {\r
1401 0x00,\r
1402 NULL,\r
1403 /* null string ends the list */NULL\r
1404 }\r
1405};\r
1406\r
1407PCI_CLASS_ENTRY PCIPIFClass_0703[] = {\r
1408 {\r
1409 0x00,\r
1410 L"Generic",\r
1411 PCIBlankEntry\r
1412 },\r
1413 {\r
1414 0x01,\r
1415 L"Hayes-compatible 16450",\r
1416 PCIBlankEntry\r
1417 },\r
1418 {\r
1419 0x02,\r
1420 L"Hayes-compatible 16550",\r
1421 PCIBlankEntry\r
1422 },\r
1423 {\r
1424 0x03,\r
1425 L"Hayes-compatible 16650",\r
1426 PCIBlankEntry\r
1427 },\r
1428 {\r
1429 0x04,\r
1430 L"Hayes-compatible 16750",\r
1431 PCIBlankEntry\r
1432 },\r
1433 {\r
1434 0x00,\r
1435 NULL,\r
1436 /* null string ends the list */NULL\r
1437 }\r
1438};\r
1439\r
1440PCI_CLASS_ENTRY PCIPIFClass_0800[] = {\r
1441 {\r
1442 0x00,\r
1443 L"Generic 8259",\r
1444 PCIBlankEntry\r
1445 },\r
1446 {\r
1447 0x01,\r
1448 L"ISA",\r
1449 PCIBlankEntry\r
1450 },\r
1451 {\r
1452 0x02,\r
1453 L"EISA",\r
1454 PCIBlankEntry\r
1455 },\r
1456 {\r
1457 0x10,\r
1458 L"IO APIC",\r
1459 PCIBlankEntry\r
1460 },\r
1461 {\r
1462 0x20,\r
1463 L"IO(x) APIC interrupt controller",\r
1464 PCIBlankEntry\r
1465 },\r
1466 {\r
1467 0x00,\r
1468 NULL,\r
1469 /* null string ends the list */NULL\r
1470 }\r
1471};\r
1472\r
1473PCI_CLASS_ENTRY PCIPIFClass_0801[] = {\r
1474 {\r
1475 0x00,\r
1476 L"Generic 8237",\r
1477 PCIBlankEntry\r
1478 },\r
1479 {\r
1480 0x01,\r
1481 L"ISA",\r
1482 PCIBlankEntry\r
1483 },\r
1484 {\r
1485 0x02,\r
1486 L"EISA",\r
1487 PCIBlankEntry\r
1488 },\r
1489 {\r
1490 0x00,\r
1491 NULL,\r
1492 /* null string ends the list */NULL\r
1493 }\r
1494};\r
1495\r
1496PCI_CLASS_ENTRY PCIPIFClass_0802[] = {\r
1497 {\r
1498 0x00,\r
1499 L"Generic 8254",\r
1500 PCIBlankEntry\r
1501 },\r
1502 {\r
1503 0x01,\r
1504 L"ISA",\r
1505 PCIBlankEntry\r
1506 },\r
1507 {\r
1508 0x02,\r
1509 L"EISA",\r
1510 PCIBlankEntry\r
1511 },\r
1512 {\r
1513 0x00,\r
1514 NULL,\r
1515 /* null string ends the list */NULL\r
1516 }\r
1517};\r
1518\r
1519PCI_CLASS_ENTRY PCIPIFClass_0803[] = {\r
1520 {\r
1521 0x00,\r
1522 L"Generic",\r
1523 PCIBlankEntry\r
1524 },\r
1525 {\r
1526 0x01,\r
1527 L"ISA",\r
1528 PCIBlankEntry\r
1529 },\r
1530 {\r
1531 0x02,\r
1532 L"EISA",\r
1533 PCIBlankEntry\r
1534 },\r
1535 {\r
1536 0x00,\r
1537 NULL,\r
1538 /* null string ends the list */NULL\r
1539 }\r
1540};\r
1541\r
1542PCI_CLASS_ENTRY PCIPIFClass_0904[] = {\r
1543 {\r
1544 0x00,\r
1545 L"Generic",\r
1546 PCIBlankEntry\r
1547 },\r
1548 {\r
1549 0x10,\r
1550 L"",\r
1551 PCIBlankEntry\r
1552 },\r
1553 {\r
1554 0x00,\r
1555 NULL,\r
1556 /* null string ends the list */NULL\r
1557 }\r
1558};\r
1559\r
1560PCI_CLASS_ENTRY PCIPIFClass_0c00[] = {\r
1561 {\r
1562 0x00,\r
f056e4c1
JC
1563 L"",\r
1564 PCIBlankEntry\r
1565 },\r
1566 {\r
1567 0x10,\r
1568 L"Using 1394 OpenHCI spec",\r
1569 PCIBlankEntry\r
1570 },\r
1571 {\r
1572 0x00,\r
1573 NULL,\r
1574 /* null string ends the list */NULL\r
1575 }\r
1576};\r
1577\r
1578PCI_CLASS_ENTRY PCIPIFClass_0c03[] = {\r
1579 {\r
1580 0x00,\r
1581 L"UHCI",\r
5d73d92f 1582 PCIBlankEntry\r
1583 },\r
1584 {\r
1585 0x10,\r
f056e4c1
JC
1586 L"OHCI",\r
1587 PCIBlankEntry\r
1588 },\r
1589 {\r
1590 0x20,\r
1591 L"EHCI",\r
1592 PCIBlankEntry\r
1593 },\r
1594 {\r
1595 0x30,\r
1596 L"xHCI",\r
5d73d92f 1597 PCIBlankEntry\r
1598 },\r
1599 {\r
1600 0x80,\r
1601 L"No specific programming interface",\r
1602 PCIBlankEntry\r
1603 },\r
1604 {\r
1605 0xfe,\r
1606 L"(Not Host Controller)",\r
1607 PCIBlankEntry\r
1608 },\r
1609 {\r
1610 0x00,\r
1611 NULL,\r
1612 /* null string ends the list */NULL\r
1613 }\r
1614};\r
1615\r
f056e4c1 1616PCI_CLASS_ENTRY PCIPIFClass_0c07[] = {\r
5d73d92f 1617 {\r
1618 0x00,\r
f056e4c1
JC
1619 L"SMIC",\r
1620 PCIBlankEntry\r
1621 },\r
1622 {\r
1623 0x01,\r
1624 L"Keyboard Controller Style",\r
1625 PCIBlankEntry\r
1626 },\r
1627 {\r
1628 0x02,\r
1629 L"Block Transfer",\r
1630 PCIBlankEntry\r
1631 },\r
1632 {\r
1633 0x00,\r
1634 NULL,\r
1635 /* null string ends the list */NULL\r
1636 }\r
1637};\r
1638\r
1639PCI_CLASS_ENTRY PCIPIFClass_0d01[] = {\r
1640 {\r
1641 0x00,\r
1642 L"Consumer IR controller",\r
5d73d92f 1643 PCIBlankEntry\r
1644 },\r
1645 {\r
1646 0x10,\r
f056e4c1 1647 L"UWB Radio controller",\r
5d73d92f 1648 PCIBlankEntry\r
1649 },\r
1650 {\r
1651 0x00,\r
1652 NULL,\r
1653 /* null string ends the list */NULL\r
1654 }\r
1655};\r
1656\r
1657PCI_CLASS_ENTRY PCIPIFClass_0e00[] = {\r
1658 {\r
1659 0x00,\r
1660 L"Message FIFO at offset 40h",\r
1661 PCIBlankEntry\r
1662 },\r
1663 {\r
1664 0x01,\r
1665 L"",\r
1666 PCIBlankEntry\r
1667 },\r
1668 {\r
1669 0x00,\r
1670 NULL,\r
1671 /* null string ends the list */NULL\r
1672 }\r
1673};\r
1674\r
5d73d92f 1675\r
a1d4bfcc 1676/**\r
5d73d92f 1677 Generates printable Unicode strings that represent PCI device class,\r
1678 subclass and programmed I/F based on a value passed to the function.\r
1679\r
a1d4bfcc 1680 @param[in] ClassCode Value representing the PCI "Class Code" register read from a\r
5d73d92f 1681 PCI device. The encodings are:\r
1682 bits 23:16 - Base Class Code\r
1683 bits 15:8 - Sub-Class Code\r
1684 bits 7:0 - Programming Interface\r
4ff7e37b 1685 @param[in, out] ClassStrings Pointer of PCI_CLASS_STRINGS structure, which contains\r
5d73d92f 1686 printable class strings corresponding to ClassCode. The\r
1687 caller must not modify the strings that are pointed by\r
1688 the fields in ClassStrings.\r
5d73d92f 1689**/\r
a1d4bfcc 1690VOID\r
1691PciGetClassStrings (\r
1692 IN UINT32 ClassCode,\r
1693 IN OUT PCI_CLASS_STRINGS *ClassStrings\r
1694 )\r
5d73d92f 1695{\r
1696 INTN Index;\r
1697 UINT8 Code;\r
1698 PCI_CLASS_ENTRY *CurrentClass;\r
1699\r
1700 //\r
1701 // Assume no strings found\r
1702 //\r
1703 ClassStrings->BaseClass = L"UNDEFINED";\r
1704 ClassStrings->SubClass = L"UNDEFINED";\r
1705 ClassStrings->PIFClass = L"UNDEFINED";\r
1706\r
1707 CurrentClass = gClassStringList;\r
1708 Code = (UINT8) (ClassCode >> 16);\r
1709 Index = 0;\r
1710\r
1711 //\r
1712 // Go through all entries of the base class, until the entry with a matching\r
1713 // base class code is found. If reaches an entry with a null description\r
1714 // text, the last entry is met, which means no text for the base class was\r
1715 // found, so no more action is needed.\r
1716 //\r
1717 while (Code != CurrentClass[Index].Code) {\r
1718 if (NULL == CurrentClass[Index].DescText) {\r
1719 return ;\r
1720 }\r
1721\r
1722 Index++;\r
1723 }\r
1724 //\r
1725 // A base class was found. Assign description, and check if this class has\r
1726 // sub-class defined. If sub-class defined, no more action is needed,\r
1727 // otherwise, continue to find description for the sub-class code.\r
1728 //\r
1729 ClassStrings->BaseClass = CurrentClass[Index].DescText;\r
1730 if (NULL == CurrentClass[Index].LowerLevelClass) {\r
1731 return ;\r
1732 }\r
1733 //\r
1734 // find Subclass entry\r
1735 //\r
1736 CurrentClass = CurrentClass[Index].LowerLevelClass;\r
1737 Code = (UINT8) (ClassCode >> 8);\r
1738 Index = 0;\r
1739\r
1740 //\r
1741 // Go through all entries of the sub-class, until the entry with a matching\r
1742 // sub-class code is found. If reaches an entry with a null description\r
1743 // text, the last entry is met, which means no text for the sub-class was\r
1744 // found, so no more action is needed.\r
1745 //\r
1746 while (Code != CurrentClass[Index].Code) {\r
1747 if (NULL == CurrentClass[Index].DescText) {\r
1748 return ;\r
1749 }\r
1750\r
1751 Index++;\r
1752 }\r
1753 //\r
1754 // A class was found for the sub-class code. Assign description, and check if\r
1755 // this sub-class has programming interface defined. If no, no more action is\r
1756 // needed, otherwise, continue to find description for the programming\r
1757 // interface.\r
1758 //\r
1759 ClassStrings->SubClass = CurrentClass[Index].DescText;\r
1760 if (NULL == CurrentClass[Index].LowerLevelClass) {\r
1761 return ;\r
1762 }\r
1763 //\r
1764 // Find programming interface entry\r
1765 //\r
1766 CurrentClass = CurrentClass[Index].LowerLevelClass;\r
1767 Code = (UINT8) ClassCode;\r
1768 Index = 0;\r
1769\r
1770 //\r
1771 // Go through all entries of the I/F entries, until the entry with a\r
1772 // matching I/F code is found. If reaches an entry with a null description\r
1773 // text, the last entry is met, which means no text was found, so no more\r
1774 // action is needed.\r
1775 //\r
1776 while (Code != CurrentClass[Index].Code) {\r
1777 if (NULL == CurrentClass[Index].DescText) {\r
1778 return ;\r
1779 }\r
1780\r
1781 Index++;\r
1782 }\r
1783 //\r
1784 // A class was found for the I/F code. Assign description, done!\r
1785 //\r
1786 ClassStrings->PIFClass = CurrentClass[Index].DescText;\r
1787 return ;\r
1788}\r
1789\r
a1d4bfcc 1790/**\r
1791 Print strings that represent PCI device class, subclass and programmed I/F.\r
1792\r
1793 @param[in] ClassCodePtr Points to the memory which stores register Class Code in PCI\r
e8a57ade 1794 configuration space.\r
a1d4bfcc 1795 @param[in] IncludePIF If the printed string should include the programming I/F part\r
1796**/\r
5d73d92f 1797VOID\r
1798PciPrintClassCode (\r
1799 IN UINT8 *ClassCodePtr,\r
1800 IN BOOLEAN IncludePIF\r
1801 )\r
5d73d92f 1802{\r
1803 UINT32 ClassCode;\r
1804 PCI_CLASS_STRINGS ClassStrings;\r
5d73d92f 1805\r
1806 ClassCode = 0;\r
e8a57ade
JC
1807 ClassCode |= (UINT32)ClassCodePtr[0];\r
1808 ClassCode |= (UINT32)(ClassCodePtr[1] << 8);\r
1809 ClassCode |= (UINT32)(ClassCodePtr[2] << 16);\r
5d73d92f 1810\r
1811 //\r
1812 // Get name from class code\r
1813 //\r
1814 PciGetClassStrings (ClassCode, &ClassStrings);\r
1815\r
1816 if (IncludePIF) {\r
1817 //\r
c37e0f16 1818 // Print base class, sub class, and programming inferface name\r
5d73d92f 1819 //\r
c37e0f16 1820 ShellPrintEx (-1, -1, L"%s - %s - %s",\r
5d73d92f 1821 ClassStrings.BaseClass,\r
1822 ClassStrings.SubClass,\r
1823 ClassStrings.PIFClass\r
1824 );\r
1825\r
1826 } else {\r
1827 //\r
c37e0f16 1828 // Only print base class and sub class name\r
5d73d92f 1829 //\r
c37e0f16 1830 ShellPrintEx (-1, -1, L"%s - %s",\r
5d73d92f 1831 ClassStrings.BaseClass,\r
1832 ClassStrings.SubClass\r
c37e0f16 1833 );\r
5d73d92f 1834 }\r
1835}\r
1836\r
a1d4bfcc 1837/**\r
1838 This function finds out the protocol which is in charge of the given\r
1839 segment, and its bus range covers the current bus number. It lookes\r
1840 each instances of RootBridgeIoProtocol handle, until the one meets the\r
1841 criteria is found.\r
1842\r
1843 @param[in] HandleBuf Buffer which holds all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.\r
1844 @param[in] HandleCount Count of all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.\r
1845 @param[in] Segment Segment number of device we are dealing with.\r
1846 @param[in] Bus Bus number of device we are dealing with.\r
1847 @param[out] IoDev Handle used to access configuration space of PCI device.\r
1848\r
1849 @retval EFI_SUCCESS The command completed successfully.\r
1850 @retval EFI_INVALID_PARAMETER Invalid parameter.\r
5d73d92f 1851\r
a1d4bfcc 1852**/\r
5d73d92f 1853EFI_STATUS\r
1854PciFindProtocolInterface (\r
1855 IN EFI_HANDLE *HandleBuf,\r
1856 IN UINTN HandleCount,\r
1857 IN UINT16 Segment,\r
1858 IN UINT16 Bus,\r
1859 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **IoDev\r
1860 );\r
1861\r
a1d4bfcc 1862/**\r
1863 This function gets the protocol interface from the given handle, and\r
1864 obtains its address space descriptors.\r
1865\r
1866 @param[in] Handle The PCI_ROOT_BRIDIGE_IO_PROTOCOL handle.\r
1867 @param[out] IoDev Handle used to access configuration space of PCI device.\r
1868 @param[out] Descriptors Points to the address space descriptors.\r
1869\r
1870 @retval EFI_SUCCESS The command completed successfully\r
1871**/\r
5d73d92f 1872EFI_STATUS\r
1873PciGetProtocolAndResource (\r
1874 IN EFI_HANDLE Handle,\r
1875 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **IoDev,\r
1876 OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors\r
1877 );\r
1878\r
a1d4bfcc 1879/**\r
1880 This function get the next bus range of given address space descriptors.\r
1881 It also moves the pointer backward a node, to get prepared to be called\r
1882 again.\r
1883\r
4ff7e37b
ED
1884 @param[in, out] Descriptors Points to current position of a serial of address space\r
1885 descriptors.\r
1886 @param[out] MinBus The lower range of bus number.\r
1887 @param[out] MaxBus The upper range of bus number.\r
1888 @param[out] IsEnd Meet end of the serial of descriptors.\r
a1d4bfcc 1889\r
1890 @retval EFI_SUCCESS The command completed successfully.\r
1891**/\r
5d73d92f 1892EFI_STATUS\r
1893PciGetNextBusRange (\r
1894 IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors,\r
1895 OUT UINT16 *MinBus,\r
1896 OUT UINT16 *MaxBus,\r
1897 OUT BOOLEAN *IsEnd\r
1898 );\r
1899\r
a1d4bfcc 1900/**\r
1901 Explain the data in PCI configuration space. The part which is common for\r
1902 PCI device and bridge is interpreted in this function. It calls other\r
1903 functions to interpret data unique for device or bridge.\r
1904\r
1905 @param[in] ConfigSpace Data in PCI configuration space.\r
1906 @param[in] Address Address used to access configuration space of this PCI device.\r
1907 @param[in] IoDev Handle used to access configuration space of PCI device.\r
f614ce7e 1908 @param[in] EnhancedDump The print format for the dump data.\r
a1d4bfcc 1909\r
1910 @retval EFI_SUCCESS The command completed successfully.\r
1911**/\r
5d73d92f 1912EFI_STATUS\r
1913PciExplainData (\r
1914 IN PCI_CONFIG_SPACE *ConfigSpace,\r
1915 IN UINT64 Address,\r
705bffb5
JC
1916 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
1917 IN CONST UINT16 EnhancedDump\r
5d73d92f 1918 );\r
1919\r
a1d4bfcc 1920/**\r
1921 Explain the device specific part of data in PCI configuration space.\r
1922\r
1923 @param[in] Device Data in PCI configuration space.\r
1924 @param[in] Address Address used to access configuration space of this PCI device.\r
1925 @param[in] IoDev Handle used to access configuration space of PCI device.\r
1926\r
1927 @retval EFI_SUCCESS The command completed successfully.\r
1928**/\r
5d73d92f 1929EFI_STATUS\r
1930PciExplainDeviceData (\r
0c84a69f 1931 IN PCI_DEVICE_HEADER_TYPE_REGION *Device,\r
5d73d92f 1932 IN UINT64 Address,\r
1933 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
1934 );\r
1935\r
a1d4bfcc 1936/**\r
1937 Explain the bridge specific part of data in PCI configuration space.\r
1938\r
1939 @param[in] Bridge Bridge specific data region in PCI configuration space.\r
1940 @param[in] Address Address used to access configuration space of this PCI device.\r
1941 @param[in] IoDev Handle used to access configuration space of PCI device.\r
1942\r
1943 @retval EFI_SUCCESS The command completed successfully.\r
1944**/\r
5d73d92f 1945EFI_STATUS\r
1946PciExplainBridgeData (\r
0c84a69f 1947 IN PCI_BRIDGE_CONTROL_REGISTER *Bridge,\r
a1d4bfcc 1948 IN UINT64 Address,\r
1949 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
5d73d92f 1950 );\r
1951\r
a1d4bfcc 1952/**\r
1953 Explain the Base Address Register(Bar) in PCI configuration space.\r
1954\r
4ff7e37b
ED
1955 @param[in] Bar Points to the Base Address Register intended to interpret.\r
1956 @param[in] Command Points to the register Command.\r
1957 @param[in] Address Address used to access configuration space of this PCI device.\r
1958 @param[in] IoDev Handle used to access configuration space of PCI device.\r
1959 @param[in, out] Index The Index.\r
a1d4bfcc 1960\r
1961 @retval EFI_SUCCESS The command completed successfully.\r
1962**/\r
5d73d92f 1963EFI_STATUS\r
1964PciExplainBar (\r
1965 IN UINT32 *Bar,\r
1966 IN UINT16 *Command,\r
1967 IN UINT64 Address,\r
1968 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
1969 IN OUT UINTN *Index\r
1970 );\r
1971\r
a1d4bfcc 1972/**\r
1973 Explain the cardbus specific part of data in PCI configuration space.\r
1974\r
1975 @param[in] CardBus CardBus specific region of PCI configuration space.\r
1976 @param[in] Address Address used to access configuration space of this PCI device.\r
1977 @param[in] IoDev Handle used to access configuration space of PCI device.\r
1978\r
1979 @retval EFI_SUCCESS The command completed successfully.\r
1980**/\r
5d73d92f 1981EFI_STATUS\r
1982PciExplainCardBusData (\r
0c84a69f 1983 IN PCI_CARDBUS_CONTROL_REGISTER *CardBus,\r
5d73d92f 1984 IN UINT64 Address,\r
1985 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
1986 );\r
1987\r
a1d4bfcc 1988/**\r
1989 Explain each meaningful bit of register Status. The definition of Status is\r
1990 slightly different depending on the PCI header type.\r
1991\r
1992 @param[in] Status Points to the content of register Status.\r
1993 @param[in] MainStatus Indicates if this register is main status(not secondary\r
1994 status).\r
1995 @param[in] HeaderType Header type of this PCI device.\r
1996\r
1997 @retval EFI_SUCCESS The command completed successfully.\r
1998**/\r
5d73d92f 1999EFI_STATUS\r
2000PciExplainStatus (\r
2001 IN UINT16 *Status,\r
2002 IN BOOLEAN MainStatus,\r
2003 IN PCI_HEADER_TYPE HeaderType\r
2004 );\r
2005\r
a1d4bfcc 2006/**\r
2007 Explain each meaningful bit of register Command.\r
2008\r
2009 @param[in] Command Points to the content of register Command.\r
2010\r
2011 @retval EFI_SUCCESS The command completed successfully.\r
2012**/\r
5d73d92f 2013EFI_STATUS\r
2014PciExplainCommand (\r
2015 IN UINT16 *Command\r
2016 );\r
2017\r
a1d4bfcc 2018/**\r
2019 Explain each meaningful bit of register Bridge Control.\r
2020\r
2021 @param[in] BridgeControl Points to the content of register Bridge Control.\r
2022 @param[in] HeaderType The headertype.\r
2023\r
2024 @retval EFI_SUCCESS The command completed successfully.\r
2025**/\r
5d73d92f 2026EFI_STATUS\r
2027PciExplainBridgeControl (\r
2028 IN UINT16 *BridgeControl,\r
2029 IN PCI_HEADER_TYPE HeaderType\r
2030 );\r
2031\r
a1d4bfcc 2032/**\r
2033 Print each capability structure.\r
2034\r
f614ce7e
SQ
2035 @param[in] IoDev The pointer to the deivce.\r
2036 @param[in] Address The address to start at.\r
2037 @param[in] CapPtr The offset from the address.\r
2038 @param[in] EnhancedDump The print format for the dump data.\r
a1d4bfcc 2039\r
f614ce7e 2040 @retval EFI_SUCCESS The operation was successful.\r
a1d4bfcc 2041**/\r
5d73d92f 2042EFI_STATUS\r
2043PciExplainCapabilityStruct (\r
2044 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
2045 IN UINT64 Address,\r
705bffb5
JC
2046 IN UINT8 CapPtr,\r
2047 IN CONST UINT16 EnhancedDump\r
5d73d92f 2048 );\r
2049\r
a1d4bfcc 2050/**\r
2051 Display Pcie device structure.\r
2052\r
f614ce7e
SQ
2053 @param[in] IoDev The pointer to the root pci protocol.\r
2054 @param[in] Address The Address to start at.\r
2055 @param[in] CapabilityPtr The offset from the address to start.\r
2056 @param[in] EnhancedDump The print format for the dump data.\r
2057 \r
2058 @retval EFI_SUCCESS The command completed successfully.\r
2059 @retval @retval EFI_SUCCESS Pci express extend space IO is not suppoted. \r
a1d4bfcc 2060**/\r
5d73d92f 2061EFI_STATUS\r
2062PciExplainPciExpress (\r
2063 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
2064 IN UINT64 Address,\r
705bffb5
JC
2065 IN UINT8 CapabilityPtr,\r
2066 IN CONST UINT16 EnhancedDump\r
5d73d92f 2067 );\r
2068\r
a1d4bfcc 2069/**\r
2070 Print out information of the capability information.\r
2071\r
2072 @param[in] PciExpressCap The pointer to the structure about the device.\r
2073\r
2074 @retval EFI_SUCCESS The operation was successful.\r
2075**/\r
5d73d92f 2076EFI_STATUS\r
2077ExplainPcieCapReg (\r
0c84a69f 2078 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2079 );\r
2080\r
2081/**\r
2082 Print out information of the device capability information.\r
2083\r
2084 @param[in] PciExpressCap The pointer to the structure about the device.\r
5d73d92f 2085\r
a1d4bfcc 2086 @retval EFI_SUCCESS The operation was successful.\r
2087**/\r
5d73d92f 2088EFI_STATUS\r
2089ExplainPcieDeviceCap (\r
0c84a69f 2090 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2091 );\r
2092\r
2093/**\r
2094 Print out information of the device control information.\r
5d73d92f 2095\r
a1d4bfcc 2096 @param[in] PciExpressCap The pointer to the structure about the device.\r
2097\r
2098 @retval EFI_SUCCESS The operation was successful.\r
2099**/\r
5d73d92f 2100EFI_STATUS\r
2101ExplainPcieDeviceControl (\r
0c84a69f 2102 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2103 );\r
5d73d92f 2104\r
a1d4bfcc 2105/**\r
2106 Print out information of the device status information.\r
2107\r
2108 @param[in] PciExpressCap The pointer to the structure about the device.\r
2109\r
2110 @retval EFI_SUCCESS The operation was successful.\r
2111**/\r
5d73d92f 2112EFI_STATUS\r
2113ExplainPcieDeviceStatus (\r
0c84a69f 2114 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2115 );\r
2116\r
2117/**\r
2118 Print out information of the device link information.\r
2119\r
2120 @param[in] PciExpressCap The pointer to the structure about the device.\r
5d73d92f 2121\r
a1d4bfcc 2122 @retval EFI_SUCCESS The operation was successful.\r
2123**/\r
5d73d92f 2124EFI_STATUS\r
2125ExplainPcieLinkCap (\r
0c84a69f 2126 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2127 );\r
2128\r
2129/**\r
2130 Print out information of the device link control information.\r
5d73d92f 2131\r
a1d4bfcc 2132 @param[in] PciExpressCap The pointer to the structure about the device.\r
2133\r
2134 @retval EFI_SUCCESS The operation was successful.\r
2135**/\r
5d73d92f 2136EFI_STATUS\r
2137ExplainPcieLinkControl (\r
0c84a69f 2138 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2139 );\r
5d73d92f 2140\r
a1d4bfcc 2141/**\r
2142 Print out information of the device link status information.\r
2143\r
2144 @param[in] PciExpressCap The pointer to the structure about the device.\r
2145\r
2146 @retval EFI_SUCCESS The operation was successful.\r
2147**/\r
5d73d92f 2148EFI_STATUS\r
2149ExplainPcieLinkStatus (\r
0c84a69f 2150 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2151 );\r
2152\r
2153/**\r
2154 Print out information of the device slot information.\r
2155\r
2156 @param[in] PciExpressCap The pointer to the structure about the device.\r
5d73d92f 2157\r
a1d4bfcc 2158 @retval EFI_SUCCESS The operation was successful.\r
2159**/\r
5d73d92f 2160EFI_STATUS\r
2161ExplainPcieSlotCap (\r
0c84a69f 2162 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2163 );\r
2164\r
2165/**\r
2166 Print out information of the device slot control information.\r
5d73d92f 2167\r
a1d4bfcc 2168 @param[in] PciExpressCap The pointer to the structure about the device.\r
2169\r
2170 @retval EFI_SUCCESS The operation was successful.\r
2171**/\r
5d73d92f 2172EFI_STATUS\r
2173ExplainPcieSlotControl (\r
0c84a69f 2174 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2175 );\r
5d73d92f 2176\r
a1d4bfcc 2177/**\r
2178 Print out information of the device slot status information.\r
2179\r
2180 @param[in] PciExpressCap The pointer to the structure about the device.\r
2181\r
2182 @retval EFI_SUCCESS The operation was successful.\r
2183**/\r
5d73d92f 2184EFI_STATUS\r
2185ExplainPcieSlotStatus (\r
0c84a69f 2186 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2187 );\r
2188\r
2189/**\r
2190 Print out information of the device root information.\r
2191\r
2192 @param[in] PciExpressCap The pointer to the structure about the device.\r
5d73d92f 2193\r
a1d4bfcc 2194 @retval EFI_SUCCESS The operation was successful.\r
2195**/\r
5d73d92f 2196EFI_STATUS\r
2197ExplainPcieRootControl (\r
0c84a69f 2198 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2199 );\r
2200\r
2201/**\r
2202 Print out information of the device root capability information.\r
5d73d92f 2203\r
a1d4bfcc 2204 @param[in] PciExpressCap The pointer to the structure about the device.\r
2205\r
2206 @retval EFI_SUCCESS The operation was successful.\r
2207**/\r
5d73d92f 2208EFI_STATUS\r
2209ExplainPcieRootCap (\r
0c84a69f 2210 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2211 );\r
5d73d92f 2212\r
a1d4bfcc 2213/**\r
2214 Print out information of the device root status information.\r
2215\r
2216 @param[in] PciExpressCap The pointer to the structure about the device.\r
2217\r
2218 @retval EFI_SUCCESS The operation was successful.\r
2219**/\r
5d73d92f 2220EFI_STATUS\r
2221ExplainPcieRootStatus (\r
0c84a69f 2222 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 2223 );\r
5d73d92f 2224\r
0c84a69f 2225typedef EFI_STATUS (*PCIE_EXPLAIN_FUNCTION) (IN PCI_CAPABILITY_PCIEXP *PciExpressCap);\r
5d73d92f 2226\r
2227typedef enum {\r
2228 FieldWidthUINT8,\r
2229 FieldWidthUINT16,\r
2230 FieldWidthUINT32\r
2231} PCIE_CAPREG_FIELD_WIDTH;\r
2232\r
2233typedef enum {\r
2234 PcieExplainTypeCommon,\r
2235 PcieExplainTypeDevice,\r
2236 PcieExplainTypeLink,\r
2237 PcieExplainTypeSlot,\r
2238 PcieExplainTypeRoot,\r
2239 PcieExplainTypeMax\r
2240} PCIE_EXPLAIN_TYPE;\r
2241\r
2242typedef struct\r
2243{\r
2244 UINT16 Token;\r
2245 UINTN Offset;\r
2246 PCIE_CAPREG_FIELD_WIDTH Width;\r
2247 PCIE_EXPLAIN_FUNCTION Func;\r
2248 PCIE_EXPLAIN_TYPE Type;\r
2249} PCIE_EXPLAIN_STRUCT;\r
2250\r
2251PCIE_EXPLAIN_STRUCT PcieExplainList[] = {\r
2252 {\r
2253 STRING_TOKEN (STR_PCIEX_CAPABILITY_CAPID),\r
2254 0x00,\r
2255 FieldWidthUINT8,\r
2256 NULL,\r
2257 PcieExplainTypeCommon\r
2258 },\r
2259 {\r
2260 STRING_TOKEN (STR_PCIEX_NEXTCAP_PTR),\r
2261 0x01,\r
2262 FieldWidthUINT8,\r
2263 NULL,\r
2264 PcieExplainTypeCommon\r
2265 },\r
2266 {\r
2267 STRING_TOKEN (STR_PCIEX_CAP_REGISTER),\r
2268 0x02,\r
2269 FieldWidthUINT16,\r
2270 ExplainPcieCapReg,\r
2271 PcieExplainTypeCommon\r
2272 },\r
2273 {\r
2274 STRING_TOKEN (STR_PCIEX_DEVICE_CAP),\r
2275 0x04,\r
2276 FieldWidthUINT32,\r
2277 ExplainPcieDeviceCap,\r
2278 PcieExplainTypeDevice\r
2279 },\r
2280 {\r
2281 STRING_TOKEN (STR_PCIEX_DEVICE_CONTROL),\r
2282 0x08,\r
2283 FieldWidthUINT16,\r
2284 ExplainPcieDeviceControl,\r
2285 PcieExplainTypeDevice\r
2286 },\r
2287 {\r
2288 STRING_TOKEN (STR_PCIEX_DEVICE_STATUS),\r
2289 0x0a,\r
2290 FieldWidthUINT16,\r
2291 ExplainPcieDeviceStatus,\r
2292 PcieExplainTypeDevice\r
2293 },\r
2294 {\r
2295 STRING_TOKEN (STR_PCIEX_LINK_CAPABILITIES),\r
2296 0x0c,\r
2297 FieldWidthUINT32,\r
2298 ExplainPcieLinkCap,\r
2299 PcieExplainTypeLink\r
2300 },\r
2301 {\r
2302 STRING_TOKEN (STR_PCIEX_LINK_CONTROL),\r
2303 0x10,\r
2304 FieldWidthUINT16,\r
2305 ExplainPcieLinkControl,\r
2306 PcieExplainTypeLink\r
2307 },\r
2308 {\r
2309 STRING_TOKEN (STR_PCIEX_LINK_STATUS),\r
2310 0x12,\r
2311 FieldWidthUINT16,\r
2312 ExplainPcieLinkStatus,\r
2313 PcieExplainTypeLink\r
2314 },\r
2315 {\r
2316 STRING_TOKEN (STR_PCIEX_SLOT_CAPABILITIES),\r
2317 0x14,\r
2318 FieldWidthUINT32,\r
2319 ExplainPcieSlotCap,\r
2320 PcieExplainTypeSlot\r
2321 },\r
2322 {\r
2323 STRING_TOKEN (STR_PCIEX_SLOT_CONTROL),\r
2324 0x18,\r
2325 FieldWidthUINT16,\r
2326 ExplainPcieSlotControl,\r
2327 PcieExplainTypeSlot\r
2328 },\r
2329 {\r
2330 STRING_TOKEN (STR_PCIEX_SLOT_STATUS),\r
2331 0x1a,\r
2332 FieldWidthUINT16,\r
2333 ExplainPcieSlotStatus,\r
2334 PcieExplainTypeSlot\r
2335 },\r
2336 {\r
2337 STRING_TOKEN (STR_PCIEX_ROOT_CONTROL),\r
2338 0x1c,\r
2339 FieldWidthUINT16,\r
2340 ExplainPcieRootControl,\r
2341 PcieExplainTypeRoot\r
2342 },\r
2343 {\r
2344 STRING_TOKEN (STR_PCIEX_RSVDP),\r
2345 0x1e,\r
2346 FieldWidthUINT16,\r
2347 ExplainPcieRootCap,\r
2348 PcieExplainTypeRoot\r
2349 },\r
2350 {\r
2351 STRING_TOKEN (STR_PCIEX_ROOT_STATUS),\r
2352 0x20,\r
2353 FieldWidthUINT32,\r
2354 ExplainPcieRootStatus,\r
2355 PcieExplainTypeRoot\r
2356 },\r
2357 {\r
2358 0,\r
2359 0,\r
2360 (PCIE_CAPREG_FIELD_WIDTH)0,\r
2361 NULL,\r
2362 PcieExplainTypeMax\r
2363 }\r
2364};\r
2365\r
2366//\r
2367// Global Variables\r
2368//\r
2369PCI_CONFIG_SPACE *mConfigSpace = NULL;\r
2370STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
2371 {L"-s", TypeValue},\r
2372 {L"-i", TypeFlag},\r
c831a2c3 2373 {L"-ec", TypeValue},\r
5d73d92f 2374 {NULL, TypeMax}\r
2375 };\r
2376\r
2377CHAR16 *DevicePortTypeTable[] = {\r
2378 L"PCI Express Endpoint",\r
2379 L"Legacy PCI Express Endpoint",\r
2380 L"Unknown Type",\r
2381 L"Unknonw Type",\r
2382 L"Root Port of PCI Express Root Complex",\r
2383 L"Upstream Port of PCI Express Switch",\r
2384 L"Downstream Port of PCI Express Switch",\r
2385 L"PCI Express to PCI/PCI-X Bridge",\r
2386 L"PCI/PCI-X to PCI Express Bridge",\r
2387 L"Root Complex Integrated Endpoint",\r
2388 L"Root Complex Event Collector"\r
2389};\r
2390\r
2391CHAR16 *L0sLatencyStrTable[] = {\r
2392 L"Less than 64ns",\r
2393 L"64ns to less than 128ns",\r
2394 L"128ns to less than 256ns",\r
2395 L"256ns to less than 512ns",\r
2396 L"512ns to less than 1us",\r
2397 L"1us to less than 2us",\r
2398 L"2us-4us",\r
2399 L"More than 4us"\r
2400};\r
2401\r
2402CHAR16 *L1LatencyStrTable[] = {\r
2403 L"Less than 1us",\r
2404 L"1us to less than 2us",\r
2405 L"2us to less than 4us",\r
2406 L"4us to less than 8us",\r
2407 L"8us to less than 16us",\r
2408 L"16us to less than 32us",\r
2409 L"32us-64us",\r
2410 L"More than 64us"\r
2411};\r
2412\r
2413CHAR16 *ASPMCtrlStrTable[] = {\r
2414 L"Disabled",\r
2415 L"L0s Entry Enabled",\r
2416 L"L1 Entry Enabled",\r
2417 L"L0s and L1 Entry Enabled"\r
2418};\r
2419\r
2420CHAR16 *SlotPwrLmtScaleTable[] = {\r
2421 L"1.0x",\r
2422 L"0.1x",\r
2423 L"0.01x",\r
2424 L"0.001x"\r
2425};\r
2426\r
2427CHAR16 *IndicatorTable[] = {\r
2428 L"Reserved",\r
2429 L"On",\r
2430 L"Blink",\r
2431 L"Off"\r
2432};\r
2433\r
2434\r
a1d4bfcc 2435/**\r
2436 Function for 'pci' command.\r
2437\r
2438 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
2439 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
2440**/\r
5d73d92f 2441SHELL_STATUS\r
2442EFIAPI\r
2443ShellCommandRunPci (\r
2444 IN EFI_HANDLE ImageHandle,\r
2445 IN EFI_SYSTEM_TABLE *SystemTable\r
2446 )\r
2447{\r
2448 UINT16 Segment;\r
2449 UINT16 Bus;\r
2450 UINT16 Device;\r
2451 UINT16 Func;\r
2452 UINT64 Address;\r
2453 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev;\r
2454 EFI_STATUS Status;\r
0c84a69f 2455 PCI_DEVICE_INDEPENDENT_REGION PciHeader;\r
5d73d92f 2456 PCI_CONFIG_SPACE ConfigSpace;\r
2457 UINTN ScreenCount;\r
2458 UINTN TempColumn;\r
2459 UINTN ScreenSize;\r
2460 BOOLEAN ExplainData;\r
2461 UINTN Index;\r
2462 UINTN SizeOfHeader;\r
2463 BOOLEAN PrintTitle;\r
2464 UINTN HandleBufSize;\r
2465 EFI_HANDLE *HandleBuf;\r
2466 UINTN HandleCount;\r
2467 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors;\r
2468 UINT16 MinBus;\r
2469 UINT16 MaxBus;\r
2470 BOOLEAN IsEnd;\r
2471 LIST_ENTRY *Package;\r
2472 CHAR16 *ProblemParam;\r
2473 SHELL_STATUS ShellStatus;\r
5d73d92f 2474 CONST CHAR16 *Temp;\r
6855763e 2475 UINT64 RetVal;\r
705bffb5 2476 UINT16 EnhancedDump;\r
5d73d92f 2477\r
2478 ShellStatus = SHELL_SUCCESS;\r
2479 Status = EFI_SUCCESS;\r
2480 Address = 0;\r
5d73d92f 2481 IoDev = NULL;\r
2482 HandleBuf = NULL;\r
2483 Package = NULL;\r
2484\r
2485 //\r
2486 // initialize the shell lib (we must be in non-auto-init...)\r
2487 //\r
2488 Status = ShellInitialize();\r
2489 ASSERT_EFI_ERROR(Status);\r
2490\r
2491 Status = CommandInit();\r
2492 ASSERT_EFI_ERROR(Status);\r
2493\r
2494 //\r
2495 // parse the command line\r
2496 //\r
2497 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
2498 if (EFI_ERROR(Status)) {\r
2499 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
4092a8f6 2500 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"pci", ProblemParam); \r
5d73d92f 2501 FreePool(ProblemParam);\r
2502 ShellStatus = SHELL_INVALID_PARAMETER;\r
2503 } else {\r
2504 ASSERT(FALSE);\r
2505 }\r
2506 } else {\r
2507\r
3737ac2b 2508 if (ShellCommandLineGetCount(Package) == 2) {\r
4092a8f6 2509 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"pci"); \r
3737ac2b 2510 ShellStatus = SHELL_INVALID_PARAMETER;\r
2511 goto Done;\r
2512 }\r
5d73d92f 2513\r
3737ac2b 2514 if (ShellCommandLineGetCount(Package) > 4) {\r
4092a8f6 2515 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"pci"); \r
3737ac2b 2516 ShellStatus = SHELL_INVALID_PARAMETER;\r
2517 goto Done;\r
2518 }\r
c831a2c3
RN
2519 if (ShellCommandLineGetFlag(Package, L"-ec") && ShellCommandLineGetValue(Package, L"-ec") == NULL) {\r
2520 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-ec"); \r
2521 ShellStatus = SHELL_INVALID_PARAMETER;\r
2522 goto Done;\r
2523 }\r
3737ac2b 2524 if (ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetValue(Package, L"-s") == NULL) {\r
4092a8f6 2525 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDebug1HiiHandle, L"pci", L"-s"); \r
3737ac2b 2526 ShellStatus = SHELL_INVALID_PARAMETER;\r
2527 goto Done;\r
2528 }\r
5d73d92f 2529 //\r
2530 // Get all instances of PciRootBridgeIo. Allocate space for 1 EFI_HANDLE and\r
2531 // call LibLocateHandle(), if EFI_BUFFER_TOO_SMALL is returned, allocate enough\r
2532 // space for handles and call it again.\r
2533 //\r
2534 HandleBufSize = sizeof (EFI_HANDLE);\r
3737ac2b 2535 HandleBuf = (EFI_HANDLE *) AllocateZeroPool (HandleBufSize);\r
5d73d92f 2536 if (HandleBuf == NULL) {\r
4092a8f6 2537 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2538 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
2539 goto Done;\r
2540 }\r
2541\r
2542 Status = gBS->LocateHandle (\r
2543 ByProtocol,\r
2544 &gEfiPciRootBridgeIoProtocolGuid,\r
2545 NULL,\r
2546 &HandleBufSize,\r
2547 HandleBuf\r
2548 );\r
2549\r
2550 if (Status == EFI_BUFFER_TOO_SMALL) {\r
2551 HandleBuf = ReallocatePool (sizeof (EFI_HANDLE), HandleBufSize, HandleBuf);\r
2552 if (HandleBuf == NULL) {\r
4092a8f6 2553 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2554 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
2555 goto Done;\r
2556 }\r
2557\r
2558 Status = gBS->LocateHandle (\r
2559 ByProtocol,\r
2560 &gEfiPciRootBridgeIoProtocolGuid,\r
2561 NULL,\r
2562 &HandleBufSize,\r
2563 HandleBuf\r
2564 );\r
2565 }\r
2566\r
2567 if (EFI_ERROR (Status)) {\r
4092a8f6 2568 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PCIRBIO_NF), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2569 ShellStatus = SHELL_NOT_FOUND;\r
2570 goto Done;\r
2571 }\r
2572\r
2573 HandleCount = HandleBufSize / sizeof (EFI_HANDLE);\r
2574 //\r
2575 // Argument Count == 1(no other argument): enumerate all pci functions\r
2576 //\r
3737ac2b 2577 if (ShellCommandLineGetCount(Package) == 1) {\r
5d73d92f 2578 gST->ConOut->QueryMode (\r
2579 gST->ConOut,\r
2580 gST->ConOut->Mode->Mode,\r
2581 &TempColumn,\r
2582 &ScreenSize\r
2583 );\r
2584\r
2585 ScreenCount = 0;\r
2586 ScreenSize -= 4;\r
2587 if ((ScreenSize & 1) == 1) {\r
2588 ScreenSize -= 1;\r
2589 }\r
2590\r
2591 PrintTitle = TRUE;\r
2592\r
2593 //\r
2594 // For each handle, which decides a segment and a bus number range,\r
2595 // enumerate all devices on it.\r
2596 //\r
2597 for (Index = 0; Index < HandleCount; Index++) {\r
2598 Status = PciGetProtocolAndResource (\r
2599 HandleBuf[Index],\r
2600 &IoDev,\r
2601 &Descriptors\r
2602 );\r
2603 if (EFI_ERROR (Status)) {\r
4092a8f6 2604 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_HANDLE_CFG_ERR), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2605 ShellStatus = SHELL_NOT_FOUND;\r
2606 goto Done;\r
2607 }\r
2608 //\r
2609 // No document say it's impossible for a RootBridgeIo protocol handle\r
2610 // to have more than one address space descriptors, so find out every\r
2611 // bus range and for each of them do device enumeration.\r
2612 //\r
2613 while (TRUE) {\r
2614 Status = PciGetNextBusRange (&Descriptors, &MinBus, &MaxBus, &IsEnd);\r
2615\r
2616 if (EFI_ERROR (Status)) {\r
4092a8f6 2617 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_BUS_RANGE_ERR), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2618 ShellStatus = SHELL_NOT_FOUND;\r
2619 goto Done;\r
2620 }\r
2621\r
2622 if (IsEnd) {\r
2623 break;\r
2624 }\r
2625\r
2626 for (Bus = MinBus; Bus <= MaxBus; Bus++) {\r
2627 //\r
2628 // For each devices, enumerate all functions it contains\r
2629 //\r
2630 for (Device = 0; Device <= PCI_MAX_DEVICE; Device++) {\r
2631 //\r
2632 // For each function, read its configuration space and print summary\r
2633 //\r
2634 for (Func = 0; Func <= PCI_MAX_FUNC; Func++) {\r
2635 if (ShellGetExecutionBreakFlag ()) {\r
2636 ShellStatus = SHELL_ABORTED;\r
2637 goto Done;\r
2638 }\r
0c84a69f 2639 Address = EFI_PCI_ADDRESS (Bus, Device, Func, 0);\r
5d73d92f 2640 IoDev->Pci.Read (\r
2641 IoDev,\r
2642 EfiPciWidthUint16,\r
2643 Address,\r
2644 1,\r
2645 &PciHeader.VendorId\r
2646 );\r
2647\r
2648 //\r
2649 // If VendorId = 0xffff, there does not exist a device at this\r
2650 // location. For each device, if there is any function on it,\r
2651 // there must be 1 function at Function 0. So if Func = 0, there\r
2652 // will be no more functions in the same device, so we can break\r
2653 // loop to deal with the next device.\r
2654 //\r
2655 if (PciHeader.VendorId == 0xffff && Func == 0) {\r
2656 break;\r
2657 }\r
2658\r
2659 if (PciHeader.VendorId != 0xffff) {\r
2660\r
2661 if (PrintTitle) {\r
2662 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_TITLE), gShellDebug1HiiHandle);\r
2663 PrintTitle = FALSE;\r
2664 }\r
2665\r
2666 IoDev->Pci.Read (\r
2667 IoDev,\r
2668 EfiPciWidthUint32,\r
2669 Address,\r
2670 sizeof (PciHeader) / sizeof (UINT32),\r
2671 &PciHeader\r
2672 );\r
2673\r
2674 ShellPrintHiiEx(\r
2675 -1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_P1), gShellDebug1HiiHandle,\r
2676 IoDev->SegmentNumber,\r
2677 Bus,\r
2678 Device,\r
2679 Func\r
2680 );\r
2681\r
2682 PciPrintClassCode (PciHeader.ClassCode, FALSE);\r
2683 ShellPrintHiiEx(\r
2684 -1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_P2), gShellDebug1HiiHandle,\r
2685 PciHeader.VendorId,\r
2686 PciHeader.DeviceId,\r
2687 PciHeader.ClassCode[0]\r
2688 );\r
2689\r
2690 ScreenCount += 2;\r
2691 if (ScreenCount >= ScreenSize && ScreenSize != 0) {\r
2692 //\r
2693 // If ScreenSize == 0 we have the console redirected so don't\r
2694 // block updates\r
2695 //\r
2696 ScreenCount = 0;\r
2697 }\r
2698 //\r
2699 // If this is not a multi-function device, we can leave the loop\r
2700 // to deal with the next device.\r
2701 //\r
2702 if (Func == 0 && ((PciHeader.HeaderType & HEADER_TYPE_MULTI_FUNCTION) == 0x00)) {\r
2703 break;\r
2704 }\r
2705 }\r
2706 }\r
2707 }\r
2708 }\r
2709 //\r
2710 // If Descriptor is NULL, Configuration() returns EFI_UNSUPPRORED,\r
2711 // we assume the bus range is 0~PCI_MAX_BUS. After enumerated all\r
2712 // devices on all bus, we can leave loop.\r
2713 //\r
2714 if (Descriptors == NULL) {\r
2715 break;\r
2716 }\r
2717 }\r
2718 }\r
2719\r
2720 Status = EFI_SUCCESS;\r
2721 goto Done;\r
2722 }\r
2723\r
5d73d92f 2724 ExplainData = FALSE;\r
2725 Segment = 0;\r
2726 Bus = 0;\r
2727 Device = 0;\r
2728 Func = 0;\r
31d7be01 2729 EnhancedDump = 0xFFFF;\r
5d73d92f 2730 if (ShellCommandLineGetFlag(Package, L"-i")) {\r
2731 ExplainData = TRUE;\r
2732 }\r
2733\r
2734 Temp = ShellCommandLineGetValue(Package, L"-s");\r
2735 if (Temp != NULL) {\r
6855763e
CP
2736 //\r
2737 // Input converted to hexadecimal number.\r
2738 //\r
2739 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) {\r
2740 Segment = (UINT16) RetVal;\r
2741 } else {\r
4092a8f6 2742 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); \r
6855763e
CP
2743 ShellStatus = SHELL_INVALID_PARAMETER;\r
2744 goto Done;\r
2745 }\r
5d73d92f 2746 }\r
2747\r
2748 //\r
2749 // The first Argument(except "-i") is assumed to be Bus number, second\r
2750 // to be Device number, and third to be Func number.\r
2751 //\r
2752 Temp = ShellCommandLineGetRawValue(Package, 1);\r
2753 if (Temp != NULL) {\r
6855763e
CP
2754 //\r
2755 // Input converted to hexadecimal number.\r
2756 //\r
2757 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) {\r
2758 Bus = (UINT16) RetVal;\r
2759 } else {\r
4092a8f6 2760 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); \r
6855763e
CP
2761 ShellStatus = SHELL_INVALID_PARAMETER;\r
2762 goto Done;\r
2763 }\r
2764\r
0c84a69f 2765 if (Bus > PCI_MAX_BUS) {\r
4092a8f6 2766 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); \r
5d73d92f 2767 ShellStatus = SHELL_INVALID_PARAMETER;\r
2768 goto Done;\r
2769 }\r
2770 }\r
2771 Temp = ShellCommandLineGetRawValue(Package, 2);\r
2772 if (Temp != NULL) {\r
6855763e
CP
2773 //\r
2774 // Input converted to hexadecimal number.\r
2775 //\r
2776 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) {\r
2777 Device = (UINT16) RetVal;\r
2778 } else {\r
4092a8f6 2779 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); \r
6855763e
CP
2780 ShellStatus = SHELL_INVALID_PARAMETER;\r
2781 goto Done;\r
2782 }\r
2783\r
0c84a69f 2784 if (Device > PCI_MAX_DEVICE){\r
4092a8f6 2785 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); \r
5d73d92f 2786 ShellStatus = SHELL_INVALID_PARAMETER;\r
2787 goto Done;\r
2788 }\r
2789 }\r
2790\r
2791 Temp = ShellCommandLineGetRawValue(Package, 3);\r
2792 if (Temp != NULL) {\r
6855763e
CP
2793 //\r
2794 // Input converted to hexadecimal number.\r
2795 //\r
2796 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) {\r
2797 Func = (UINT16) RetVal;\r
2798 } else {\r
4092a8f6 2799 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); \r
6855763e
CP
2800 ShellStatus = SHELL_INVALID_PARAMETER;\r
2801 goto Done;\r
2802 }\r
2803\r
0c84a69f 2804 if (Func > PCI_MAX_FUNC){\r
4092a8f6 2805 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"pci", Temp); \r
5d73d92f 2806 ShellStatus = SHELL_INVALID_PARAMETER;\r
2807 goto Done;\r
2808 }\r
2809 }\r
2810\r
31d7be01
RN
2811 Temp = ShellCommandLineGetValue (Package, L"-ec");\r
2812 if (Temp != NULL) {\r
2813 //\r
2814 // Input converted to hexadecimal number.\r
2815 //\r
2816 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp, &RetVal, TRUE, TRUE))) {\r
2817 EnhancedDump = (UINT16) RetVal;\r
2818 } else {\r
2819 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV_HEX), gShellDebug1HiiHandle, L"pci", Temp); \r
2820 ShellStatus = SHELL_INVALID_PARAMETER;\r
2821 goto Done;\r
2822 }\r
2823 }\r
2824\r
5d73d92f 2825 //\r
2826 // Find the protocol interface who's in charge of current segment, and its\r
2827 // bus range covers the current bus\r
2828 //\r
2829 Status = PciFindProtocolInterface (\r
2830 HandleBuf,\r
2831 HandleCount,\r
2832 Segment,\r
2833 Bus,\r
2834 &IoDev\r
2835 );\r
2836\r
2837 if (EFI_ERROR (Status)) {\r
2838 ShellPrintHiiEx(\r
4092a8f6 2839 -1, -1, NULL, STRING_TOKEN (STR_PCI_NO_FIND), gShellDebug1HiiHandle, L"pci", \r
5d73d92f 2840 Segment,\r
2841 Bus\r
2842 );\r
2843 ShellStatus = SHELL_NOT_FOUND;\r
2844 goto Done;\r
2845 }\r
2846\r
0c84a69f 2847 Address = EFI_PCI_ADDRESS (Bus, Device, Func, 0);\r
5d73d92f 2848 Status = IoDev->Pci.Read (\r
2849 IoDev,\r
2850 EfiPciWidthUint8,\r
2851 Address,\r
2852 sizeof (ConfigSpace),\r
2853 &ConfigSpace\r
2854 );\r
2855\r
2856 if (EFI_ERROR (Status)) {\r
4092a8f6 2857 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_NO_CFG), gShellDebug1HiiHandle, L"pci"); \r
5d73d92f 2858 ShellStatus = SHELL_ACCESS_DENIED;\r
2859 goto Done;\r
2860 }\r
2861\r
2862 mConfigSpace = &ConfigSpace;\r
2863 ShellPrintHiiEx(\r
2864 -1,\r
2865 -1,\r
2866 NULL,\r
2867 STRING_TOKEN (STR_PCI_INFO),\r
2868 gShellDebug1HiiHandle,\r
2869 Segment,\r
2870 Bus,\r
2871 Device,\r
2872 Func,\r
2873 Segment,\r
2874 Bus,\r
2875 Device,\r
2876 Func\r
2877 );\r
2878\r
2879 //\r
2880 // Dump standard header of configuration space\r
2881 //\r
2882 SizeOfHeader = sizeof (ConfigSpace.Common) + sizeof (ConfigSpace.NonCommon);\r
2883\r
a1d4bfcc 2884 DumpHex (2, 0, SizeOfHeader, &ConfigSpace);\r
5d73d92f 2885 ShellPrintEx(-1,-1, L"\r\n");\r
2886\r
2887 //\r
2888 // Dump device dependent Part of configuration space\r
2889 //\r
a1d4bfcc 2890 DumpHex (\r
5d73d92f 2891 2,\r
2892 SizeOfHeader,\r
2893 sizeof (ConfigSpace) - SizeOfHeader,\r
2894 ConfigSpace.Data\r
2895 );\r
2896\r
2897 //\r
2898 // If "-i" appears in command line, interpret data in configuration space\r
2899 //\r
2900 if (ExplainData) {\r
705bffb5 2901 Status = PciExplainData (&ConfigSpace, Address, IoDev, EnhancedDump);\r
5d73d92f 2902 }\r
2903 }\r
2904Done:\r
2905 if (HandleBuf != NULL) {\r
2906 FreePool (HandleBuf);\r
2907 }\r
2908 if (Package != NULL) {\r
2909 ShellCommandLineFreeVarList (Package);\r
2910 }\r
2911 mConfigSpace = NULL;\r
2912 return ShellStatus;\r
2913}\r
2914\r
a1d4bfcc 2915/**\r
5d73d92f 2916 This function finds out the protocol which is in charge of the given\r
2917 segment, and its bus range covers the current bus number. It lookes\r
2918 each instances of RootBridgeIoProtocol handle, until the one meets the\r
2919 criteria is found.\r
2920\r
a1d4bfcc 2921 @param[in] HandleBuf Buffer which holds all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.\r
2922 @param[in] HandleCount Count of all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.\r
2923 @param[in] Segment Segment number of device we are dealing with.\r
2924 @param[in] Bus Bus number of device we are dealing with.\r
2925 @param[out] IoDev Handle used to access configuration space of PCI device.\r
5d73d92f 2926\r
a1d4bfcc 2927 @retval EFI_SUCCESS The command completed successfully.\r
2928 @retval EFI_INVALID_PARAMETER Invalid parameter.\r
5d73d92f 2929\r
2930**/\r
a1d4bfcc 2931EFI_STATUS\r
2932PciFindProtocolInterface (\r
2933 IN EFI_HANDLE *HandleBuf,\r
2934 IN UINTN HandleCount,\r
2935 IN UINT16 Segment,\r
2936 IN UINT16 Bus,\r
2937 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **IoDev\r
2938 )\r
5d73d92f 2939{\r
2940 UINTN Index;\r
2941 EFI_STATUS Status;\r
5d73d92f 2942 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors;\r
2943 UINT16 MinBus;\r
2944 UINT16 MaxBus;\r
2945 BOOLEAN IsEnd;\r
2946\r
5d73d92f 2947 //\r
2948 // Go through all handles, until the one meets the criteria is found\r
2949 //\r
2950 for (Index = 0; Index < HandleCount; Index++) {\r
2951 Status = PciGetProtocolAndResource (HandleBuf[Index], IoDev, &Descriptors);\r
2952 if (EFI_ERROR (Status)) {\r
2953 return Status;\r
2954 }\r
2955 //\r
2956 // When Descriptors == NULL, the Configuration() is not implemented,\r
2957 // so we only check the Segment number\r
2958 //\r
2959 if (Descriptors == NULL && Segment == (*IoDev)->SegmentNumber) {\r
2960 return EFI_SUCCESS;\r
2961 }\r
2962\r
2963 if ((*IoDev)->SegmentNumber != Segment) {\r
2964 continue;\r
2965 }\r
2966\r
2967 while (TRUE) {\r
2968 Status = PciGetNextBusRange (&Descriptors, &MinBus, &MaxBus, &IsEnd);\r
2969 if (EFI_ERROR (Status)) {\r
2970 return Status;\r
2971 }\r
2972\r
2973 if (IsEnd) {\r
2974 break;\r
2975 }\r
2976\r
2977 if (MinBus <= Bus && MaxBus >= Bus) {\r
2c46dd23 2978 return EFI_SUCCESS;\r
5d73d92f 2979 }\r
2980 }\r
2981 }\r
2982\r
2c46dd23 2983 return EFI_NOT_FOUND;\r
5d73d92f 2984}\r
2985\r
a1d4bfcc 2986/**\r
2987 This function gets the protocol interface from the given handle, and\r
2988 obtains its address space descriptors.\r
2989\r
2990 @param[in] Handle The PCI_ROOT_BRIDIGE_IO_PROTOCOL handle.\r
2991 @param[out] IoDev Handle used to access configuration space of PCI device.\r
2992 @param[out] Descriptors Points to the address space descriptors.\r
2993\r
2994 @retval EFI_SUCCESS The command completed successfully\r
2995**/\r
5d73d92f 2996EFI_STATUS\r
2997PciGetProtocolAndResource (\r
2998 IN EFI_HANDLE Handle,\r
2999 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **IoDev,\r
3000 OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors\r
3001 )\r
5d73d92f 3002{\r
3003 EFI_STATUS Status;\r
3004\r
3005 //\r
3006 // Get inferface from protocol\r
3007 //\r
3008 Status = gBS->HandleProtocol (\r
3009 Handle,\r
3010 &gEfiPciRootBridgeIoProtocolGuid,\r
3011 (VOID**)IoDev\r
3012 );\r
3013\r
3014 if (EFI_ERROR (Status)) {\r
3015 return Status;\r
3016 }\r
3017 //\r
3018 // Call Configuration() to get address space descriptors\r
3019 //\r
3020 Status = (*IoDev)->Configuration (*IoDev, (VOID**)Descriptors);\r
3021 if (Status == EFI_UNSUPPORTED) {\r
3022 *Descriptors = NULL;\r
3023 return EFI_SUCCESS;\r
3024\r
3025 } else {\r
3026 return Status;\r
3027 }\r
3028}\r
3029\r
a1d4bfcc 3030/**\r
3031 This function get the next bus range of given address space descriptors.\r
3032 It also moves the pointer backward a node, to get prepared to be called\r
3033 again.\r
3034\r
4ff7e37b
ED
3035 @param[in, out] Descriptors Points to current position of a serial of address space\r
3036 descriptors.\r
3037 @param[out] MinBus The lower range of bus number.\r
3038 @param[out] MaxBus The upper range of bus number.\r
3039 @param[out] IsEnd Meet end of the serial of descriptors.\r
a1d4bfcc 3040\r
3041 @retval EFI_SUCCESS The command completed successfully.\r
3042**/\r
5d73d92f 3043EFI_STATUS\r
3044PciGetNextBusRange (\r
3045 IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR **Descriptors,\r
3046 OUT UINT16 *MinBus,\r
3047 OUT UINT16 *MaxBus,\r
3048 OUT BOOLEAN *IsEnd\r
3049 )\r
5d73d92f 3050{\r
3051 *IsEnd = FALSE;\r
3052\r
3053 //\r
3054 // When *Descriptors is NULL, Configuration() is not implemented, so assume\r
3055 // range is 0~PCI_MAX_BUS\r
3056 //\r
3057 if ((*Descriptors) == NULL) {\r
3058 *MinBus = 0;\r
3059 *MaxBus = PCI_MAX_BUS;\r
3060 return EFI_SUCCESS;\r
3061 }\r
3062 //\r
3063 // *Descriptors points to one or more address space descriptors, which\r
3064 // ends with a end tagged descriptor. Examine each of the descriptors,\r
3065 // if a bus typed one is found and its bus range covers bus, this handle\r
3066 // is the handle we are looking for.\r
3067 //\r
5d73d92f 3068\r
3069 while ((*Descriptors)->Desc != ACPI_END_TAG_DESCRIPTOR) {\r
3070 if ((*Descriptors)->ResType == ACPI_ADDRESS_SPACE_TYPE_BUS) {\r
3071 *MinBus = (UINT16) (*Descriptors)->AddrRangeMin;\r
3072 *MaxBus = (UINT16) (*Descriptors)->AddrRangeMax;\r
3073 (*Descriptors)++;\r
3737ac2b 3074 return (EFI_SUCCESS);\r
5d73d92f 3075 }\r
3076\r
3077 (*Descriptors)++;\r
3078 }\r
3079\r
3737ac2b 3080 if ((*Descriptors)->Desc == ACPI_END_TAG_DESCRIPTOR) {\r
3081 *IsEnd = TRUE;\r
3082 }\r
3083\r
5d73d92f 3084 return EFI_SUCCESS;\r
3085}\r
3086\r
a1d4bfcc 3087/**\r
5d73d92f 3088 Explain the data in PCI configuration space. The part which is common for\r
3089 PCI device and bridge is interpreted in this function. It calls other\r
3090 functions to interpret data unique for device or bridge.\r
3091\r
a1d4bfcc 3092 @param[in] ConfigSpace Data in PCI configuration space.\r
3093 @param[in] Address Address used to access configuration space of this PCI device.\r
3094 @param[in] IoDev Handle used to access configuration space of PCI device.\r
f614ce7e 3095 @param[in] EnhancedDump The print format for the dump data.\r
5d73d92f 3096\r
a1d4bfcc 3097 @retval EFI_SUCCESS The command completed successfully.\r
5d73d92f 3098**/\r
a1d4bfcc 3099EFI_STATUS\r
3100PciExplainData (\r
3101 IN PCI_CONFIG_SPACE *ConfigSpace,\r
3102 IN UINT64 Address,\r
705bffb5
JC
3103 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
3104 IN CONST UINT16 EnhancedDump\r
a1d4bfcc 3105 )\r
5d73d92f 3106{\r
0c84a69f
RN
3107 PCI_DEVICE_INDEPENDENT_REGION *Common;\r
3108 PCI_HEADER_TYPE HeaderType;\r
3109 EFI_STATUS Status;\r
3110 UINT8 CapPtr;\r
5d73d92f 3111\r
3112 Common = &(ConfigSpace->Common);\r
3113\r
c37e0f16 3114 ShellPrintEx (-1, -1, L"\r\n");\r
5d73d92f 3115\r
3116 //\r
3117 // Print Vendor Id and Device Id\r
3118 //\r
3119 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_VID_DID), gShellDebug1HiiHandle,\r
3120 INDEX_OF (&(Common->VendorId)),\r
3121 Common->VendorId,\r
3122 INDEX_OF (&(Common->DeviceId)),\r
3123 Common->DeviceId\r
3124 );\r
3125\r
3126 //\r
3127 // Print register Command\r
3128 //\r
3129 PciExplainCommand (&(Common->Command));\r
3130\r
3131 //\r
3132 // Print register Status\r
3133 //\r
3134 PciExplainStatus (&(Common->Status), TRUE, PciUndefined);\r
3135\r
3136 //\r
3137 // Print register Revision ID\r
3138 //\r
14b5e3fd 3139 ShellPrintEx(-1, -1, L"\r\n");\r
5d73d92f 3140 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_RID), gShellDebug1HiiHandle,\r
0c84a69f
RN
3141 INDEX_OF (&(Common->RevisionID)),\r
3142 Common->RevisionID\r
5d73d92f 3143 );\r
3144\r
3145 //\r
3146 // Print register BIST\r
3147 //\r
0c84a69f
RN
3148 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_BIST), gShellDebug1HiiHandle, INDEX_OF (&(Common->BIST)));\r
3149 if ((Common->BIST & BIT7) != 0) {\r
3150 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_CAP), gShellDebug1HiiHandle, 0x0f & Common->BIST);\r
5d73d92f 3151 } else {\r
3152 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_PCI_LINE_CAP_NO), gShellDebug1HiiHandle);\r
3153 }\r
3154 //\r
3155 // Print register Cache Line Size\r
3156 //\r
3157 ShellPrintHiiEx(-1, -1, NULL,\r
3158 STRING_TOKEN (STR_PCI2_CACHE_LINE_SIZE),\r
3159 gShellDebug1HiiHandle,\r
3160 INDEX_OF (&(Common->CacheLineSize)),\r
3161 Common->CacheLineSize\r
3162 );\r
3163\r
3164 //\r
3165 // Print register Latency Timer\r
3166 //\r
3167 ShellPrintHiiEx(-1, -1, NULL,\r
3168 STRING_TOKEN (STR_PCI2_LATENCY_TIMER),\r
3169 gShellDebug1HiiHandle,\r
0c84a69f
RN
3170 INDEX_OF (&(Common->LatencyTimer)),\r
3171 Common->LatencyTimer\r
5d73d92f 3172 );\r
3173\r
3174 //\r
3175 // Print register Header Type\r
3176 //\r
3177 ShellPrintHiiEx(-1, -1, NULL,\r
3178 STRING_TOKEN (STR_PCI2_HEADER_TYPE),\r
3179 gShellDebug1HiiHandle,\r
3180 INDEX_OF (&(Common->HeaderType)),\r
3181 Common->HeaderType\r
3182 );\r
3183\r
0c84a69f 3184 if ((Common->HeaderType & BIT7) != 0) {\r
5d73d92f 3185 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MULTI_FUNCTION), gShellDebug1HiiHandle);\r
3186\r
3187 } else {\r
3188 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_SINGLE_FUNCTION), gShellDebug1HiiHandle);\r
3189 }\r
3190\r
3191 HeaderType = (PCI_HEADER_TYPE)(UINT8) (Common->HeaderType & 0x7f);\r
3192 switch (HeaderType) {\r
3193 case PciDevice:\r
3194 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_PCI_DEVICE), gShellDebug1HiiHandle);\r
3195 break;\r
3196\r
3197 case PciP2pBridge:\r
3198 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_P2P_BRIDGE), gShellDebug1HiiHandle);\r
3199 break;\r
3200\r
3201 case PciCardBusBridge:\r
3202 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_CARDBUS_BRIDGE), gShellDebug1HiiHandle);\r
3203 break;\r
3204\r
3205 default:\r
3206 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RESERVED), gShellDebug1HiiHandle);\r
3207 HeaderType = PciUndefined;\r
3208 }\r
3209\r
3210 //\r
3211 // Print register Class Code\r
3212 //\r
3213 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_CLASS), gShellDebug1HiiHandle);\r
3214 PciPrintClassCode ((UINT8 *) Common->ClassCode, TRUE);\r
c37e0f16 3215 ShellPrintEx (-1, -1, L"\r\n");\r
5d73d92f 3216\r
3217 if (ShellGetExecutionBreakFlag()) {\r
3218 return EFI_SUCCESS;\r
3219 }\r
3220\r
3221 //\r
3222 // Interpret remaining part of PCI configuration header depending on\r
3223 // HeaderType\r
3224 //\r
3225 CapPtr = 0;\r
3226 Status = EFI_SUCCESS;\r
3227 switch (HeaderType) {\r
3228 case PciDevice:\r
3229 Status = PciExplainDeviceData (\r
3230 &(ConfigSpace->NonCommon.Device),\r
3231 Address,\r
3232 IoDev\r
3233 );\r
0c84a69f 3234 CapPtr = ConfigSpace->NonCommon.Device.CapabilityPtr;\r
5d73d92f 3235 break;\r
3236\r
3237 case PciP2pBridge:\r
3238 Status = PciExplainBridgeData (\r
3239 &(ConfigSpace->NonCommon.Bridge),\r
3240 Address,\r
3241 IoDev\r
3242 );\r
0c84a69f 3243 CapPtr = ConfigSpace->NonCommon.Bridge.CapabilityPtr;\r
5d73d92f 3244 break;\r
3245\r
3246 case PciCardBusBridge:\r
3247 Status = PciExplainCardBusData (\r
3248 &(ConfigSpace->NonCommon.CardBus),\r
3249 Address,\r
3250 IoDev\r
3251 );\r
0c84a69f 3252 CapPtr = ConfigSpace->NonCommon.CardBus.Cap_Ptr;\r
5d73d92f 3253 break;\r
d8f8021c 3254 case PciUndefined:\r
3255 default:\r
3256 break;\r
5d73d92f 3257 }\r
3258 //\r
3259 // If Status bit4 is 1, dump or explain capability structure\r
3260 //\r
3261 if ((Common->Status) & EFI_PCI_STATUS_CAPABILITY) {\r
705bffb5 3262 PciExplainCapabilityStruct (IoDev, Address, CapPtr, EnhancedDump);\r
5d73d92f 3263 }\r
3264\r
3265 return Status;\r
3266}\r
3267\r
a1d4bfcc 3268/**\r
3269 Explain the device specific part of data in PCI configuration space.\r
3270\r
3271 @param[in] Device Data in PCI configuration space.\r
3272 @param[in] Address Address used to access configuration space of this PCI device.\r
3273 @param[in] IoDev Handle used to access configuration space of PCI device.\r
3274\r
3275 @retval EFI_SUCCESS The command completed successfully.\r
3276**/\r
5d73d92f 3277EFI_STATUS\r
3278PciExplainDeviceData (\r
0c84a69f 3279 IN PCI_DEVICE_HEADER_TYPE_REGION *Device,\r
5d73d92f 3280 IN UINT64 Address,\r
3281 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
3282 )\r
5d73d92f 3283{\r
3284 UINTN Index;\r
3285 BOOLEAN BarExist;\r
3286 EFI_STATUS Status;\r
3287 UINTN BarCount;\r
3288\r
3289 //\r
3290 // Print Base Address Registers(Bar). When Bar = 0, this Bar does not\r
3291 // exist. If these no Bar for this function, print "none", otherwise\r
3292 // list detail information about this Bar.\r
3293 //\r
3294 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BASE_ADDR), gShellDebug1HiiHandle, INDEX_OF (Device->Bar));\r
3295\r
3296 BarExist = FALSE;\r
3297 BarCount = sizeof (Device->Bar) / sizeof (Device->Bar[0]);\r
3298 for (Index = 0; Index < BarCount; Index++) {\r
3299 if (Device->Bar[Index] == 0) {\r
3300 continue;\r
3301 }\r
3302\r
3303 if (!BarExist) {\r
3304 BarExist = TRUE;\r
3305 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_START_TYPE), gShellDebug1HiiHandle);\r
c37e0f16 3306 ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------");\r
5d73d92f 3307 }\r
3308\r
3309 Status = PciExplainBar (\r
3310 &(Device->Bar[Index]),\r
3311 &(mConfigSpace->Common.Command),\r
3312 Address,\r
3313 IoDev,\r
3314 &Index\r
3315 );\r
3316\r
3317 if (EFI_ERROR (Status)) {\r
3318 break;\r
3319 }\r
3320 }\r
3321\r
3322 if (!BarExist) {\r
3323 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle);\r
3324\r
3325 } else {\r
c37e0f16 3326 ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------");\r
5d73d92f 3327 }\r
3328\r
3329 //\r
3330 // Print register Expansion ROM Base Address\r
3331 //\r
0c84a69f
RN
3332 if ((Device->ExpansionRomBar & BIT0) == 0) {\r
3333 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_EXPANSION_ROM_DISABLED), gShellDebug1HiiHandle, INDEX_OF (&(Device->ExpansionRomBar)));\r
5d73d92f 3334\r
3335 } else {\r
3336 ShellPrintHiiEx(-1, -1, NULL,\r
3337 STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE),\r
3338 gShellDebug1HiiHandle,\r
0c84a69f
RN
3339 INDEX_OF (&(Device->ExpansionRomBar)),\r
3340 Device->ExpansionRomBar\r
5d73d92f 3341 );\r
3342 }\r
3343 //\r
3344 // Print register Cardbus CIS ptr\r
3345 //\r
3346 ShellPrintHiiEx(-1, -1, NULL,\r
3347 STRING_TOKEN (STR_PCI2_CARDBUS_CIS),\r
3348 gShellDebug1HiiHandle,\r
0c84a69f
RN
3349 INDEX_OF (&(Device->CISPtr)),\r
3350 Device->CISPtr\r
5d73d92f 3351 );\r
3352\r
3353 //\r
3354 // Print register Sub-vendor ID and subsystem ID\r
3355 //\r
3356 ShellPrintHiiEx(-1, -1, NULL,\r
3357 STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID),\r
3358 gShellDebug1HiiHandle,\r
0c84a69f
RN
3359 INDEX_OF (&(Device->SubsystemVendorID)),\r
3360 Device->SubsystemVendorID\r
5d73d92f 3361 );\r
3362\r
3363 ShellPrintHiiEx(-1, -1, NULL,\r
3364 STRING_TOKEN (STR_PCI2_SUBSYSTEM_ID),\r
3365 gShellDebug1HiiHandle,\r
0c84a69f
RN
3366 INDEX_OF (&(Device->SubsystemID)),\r
3367 Device->SubsystemID\r
5d73d92f 3368 );\r
3369\r
3370 //\r
3371 // Print register Capabilities Ptr\r
3372 //\r
3373 ShellPrintHiiEx(-1, -1, NULL,\r
3374 STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR),\r
3375 gShellDebug1HiiHandle,\r
0c84a69f
RN
3376 INDEX_OF (&(Device->CapabilityPtr)),\r
3377 Device->CapabilityPtr\r
5d73d92f 3378 );\r
3379\r
3380 //\r
3381 // Print register Interrupt Line and interrupt pin\r
3382 //\r
3383 ShellPrintHiiEx(-1, -1, NULL,\r
3384 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE),\r
3385 gShellDebug1HiiHandle,\r
3386 INDEX_OF (&(Device->InterruptLine)),\r
3387 Device->InterruptLine\r
3388 );\r
3389\r
3390 ShellPrintHiiEx(-1, -1, NULL,\r
3391 STRING_TOKEN (STR_PCI2_INTERRUPT_PIN),\r
3392 gShellDebug1HiiHandle,\r
3393 INDEX_OF (&(Device->InterruptPin)),\r
3394 Device->InterruptPin\r
3395 );\r
3396\r
3397 //\r
3398 // Print register Min_Gnt and Max_Lat\r
3399 //\r
3400 ShellPrintHiiEx(-1, -1, NULL,\r
3401 STRING_TOKEN (STR_PCI2_MIN_GNT),\r
3402 gShellDebug1HiiHandle,\r
3403 INDEX_OF (&(Device->MinGnt)),\r
3404 Device->MinGnt\r
3405 );\r
3406\r
3407 ShellPrintHiiEx(-1, -1, NULL,\r
3408 STRING_TOKEN (STR_PCI2_MAX_LAT),\r
3409 gShellDebug1HiiHandle,\r
3410 INDEX_OF (&(Device->MaxLat)),\r
3411 Device->MaxLat\r
3412 );\r
3413\r
3414 return EFI_SUCCESS;\r
3415}\r
3416\r
a1d4bfcc 3417/**\r
3418 Explain the bridge specific part of data in PCI configuration space.\r
3419\r
3420 @param[in] Bridge Bridge specific data region in PCI configuration space.\r
3421 @param[in] Address Address used to access configuration space of this PCI device.\r
3422 @param[in] IoDev Handle used to access configuration space of PCI device.\r
3423\r
3424 @retval EFI_SUCCESS The command completed successfully.\r
3425**/\r
5d73d92f 3426EFI_STATUS\r
3427PciExplainBridgeData (\r
0c84a69f 3428 IN PCI_BRIDGE_CONTROL_REGISTER *Bridge,\r
5d73d92f 3429 IN UINT64 Address,\r
3430 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
3431 )\r
5d73d92f 3432{\r
3433 UINTN Index;\r
3434 BOOLEAN BarExist;\r
3435 UINTN BarCount;\r
3436 UINT32 IoAddress32;\r
3437 EFI_STATUS Status;\r
3438\r
3439 //\r
3440 // Print Base Address Registers. When Bar = 0, this Bar does not\r
3441 // exist. If these no Bar for this function, print "none", otherwise\r
3442 // list detail information about this Bar.\r
3443 //\r
3444 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BASE_ADDRESS), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->Bar)));\r
3445\r
3446 BarExist = FALSE;\r
3447 BarCount = sizeof (Bridge->Bar) / sizeof (Bridge->Bar[0]);\r
3448\r
3449 for (Index = 0; Index < BarCount; Index++) {\r
3450 if (Bridge->Bar[Index] == 0) {\r
3451 continue;\r
3452 }\r
3453\r
3454 if (!BarExist) {\r
3455 BarExist = TRUE;\r
3456 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_START_TYPE_2), gShellDebug1HiiHandle);\r
c37e0f16 3457 ShellPrintEx (-1, -1, L" --------------------------------------------------------------------------");\r
5d73d92f 3458 }\r
3459\r
3460 Status = PciExplainBar (\r
3461 &(Bridge->Bar[Index]),\r
3462 &(mConfigSpace->Common.Command),\r
3463 Address,\r
3464 IoDev,\r
3465 &Index\r
3466 );\r
3467\r
3468 if (EFI_ERROR (Status)) {\r
3469 break;\r
3470 }\r
3471 }\r
3472\r
3473 if (!BarExist) {\r
3474 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NONE), gShellDebug1HiiHandle);\r
3475 } else {\r
c37e0f16 3476 ShellPrintEx (-1, -1, L"\r\n --------------------------------------------------------------------------");\r
5d73d92f 3477 }\r
3478\r
3479 //\r
3480 // Expansion register ROM Base Address\r
3481 //\r
0c84a69f
RN
3482 if ((Bridge->ExpansionRomBAR & BIT0) == 0) {\r
3483 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NO_EXPANSION_ROM), gShellDebug1HiiHandle, INDEX_OF (&(Bridge->ExpansionRomBAR)));\r
5d73d92f 3484\r
3485 } else {\r
3486 ShellPrintHiiEx(-1, -1, NULL,\r
3487 STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE_2),\r
3488 gShellDebug1HiiHandle,\r
0c84a69f
RN
3489 INDEX_OF (&(Bridge->ExpansionRomBAR)),\r
3490 Bridge->ExpansionRomBAR\r
5d73d92f 3491 );\r
3492 }\r
3493 //\r
3494 // Print Bus Numbers(Primary, Secondary, and Subordinate\r
3495 //\r
3496 ShellPrintHiiEx(-1, -1, NULL,\r
3497 STRING_TOKEN (STR_PCI2_BUS_NUMBERS),\r
3498 gShellDebug1HiiHandle,\r
3499 INDEX_OF (&(Bridge->PrimaryBus)),\r
3500 INDEX_OF (&(Bridge->SecondaryBus)),\r
3501 INDEX_OF (&(Bridge->SubordinateBus))\r
3502 );\r
3503\r
c37e0f16 3504 ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n");\r
5d73d92f 3505\r
3506 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->PrimaryBus);\r
3507 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SecondaryBus);\r
3508 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BRIDGE), gShellDebug1HiiHandle, Bridge->SubordinateBus);\r
3509\r
3510 //\r
3511 // Print register Secondary Latency Timer\r
3512 //\r
3513 ShellPrintHiiEx(-1, -1, NULL,\r
3514 STRING_TOKEN (STR_PCI2_SECONDARY_TIMER),\r
3515 gShellDebug1HiiHandle,\r
3516 INDEX_OF (&(Bridge->SecondaryLatencyTimer)),\r
3517 Bridge->SecondaryLatencyTimer\r
3518 );\r
3519\r
3520 //\r
3521 // Print register Secondary Status\r
3522 //\r
3523 PciExplainStatus (&(Bridge->SecondaryStatus), FALSE, PciP2pBridge);\r
3524\r
3525 //\r
3526 // Print I/O and memory ranges this bridge forwards. There are 3 resource\r
3527 // types: I/O, memory, and pre-fetchable memory. For each resource type,\r
3528 // base and limit address are listed.\r
3529 //\r
3530 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RESOURCE_TYPE), gShellDebug1HiiHandle);\r
c37e0f16 3531 ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n");\r
5d73d92f 3532\r
3533 //\r
3534 // IO Base & Limit\r
3535 //\r
0c84a69f 3536 IoAddress32 = (Bridge->IoBaseUpper16 << 16 | Bridge->IoBase << 8);\r
5d73d92f 3537 IoAddress32 &= 0xfffff000;\r
3538 ShellPrintHiiEx(-1, -1, NULL,\r
3539 STRING_TOKEN (STR_PCI2_TWO_VARS),\r
3540 gShellDebug1HiiHandle,\r
3541 INDEX_OF (&(Bridge->IoBase)),\r
3542 IoAddress32\r
3543 );\r
3544\r
0c84a69f 3545 IoAddress32 = (Bridge->IoLimitUpper16 << 16 | Bridge->IoLimit << 8);\r
5d73d92f 3546 IoAddress32 |= 0x00000fff;\r
3547 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_ONE_VAR), gShellDebug1HiiHandle, IoAddress32);\r
3548\r
3549 //\r
3550 // Memory Base & Limit\r
3551 //\r
3552 ShellPrintHiiEx(-1, -1, NULL,\r
3553 STRING_TOKEN (STR_PCI2_MEMORY),\r
3554 gShellDebug1HiiHandle,\r
3555 INDEX_OF (&(Bridge->MemoryBase)),\r
3556 (Bridge->MemoryBase << 16) & 0xfff00000\r
3557 );\r
3558\r
3559 ShellPrintHiiEx(-1, -1, NULL,\r
3560 STRING_TOKEN (STR_PCI2_ONE_VAR),\r
3561 gShellDebug1HiiHandle,\r
3562 (Bridge->MemoryLimit << 16) | 0x000fffff\r
3563 );\r
3564\r
3565 //\r
3566 // Pre-fetch-able Memory Base & Limit\r
3567 //\r
3568 ShellPrintHiiEx(-1, -1, NULL,\r
3569 STRING_TOKEN (STR_PCI2_PREFETCHABLE),\r
3570 gShellDebug1HiiHandle,\r
0c84a69f
RN
3571 INDEX_OF (&(Bridge->PrefetchableMemoryBase)),\r
3572 Bridge->PrefetchableBaseUpper32,\r
3573 (Bridge->PrefetchableMemoryBase << 16) & 0xfff00000\r
5d73d92f 3574 );\r
3575\r
3576 ShellPrintHiiEx(-1, -1, NULL,\r
3577 STRING_TOKEN (STR_PCI2_TWO_VARS_2),\r
3578 gShellDebug1HiiHandle,\r
0c84a69f
RN
3579 Bridge->PrefetchableLimitUpper32,\r
3580 (Bridge->PrefetchableMemoryLimit << 16) | 0x000fffff\r
5d73d92f 3581 );\r
3582\r
3583 //\r
3584 // Print register Capabilities Pointer\r
3585 //\r
3586 ShellPrintHiiEx(-1, -1, NULL,\r
3587 STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR_2),\r
3588 gShellDebug1HiiHandle,\r
0c84a69f
RN
3589 INDEX_OF (&(Bridge->CapabilityPtr)),\r
3590 Bridge->CapabilityPtr\r
5d73d92f 3591 );\r
3592\r
3593 //\r
3594 // Print register Bridge Control\r
3595 //\r
3596 PciExplainBridgeControl (&(Bridge->BridgeControl), PciP2pBridge);\r
3597\r
3598 //\r
3599 // Print register Interrupt Line & PIN\r
3600 //\r
3601 ShellPrintHiiEx(-1, -1, NULL,\r
3602 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_2),\r
3603 gShellDebug1HiiHandle,\r
3604 INDEX_OF (&(Bridge->InterruptLine)),\r
3605 Bridge->InterruptLine\r
3606 );\r
3607\r
3608 ShellPrintHiiEx(-1, -1, NULL,\r
3609 STRING_TOKEN (STR_PCI2_INTERRUPT_PIN),\r
3610 gShellDebug1HiiHandle,\r
3611 INDEX_OF (&(Bridge->InterruptPin)),\r
3612 Bridge->InterruptPin\r
3613 );\r
3614\r
3615 return EFI_SUCCESS;\r
3616}\r
3617\r
a1d4bfcc 3618/**\r
3619 Explain the Base Address Register(Bar) in PCI configuration space.\r
3620\r
4ff7e37b
ED
3621 @param[in] Bar Points to the Base Address Register intended to interpret.\r
3622 @param[in] Command Points to the register Command.\r
3623 @param[in] Address Address used to access configuration space of this PCI device.\r
3624 @param[in] IoDev Handle used to access configuration space of PCI device.\r
3625 @param[in, out] Index The Index.\r
a1d4bfcc 3626\r
3627 @retval EFI_SUCCESS The command completed successfully.\r
3628**/\r
5d73d92f 3629EFI_STATUS\r
3630PciExplainBar (\r
3631 IN UINT32 *Bar,\r
3632 IN UINT16 *Command,\r
3633 IN UINT64 Address,\r
3634 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
3635 IN OUT UINTN *Index\r
3636 )\r
5d73d92f 3637{\r
3638 UINT16 OldCommand;\r
3639 UINT16 NewCommand;\r
3640 UINT64 Bar64;\r
3641 UINT32 OldBar32;\r
3642 UINT32 NewBar32;\r
3643 UINT64 OldBar64;\r
3644 UINT64 NewBar64;\r
3645 BOOLEAN IsMem;\r
3646 BOOLEAN IsBar32;\r
3647 UINT64 RegAddress;\r
3648\r
3649 IsBar32 = TRUE;\r
3650 Bar64 = 0;\r
3651 NewBar32 = 0;\r
3652 NewBar64 = 0;\r
3653\r
3654 //\r
3655 // According the bar type, list detail about this bar, for example: 32 or\r
3656 // 64 bits; pre-fetchable or not.\r
3657 //\r
0c84a69f 3658 if ((*Bar & BIT0) == 0) {\r
5d73d92f 3659 //\r
3660 // This bar is of memory type\r
3661 //\r
3662 IsMem = TRUE;\r
3663\r
0c84a69f 3664 if ((*Bar & BIT1) == 0 && (*Bar & BIT2) == 0) {\r
5d73d92f 3665 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0);\r
3666 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle);\r
3667 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_32_BITS), gShellDebug1HiiHandle);\r
3668\r
0c84a69f 3669 } else if ((*Bar & BIT1) == 0 && (*Bar & BIT2) != 0) {\r
5d73d92f 3670 Bar64 = 0x0;\r
3671 CopyMem (&Bar64, Bar, sizeof (UINT64));\r
46cb4043 3672 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_ONE_VAR_2), gShellDebug1HiiHandle, (UINT32) RShiftU64 ((Bar64 & 0xfffffffffffffff0ULL), 32));\r
2b578de0 3673 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_ONE_VAR_3), gShellDebug1HiiHandle, (UINT32) (Bar64 & 0xfffffffffffffff0ULL));\r
5d73d92f 3674 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MEM), gShellDebug1HiiHandle);\r
3675 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_64_BITS), gShellDebug1HiiHandle);\r
3676 IsBar32 = FALSE;\r
3677 *Index += 1;\r
3678\r
3679 } else {\r
3680 //\r
3681 // Reserved\r
3682 //\r
3683 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_BAR), gShellDebug1HiiHandle, *Bar & 0xfffffff0);\r
3684 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MEM_2), gShellDebug1HiiHandle);\r
3685 }\r
3686\r
0c84a69f 3687 if ((*Bar & BIT3) == 0) {\r
5d73d92f 3688 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NO), gShellDebug1HiiHandle);\r
3689\r
3690 } else {\r
3691 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_YES), gShellDebug1HiiHandle);\r
3692 }\r
3693\r
3694 } else {\r
3695 //\r
3696 // This bar is of io type\r
3697 //\r
3698 IsMem = FALSE;\r
3699 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_ONE_VAR_4), gShellDebug1HiiHandle, *Bar & 0xfffffffc);\r
c37e0f16 3700 ShellPrintEx (-1, -1, L"I/O ");\r
5d73d92f 3701 }\r
3702\r
3703 //\r
3704 // Get BAR length(or the amount of resource this bar demands for). To get\r
3705 // Bar length, first we should temporarily disable I/O and memory access\r
3706 // of this function(by set bits in the register Command), then write all\r
3707 // "1"s to this bar. The bar value read back is the amount of resource\r
3708 // this bar demands for.\r
3709 //\r
3710 //\r
3711 // Disable io & mem access\r
3712 //\r
3713 OldCommand = *Command;\r
3714 NewCommand = (UINT16) (OldCommand & 0xfffc);\r
3715 RegAddress = Address | INDEX_OF (Command);\r
3716 IoDev->Pci.Write (IoDev, EfiPciWidthUint16, RegAddress, 1, &NewCommand);\r
3717\r
3718 RegAddress = Address | INDEX_OF (Bar);\r
3719\r
3720 //\r
3721 // Read after write the BAR to get the size\r
3722 //\r
3723 if (IsBar32) {\r
3724 OldBar32 = *Bar;\r
3725 NewBar32 = 0xffffffff;\r
3726\r
3727 IoDev->Pci.Write (IoDev, EfiPciWidthUint32, RegAddress, 1, &NewBar32);\r
3728 IoDev->Pci.Read (IoDev, EfiPciWidthUint32, RegAddress, 1, &NewBar32);\r
3729 IoDev->Pci.Write (IoDev, EfiPciWidthUint32, RegAddress, 1, &OldBar32);\r
3730\r
3731 if (IsMem) {\r
3732 NewBar32 = NewBar32 & 0xfffffff0;\r
3733 NewBar32 = (~NewBar32) + 1;\r
3734\r
3735 } else {\r
3736 NewBar32 = NewBar32 & 0xfffffffc;\r
3737 NewBar32 = (~NewBar32) + 1;\r
3738 NewBar32 = NewBar32 & 0x0000ffff;\r
3739 }\r
3740 } else {\r
3741\r
3742 OldBar64 = 0x0;\r
3743 CopyMem (&OldBar64, Bar, sizeof (UINT64));\r
2b578de0 3744 NewBar64 = 0xffffffffffffffffULL;\r
5d73d92f 3745\r
3746 IoDev->Pci.Write (IoDev, EfiPciWidthUint32, RegAddress, 2, &NewBar64);\r
3747 IoDev->Pci.Read (IoDev, EfiPciWidthUint32, RegAddress, 2, &NewBar64);\r
3748 IoDev->Pci.Write (IoDev, EfiPciWidthUint32, RegAddress, 2, &OldBar64);\r
3749\r
3750 if (IsMem) {\r
2b578de0 3751 NewBar64 = NewBar64 & 0xfffffffffffffff0ULL;\r
5d73d92f 3752 NewBar64 = (~NewBar64) + 1;\r
3753\r
3754 } else {\r
2b578de0 3755 NewBar64 = NewBar64 & 0xfffffffffffffffcULL;\r
5d73d92f 3756 NewBar64 = (~NewBar64) + 1;\r
3757 NewBar64 = NewBar64 & 0x000000000000ffff;\r
3758 }\r
3759 }\r
3760 //\r
3761 // Enable io & mem access\r
3762 //\r
3763 RegAddress = Address | INDEX_OF (Command);\r
3764 IoDev->Pci.Write (IoDev, EfiPciWidthUint16, RegAddress, 1, &OldCommand);\r
3765\r
3766 if (IsMem) {\r
3767 if (IsBar32) {\r
3768 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NEWBAR_32), gShellDebug1HiiHandle, NewBar32);\r
3769 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NEWBAR_32_2), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffff0) - 1);\r
3770\r
3771 } else {\r
46cb4043 3772 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32) RShiftU64 (NewBar64, 32));\r
5d73d92f 3773 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32) NewBar64);\r
c37e0f16 3774 ShellPrintEx (-1, -1, L" ");\r
5d73d92f 3775 ShellPrintHiiEx(-1, -1, NULL,\r
3776 STRING_TOKEN (STR_PCI2_RSHIFT),\r
3777 gShellDebug1HiiHandle,\r
46cb4043 3778 (UINT32) RShiftU64 ((NewBar64 + (Bar64 & 0xfffffffffffffff0ULL) - 1), 32)\r
5d73d92f 3779 );\r
2b578de0 3780 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RSHIFT), gShellDebug1HiiHandle, (UINT32) (NewBar64 + (Bar64 & 0xfffffffffffffff0ULL) - 1));\r
5d73d92f 3781\r
3782 }\r
3783 } else {\r
3784 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NEWBAR_32_3), gShellDebug1HiiHandle, NewBar32);\r
3785 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NEWBAR_32_4), gShellDebug1HiiHandle, NewBar32 + (*Bar & 0xfffffffc) - 1);\r
3786 }\r
3787\r
3788 return EFI_SUCCESS;\r
3789}\r
3790\r
a1d4bfcc 3791/**\r
3792 Explain the cardbus specific part of data in PCI configuration space.\r
3793\r
3794 @param[in] CardBus CardBus specific region of PCI configuration space.\r
3795 @param[in] Address Address used to access configuration space of this PCI device.\r
3796 @param[in] IoDev Handle used to access configuration space of PCI device.\r
3797\r
3798 @retval EFI_SUCCESS The command completed successfully.\r
3799**/\r
5d73d92f 3800EFI_STATUS\r
3801PciExplainCardBusData (\r
0c84a69f 3802 IN PCI_CARDBUS_CONTROL_REGISTER *CardBus,\r
5d73d92f 3803 IN UINT64 Address,\r
3804 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev\r
3805 )\r
5d73d92f 3806{\r
3807 BOOLEAN Io32Bit;\r
3808 PCI_CARDBUS_DATA *CardBusData;\r
3809\r
3810 ShellPrintHiiEx(-1, -1, NULL,\r
3811 STRING_TOKEN (STR_PCI2_CARDBUS_SOCKET),\r
3812 gShellDebug1HiiHandle,\r
3813 INDEX_OF (&(CardBus->CardBusSocketReg)),\r
3814 CardBus->CardBusSocketReg\r
3815 );\r
3816\r
3817 //\r
3818 // Print Secondary Status\r
3819 //\r
3820 PciExplainStatus (&(CardBus->SecondaryStatus), FALSE, PciCardBusBridge);\r
3821\r
3822 //\r
3823 // Print Bus Numbers(Primary bus number, CardBus bus number, and\r
3824 // Subordinate bus number\r
3825 //\r
3826 ShellPrintHiiEx(-1, -1, NULL,\r
3827 STRING_TOKEN (STR_PCI2_BUS_NUMBERS_2),\r
3828 gShellDebug1HiiHandle,\r
3829 INDEX_OF (&(CardBus->PciBusNumber)),\r
3830 INDEX_OF (&(CardBus->CardBusBusNumber)),\r
3831 INDEX_OF (&(CardBus->SubordinateBusNumber))\r
3832 );\r
3833\r
c37e0f16 3834 ShellPrintEx (-1, -1, L" ------------------------------------------------------\r\n");\r
5d73d92f 3835\r
3836 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_CARDBUS), gShellDebug1HiiHandle, CardBus->PciBusNumber);\r
3837 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_CARDBUS_2), gShellDebug1HiiHandle, CardBus->CardBusBusNumber);\r
3838 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_CARDBUS_3), gShellDebug1HiiHandle, CardBus->SubordinateBusNumber);\r
3839\r
3840 //\r
3841 // Print CardBus Latency Timer\r
3842 //\r
3843 ShellPrintHiiEx(-1, -1, NULL,\r
3844 STRING_TOKEN (STR_PCI2_CARDBUS_LATENCY),\r
3845 gShellDebug1HiiHandle,\r
3846 INDEX_OF (&(CardBus->CardBusLatencyTimer)),\r
3847 CardBus->CardBusLatencyTimer\r
3848 );\r
3849\r
3850 //\r
3851 // Print Memory/Io ranges this cardbus bridge forwards\r
3852 //\r
3853 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RESOURCE_TYPE_2), gShellDebug1HiiHandle);\r
c37e0f16 3854 ShellPrintEx (-1, -1, L"----------------------------------------------------------------------\r\n");\r
5d73d92f 3855\r
3856 ShellPrintHiiEx(-1, -1, NULL,\r
3857 STRING_TOKEN (STR_PCI2_MEM_3),\r
3858 gShellDebug1HiiHandle,\r
3859 INDEX_OF (&(CardBus->MemoryBase0)),\r
0c84a69f 3860 CardBus->BridgeControl & BIT8 ? L" Prefetchable" : L"Non-Prefetchable",\r
5d73d92f 3861 CardBus->MemoryBase0 & 0xfffff000,\r
3862 CardBus->MemoryLimit0 | 0x00000fff\r
3863 );\r
3864\r
3865 ShellPrintHiiEx(-1, -1, NULL,\r
3866 STRING_TOKEN (STR_PCI2_MEM_3),\r
3867 gShellDebug1HiiHandle,\r
3868 INDEX_OF (&(CardBus->MemoryBase1)),\r
0c84a69f 3869 CardBus->BridgeControl & BIT9 ? L" Prefetchable" : L"Non-Prefetchable",\r
5d73d92f 3870 CardBus->MemoryBase1 & 0xfffff000,\r
3871 CardBus->MemoryLimit1 | 0x00000fff\r
3872 );\r
3873\r
0c84a69f 3874 Io32Bit = (BOOLEAN) (CardBus->IoBase0 & BIT0);\r
5d73d92f 3875 ShellPrintHiiEx(-1, -1, NULL,\r
3876 STRING_TOKEN (STR_PCI2_IO_2),\r
3877 gShellDebug1HiiHandle,\r
3878 INDEX_OF (&(CardBus->IoBase0)),\r
3879 Io32Bit ? L" 32 bit" : L" 16 bit",\r
3880 CardBus->IoBase0 & (Io32Bit ? 0xfffffffc : 0x0000fffc),\r
d8f8021c 3881 (CardBus->IoLimit0 & (Io32Bit ? 0xffffffff : 0x0000ffff)) | 0x00000003\r
5d73d92f 3882 );\r
3883\r
0c84a69f 3884 Io32Bit = (BOOLEAN) (CardBus->IoBase1 & BIT0);\r
5d73d92f 3885 ShellPrintHiiEx(-1, -1, NULL,\r
3886 STRING_TOKEN (STR_PCI2_IO_2),\r
3887 gShellDebug1HiiHandle,\r
3888 INDEX_OF (&(CardBus->IoBase1)),\r
3889 Io32Bit ? L" 32 bit" : L" 16 bit",\r
3890 CardBus->IoBase1 & (Io32Bit ? 0xfffffffc : 0x0000fffc),\r
d8f8021c 3891 (CardBus->IoLimit1 & (Io32Bit ? 0xffffffff : 0x0000ffff)) | 0x00000003\r
5d73d92f 3892 );\r
3893\r
3894 //\r
3895 // Print register Interrupt Line & PIN\r
3896 //\r
3897 ShellPrintHiiEx(-1, -1, NULL,\r
3898 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_3),\r
3899 gShellDebug1HiiHandle,\r
3900 INDEX_OF (&(CardBus->InterruptLine)),\r
3901 CardBus->InterruptLine,\r
3902 INDEX_OF (&(CardBus->InterruptPin)),\r
3903 CardBus->InterruptPin\r
3904 );\r
3905\r
3906 //\r
3907 // Print register Bridge Control\r
3908 //\r
3909 PciExplainBridgeControl (&(CardBus->BridgeControl), PciCardBusBridge);\r
3910\r
3911 //\r
3912 // Print some registers in data region of PCI configuration space for cardbus\r
3913 // bridge. Fields include: Sub VendorId, Subsystem ID, and Legacy Mode Base\r
3914 // Address.\r
3915 //\r
0c84a69f 3916 CardBusData = (PCI_CARDBUS_DATA *) ((UINT8 *) CardBus + sizeof (PCI_CARDBUS_CONTROL_REGISTER));\r
5d73d92f 3917\r
3918 ShellPrintHiiEx(-1, -1, NULL,\r
3919 STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID_2),\r
3920 gShellDebug1HiiHandle,\r
3921 INDEX_OF (&(CardBusData->SubVendorId)),\r
3922 CardBusData->SubVendorId,\r
3923 INDEX_OF (&(CardBusData->SubSystemId)),\r
3924 CardBusData->SubSystemId\r
3925 );\r
3926\r
3927 ShellPrintHiiEx(-1, -1, NULL,\r
3928 STRING_TOKEN (STR_PCI2_OPTIONAL),\r
3929 gShellDebug1HiiHandle,\r
3930 INDEX_OF (&(CardBusData->LegacyBase)),\r
3931 CardBusData->LegacyBase\r
3932 );\r
3933\r
3934 return EFI_SUCCESS;\r
3935}\r
3936\r
a1d4bfcc 3937/**\r
3938 Explain each meaningful bit of register Status. The definition of Status is\r
3939 slightly different depending on the PCI header type.\r
3940\r
3941 @param[in] Status Points to the content of register Status.\r
3942 @param[in] MainStatus Indicates if this register is main status(not secondary\r
3943 status).\r
3944 @param[in] HeaderType Header type of this PCI device.\r
3945\r
3946 @retval EFI_SUCCESS The command completed successfully.\r
3947**/\r
5d73d92f 3948EFI_STATUS\r
3949PciExplainStatus (\r
3950 IN UINT16 *Status,\r
3951 IN BOOLEAN MainStatus,\r
3952 IN PCI_HEADER_TYPE HeaderType\r
3953 )\r
5d73d92f 3954{\r
3955 if (MainStatus) {\r
3956 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status);\r
3957\r
3958 } else {\r
3959 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_SECONDARY_STATUS), gShellDebug1HiiHandle, INDEX_OF (Status), *Status);\r
3960 }\r
3961\r
0c84a69f 3962 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_NEW_CAPABILITIES), gShellDebug1HiiHandle, (*Status & BIT4) != 0);\r
5d73d92f 3963\r
3964 //\r
3965 // Bit 5 is meaningless for CardBus Bridge\r
3966 //\r
3967 if (HeaderType == PciCardBusBridge) {\r
0c84a69f 3968 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_66_CAPABLE), gShellDebug1HiiHandle, (*Status & BIT5) != 0);\r
5d73d92f 3969\r
3970 } else {\r
0c84a69f 3971 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_66_CAPABLE_2), gShellDebug1HiiHandle, (*Status & BIT5) != 0);\r
5d73d92f 3972 }\r
3973\r
0c84a69f 3974 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_FAST_BACK), gShellDebug1HiiHandle, (*Status & BIT7) != 0);\r
5d73d92f 3975\r
0c84a69f 3976 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MASTER_DATA), gShellDebug1HiiHandle, (*Status & BIT8) != 0);\r
5d73d92f 3977 //\r
3978 // Bit 9 and bit 10 together decides the DEVSEL timing\r
3979 //\r
3980 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_DEVSEL_TIMING), gShellDebug1HiiHandle);\r
0c84a69f 3981 if ((*Status & BIT9) == 0 && (*Status & BIT10) == 0) {\r
5d73d92f 3982 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_FAST), gShellDebug1HiiHandle);\r
3983\r
0c84a69f 3984 } else if ((*Status & BIT9) != 0 && (*Status & BIT10) == 0) {\r
5d73d92f 3985 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_MEDIUM), gShellDebug1HiiHandle);\r
3986\r
0c84a69f 3987 } else if ((*Status & BIT9) == 0 && (*Status & BIT10) != 0) {\r
5d73d92f 3988 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_SLOW), gShellDebug1HiiHandle);\r
3989\r
3990 } else {\r
3991 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_RESERVED_2), gShellDebug1HiiHandle);\r
3992 }\r
3993\r
3994 ShellPrintHiiEx(-1, -1, NULL,\r
3995 STRING_TOKEN (STR_PCI2_SIGNALED_TARGET),\r
3996 gShellDebug1HiiHandle,\r
0c84a69f 3997 (*Status & BIT11) != 0\r
5d73d92f 3998 );\r
3999\r
4000 ShellPrintHiiEx(-1, -1, NULL,\r
4001 STRING_TOKEN (STR_PCI2_RECEIVED_TARGET),\r
4002 gShellDebug1HiiHandle,\r
0c84a69f 4003 (*Status & BIT12) != 0\r
5d73d92f 4004 );\r
4005\r
4006 ShellPrintHiiEx(-1, -1, NULL,\r
4007 STRING_TOKEN (STR_PCI2_RECEIVED_MASTER),\r
4008 gShellDebug1HiiHandle,\r
0c84a69f 4009 (*Status & BIT13) != 0\r
5d73d92f 4010 );\r
4011\r
4012 if (MainStatus) {\r
4013 ShellPrintHiiEx(-1, -1, NULL,\r
4014 STRING_TOKEN (STR_PCI2_SIGNALED_ERROR),\r
4015 gShellDebug1HiiHandle,\r
0c84a69f 4016 (*Status & BIT14) != 0\r
5d73d92f 4017 );\r
4018\r
4019 } else {\r
4020 ShellPrintHiiEx(-1, -1, NULL,\r
4021 STRING_TOKEN (STR_PCI2_RECEIVED_ERROR),\r
4022 gShellDebug1HiiHandle,\r
0c84a69f 4023 (*Status & BIT14) != 0\r
5d73d92f 4024 );\r
4025 }\r
4026\r
4027 ShellPrintHiiEx(-1, -1, NULL,\r
4028 STRING_TOKEN (STR_PCI2_DETECTED_ERROR),\r
4029 gShellDebug1HiiHandle,\r
0c84a69f 4030 (*Status & BIT15) != 0\r
5d73d92f 4031 );\r
4032\r
4033 return EFI_SUCCESS;\r
4034}\r
4035\r
a1d4bfcc 4036/**\r
5d73d92f 4037 Explain each meaningful bit of register Command.\r
4038\r
a1d4bfcc 4039 @param[in] Command Points to the content of register Command.\r
5d73d92f 4040\r
a1d4bfcc 4041 @retval EFI_SUCCESS The command completed successfully.\r
5d73d92f 4042**/\r
a1d4bfcc 4043EFI_STATUS\r
4044PciExplainCommand (\r
4045 IN UINT16 *Command\r
4046 )\r
5d73d92f 4047{\r
4048 //\r
4049 // Print the binary value of register Command\r
4050 //\r
4051 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_PCI2_COMMAND), gShellDebug1HiiHandle, INDEX_OF (Command), *Command);\r
4052\r
4053 //\r
4054 // Explain register Command bit by bit\r
4055 //\r
4056 ShellPrintHiiEx(-1, -1, NULL,\r
4057 STRING_TOKEN (STR_PCI2_SPACE_ACCESS_DENIED),\r
4058 gShellDebug1HiiHandle,\r
0c84a69f 4059 (*Command & BIT0) != 0\r
5d73d92f 4060 );\r
4061\r
4062 ShellPrintHiiEx(-1, -1, NULL,\r
4063 STRING_TOKEN (STR_PCI2_MEMORY_SPACE),\r
4064 gShellDebug1HiiHandle,\r
0c84a69f 4065 (*Command & BIT1) != 0\r
5d73d92f 4066 );\r
4067\r
4068 ShellPrintHiiEx(-1, -1, NULL,\r
4069 STRING_TOKEN (STR_PCI2_BEHAVE_BUS_MASTER),\r
4070 gShellDebug1HiiHandle,\r
0c84a69f 4071 (*Command & BIT2) != 0\r
5d73d92f 4072 );\r
4073\r
4074 ShellPrintHiiEx(-1, -1, NULL,\r
4075 STRING_TOKEN (STR_PCI2_MONITOR_SPECIAL_CYCLE),\r
4076 gShellDebug1HiiHandle,\r
0c84a69f 4077 (*Command & BIT3) != 0\r
5d73d92f 4078 );\r
4079\r
4080 ShellPrintHiiEx(-1, -1, NULL,\r
4081 STRING_TOKEN (STR_PCI2_MEM_WRITE_INVALIDATE),\r
4082 gShellDebug1HiiHandle,\r
0c84a69f 4083 (*Command & BIT4) != 0\r
5d73d92f 4084 );\r
4085\r
4086 ShellPrintHiiEx(-1, -1, NULL,\r
4087 STRING_TOKEN (STR_PCI2_PALETTE_SNOOPING),\r
4088 gShellDebug1HiiHandle,\r
0c84a69f 4089 (*Command & BIT5) != 0\r
5d73d92f 4090 );\r
4091\r
4092 ShellPrintHiiEx(-1, -1, NULL,\r
4093 STRING_TOKEN (STR_PCI2_ASSERT_PERR),\r
4094 gShellDebug1HiiHandle,\r
0c84a69f 4095 (*Command & BIT6) != 0\r
5d73d92f 4096 );\r
4097\r
4098 ShellPrintHiiEx(-1, -1, NULL,\r
4099 STRING_TOKEN (STR_PCI2_DO_ADDR_STEPPING),\r
4100 gShellDebug1HiiHandle,\r
0c84a69f 4101 (*Command & BIT7) != 0\r
5d73d92f 4102 );\r
4103\r
4104 ShellPrintHiiEx(-1, -1, NULL,\r
4105 STRING_TOKEN (STR_PCI2_SERR_DRIVER),\r
4106 gShellDebug1HiiHandle,\r
0c84a69f 4107 (*Command & BIT8) != 0\r
5d73d92f 4108 );\r
4109\r
4110 ShellPrintHiiEx(-1, -1, NULL,\r
4111 STRING_TOKEN (STR_PCI2_FAST_BACK_2),\r
4112 gShellDebug1HiiHandle,\r
0c84a69f 4113 (*Command & BIT9) != 0\r
5d73d92f 4114 );\r
4115\r
4116 return EFI_SUCCESS;\r
4117}\r
4118\r
a1d4bfcc 4119/**\r
4120 Explain each meaningful bit of register Bridge Control.\r
4121\r
4122 @param[in] BridgeControl Points to the content of register Bridge Control.\r
4123 @param[in] HeaderType The headertype.\r
4124\r
4125 @retval EFI_SUCCESS The command completed successfully.\r
4126**/\r
5d73d92f 4127EFI_STATUS\r
4128PciExplainBridgeControl (\r
4129 IN UINT16 *BridgeControl,\r
4130 IN PCI_HEADER_TYPE HeaderType\r
4131 )\r
5d73d92f 4132{\r
4133 ShellPrintHiiEx(-1, -1, NULL,\r
4134 STRING_TOKEN (STR_PCI2_BRIDGE_CONTROL),\r
4135 gShellDebug1HiiHandle,\r
4136 INDEX_OF (BridgeControl),\r
4137 *BridgeControl\r
4138 );\r
4139\r
4140 ShellPrintHiiEx(-1, -1, NULL,\r
4141 STRING_TOKEN (STR_PCI2_PARITY_ERROR),\r
4142 gShellDebug1HiiHandle,\r
0c84a69f 4143 (*BridgeControl & BIT0) != 0\r
5d73d92f 4144 );\r
4145 ShellPrintHiiEx(-1, -1, NULL,\r
4146 STRING_TOKEN (STR_PCI2_SERR_ENABLE),\r
4147 gShellDebug1HiiHandle,\r
0c84a69f 4148 (*BridgeControl & BIT1) != 0\r
5d73d92f 4149 );\r
4150 ShellPrintHiiEx(-1, -1, NULL,\r
4151 STRING_TOKEN (STR_PCI2_ISA_ENABLE),\r
4152 gShellDebug1HiiHandle,\r
0c84a69f 4153 (*BridgeControl & BIT2) != 0\r
5d73d92f 4154 );\r
4155 ShellPrintHiiEx(-1, -1, NULL,\r
4156 STRING_TOKEN (STR_PCI2_VGA_ENABLE),\r
4157 gShellDebug1HiiHandle,\r
0c84a69f 4158 (*BridgeControl & BIT3) != 0\r
5d73d92f 4159 );\r
4160 ShellPrintHiiEx(-1, -1, NULL,\r
4161 STRING_TOKEN (STR_PCI2_MASTER_ABORT),\r
4162 gShellDebug1HiiHandle,\r
0c84a69f 4163 (*BridgeControl & BIT5) != 0\r
5d73d92f 4164 );\r
4165\r
4166 //\r
4167 // Register Bridge Control has some slight differences between P2P bridge\r
4168 // and Cardbus bridge from bit 6 to bit 11.\r
4169 //\r
4170 if (HeaderType == PciP2pBridge) {\r
4171 ShellPrintHiiEx(-1, -1, NULL,\r
4172 STRING_TOKEN (STR_PCI2_SECONDARY_BUS_RESET),\r
4173 gShellDebug1HiiHandle,\r
0c84a69f 4174 (*BridgeControl & BIT6) != 0\r
5d73d92f 4175 );\r
4176 ShellPrintHiiEx(-1, -1, NULL,\r
4177 STRING_TOKEN (STR_PCI2_FAST_ENABLE),\r
4178 gShellDebug1HiiHandle,\r
0c84a69f 4179 (*BridgeControl & BIT7) != 0\r
5d73d92f 4180 );\r
4181 ShellPrintHiiEx(-1, -1, NULL,\r
4182 STRING_TOKEN (STR_PCI2_PRIMARY_DISCARD_TIMER),\r
4183 gShellDebug1HiiHandle,\r
0c84a69f 4184 (*BridgeControl & BIT8)!=0 ? L"2^10" : L"2^15"\r
5d73d92f 4185 );\r
4186 ShellPrintHiiEx(-1, -1, NULL,\r
4187 STRING_TOKEN (STR_PCI2_SECONDARY_DISCARD_TIMER),\r
4188 gShellDebug1HiiHandle,\r
0c84a69f 4189 (*BridgeControl & BIT9)!=0 ? L"2^10" : L"2^15"\r
5d73d92f 4190 );\r
4191 ShellPrintHiiEx(-1, -1, NULL,\r
4192 STRING_TOKEN (STR_PCI2_DISCARD_TIMER_STATUS),\r
4193 gShellDebug1HiiHandle,\r
0c84a69f 4194 (*BridgeControl & BIT10) != 0\r
5d73d92f 4195 );\r
4196 ShellPrintHiiEx(-1, -1, NULL,\r
4197 STRING_TOKEN (STR_PCI2_DISCARD_TIMER_SERR),\r
4198 gShellDebug1HiiHandle,\r
0c84a69f 4199 (*BridgeControl & BIT11) != 0\r
5d73d92f 4200 );\r
4201\r
4202 } else {\r
4203 ShellPrintHiiEx(-1, -1, NULL,\r
4204 STRING_TOKEN (STR_PCI2_CARDBUS_RESET),\r
4205 gShellDebug1HiiHandle,\r
0c84a69f 4206 (*BridgeControl & BIT6) != 0\r
5d73d92f 4207 );\r
4208 ShellPrintHiiEx(-1, -1, NULL,\r
4209 STRING_TOKEN (STR_PCI2_IREQ_ENABLE),\r
4210 gShellDebug1HiiHandle,\r
0c84a69f 4211 (*BridgeControl & BIT7) != 0\r
5d73d92f 4212 );\r
4213 ShellPrintHiiEx(-1, -1, NULL,\r
4214 STRING_TOKEN (STR_PCI2_WRITE_POSTING_ENABLE),\r
4215 gShellDebug1HiiHandle,\r
0c84a69f 4216 (*BridgeControl & BIT10) != 0\r
5d73d92f 4217 );\r
4218 }\r
4219\r
4220 return EFI_SUCCESS;\r
4221}\r
4222\r
a1d4bfcc 4223/**\r
4224 Print each capability structure.\r
4225\r
f614ce7e
SQ
4226 @param[in] IoDev The pointer to the deivce.\r
4227 @param[in] Address The address to start at.\r
4228 @param[in] CapPtr The offset from the address.\r
4229 @param[in] EnhancedDump The print format for the dump data.\r
a1d4bfcc 4230\r
4231 @retval EFI_SUCCESS The operation was successful.\r
4232**/\r
5d73d92f 4233EFI_STATUS\r
4234PciExplainCapabilityStruct (\r
4235 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
4236 IN UINT64 Address,\r
705bffb5
JC
4237 IN UINT8 CapPtr,\r
4238 IN CONST UINT16 EnhancedDump\r
5d73d92f 4239 )\r
4240{\r
4241 UINT8 CapabilityPtr;\r
4242 UINT16 CapabilityEntry;\r
4243 UINT8 CapabilityID;\r
4244 UINT64 RegAddress;\r
4245\r
4246 CapabilityPtr = CapPtr;\r
4247\r
4248 //\r
4249 // Go through the Capability list\r
4250 //\r
4251 while ((CapabilityPtr >= 0x40) && ((CapabilityPtr & 0x03) == 0x00)) {\r
4252 RegAddress = Address + CapabilityPtr;\r
4253 IoDev->Pci.Read (IoDev, EfiPciWidthUint16, RegAddress, 1, &CapabilityEntry);\r
4254\r
4255 CapabilityID = (UINT8) CapabilityEntry;\r
4256\r
4257 //\r
4258 // Explain PciExpress data\r
4259 //\r
4260 if (EFI_PCI_CAPABILITY_ID_PCIEXP == CapabilityID) {\r
705bffb5 4261 PciExplainPciExpress (IoDev, Address, CapabilityPtr, EnhancedDump);\r
5d73d92f 4262 return EFI_SUCCESS;\r
4263 }\r
4264 //\r
4265 // Explain other capabilities here\r
4266 //\r
4267 CapabilityPtr = (UINT8) (CapabilityEntry >> 8);\r
4268 }\r
4269\r
4270 return EFI_SUCCESS;\r
4271}\r
4272\r
a1d4bfcc 4273/**\r
4274 Print out information of the capability information.\r
4275\r
4276 @param[in] PciExpressCap The pointer to the structure about the device.\r
4277\r
4278 @retval EFI_SUCCESS The operation was successful.\r
4279**/\r
5d73d92f 4280EFI_STATUS\r
4281ExplainPcieCapReg (\r
0c84a69f 4282 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4283 )\r
5d73d92f 4284{\r
5d73d92f 4285 CHAR16 *DevicePortType;\r
4286\r
c37e0f16
CP
4287 ShellPrintEx (-1, -1,\r
4288 L" Capability Version(3:0): %E0x%04x%N\r\n",\r
0c84a69f 4289 PciExpressCap->Capability.Bits.Version\r
5d73d92f 4290 );\r
0c84a69f
RN
4291 if (PciExpressCap->Capability.Bits.DevicePortType < ARRAY_SIZE (DevicePortTypeTable)) {\r
4292 DevicePortType = DevicePortTypeTable[PciExpressCap->Capability.Bits.DevicePortType];\r
5d73d92f 4293 } else {\r
4294 DevicePortType = L"Unknown Type";\r
4295 }\r
c37e0f16
CP
4296 ShellPrintEx (-1, -1,\r
4297 L" Device/PortType(7:4): %E%s%N\r\n",\r
5d73d92f 4298 DevicePortType\r
4299 );\r
4300 //\r
4301 // 'Slot Implemented' is only valid for:\r
4302 // a) Root Port of PCI Express Root Complex, or\r
4303 // b) Downstream Port of PCI Express Switch\r
4304 //\r
0c84a69f
RN
4305 if (PciExpressCap->Capability.Bits.DevicePortType== PCIE_DEVICE_PORT_TYPE_ROOT_PORT ||\r
4306 PciExpressCap->Capability.Bits.DevicePortType == PCIE_DEVICE_PORT_TYPE_DOWNSTREAM_PORT) {\r
c37e0f16
CP
4307 ShellPrintEx (-1, -1,\r
4308 L" Slot Implemented(8): %E%d%N\r\n",\r
0c84a69f 4309 PciExpressCap->Capability.Bits.SlotImplemented\r
5d73d92f 4310 );\r
4311 }\r
c37e0f16
CP
4312 ShellPrintEx (-1, -1,\r
4313 L" Interrupt Message Number(13:9): %E0x%05x%N\r\n",\r
0c84a69f 4314 PciExpressCap->Capability.Bits.InterruptMessageNumber\r
5d73d92f 4315 );\r
4316 return EFI_SUCCESS;\r
4317}\r
4318\r
a1d4bfcc 4319/**\r
4320 Print out information of the device capability information.\r
4321\r
4322 @param[in] PciExpressCap The pointer to the structure about the device.\r
4323\r
4324 @retval EFI_SUCCESS The operation was successful.\r
4325**/\r
5d73d92f 4326EFI_STATUS\r
4327ExplainPcieDeviceCap (\r
0c84a69f 4328 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4329 )\r
5d73d92f 4330{\r
5d73d92f 4331 UINT8 DevicePortType;\r
4332 UINT8 L0sLatency;\r
4333 UINT8 L1Latency;\r
4334\r
0c84a69f 4335 DevicePortType = (UINT8)PciExpressCap->Capability.Bits.DevicePortType;\r
c37e0f16 4336 ShellPrintEx (-1, -1, L" Max_Payload_Size Supported(2:0): ");\r
0c84a69f
RN
4337 if (PciExpressCap->DeviceCapability.Bits.MaxPayloadSize < 6) {\r
4338 ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceCapability.Bits.MaxPayloadSize + 7));\r
5d73d92f 4339 } else {\r
c37e0f16 4340 ShellPrintEx (-1, -1, L"%EUnknown%N\r\n");\r
5d73d92f 4341 }\r
c37e0f16
CP
4342 ShellPrintEx (-1, -1,\r
4343 L" Phantom Functions Supported(4:3): %E%d%N\r\n",\r
0c84a69f 4344 PciExpressCap->DeviceCapability.Bits.PhantomFunctions\r
5d73d92f 4345 );\r
c37e0f16
CP
4346 ShellPrintEx (-1, -1,\r
4347 L" Extended Tag Field Supported(5): %E%d-bit Tag field supported%N\r\n",\r
0c84a69f 4348 PciExpressCap->DeviceCapability.Bits.ExtendedTagField ? 8 : 5\r
5d73d92f 4349 );\r
4350 //\r
4351 // Endpoint L0s and L1 Acceptable Latency is only valid for Endpoint\r
4352 //\r
4353 if (IS_PCIE_ENDPOINT (DevicePortType)) {\r
0c84a69f
RN
4354 L0sLatency = (UINT8)PciExpressCap->DeviceCapability.Bits.EndpointL0sAcceptableLatency;\r
4355 L1Latency = (UINT8)PciExpressCap->DeviceCapability.Bits.EndpointL1AcceptableLatency;\r
c37e0f16 4356 ShellPrintEx (-1, -1, L" Endpoint L0s Acceptable Latency(8:6): ");\r
5d73d92f 4357 if (L0sLatency < 4) {\r
c37e0f16 4358 ShellPrintEx (-1, -1, L"%EMaximum of %d ns%N\r\n", 1 << (L0sLatency + 6));\r
5d73d92f 4359 } else {\r
4360 if (L0sLatency < 7) {\r
c37e0f16 4361 ShellPrintEx (-1, -1, L"%EMaximum of %d us%N\r\n", 1 << (L0sLatency - 3));\r
5d73d92f 4362 } else {\r
c37e0f16 4363 ShellPrintEx (-1, -1, L"%ENo limit%N\r\n");\r
5d73d92f 4364 }\r
4365 }\r
c37e0f16 4366 ShellPrintEx (-1, -1, L" Endpoint L1 Acceptable Latency(11:9): ");\r
5d73d92f 4367 if (L1Latency < 7) {\r
c37e0f16 4368 ShellPrintEx (-1, -1, L"%EMaximum of %d us%N\r\n", 1 << (L1Latency + 1));\r
5d73d92f 4369 } else {\r
c37e0f16 4370 ShellPrintEx (-1, -1, L"%ENo limit%N\r\n");\r
5d73d92f 4371 }\r
4372 }\r
c37e0f16
CP
4373 ShellPrintEx (-1, -1,\r
4374 L" Role-based Error Reporting(15): %E%d%N\r\n",\r
0c84a69f 4375 PciExpressCap->DeviceCapability.Bits.RoleBasedErrorReporting\r
5d73d92f 4376 );\r
4377 //\r
4378 // Only valid for Upstream Port:\r
4379 // a) Captured Slot Power Limit Value\r
4380 // b) Captured Slot Power Scale\r
4381 //\r
0c84a69f 4382 if (DevicePortType == PCIE_DEVICE_PORT_TYPE_UPSTREAM_PORT) {\r
c37e0f16
CP
4383 ShellPrintEx (-1, -1,\r
4384 L" Captured Slot Power Limit Value(25:18): %E0x%02x%N\r\n",\r
0c84a69f 4385 PciExpressCap->DeviceCapability.Bits.CapturedSlotPowerLimitValue\r
5d73d92f 4386 );\r
c37e0f16
CP
4387 ShellPrintEx (-1, -1,\r
4388 L" Captured Slot Power Limit Scale(27:26): %E%s%N\r\n",\r
0c84a69f 4389 SlotPwrLmtScaleTable[PciExpressCap->DeviceCapability.Bits.CapturedSlotPowerLimitScale]\r
5d73d92f 4390 );\r
4391 }\r
4392 //\r
4393 // Function Level Reset Capability is only valid for Endpoint\r
4394 //\r
4395 if (IS_PCIE_ENDPOINT (DevicePortType)) {\r
c37e0f16
CP
4396 ShellPrintEx (-1, -1,\r
4397 L" Function Level Reset Capability(28): %E%d%N\r\n",\r
0c84a69f 4398 PciExpressCap->DeviceCapability.Bits.FunctionLevelReset\r
5d73d92f 4399 );\r
4400 }\r
4401 return EFI_SUCCESS;\r
4402}\r
4403\r
a1d4bfcc 4404/**\r
4405 Print out information of the device control information.\r
4406\r
4407 @param[in] PciExpressCap The pointer to the structure about the device.\r
4408\r
4409 @retval EFI_SUCCESS The operation was successful.\r
4410**/\r
5d73d92f 4411EFI_STATUS\r
4412ExplainPcieDeviceControl (\r
0c84a69f 4413 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4414 )\r
5d73d92f 4415{\r
c37e0f16
CP
4416 ShellPrintEx (-1, -1,\r
4417 L" Correctable Error Reporting Enable(0): %E%d%N\r\n",\r
0c84a69f
RN
4418 PciExpressCap->DeviceControl.Bits.CorrectableError\r
4419 );\r
c37e0f16
CP
4420 ShellPrintEx (-1, -1,\r
4421 L" Non-Fatal Error Reporting Enable(1): %E%d%N\r\n",\r
0c84a69f 4422 PciExpressCap->DeviceControl.Bits.NonFatalError\r
5d73d92f 4423 );\r
c37e0f16
CP
4424 ShellPrintEx (-1, -1,\r
4425 L" Fatal Error Reporting Enable(2): %E%d%N\r\n",\r
0c84a69f 4426 PciExpressCap->DeviceControl.Bits.FatalError\r
5d73d92f 4427 );\r
c37e0f16
CP
4428 ShellPrintEx (-1, -1,\r
4429 L" Unsupported Request Reporting Enable(3): %E%d%N\r\n",\r
0c84a69f 4430 PciExpressCap->DeviceControl.Bits.UnsupportedRequest\r
5d73d92f 4431 );\r
c37e0f16
CP
4432 ShellPrintEx (-1, -1,\r
4433 L" Enable Relaxed Ordering(4): %E%d%N\r\n",\r
0c84a69f 4434 PciExpressCap->DeviceControl.Bits.RelaxedOrdering\r
5d73d92f 4435 );\r
c37e0f16 4436 ShellPrintEx (-1, -1, L" Max_Payload_Size(7:5): ");\r
0c84a69f
RN
4437 if (PciExpressCap->DeviceControl.Bits.MaxPayloadSize < 6) {\r
4438 ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxPayloadSize + 7));\r
5d73d92f 4439 } else {\r
c37e0f16 4440 ShellPrintEx (-1, -1, L"%EUnknown%N\r\n");\r
5d73d92f 4441 }\r
c37e0f16
CP
4442 ShellPrintEx (-1, -1,\r
4443 L" Extended Tag Field Enable(8): %E%d%N\r\n",\r
0c84a69f 4444 PciExpressCap->DeviceControl.Bits.ExtendedTagField\r
5d73d92f 4445 );\r
c37e0f16
CP
4446 ShellPrintEx (-1, -1,\r
4447 L" Phantom Functions Enable(9): %E%d%N\r\n",\r
0c84a69f 4448 PciExpressCap->DeviceControl.Bits.PhantomFunctions\r
5d73d92f 4449 );\r
c37e0f16
CP
4450 ShellPrintEx (-1, -1,\r
4451 L" Auxiliary (AUX) Power PM Enable(10): %E%d%N\r\n",\r
0c84a69f 4452 PciExpressCap->DeviceControl.Bits.AuxPower\r
5d73d92f 4453 );\r
c37e0f16
CP
4454 ShellPrintEx (-1, -1,\r
4455 L" Enable No Snoop(11): %E%d%N\r\n",\r
0c84a69f 4456 PciExpressCap->DeviceControl.Bits.NoSnoop\r
5d73d92f 4457 );\r
c37e0f16 4458 ShellPrintEx (-1, -1, L" Max_Read_Request_Size(14:12): ");\r
0c84a69f
RN
4459 if (PciExpressCap->DeviceControl.Bits.MaxReadRequestSize < 6) {\r
4460 ShellPrintEx (-1, -1, L"%E%d bytes%N\r\n", 1 << (PciExpressCap->DeviceControl.Bits.MaxReadRequestSize + 7));\r
5d73d92f 4461 } else {\r
c37e0f16 4462 ShellPrintEx (-1, -1, L"%EUnknown%N\r\n");\r
5d73d92f 4463 }\r
4464 //\r
4465 // Read operation is only valid for PCI Express to PCI/PCI-X Bridges\r
4466 //\r
0c84a69f 4467 if (PciExpressCap->Capability.Bits.DevicePortType == PCIE_DEVICE_PORT_TYPE_PCIE_TO_PCI_BRIDGE) {\r
c37e0f16
CP
4468 ShellPrintEx (-1, -1,\r
4469 L" Bridge Configuration Retry Enable(15): %E%d%N\r\n",\r
0c84a69f 4470 PciExpressCap->DeviceControl.Bits.BridgeConfigurationRetryOrFunctionLevelReset\r
5d73d92f 4471 );\r
4472 }\r
4473 return EFI_SUCCESS;\r
4474}\r
4475\r
a1d4bfcc 4476/**\r
4477 Print out information of the device status information.\r
4478\r
4479 @param[in] PciExpressCap The pointer to the structure about the device.\r
4480\r
4481 @retval EFI_SUCCESS The operation was successful.\r
4482**/\r
5d73d92f 4483EFI_STATUS\r
4484ExplainPcieDeviceStatus (\r
0c84a69f 4485 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4486 )\r
5d73d92f 4487{\r
c37e0f16
CP
4488 ShellPrintEx (-1, -1,\r
4489 L" Correctable Error Detected(0): %E%d%N\r\n",\r
0c84a69f 4490 PciExpressCap->DeviceStatus.Bits.CorrectableError\r
5d73d92f 4491 );\r
c37e0f16
CP
4492 ShellPrintEx (-1, -1,\r
4493 L" Non-Fatal Error Detected(1): %E%d%N\r\n",\r
0c84a69f 4494 PciExpressCap->DeviceStatus.Bits.NonFatalError\r
5d73d92f 4495 );\r
c37e0f16
CP
4496 ShellPrintEx (-1, -1,\r
4497 L" Fatal Error Detected(2): %E%d%N\r\n",\r
0c84a69f 4498 PciExpressCap->DeviceStatus.Bits.FatalError\r
5d73d92f 4499 );\r
c37e0f16
CP
4500 ShellPrintEx (-1, -1,\r
4501 L" Unsupported Request Detected(3): %E%d%N\r\n",\r
0c84a69f 4502 PciExpressCap->DeviceStatus.Bits.UnsupportedRequest\r
5d73d92f 4503 );\r
c37e0f16
CP
4504 ShellPrintEx (-1, -1,\r
4505 L" AUX Power Detected(4): %E%d%N\r\n",\r
0c84a69f 4506 PciExpressCap->DeviceStatus.Bits.AuxPower\r
5d73d92f 4507 );\r
c37e0f16
CP
4508 ShellPrintEx (-1, -1,\r
4509 L" Transactions Pending(5): %E%d%N\r\n",\r
0c84a69f 4510 PciExpressCap->DeviceStatus.Bits.TransactionsPending\r
5d73d92f 4511 );\r
4512 return EFI_SUCCESS;\r
4513}\r
4514\r
a1d4bfcc 4515/**\r
4516 Print out information of the device link information.\r
4517\r
4518 @param[in] PciExpressCap The pointer to the structure about the device.\r
4519\r
4520 @retval EFI_SUCCESS The operation was successful.\r
4521**/\r
5d73d92f 4522EFI_STATUS\r
4523ExplainPcieLinkCap (\r
0c84a69f 4524 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4525 )\r
5d73d92f 4526{\r
541ddf44 4527 CHAR16 *MaxLinkSpeed;\r
a1d4bfcc 4528 CHAR16 *AspmValue;\r
5d73d92f 4529\r
0c84a69f 4530 switch (PciExpressCap->LinkCapability.Bits.MaxLinkSpeed) {\r
5d73d92f 4531 case 1:\r
541ddf44 4532 MaxLinkSpeed = L"2.5 GT/s";\r
5d73d92f 4533 break;\r
4534 case 2:\r
541ddf44
CP
4535 MaxLinkSpeed = L"5.0 GT/s";\r
4536 break;\r
4537 case 3:\r
4538 MaxLinkSpeed = L"8.0 GT/s";\r
5d73d92f 4539 break;\r
4540 default:\r
541ddf44 4541 MaxLinkSpeed = L"Unknown";\r
5d73d92f 4542 break;\r
4543 }\r
c37e0f16 4544 ShellPrintEx (-1, -1,\r
541ddf44
CP
4545 L" Maximum Link Speed(3:0): %E%s%N\r\n",\r
4546 MaxLinkSpeed\r
5d73d92f 4547 );\r
c37e0f16
CP
4548 ShellPrintEx (-1, -1,\r
4549 L" Maximum Link Width(9:4): %Ex%d%N\r\n",\r
0c84a69f 4550 PciExpressCap->LinkCapability.Bits.MaxLinkWidth\r
5d73d92f 4551 );\r
0c84a69f 4552 switch (PciExpressCap->LinkCapability.Bits.Aspm) {\r
541ddf44
CP
4553 case 0:\r
4554 AspmValue = L"Not";\r
4555 break;\r
5d73d92f 4556 case 1:\r
541ddf44
CP
4557 AspmValue = L"L0s";\r
4558 break;\r
4559 case 2:\r
4560 AspmValue = L"L1";\r
5d73d92f 4561 break;\r
4562 case 3:\r
a1d4bfcc 4563 AspmValue = L"L0s and L1";\r
5d73d92f 4564 break;\r
4565 default:\r
a1d4bfcc 4566 AspmValue = L"Reserved";\r
5d73d92f 4567 break;\r
4568 }\r
c37e0f16
CP
4569 ShellPrintEx (-1, -1,\r
4570 L" Active State Power Management Support(11:10): %E%s Supported%N\r\n",\r
a1d4bfcc 4571 AspmValue\r
5d73d92f 4572 );\r
c37e0f16
CP
4573 ShellPrintEx (-1, -1,\r
4574 L" L0s Exit Latency(14:12): %E%s%N\r\n",\r
0c84a69f 4575 L0sLatencyStrTable[PciExpressCap->LinkCapability.Bits.L0sExitLatency]\r
5d73d92f 4576 );\r
c37e0f16
CP
4577 ShellPrintEx (-1, -1,\r
4578 L" L1 Exit Latency(17:15): %E%s%N\r\n",\r
0c84a69f 4579 L1LatencyStrTable[PciExpressCap->LinkCapability.Bits.L1ExitLatency]\r
5d73d92f 4580 );\r
c37e0f16
CP
4581 ShellPrintEx (-1, -1,\r
4582 L" Clock Power Management(18): %E%d%N\r\n",\r
0c84a69f 4583 PciExpressCap->LinkCapability.Bits.ClockPowerManagement\r
5d73d92f 4584 );\r
c37e0f16
CP
4585 ShellPrintEx (-1, -1,\r
4586 L" Surprise Down Error Reporting Capable(19): %E%d%N\r\n",\r
0c84a69f 4587 PciExpressCap->LinkCapability.Bits.SurpriseDownError\r
5d73d92f 4588 );\r
c37e0f16
CP
4589 ShellPrintEx (-1, -1,\r
4590 L" Data Link Layer Link Active Reporting Capable(20): %E%d%N\r\n",\r
0c84a69f 4591 PciExpressCap->LinkCapability.Bits.DataLinkLayerLinkActive\r
5d73d92f 4592 );\r
c37e0f16
CP
4593 ShellPrintEx (-1, -1,\r
4594 L" Link Bandwidth Notification Capability(21): %E%d%N\r\n",\r
0c84a69f 4595 PciExpressCap->LinkCapability.Bits.LinkBandwidthNotification\r
5d73d92f 4596 );\r
c37e0f16
CP
4597 ShellPrintEx (-1, -1,\r
4598 L" Port Number(31:24): %E0x%02x%N\r\n",\r
0c84a69f 4599 PciExpressCap->LinkCapability.Bits.PortNumber\r
5d73d92f 4600 );\r
4601 return EFI_SUCCESS;\r
4602}\r
4603\r
a1d4bfcc 4604/**\r
4605 Print out information of the device link control information.\r
4606\r
4607 @param[in] PciExpressCap The pointer to the structure about the device.\r
4608\r
4609 @retval EFI_SUCCESS The operation was successful.\r
4610**/\r
5d73d92f 4611EFI_STATUS\r
4612ExplainPcieLinkControl (\r
0c84a69f 4613 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4614 )\r
5d73d92f 4615{\r
5d73d92f 4616 UINT8 DevicePortType;\r
4617\r
0c84a69f 4618 DevicePortType = (UINT8)PciExpressCap->Capability.Bits.DevicePortType;\r
c37e0f16
CP
4619 ShellPrintEx (-1, -1,\r
4620 L" Active State Power Management Control(1:0): %E%s%N\r\n",\r
0c84a69f 4621 ASPMCtrlStrTable[PciExpressCap->LinkControl.Bits.AspmControl]\r
5d73d92f 4622 );\r
4623 //\r
4624 // RCB is not applicable to switches\r
4625 //\r
4626 if (!IS_PCIE_SWITCH(DevicePortType)) {\r
c37e0f16
CP
4627 ShellPrintEx (-1, -1,\r
4628 L" Read Completion Boundary (RCB)(3): %E%d byte%N\r\n",\r
0c84a69f 4629 1 << (PciExpressCap->LinkControl.Bits.ReadCompletionBoundary + 6)\r
5d73d92f 4630 );\r
4631 }\r
4632 //\r
4633 // Link Disable is reserved on\r
4634 // a) Endpoints\r
4635 // b) PCI Express to PCI/PCI-X bridges\r
4636 // c) Upstream Ports of Switches\r
4637 //\r
4638 if (!IS_PCIE_ENDPOINT (DevicePortType) &&\r
0c84a69f
RN
4639 DevicePortType != PCIE_DEVICE_PORT_TYPE_UPSTREAM_PORT &&\r
4640 DevicePortType != PCIE_DEVICE_PORT_TYPE_PCIE_TO_PCI_BRIDGE) {\r
c37e0f16
CP
4641 ShellPrintEx (-1, -1,\r
4642 L" Link Disable(4): %E%d%N\r\n",\r
0c84a69f 4643 PciExpressCap->LinkControl.Bits.LinkDisable\r
5d73d92f 4644 );\r
4645 }\r
c37e0f16
CP
4646 ShellPrintEx (-1, -1,\r
4647 L" Common Clock Configuration(6): %E%d%N\r\n",\r
0c84a69f 4648 PciExpressCap->LinkControl.Bits.CommonClockConfiguration\r
5d73d92f 4649 );\r
c37e0f16
CP
4650 ShellPrintEx (-1, -1,\r
4651 L" Extended Synch(7): %E%d%N\r\n",\r
0c84a69f 4652 PciExpressCap->LinkControl.Bits.ExtendedSynch\r
5d73d92f 4653 );\r
c37e0f16
CP
4654 ShellPrintEx (-1, -1,\r
4655 L" Enable Clock Power Management(8): %E%d%N\r\n",\r
0c84a69f 4656 PciExpressCap->LinkControl.Bits.ClockPowerManagement\r
5d73d92f 4657 );\r
c37e0f16
CP
4658 ShellPrintEx (-1, -1,\r
4659 L" Hardware Autonomous Width Disable(9): %E%d%N\r\n",\r
0c84a69f 4660 PciExpressCap->LinkControl.Bits.HardwareAutonomousWidthDisable\r
5d73d92f 4661 );\r
c37e0f16
CP
4662 ShellPrintEx (-1, -1,\r
4663 L" Link Bandwidth Management Interrupt Enable(10): %E%d%N\r\n",\r
0c84a69f 4664 PciExpressCap->LinkControl.Bits.LinkBandwidthManagementInterrupt\r
5d73d92f 4665 );\r
c37e0f16
CP
4666 ShellPrintEx (-1, -1,\r
4667 L" Link Autonomous Bandwidth Interrupt Enable(11): %E%d%N\r\n",\r
0c84a69f 4668 PciExpressCap->LinkControl.Bits.LinkAutonomousBandwidthInterrupt\r
5d73d92f 4669 );\r
4670 return EFI_SUCCESS;\r
4671}\r
4672\r
a1d4bfcc 4673/**\r
4674 Print out information of the device link status information.\r
4675\r
4676 @param[in] PciExpressCap The pointer to the structure about the device.\r
4677\r
4678 @retval EFI_SUCCESS The operation was successful.\r
4679**/\r
5d73d92f 4680EFI_STATUS\r
4681ExplainPcieLinkStatus (\r
0c84a69f 4682 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4683 )\r
5d73d92f 4684{\r
541ddf44 4685 CHAR16 *CurLinkSpeed;\r
5d73d92f 4686\r
0c84a69f 4687 switch (PciExpressCap->LinkStatus.Bits.CurrentLinkSpeed) {\r
5d73d92f 4688 case 1:\r
541ddf44 4689 CurLinkSpeed = L"2.5 GT/s";\r
5d73d92f 4690 break;\r
4691 case 2:\r
541ddf44
CP
4692 CurLinkSpeed = L"5.0 GT/s";\r
4693 break;\r
4694 case 3:\r
4695 CurLinkSpeed = L"8.0 GT/s";\r
5d73d92f 4696 break;\r
4697 default:\r
541ddf44 4698 CurLinkSpeed = L"Reserved";\r
5d73d92f 4699 break;\r
4700 }\r
c37e0f16
CP
4701 ShellPrintEx (-1, -1,\r
4702 L" Current Link Speed(3:0): %E%s%N\r\n",\r
541ddf44 4703 CurLinkSpeed\r
5d73d92f 4704 );\r
c37e0f16
CP
4705 ShellPrintEx (-1, -1,\r
4706 L" Negotiated Link Width(9:4): %Ex%d%N\r\n",\r
0c84a69f 4707 PciExpressCap->LinkStatus.Bits.NegotiatedLinkWidth\r
5d73d92f 4708 );\r
c37e0f16
CP
4709 ShellPrintEx (-1, -1,\r
4710 L" Link Training(11): %E%d%N\r\n",\r
0c84a69f 4711 PciExpressCap->LinkStatus.Bits.LinkTraining\r
5d73d92f 4712 );\r
c37e0f16
CP
4713 ShellPrintEx (-1, -1,\r
4714 L" Slot Clock Configuration(12): %E%d%N\r\n",\r
0c84a69f 4715 PciExpressCap->LinkStatus.Bits.SlotClockConfiguration\r
5d73d92f 4716 );\r
c37e0f16
CP
4717 ShellPrintEx (-1, -1,\r
4718 L" Data Link Layer Link Active(13): %E%d%N\r\n",\r
0c84a69f 4719 PciExpressCap->LinkStatus.Bits.DataLinkLayerLinkActive\r
5d73d92f 4720 );\r
c37e0f16
CP
4721 ShellPrintEx (-1, -1,\r
4722 L" Link Bandwidth Management Status(14): %E%d%N\r\n",\r
0c84a69f 4723 PciExpressCap->LinkStatus.Bits.LinkBandwidthManagement\r
5d73d92f 4724 );\r
c37e0f16
CP
4725 ShellPrintEx (-1, -1,\r
4726 L" Link Autonomous Bandwidth Status(15): %E%d%N\r\n",\r
0c84a69f 4727 PciExpressCap->LinkStatus.Bits.LinkAutonomousBandwidth\r
5d73d92f 4728 );\r
4729 return EFI_SUCCESS;\r
4730}\r
4731\r
a1d4bfcc 4732/**\r
4733 Print out information of the device slot information.\r
4734\r
4735 @param[in] PciExpressCap The pointer to the structure about the device.\r
4736\r
4737 @retval EFI_SUCCESS The operation was successful.\r
4738**/\r
5d73d92f 4739EFI_STATUS\r
4740ExplainPcieSlotCap (\r
0c84a69f 4741 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4742 )\r
5d73d92f 4743{\r
c37e0f16
CP
4744 ShellPrintEx (-1, -1,\r
4745 L" Attention Button Present(0): %E%d%N\r\n",\r
0c84a69f 4746 PciExpressCap->SlotCapability.Bits.AttentionButton\r
5d73d92f 4747 );\r
c37e0f16
CP
4748 ShellPrintEx (-1, -1,\r
4749 L" Power Controller Present(1): %E%d%N\r\n",\r
0c84a69f 4750 PciExpressCap->SlotCapability.Bits.PowerController\r
5d73d92f 4751 );\r
c37e0f16
CP
4752 ShellPrintEx (-1, -1,\r
4753 L" MRL Sensor Present(2): %E%d%N\r\n",\r
0c84a69f 4754 PciExpressCap->SlotCapability.Bits.MrlSensor\r
5d73d92f 4755 );\r
c37e0f16
CP
4756 ShellPrintEx (-1, -1,\r
4757 L" Attention Indicator Present(3): %E%d%N\r\n",\r
0c84a69f 4758 PciExpressCap->SlotCapability.Bits.AttentionIndicator\r
5d73d92f 4759 );\r
c37e0f16
CP
4760 ShellPrintEx (-1, -1,\r
4761 L" Power Indicator Present(4): %E%d%N\r\n",\r
0c84a69f 4762 PciExpressCap->SlotCapability.Bits.PowerIndicator\r
5d73d92f 4763 );\r
c37e0f16
CP
4764 ShellPrintEx (-1, -1,\r
4765 L" Hot-Plug Surprise(5): %E%d%N\r\n",\r
0c84a69f 4766 PciExpressCap->SlotCapability.Bits.HotPlugSurprise\r
5d73d92f 4767 );\r
c37e0f16
CP
4768 ShellPrintEx (-1, -1,\r
4769 L" Hot-Plug Capable(6): %E%d%N\r\n",\r
0c84a69f 4770 PciExpressCap->SlotCapability.Bits.HotPlugCapable\r
5d73d92f 4771 );\r
c37e0f16
CP
4772 ShellPrintEx (-1, -1,\r
4773 L" Slot Power Limit Value(14:7): %E0x%02x%N\r\n",\r
0c84a69f 4774 PciExpressCap->SlotCapability.Bits.SlotPowerLimitValue\r
5d73d92f 4775 );\r
c37e0f16
CP
4776 ShellPrintEx (-1, -1,\r
4777 L" Slot Power Limit Scale(16:15): %E%s%N\r\n",\r
0c84a69f 4778 SlotPwrLmtScaleTable[PciExpressCap->SlotCapability.Bits.SlotPowerLimitScale]\r
5d73d92f 4779 );\r
c37e0f16
CP
4780 ShellPrintEx (-1, -1,\r
4781 L" Electromechanical Interlock Present(17): %E%d%N\r\n",\r
0c84a69f 4782 PciExpressCap->SlotCapability.Bits.ElectromechanicalInterlock\r
5d73d92f 4783 );\r
c37e0f16
CP
4784 ShellPrintEx (-1, -1,\r
4785 L" No Command Completed Support(18): %E%d%N\r\n",\r
0c84a69f 4786 PciExpressCap->SlotCapability.Bits.NoCommandCompleted\r
5d73d92f 4787 );\r
c37e0f16
CP
4788 ShellPrintEx (-1, -1,\r
4789 L" Physical Slot Number(31:19): %E%d%N\r\n",\r
0c84a69f 4790 PciExpressCap->SlotCapability.Bits.PhysicalSlotNumber\r
5d73d92f 4791 );\r
4792\r
4793 return EFI_SUCCESS;\r
4794}\r
4795\r
a1d4bfcc 4796/**\r
4797 Print out information of the device slot control information.\r
4798\r
4799 @param[in] PciExpressCap The pointer to the structure about the device.\r
4800\r
4801 @retval EFI_SUCCESS The operation was successful.\r
4802**/\r
5d73d92f 4803EFI_STATUS\r
4804ExplainPcieSlotControl (\r
0c84a69f 4805 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4806 )\r
5d73d92f 4807{\r
c37e0f16
CP
4808 ShellPrintEx (-1, -1,\r
4809 L" Attention Button Pressed Enable(0): %E%d%N\r\n",\r
0c84a69f 4810 PciExpressCap->SlotControl.Bits.AttentionButtonPressed\r
5d73d92f 4811 );\r
c37e0f16
CP
4812 ShellPrintEx (-1, -1,\r
4813 L" Power Fault Detected Enable(1): %E%d%N\r\n",\r
0c84a69f 4814 PciExpressCap->SlotControl.Bits.PowerFaultDetected\r
5d73d92f 4815 );\r
c37e0f16
CP
4816 ShellPrintEx (-1, -1,\r
4817 L" MRL Sensor Changed Enable(2): %E%d%N\r\n",\r
0c84a69f 4818 PciExpressCap->SlotControl.Bits.MrlSensorChanged\r
5d73d92f 4819 );\r
c37e0f16
CP
4820 ShellPrintEx (-1, -1,\r
4821 L" Presence Detect Changed Enable(3): %E%d%N\r\n",\r
0c84a69f 4822 PciExpressCap->SlotControl.Bits.PresenceDetectChanged\r
5d73d92f 4823 );\r
c37e0f16
CP
4824 ShellPrintEx (-1, -1,\r
4825 L" Command Completed Interrupt Enable(4): %E%d%N\r\n",\r
0c84a69f 4826 PciExpressCap->SlotControl.Bits.CommandCompletedInterrupt\r
5d73d92f 4827 );\r
c37e0f16
CP
4828 ShellPrintEx (-1, -1,\r
4829 L" Hot-Plug Interrupt Enable(5): %E%d%N\r\n",\r
0c84a69f 4830 PciExpressCap->SlotControl.Bits.HotPlugInterrupt\r
5d73d92f 4831 );\r
c37e0f16
CP
4832 ShellPrintEx (-1, -1,\r
4833 L" Attention Indicator Control(7:6): %E%s%N\r\n",\r
0c84a69f
RN
4834 IndicatorTable[\r
4835 PciExpressCap->SlotControl.Bits.AttentionIndicator]\r
5d73d92f 4836 );\r
c37e0f16
CP
4837 ShellPrintEx (-1, -1,\r
4838 L" Power Indicator Control(9:8): %E%s%N\r\n",\r
0c84a69f 4839 IndicatorTable[PciExpressCap->SlotControl.Bits.PowerIndicator]\r
5d73d92f 4840 );\r
c37e0f16 4841 ShellPrintEx (-1, -1, L" Power Controller Control(10): %EPower ");\r
0c84a69f
RN
4842 if (\r
4843 PciExpressCap->SlotControl.Bits.PowerController) {\r
c37e0f16 4844 ShellPrintEx (-1, -1, L"Off%N\r\n");\r
5d73d92f 4845 } else {\r
c37e0f16 4846 ShellPrintEx (-1, -1, L"On%N\r\n");\r
5d73d92f 4847 }\r
c37e0f16
CP
4848 ShellPrintEx (-1, -1,\r
4849 L" Electromechanical Interlock Control(11): %E%d%N\r\n",\r
0c84a69f 4850 PciExpressCap->SlotControl.Bits.ElectromechanicalInterlock\r
5d73d92f 4851 );\r
c37e0f16
CP
4852 ShellPrintEx (-1, -1,\r
4853 L" Data Link Layer State Changed Enable(12): %E%d%N\r\n",\r
0c84a69f 4854 PciExpressCap->SlotControl.Bits.DataLinkLayerStateChanged\r
5d73d92f 4855 );\r
4856 return EFI_SUCCESS;\r
4857}\r
4858\r
a1d4bfcc 4859/**\r
4860 Print out information of the device slot status information.\r
4861\r
4862 @param[in] PciExpressCap The pointer to the structure about the device.\r
4863\r
4864 @retval EFI_SUCCESS The operation was successful.\r
4865**/\r
5d73d92f 4866EFI_STATUS\r
4867ExplainPcieSlotStatus (\r
0c84a69f 4868 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4869 )\r
5d73d92f 4870{\r
c37e0f16
CP
4871 ShellPrintEx (-1, -1,\r
4872 L" Attention Button Pressed(0): %E%d%N\r\n",\r
0c84a69f 4873 PciExpressCap->SlotStatus.Bits.AttentionButtonPressed\r
5d73d92f 4874 );\r
c37e0f16
CP
4875 ShellPrintEx (-1, -1,\r
4876 L" Power Fault Detected(1): %E%d%N\r\n",\r
0c84a69f 4877 PciExpressCap->SlotStatus.Bits.PowerFaultDetected\r
5d73d92f 4878 );\r
c37e0f16
CP
4879 ShellPrintEx (-1, -1,\r
4880 L" MRL Sensor Changed(2): %E%d%N\r\n",\r
0c84a69f 4881 PciExpressCap->SlotStatus.Bits.MrlSensorChanged\r
5d73d92f 4882 );\r
c37e0f16
CP
4883 ShellPrintEx (-1, -1,\r
4884 L" Presence Detect Changed(3): %E%d%N\r\n",\r
0c84a69f 4885 PciExpressCap->SlotStatus.Bits.PresenceDetectChanged\r
5d73d92f 4886 );\r
c37e0f16
CP
4887 ShellPrintEx (-1, -1,\r
4888 L" Command Completed(4): %E%d%N\r\n",\r
0c84a69f 4889 PciExpressCap->SlotStatus.Bits.CommandCompleted\r
5d73d92f 4890 );\r
c37e0f16 4891 ShellPrintEx (-1, -1, L" MRL Sensor State(5): %EMRL ");\r
0c84a69f
RN
4892 if (\r
4893 PciExpressCap->SlotStatus.Bits.MrlSensor) {\r
c37e0f16 4894 ShellPrintEx (-1, -1, L" Opened%N\r\n");\r
5d73d92f 4895 } else {\r
c37e0f16 4896 ShellPrintEx (-1, -1, L" Closed%N\r\n");\r
5d73d92f 4897 }\r
c37e0f16 4898 ShellPrintEx (-1, -1, L" Presence Detect State(6): ");\r
0c84a69f
RN
4899 if (\r
4900 PciExpressCap->SlotStatus.Bits.PresenceDetect) {\r
c37e0f16 4901 ShellPrintEx (-1, -1, L"%ECard Present in slot%N\r\n");\r
5d73d92f 4902 } else {\r
c37e0f16 4903 ShellPrintEx (-1, -1, L"%ESlot Empty%N\r\n");\r
5d73d92f 4904 }\r
c37e0f16 4905 ShellPrintEx (-1, -1, L" Electromechanical Interlock Status(7): %EElectromechanical Interlock ");\r
0c84a69f
RN
4906 if (\r
4907 PciExpressCap->SlotStatus.Bits.ElectromechanicalInterlock) {\r
c37e0f16 4908 ShellPrintEx (-1, -1, L"Engaged%N\r\n");\r
5d73d92f 4909 } else {\r
c37e0f16 4910 ShellPrintEx (-1, -1, L"Disengaged%N\r\n");\r
5d73d92f 4911 }\r
c37e0f16
CP
4912 ShellPrintEx (-1, -1,\r
4913 L" Data Link Layer State Changed(8): %E%d%N\r\n",\r
0c84a69f 4914 PciExpressCap->SlotStatus.Bits.DataLinkLayerStateChanged\r
5d73d92f 4915 );\r
4916 return EFI_SUCCESS;\r
4917}\r
4918\r
a1d4bfcc 4919/**\r
4920 Print out information of the device root information.\r
4921\r
4922 @param[in] PciExpressCap The pointer to the structure about the device.\r
4923\r
4924 @retval EFI_SUCCESS The operation was successful.\r
4925**/\r
5d73d92f 4926EFI_STATUS\r
4927ExplainPcieRootControl (\r
0c84a69f 4928 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4929 )\r
5d73d92f 4930{\r
c37e0f16
CP
4931 ShellPrintEx (-1, -1,\r
4932 L" System Error on Correctable Error Enable(0): %E%d%N\r\n",\r
0c84a69f 4933 PciExpressCap->RootControl.Bits.SystemErrorOnCorrectableError\r
5d73d92f 4934 );\r
c37e0f16
CP
4935 ShellPrintEx (-1, -1,\r
4936 L" System Error on Non-Fatal Error Enable(1): %E%d%N\r\n",\r
0c84a69f 4937 PciExpressCap->RootControl.Bits.SystemErrorOnNonFatalError\r
5d73d92f 4938 );\r
c37e0f16
CP
4939 ShellPrintEx (-1, -1,\r
4940 L" System Error on Fatal Error Enable(2): %E%d%N\r\n",\r
0c84a69f 4941 PciExpressCap->RootControl.Bits.SystemErrorOnFatalError\r
5d73d92f 4942 );\r
c37e0f16
CP
4943 ShellPrintEx (-1, -1,\r
4944 L" PME Interrupt Enable(3): %E%d%N\r\n",\r
0c84a69f 4945 PciExpressCap->RootControl.Bits.PmeInterrupt\r
5d73d92f 4946 );\r
c37e0f16
CP
4947 ShellPrintEx (-1, -1,\r
4948 L" CRS Software Visibility Enable(4): %E%d%N\r\n",\r
0c84a69f 4949 PciExpressCap->RootControl.Bits.CrsSoftwareVisibility\r
5d73d92f 4950 );\r
4951\r
4952 return EFI_SUCCESS;\r
4953}\r
4954\r
a1d4bfcc 4955/**\r
4956 Print out information of the device root capability information.\r
4957\r
4958 @param[in] PciExpressCap The pointer to the structure about the device.\r
4959\r
4960 @retval EFI_SUCCESS The operation was successful.\r
4961**/\r
5d73d92f 4962EFI_STATUS\r
4963ExplainPcieRootCap (\r
0c84a69f 4964 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4965 )\r
5d73d92f 4966{\r
c37e0f16
CP
4967 ShellPrintEx (-1, -1,\r
4968 L" CRS Software Visibility(0): %E%d%N\r\n",\r
0c84a69f 4969 PciExpressCap->RootCapability.Bits.CrsSoftwareVisibility\r
5d73d92f 4970 );\r
4971\r
4972 return EFI_SUCCESS;\r
4973}\r
4974\r
a1d4bfcc 4975/**\r
4976 Print out information of the device root status information.\r
4977\r
4978 @param[in] PciExpressCap The pointer to the structure about the device.\r
4979\r
4980 @retval EFI_SUCCESS The operation was successful.\r
4981**/\r
5d73d92f 4982EFI_STATUS\r
4983ExplainPcieRootStatus (\r
0c84a69f 4984 IN PCI_CAPABILITY_PCIEXP *PciExpressCap\r
a1d4bfcc 4985 )\r
5d73d92f 4986{\r
c37e0f16
CP
4987 ShellPrintEx (-1, -1,\r
4988 L" PME Requester ID(15:0): %E0x%04x%N\r\n",\r
0c84a69f 4989 PciExpressCap->RootStatus.Bits.PmeRequesterId\r
5d73d92f 4990 );\r
c37e0f16
CP
4991 ShellPrintEx (-1, -1,\r
4992 L" PME Status(16): %E%d%N\r\n",\r
0c84a69f 4993 PciExpressCap->RootStatus.Bits.PmeStatus\r
5d73d92f 4994 );\r
c37e0f16
CP
4995 ShellPrintEx (-1, -1,\r
4996 L" PME Pending(17): %E%d%N\r\n",\r
0c84a69f 4997 PciExpressCap->RootStatus.Bits.PmePending\r
5d73d92f 4998 );\r
4999 return EFI_SUCCESS;\r
5000}\r
5001\r
705bffb5
JC
5002/**\r
5003 Function to interpret and print out the link control structure\r
5004\r
5005 @param[in] HeaderAddress The Address of this capability header.\r
5006 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5007**/\r
5008EFI_STATUS\r
705bffb5
JC
5009PrintInterpretedExtendedCompatibilityLinkControl (\r
5010 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5011 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5012 )\r
5013{\r
5014 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL *Header;\r
5015 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL*)HeaderAddress;\r
5016\r
5017 ShellPrintHiiEx(\r
5018 -1, -1, NULL, \r
5019 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_CONTROL), \r
5020 gShellDebug1HiiHandle, \r
5021 Header->RootComplexLinkCapabilities,\r
5022 Header->RootComplexLinkControl,\r
5023 Header->RootComplexLinkStatus\r
5024 ); \r
5025 DumpHex (\r
5026 4,\r
5027 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5028 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL),\r
5029 (VOID *) (HeaderAddress)\r
5030 );\r
5031 return (EFI_SUCCESS);\r
5032}\r
5033\r
5034/**\r
5035 Function to interpret and print out the power budgeting structure\r
5036\r
5037 @param[in] HeaderAddress The Address of this capability header.\r
5038 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5039**/\r
5040EFI_STATUS\r
705bffb5
JC
5041PrintInterpretedExtendedCompatibilityPowerBudgeting (\r
5042 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5043 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5044 )\r
5045{\r
5046 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING *Header;\r
5047 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING*)HeaderAddress;\r
5048\r
5049 ShellPrintHiiEx(\r
5050 -1, -1, NULL, \r
5051 STRING_TOKEN (STR_PCI_EXT_CAP_POWER), \r
5052 gShellDebug1HiiHandle, \r
5053 Header->DataSelect,\r
5054 Header->Data,\r
5055 Header->PowerBudgetCapability\r
5056 ); \r
5057 DumpHex (\r
5058 4,\r
5059 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5060 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING),\r
5061 (VOID *) (HeaderAddress)\r
5062 );\r
5063 return (EFI_SUCCESS);\r
5064}\r
5065\r
5066/**\r
5067 Function to interpret and print out the ACS structure\r
5068\r
5069 @param[in] HeaderAddress The Address of this capability header.\r
5070 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5071**/\r
5072EFI_STATUS\r
705bffb5
JC
5073PrintInterpretedExtendedCompatibilityAcs (\r
5074 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5075 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5076 )\r
5077{\r
5078 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED *Header;\r
5079 UINT16 VectorSize;\r
5080 UINT16 LoopCounter;\r
5081\r
5082 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED*)HeaderAddress;\r
5083 VectorSize = 0;\r
5084\r
5085 ShellPrintHiiEx(\r
5086 -1, -1, NULL, \r
5087 STRING_TOKEN (STR_PCI_EXT_CAP_ACS), \r
5088 gShellDebug1HiiHandle, \r
5089 Header->AcsCapability,\r
5090 Header->AcsControl\r
5091 ); \r
5092 if (PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_CONTROL(Header)) {\r
5093 VectorSize = PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_VECTOR_SIZE(Header);\r
5094 if (VectorSize == 0) {\r
5095 VectorSize = 256;\r
5096 }\r
5097 for (LoopCounter = 0 ; LoopCounter * 8 < VectorSize ; LoopCounter++) {\r
5098 ShellPrintHiiEx(\r
5099 -1, -1, NULL, \r
5100 STRING_TOKEN (STR_PCI_EXT_CAP_ACS2), \r
5101 gShellDebug1HiiHandle, \r
5102 LoopCounter + 1,\r
5103 Header->EgressControlVectorArray[LoopCounter]\r
5104 ); \r
5105 }\r
5106 }\r
5107 DumpHex (\r
5108 4,\r
5109 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5110 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED) + (VectorSize / 8) - 1,\r
5111 (VOID *) (HeaderAddress)\r
5112 );\r
5113 return (EFI_SUCCESS);\r
5114}\r
5115\r
5116/**\r
5117 Function to interpret and print out the latency tolerance reporting structure\r
5118\r
5119 @param[in] HeaderAddress The Address of this capability header.\r
5120 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5121**/\r
5122EFI_STATUS\r
705bffb5
JC
5123PrintInterpretedExtendedCompatibilityLatencyToleranceReporting (\r
5124 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5125 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5126 )\r
5127{\r
5128 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING *Header;\r
5129 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING*)HeaderAddress;\r
5130\r
5131 ShellPrintHiiEx(\r
5132 -1, -1, NULL, \r
5133 STRING_TOKEN (STR_PCI_EXT_CAP_LAT), \r
5134 gShellDebug1HiiHandle, \r
5135 Header->MaxSnoopLatency,\r
5136 Header->MaxNoSnoopLatency\r
5137 ); \r
5138 DumpHex (\r
5139 4,\r
5140 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5141 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING),\r
5142 (VOID *) (HeaderAddress)\r
5143 );\r
5144 return (EFI_SUCCESS);\r
5145}\r
5146\r
5147/**\r
5148 Function to interpret and print out the serial number structure\r
5149\r
5150 @param[in] HeaderAddress The Address of this capability header.\r
5151 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5152**/\r
5153EFI_STATUS\r
705bffb5
JC
5154PrintInterpretedExtendedCompatibilitySerialNumber (\r
5155 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5156 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5157 )\r
5158{\r
5159 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER *Header;\r
5160 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER*)HeaderAddress;\r
5161\r
5162 ShellPrintHiiEx(\r
5163 -1, -1, NULL, \r
5164 STRING_TOKEN (STR_PCI_EXT_CAP_SN), \r
5165 gShellDebug1HiiHandle, \r
5166 Header->SerialNumber\r
5167 ); \r
5168 DumpHex (\r
5169 4,\r
5170 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5171 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER),\r
5172 (VOID *) (HeaderAddress)\r
5173 );\r
5174 return (EFI_SUCCESS);\r
5175}\r
5176\r
5177/**\r
5178 Function to interpret and print out the RCRB structure\r
5179\r
5180 @param[in] HeaderAddress The Address of this capability header.\r
5181 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5182**/\r
5183EFI_STATUS\r
705bffb5
JC
5184PrintInterpretedExtendedCompatibilityRcrb (\r
5185 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5186 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5187 )\r
5188{\r
5189 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER *Header;\r
5190 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER*)HeaderAddress;\r
5191\r
5192 ShellPrintHiiEx(\r
5193 -1, -1, NULL, \r
5194 STRING_TOKEN (STR_PCI_EXT_CAP_RCRB), \r
5195 gShellDebug1HiiHandle, \r
5196 Header->VendorId,\r
5197 Header->DeviceId,\r
5198 Header->RcrbCapabilities,\r
5199 Header->RcrbControl\r
5200 ); \r
5201 DumpHex (\r
5202 4,\r
5203 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5204 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER),\r
5205 (VOID *) (HeaderAddress)\r
5206 );\r
5207 return (EFI_SUCCESS);\r
5208}\r
5209\r
5210/**\r
5211 Function to interpret and print out the vendor specific structure\r
5212\r
5213 @param[in] HeaderAddress The Address of this capability header.\r
5214 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5215**/\r
5216EFI_STATUS\r
705bffb5
JC
5217PrintInterpretedExtendedCompatibilityVendorSpecific (\r
5218 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5219 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5220 )\r
5221{\r
5222 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC *Header;\r
5223 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC*)HeaderAddress;\r
5224\r
5225 ShellPrintHiiEx(\r
5226 -1, -1, NULL, \r
5227 STRING_TOKEN (STR_PCI_EXT_CAP_VEN), \r
5228 gShellDebug1HiiHandle, \r
5229 Header->VendorSpecificHeader\r
5230 ); \r
5231 DumpHex (\r
5232 4,\r
5233 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5234 PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_GET_SIZE(Header),\r
5235 (VOID *) (HeaderAddress)\r
5236 );\r
5237 return (EFI_SUCCESS);\r
5238}\r
5239\r
5240/**\r
5241 Function to interpret and print out the Event Collector Endpoint Association structure\r
5242\r
5243 @param[in] HeaderAddress The Address of this capability header.\r
5244 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5245**/\r
5246EFI_STATUS\r
705bffb5
JC
5247PrintInterpretedExtendedCompatibilityECEA (\r
5248 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5249 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5250 )\r
5251{\r
5252 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION *Header;\r
5253 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION*)HeaderAddress;\r
5254\r
5255 ShellPrintHiiEx(\r
5256 -1, -1, NULL, \r
5257 STRING_TOKEN (STR_PCI_EXT_CAP_ECEA), \r
5258 gShellDebug1HiiHandle, \r
5259 Header->AssociationBitmap\r
5260 ); \r
5261 DumpHex (\r
5262 4,\r
5263 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5264 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION),\r
5265 (VOID *) (HeaderAddress)\r
5266 );\r
5267 return (EFI_SUCCESS);\r
5268}\r
5269\r
5270/**\r
5271 Function to interpret and print out the ARI structure\r
5272\r
5273 @param[in] HeaderAddress The Address of this capability header.\r
5274 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5275**/\r
5276EFI_STATUS\r
705bffb5
JC
5277PrintInterpretedExtendedCompatibilityAri (\r
5278 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5279 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5280 )\r
5281{\r
5282 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY *Header;\r
5283 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY*)HeaderAddress;\r
5284\r
5285 ShellPrintHiiEx(\r
5286 -1, -1, NULL, \r
5287 STRING_TOKEN (STR_PCI_EXT_CAP_ARI), \r
5288 gShellDebug1HiiHandle, \r
5289 Header->AriCapability,\r
5290 Header->AriControl\r
5291 ); \r
5292 DumpHex (\r
5293 4,\r
5294 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5295 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY),\r
5296 (VOID *) (HeaderAddress)\r
5297 );\r
5298 return (EFI_SUCCESS);\r
5299}\r
5300\r
5301/**\r
5302 Function to interpret and print out the DPA structure\r
5303\r
5304 @param[in] HeaderAddress The Address of this capability header.\r
5305 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5306**/\r
5307EFI_STATUS\r
705bffb5
JC
5308PrintInterpretedExtendedCompatibilityDynamicPowerAllocation (\r
5309 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5310 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5311 )\r
5312{\r
5313 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION *Header;\r
5314 UINT8 LinkCount;\r
5315 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION*)HeaderAddress;\r
5316\r
5317 ShellPrintHiiEx(\r
5318 -1, -1, NULL, \r
5319 STRING_TOKEN (STR_PCI_EXT_CAP_DPA), \r
5320 gShellDebug1HiiHandle, \r
5321 Header->DpaCapability,\r
5322 Header->DpaLatencyIndicator,\r
5323 Header->DpaStatus,\r
5324 Header->DpaControl\r
5325 ); \r
5326 for (LinkCount = 0 ; LinkCount < PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(Header) + 1 ; LinkCount++) {\r
5327 ShellPrintHiiEx(\r
5328 -1, -1, NULL, \r
5329 STRING_TOKEN (STR_PCI_EXT_CAP_DPA2), \r
5330 gShellDebug1HiiHandle, \r
5331 LinkCount+1,\r
5332 Header->DpaPowerAllocationArray[LinkCount]\r
5333 );\r
5334 }\r
5335 DumpHex (\r
5336 4,\r
5337 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5338 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION) - 1 + PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(Header),\r
5339 (VOID *) (HeaderAddress)\r
5340 );\r
5341 return (EFI_SUCCESS);\r
5342}\r
5343\r
5344/**\r
5345 Function to interpret and print out the link declaration structure\r
5346\r
5347 @param[in] HeaderAddress The Address of this capability header.\r
5348 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5349**/\r
5350EFI_STATUS\r
705bffb5
JC
5351PrintInterpretedExtendedCompatibilityLinkDeclaration (\r
5352 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5353 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5354 )\r
5355{\r
5356 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION *Header;\r
5357 UINT8 LinkCount;\r
5358 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION*)HeaderAddress;\r
5359\r
5360 ShellPrintHiiEx(\r
5361 -1, -1, NULL, \r
5362 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR), \r
5363 gShellDebug1HiiHandle, \r
5364 Header->ElementSelfDescription\r
5365 );\r
5366\r
5367 for (LinkCount = 0 ; LinkCount < PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(Header) ; LinkCount++) {\r
5368 ShellPrintHiiEx(\r
5369 -1, -1, NULL, \r
5370 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR2), \r
5371 gShellDebug1HiiHandle, \r
5372 LinkCount+1,\r
5373 Header->LinkEntry[LinkCount]\r
5374 );\r
5375 }\r
5376 DumpHex (\r
5377 4,\r
5378 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5379 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION) + (PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(Header)-1)*sizeof(UINT32),\r
5380 (VOID *) (HeaderAddress)\r
5381 );\r
5382 return (EFI_SUCCESS);\r
5383}\r
5384\r
5385/**\r
5386 Function to interpret and print out the Advanced Error Reporting structure\r
5387\r
5388 @param[in] HeaderAddress The Address of this capability header.\r
5389 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5390**/\r
5391EFI_STATUS\r
705bffb5
JC
5392PrintInterpretedExtendedCompatibilityAer (\r
5393 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5394 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5395 )\r
5396{\r
5397 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING *Header;\r
5398 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING*)HeaderAddress;\r
5399\r
5400 ShellPrintHiiEx(\r
5401 -1, -1, NULL, \r
5402 STRING_TOKEN (STR_PCI_EXT_CAP_AER), \r
5403 gShellDebug1HiiHandle, \r
5404 Header->UncorrectableErrorStatus,\r
5405 Header->UncorrectableErrorMask,\r
5406 Header->UncorrectableErrorSeverity,\r
5407 Header->CorrectableErrorStatus,\r
5408 Header->CorrectableErrorMask,\r
5409 Header->AdvancedErrorCapabilitiesAndControl,\r
231ad7d8
QS
5410 Header->HeaderLog[0],\r
5411 Header->HeaderLog[1],\r
5412 Header->HeaderLog[2],\r
5413 Header->HeaderLog[3],\r
705bffb5
JC
5414 Header->RootErrorCommand,\r
5415 Header->RootErrorStatus,\r
5416 Header->ErrorSourceIdentification,\r
5417 Header->CorrectableErrorSourceIdentification,\r
5418 Header->TlpPrefixLog[0],\r
5419 Header->TlpPrefixLog[1],\r
5420 Header->TlpPrefixLog[2],\r
5421 Header->TlpPrefixLog[3]\r
5422 );\r
5423 DumpHex (\r
5424 4,\r
5425 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5426 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING),\r
5427 (VOID *) (HeaderAddress)\r
5428 );\r
5429 return (EFI_SUCCESS);\r
5430}\r
5431\r
9f7f0697
JC
5432/**\r
5433 Function to interpret and print out the multicast structure\r
5434\r
5435 @param[in] HeaderAddress The Address of this capability header.\r
5436 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5437 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.\r
5438**/\r
5439EFI_STATUS\r
9f7f0697
JC
5440PrintInterpretedExtendedCompatibilityMulticast (\r
5441 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5442 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress,\r
0c84a69f 5443 IN CONST PCI_CAPABILITY_PCIEXP *PciExpressCapPtr\r
9f7f0697
JC
5444 )\r
5445{\r
5446 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST *Header;\r
5447 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST*)HeaderAddress;\r
5448\r
5449 ShellPrintHiiEx(\r
5450 -1, -1, NULL, \r
5451 STRING_TOKEN (STR_PCI_EXT_CAP_MULTICAST), \r
5452 gShellDebug1HiiHandle, \r
5453 Header->MultiCastCapability,\r
5454 Header->MulticastControl,\r
5455 Header->McBaseAddress,\r
5456 Header->McReceiveAddress,\r
5457 Header->McBlockAll,\r
5458 Header->McBlockUntranslated,\r
5459 Header->McOverlayBar\r
5460 );\r
5461\r
5462 DumpHex (\r
5463 4,\r
5464 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5465 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST),\r
5466 (VOID *) (HeaderAddress)\r
5467 );\r
5468\r
5469 return (EFI_SUCCESS);\r
5470}\r
5471\r
5472/**\r
5473 Function to interpret and print out the virtual channel and multi virtual channel structure\r
5474\r
5475 @param[in] HeaderAddress The Address of this capability header.\r
5476 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5477**/\r
5478EFI_STATUS\r
9f7f0697
JC
5479PrintInterpretedExtendedCompatibilityVirtualChannel (\r
5480 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5481 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5482 )\r
5483{\r
5484 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY *Header;\r
5485 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC *CapabilityItem;\r
5486 UINT32 ItemCount;\r
5487 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY*)HeaderAddress;\r
5488\r
5489 ShellPrintHiiEx(\r
5490 -1, -1, NULL, \r
5491 STRING_TOKEN (STR_PCI_EXT_CAP_VC_BASE), \r
5492 gShellDebug1HiiHandle, \r
5493 Header->ExtendedVcCount,\r
5494 Header->PortVcCapability1,\r
5495 Header->PortVcCapability2,\r
5496 Header->VcArbTableOffset,\r
5497 Header->PortVcControl,\r
5498 Header->PortVcStatus\r
5499 );\r
5500 for (ItemCount = 0 ; ItemCount < Header->ExtendedVcCount ; ItemCount++) {\r
5501 CapabilityItem = &Header->Capability[ItemCount];\r
5502 ShellPrintHiiEx(\r
5503 -1, -1, NULL, \r
5504 STRING_TOKEN (STR_PCI_EXT_CAP_VC_ITEM), \r
5505 gShellDebug1HiiHandle, \r
5506 ItemCount+1,\r
5507 CapabilityItem->VcResourceCapability,\r
5508 CapabilityItem->PortArbTableOffset,\r
5509 CapabilityItem->VcResourceControl,\r
5510 CapabilityItem->VcResourceStatus\r
5511 );\r
5512 }\r
5513\r
5514 DumpHex (\r
5515 4,\r
5516 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
26ca6f7e
RN
5517 sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY)\r
5518 + Header->ExtendedVcCount * sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC),\r
9f7f0697
JC
5519 (VOID *) (HeaderAddress)\r
5520 );\r
5521\r
5522 return (EFI_SUCCESS);\r
5523}\r
5524\r
5525/**\r
5526 Function to interpret and print out the resizeable bar structure\r
5527\r
5528 @param[in] HeaderAddress The Address of this capability header.\r
5529 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5530**/\r
5531EFI_STATUS\r
9f7f0697
JC
5532PrintInterpretedExtendedCompatibilityResizeableBar (\r
5533 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5534 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5535 )\r
5536{\r
5537 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR *Header;\r
5538 UINT32 ItemCount;\r
5539 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR*)HeaderAddress;\r
5540\r
5541 for (ItemCount = 0 ; ItemCount < (UINT32)GET_NUMBER_RESIZABLE_BARS(Header) ; ItemCount++) {\r
5542 ShellPrintHiiEx(\r
5543 -1, -1, NULL, \r
5544 STRING_TOKEN (STR_PCI_EXT_CAP_RESIZE_BAR), \r
5545 gShellDebug1HiiHandle, \r
5546 ItemCount+1,\r
5547 Header->Capability[ItemCount].ResizableBarCapability,\r
5548 Header->Capability[ItemCount].ResizableBarControl\r
5549 );\r
5550 }\r
5551\r
5552 DumpHex (\r
5553 4,\r
5554 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5555 (UINT32)GET_NUMBER_RESIZABLE_BARS(Header) * sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY),\r
5556 (VOID *) (HeaderAddress)\r
5557 );\r
5558\r
5559 return (EFI_SUCCESS);\r
5560}\r
5561\r
5562/**\r
5563 Function to interpret and print out the TPH structure\r
5564\r
5565 @param[in] HeaderAddress The Address of this capability header.\r
5566 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5567**/\r
5568EFI_STATUS\r
9f7f0697
JC
5569PrintInterpretedExtendedCompatibilityTph (\r
5570 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5571 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress\r
5572 )\r
5573{\r
5574 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH *Header;\r
5575 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH*)HeaderAddress;\r
5576\r
5577 ShellPrintHiiEx(\r
5578 -1, -1, NULL, \r
5579 STRING_TOKEN (STR_PCI_EXT_CAP_TPH), \r
5580 gShellDebug1HiiHandle, \r
5581 Header->TphRequesterCapability,\r
5582 Header->TphRequesterControl\r
5583 );\r
5584 DumpHex (\r
5585 8,\r
5586 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)Header->TphStTable - (UINT8*)HeadersBaseAddress),\r
5587 GET_TPH_TABLE_SIZE(Header),\r
5588 (VOID *)Header->TphStTable\r
5589 );\r
5590\r
5591 DumpHex (\r
5592 4,\r
5593 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
5594 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH) + GET_TPH_TABLE_SIZE(Header) - sizeof(UINT16),\r
5595 (VOID *) (HeaderAddress)\r
5596 );\r
5597\r
5598 return (EFI_SUCCESS);\r
5599}\r
5600\r
5601/**\r
5602 Function to interpret and print out the secondary PCIe capability structure\r
5603\r
5604 @param[in] HeaderAddress The Address of this capability header.\r
5605 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5606 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.\r
5607**/\r
5608EFI_STATUS\r
9f7f0697
JC
5609PrintInterpretedExtendedCompatibilitySecondary (\r
5610 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
5611 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress,\r
0c84a69f 5612 IN CONST PCI_CAPABILITY_PCIEXP *PciExpressCap\r
9f7f0697
JC
5613 )\r
5614{\r
5615 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE *Header;\r
5616 Header = (PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE*)HeaderAddress;\r
5617\r
5618 ShellPrintHiiEx(\r
5619 -1, -1, NULL, \r
5620 STRING_TOKEN (STR_PCI_EXT_CAP_SECONDARY), \r
5621 gShellDebug1HiiHandle, \r
0c84a69f 5622 Header->LinkControl3.Uint32,\r
9f7f0697
JC
5623 Header->LaneErrorStatus\r
5624 );\r
5625 DumpHex (\r
5626 8,\r
5627 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)Header->EqualizationControl - (UINT8*)HeadersBaseAddress),\r
0c84a69f 5628 PciExpressCap->LinkCapability.Bits.MaxLinkWidth * sizeof (PCI_EXPRESS_REG_LANE_EQUALIZATION_CONTROL),\r
9f7f0697
JC
5629 (VOID *)Header->EqualizationControl\r
5630 );\r
5631\r
5632 DumpHex (\r
5633 4,\r
5634 EFI_PCIE_CAPABILITY_BASE_OFFSET + ((UINT8*)HeaderAddress - (UINT8*)HeadersBaseAddress),\r
0c84a69f
RN
5635 sizeof (PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE) - sizeof (Header->EqualizationControl)\r
5636 + PciExpressCap->LinkCapability.Bits.MaxLinkWidth * sizeof (PCI_EXPRESS_REG_LANE_EQUALIZATION_CONTROL),\r
9f7f0697
JC
5637 (VOID *) (HeaderAddress)\r
5638 );\r
5639\r
5640 return (EFI_SUCCESS);\r
5641}\r
5642\r
705bffb5
JC
5643/**\r
5644 Display Pcie extended capability details\r
5645\r
5646 @param[in] HeadersBaseAddress The address of all the extended capability headers.\r
5647 @param[in] HeaderAddress The address of this capability header.\r
5648 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.\r
5649**/\r
5650EFI_STATUS\r
705bffb5
JC
5651PrintPciExtendedCapabilityDetails(\r
5652 IN CONST PCI_EXP_EXT_HDR *HeadersBaseAddress, \r
5653 IN CONST PCI_EXP_EXT_HDR *HeaderAddress,\r
0c84a69f 5654 IN CONST PCI_CAPABILITY_PCIEXP *PciExpressCapPtr\r
705bffb5
JC
5655 )\r
5656{\r
5657 switch (HeaderAddress->CapabilityId){\r
5658 case PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_ID:\r
5659 return PrintInterpretedExtendedCompatibilityAer(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5660 case PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_ID:\r
5661 return PrintInterpretedExtendedCompatibilityLinkControl(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5662 case PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_ID:\r
5663 return PrintInterpretedExtendedCompatibilityLinkDeclaration(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5664 case PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_ID:\r
5665 return PrintInterpretedExtendedCompatibilitySerialNumber(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5666 case PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_ID:\r
5667 return PrintInterpretedExtendedCompatibilityPowerBudgeting(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5668 case PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_ID:\r
5669 return PrintInterpretedExtendedCompatibilityAcs(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5670 case PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_ID:\r
5671 return PrintInterpretedExtendedCompatibilityLatencyToleranceReporting(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5672 case PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_ID:\r
5673 return PrintInterpretedExtendedCompatibilityAri(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5674 case PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_ID:\r
5675 return PrintInterpretedExtendedCompatibilityRcrb(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5676 case PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_ID:\r
5677 return PrintInterpretedExtendedCompatibilityVendorSpecific(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5678 case PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_ID:\r
5679 return PrintInterpretedExtendedCompatibilityDynamicPowerAllocation(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5680 case PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_ID:\r
5681 return PrintInterpretedExtendedCompatibilityECEA(HeaderAddress, HeadersBaseAddress);\r
705bffb5
JC
5682 case PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_ID:\r
5683 case PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_ID:\r
9f7f0697 5684 return PrintInterpretedExtendedCompatibilityVirtualChannel(HeaderAddress, HeadersBaseAddress);\r
705bffb5 5685 case PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_ID: \r
9f7f0697
JC
5686 //\r
5687 // should only be present if PCIE_CAP_DEVICEPORT_TYPE(PciExpressCapPtr->PcieCapReg) == 0100b, 0101b, or 0110b\r
5688 //\r
5689 return PrintInterpretedExtendedCompatibilityMulticast(HeaderAddress, HeadersBaseAddress, PciExpressCapPtr);\r
705bffb5 5690 case PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_ID:\r
9f7f0697 5691 return PrintInterpretedExtendedCompatibilityResizeableBar(HeaderAddress, HeadersBaseAddress);\r
705bffb5 5692 case PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_ID:\r
9f7f0697 5693 return PrintInterpretedExtendedCompatibilityTph(HeaderAddress, HeadersBaseAddress);\r
705bffb5 5694 case PCI_EXPRESS_EXTENDED_CAPABILITY_SECONDARY_PCIE_ID:\r
9f7f0697 5695 return PrintInterpretedExtendedCompatibilitySecondary(HeaderAddress, HeadersBaseAddress, PciExpressCapPtr);\r
705bffb5
JC
5696 default:\r
5697 ShellPrintEx (-1, -1,\r
5698 L"Unknown PCIe extended capability ID (%04xh). No interpretation available.\r\n",\r
5699 HeaderAddress->CapabilityId\r
5700 );\r
5701 return EFI_SUCCESS;\r
705bffb5
JC
5702 };\r
5703\r
5704}\r
5705\r
a1d4bfcc 5706/**\r
5707 Display Pcie device structure.\r
5708\r
5709 @param[in] IoDev The pointer to the root pci protocol.\r
5710 @param[in] Address The Address to start at.\r
5711 @param[in] CapabilityPtr The offset from the address to start.\r
f614ce7e
SQ
5712 @param[in] EnhancedDump The print format for the dump data.\r
5713 \r
a1d4bfcc 5714**/\r
5d73d92f 5715EFI_STATUS\r
5716PciExplainPciExpress (\r
5717 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *IoDev,\r
5718 IN UINT64 Address,\r
705bffb5
JC
5719 IN UINT8 CapabilityPtr,\r
5720 IN CONST UINT16 EnhancedDump\r
5d73d92f 5721 )\r
5722{\r
0c84a69f
RN
5723 PCI_CAPABILITY_PCIEXP PciExpressCap;\r
5724 EFI_STATUS Status;\r
5725 UINT64 CapRegAddress;\r
5726 UINT8 Bus;\r
5727 UINT8 Dev;\r
5728 UINT8 Func;\r
5729 UINT8 *ExRegBuffer;\r
5730 UINTN ExtendRegSize;\r
5731 UINT64 Pciex_Address;\r
5732 UINT8 DevicePortType;\r
5733 UINTN Index;\r
5734 UINT8 *RegAddr;\r
5735 UINTN RegValue;\r
5736 PCI_EXP_EXT_HDR *ExtHdr;\r
5d73d92f 5737\r
5738 CapRegAddress = Address + CapabilityPtr;\r
5739 IoDev->Pci.Read (\r
5740 IoDev,\r
5741 EfiPciWidthUint32,\r
5742 CapRegAddress,\r
5743 sizeof (PciExpressCap) / sizeof (UINT32),\r
5744 &PciExpressCap\r
5745 );\r
5746\r
0c84a69f 5747 DevicePortType = (UINT8)PciExpressCap.Capability.Bits.DevicePortType;\r
5d73d92f 5748\r
c37e0f16 5749 ShellPrintEx (-1, -1, L"\r\nPci Express device capability structure:\r\n");\r
5d73d92f 5750\r
5751 for (Index = 0; PcieExplainList[Index].Type < PcieExplainTypeMax; Index++) {\r
5752 if (ShellGetExecutionBreakFlag()) {\r
5753 goto Done;\r
5754 }\r
5755 RegAddr = ((UINT8 *) &PciExpressCap) + PcieExplainList[Index].Offset;\r
5756 switch (PcieExplainList[Index].Width) {\r
5757 case FieldWidthUINT8:\r
5758 RegValue = *(UINT8 *) RegAddr;\r
5759 break;\r
5760 case FieldWidthUINT16:\r
5761 RegValue = *(UINT16 *) RegAddr;\r
5762 break;\r
5763 case FieldWidthUINT32:\r
5764 RegValue = *(UINT32 *) RegAddr;\r
5765 break;\r
5766 default:\r
5767 RegValue = 0;\r
5768 break;\r
5769 }\r
5770 ShellPrintHiiEx(-1, -1, NULL,\r
5771 PcieExplainList[Index].Token,\r
5772 gShellDebug1HiiHandle,\r
5773 PcieExplainList[Index].Offset,\r
5774 RegValue\r
5775 );\r
5776 if (PcieExplainList[Index].Func == NULL) {\r
5777 continue;\r
5778 }\r
5779 switch (PcieExplainList[Index].Type) {\r
5780 case PcieExplainTypeLink:\r
5781 //\r
5782 // Link registers should not be used by\r
5783 // a) Root Complex Integrated Endpoint\r
5784 // b) Root Complex Event Collector\r
5785 //\r
0c84a69f
RN
5786 if (DevicePortType == PCIE_DEVICE_PORT_TYPE_ROOT_COMPLEX_INTEGRATED_ENDPOINT ||\r
5787 DevicePortType == PCIE_DEVICE_PORT_TYPE_ROOT_COMPLEX_EVENT_COLLECTOR) {\r
5d73d92f 5788 continue;\r
5789 }\r
5790 break;\r
5791 case PcieExplainTypeSlot:\r
5792 //\r
5793 // Slot registers are only valid for\r
5794 // a) Root Port of PCI Express Root Complex\r
5795 // b) Downstream Port of PCI Express Switch\r
5796 // and when SlotImplemented bit is set in PCIE cap register.\r
5797 //\r
0c84a69f
RN
5798 if ((DevicePortType != PCIE_DEVICE_PORT_TYPE_ROOT_PORT &&\r
5799 DevicePortType != PCIE_DEVICE_PORT_TYPE_DOWNSTREAM_PORT) ||\r
5800 !PciExpressCap.Capability.Bits.SlotImplemented) {\r
5d73d92f 5801 continue;\r
5802 }\r
5803 break;\r
5804 case PcieExplainTypeRoot:\r
5805 //\r
5806 // Root registers are only valid for\r
5807 // Root Port of PCI Express Root Complex\r
5808 //\r
0c84a69f 5809 if (DevicePortType != PCIE_DEVICE_PORT_TYPE_ROOT_PORT) {\r
5d73d92f 5810 continue;\r
5811 }\r
5812 break;\r
5813 default:\r
5814 break;\r
5815 }\r
5816 PcieExplainList[Index].Func (&PciExpressCap);\r
5817 }\r
5818\r
5819 Bus = (UINT8) (RShiftU64 (Address, 24));\r
5820 Dev = (UINT8) (RShiftU64 (Address, 16));\r
5821 Func = (UINT8) (RShiftU64 (Address, 8));\r
5822\r
0c84a69f 5823 Pciex_Address = EFI_PCI_ADDRESS (Bus, Dev, Func, EFI_PCIE_CAPABILITY_BASE_OFFSET);\r
5d73d92f 5824\r
705bffb5 5825 ExtendRegSize = 0x1000 - EFI_PCIE_CAPABILITY_BASE_OFFSET;\r
5d73d92f 5826\r
3737ac2b 5827 ExRegBuffer = (UINT8 *) AllocateZeroPool (ExtendRegSize);\r
5d73d92f 5828\r
5829 //\r
5830 // PciRootBridgeIo protocol should support pci express extend space IO\r
705bffb5 5831 // (Begins at offset EFI_PCIE_CAPABILITY_BASE_OFFSET)\r
5d73d92f 5832 //\r
5833 Status = IoDev->Pci.Read (\r
5834 IoDev,\r
5835 EfiPciWidthUint32,\r
5836 Pciex_Address,\r
5837 (ExtendRegSize) / sizeof (UINT32),\r
5838 (VOID *) (ExRegBuffer)\r
5839 );\r
705bffb5
JC
5840 if (EFI_ERROR (Status) || ExRegBuffer == NULL) {\r
5841 SHELL_FREE_NON_NULL(ExRegBuffer);\r
5d73d92f 5842 return EFI_UNSUPPORTED;\r
5843 }\r
5d73d92f 5844\r
c831a2c3
RN
5845 ExtHdr = (PCI_EXP_EXT_HDR*)ExRegBuffer;\r
5846 while (ExtHdr->CapabilityId != 0 && ExtHdr->CapabilityVersion != 0) {\r
705bffb5 5847 //\r
c831a2c3 5848 // Process this item\r
705bffb5 5849 //\r
c831a2c3 5850 if (EnhancedDump == 0xFFFF || EnhancedDump == ExtHdr->CapabilityId) {\r
705bffb5 5851 //\r
c831a2c3 5852 // Print this item\r
705bffb5 5853 //\r
c831a2c3
RN
5854 PrintPciExtendedCapabilityDetails((PCI_EXP_EXT_HDR*)ExRegBuffer, ExtHdr, &PciExpressCap);\r
5855 }\r
5d73d92f 5856\r
c831a2c3
RN
5857 //\r
5858 // Advance to the next item if it exists\r
5859 //\r
5860 if (ExtHdr->NextCapabilityOffset != 0) {\r
5861 ExtHdr = (PCI_EXP_EXT_HDR*)((UINT8*)ExRegBuffer + ExtHdr->NextCapabilityOffset - EFI_PCIE_CAPABILITY_BASE_OFFSET);\r
5862 } else {\r
5863 break;\r
705bffb5 5864 }\r
d8f8021c 5865 }\r
705bffb5 5866 SHELL_FREE_NON_NULL(ExRegBuffer);\r
5d73d92f 5867\r
5868Done:\r
5869 return EFI_SUCCESS;\r
5870}\r