Secondary ? "Secondary" : "Primary",\r
Slave ? "Slave" : "Master"\r
);\r
+ } else if (NumNodes >= FirstNonBridge + 3 &&\r
+ SubstringEq (OfwNode[FirstNonBridge + 0].DriverName, "pci8086,2922") &&\r
+ SubstringEq (OfwNode[FirstNonBridge + 1].DriverName, "drive") &&\r
+ SubstringEq (OfwNode[FirstNonBridge + 2].DriverName, "disk")\r
+ ) {\r
+ //\r
+ // OpenFirmware device path (Q35 SATA disk and CD-ROM):\r
+ //\r
+ // /pci@i0cf8/pci8086,2922@1f,2/drive@1/disk@0\r
+ // ^ ^ ^ ^ ^\r
+ // | | | | device number (fixed 0)\r
+ // | | | channel (port) number\r
+ // | PCI slot & function holding SATA HBA\r
+ // PCI root at system bus port, PIO\r
+ //\r
+ // UEFI device path:\r
+ //\r
+ // PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x1,0x0,0x0)\r
+ // ^ ^ ^\r
+ // | | LUN (always 0 on Q35)\r
+ // | port multiplier port number,\r
+ // | always 0 on Q35\r
+ // channel (port) number\r
+ //\r
+ UINT64 Channel;\r
+\r
+ NumEntries = 1;\r
+ if (RETURN_ERROR (ParseUnitAddressHexList (\r
+ OfwNode[FirstNonBridge + 1].UnitAddress, &Channel,\r
+ &NumEntries))) {\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)/Sata(0x%Lx,0x0,0x0)",\r
+ PciRoot,\r
+ Bridges,\r
+ PciDevFun[0],\r
+ PciDevFun[1],\r
+ Channel\r
+ );\r
} else if (NumNodes >= FirstNonBridge + 3 &&\r
SubstringEq (OfwNode[FirstNonBridge + 0].DriverName, "isa") &&\r
SubstringEq (OfwNode[FirstNonBridge + 1].DriverName, "fdc") &&\r