]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c
OvmfPkg/QemuBootOrderLib: recognize "usb-storage" devices in XHCI ports
[mirror_edk2.git] / OvmfPkg / Library / QemuBootOrderLib / QemuBootOrderLib.c
index 567f6f92f452f87d1c972bc55d7b9c6b3deef131..7c1f375beb20dbb9a28e7a395851b83b8f07b3ab 100644 (file)
@@ -986,6 +986,50 @@ TranslatePciOfwNodes (
       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