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 <agraf@suse.de>
Cc: Reza Jelveh <reza.jelveh@tuhh.de>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Hannes Reinecke <hare@suse.de>
Cc: Gabriel L. Somlo <somlo@cmu.edu>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Gabriel Somlo <somlo@cmu.edu>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18531 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Laszlo Ersek 2015-09-22 11:18:41 +00:00 committed by lersek
parent 8a6e6db42f
commit 0febef91bf
1 changed files with 43 additions and 0 deletions

View File

@ -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") &&