// Parse the OFW nodes starting with the first non-bridge node.\r
//\r
PciDevFun[1] = 0;\r
- NumEntries = sizeof (PciDevFun) / sizeof (PciDevFun[0]);\r
+ NumEntries = ARRAY_SIZE (PciDevFun);\r
if (ParseUnitAddressHexList (\r
OfwNode[FirstNonBridge].UnitAddress,\r
PciDevFun,\r
UINT64 TargetLun[2];\r
\r
TargetLun[1] = 0;\r
- NumEntries = sizeof (TargetLun) / sizeof (TargetLun[0]);\r
+ NumEntries = ARRAY_SIZE (TargetLun);\r
if (ParseUnitAddressHexList (\r
OfwNode[FirstNonBridge + 2].UnitAddress,\r
TargetLun,\r
UINTN RequiredEntries;\r
UINT8 *Eui64;\r
\r
- RequiredEntries = sizeof (Namespace) / sizeof (Namespace[0]);\r
+ RequiredEntries = ARRAY_SIZE (Namespace);\r
NumEntries = RequiredEntries;\r
if (ParseUnitAddressHexList (\r
OfwNode[FirstNonBridge + 1].UnitAddress,\r
Eui64[7], Eui64[6], Eui64[5], Eui64[4],\r
Eui64[3], Eui64[2], Eui64[1], Eui64[0]\r
);\r
+ } else if (NumNodes >= FirstNonBridge + 2 &&\r
+ SubstringEq (OfwNode[FirstNonBridge + 0].DriverName, "usb") &&\r
+ SubstringEq (OfwNode[FirstNonBridge + 1].DriverName, "storage")) {\r
+ //\r
+ // OpenFirmware device path (usb-storage device in XHCI port):\r
+ //\r
+ // /pci@i0cf8/usb@3[,1]/storage@2/channel@0/disk@0,0\r
+ // ^ ^ ^ ^ ^ ^ ^\r
+ // | | | | fixed fixed\r
+ // | | | XHCI port number, 1-based\r
+ // | | PCI function corresponding to XHCI (optional)\r
+ // | PCI slot holding XHCI\r
+ // PCI root at system bus port, PIO\r
+ //\r
+ // UEFI device path prefix:\r
+ //\r
+ // PciRoot(0x0)/Pci(0x3,0x1)/USB(0x1,0x0)\r
+ // ^ ^\r
+ // | XHCI port number in 0-based notation\r
+ // 0x0 if PCI function is 0, or absent from OFW\r
+ //\r
+ RETURN_STATUS ParseStatus;\r
+ UINT64 OneBasedXhciPort;\r
+\r
+ NumEntries = 1;\r
+ ParseStatus = ParseUnitAddressHexList (\r
+ OfwNode[FirstNonBridge + 1].UnitAddress,\r
+ &OneBasedXhciPort,\r
+ &NumEntries\r
+ );\r
+ if (RETURN_ERROR (ParseStatus) || OneBasedXhciPort == 0) {\r
+ return RETURN_UNSUPPORTED;\r
+ }\r
+\r
+ Written = UnicodeSPrintAsciiFormat (\r
+ Translated,\r
+ *TranslatedSize * sizeof (*Translated), // BufferSize in bytes\r
+ "PciRoot(0x%x)%s/Pci(0x%Lx,0x%Lx)/USB(0x%Lx,0x0)",\r
+ PciRoot,\r
+ Bridges,\r
+ PciDevFun[0],\r
+ PciDevFun[1],\r
+ OneBasedXhciPort - 1\r
+ );\r
} else {\r
//\r
// Generic OpenFirmware device path for PCI devices:\r
UINT64 TargetLun[2];\r
\r
TargetLun[1] = 0;\r
- NumEntries = sizeof (TargetLun) / sizeof (TargetLun[0]);\r
+ NumEntries = ARRAY_SIZE (TargetLun);\r
if (ParseUnitAddressHexList (\r
OfwNode[2].UnitAddress,\r
TargetLun,\r
//\r
// translate each OpenFirmware path\r
//\r
- TranslatedSize = sizeof (Translated) / sizeof (Translated[0]);\r
+ TranslatedSize = ARRAY_SIZE (Translated);\r
Status = TranslateOfwPath (&FwCfgPtr, ExtraPciRoots, Translated,\r
&TranslatedSize);\r
while (Status == RETURN_SUCCESS ||\r
// match translated OpenFirmware path against all active boot options\r
//\r
for (Idx = 0; Idx < ActiveCount; ++Idx) {\r
- if (Match (\r
+ if (!ActiveOption[Idx].Appended &&\r
+ Match (\r
Translated,\r
TranslatedSize, // contains length, not size, in CHAR16's here\r
ActiveOption[Idx].BootOption->FilePath\r
if (Status != RETURN_SUCCESS) {\r
goto ErrorFreeExtraPciRoots;\r
}\r
- break;\r
}\r
} // scanned all active boot options\r
} // translation successful\r
\r
- TranslatedSize = sizeof (Translated) / sizeof (Translated[0]);\r
+ TranslatedSize = ARRAY_SIZE (Translated);\r
Status = TranslateOfwPath (&FwCfgPtr, ExtraPciRoots, Translated,\r
&TranslatedSize);\r
} // scanning of OpenFirmware paths done\r