From 0febef91bf836278a5286fe0843551b71d1dc0e0 Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Tue, 22 Sep 2015 11:18:41 +0000 Subject: [PATCH] OvmfPkg: QemuBootOrderLib: recognize Q35 SATA disks / CD-ROMs The OpenFirmware device paths that QEMU generates for these disks and CD-ROMs are very similar to those generated for the i440fx IDE disks and CD-ROMs (including the same number of devpath nodes necessary for unique parsing). The interpretations and the translation to UEFI devpath fragments are different, of course. (The spaces after "ide@1,1" are inserted below only for illustration purposes.) primary or secondary | master or slave v v i440fx IDE: /pci@i0cf8/ide@1,1 /drive@0/disk@0 Q35 SATA: /pci@i0cf8/pci8086,2922@1f,2/drive@1/disk@0 ^ ^ | device number | (fixed 0) channel (port) number The similarity is reflected in the translation output (spaces again inserted for illustration only): i440fx IDE: PciRoot(0x0)/Pci(0x1,0x1) /Ata(Primary,Master,0x0) Q35 SATA: PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x1,0x0,0x0) ^ ^ ^ | | LUN; | | always 0 on Q35 | port multiplier port | number; always 0 on Q35 channel (port) number Cc: Alexander Graf Cc: Reza Jelveh Cc: Jordan Justen Cc: Hannes Reinecke Cc: Gabriel L. Somlo Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Tested-by: Gabriel Somlo Reviewed-by: Jordan Justen git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18531 6f19259b-4bc3-4df7-8a09-765794883524 --- .../QemuBootOrderLib/QemuBootOrderLib.c | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c index 2e9634359d..43dbaffaa4 100644 --- a/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c +++ b/OvmfPkg/Library/QemuBootOrderLib/QemuBootOrderLib.c @@ -769,6 +769,49 @@ TranslatePciOfwNodes ( Secondary ? "Secondary" : "Primary", Slave ? "Slave" : "Master" ); + } else if (NumNodes >= FirstNonBridge + 3 && + SubstringEq (OfwNode[FirstNonBridge + 0].DriverName, "pci8086,2922") && + SubstringEq (OfwNode[FirstNonBridge + 1].DriverName, "drive") && + SubstringEq (OfwNode[FirstNonBridge + 2].DriverName, "disk") + ) { + // + // OpenFirmware device path (Q35 SATA disk and CD-ROM): + // + // /pci@i0cf8/pci8086,2922@1f,2/drive@1/disk@0 + // ^ ^ ^ ^ ^ + // | | | | device number (fixed 0) + // | | | channel (port) number + // | PCI slot & function holding SATA HBA + // PCI root at system bus port, PIO + // + // UEFI device path: + // + // PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x1,0x0,0x0) + // ^ ^ ^ + // | | LUN (always 0 on Q35) + // | port multiplier port number, + // | always 0 on Q35 + // channel (port) number + // + UINT64 Channel; + + NumEntries = 1; + if (RETURN_ERROR (ParseUnitAddressHexList ( + OfwNode[FirstNonBridge + 1].UnitAddress, &Channel, + &NumEntries))) { + return RETURN_UNSUPPORTED; + } + + Written = UnicodeSPrintAsciiFormat ( + Translated, + *TranslatedSize * sizeof (*Translated), // BufferSize in bytes + "PciRoot(0x%x)%s/Pci(0x%Lx,0x%Lx)/Sata(0x%Lx,0x0,0x0)", + PciRoot, + Bridges, + PciDevFun[0], + PciDevFun[1], + Channel + ); } else if (NumNodes >= FirstNonBridge + 3 && SubstringEq (OfwNode[FirstNonBridge + 0].DriverName, "isa") && SubstringEq (OfwNode[FirstNonBridge + 1].DriverName, "fdc") && -- 2.39.2