]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c
OvmfPkg/QemuBootOrderLib: sort [Sources*] sections in the INF file
[mirror_edk2.git] / OvmfPkg / Library / QemuBootOrderLib / QemuBootOrderLib.c
index 8cbbdb0568fa57639d5491da9a138bf7b534308d..366104adf535294f8db65737e2f4aedeaea53315 100644 (file)
@@ -707,7 +707,7 @@ TranslatePciOfwNodes (
   // 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
@@ -910,7 +910,7 @@ TranslatePciOfwNodes (
     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
@@ -958,7 +958,7 @@ TranslatePciOfwNodes (
     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
@@ -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
@@ -1145,7 +1189,7 @@ TranslateMmioOfwNodes (
     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
@@ -1803,7 +1847,7 @@ SetBootOrderFromQemu (
   //\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
@@ -1817,7 +1861,8 @@ SetBootOrderFromQemu (
       // 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
@@ -1830,12 +1875,11 @@ SetBootOrderFromQemu (
           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