2 Main file for Pci shell Debug1 function.
4 Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
5 Copyright (c) 2005 - 2014, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "UefiShellDebug1CommandsLib.h"
17 #include <Protocol/PciRootBridgeIo.h>
18 #include <Library/ShellLib.h>
19 #include <IndustryStandard/Pci.h>
20 #include <IndustryStandard/Acpi.h>
23 #define PCI_CLASS_STRING_LIMIT 54
25 // Printable strings for Pci class code
28 CHAR16
*BaseClass
; // Pointer to the PCI base class string
29 CHAR16
*SubClass
; // Pointer to the PCI sub class string
30 CHAR16
*PIFClass
; // Pointer to the PCI programming interface string
34 // a structure holding a single entry, which also points to its lower level
37 typedef struct PCI_CLASS_ENTRY_TAG
{
38 UINT8 Code
; // Class, subclass or I/F code
39 CHAR16
*DescText
; // Description string
40 struct PCI_CLASS_ENTRY_TAG
*LowerLevelClass
; // Subclass or I/F if any
44 // Declarations of entries which contain printable strings for class codes
45 // in PCI configuration space
47 PCI_CLASS_ENTRY PCIBlankEntry
[];
48 PCI_CLASS_ENTRY PCISubClass_00
[];
49 PCI_CLASS_ENTRY PCISubClass_01
[];
50 PCI_CLASS_ENTRY PCISubClass_02
[];
51 PCI_CLASS_ENTRY PCISubClass_03
[];
52 PCI_CLASS_ENTRY PCISubClass_04
[];
53 PCI_CLASS_ENTRY PCISubClass_05
[];
54 PCI_CLASS_ENTRY PCISubClass_06
[];
55 PCI_CLASS_ENTRY PCISubClass_07
[];
56 PCI_CLASS_ENTRY PCISubClass_08
[];
57 PCI_CLASS_ENTRY PCISubClass_09
[];
58 PCI_CLASS_ENTRY PCISubClass_0a
[];
59 PCI_CLASS_ENTRY PCISubClass_0b
[];
60 PCI_CLASS_ENTRY PCISubClass_0c
[];
61 PCI_CLASS_ENTRY PCISubClass_0d
[];
62 PCI_CLASS_ENTRY PCISubClass_0e
[];
63 PCI_CLASS_ENTRY PCISubClass_0f
[];
64 PCI_CLASS_ENTRY PCISubClass_10
[];
65 PCI_CLASS_ENTRY PCISubClass_11
[];
66 PCI_CLASS_ENTRY PCIPIFClass_0101
[];
67 PCI_CLASS_ENTRY PCIPIFClass_0300
[];
68 PCI_CLASS_ENTRY PCIPIFClass_0604
[];
69 PCI_CLASS_ENTRY PCIPIFClass_0700
[];
70 PCI_CLASS_ENTRY PCIPIFClass_0701
[];
71 PCI_CLASS_ENTRY PCIPIFClass_0703
[];
72 PCI_CLASS_ENTRY PCIPIFClass_0800
[];
73 PCI_CLASS_ENTRY PCIPIFClass_0801
[];
74 PCI_CLASS_ENTRY PCIPIFClass_0802
[];
75 PCI_CLASS_ENTRY PCIPIFClass_0803
[];
76 PCI_CLASS_ENTRY PCIPIFClass_0904
[];
77 PCI_CLASS_ENTRY PCIPIFClass_0c00
[];
78 PCI_CLASS_ENTRY PCIPIFClass_0c03
[];
79 PCI_CLASS_ENTRY PCIPIFClass_0e00
[];
82 // Base class strings entries
84 PCI_CLASS_ENTRY gClassStringList
[] = {
92 L
"Mass Storage Controller",
97 L
"Network Controller",
102 L
"Display Controller",
107 L
"Multimedia Device",
112 L
"Memory Controller",
122 L
"Simple Communications Controllers",
127 L
"Base System Peripherals",
147 L
"Serial Bus Controllers",
152 L
"Wireless Controllers",
157 L
"Intelligent IO Controllers",
162 L
"Satellite Communications Controllers",
167 L
"Encryption/Decryption Controllers",
172 L
"Data Acquisition & Signal Processing Controllers",
177 L
"Device does not fit in any defined classes",
183 /* null string ends the list */NULL
188 // Subclass strings entries
190 PCI_CLASS_ENTRY PCIBlankEntry
[] = {
199 /* null string ends the list */NULL
203 PCI_CLASS_ENTRY PCISubClass_00
[] = {
206 L
"All devices other than VGA",
211 L
"VGA-compatible devices",
217 /* null string ends the list */NULL
221 PCI_CLASS_ENTRY PCISubClass_01
[] = {
234 L
"Floppy disk controller",
249 L
"Other mass storage controller",
255 /* null string ends the list */NULL
259 PCI_CLASS_ENTRY PCISubClass_02
[] = {
262 L
"Ethernet controller",
267 L
"Token ring controller",
287 L
"Other network controller",
293 /* null string ends the list */NULL
297 PCI_CLASS_ENTRY PCISubClass_03
[] = {
300 L
"VGA/8514 controller",
315 L
"Other display controller",
321 /* null string ends the list */PCIBlankEntry
325 PCI_CLASS_ENTRY PCISubClass_04
[] = {
338 L
"Computer Telephony device",
343 L
"Other multimedia device",
349 /* null string ends the list */NULL
353 PCI_CLASS_ENTRY PCISubClass_05
[] = {
356 L
"RAM memory controller",
361 L
"Flash memory controller",
366 L
"Other memory controller",
372 /* null string ends the list */NULL
376 PCI_CLASS_ENTRY PCISubClass_06
[] = {
394 L
"PCI/Micro Channel bridge",
404 L
"PCI/PCMCIA bridge",
424 L
"Other bridge type",
430 /* null string ends the list */NULL
434 PCI_CLASS_ENTRY PCISubClass_07
[] = {
437 L
"Serial controller",
447 L
"Multiport serial controller",
457 L
"Other communication device",
463 /* null string ends the list */NULL
467 PCI_CLASS_ENTRY PCISubClass_08
[] = {
490 L
"Generic PCI Hot-Plug controller",
495 L
"Other system peripheral",
501 /* null string ends the list */NULL
505 PCI_CLASS_ENTRY PCISubClass_09
[] = {
508 L
"Keyboard controller",
523 L
"Scanner controller",
528 L
"Gameport controller",
533 L
"Other input controller",
539 /* null string ends the list */NULL
543 PCI_CLASS_ENTRY PCISubClass_0a
[] = {
546 L
"Generic docking station",
551 L
"Other type of docking station",
557 /* null string ends the list */NULL
561 PCI_CLASS_ENTRY PCISubClass_0b
[] = {
605 /* null string ends the list */NULL
609 PCI_CLASS_ENTRY PCISubClass_0c
[] = {
612 L
"Firewire(IEEE 1394)",
637 L
"System Management Bus",
648 /* null string ends the list */NULL
652 PCI_CLASS_ENTRY PCISubClass_0d
[] = {
655 L
"iRDA compatible controller",
660 L
"Consumer IR controller",
670 L
"Other type of wireless controller",
676 /* null string ends the list */NULL
680 PCI_CLASS_ENTRY PCISubClass_0e
[] = {
689 /* null string ends the list */NULL
693 PCI_CLASS_ENTRY PCISubClass_0f
[] = {
717 /* null string ends the list */NULL
721 PCI_CLASS_ENTRY PCISubClass_10
[] = {
724 L
"Network & computing Encrypt/Decrypt",
729 L
"Entertainment Encrypt/Decrypt",
734 L
"Other Encrypt/Decrypt",
740 /* null string ends the list */NULL
744 PCI_CLASS_ENTRY PCISubClass_11
[] = {
752 L
"Other DAQ & SP controllers",
758 /* null string ends the list */NULL
763 // Programming Interface entries
765 PCI_CLASS_ENTRY PCIPIFClass_0101
[] = {
793 L
"OM-primary, OM-secondary",
798 L
"PI-primary, OM-secondary",
803 L
"OM/PI-primary, OM-secondary",
813 L
"OM-primary, PI-secondary",
818 L
"PI-primary, PI-secondary",
823 L
"OM/PI-primary, PI-secondary",
833 L
"OM-primary, OM/PI-secondary",
838 L
"PI-primary, OM/PI-secondary",
843 L
"OM/PI-primary, OM/PI-secondary",
853 L
"Master, OM-primary",
858 L
"Master, PI-primary",
863 L
"Master, OM/PI-primary",
868 L
"Master, OM-secondary",
873 L
"Master, OM-primary, OM-secondary",
878 L
"Master, PI-primary, OM-secondary",
883 L
"Master, OM/PI-primary, OM-secondary",
888 L
"Master, OM-secondary",
893 L
"Master, OM-primary, PI-secondary",
898 L
"Master, PI-primary, PI-secondary",
903 L
"Master, OM/PI-primary, PI-secondary",
908 L
"Master, OM-secondary",
913 L
"Master, OM-primary, OM/PI-secondary",
918 L
"Master, PI-primary, OM/PI-secondary",
923 L
"Master, OM/PI-primary, OM/PI-secondary",
929 /* null string ends the list */NULL
933 PCI_CLASS_ENTRY PCIPIFClass_0300
[] = {
947 /* null string ends the list */NULL
951 PCI_CLASS_ENTRY PCIPIFClass_0604
[] = {
959 L
"Subtractive decode",
965 /* null string ends the list */NULL
969 PCI_CLASS_ENTRY PCIPIFClass_0700
[] = {
972 L
"Generic XT-compatible",
1002 L
"16950-compatible",
1008 /* null string ends the list */NULL
1012 PCI_CLASS_ENTRY PCIPIFClass_0701
[] = {
1025 L
"ECP 1.X-compliant",
1035 L
"IEEE 1284 target (not a controller)",
1041 /* null string ends the list */NULL
1045 PCI_CLASS_ENTRY PCIPIFClass_0703
[] = {
1053 L
"Hayes-compatible 16450",
1058 L
"Hayes-compatible 16550",
1063 L
"Hayes-compatible 16650",
1068 L
"Hayes-compatible 16750",
1074 /* null string ends the list */NULL
1078 PCI_CLASS_ENTRY PCIPIFClass_0800
[] = {
1101 L
"IO(x) APIC interrupt controller",
1107 /* null string ends the list */NULL
1111 PCI_CLASS_ENTRY PCIPIFClass_0801
[] = {
1130 /* null string ends the list */NULL
1134 PCI_CLASS_ENTRY PCIPIFClass_0802
[] = {
1153 /* null string ends the list */NULL
1157 PCI_CLASS_ENTRY PCIPIFClass_0803
[] = {
1176 /* null string ends the list */NULL
1180 PCI_CLASS_ENTRY PCIPIFClass_0904
[] = {
1194 /* null string ends the list */NULL
1198 PCI_CLASS_ENTRY PCIPIFClass_0c00
[] = {
1201 L
"Universal Host Controller spec",
1206 L
"Open Host Controller spec",
1211 L
"No specific programming interface",
1216 L
"(Not Host Controller)",
1222 /* null string ends the list */NULL
1226 PCI_CLASS_ENTRY PCIPIFClass_0c03
[] = {
1234 L
"Using 1394 OpenHCI spec",
1240 /* null string ends the list */NULL
1244 PCI_CLASS_ENTRY PCIPIFClass_0e00
[] = {
1247 L
"Message FIFO at offset 40h",
1258 /* null string ends the list */NULL
1264 Generates printable Unicode strings that represent PCI device class,
1265 subclass and programmed I/F based on a value passed to the function.
1267 @param[in] ClassCode Value representing the PCI "Class Code" register read from a
1268 PCI device. The encodings are:
1269 bits 23:16 - Base Class Code
1270 bits 15:8 - Sub-Class Code
1271 bits 7:0 - Programming Interface
1272 @param[in, out] ClassStrings Pointer of PCI_CLASS_STRINGS structure, which contains
1273 printable class strings corresponding to ClassCode. The
1274 caller must not modify the strings that are pointed by
1275 the fields in ClassStrings.
1278 PciGetClassStrings (
1279 IN UINT32 ClassCode
,
1280 IN OUT PCI_CLASS_STRINGS
*ClassStrings
1285 PCI_CLASS_ENTRY
*CurrentClass
;
1288 // Assume no strings found
1290 ClassStrings
->BaseClass
= L
"UNDEFINED";
1291 ClassStrings
->SubClass
= L
"UNDEFINED";
1292 ClassStrings
->PIFClass
= L
"UNDEFINED";
1294 CurrentClass
= gClassStringList
;
1295 Code
= (UINT8
) (ClassCode
>> 16);
1299 // Go through all entries of the base class, until the entry with a matching
1300 // base class code is found. If reaches an entry with a null description
1301 // text, the last entry is met, which means no text for the base class was
1302 // found, so no more action is needed.
1304 while (Code
!= CurrentClass
[Index
].Code
) {
1305 if (NULL
== CurrentClass
[Index
].DescText
) {
1312 // A base class was found. Assign description, and check if this class has
1313 // sub-class defined. If sub-class defined, no more action is needed,
1314 // otherwise, continue to find description for the sub-class code.
1316 ClassStrings
->BaseClass
= CurrentClass
[Index
].DescText
;
1317 if (NULL
== CurrentClass
[Index
].LowerLevelClass
) {
1321 // find Subclass entry
1323 CurrentClass
= CurrentClass
[Index
].LowerLevelClass
;
1324 Code
= (UINT8
) (ClassCode
>> 8);
1328 // Go through all entries of the sub-class, until the entry with a matching
1329 // sub-class code is found. If reaches an entry with a null description
1330 // text, the last entry is met, which means no text for the sub-class was
1331 // found, so no more action is needed.
1333 while (Code
!= CurrentClass
[Index
].Code
) {
1334 if (NULL
== CurrentClass
[Index
].DescText
) {
1341 // A class was found for the sub-class code. Assign description, and check if
1342 // this sub-class has programming interface defined. If no, no more action is
1343 // needed, otherwise, continue to find description for the programming
1346 ClassStrings
->SubClass
= CurrentClass
[Index
].DescText
;
1347 if (NULL
== CurrentClass
[Index
].LowerLevelClass
) {
1351 // Find programming interface entry
1353 CurrentClass
= CurrentClass
[Index
].LowerLevelClass
;
1354 Code
= (UINT8
) ClassCode
;
1358 // Go through all entries of the I/F entries, until the entry with a
1359 // matching I/F code is found. If reaches an entry with a null description
1360 // text, the last entry is met, which means no text was found, so no more
1361 // action is needed.
1363 while (Code
!= CurrentClass
[Index
].Code
) {
1364 if (NULL
== CurrentClass
[Index
].DescText
) {
1371 // A class was found for the I/F code. Assign description, done!
1373 ClassStrings
->PIFClass
= CurrentClass
[Index
].DescText
;
1378 Print strings that represent PCI device class, subclass and programmed I/F.
1380 @param[in] ClassCodePtr Points to the memory which stores register Class Code in PCI
1382 @param[in] IncludePIF If the printed string should include the programming I/F part
1386 IN UINT8
*ClassCodePtr
,
1387 IN BOOLEAN IncludePIF
1391 PCI_CLASS_STRINGS ClassStrings
;
1394 ClassCode
|= ClassCodePtr
[0];
1395 ClassCode
|= (ClassCodePtr
[1] << 8);
1396 ClassCode
|= (ClassCodePtr
[2] << 16);
1399 // Get name from class code
1401 PciGetClassStrings (ClassCode
, &ClassStrings
);
1405 // Print base class, sub class, and programming inferface name
1407 ShellPrintEx (-1, -1, L
"%s - %s - %s",
1408 ClassStrings
.BaseClass
,
1409 ClassStrings
.SubClass
,
1410 ClassStrings
.PIFClass
1415 // Only print base class and sub class name
1417 ShellPrintEx (-1, -1, L
"%s - %s",
1418 ClassStrings
.BaseClass
,
1419 ClassStrings
.SubClass
1425 This function finds out the protocol which is in charge of the given
1426 segment, and its bus range covers the current bus number. It lookes
1427 each instances of RootBridgeIoProtocol handle, until the one meets the
1430 @param[in] HandleBuf Buffer which holds all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.
1431 @param[in] HandleCount Count of all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.
1432 @param[in] Segment Segment number of device we are dealing with.
1433 @param[in] Bus Bus number of device we are dealing with.
1434 @param[out] IoDev Handle used to access configuration space of PCI device.
1436 @retval EFI_SUCCESS The command completed successfully.
1437 @retval EFI_INVALID_PARAMETER Invalid parameter.
1441 PciFindProtocolInterface (
1442 IN EFI_HANDLE
*HandleBuf
,
1443 IN UINTN HandleCount
,
1446 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
**IoDev
1450 This function gets the protocol interface from the given handle, and
1451 obtains its address space descriptors.
1453 @param[in] Handle The PCI_ROOT_BRIDIGE_IO_PROTOCOL handle.
1454 @param[out] IoDev Handle used to access configuration space of PCI device.
1455 @param[out] Descriptors Points to the address space descriptors.
1457 @retval EFI_SUCCESS The command completed successfully
1460 PciGetProtocolAndResource (
1461 IN EFI_HANDLE Handle
,
1462 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
**IoDev
,
1463 OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
**Descriptors
1467 This function get the next bus range of given address space descriptors.
1468 It also moves the pointer backward a node, to get prepared to be called
1471 @param[in, out] Descriptors Points to current position of a serial of address space
1473 @param[out] MinBus The lower range of bus number.
1474 @param[out] MaxBus The upper range of bus number.
1475 @param[out] IsEnd Meet end of the serial of descriptors.
1477 @retval EFI_SUCCESS The command completed successfully.
1480 PciGetNextBusRange (
1481 IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
**Descriptors
,
1488 Explain the data in PCI configuration space. The part which is common for
1489 PCI device and bridge is interpreted in this function. It calls other
1490 functions to interpret data unique for device or bridge.
1492 @param[in] ConfigSpace Data in PCI configuration space.
1493 @param[in] Address Address used to access configuration space of this PCI device.
1494 @param[in] IoDev Handle used to access configuration space of PCI device.
1496 @retval EFI_SUCCESS The command completed successfully.
1500 IN PCI_CONFIG_SPACE
*ConfigSpace
,
1502 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
1503 IN CONST UINT16 EnhancedDump
1507 Explain the device specific part of data in PCI configuration space.
1509 @param[in] Device Data in PCI configuration space.
1510 @param[in] Address Address used to access configuration space of this PCI device.
1511 @param[in] IoDev Handle used to access configuration space of PCI device.
1513 @retval EFI_SUCCESS The command completed successfully.
1516 PciExplainDeviceData (
1517 IN PCI_DEVICE_HEADER
*Device
,
1519 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
1523 Explain the bridge specific part of data in PCI configuration space.
1525 @param[in] Bridge Bridge specific data region in PCI configuration space.
1526 @param[in] Address Address used to access configuration space of this PCI device.
1527 @param[in] IoDev Handle used to access configuration space of PCI device.
1529 @retval EFI_SUCCESS The command completed successfully.
1532 PciExplainBridgeData (
1533 IN PCI_BRIDGE_HEADER
*Bridge
,
1535 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
1539 Explain the Base Address Register(Bar) in PCI configuration space.
1541 @param[in] Bar Points to the Base Address Register intended to interpret.
1542 @param[in] Command Points to the register Command.
1543 @param[in] Address Address used to access configuration space of this PCI device.
1544 @param[in] IoDev Handle used to access configuration space of PCI device.
1545 @param[in, out] Index The Index.
1547 @retval EFI_SUCCESS The command completed successfully.
1554 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
1559 Explain the cardbus specific part of data in PCI configuration space.
1561 @param[in] CardBus CardBus specific region of PCI configuration space.
1562 @param[in] Address Address used to access configuration space of this PCI device.
1563 @param[in] IoDev Handle used to access configuration space of PCI device.
1565 @retval EFI_SUCCESS The command completed successfully.
1568 PciExplainCardBusData (
1569 IN PCI_CARDBUS_HEADER
*CardBus
,
1571 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
1575 Explain each meaningful bit of register Status. The definition of Status is
1576 slightly different depending on the PCI header type.
1578 @param[in] Status Points to the content of register Status.
1579 @param[in] MainStatus Indicates if this register is main status(not secondary
1581 @param[in] HeaderType Header type of this PCI device.
1583 @retval EFI_SUCCESS The command completed successfully.
1588 IN BOOLEAN MainStatus
,
1589 IN PCI_HEADER_TYPE HeaderType
1593 Explain each meaningful bit of register Command.
1595 @param[in] Command Points to the content of register Command.
1597 @retval EFI_SUCCESS The command completed successfully.
1605 Explain each meaningful bit of register Bridge Control.
1607 @param[in] BridgeControl Points to the content of register Bridge Control.
1608 @param[in] HeaderType The headertype.
1610 @retval EFI_SUCCESS The command completed successfully.
1613 PciExplainBridgeControl (
1614 IN UINT16
*BridgeControl
,
1615 IN PCI_HEADER_TYPE HeaderType
1619 Print each capability structure.
1621 @param[in] IoDev The pointer to the deivce.
1622 @param[in] Address The address to start at.
1623 @param[in] CapPtr The offset from the address.
1625 @retval EFI_SUCCESS The operation was successful.
1628 PciExplainCapabilityStruct (
1629 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
1632 IN CONST UINT16 EnhancedDump
1636 Display Pcie device structure.
1638 @param[in] IoDev The pointer to the root pci protocol.
1639 @param[in] Address The Address to start at.
1640 @param[in] CapabilityPtr The offset from the address to start.
1643 PciExplainPciExpress (
1644 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
1646 IN UINT8 CapabilityPtr
,
1647 IN CONST UINT16 EnhancedDump
1651 Print out information of the capability information.
1653 @param[in] PciExpressCap The pointer to the structure about the device.
1655 @retval EFI_SUCCESS The operation was successful.
1659 IN PCIE_CAP_STURCTURE
*PciExpressCap
1663 Print out information of the device capability information.
1665 @param[in] PciExpressCap The pointer to the structure about the device.
1667 @retval EFI_SUCCESS The operation was successful.
1670 ExplainPcieDeviceCap (
1671 IN PCIE_CAP_STURCTURE
*PciExpressCap
1675 Print out information of the device control information.
1677 @param[in] PciExpressCap The pointer to the structure about the device.
1679 @retval EFI_SUCCESS The operation was successful.
1682 ExplainPcieDeviceControl (
1683 IN PCIE_CAP_STURCTURE
*PciExpressCap
1687 Print out information of the device status information.
1689 @param[in] PciExpressCap The pointer to the structure about the device.
1691 @retval EFI_SUCCESS The operation was successful.
1694 ExplainPcieDeviceStatus (
1695 IN PCIE_CAP_STURCTURE
*PciExpressCap
1699 Print out information of the device link information.
1701 @param[in] PciExpressCap The pointer to the structure about the device.
1703 @retval EFI_SUCCESS The operation was successful.
1706 ExplainPcieLinkCap (
1707 IN PCIE_CAP_STURCTURE
*PciExpressCap
1711 Print out information of the device link control information.
1713 @param[in] PciExpressCap The pointer to the structure about the device.
1715 @retval EFI_SUCCESS The operation was successful.
1718 ExplainPcieLinkControl (
1719 IN PCIE_CAP_STURCTURE
*PciExpressCap
1723 Print out information of the device link status information.
1725 @param[in] PciExpressCap The pointer to the structure about the device.
1727 @retval EFI_SUCCESS The operation was successful.
1730 ExplainPcieLinkStatus (
1731 IN PCIE_CAP_STURCTURE
*PciExpressCap
1735 Print out information of the device slot information.
1737 @param[in] PciExpressCap The pointer to the structure about the device.
1739 @retval EFI_SUCCESS The operation was successful.
1742 ExplainPcieSlotCap (
1743 IN PCIE_CAP_STURCTURE
*PciExpressCap
1747 Print out information of the device slot control information.
1749 @param[in] PciExpressCap The pointer to the structure about the device.
1751 @retval EFI_SUCCESS The operation was successful.
1754 ExplainPcieSlotControl (
1755 IN PCIE_CAP_STURCTURE
*PciExpressCap
1759 Print out information of the device slot status information.
1761 @param[in] PciExpressCap The pointer to the structure about the device.
1763 @retval EFI_SUCCESS The operation was successful.
1766 ExplainPcieSlotStatus (
1767 IN PCIE_CAP_STURCTURE
*PciExpressCap
1771 Print out information of the device root information.
1773 @param[in] PciExpressCap The pointer to the structure about the device.
1775 @retval EFI_SUCCESS The operation was successful.
1778 ExplainPcieRootControl (
1779 IN PCIE_CAP_STURCTURE
*PciExpressCap
1783 Print out information of the device root capability information.
1785 @param[in] PciExpressCap The pointer to the structure about the device.
1787 @retval EFI_SUCCESS The operation was successful.
1790 ExplainPcieRootCap (
1791 IN PCIE_CAP_STURCTURE
*PciExpressCap
1795 Print out information of the device root status information.
1797 @param[in] PciExpressCap The pointer to the structure about the device.
1799 @retval EFI_SUCCESS The operation was successful.
1802 ExplainPcieRootStatus (
1803 IN PCIE_CAP_STURCTURE
*PciExpressCap
1806 typedef EFI_STATUS (*PCIE_EXPLAIN_FUNCTION
) (IN PCIE_CAP_STURCTURE
*PciExpressCap
);
1812 } PCIE_CAPREG_FIELD_WIDTH
;
1815 PcieExplainTypeCommon
,
1816 PcieExplainTypeDevice
,
1817 PcieExplainTypeLink
,
1818 PcieExplainTypeSlot
,
1819 PcieExplainTypeRoot
,
1821 } PCIE_EXPLAIN_TYPE
;
1827 PCIE_CAPREG_FIELD_WIDTH Width
;
1828 PCIE_EXPLAIN_FUNCTION Func
;
1829 PCIE_EXPLAIN_TYPE Type
;
1830 } PCIE_EXPLAIN_STRUCT
;
1832 PCIE_EXPLAIN_STRUCT PcieExplainList
[] = {
1834 STRING_TOKEN (STR_PCIEX_CAPABILITY_CAPID
),
1838 PcieExplainTypeCommon
1841 STRING_TOKEN (STR_PCIEX_NEXTCAP_PTR
),
1845 PcieExplainTypeCommon
1848 STRING_TOKEN (STR_PCIEX_CAP_REGISTER
),
1852 PcieExplainTypeCommon
1855 STRING_TOKEN (STR_PCIEX_DEVICE_CAP
),
1858 ExplainPcieDeviceCap
,
1859 PcieExplainTypeDevice
1862 STRING_TOKEN (STR_PCIEX_DEVICE_CONTROL
),
1865 ExplainPcieDeviceControl
,
1866 PcieExplainTypeDevice
1869 STRING_TOKEN (STR_PCIEX_DEVICE_STATUS
),
1872 ExplainPcieDeviceStatus
,
1873 PcieExplainTypeDevice
1876 STRING_TOKEN (STR_PCIEX_LINK_CAPABILITIES
),
1883 STRING_TOKEN (STR_PCIEX_LINK_CONTROL
),
1886 ExplainPcieLinkControl
,
1890 STRING_TOKEN (STR_PCIEX_LINK_STATUS
),
1893 ExplainPcieLinkStatus
,
1897 STRING_TOKEN (STR_PCIEX_SLOT_CAPABILITIES
),
1904 STRING_TOKEN (STR_PCIEX_SLOT_CONTROL
),
1907 ExplainPcieSlotControl
,
1911 STRING_TOKEN (STR_PCIEX_SLOT_STATUS
),
1914 ExplainPcieSlotStatus
,
1918 STRING_TOKEN (STR_PCIEX_ROOT_CONTROL
),
1921 ExplainPcieRootControl
,
1925 STRING_TOKEN (STR_PCIEX_RSVDP
),
1932 STRING_TOKEN (STR_PCIEX_ROOT_STATUS
),
1935 ExplainPcieRootStatus
,
1941 (PCIE_CAPREG_FIELD_WIDTH
)0,
1950 PCI_CONFIG_SPACE
*mConfigSpace
= NULL
;
1951 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
1957 CHAR16
*DevicePortTypeTable
[] = {
1958 L
"PCI Express Endpoint",
1959 L
"Legacy PCI Express Endpoint",
1962 L
"Root Port of PCI Express Root Complex",
1963 L
"Upstream Port of PCI Express Switch",
1964 L
"Downstream Port of PCI Express Switch",
1965 L
"PCI Express to PCI/PCI-X Bridge",
1966 L
"PCI/PCI-X to PCI Express Bridge",
1967 L
"Root Complex Integrated Endpoint",
1968 L
"Root Complex Event Collector"
1971 CHAR16
*L0sLatencyStrTable
[] = {
1973 L
"64ns to less than 128ns",
1974 L
"128ns to less than 256ns",
1975 L
"256ns to less than 512ns",
1976 L
"512ns to less than 1us",
1977 L
"1us to less than 2us",
1982 CHAR16
*L1LatencyStrTable
[] = {
1984 L
"1us to less than 2us",
1985 L
"2us to less than 4us",
1986 L
"4us to less than 8us",
1987 L
"8us to less than 16us",
1988 L
"16us to less than 32us",
1993 CHAR16
*ASPMCtrlStrTable
[] = {
1995 L
"L0s Entry Enabled",
1996 L
"L1 Entry Enabled",
1997 L
"L0s and L1 Entry Enabled"
2000 CHAR16
*SlotPwrLmtScaleTable
[] = {
2007 CHAR16
*IndicatorTable
[] = {
2016 Function for 'pci' command.
2018 @param[in] ImageHandle Handle to the Image (NULL if Internal).
2019 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
2023 ShellCommandRunPci (
2024 IN EFI_HANDLE ImageHandle
,
2025 IN EFI_SYSTEM_TABLE
*SystemTable
2033 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
;
2035 PCI_COMMON_HEADER PciHeader
;
2036 PCI_CONFIG_SPACE ConfigSpace
;
2040 BOOLEAN ExplainData
;
2044 UINTN HandleBufSize
;
2045 EFI_HANDLE
*HandleBuf
;
2047 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Descriptors
;
2051 LIST_ENTRY
*Package
;
2052 CHAR16
*ProblemParam
;
2053 SHELL_STATUS ShellStatus
;
2056 UINT16 EnhancedDump
;
2058 ShellStatus
= SHELL_SUCCESS
;
2059 Status
= EFI_SUCCESS
;
2066 // initialize the shell lib (we must be in non-auto-init...)
2068 Status
= ShellInitialize();
2069 ASSERT_EFI_ERROR(Status
);
2071 Status
= CommandInit();
2072 ASSERT_EFI_ERROR(Status
);
2075 // parse the command line
2077 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
2078 if (EFI_ERROR(Status
)) {
2079 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
2080 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, ProblemParam
);
2081 FreePool(ProblemParam
);
2082 ShellStatus
= SHELL_INVALID_PARAMETER
;
2088 if (ShellCommandLineGetCount(Package
) == 2) {
2089 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDebug1HiiHandle
);
2090 ShellStatus
= SHELL_INVALID_PARAMETER
;
2094 if (ShellCommandLineGetCount(Package
) > 4) {
2095 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
);
2096 ShellStatus
= SHELL_INVALID_PARAMETER
;
2099 if (ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetValue(Package
, L
"-s") == NULL
) {
2100 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDebug1HiiHandle
, L
"-s");
2101 ShellStatus
= SHELL_INVALID_PARAMETER
;
2105 // Get all instances of PciRootBridgeIo. Allocate space for 1 EFI_HANDLE and
2106 // call LibLocateHandle(), if EFI_BUFFER_TOO_SMALL is returned, allocate enough
2107 // space for handles and call it again.
2109 HandleBufSize
= sizeof (EFI_HANDLE
);
2110 HandleBuf
= (EFI_HANDLE
*) AllocateZeroPool (HandleBufSize
);
2111 if (HandleBuf
== NULL
) {
2112 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_OUT_MEM
), gShellDebug1HiiHandle
);
2113 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
2117 Status
= gBS
->LocateHandle (
2119 &gEfiPciRootBridgeIoProtocolGuid
,
2125 if (Status
== EFI_BUFFER_TOO_SMALL
) {
2126 HandleBuf
= ReallocatePool (sizeof (EFI_HANDLE
), HandleBufSize
, HandleBuf
);
2127 if (HandleBuf
== NULL
) {
2128 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_OUT_MEM
), gShellDebug1HiiHandle
);
2129 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
2133 Status
= gBS
->LocateHandle (
2135 &gEfiPciRootBridgeIoProtocolGuid
,
2142 if (EFI_ERROR (Status
)) {
2143 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PCIRBIO_NF
), gShellDebug1HiiHandle
);
2144 ShellStatus
= SHELL_NOT_FOUND
;
2148 HandleCount
= HandleBufSize
/ sizeof (EFI_HANDLE
);
2150 // Argument Count == 1(no other argument): enumerate all pci functions
2152 if (ShellCommandLineGetCount(Package
) == 1) {
2153 gST
->ConOut
->QueryMode (
2155 gST
->ConOut
->Mode
->Mode
,
2162 if ((ScreenSize
& 1) == 1) {
2169 // For each handle, which decides a segment and a bus number range,
2170 // enumerate all devices on it.
2172 for (Index
= 0; Index
< HandleCount
; Index
++) {
2173 Status
= PciGetProtocolAndResource (
2178 if (EFI_ERROR (Status
)) {
2179 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_HANDLE_CFG_ERR
), gShellDebug1HiiHandle
, Status
);
2180 ShellStatus
= SHELL_NOT_FOUND
;
2184 // No document say it's impossible for a RootBridgeIo protocol handle
2185 // to have more than one address space descriptors, so find out every
2186 // bus range and for each of them do device enumeration.
2189 Status
= PciGetNextBusRange (&Descriptors
, &MinBus
, &MaxBus
, &IsEnd
);
2191 if (EFI_ERROR (Status
)) {
2192 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_BUS_RANGE_ERR
), gShellDebug1HiiHandle
, Status
);
2193 ShellStatus
= SHELL_NOT_FOUND
;
2201 for (Bus
= MinBus
; Bus
<= MaxBus
; Bus
++) {
2203 // For each devices, enumerate all functions it contains
2205 for (Device
= 0; Device
<= PCI_MAX_DEVICE
; Device
++) {
2207 // For each function, read its configuration space and print summary
2209 for (Func
= 0; Func
<= PCI_MAX_FUNC
; Func
++) {
2210 if (ShellGetExecutionBreakFlag ()) {
2211 ShellStatus
= SHELL_ABORTED
;
2214 Address
= CALC_EFI_PCI_ADDRESS (Bus
, Device
, Func
, 0);
2224 // If VendorId = 0xffff, there does not exist a device at this
2225 // location. For each device, if there is any function on it,
2226 // there must be 1 function at Function 0. So if Func = 0, there
2227 // will be no more functions in the same device, so we can break
2228 // loop to deal with the next device.
2230 if (PciHeader
.VendorId
== 0xffff && Func
== 0) {
2234 if (PciHeader
.VendorId
!= 0xffff) {
2237 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_TITLE
), gShellDebug1HiiHandle
);
2245 sizeof (PciHeader
) / sizeof (UINT32
),
2250 -1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_P1
), gShellDebug1HiiHandle
,
2251 IoDev
->SegmentNumber
,
2257 PciPrintClassCode (PciHeader
.ClassCode
, FALSE
);
2259 -1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_P2
), gShellDebug1HiiHandle
,
2262 PciHeader
.ClassCode
[0]
2266 if (ScreenCount
>= ScreenSize
&& ScreenSize
!= 0) {
2268 // If ScreenSize == 0 we have the console redirected so don't
2274 // If this is not a multi-function device, we can leave the loop
2275 // to deal with the next device.
2277 if (Func
== 0 && ((PciHeader
.HeaderType
& HEADER_TYPE_MULTI_FUNCTION
) == 0x00)) {
2285 // If Descriptor is NULL, Configuration() returns EFI_UNSUPPRORED,
2286 // we assume the bus range is 0~PCI_MAX_BUS. After enumerated all
2287 // devices on all bus, we can leave loop.
2289 if (Descriptors
== NULL
) {
2295 Status
= EFI_SUCCESS
;
2299 ExplainData
= FALSE
;
2304 if (ShellCommandLineGetFlag(Package
, L
"-i")) {
2308 Temp
= ShellCommandLineGetValue(Package
, L
"-s");
2311 // Input converted to hexadecimal number.
2313 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp
, &RetVal
, TRUE
, TRUE
))) {
2314 Segment
= (UINT16
) RetVal
;
2316 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV_HEX
), gShellDebug1HiiHandle
);
2317 ShellStatus
= SHELL_INVALID_PARAMETER
;
2323 // The first Argument(except "-i") is assumed to be Bus number, second
2324 // to be Device number, and third to be Func number.
2326 Temp
= ShellCommandLineGetRawValue(Package
, 1);
2329 // Input converted to hexadecimal number.
2331 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp
, &RetVal
, TRUE
, TRUE
))) {
2332 Bus
= (UINT16
) RetVal
;
2334 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV_HEX
), gShellDebug1HiiHandle
);
2335 ShellStatus
= SHELL_INVALID_PARAMETER
;
2339 if (Bus
> MAX_BUS_NUMBER
) {
2340 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
2341 ShellStatus
= SHELL_INVALID_PARAMETER
;
2345 Temp
= ShellCommandLineGetRawValue(Package
, 2);
2348 // Input converted to hexadecimal number.
2350 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp
, &RetVal
, TRUE
, TRUE
))) {
2351 Device
= (UINT16
) RetVal
;
2353 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV_HEX
), gShellDebug1HiiHandle
);
2354 ShellStatus
= SHELL_INVALID_PARAMETER
;
2358 if (Device
> MAX_DEVICE_NUMBER
){
2359 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
2360 ShellStatus
= SHELL_INVALID_PARAMETER
;
2365 Temp
= ShellCommandLineGetRawValue(Package
, 3);
2368 // Input converted to hexadecimal number.
2370 if (!EFI_ERROR (ShellConvertStringToUint64 (Temp
, &RetVal
, TRUE
, TRUE
))) {
2371 Func
= (UINT16
) RetVal
;
2373 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_INV_HEX
), gShellDebug1HiiHandle
);
2374 ShellStatus
= SHELL_INVALID_PARAMETER
;
2378 if (Func
> MAX_FUNCTION_NUMBER
){
2379 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, Temp
);
2380 ShellStatus
= SHELL_INVALID_PARAMETER
;
2386 // Find the protocol interface who's in charge of current segment, and its
2387 // bus range covers the current bus
2389 Status
= PciFindProtocolInterface (
2397 if (EFI_ERROR (Status
)) {
2399 -1, -1, NULL
, STRING_TOKEN (STR_PCI_NO_FIND
), gShellDebug1HiiHandle
,
2403 ShellStatus
= SHELL_NOT_FOUND
;
2407 Address
= CALC_EFI_PCI_ADDRESS (Bus
, Device
, Func
, 0);
2408 Status
= IoDev
->Pci
.Read (
2412 sizeof (ConfigSpace
),
2416 if (EFI_ERROR (Status
)) {
2417 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_NO_CFG
), gShellDebug1HiiHandle
, Status
);
2418 ShellStatus
= SHELL_ACCESS_DENIED
;
2422 mConfigSpace
= &ConfigSpace
;
2427 STRING_TOKEN (STR_PCI_INFO
),
2428 gShellDebug1HiiHandle
,
2440 // Dump standard header of configuration space
2442 SizeOfHeader
= sizeof (ConfigSpace
.Common
) + sizeof (ConfigSpace
.NonCommon
);
2444 DumpHex (2, 0, SizeOfHeader
, &ConfigSpace
);
2445 ShellPrintEx(-1,-1, L
"\r\n");
2448 // Dump device dependent Part of configuration space
2453 sizeof (ConfigSpace
) - SizeOfHeader
,
2458 // If "-i" appears in command line, interpret data in configuration space
2462 if (ShellCommandLineGetFlag(Package
, L
"-_e")) {
2463 EnhancedDump
= 0xFFFF;
2464 Temp
= ShellCommandLineGetValue(Package
, L
"-_e");
2466 EnhancedDump
= (UINT16
) ShellHexStrToUintn (Temp
);
2469 Status
= PciExplainData (&ConfigSpace
, Address
, IoDev
, EnhancedDump
);
2473 if (HandleBuf
!= NULL
) {
2474 FreePool (HandleBuf
);
2476 if (Package
!= NULL
) {
2477 ShellCommandLineFreeVarList (Package
);
2479 mConfigSpace
= NULL
;
2484 This function finds out the protocol which is in charge of the given
2485 segment, and its bus range covers the current bus number. It lookes
2486 each instances of RootBridgeIoProtocol handle, until the one meets the
2489 @param[in] HandleBuf Buffer which holds all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.
2490 @param[in] HandleCount Count of all PCI_ROOT_BRIDIGE_IO_PROTOCOL handles.
2491 @param[in] Segment Segment number of device we are dealing with.
2492 @param[in] Bus Bus number of device we are dealing with.
2493 @param[out] IoDev Handle used to access configuration space of PCI device.
2495 @retval EFI_SUCCESS The command completed successfully.
2496 @retval EFI_INVALID_PARAMETER Invalid parameter.
2500 PciFindProtocolInterface (
2501 IN EFI_HANDLE
*HandleBuf
,
2502 IN UINTN HandleCount
,
2505 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
**IoDev
2510 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
*Descriptors
;
2516 // Go through all handles, until the one meets the criteria is found
2518 for (Index
= 0; Index
< HandleCount
; Index
++) {
2519 Status
= PciGetProtocolAndResource (HandleBuf
[Index
], IoDev
, &Descriptors
);
2520 if (EFI_ERROR (Status
)) {
2524 // When Descriptors == NULL, the Configuration() is not implemented,
2525 // so we only check the Segment number
2527 if (Descriptors
== NULL
&& Segment
== (*IoDev
)->SegmentNumber
) {
2531 if ((*IoDev
)->SegmentNumber
!= Segment
) {
2536 Status
= PciGetNextBusRange (&Descriptors
, &MinBus
, &MaxBus
, &IsEnd
);
2537 if (EFI_ERROR (Status
)) {
2545 if (MinBus
<= Bus
&& MaxBus
>= Bus
) {
2551 return EFI_NOT_FOUND
;
2555 This function gets the protocol interface from the given handle, and
2556 obtains its address space descriptors.
2558 @param[in] Handle The PCI_ROOT_BRIDIGE_IO_PROTOCOL handle.
2559 @param[out] IoDev Handle used to access configuration space of PCI device.
2560 @param[out] Descriptors Points to the address space descriptors.
2562 @retval EFI_SUCCESS The command completed successfully
2565 PciGetProtocolAndResource (
2566 IN EFI_HANDLE Handle
,
2567 OUT EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
**IoDev
,
2568 OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
**Descriptors
2574 // Get inferface from protocol
2576 Status
= gBS
->HandleProtocol (
2578 &gEfiPciRootBridgeIoProtocolGuid
,
2582 if (EFI_ERROR (Status
)) {
2586 // Call Configuration() to get address space descriptors
2588 Status
= (*IoDev
)->Configuration (*IoDev
, (VOID
**)Descriptors
);
2589 if (Status
== EFI_UNSUPPORTED
) {
2590 *Descriptors
= NULL
;
2599 This function get the next bus range of given address space descriptors.
2600 It also moves the pointer backward a node, to get prepared to be called
2603 @param[in, out] Descriptors Points to current position of a serial of address space
2605 @param[out] MinBus The lower range of bus number.
2606 @param[out] MaxBus The upper range of bus number.
2607 @param[out] IsEnd Meet end of the serial of descriptors.
2609 @retval EFI_SUCCESS The command completed successfully.
2612 PciGetNextBusRange (
2613 IN OUT EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
**Descriptors
,
2622 // When *Descriptors is NULL, Configuration() is not implemented, so assume
2623 // range is 0~PCI_MAX_BUS
2625 if ((*Descriptors
) == NULL
) {
2627 *MaxBus
= PCI_MAX_BUS
;
2631 // *Descriptors points to one or more address space descriptors, which
2632 // ends with a end tagged descriptor. Examine each of the descriptors,
2633 // if a bus typed one is found and its bus range covers bus, this handle
2634 // is the handle we are looking for.
2637 while ((*Descriptors
)->Desc
!= ACPI_END_TAG_DESCRIPTOR
) {
2638 if ((*Descriptors
)->ResType
== ACPI_ADDRESS_SPACE_TYPE_BUS
) {
2639 *MinBus
= (UINT16
) (*Descriptors
)->AddrRangeMin
;
2640 *MaxBus
= (UINT16
) (*Descriptors
)->AddrRangeMax
;
2642 return (EFI_SUCCESS
);
2648 if ((*Descriptors
)->Desc
== ACPI_END_TAG_DESCRIPTOR
) {
2656 Explain the data in PCI configuration space. The part which is common for
2657 PCI device and bridge is interpreted in this function. It calls other
2658 functions to interpret data unique for device or bridge.
2660 @param[in] ConfigSpace Data in PCI configuration space.
2661 @param[in] Address Address used to access configuration space of this PCI device.
2662 @param[in] IoDev Handle used to access configuration space of PCI device.
2664 @retval EFI_SUCCESS The command completed successfully.
2668 IN PCI_CONFIG_SPACE
*ConfigSpace
,
2670 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
2671 IN CONST UINT16 EnhancedDump
2674 PCI_COMMON_HEADER
*Common
;
2675 PCI_HEADER_TYPE HeaderType
;
2679 Common
= &(ConfigSpace
->Common
);
2681 ShellPrintEx (-1, -1, L
"\r\n");
2684 // Print Vendor Id and Device Id
2686 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_VID_DID
), gShellDebug1HiiHandle
,
2687 INDEX_OF (&(Common
->VendorId
)),
2689 INDEX_OF (&(Common
->DeviceId
)),
2694 // Print register Command
2696 PciExplainCommand (&(Common
->Command
));
2699 // Print register Status
2701 PciExplainStatus (&(Common
->Status
), TRUE
, PciUndefined
);
2704 // Print register Revision ID
2706 ShellPrintEx(-1, -1, L
"\r\n");
2707 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_RID
), gShellDebug1HiiHandle
,
2708 INDEX_OF (&(Common
->RevisionId
)),
2713 // Print register BIST
2715 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_BIST
), gShellDebug1HiiHandle
, INDEX_OF (&(Common
->Bist
)));
2716 if ((Common
->Bist
& PCI_BIT_7
) != 0) {
2717 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_CAP
), gShellDebug1HiiHandle
, 0x0f & Common
->Bist
);
2719 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_PCI_LINE_CAP_NO
), gShellDebug1HiiHandle
);
2722 // Print register Cache Line Size
2724 ShellPrintHiiEx(-1, -1, NULL
,
2725 STRING_TOKEN (STR_PCI2_CACHE_LINE_SIZE
),
2726 gShellDebug1HiiHandle
,
2727 INDEX_OF (&(Common
->CacheLineSize
)),
2728 Common
->CacheLineSize
2732 // Print register Latency Timer
2734 ShellPrintHiiEx(-1, -1, NULL
,
2735 STRING_TOKEN (STR_PCI2_LATENCY_TIMER
),
2736 gShellDebug1HiiHandle
,
2737 INDEX_OF (&(Common
->PrimaryLatencyTimer
)),
2738 Common
->PrimaryLatencyTimer
2742 // Print register Header Type
2744 ShellPrintHiiEx(-1, -1, NULL
,
2745 STRING_TOKEN (STR_PCI2_HEADER_TYPE
),
2746 gShellDebug1HiiHandle
,
2747 INDEX_OF (&(Common
->HeaderType
)),
2751 if ((Common
->HeaderType
& PCI_BIT_7
) != 0) {
2752 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MULTI_FUNCTION
), gShellDebug1HiiHandle
);
2755 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_SINGLE_FUNCTION
), gShellDebug1HiiHandle
);
2758 HeaderType
= (PCI_HEADER_TYPE
)(UINT8
) (Common
->HeaderType
& 0x7f);
2759 switch (HeaderType
) {
2761 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_PCI_DEVICE
), gShellDebug1HiiHandle
);
2765 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_P2P_BRIDGE
), gShellDebug1HiiHandle
);
2768 case PciCardBusBridge
:
2769 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_CARDBUS_BRIDGE
), gShellDebug1HiiHandle
);
2773 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RESERVED
), gShellDebug1HiiHandle
);
2774 HeaderType
= PciUndefined
;
2778 // Print register Class Code
2780 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_CLASS
), gShellDebug1HiiHandle
);
2781 PciPrintClassCode ((UINT8
*) Common
->ClassCode
, TRUE
);
2782 ShellPrintEx (-1, -1, L
"\r\n");
2784 if (ShellGetExecutionBreakFlag()) {
2789 // Interpret remaining part of PCI configuration header depending on
2793 Status
= EFI_SUCCESS
;
2794 switch (HeaderType
) {
2796 Status
= PciExplainDeviceData (
2797 &(ConfigSpace
->NonCommon
.Device
),
2801 CapPtr
= ConfigSpace
->NonCommon
.Device
.CapabilitiesPtr
;
2805 Status
= PciExplainBridgeData (
2806 &(ConfigSpace
->NonCommon
.Bridge
),
2810 CapPtr
= ConfigSpace
->NonCommon
.Bridge
.CapabilitiesPtr
;
2813 case PciCardBusBridge
:
2814 Status
= PciExplainCardBusData (
2815 &(ConfigSpace
->NonCommon
.CardBus
),
2819 CapPtr
= ConfigSpace
->NonCommon
.CardBus
.CapabilitiesPtr
;
2826 // If Status bit4 is 1, dump or explain capability structure
2828 if ((Common
->Status
) & EFI_PCI_STATUS_CAPABILITY
) {
2829 PciExplainCapabilityStruct (IoDev
, Address
, CapPtr
, EnhancedDump
);
2836 Explain the device specific part of data in PCI configuration space.
2838 @param[in] Device Data in PCI configuration space.
2839 @param[in] Address Address used to access configuration space of this PCI device.
2840 @param[in] IoDev Handle used to access configuration space of PCI device.
2842 @retval EFI_SUCCESS The command completed successfully.
2845 PciExplainDeviceData (
2846 IN PCI_DEVICE_HEADER
*Device
,
2848 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
2857 // Print Base Address Registers(Bar). When Bar = 0, this Bar does not
2858 // exist. If these no Bar for this function, print "none", otherwise
2859 // list detail information about this Bar.
2861 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BASE_ADDR
), gShellDebug1HiiHandle
, INDEX_OF (Device
->Bar
));
2864 BarCount
= sizeof (Device
->Bar
) / sizeof (Device
->Bar
[0]);
2865 for (Index
= 0; Index
< BarCount
; Index
++) {
2866 if (Device
->Bar
[Index
] == 0) {
2872 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_START_TYPE
), gShellDebug1HiiHandle
);
2873 ShellPrintEx (-1, -1, L
" --------------------------------------------------------------------------");
2876 Status
= PciExplainBar (
2877 &(Device
->Bar
[Index
]),
2878 &(mConfigSpace
->Common
.Command
),
2884 if (EFI_ERROR (Status
)) {
2890 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NONE
), gShellDebug1HiiHandle
);
2893 ShellPrintEx (-1, -1, L
"\r\n --------------------------------------------------------------------------");
2897 // Print register Expansion ROM Base Address
2899 if ((Device
->ROMBar
& PCI_BIT_0
) == 0) {
2900 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_EXPANSION_ROM_DISABLED
), gShellDebug1HiiHandle
, INDEX_OF (&(Device
->ROMBar
)));
2903 ShellPrintHiiEx(-1, -1, NULL
,
2904 STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE
),
2905 gShellDebug1HiiHandle
,
2906 INDEX_OF (&(Device
->ROMBar
)),
2911 // Print register Cardbus CIS ptr
2913 ShellPrintHiiEx(-1, -1, NULL
,
2914 STRING_TOKEN (STR_PCI2_CARDBUS_CIS
),
2915 gShellDebug1HiiHandle
,
2916 INDEX_OF (&(Device
->CardBusCISPtr
)),
2917 Device
->CardBusCISPtr
2921 // Print register Sub-vendor ID and subsystem ID
2923 ShellPrintHiiEx(-1, -1, NULL
,
2924 STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID
),
2925 gShellDebug1HiiHandle
,
2926 INDEX_OF (&(Device
->SubVendorId
)),
2930 ShellPrintHiiEx(-1, -1, NULL
,
2931 STRING_TOKEN (STR_PCI2_SUBSYSTEM_ID
),
2932 gShellDebug1HiiHandle
,
2933 INDEX_OF (&(Device
->SubSystemId
)),
2938 // Print register Capabilities Ptr
2940 ShellPrintHiiEx(-1, -1, NULL
,
2941 STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR
),
2942 gShellDebug1HiiHandle
,
2943 INDEX_OF (&(Device
->CapabilitiesPtr
)),
2944 Device
->CapabilitiesPtr
2948 // Print register Interrupt Line and interrupt pin
2950 ShellPrintHiiEx(-1, -1, NULL
,
2951 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE
),
2952 gShellDebug1HiiHandle
,
2953 INDEX_OF (&(Device
->InterruptLine
)),
2954 Device
->InterruptLine
2957 ShellPrintHiiEx(-1, -1, NULL
,
2958 STRING_TOKEN (STR_PCI2_INTERRUPT_PIN
),
2959 gShellDebug1HiiHandle
,
2960 INDEX_OF (&(Device
->InterruptPin
)),
2961 Device
->InterruptPin
2965 // Print register Min_Gnt and Max_Lat
2967 ShellPrintHiiEx(-1, -1, NULL
,
2968 STRING_TOKEN (STR_PCI2_MIN_GNT
),
2969 gShellDebug1HiiHandle
,
2970 INDEX_OF (&(Device
->MinGnt
)),
2974 ShellPrintHiiEx(-1, -1, NULL
,
2975 STRING_TOKEN (STR_PCI2_MAX_LAT
),
2976 gShellDebug1HiiHandle
,
2977 INDEX_OF (&(Device
->MaxLat
)),
2985 Explain the bridge specific part of data in PCI configuration space.
2987 @param[in] Bridge Bridge specific data region in PCI configuration space.
2988 @param[in] Address Address used to access configuration space of this PCI device.
2989 @param[in] IoDev Handle used to access configuration space of PCI device.
2991 @retval EFI_SUCCESS The command completed successfully.
2994 PciExplainBridgeData (
2995 IN PCI_BRIDGE_HEADER
*Bridge
,
2997 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
3007 // Print Base Address Registers. When Bar = 0, this Bar does not
3008 // exist. If these no Bar for this function, print "none", otherwise
3009 // list detail information about this Bar.
3011 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BASE_ADDRESS
), gShellDebug1HiiHandle
, INDEX_OF (&(Bridge
->Bar
)));
3014 BarCount
= sizeof (Bridge
->Bar
) / sizeof (Bridge
->Bar
[0]);
3016 for (Index
= 0; Index
< BarCount
; Index
++) {
3017 if (Bridge
->Bar
[Index
] == 0) {
3023 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_START_TYPE_2
), gShellDebug1HiiHandle
);
3024 ShellPrintEx (-1, -1, L
" --------------------------------------------------------------------------");
3027 Status
= PciExplainBar (
3028 &(Bridge
->Bar
[Index
]),
3029 &(mConfigSpace
->Common
.Command
),
3035 if (EFI_ERROR (Status
)) {
3041 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NONE
), gShellDebug1HiiHandle
);
3043 ShellPrintEx (-1, -1, L
"\r\n --------------------------------------------------------------------------");
3047 // Expansion register ROM Base Address
3049 if ((Bridge
->ROMBar
& PCI_BIT_0
) == 0) {
3050 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NO_EXPANSION_ROM
), gShellDebug1HiiHandle
, INDEX_OF (&(Bridge
->ROMBar
)));
3053 ShellPrintHiiEx(-1, -1, NULL
,
3054 STRING_TOKEN (STR_PCI2_EXPANSION_ROM_BASE_2
),
3055 gShellDebug1HiiHandle
,
3056 INDEX_OF (&(Bridge
->ROMBar
)),
3061 // Print Bus Numbers(Primary, Secondary, and Subordinate
3063 ShellPrintHiiEx(-1, -1, NULL
,
3064 STRING_TOKEN (STR_PCI2_BUS_NUMBERS
),
3065 gShellDebug1HiiHandle
,
3066 INDEX_OF (&(Bridge
->PrimaryBus
)),
3067 INDEX_OF (&(Bridge
->SecondaryBus
)),
3068 INDEX_OF (&(Bridge
->SubordinateBus
))
3071 ShellPrintEx (-1, -1, L
" ------------------------------------------------------\r\n");
3073 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BRIDGE
), gShellDebug1HiiHandle
, Bridge
->PrimaryBus
);
3074 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BRIDGE
), gShellDebug1HiiHandle
, Bridge
->SecondaryBus
);
3075 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BRIDGE
), gShellDebug1HiiHandle
, Bridge
->SubordinateBus
);
3078 // Print register Secondary Latency Timer
3080 ShellPrintHiiEx(-1, -1, NULL
,
3081 STRING_TOKEN (STR_PCI2_SECONDARY_TIMER
),
3082 gShellDebug1HiiHandle
,
3083 INDEX_OF (&(Bridge
->SecondaryLatencyTimer
)),
3084 Bridge
->SecondaryLatencyTimer
3088 // Print register Secondary Status
3090 PciExplainStatus (&(Bridge
->SecondaryStatus
), FALSE
, PciP2pBridge
);
3093 // Print I/O and memory ranges this bridge forwards. There are 3 resource
3094 // types: I/O, memory, and pre-fetchable memory. For each resource type,
3095 // base and limit address are listed.
3097 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RESOURCE_TYPE
), gShellDebug1HiiHandle
);
3098 ShellPrintEx (-1, -1, L
"----------------------------------------------------------------------\r\n");
3103 IoAddress32
= (Bridge
->IoBaseUpper
<< 16 | Bridge
->IoBase
<< 8);
3104 IoAddress32
&= 0xfffff000;
3105 ShellPrintHiiEx(-1, -1, NULL
,
3106 STRING_TOKEN (STR_PCI2_TWO_VARS
),
3107 gShellDebug1HiiHandle
,
3108 INDEX_OF (&(Bridge
->IoBase
)),
3112 IoAddress32
= (Bridge
->IoLimitUpper
<< 16 | Bridge
->IoLimit
<< 8);
3113 IoAddress32
|= 0x00000fff;
3114 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_ONE_VAR
), gShellDebug1HiiHandle
, IoAddress32
);
3117 // Memory Base & Limit
3119 ShellPrintHiiEx(-1, -1, NULL
,
3120 STRING_TOKEN (STR_PCI2_MEMORY
),
3121 gShellDebug1HiiHandle
,
3122 INDEX_OF (&(Bridge
->MemoryBase
)),
3123 (Bridge
->MemoryBase
<< 16) & 0xfff00000
3126 ShellPrintHiiEx(-1, -1, NULL
,
3127 STRING_TOKEN (STR_PCI2_ONE_VAR
),
3128 gShellDebug1HiiHandle
,
3129 (Bridge
->MemoryLimit
<< 16) | 0x000fffff
3133 // Pre-fetch-able Memory Base & Limit
3135 ShellPrintHiiEx(-1, -1, NULL
,
3136 STRING_TOKEN (STR_PCI2_PREFETCHABLE
),
3137 gShellDebug1HiiHandle
,
3138 INDEX_OF (&(Bridge
->PrefetchableMemBase
)),
3139 Bridge
->PrefetchableBaseUpper
,
3140 (Bridge
->PrefetchableMemBase
<< 16) & 0xfff00000
3143 ShellPrintHiiEx(-1, -1, NULL
,
3144 STRING_TOKEN (STR_PCI2_TWO_VARS_2
),
3145 gShellDebug1HiiHandle
,
3146 Bridge
->PrefetchableLimitUpper
,
3147 (Bridge
->PrefetchableMemLimit
<< 16) | 0x000fffff
3151 // Print register Capabilities Pointer
3153 ShellPrintHiiEx(-1, -1, NULL
,
3154 STRING_TOKEN (STR_PCI2_CAPABILITIES_PTR_2
),
3155 gShellDebug1HiiHandle
,
3156 INDEX_OF (&(Bridge
->CapabilitiesPtr
)),
3157 Bridge
->CapabilitiesPtr
3161 // Print register Bridge Control
3163 PciExplainBridgeControl (&(Bridge
->BridgeControl
), PciP2pBridge
);
3166 // Print register Interrupt Line & PIN
3168 ShellPrintHiiEx(-1, -1, NULL
,
3169 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_2
),
3170 gShellDebug1HiiHandle
,
3171 INDEX_OF (&(Bridge
->InterruptLine
)),
3172 Bridge
->InterruptLine
3175 ShellPrintHiiEx(-1, -1, NULL
,
3176 STRING_TOKEN (STR_PCI2_INTERRUPT_PIN
),
3177 gShellDebug1HiiHandle
,
3178 INDEX_OF (&(Bridge
->InterruptPin
)),
3179 Bridge
->InterruptPin
3186 Explain the Base Address Register(Bar) in PCI configuration space.
3188 @param[in] Bar Points to the Base Address Register intended to interpret.
3189 @param[in] Command Points to the register Command.
3190 @param[in] Address Address used to access configuration space of this PCI device.
3191 @param[in] IoDev Handle used to access configuration space of PCI device.
3192 @param[in, out] Index The Index.
3194 @retval EFI_SUCCESS The command completed successfully.
3201 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
3222 // According the bar type, list detail about this bar, for example: 32 or
3223 // 64 bits; pre-fetchable or not.
3225 if ((*Bar
& PCI_BIT_0
) == 0) {
3227 // This bar is of memory type
3231 if ((*Bar
& PCI_BIT_1
) == 0 && (*Bar
& PCI_BIT_2
) == 0) {
3232 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BAR
), gShellDebug1HiiHandle
, *Bar
& 0xfffffff0);
3233 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MEM
), gShellDebug1HiiHandle
);
3234 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_32_BITS
), gShellDebug1HiiHandle
);
3236 } else if ((*Bar
& PCI_BIT_1
) == 0 && (*Bar
& PCI_BIT_2
) != 0) {
3238 CopyMem (&Bar64
, Bar
, sizeof (UINT64
));
3239 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_ONE_VAR_2
), gShellDebug1HiiHandle
, (UINT32
) RShiftU64 ((Bar64
& 0xfffffffffffffff0ULL
), 32));
3240 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_ONE_VAR_3
), gShellDebug1HiiHandle
, (UINT32
) (Bar64
& 0xfffffffffffffff0ULL
));
3241 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MEM
), gShellDebug1HiiHandle
);
3242 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_64_BITS
), gShellDebug1HiiHandle
);
3250 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_BAR
), gShellDebug1HiiHandle
, *Bar
& 0xfffffff0);
3251 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MEM_2
), gShellDebug1HiiHandle
);
3254 if ((*Bar
& PCI_BIT_3
) == 0) {
3255 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NO
), gShellDebug1HiiHandle
);
3258 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_YES
), gShellDebug1HiiHandle
);
3263 // This bar is of io type
3266 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_ONE_VAR_4
), gShellDebug1HiiHandle
, *Bar
& 0xfffffffc);
3267 ShellPrintEx (-1, -1, L
"I/O ");
3271 // Get BAR length(or the amount of resource this bar demands for). To get
3272 // Bar length, first we should temporarily disable I/O and memory access
3273 // of this function(by set bits in the register Command), then write all
3274 // "1"s to this bar. The bar value read back is the amount of resource
3275 // this bar demands for.
3278 // Disable io & mem access
3280 OldCommand
= *Command
;
3281 NewCommand
= (UINT16
) (OldCommand
& 0xfffc);
3282 RegAddress
= Address
| INDEX_OF (Command
);
3283 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint16
, RegAddress
, 1, &NewCommand
);
3285 RegAddress
= Address
| INDEX_OF (Bar
);
3288 // Read after write the BAR to get the size
3292 NewBar32
= 0xffffffff;
3294 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint32
, RegAddress
, 1, &NewBar32
);
3295 IoDev
->Pci
.Read (IoDev
, EfiPciWidthUint32
, RegAddress
, 1, &NewBar32
);
3296 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint32
, RegAddress
, 1, &OldBar32
);
3299 NewBar32
= NewBar32
& 0xfffffff0;
3300 NewBar32
= (~NewBar32
) + 1;
3303 NewBar32
= NewBar32
& 0xfffffffc;
3304 NewBar32
= (~NewBar32
) + 1;
3305 NewBar32
= NewBar32
& 0x0000ffff;
3310 CopyMem (&OldBar64
, Bar
, sizeof (UINT64
));
3311 NewBar64
= 0xffffffffffffffffULL
;
3313 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint32
, RegAddress
, 2, &NewBar64
);
3314 IoDev
->Pci
.Read (IoDev
, EfiPciWidthUint32
, RegAddress
, 2, &NewBar64
);
3315 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint32
, RegAddress
, 2, &OldBar64
);
3318 NewBar64
= NewBar64
& 0xfffffffffffffff0ULL
;
3319 NewBar64
= (~NewBar64
) + 1;
3322 NewBar64
= NewBar64
& 0xfffffffffffffffcULL
;
3323 NewBar64
= (~NewBar64
) + 1;
3324 NewBar64
= NewBar64
& 0x000000000000ffff;
3328 // Enable io & mem access
3330 RegAddress
= Address
| INDEX_OF (Command
);
3331 IoDev
->Pci
.Write (IoDev
, EfiPciWidthUint16
, RegAddress
, 1, &OldCommand
);
3335 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NEWBAR_32
), gShellDebug1HiiHandle
, NewBar32
);
3336 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NEWBAR_32_2
), gShellDebug1HiiHandle
, NewBar32
+ (*Bar
& 0xfffffff0) - 1);
3339 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RSHIFT
), gShellDebug1HiiHandle
, (UINT32
) RShiftU64 (NewBar64
, 32));
3340 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RSHIFT
), gShellDebug1HiiHandle
, (UINT32
) NewBar64
);
3341 ShellPrintEx (-1, -1, L
" ");
3342 ShellPrintHiiEx(-1, -1, NULL
,
3343 STRING_TOKEN (STR_PCI2_RSHIFT
),
3344 gShellDebug1HiiHandle
,
3345 (UINT32
) RShiftU64 ((NewBar64
+ (Bar64
& 0xfffffffffffffff0ULL
) - 1), 32)
3347 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RSHIFT
), gShellDebug1HiiHandle
, (UINT32
) (NewBar64
+ (Bar64
& 0xfffffffffffffff0ULL
) - 1));
3351 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NEWBAR_32_3
), gShellDebug1HiiHandle
, NewBar32
);
3352 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NEWBAR_32_4
), gShellDebug1HiiHandle
, NewBar32
+ (*Bar
& 0xfffffffc) - 1);
3359 Explain the cardbus specific part of data in PCI configuration space.
3361 @param[in] CardBus CardBus specific region of PCI configuration space.
3362 @param[in] Address Address used to access configuration space of this PCI device.
3363 @param[in] IoDev Handle used to access configuration space of PCI device.
3365 @retval EFI_SUCCESS The command completed successfully.
3368 PciExplainCardBusData (
3369 IN PCI_CARDBUS_HEADER
*CardBus
,
3371 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
3375 PCI_CARDBUS_DATA
*CardBusData
;
3377 ShellPrintHiiEx(-1, -1, NULL
,
3378 STRING_TOKEN (STR_PCI2_CARDBUS_SOCKET
),
3379 gShellDebug1HiiHandle
,
3380 INDEX_OF (&(CardBus
->CardBusSocketReg
)),
3381 CardBus
->CardBusSocketReg
3385 // Print Secondary Status
3387 PciExplainStatus (&(CardBus
->SecondaryStatus
), FALSE
, PciCardBusBridge
);
3390 // Print Bus Numbers(Primary bus number, CardBus bus number, and
3391 // Subordinate bus number
3393 ShellPrintHiiEx(-1, -1, NULL
,
3394 STRING_TOKEN (STR_PCI2_BUS_NUMBERS_2
),
3395 gShellDebug1HiiHandle
,
3396 INDEX_OF (&(CardBus
->PciBusNumber
)),
3397 INDEX_OF (&(CardBus
->CardBusBusNumber
)),
3398 INDEX_OF (&(CardBus
->SubordinateBusNumber
))
3401 ShellPrintEx (-1, -1, L
" ------------------------------------------------------\r\n");
3403 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_CARDBUS
), gShellDebug1HiiHandle
, CardBus
->PciBusNumber
);
3404 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_CARDBUS_2
), gShellDebug1HiiHandle
, CardBus
->CardBusBusNumber
);
3405 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_CARDBUS_3
), gShellDebug1HiiHandle
, CardBus
->SubordinateBusNumber
);
3408 // Print CardBus Latency Timer
3410 ShellPrintHiiEx(-1, -1, NULL
,
3411 STRING_TOKEN (STR_PCI2_CARDBUS_LATENCY
),
3412 gShellDebug1HiiHandle
,
3413 INDEX_OF (&(CardBus
->CardBusLatencyTimer
)),
3414 CardBus
->CardBusLatencyTimer
3418 // Print Memory/Io ranges this cardbus bridge forwards
3420 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RESOURCE_TYPE_2
), gShellDebug1HiiHandle
);
3421 ShellPrintEx (-1, -1, L
"----------------------------------------------------------------------\r\n");
3423 ShellPrintHiiEx(-1, -1, NULL
,
3424 STRING_TOKEN (STR_PCI2_MEM_3
),
3425 gShellDebug1HiiHandle
,
3426 INDEX_OF (&(CardBus
->MemoryBase0
)),
3427 CardBus
->BridgeControl
& PCI_BIT_8
? L
" Prefetchable" : L
"Non-Prefetchable",
3428 CardBus
->MemoryBase0
& 0xfffff000,
3429 CardBus
->MemoryLimit0
| 0x00000fff
3432 ShellPrintHiiEx(-1, -1, NULL
,
3433 STRING_TOKEN (STR_PCI2_MEM_3
),
3434 gShellDebug1HiiHandle
,
3435 INDEX_OF (&(CardBus
->MemoryBase1
)),
3436 CardBus
->BridgeControl
& PCI_BIT_9
? L
" Prefetchable" : L
"Non-Prefetchable",
3437 CardBus
->MemoryBase1
& 0xfffff000,
3438 CardBus
->MemoryLimit1
| 0x00000fff
3441 Io32Bit
= (BOOLEAN
) (CardBus
->IoBase0
& PCI_BIT_0
);
3442 ShellPrintHiiEx(-1, -1, NULL
,
3443 STRING_TOKEN (STR_PCI2_IO_2
),
3444 gShellDebug1HiiHandle
,
3445 INDEX_OF (&(CardBus
->IoBase0
)),
3446 Io32Bit
? L
" 32 bit" : L
" 16 bit",
3447 CardBus
->IoBase0
& (Io32Bit
? 0xfffffffc : 0x0000fffc),
3448 (CardBus
->IoLimit0
& (Io32Bit
? 0xffffffff : 0x0000ffff)) | 0x00000003
3451 Io32Bit
= (BOOLEAN
) (CardBus
->IoBase1
& PCI_BIT_0
);
3452 ShellPrintHiiEx(-1, -1, NULL
,
3453 STRING_TOKEN (STR_PCI2_IO_2
),
3454 gShellDebug1HiiHandle
,
3455 INDEX_OF (&(CardBus
->IoBase1
)),
3456 Io32Bit
? L
" 32 bit" : L
" 16 bit",
3457 CardBus
->IoBase1
& (Io32Bit
? 0xfffffffc : 0x0000fffc),
3458 (CardBus
->IoLimit1
& (Io32Bit
? 0xffffffff : 0x0000ffff)) | 0x00000003
3462 // Print register Interrupt Line & PIN
3464 ShellPrintHiiEx(-1, -1, NULL
,
3465 STRING_TOKEN (STR_PCI2_INTERRUPT_LINE_3
),
3466 gShellDebug1HiiHandle
,
3467 INDEX_OF (&(CardBus
->InterruptLine
)),
3468 CardBus
->InterruptLine
,
3469 INDEX_OF (&(CardBus
->InterruptPin
)),
3470 CardBus
->InterruptPin
3474 // Print register Bridge Control
3476 PciExplainBridgeControl (&(CardBus
->BridgeControl
), PciCardBusBridge
);
3479 // Print some registers in data region of PCI configuration space for cardbus
3480 // bridge. Fields include: Sub VendorId, Subsystem ID, and Legacy Mode Base
3483 CardBusData
= (PCI_CARDBUS_DATA
*) ((UINT8
*) CardBus
+ sizeof (PCI_CARDBUS_HEADER
));
3485 ShellPrintHiiEx(-1, -1, NULL
,
3486 STRING_TOKEN (STR_PCI2_SUB_VENDOR_ID_2
),
3487 gShellDebug1HiiHandle
,
3488 INDEX_OF (&(CardBusData
->SubVendorId
)),
3489 CardBusData
->SubVendorId
,
3490 INDEX_OF (&(CardBusData
->SubSystemId
)),
3491 CardBusData
->SubSystemId
3494 ShellPrintHiiEx(-1, -1, NULL
,
3495 STRING_TOKEN (STR_PCI2_OPTIONAL
),
3496 gShellDebug1HiiHandle
,
3497 INDEX_OF (&(CardBusData
->LegacyBase
)),
3498 CardBusData
->LegacyBase
3505 Explain each meaningful bit of register Status. The definition of Status is
3506 slightly different depending on the PCI header type.
3508 @param[in] Status Points to the content of register Status.
3509 @param[in] MainStatus Indicates if this register is main status(not secondary
3511 @param[in] HeaderType Header type of this PCI device.
3513 @retval EFI_SUCCESS The command completed successfully.
3518 IN BOOLEAN MainStatus
,
3519 IN PCI_HEADER_TYPE HeaderType
3523 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_STATUS
), gShellDebug1HiiHandle
, INDEX_OF (Status
), *Status
);
3526 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_SECONDARY_STATUS
), gShellDebug1HiiHandle
, INDEX_OF (Status
), *Status
);
3529 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_NEW_CAPABILITIES
), gShellDebug1HiiHandle
, (*Status
& PCI_BIT_4
) != 0);
3532 // Bit 5 is meaningless for CardBus Bridge
3534 if (HeaderType
== PciCardBusBridge
) {
3535 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_66_CAPABLE
), gShellDebug1HiiHandle
, (*Status
& PCI_BIT_5
) != 0);
3538 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_66_CAPABLE_2
), gShellDebug1HiiHandle
, (*Status
& PCI_BIT_5
) != 0);
3541 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_FAST_BACK
), gShellDebug1HiiHandle
, (*Status
& PCI_BIT_7
) != 0);
3543 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MASTER_DATA
), gShellDebug1HiiHandle
, (*Status
& PCI_BIT_8
) != 0);
3545 // Bit 9 and bit 10 together decides the DEVSEL timing
3547 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_DEVSEL_TIMING
), gShellDebug1HiiHandle
);
3548 if ((*Status
& PCI_BIT_9
) == 0 && (*Status
& PCI_BIT_10
) == 0) {
3549 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_FAST
), gShellDebug1HiiHandle
);
3551 } else if ((*Status
& PCI_BIT_9
) != 0 && (*Status
& PCI_BIT_10
) == 0) {
3552 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_MEDIUM
), gShellDebug1HiiHandle
);
3554 } else if ((*Status
& PCI_BIT_9
) == 0 && (*Status
& PCI_BIT_10
) != 0) {
3555 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_SLOW
), gShellDebug1HiiHandle
);
3558 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_RESERVED_2
), gShellDebug1HiiHandle
);
3561 ShellPrintHiiEx(-1, -1, NULL
,
3562 STRING_TOKEN (STR_PCI2_SIGNALED_TARGET
),
3563 gShellDebug1HiiHandle
,
3564 (*Status
& PCI_BIT_11
) != 0
3567 ShellPrintHiiEx(-1, -1, NULL
,
3568 STRING_TOKEN (STR_PCI2_RECEIVED_TARGET
),
3569 gShellDebug1HiiHandle
,
3570 (*Status
& PCI_BIT_12
) != 0
3573 ShellPrintHiiEx(-1, -1, NULL
,
3574 STRING_TOKEN (STR_PCI2_RECEIVED_MASTER
),
3575 gShellDebug1HiiHandle
,
3576 (*Status
& PCI_BIT_13
) != 0
3580 ShellPrintHiiEx(-1, -1, NULL
,
3581 STRING_TOKEN (STR_PCI2_SIGNALED_ERROR
),
3582 gShellDebug1HiiHandle
,
3583 (*Status
& PCI_BIT_14
) != 0
3587 ShellPrintHiiEx(-1, -1, NULL
,
3588 STRING_TOKEN (STR_PCI2_RECEIVED_ERROR
),
3589 gShellDebug1HiiHandle
,
3590 (*Status
& PCI_BIT_14
) != 0
3594 ShellPrintHiiEx(-1, -1, NULL
,
3595 STRING_TOKEN (STR_PCI2_DETECTED_ERROR
),
3596 gShellDebug1HiiHandle
,
3597 (*Status
& PCI_BIT_15
) != 0
3604 Explain each meaningful bit of register Command.
3606 @param[in] Command Points to the content of register Command.
3608 @retval EFI_SUCCESS The command completed successfully.
3616 // Print the binary value of register Command
3618 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_PCI2_COMMAND
), gShellDebug1HiiHandle
, INDEX_OF (Command
), *Command
);
3621 // Explain register Command bit by bit
3623 ShellPrintHiiEx(-1, -1, NULL
,
3624 STRING_TOKEN (STR_PCI2_SPACE_ACCESS_DENIED
),
3625 gShellDebug1HiiHandle
,
3626 (*Command
& PCI_BIT_0
) != 0
3629 ShellPrintHiiEx(-1, -1, NULL
,
3630 STRING_TOKEN (STR_PCI2_MEMORY_SPACE
),
3631 gShellDebug1HiiHandle
,
3632 (*Command
& PCI_BIT_1
) != 0
3635 ShellPrintHiiEx(-1, -1, NULL
,
3636 STRING_TOKEN (STR_PCI2_BEHAVE_BUS_MASTER
),
3637 gShellDebug1HiiHandle
,
3638 (*Command
& PCI_BIT_2
) != 0
3641 ShellPrintHiiEx(-1, -1, NULL
,
3642 STRING_TOKEN (STR_PCI2_MONITOR_SPECIAL_CYCLE
),
3643 gShellDebug1HiiHandle
,
3644 (*Command
& PCI_BIT_3
) != 0
3647 ShellPrintHiiEx(-1, -1, NULL
,
3648 STRING_TOKEN (STR_PCI2_MEM_WRITE_INVALIDATE
),
3649 gShellDebug1HiiHandle
,
3650 (*Command
& PCI_BIT_4
) != 0
3653 ShellPrintHiiEx(-1, -1, NULL
,
3654 STRING_TOKEN (STR_PCI2_PALETTE_SNOOPING
),
3655 gShellDebug1HiiHandle
,
3656 (*Command
& PCI_BIT_5
) != 0
3659 ShellPrintHiiEx(-1, -1, NULL
,
3660 STRING_TOKEN (STR_PCI2_ASSERT_PERR
),
3661 gShellDebug1HiiHandle
,
3662 (*Command
& PCI_BIT_6
) != 0
3665 ShellPrintHiiEx(-1, -1, NULL
,
3666 STRING_TOKEN (STR_PCI2_DO_ADDR_STEPPING
),
3667 gShellDebug1HiiHandle
,
3668 (*Command
& PCI_BIT_7
) != 0
3671 ShellPrintHiiEx(-1, -1, NULL
,
3672 STRING_TOKEN (STR_PCI2_SERR_DRIVER
),
3673 gShellDebug1HiiHandle
,
3674 (*Command
& PCI_BIT_8
) != 0
3677 ShellPrintHiiEx(-1, -1, NULL
,
3678 STRING_TOKEN (STR_PCI2_FAST_BACK_2
),
3679 gShellDebug1HiiHandle
,
3680 (*Command
& PCI_BIT_9
) != 0
3687 Explain each meaningful bit of register Bridge Control.
3689 @param[in] BridgeControl Points to the content of register Bridge Control.
3690 @param[in] HeaderType The headertype.
3692 @retval EFI_SUCCESS The command completed successfully.
3695 PciExplainBridgeControl (
3696 IN UINT16
*BridgeControl
,
3697 IN PCI_HEADER_TYPE HeaderType
3700 ShellPrintHiiEx(-1, -1, NULL
,
3701 STRING_TOKEN (STR_PCI2_BRIDGE_CONTROL
),
3702 gShellDebug1HiiHandle
,
3703 INDEX_OF (BridgeControl
),
3707 ShellPrintHiiEx(-1, -1, NULL
,
3708 STRING_TOKEN (STR_PCI2_PARITY_ERROR
),
3709 gShellDebug1HiiHandle
,
3710 (*BridgeControl
& PCI_BIT_0
) != 0
3712 ShellPrintHiiEx(-1, -1, NULL
,
3713 STRING_TOKEN (STR_PCI2_SERR_ENABLE
),
3714 gShellDebug1HiiHandle
,
3715 (*BridgeControl
& PCI_BIT_1
) != 0
3717 ShellPrintHiiEx(-1, -1, NULL
,
3718 STRING_TOKEN (STR_PCI2_ISA_ENABLE
),
3719 gShellDebug1HiiHandle
,
3720 (*BridgeControl
& PCI_BIT_2
) != 0
3722 ShellPrintHiiEx(-1, -1, NULL
,
3723 STRING_TOKEN (STR_PCI2_VGA_ENABLE
),
3724 gShellDebug1HiiHandle
,
3725 (*BridgeControl
& PCI_BIT_3
) != 0
3727 ShellPrintHiiEx(-1, -1, NULL
,
3728 STRING_TOKEN (STR_PCI2_MASTER_ABORT
),
3729 gShellDebug1HiiHandle
,
3730 (*BridgeControl
& PCI_BIT_5
) != 0
3734 // Register Bridge Control has some slight differences between P2P bridge
3735 // and Cardbus bridge from bit 6 to bit 11.
3737 if (HeaderType
== PciP2pBridge
) {
3738 ShellPrintHiiEx(-1, -1, NULL
,
3739 STRING_TOKEN (STR_PCI2_SECONDARY_BUS_RESET
),
3740 gShellDebug1HiiHandle
,
3741 (*BridgeControl
& PCI_BIT_6
) != 0
3743 ShellPrintHiiEx(-1, -1, NULL
,
3744 STRING_TOKEN (STR_PCI2_FAST_ENABLE
),
3745 gShellDebug1HiiHandle
,
3746 (*BridgeControl
& PCI_BIT_7
) != 0
3748 ShellPrintHiiEx(-1, -1, NULL
,
3749 STRING_TOKEN (STR_PCI2_PRIMARY_DISCARD_TIMER
),
3750 gShellDebug1HiiHandle
,
3751 (*BridgeControl
& PCI_BIT_8
)!=0 ? L
"2^10" : L
"2^15"
3753 ShellPrintHiiEx(-1, -1, NULL
,
3754 STRING_TOKEN (STR_PCI2_SECONDARY_DISCARD_TIMER
),
3755 gShellDebug1HiiHandle
,
3756 (*BridgeControl
& PCI_BIT_9
)!=0 ? L
"2^10" : L
"2^15"
3758 ShellPrintHiiEx(-1, -1, NULL
,
3759 STRING_TOKEN (STR_PCI2_DISCARD_TIMER_STATUS
),
3760 gShellDebug1HiiHandle
,
3761 (*BridgeControl
& PCI_BIT_10
) != 0
3763 ShellPrintHiiEx(-1, -1, NULL
,
3764 STRING_TOKEN (STR_PCI2_DISCARD_TIMER_SERR
),
3765 gShellDebug1HiiHandle
,
3766 (*BridgeControl
& PCI_BIT_11
) != 0
3770 ShellPrintHiiEx(-1, -1, NULL
,
3771 STRING_TOKEN (STR_PCI2_CARDBUS_RESET
),
3772 gShellDebug1HiiHandle
,
3773 (*BridgeControl
& PCI_BIT_6
) != 0
3775 ShellPrintHiiEx(-1, -1, NULL
,
3776 STRING_TOKEN (STR_PCI2_IREQ_ENABLE
),
3777 gShellDebug1HiiHandle
,
3778 (*BridgeControl
& PCI_BIT_7
) != 0
3780 ShellPrintHiiEx(-1, -1, NULL
,
3781 STRING_TOKEN (STR_PCI2_WRITE_POSTING_ENABLE
),
3782 gShellDebug1HiiHandle
,
3783 (*BridgeControl
& PCI_BIT_10
) != 0
3791 Print each capability structure.
3793 @param[in] IoDev The pointer to the deivce.
3794 @param[in] Address The address to start at.
3795 @param[in] CapPtr The offset from the address.
3797 @retval EFI_SUCCESS The operation was successful.
3800 PciExplainCapabilityStruct (
3801 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
3804 IN CONST UINT16 EnhancedDump
3807 UINT8 CapabilityPtr
;
3808 UINT16 CapabilityEntry
;
3812 CapabilityPtr
= CapPtr
;
3815 // Go through the Capability list
3817 while ((CapabilityPtr
>= 0x40) && ((CapabilityPtr
& 0x03) == 0x00)) {
3818 RegAddress
= Address
+ CapabilityPtr
;
3819 IoDev
->Pci
.Read (IoDev
, EfiPciWidthUint16
, RegAddress
, 1, &CapabilityEntry
);
3821 CapabilityID
= (UINT8
) CapabilityEntry
;
3824 // Explain PciExpress data
3826 if (EFI_PCI_CAPABILITY_ID_PCIEXP
== CapabilityID
) {
3827 PciExplainPciExpress (IoDev
, Address
, CapabilityPtr
, EnhancedDump
);
3831 // Explain other capabilities here
3833 CapabilityPtr
= (UINT8
) (CapabilityEntry
>> 8);
3840 Print out information of the capability information.
3842 @param[in] PciExpressCap The pointer to the structure about the device.
3844 @retval EFI_SUCCESS The operation was successful.
3848 IN PCIE_CAP_STURCTURE
*PciExpressCap
3852 CHAR16
*DevicePortType
;
3854 PcieCapReg
= PciExpressCap
->PcieCapReg
;
3855 ShellPrintEx (-1, -1,
3856 L
" Capability Version(3:0): %E0x%04x%N\r\n",
3857 PCIE_CAP_VERSION (PcieCapReg
)
3859 if ((UINT8
) PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
) < PCIE_DEVICE_PORT_TYPE_MAX
) {
3860 DevicePortType
= DevicePortTypeTable
[PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
)];
3862 DevicePortType
= L
"Unknown Type";
3864 ShellPrintEx (-1, -1,
3865 L
" Device/PortType(7:4): %E%s%N\r\n",
3869 // 'Slot Implemented' is only valid for:
3870 // a) Root Port of PCI Express Root Complex, or
3871 // b) Downstream Port of PCI Express Switch
3873 if (PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
) == PCIE_ROOT_COMPLEX_ROOT_PORT
||
3874 PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
) == PCIE_SWITCH_DOWNSTREAM_PORT
) {
3875 ShellPrintEx (-1, -1,
3876 L
" Slot Implemented(8): %E%d%N\r\n",
3877 PCIE_CAP_SLOT_IMPLEMENTED (PcieCapReg
)
3880 ShellPrintEx (-1, -1,
3881 L
" Interrupt Message Number(13:9): %E0x%05x%N\r\n",
3882 PCIE_CAP_INT_MSG_NUM (PcieCapReg
)
3888 Print out information of the device capability information.
3890 @param[in] PciExpressCap The pointer to the structure about the device.
3892 @retval EFI_SUCCESS The operation was successful.
3895 ExplainPcieDeviceCap (
3896 IN PCIE_CAP_STURCTURE
*PciExpressCap
3900 UINT32 PcieDeviceCap
;
3901 UINT8 DevicePortType
;
3905 PcieCapReg
= PciExpressCap
->PcieCapReg
;
3906 PcieDeviceCap
= PciExpressCap
->PcieDeviceCap
;
3907 DevicePortType
= (UINT8
) PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
);
3908 ShellPrintEx (-1, -1, L
" Max_Payload_Size Supported(2:0): ");
3909 if (PCIE_CAP_MAX_PAYLOAD (PcieDeviceCap
) < 6) {
3910 ShellPrintEx (-1, -1, L
"%E%d bytes%N\r\n", 1 << (PCIE_CAP_MAX_PAYLOAD (PcieDeviceCap
) + 7));
3912 ShellPrintEx (-1, -1, L
"%EUnknown%N\r\n");
3914 ShellPrintEx (-1, -1,
3915 L
" Phantom Functions Supported(4:3): %E%d%N\r\n",
3916 PCIE_CAP_PHANTOM_FUNC (PcieDeviceCap
)
3918 ShellPrintEx (-1, -1,
3919 L
" Extended Tag Field Supported(5): %E%d-bit Tag field supported%N\r\n",
3920 PCIE_CAP_EXTENDED_TAG (PcieDeviceCap
) ? 8 : 5
3923 // Endpoint L0s and L1 Acceptable Latency is only valid for Endpoint
3925 if (IS_PCIE_ENDPOINT (DevicePortType
)) {
3926 L0sLatency
= (UINT8
) PCIE_CAP_L0SLATENCY (PcieDeviceCap
);
3927 L1Latency
= (UINT8
) PCIE_CAP_L1LATENCY (PcieDeviceCap
);
3928 ShellPrintEx (-1, -1, L
" Endpoint L0s Acceptable Latency(8:6): ");
3929 if (L0sLatency
< 4) {
3930 ShellPrintEx (-1, -1, L
"%EMaximum of %d ns%N\r\n", 1 << (L0sLatency
+ 6));
3932 if (L0sLatency
< 7) {
3933 ShellPrintEx (-1, -1, L
"%EMaximum of %d us%N\r\n", 1 << (L0sLatency
- 3));
3935 ShellPrintEx (-1, -1, L
"%ENo limit%N\r\n");
3938 ShellPrintEx (-1, -1, L
" Endpoint L1 Acceptable Latency(11:9): ");
3939 if (L1Latency
< 7) {
3940 ShellPrintEx (-1, -1, L
"%EMaximum of %d us%N\r\n", 1 << (L1Latency
+ 1));
3942 ShellPrintEx (-1, -1, L
"%ENo limit%N\r\n");
3945 ShellPrintEx (-1, -1,
3946 L
" Role-based Error Reporting(15): %E%d%N\r\n",
3947 PCIE_CAP_ERR_REPORTING (PcieDeviceCap
)
3950 // Only valid for Upstream Port:
3951 // a) Captured Slot Power Limit Value
3952 // b) Captured Slot Power Scale
3954 if (DevicePortType
== PCIE_SWITCH_UPSTREAM_PORT
) {
3955 ShellPrintEx (-1, -1,
3956 L
" Captured Slot Power Limit Value(25:18): %E0x%02x%N\r\n",
3957 PCIE_CAP_SLOT_POWER_VALUE (PcieDeviceCap
)
3959 ShellPrintEx (-1, -1,
3960 L
" Captured Slot Power Limit Scale(27:26): %E%s%N\r\n",
3961 SlotPwrLmtScaleTable
[PCIE_CAP_SLOT_POWER_SCALE (PcieDeviceCap
)]
3965 // Function Level Reset Capability is only valid for Endpoint
3967 if (IS_PCIE_ENDPOINT (DevicePortType
)) {
3968 ShellPrintEx (-1, -1,
3969 L
" Function Level Reset Capability(28): %E%d%N\r\n",
3970 PCIE_CAP_FUNC_LEVEL_RESET (PcieDeviceCap
)
3977 Print out information of the device control information.
3979 @param[in] PciExpressCap The pointer to the structure about the device.
3981 @retval EFI_SUCCESS The operation was successful.
3984 ExplainPcieDeviceControl (
3985 IN PCIE_CAP_STURCTURE
*PciExpressCap
3989 UINT16 PcieDeviceControl
;
3991 PcieCapReg
= PciExpressCap
->PcieCapReg
;
3992 PcieDeviceControl
= PciExpressCap
->DeviceControl
;
3993 ShellPrintEx (-1, -1,
3994 L
" Correctable Error Reporting Enable(0): %E%d%N\r\n",
3995 PCIE_CAP_COR_ERR_REPORTING_ENABLE (PcieDeviceControl
)
3997 ShellPrintEx (-1, -1,
3998 L
" Non-Fatal Error Reporting Enable(1): %E%d%N\r\n",
3999 PCIE_CAP_NONFAT_ERR_REPORTING_ENABLE (PcieDeviceControl
)
4001 ShellPrintEx (-1, -1,
4002 L
" Fatal Error Reporting Enable(2): %E%d%N\r\n",
4003 PCIE_CAP_FATAL_ERR_REPORTING_ENABLE (PcieDeviceControl
)
4005 ShellPrintEx (-1, -1,
4006 L
" Unsupported Request Reporting Enable(3): %E%d%N\r\n",
4007 PCIE_CAP_UNSUP_REQ_REPORTING_ENABLE (PcieDeviceControl
)
4009 ShellPrintEx (-1, -1,
4010 L
" Enable Relaxed Ordering(4): %E%d%N\r\n",
4011 PCIE_CAP_RELAXED_ORDERING_ENABLE (PcieDeviceControl
)
4013 ShellPrintEx (-1, -1, L
" Max_Payload_Size(7:5): ");
4014 if (PCIE_CAP_MAX_PAYLOAD_SIZE (PcieDeviceControl
) < 6) {
4015 ShellPrintEx (-1, -1, L
"%E%d bytes%N\r\n", 1 << (PCIE_CAP_MAX_PAYLOAD_SIZE (PcieDeviceControl
) + 7));
4017 ShellPrintEx (-1, -1, L
"%EUnknown%N\r\n");
4019 ShellPrintEx (-1, -1,
4020 L
" Extended Tag Field Enable(8): %E%d%N\r\n",
4021 PCIE_CAP_EXTENDED_TAG_ENABLE (PcieDeviceControl
)
4023 ShellPrintEx (-1, -1,
4024 L
" Phantom Functions Enable(9): %E%d%N\r\n",
4025 PCIE_CAP_PHANTOM_FUNC_ENABLE (PcieDeviceControl
)
4027 ShellPrintEx (-1, -1,
4028 L
" Auxiliary (AUX) Power PM Enable(10): %E%d%N\r\n",
4029 PCIE_CAP_AUX_PM_ENABLE (PcieDeviceControl
)
4031 ShellPrintEx (-1, -1,
4032 L
" Enable No Snoop(11): %E%d%N\r\n",
4033 PCIE_CAP_NO_SNOOP_ENABLE (PcieDeviceControl
)
4035 ShellPrintEx (-1, -1, L
" Max_Read_Request_Size(14:12): ");
4036 if (PCIE_CAP_MAX_READ_REQ_SIZE (PcieDeviceControl
) < 6) {
4037 ShellPrintEx (-1, -1, L
"%E%d bytes%N\r\n", 1 << (PCIE_CAP_MAX_READ_REQ_SIZE (PcieDeviceControl
) + 7));
4039 ShellPrintEx (-1, -1, L
"%EUnknown%N\r\n");
4042 // Read operation is only valid for PCI Express to PCI/PCI-X Bridges
4044 if (PCIE_CAP_DEVICEPORT_TYPE (PcieCapReg
) == PCIE_PCIE_TO_PCIX_BRIDGE
) {
4045 ShellPrintEx (-1, -1,
4046 L
" Bridge Configuration Retry Enable(15): %E%d%N\r\n",
4047 PCIE_CAP_BRG_CONF_RETRY (PcieDeviceControl
)
4054 Print out information of the device status information.
4056 @param[in] PciExpressCap The pointer to the structure about the device.
4058 @retval EFI_SUCCESS The operation was successful.
4061 ExplainPcieDeviceStatus (
4062 IN PCIE_CAP_STURCTURE
*PciExpressCap
4065 UINT16 PcieDeviceStatus
;
4067 PcieDeviceStatus
= PciExpressCap
->DeviceStatus
;
4068 ShellPrintEx (-1, -1,
4069 L
" Correctable Error Detected(0): %E%d%N\r\n",
4070 PCIE_CAP_COR_ERR_DETECTED (PcieDeviceStatus
)
4072 ShellPrintEx (-1, -1,
4073 L
" Non-Fatal Error Detected(1): %E%d%N\r\n",
4074 PCIE_CAP_NONFAT_ERR_DETECTED (PcieDeviceStatus
)
4076 ShellPrintEx (-1, -1,
4077 L
" Fatal Error Detected(2): %E%d%N\r\n",
4078 PCIE_CAP_FATAL_ERR_DETECTED (PcieDeviceStatus
)
4080 ShellPrintEx (-1, -1,
4081 L
" Unsupported Request Detected(3): %E%d%N\r\n",
4082 PCIE_CAP_UNSUP_REQ_DETECTED (PcieDeviceStatus
)
4084 ShellPrintEx (-1, -1,
4085 L
" AUX Power Detected(4): %E%d%N\r\n",
4086 PCIE_CAP_AUX_POWER_DETECTED (PcieDeviceStatus
)
4088 ShellPrintEx (-1, -1,
4089 L
" Transactions Pending(5): %E%d%N\r\n",
4090 PCIE_CAP_TRANSACTION_PENDING (PcieDeviceStatus
)
4096 Print out information of the device link information.
4098 @param[in] PciExpressCap The pointer to the structure about the device.
4100 @retval EFI_SUCCESS The operation was successful.
4103 ExplainPcieLinkCap (
4104 IN PCIE_CAP_STURCTURE
*PciExpressCap
4108 CHAR16
*MaxLinkSpeed
;
4111 PcieLinkCap
= PciExpressCap
->LinkCap
;
4112 switch (PCIE_CAP_MAX_LINK_SPEED (PcieLinkCap
)) {
4114 MaxLinkSpeed
= L
"2.5 GT/s";
4117 MaxLinkSpeed
= L
"5.0 GT/s";
4120 MaxLinkSpeed
= L
"8.0 GT/s";
4123 MaxLinkSpeed
= L
"Unknown";
4126 ShellPrintEx (-1, -1,
4127 L
" Maximum Link Speed(3:0): %E%s%N\r\n",
4130 ShellPrintEx (-1, -1,
4131 L
" Maximum Link Width(9:4): %Ex%d%N\r\n",
4132 PCIE_CAP_MAX_LINK_WIDTH (PcieLinkCap
)
4134 switch (PCIE_CAP_ASPM_SUPPORT (PcieLinkCap
)) {
4145 AspmValue
= L
"L0s and L1";
4148 AspmValue
= L
"Reserved";
4151 ShellPrintEx (-1, -1,
4152 L
" Active State Power Management Support(11:10): %E%s Supported%N\r\n",
4155 ShellPrintEx (-1, -1,
4156 L
" L0s Exit Latency(14:12): %E%s%N\r\n",
4157 L0sLatencyStrTable
[PCIE_CAP_L0S_LATENCY (PcieLinkCap
)]
4159 ShellPrintEx (-1, -1,
4160 L
" L1 Exit Latency(17:15): %E%s%N\r\n",
4161 L1LatencyStrTable
[PCIE_CAP_L0S_LATENCY (PcieLinkCap
)]
4163 ShellPrintEx (-1, -1,
4164 L
" Clock Power Management(18): %E%d%N\r\n",
4165 PCIE_CAP_CLOCK_PM (PcieLinkCap
)
4167 ShellPrintEx (-1, -1,
4168 L
" Surprise Down Error Reporting Capable(19): %E%d%N\r\n",
4169 PCIE_CAP_SUP_DOWN_ERR_REPORTING (PcieLinkCap
)
4171 ShellPrintEx (-1, -1,
4172 L
" Data Link Layer Link Active Reporting Capable(20): %E%d%N\r\n",
4173 PCIE_CAP_LINK_ACTIVE_REPORTING (PcieLinkCap
)
4175 ShellPrintEx (-1, -1,
4176 L
" Link Bandwidth Notification Capability(21): %E%d%N\r\n",
4177 PCIE_CAP_LINK_BWD_NOTIF_CAP (PcieLinkCap
)
4179 ShellPrintEx (-1, -1,
4180 L
" Port Number(31:24): %E0x%02x%N\r\n",
4181 PCIE_CAP_PORT_NUMBER (PcieLinkCap
)
4187 Print out information of the device link control information.
4189 @param[in] PciExpressCap The pointer to the structure about the device.
4191 @retval EFI_SUCCESS The operation was successful.
4194 ExplainPcieLinkControl (
4195 IN PCIE_CAP_STURCTURE
*PciExpressCap
4198 UINT16 PcieLinkControl
;
4199 UINT8 DevicePortType
;
4201 PcieLinkControl
= PciExpressCap
->LinkControl
;
4202 DevicePortType
= (UINT8
) PCIE_CAP_DEVICEPORT_TYPE (PciExpressCap
->PcieCapReg
);
4203 ShellPrintEx (-1, -1,
4204 L
" Active State Power Management Control(1:0): %E%s%N\r\n",
4205 ASPMCtrlStrTable
[PCIE_CAP_ASPM_CONTROL (PcieLinkControl
)]
4208 // RCB is not applicable to switches
4210 if (!IS_PCIE_SWITCH(DevicePortType
)) {
4211 ShellPrintEx (-1, -1,
4212 L
" Read Completion Boundary (RCB)(3): %E%d byte%N\r\n",
4213 1 << (PCIE_CAP_RCB (PcieLinkControl
) + 6)
4217 // Link Disable is reserved on
4219 // b) PCI Express to PCI/PCI-X bridges
4220 // c) Upstream Ports of Switches
4222 if (!IS_PCIE_ENDPOINT (DevicePortType
) &&
4223 DevicePortType
!= PCIE_SWITCH_UPSTREAM_PORT
&&
4224 DevicePortType
!= PCIE_PCIE_TO_PCIX_BRIDGE
) {
4225 ShellPrintEx (-1, -1,
4226 L
" Link Disable(4): %E%d%N\r\n",
4227 PCIE_CAP_LINK_DISABLE (PcieLinkControl
)
4230 ShellPrintEx (-1, -1,
4231 L
" Common Clock Configuration(6): %E%d%N\r\n",
4232 PCIE_CAP_COMMON_CLK_CONF (PcieLinkControl
)
4234 ShellPrintEx (-1, -1,
4235 L
" Extended Synch(7): %E%d%N\r\n",
4236 PCIE_CAP_EXT_SYNC (PcieLinkControl
)
4238 ShellPrintEx (-1, -1,
4239 L
" Enable Clock Power Management(8): %E%d%N\r\n",
4240 PCIE_CAP_CLK_PWR_MNG (PcieLinkControl
)
4242 ShellPrintEx (-1, -1,
4243 L
" Hardware Autonomous Width Disable(9): %E%d%N\r\n",
4244 PCIE_CAP_HW_AUTO_WIDTH_DISABLE (PcieLinkControl
)
4246 ShellPrintEx (-1, -1,
4247 L
" Link Bandwidth Management Interrupt Enable(10): %E%d%N\r\n",
4248 PCIE_CAP_LINK_BDW_MNG_INT_EN (PcieLinkControl
)
4250 ShellPrintEx (-1, -1,
4251 L
" Link Autonomous Bandwidth Interrupt Enable(11): %E%d%N\r\n",
4252 PCIE_CAP_LINK_AUTO_BDW_INT_EN (PcieLinkControl
)
4258 Print out information of the device link status information.
4260 @param[in] PciExpressCap The pointer to the structure about the device.
4262 @retval EFI_SUCCESS The operation was successful.
4265 ExplainPcieLinkStatus (
4266 IN PCIE_CAP_STURCTURE
*PciExpressCap
4269 UINT16 PcieLinkStatus
;
4270 CHAR16
*CurLinkSpeed
;
4272 PcieLinkStatus
= PciExpressCap
->LinkStatus
;
4273 switch (PCIE_CAP_CUR_LINK_SPEED (PcieLinkStatus
)) {
4275 CurLinkSpeed
= L
"2.5 GT/s";
4278 CurLinkSpeed
= L
"5.0 GT/s";
4281 CurLinkSpeed
= L
"8.0 GT/s";
4284 CurLinkSpeed
= L
"Reserved";
4287 ShellPrintEx (-1, -1,
4288 L
" Current Link Speed(3:0): %E%s%N\r\n",
4291 ShellPrintEx (-1, -1,
4292 L
" Negotiated Link Width(9:4): %Ex%d%N\r\n",
4293 PCIE_CAP_NEGO_LINK_WIDTH (PcieLinkStatus
)
4295 ShellPrintEx (-1, -1,
4296 L
" Link Training(11): %E%d%N\r\n",
4297 PCIE_CAP_LINK_TRAINING (PcieLinkStatus
)
4299 ShellPrintEx (-1, -1,
4300 L
" Slot Clock Configuration(12): %E%d%N\r\n",
4301 PCIE_CAP_SLOT_CLK_CONF (PcieLinkStatus
)
4303 ShellPrintEx (-1, -1,
4304 L
" Data Link Layer Link Active(13): %E%d%N\r\n",
4305 PCIE_CAP_DATA_LINK_ACTIVE (PcieLinkStatus
)
4307 ShellPrintEx (-1, -1,
4308 L
" Link Bandwidth Management Status(14): %E%d%N\r\n",
4309 PCIE_CAP_LINK_BDW_MNG_STAT (PcieLinkStatus
)
4311 ShellPrintEx (-1, -1,
4312 L
" Link Autonomous Bandwidth Status(15): %E%d%N\r\n",
4313 PCIE_CAP_LINK_AUTO_BDW_STAT (PcieLinkStatus
)
4319 Print out information of the device slot information.
4321 @param[in] PciExpressCap The pointer to the structure about the device.
4323 @retval EFI_SUCCESS The operation was successful.
4326 ExplainPcieSlotCap (
4327 IN PCIE_CAP_STURCTURE
*PciExpressCap
4332 PcieSlotCap
= PciExpressCap
->SlotCap
;
4334 ShellPrintEx (-1, -1,
4335 L
" Attention Button Present(0): %E%d%N\r\n",
4336 PCIE_CAP_ATT_BUT_PRESENT (PcieSlotCap
)
4338 ShellPrintEx (-1, -1,
4339 L
" Power Controller Present(1): %E%d%N\r\n",
4340 PCIE_CAP_PWR_CTRLLER_PRESENT (PcieSlotCap
)
4342 ShellPrintEx (-1, -1,
4343 L
" MRL Sensor Present(2): %E%d%N\r\n",
4344 PCIE_CAP_MRL_SENSOR_PRESENT (PcieSlotCap
)
4346 ShellPrintEx (-1, -1,
4347 L
" Attention Indicator Present(3): %E%d%N\r\n",
4348 PCIE_CAP_ATT_IND_PRESENT (PcieSlotCap
)
4350 ShellPrintEx (-1, -1,
4351 L
" Power Indicator Present(4): %E%d%N\r\n",
4352 PCIE_CAP_PWD_IND_PRESENT (PcieSlotCap
)
4354 ShellPrintEx (-1, -1,
4355 L
" Hot-Plug Surprise(5): %E%d%N\r\n",
4356 PCIE_CAP_HOTPLUG_SUPPRISE (PcieSlotCap
)
4358 ShellPrintEx (-1, -1,
4359 L
" Hot-Plug Capable(6): %E%d%N\r\n",
4360 PCIE_CAP_HOTPLUG_CAPABLE (PcieSlotCap
)
4362 ShellPrintEx (-1, -1,
4363 L
" Slot Power Limit Value(14:7): %E0x%02x%N\r\n",
4364 PCIE_CAP_SLOT_PWR_LIMIT_VALUE (PcieSlotCap
)
4366 ShellPrintEx (-1, -1,
4367 L
" Slot Power Limit Scale(16:15): %E%s%N\r\n",
4368 SlotPwrLmtScaleTable
[PCIE_CAP_SLOT_PWR_LIMIT_SCALE (PcieSlotCap
)]
4370 ShellPrintEx (-1, -1,
4371 L
" Electromechanical Interlock Present(17): %E%d%N\r\n",
4372 PCIE_CAP_ELEC_INTERLOCK_PRESENT (PcieSlotCap
)
4374 ShellPrintEx (-1, -1,
4375 L
" No Command Completed Support(18): %E%d%N\r\n",
4376 PCIE_CAP_NO_COMM_COMPLETED_SUP (PcieSlotCap
)
4378 ShellPrintEx (-1, -1,
4379 L
" Physical Slot Number(31:19): %E%d%N\r\n",
4380 PCIE_CAP_PHY_SLOT_NUM (PcieSlotCap
)
4387 Print out information of the device slot control information.
4389 @param[in] PciExpressCap The pointer to the structure about the device.
4391 @retval EFI_SUCCESS The operation was successful.
4394 ExplainPcieSlotControl (
4395 IN PCIE_CAP_STURCTURE
*PciExpressCap
4398 UINT16 PcieSlotControl
;
4400 PcieSlotControl
= PciExpressCap
->SlotControl
;
4401 ShellPrintEx (-1, -1,
4402 L
" Attention Button Pressed Enable(0): %E%d%N\r\n",
4403 PCIE_CAP_ATT_BUT_ENABLE (PcieSlotControl
)
4405 ShellPrintEx (-1, -1,
4406 L
" Power Fault Detected Enable(1): %E%d%N\r\n",
4407 PCIE_CAP_PWR_FLT_DETECT_ENABLE (PcieSlotControl
)
4409 ShellPrintEx (-1, -1,
4410 L
" MRL Sensor Changed Enable(2): %E%d%N\r\n",
4411 PCIE_CAP_MRL_SENSOR_CHANGE_ENABLE (PcieSlotControl
)
4413 ShellPrintEx (-1, -1,
4414 L
" Presence Detect Changed Enable(3): %E%d%N\r\n",
4415 PCIE_CAP_PRES_DETECT_CHANGE_ENABLE (PcieSlotControl
)
4417 ShellPrintEx (-1, -1,
4418 L
" Command Completed Interrupt Enable(4): %E%d%N\r\n",
4419 PCIE_CAP_COMM_CMPL_INT_ENABLE (PcieSlotControl
)
4421 ShellPrintEx (-1, -1,
4422 L
" Hot-Plug Interrupt Enable(5): %E%d%N\r\n",
4423 PCIE_CAP_HOTPLUG_INT_ENABLE (PcieSlotControl
)
4425 ShellPrintEx (-1, -1,
4426 L
" Attention Indicator Control(7:6): %E%s%N\r\n",
4427 IndicatorTable
[PCIE_CAP_ATT_IND_CTRL (PcieSlotControl
)]
4429 ShellPrintEx (-1, -1,
4430 L
" Power Indicator Control(9:8): %E%s%N\r\n",
4431 IndicatorTable
[PCIE_CAP_PWR_IND_CTRL (PcieSlotControl
)]
4433 ShellPrintEx (-1, -1, L
" Power Controller Control(10): %EPower ");
4434 if (PCIE_CAP_PWR_CTRLLER_CTRL (PcieSlotControl
)) {
4435 ShellPrintEx (-1, -1, L
"Off%N\r\n");
4437 ShellPrintEx (-1, -1, L
"On%N\r\n");
4439 ShellPrintEx (-1, -1,
4440 L
" Electromechanical Interlock Control(11): %E%d%N\r\n",
4441 PCIE_CAP_ELEC_INTERLOCK_CTRL (PcieSlotControl
)
4443 ShellPrintEx (-1, -1,
4444 L
" Data Link Layer State Changed Enable(12): %E%d%N\r\n",
4445 PCIE_CAP_DLINK_STAT_CHANGE_ENABLE (PcieSlotControl
)
4451 Print out information of the device slot status information.
4453 @param[in] PciExpressCap The pointer to the structure about the device.
4455 @retval EFI_SUCCESS The operation was successful.
4458 ExplainPcieSlotStatus (
4459 IN PCIE_CAP_STURCTURE
*PciExpressCap
4462 UINT16 PcieSlotStatus
;
4464 PcieSlotStatus
= PciExpressCap
->SlotStatus
;
4466 ShellPrintEx (-1, -1,
4467 L
" Attention Button Pressed(0): %E%d%N\r\n",
4468 PCIE_CAP_ATT_BUT_PRESSED (PcieSlotStatus
)
4470 ShellPrintEx (-1, -1,
4471 L
" Power Fault Detected(1): %E%d%N\r\n",
4472 PCIE_CAP_PWR_FLT_DETECTED (PcieSlotStatus
)
4474 ShellPrintEx (-1, -1,
4475 L
" MRL Sensor Changed(2): %E%d%N\r\n",
4476 PCIE_CAP_MRL_SENSOR_CHANGED (PcieSlotStatus
)
4478 ShellPrintEx (-1, -1,
4479 L
" Presence Detect Changed(3): %E%d%N\r\n",
4480 PCIE_CAP_PRES_DETECT_CHANGED (PcieSlotStatus
)
4482 ShellPrintEx (-1, -1,
4483 L
" Command Completed(4): %E%d%N\r\n",
4484 PCIE_CAP_COMM_COMPLETED (PcieSlotStatus
)
4486 ShellPrintEx (-1, -1, L
" MRL Sensor State(5): %EMRL ");
4487 if (PCIE_CAP_MRL_SENSOR_STATE (PcieSlotStatus
)) {
4488 ShellPrintEx (-1, -1, L
" Opened%N\r\n");
4490 ShellPrintEx (-1, -1, L
" Closed%N\r\n");
4492 ShellPrintEx (-1, -1, L
" Presence Detect State(6): ");
4493 if (PCIE_CAP_PRES_DETECT_STATE (PcieSlotStatus
)) {
4494 ShellPrintEx (-1, -1, L
"%ECard Present in slot%N\r\n");
4496 ShellPrintEx (-1, -1, L
"%ESlot Empty%N\r\n");
4498 ShellPrintEx (-1, -1, L
" Electromechanical Interlock Status(7): %EElectromechanical Interlock ");
4499 if (PCIE_CAP_ELEC_INTERLOCK_STATE (PcieSlotStatus
)) {
4500 ShellPrintEx (-1, -1, L
"Engaged%N\r\n");
4502 ShellPrintEx (-1, -1, L
"Disengaged%N\r\n");
4504 ShellPrintEx (-1, -1,
4505 L
" Data Link Layer State Changed(8): %E%d%N\r\n",
4506 PCIE_CAP_DLINK_STAT_CHANGED (PcieSlotStatus
)
4512 Print out information of the device root information.
4514 @param[in] PciExpressCap The pointer to the structure about the device.
4516 @retval EFI_SUCCESS The operation was successful.
4519 ExplainPcieRootControl (
4520 IN PCIE_CAP_STURCTURE
*PciExpressCap
4523 UINT16 PcieRootControl
;
4525 PcieRootControl
= PciExpressCap
->RootControl
;
4527 ShellPrintEx (-1, -1,
4528 L
" System Error on Correctable Error Enable(0): %E%d%N\r\n",
4529 PCIE_CAP_SYSERR_ON_CORERR_EN (PcieRootControl
)
4531 ShellPrintEx (-1, -1,
4532 L
" System Error on Non-Fatal Error Enable(1): %E%d%N\r\n",
4533 PCIE_CAP_SYSERR_ON_NONFATERR_EN (PcieRootControl
)
4535 ShellPrintEx (-1, -1,
4536 L
" System Error on Fatal Error Enable(2): %E%d%N\r\n",
4537 PCIE_CAP_SYSERR_ON_FATERR_EN (PcieRootControl
)
4539 ShellPrintEx (-1, -1,
4540 L
" PME Interrupt Enable(3): %E%d%N\r\n",
4541 PCIE_CAP_PME_INT_ENABLE (PcieRootControl
)
4543 ShellPrintEx (-1, -1,
4544 L
" CRS Software Visibility Enable(4): %E%d%N\r\n",
4545 PCIE_CAP_CRS_SW_VIS_ENABLE (PcieRootControl
)
4552 Print out information of the device root capability information.
4554 @param[in] PciExpressCap The pointer to the structure about the device.
4556 @retval EFI_SUCCESS The operation was successful.
4559 ExplainPcieRootCap (
4560 IN PCIE_CAP_STURCTURE
*PciExpressCap
4565 PcieRootCap
= PciExpressCap
->RsvdP
;
4567 ShellPrintEx (-1, -1,
4568 L
" CRS Software Visibility(0): %E%d%N\r\n",
4569 PCIE_CAP_CRS_SW_VIS (PcieRootCap
)
4576 Print out information of the device root status information.
4578 @param[in] PciExpressCap The pointer to the structure about the device.
4580 @retval EFI_SUCCESS The operation was successful.
4583 ExplainPcieRootStatus (
4584 IN PCIE_CAP_STURCTURE
*PciExpressCap
4587 UINT32 PcieRootStatus
;
4589 PcieRootStatus
= PciExpressCap
->RootStatus
;
4591 ShellPrintEx (-1, -1,
4592 L
" PME Requester ID(15:0): %E0x%04x%N\r\n",
4593 PCIE_CAP_PME_REQ_ID (PcieRootStatus
)
4595 ShellPrintEx (-1, -1,
4596 L
" PME Status(16): %E%d%N\r\n",
4597 PCIE_CAP_PME_STATUS (PcieRootStatus
)
4599 ShellPrintEx (-1, -1,
4600 L
" PME Pending(17): %E%d%N\r\n",
4601 PCIE_CAP_PME_PENDING (PcieRootStatus
)
4607 Function to interpret and print out the link control structure
4609 @param[in] HeaderAddress The Address of this capability header.
4610 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4614 PrintInterpretedExtendedCompatibilityLinkControl (
4615 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4616 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4619 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL
*Header
;
4620 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL
*)HeaderAddress
;
4624 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_CONTROL
),
4625 gShellDebug1HiiHandle
,
4626 Header
->RootComplexLinkCapabilities
,
4627 Header
->RootComplexLinkControl
,
4628 Header
->RootComplexLinkStatus
4632 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4633 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_INTERNAL_LINK_CONTROL
),
4634 (VOID
*) (HeaderAddress
)
4636 return (EFI_SUCCESS
);
4640 Function to interpret and print out the power budgeting structure
4642 @param[in] HeaderAddress The Address of this capability header.
4643 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4647 PrintInterpretedExtendedCompatibilityPowerBudgeting (
4648 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4649 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4652 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING
*Header
;
4653 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING
*)HeaderAddress
;
4657 STRING_TOKEN (STR_PCI_EXT_CAP_POWER
),
4658 gShellDebug1HiiHandle
,
4661 Header
->PowerBudgetCapability
4665 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4666 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_POWER_BUDGETING
),
4667 (VOID
*) (HeaderAddress
)
4669 return (EFI_SUCCESS
);
4673 Function to interpret and print out the ACS structure
4675 @param[in] HeaderAddress The Address of this capability header.
4676 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4680 PrintInterpretedExtendedCompatibilityAcs (
4681 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4682 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4685 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED
*Header
;
4689 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED
*)HeaderAddress
;
4694 STRING_TOKEN (STR_PCI_EXT_CAP_ACS
),
4695 gShellDebug1HiiHandle
,
4696 Header
->AcsCapability
,
4699 if (PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_CONTROL(Header
)) {
4700 VectorSize
= PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_GET_EGRES_VECTOR_SIZE(Header
);
4701 if (VectorSize
== 0) {
4704 for (LoopCounter
= 0 ; LoopCounter
* 8 < VectorSize
; LoopCounter
++) {
4707 STRING_TOKEN (STR_PCI_EXT_CAP_ACS2
),
4708 gShellDebug1HiiHandle
,
4710 Header
->EgressControlVectorArray
[LoopCounter
]
4716 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4717 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ACS_EXTENDED
) + (VectorSize
/ 8) - 1,
4718 (VOID
*) (HeaderAddress
)
4720 return (EFI_SUCCESS
);
4724 Function to interpret and print out the latency tolerance reporting structure
4726 @param[in] HeaderAddress The Address of this capability header.
4727 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4731 PrintInterpretedExtendedCompatibilityLatencyToleranceReporting (
4732 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4733 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4736 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING
*Header
;
4737 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING
*)HeaderAddress
;
4741 STRING_TOKEN (STR_PCI_EXT_CAP_LAT
),
4742 gShellDebug1HiiHandle
,
4743 Header
->MaxSnoopLatency
,
4744 Header
->MaxNoSnoopLatency
4748 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4749 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_LATENCE_TOLERANCE_REPORTING
),
4750 (VOID
*) (HeaderAddress
)
4752 return (EFI_SUCCESS
);
4756 Function to interpret and print out the serial number structure
4758 @param[in] HeaderAddress The Address of this capability header.
4759 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4763 PrintInterpretedExtendedCompatibilitySerialNumber (
4764 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4765 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4768 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER
*Header
;
4769 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER
*)HeaderAddress
;
4773 STRING_TOKEN (STR_PCI_EXT_CAP_SN
),
4774 gShellDebug1HiiHandle
,
4775 Header
->SerialNumber
4779 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4780 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_SERIAL_NUMBER
),
4781 (VOID
*) (HeaderAddress
)
4783 return (EFI_SUCCESS
);
4787 Function to interpret and print out the RCRB structure
4789 @param[in] HeaderAddress The Address of this capability header.
4790 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4794 PrintInterpretedExtendedCompatibilityRcrb (
4795 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4796 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4799 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER
*Header
;
4800 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER
*)HeaderAddress
;
4804 STRING_TOKEN (STR_PCI_EXT_CAP_RCRB
),
4805 gShellDebug1HiiHandle
,
4808 Header
->RcrbCapabilities
,
4813 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4814 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_RCRB_HEADER
),
4815 (VOID
*) (HeaderAddress
)
4817 return (EFI_SUCCESS
);
4821 Function to interpret and print out the vendor specific structure
4823 @param[in] HeaderAddress The Address of this capability header.
4824 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4828 PrintInterpretedExtendedCompatibilityVendorSpecific (
4829 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4830 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4833 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC
*Header
;
4834 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_VENDOR_SPECIFIC
*)HeaderAddress
;
4838 STRING_TOKEN (STR_PCI_EXT_CAP_VEN
),
4839 gShellDebug1HiiHandle
,
4840 Header
->VendorSpecificHeader
4844 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4845 PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_GET_SIZE(Header
),
4846 (VOID
*) (HeaderAddress
)
4848 return (EFI_SUCCESS
);
4852 Function to interpret and print out the Event Collector Endpoint Association structure
4854 @param[in] HeaderAddress The Address of this capability header.
4855 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4859 PrintInterpretedExtendedCompatibilityECEA (
4860 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4861 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4864 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION
*Header
;
4865 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION
*)HeaderAddress
;
4869 STRING_TOKEN (STR_PCI_EXT_CAP_ECEA
),
4870 gShellDebug1HiiHandle
,
4871 Header
->AssociationBitmap
4875 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4876 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION
),
4877 (VOID
*) (HeaderAddress
)
4879 return (EFI_SUCCESS
);
4883 Function to interpret and print out the ARI structure
4885 @param[in] HeaderAddress The Address of this capability header.
4886 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4890 PrintInterpretedExtendedCompatibilityAri (
4891 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4892 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4895 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY
*Header
;
4896 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY
*)HeaderAddress
;
4900 STRING_TOKEN (STR_PCI_EXT_CAP_ARI
),
4901 gShellDebug1HiiHandle
,
4902 Header
->AriCapability
,
4907 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4908 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ARI_CAPABILITY
),
4909 (VOID
*) (HeaderAddress
)
4911 return (EFI_SUCCESS
);
4915 Function to interpret and print out the DPA structure
4917 @param[in] HeaderAddress The Address of this capability header.
4918 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4922 PrintInterpretedExtendedCompatibilityDynamicPowerAllocation (
4923 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4924 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4927 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION
*Header
;
4929 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION
*)HeaderAddress
;
4933 STRING_TOKEN (STR_PCI_EXT_CAP_DPA
),
4934 gShellDebug1HiiHandle
,
4935 Header
->DpaCapability
,
4936 Header
->DpaLatencyIndicator
,
4940 for (LinkCount
= 0 ; LinkCount
< PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(Header
) + 1 ; LinkCount
++) {
4943 STRING_TOKEN (STR_PCI_EXT_CAP_DPA2
),
4944 gShellDebug1HiiHandle
,
4946 Header
->DpaPowerAllocationArray
[LinkCount
]
4951 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4952 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_DYNAMIC_POWER_ALLOCATION
) - 1 + PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_GET_SUBSTATE_MAX(Header
),
4953 (VOID
*) (HeaderAddress
)
4955 return (EFI_SUCCESS
);
4959 Function to interpret and print out the link declaration structure
4961 @param[in] HeaderAddress The Address of this capability header.
4962 @param[in] HeadersBaseAddress The address of all the extended capability headers.
4966 PrintInterpretedExtendedCompatibilityLinkDeclaration (
4967 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
4968 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
4971 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION
*Header
;
4973 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION
*)HeaderAddress
;
4977 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR
),
4978 gShellDebug1HiiHandle
,
4979 Header
->ElementSelfDescription
4982 for (LinkCount
= 0 ; LinkCount
< PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(Header
) ; LinkCount
++) {
4985 STRING_TOKEN (STR_PCI_EXT_CAP_LINK_DECLAR2
),
4986 gShellDebug1HiiHandle
,
4988 Header
->LinkEntry
[LinkCount
]
4993 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
4994 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_LINK_DECLARATION
) + (PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_GET_LINK_COUNT(Header
)-1)*sizeof(UINT32
),
4995 (VOID
*) (HeaderAddress
)
4997 return (EFI_SUCCESS
);
5001 Function to interpret and print out the Advanced Error Reporting structure
5003 @param[in] HeaderAddress The Address of this capability header.
5004 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5008 PrintInterpretedExtendedCompatibilityAer (
5009 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5010 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
5013 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING
*Header
;
5014 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING
*)HeaderAddress
;
5018 STRING_TOKEN (STR_PCI_EXT_CAP_AER
),
5019 gShellDebug1HiiHandle
,
5020 Header
->UncorrectableErrorStatus
,
5021 Header
->UncorrectableErrorMask
,
5022 Header
->UncorrectableErrorSeverity
,
5023 Header
->CorrectableErrorStatus
,
5024 Header
->CorrectableErrorMask
,
5025 Header
->AdvancedErrorCapabilitiesAndControl
,
5027 Header
->RootErrorCommand
,
5028 Header
->RootErrorStatus
,
5029 Header
->ErrorSourceIdentification
,
5030 Header
->CorrectableErrorSourceIdentification
,
5031 Header
->TlpPrefixLog
[0],
5032 Header
->TlpPrefixLog
[1],
5033 Header
->TlpPrefixLog
[2],
5034 Header
->TlpPrefixLog
[3]
5038 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5039 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_ADVANCED_ERROR_REPORTING
),
5040 (VOID
*) (HeaderAddress
)
5042 return (EFI_SUCCESS
);
5046 Function to interpret and print out the multicast structure
5048 @param[in] HeaderAddress The Address of this capability header.
5049 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5050 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.
5054 PrintInterpretedExtendedCompatibilityMulticast (
5055 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5056 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
,
5057 IN CONST PCIE_CAP_STURCTURE
*PciExpressCapPtr
5060 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST
*Header
;
5061 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST
*)HeaderAddress
;
5065 STRING_TOKEN (STR_PCI_EXT_CAP_MULTICAST
),
5066 gShellDebug1HiiHandle
,
5067 Header
->MultiCastCapability
,
5068 Header
->MulticastControl
,
5069 Header
->McBaseAddress
,
5070 Header
->McReceiveAddress
,
5072 Header
->McBlockUntranslated
,
5073 Header
->McOverlayBar
5078 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5079 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_MULTICAST
),
5080 (VOID
*) (HeaderAddress
)
5083 return (EFI_SUCCESS
);
5087 Function to interpret and print out the virtual channel and multi virtual channel structure
5089 @param[in] HeaderAddress The Address of this capability header.
5090 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5094 PrintInterpretedExtendedCompatibilityVirtualChannel (
5095 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5096 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
5099 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY
*Header
;
5100 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC
*CapabilityItem
;
5102 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY
*)HeaderAddress
;
5106 STRING_TOKEN (STR_PCI_EXT_CAP_VC_BASE
),
5107 gShellDebug1HiiHandle
,
5108 Header
->ExtendedVcCount
,
5109 Header
->PortVcCapability1
,
5110 Header
->PortVcCapability2
,
5111 Header
->VcArbTableOffset
,
5112 Header
->PortVcControl
,
5113 Header
->PortVcStatus
5115 for (ItemCount
= 0 ; ItemCount
< Header
->ExtendedVcCount
; ItemCount
++) {
5116 CapabilityItem
= &Header
->Capability
[ItemCount
];
5119 STRING_TOKEN (STR_PCI_EXT_CAP_VC_ITEM
),
5120 gShellDebug1HiiHandle
,
5122 CapabilityItem
->VcResourceCapability
,
5123 CapabilityItem
->PortArbTableOffset
,
5124 CapabilityItem
->VcResourceControl
,
5125 CapabilityItem
->VcResourceStatus
5131 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5132 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_VC
) + (Header
->ExtendedVcCount
- 1) * sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_VIRTUAL_CHANNEL_CAPABILITY
),
5133 (VOID
*) (HeaderAddress
)
5136 return (EFI_SUCCESS
);
5140 Function to interpret and print out the resizeable bar structure
5142 @param[in] HeaderAddress The Address of this capability header.
5143 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5147 PrintInterpretedExtendedCompatibilityResizeableBar (
5148 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5149 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
5152 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR
*Header
;
5154 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR
*)HeaderAddress
;
5156 for (ItemCount
= 0 ; ItemCount
< (UINT32
)GET_NUMBER_RESIZABLE_BARS(Header
) ; ItemCount
++) {
5159 STRING_TOKEN (STR_PCI_EXT_CAP_RESIZE_BAR
),
5160 gShellDebug1HiiHandle
,
5162 Header
->Capability
[ItemCount
].ResizableBarCapability
,
5163 Header
->Capability
[ItemCount
].ResizableBarControl
5169 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5170 (UINT32
)GET_NUMBER_RESIZABLE_BARS(Header
) * sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_RESIZABLE_BAR_ENTRY
),
5171 (VOID
*) (HeaderAddress
)
5174 return (EFI_SUCCESS
);
5178 Function to interpret and print out the TPH structure
5180 @param[in] HeaderAddress The Address of this capability header.
5181 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5185 PrintInterpretedExtendedCompatibilityTph (
5186 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5187 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
5190 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH
*Header
;
5191 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH
*)HeaderAddress
;
5195 STRING_TOKEN (STR_PCI_EXT_CAP_TPH
),
5196 gShellDebug1HiiHandle
,
5197 Header
->TphRequesterCapability
,
5198 Header
->TphRequesterControl
5202 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)Header
->TphStTable
- (UINT8
*)HeadersBaseAddress
),
5203 GET_TPH_TABLE_SIZE(Header
),
5204 (VOID
*)Header
->TphStTable
5209 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5210 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH
) + GET_TPH_TABLE_SIZE(Header
) - sizeof(UINT16
),
5211 (VOID
*) (HeaderAddress
)
5214 return (EFI_SUCCESS
);
5218 Function to interpret and print out the secondary PCIe capability structure
5220 @param[in] HeaderAddress The Address of this capability header.
5221 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5222 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.
5226 PrintInterpretedExtendedCompatibilitySecondary (
5227 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5228 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
,
5229 IN CONST PCIE_CAP_STURCTURE
*PciExpressCapPtr
5232 CONST PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE
*Header
;
5233 Header
= (PCI_EXPRESS_EXTENDED_CAPABILITIES_SECONDARY_PCIE
*)HeaderAddress
;
5237 STRING_TOKEN (STR_PCI_EXT_CAP_SECONDARY
),
5238 gShellDebug1HiiHandle
,
5239 Header
->LinkControl3
,
5240 Header
->LaneErrorStatus
5244 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)Header
->EqualizationControl
- (UINT8
*)HeadersBaseAddress
),
5245 PCIE_CAP_MAX_LINK_WIDTH(PciExpressCapPtr
->LinkCap
),
5246 (VOID
*)Header
->EqualizationControl
5251 EFI_PCIE_CAPABILITY_BASE_OFFSET
+ ((UINT8
*)HeaderAddress
- (UINT8
*)HeadersBaseAddress
),
5252 sizeof(PCI_EXPRESS_EXTENDED_CAPABILITIES_TPH
) - sizeof(Header
->EqualizationControl
) + PCIE_CAP_MAX_LINK_WIDTH(PciExpressCapPtr
->LinkCap
),
5253 (VOID
*) (HeaderAddress
)
5256 return (EFI_SUCCESS
);
5260 Display Pcie extended capability details
5262 @param[in] HeadersBaseAddress The address of all the extended capability headers.
5263 @param[in] HeaderAddress The address of this capability header.
5264 @param[in] PciExpressCapPtr The address of the PCIe capabilities structure.
5268 PrintPciExtendedCapabilityDetails(
5269 IN CONST PCI_EXP_EXT_HDR
*HeadersBaseAddress
,
5270 IN CONST PCI_EXP_EXT_HDR
*HeaderAddress
,
5271 IN CONST PCIE_CAP_STURCTURE
*PciExpressCapPtr
5274 switch (HeaderAddress
->CapabilityId
){
5275 case PCI_EXPRESS_EXTENDED_CAPABILITY_ADVANCED_ERROR_REPORTING_ID
:
5276 return PrintInterpretedExtendedCompatibilityAer(HeaderAddress
, HeadersBaseAddress
);
5278 case PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_CONTROL_ID
:
5279 return PrintInterpretedExtendedCompatibilityLinkControl(HeaderAddress
, HeadersBaseAddress
);
5281 case PCI_EXPRESS_EXTENDED_CAPABILITY_LINK_DECLARATION_ID
:
5282 return PrintInterpretedExtendedCompatibilityLinkDeclaration(HeaderAddress
, HeadersBaseAddress
);
5284 case PCI_EXPRESS_EXTENDED_CAPABILITY_SERIAL_NUMBER_ID
:
5285 return PrintInterpretedExtendedCompatibilitySerialNumber(HeaderAddress
, HeadersBaseAddress
);
5287 case PCI_EXPRESS_EXTENDED_CAPABILITY_POWER_BUDGETING_ID
:
5288 return PrintInterpretedExtendedCompatibilityPowerBudgeting(HeaderAddress
, HeadersBaseAddress
);
5290 case PCI_EXPRESS_EXTENDED_CAPABILITY_ACS_EXTENDED_ID
:
5291 return PrintInterpretedExtendedCompatibilityAcs(HeaderAddress
, HeadersBaseAddress
);
5293 case PCI_EXPRESS_EXTENDED_CAPABILITY_LATENCE_TOLERANCE_REPORTING_ID
:
5294 return PrintInterpretedExtendedCompatibilityLatencyToleranceReporting(HeaderAddress
, HeadersBaseAddress
);
5296 case PCI_EXPRESS_EXTENDED_CAPABILITY_ARI_CAPABILITY_ID
:
5297 return PrintInterpretedExtendedCompatibilityAri(HeaderAddress
, HeadersBaseAddress
);
5299 case PCI_EXPRESS_EXTENDED_CAPABILITY_RCRB_HEADER_ID
:
5300 return PrintInterpretedExtendedCompatibilityRcrb(HeaderAddress
, HeadersBaseAddress
);
5302 case PCI_EXPRESS_EXTENDED_CAPABILITY_VENDOR_SPECIFIC_ID
:
5303 return PrintInterpretedExtendedCompatibilityVendorSpecific(HeaderAddress
, HeadersBaseAddress
);
5305 case PCI_EXPRESS_EXTENDED_CAPABILITY_DYNAMIC_POWER_ALLOCATION_ID
:
5306 return PrintInterpretedExtendedCompatibilityDynamicPowerAllocation(HeaderAddress
, HeadersBaseAddress
);
5308 case PCI_EXPRESS_EXTENDED_CAPABILITY_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_ID
:
5309 return PrintInterpretedExtendedCompatibilityECEA(HeaderAddress
, HeadersBaseAddress
);
5311 case PCI_EXPRESS_EXTENDED_CAPABILITY_VIRTUAL_CHANNEL_ID
:
5312 case PCI_EXPRESS_EXTENDED_CAPABILITY_MULTI_FUNCTION_VIRTUAL_CHANNEL_ID
:
5313 return PrintInterpretedExtendedCompatibilityVirtualChannel(HeaderAddress
, HeadersBaseAddress
);
5315 case PCI_EXPRESS_EXTENDED_CAPABILITY_MULTICAST_ID
:
5317 // should only be present if PCIE_CAP_DEVICEPORT_TYPE(PciExpressCapPtr->PcieCapReg) == 0100b, 0101b, or 0110b
5319 return PrintInterpretedExtendedCompatibilityMulticast(HeaderAddress
, HeadersBaseAddress
, PciExpressCapPtr
);
5321 case PCI_EXPRESS_EXTENDED_CAPABILITY_RESIZABLE_BAR_ID
:
5322 return PrintInterpretedExtendedCompatibilityResizeableBar(HeaderAddress
, HeadersBaseAddress
);
5324 case PCI_EXPRESS_EXTENDED_CAPABILITY_TPH_ID
:
5325 return PrintInterpretedExtendedCompatibilityTph(HeaderAddress
, HeadersBaseAddress
);
5327 case PCI_EXPRESS_EXTENDED_CAPABILITY_SECONDARY_PCIE_ID
:
5328 return PrintInterpretedExtendedCompatibilitySecondary(HeaderAddress
, HeadersBaseAddress
, PciExpressCapPtr
);
5331 ShellPrintEx (-1, -1,
5332 L
"Unknown PCIe extended capability ID (%04xh). No interpretation available.\r\n",
5333 HeaderAddress
->CapabilityId
5342 Display Pcie device structure.
5344 @param[in] IoDev The pointer to the root pci protocol.
5345 @param[in] Address The Address to start at.
5346 @param[in] CapabilityPtr The offset from the address to start.
5349 PciExplainPciExpress (
5350 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL
*IoDev
,
5352 IN UINT8 CapabilityPtr
,
5353 IN CONST UINT16 EnhancedDump
5357 PCIE_CAP_STURCTURE PciExpressCap
;
5359 UINT64 CapRegAddress
;
5364 UINTN ExtendRegSize
;
5365 UINT64 Pciex_Address
;
5366 UINT8 DevicePortType
;
5370 PCI_EXP_EXT_HDR
*ExtHdr
;
5372 CapRegAddress
= Address
+ CapabilityPtr
;
5377 sizeof (PciExpressCap
) / sizeof (UINT32
),
5381 DevicePortType
= (UINT8
) PCIE_CAP_DEVICEPORT_TYPE (PciExpressCap
.PcieCapReg
);
5383 ShellPrintEx (-1, -1, L
"\r\nPci Express device capability structure:\r\n");
5385 for (Index
= 0; PcieExplainList
[Index
].Type
< PcieExplainTypeMax
; Index
++) {
5386 if (ShellGetExecutionBreakFlag()) {
5389 RegAddr
= ((UINT8
*) &PciExpressCap
) + PcieExplainList
[Index
].Offset
;
5390 switch (PcieExplainList
[Index
].Width
) {
5391 case FieldWidthUINT8
:
5392 RegValue
= *(UINT8
*) RegAddr
;
5394 case FieldWidthUINT16
:
5395 RegValue
= *(UINT16
*) RegAddr
;
5397 case FieldWidthUINT32
:
5398 RegValue
= *(UINT32
*) RegAddr
;
5404 ShellPrintHiiEx(-1, -1, NULL
,
5405 PcieExplainList
[Index
].Token
,
5406 gShellDebug1HiiHandle
,
5407 PcieExplainList
[Index
].Offset
,
5410 if (PcieExplainList
[Index
].Func
== NULL
) {
5413 switch (PcieExplainList
[Index
].Type
) {
5414 case PcieExplainTypeLink
:
5416 // Link registers should not be used by
5417 // a) Root Complex Integrated Endpoint
5418 // b) Root Complex Event Collector
5420 if (DevicePortType
== PCIE_ROOT_COMPLEX_INTEGRATED_PORT
||
5421 DevicePortType
== PCIE_ROOT_COMPLEX_EVENT_COLLECTOR
) {
5425 case PcieExplainTypeSlot
:
5427 // Slot registers are only valid for
5428 // a) Root Port of PCI Express Root Complex
5429 // b) Downstream Port of PCI Express Switch
5430 // and when SlotImplemented bit is set in PCIE cap register.
5432 if ((DevicePortType
!= PCIE_ROOT_COMPLEX_ROOT_PORT
&&
5433 DevicePortType
!= PCIE_SWITCH_DOWNSTREAM_PORT
) ||
5434 !PCIE_CAP_SLOT_IMPLEMENTED (PciExpressCap
.PcieCapReg
)) {
5438 case PcieExplainTypeRoot
:
5440 // Root registers are only valid for
5441 // Root Port of PCI Express Root Complex
5443 if (DevicePortType
!= PCIE_ROOT_COMPLEX_ROOT_PORT
) {
5450 PcieExplainList
[Index
].Func (&PciExpressCap
);
5453 Bus
= (UINT8
) (RShiftU64 (Address
, 24));
5454 Dev
= (UINT8
) (RShiftU64 (Address
, 16));
5455 Func
= (UINT8
) (RShiftU64 (Address
, 8));
5457 Pciex_Address
= CALC_EFI_PCIEX_ADDRESS (Bus
, Dev
, Func
, EFI_PCIE_CAPABILITY_BASE_OFFSET
);
5459 ExtendRegSize
= 0x1000 - EFI_PCIE_CAPABILITY_BASE_OFFSET
;
5461 ExRegBuffer
= (UINT8
*) AllocateZeroPool (ExtendRegSize
);
5464 // PciRootBridgeIo protocol should support pci express extend space IO
5465 // (Begins at offset EFI_PCIE_CAPABILITY_BASE_OFFSET)
5467 Status
= IoDev
->Pci
.Read (
5471 (ExtendRegSize
) / sizeof (UINT32
),
5472 (VOID
*) (ExRegBuffer
)
5474 if (EFI_ERROR (Status
) || ExRegBuffer
== NULL
) {
5475 SHELL_FREE_NON_NULL(ExRegBuffer
);
5476 return EFI_UNSUPPORTED
;
5479 if (EnhancedDump
== 0) {
5481 // Print the PciEx extend space in raw bytes ( 0xFF-0xFFF)
5483 ShellPrintEx (-1, -1, L
"\r\n%HStart dumping PCIex extended configuration space (0x100 - 0xFFF).%N\r\n\r\n");
5487 EFI_PCIE_CAPABILITY_BASE_OFFSET
,
5489 (VOID
*) (ExRegBuffer
)
5492 ExtHdr
= (PCI_EXP_EXT_HDR
*)ExRegBuffer
;
5493 while (ExtHdr
->CapabilityId
!= 0 && ExtHdr
->CapabilityVersion
!= 0) {
5495 // Process this item
5497 if (EnhancedDump
== 0xFFFF || EnhancedDump
== ExtHdr
->CapabilityId
) {
5501 PrintPciExtendedCapabilityDetails((PCI_EXP_EXT_HDR
*)ExRegBuffer
, ExtHdr
, &PciExpressCap
);
5505 // Advance to the next item if it exists
5507 if (ExtHdr
->NextCapabilityOffset
!= 0) {
5508 ExtHdr
= (PCI_EXP_EXT_HDR
*)((UINT8
*)ExRegBuffer
+ ExtHdr
->NextCapabilityOffset
);
5514 SHELL_FREE_NON_NULL(ExRegBuffer
);