]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: QemuBootOrder: recognize virtio-scsi devices
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Oct 2012 17:08:01 +0000 (17:08 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Oct 2012 17:08:01 +0000 (17:08 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13868 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c

index 9807039f2ff9b2db354d8810e154b7f781d3aff2..d2d60c389f0daeba1e8e4d616faaea585a87ad52 100644 (file)
@@ -632,6 +632,51 @@ TranslateOfwNodes (
       PciDevFun[0],\r
       PciDevFun[1]\r
       );\r
+  } else if (NumNodes >= 4 &&\r
+             SubstringEq (OfwNode[1].DriverName, "scsi") &&\r
+             SubstringEq (OfwNode[2].DriverName, "channel") &&\r
+             SubstringEq (OfwNode[3].DriverName, "disk")\r
+             ) {\r
+    //\r
+    // OpenFirmware device path (virtio-scsi disk):\r
+    //\r
+    //   /pci@i0cf8/scsi@7[,3]/channel@0/disk@2,3\r
+    //        ^          ^             ^      ^ ^\r
+    //        |          |             |      | LUN\r
+    //        |          |             |      target\r
+    //        |          |             channel (unused, fixed 0)\r
+    //        |          PCI slot[, function] holding SCSI controller\r
+    //        PCI root at system bus port, PIO\r
+    //\r
+    // UEFI device path prefix:\r
+    //\r
+    //   PciRoot(0x0)/Pci(0x7,0x0)/Scsi(0x2,0x3)\r
+    //                                        -- if PCI function is 0 or absent\r
+    //   PciRoot(0x0)/Pci(0x7,0x3)/Scsi(0x2,0x3)\r
+    //                                -- if PCI function is present and nonzero\r
+    //\r
+    UINT32 TargetLun[2];\r
+\r
+    TargetLun[1] = 0;\r
+    NumEntries = sizeof (TargetLun) / sizeof (TargetLun[0]);\r
+    if (ParseUnitAddressHexList (\r
+          OfwNode[3].UnitAddress,\r
+          TargetLun,\r
+          &NumEntries\r
+          ) != RETURN_SUCCESS\r
+        ) {\r
+      return RETURN_UNSUPPORTED;\r
+    }\r
+\r
+    Written = UnicodeSPrintAsciiFormat (\r
+      Translated,\r
+      *TranslatedSize * sizeof (*Translated), // BufferSize in bytes\r
+      "PciRoot(0x0)/Pci(0x%x,0x%x)/Scsi(0x%x,0x%x)",\r
+      PciDevFun[0],\r
+      PciDevFun[1],\r
+      TargetLun[0],\r
+      TargetLun[1]\r
+      );\r
   } else {\r
     return RETURN_UNSUPPORTED;\r
   }\r