On 06/06/2015 02:45 AM, Laszlo Ersek wrote: > Following up on this cross-posted message, I will send two patch sets, > one for QEMU (to qemu-devel) and another for OVMF (to edk2-devel). With > both in place, OVMF supports multiple PCI root buses. Hi Laszlo, Thank you for the patches.
> > Below I'm writing up the way I tested the feature, plus a few random > notes. > > (1) Interrupt line assignments. I patched SeaBIOS (temporarily) to print > interrupt line assignments, and I also patched OVMF (permanently) to > print the same. (See both patches in the OVMF patch > > OvmfPkg: PlatformBdsLib: debug log interrupt line assignments > > in one of the followup series; the commit message contains the > ad-hoc SeaBIOS patch.) The QEMU command line was: > > qemu-system-x86_64 \ > -m 2048 \ > -M pc \ > -enable-kvm \ > -device qxl-vga \ > \ > $FIRMWARE_OPTIONS \ > \ > -drive id=cdrom,if=none,readonly,format=raw,file=$ISO \ > -device virtio-scsi-pci,id=scsi0 \ > -device scsi-cd,bus=scsi0.0,drive=cdrom,bootindex=0 \ > \ > -debugcon file:debug.log \ > -global isa-debugcon.iobase=0x402 \ > \ > -monitor stdio \ > \ > -device pxb,id=bridge1,bus_nr=4 \ > \ > -netdev user,id=netdev0,hostfwd=tcp:127.0.0.1:2222-:22 \ > -device e1000,netdev=netdev0,bus=bridge1,addr=2,romfile= \ > \ > -netdev user,id=netdev1,hostfwd=tcp:127.0.0.1:2223-:22 \ > -device e1000,netdev=netdev1,bus=bridge1,addr=3,romfile= \ > \ > -netdev user,id=netdev2,hostfwd=tcp:127.0.0.1:2224-:22 \ > -device e1000,netdev=netdev2,bus=bridge1,addr=4,romfile= \ > \ > -netdev user,id=netdev3,hostfwd=tcp:127.0.0.1:2225-:22 \ > -device e1000,netdev=netdev3,bus=bridge1,addr=5,romfile= > > The ISO variable pointed to a Fedora 20 LiveCD (although it is not > relevant for this test). FIRMWARE_OPTIONS were > > -bios .../out/bios.bin > > for the (debug-patched, see above) SeaBIOS test case, and > > -drive if=pflash,readonly,format=raw,file=.../OVMF_CODE.fd \ > -drive if=pflash,format=raw,file=.../COPY_OF_OVMF_VARS.fd > > for the OVMF test case. > > As you can see the QEMU command line places four e1000 NICs on one > PXB (I used e1000 because that's what Marcel recommended for all > testing). SeaBIOS then printed > > PCI: init bdf=00:01.3 id=8086:7113 > assigned irq line 10 > > PCI: init bdf=00:02.0 id=1b36:0100 > assigned irq line 10 > > PCI: init bdf=00:03.0 id=1af4:1004 > assigned irq line 11 > > PCI: init bdf=04:00.0 id=1b36:0001 > assigned irq line 11 > > PCI: init bdf=05:02.0 id=8086:100e > assigned irq line 10 > > PCI: init bdf=05:03.0 id=8086:100e > assigned irq line 11 > > PCI: init bdf=05:04.0 id=8086:100e > assigned irq line 11 > > PCI: init bdf=05:05.0 id=8086:100e > assigned irq line 10 > > whereas OVMF printed > > SetPciIntLine: PciRoot(0x0)/Pci(0x1,0x3) -> 0x0A > SetPciIntLine: PciRoot(0x0)/Pci(0x2,0x0) -> 0x0A > SetPciIntLine: PciRoot(0x0)/Pci(0x3,0x0) -> 0x0B > SetPciIntLine: PciRoot(0x4)/Pci(0x0,0x0) -> 0x0B > SetPciIntLine: PciRoot(0x4)/Pci(0x0,0x0)/Pci(0x2,0x0) -> 0x0A > SetPciIntLine: PciRoot(0x4)/Pci(0x0,0x0)/Pci(0x3,0x0) -> 0x0B > SetPciIntLine: PciRoot(0x4)/Pci(0x0,0x0)/Pci(0x4,0x0) -> 0x0B > SetPciIntLine: PciRoot(0x4)/Pci(0x0,0x0)/Pci(0x5,0x0) -> 0x0A > > (Note that the bus number assigned to the devices on the pxb is 5 in > the OVMF case too. This is not visible from the device paths logged > above, but it is clear from edk2's PCI bus driver's log, and the > output of the "PCI" UEFI shell command.) > > Therefore I concluded that the IRQ line assignment logic in OVMF > that Gabriel had contributed earlier (and that I updated very > slightly in the OVMF patchset here) continued to work correctly. > > (2) Marcel, no new fw_cfg file is necessary for exposing the bus numbers > of the extra root buses to OVMF. OVMF probes all buses and all > devices (function 0) to locate the extra root buses. This procedure > is shortened by adhering to the "etc/extra-pci-roots" fw_cfg file, > which is already there. Sure. It would not be a problem to add it, but if there is no need for it... > > This recommendation came from both Michael & Marcel, and it was > "surprisingly easy" to implement with edk2's PciLib. > > (3) We discussed earlier the idea to flip the PXB's _HID and _UID > objects to numeric values in QEMU; I implemented and tested that > (see more test cases below). > > (4) Ping test was successful from the OVMF-booted Fedora 20 LivecD > environment, using one e1000 NIC on a PXB. > > (5) Ping test was successful from the UEFI shell, using Intel's > proprietary UEFI driver for the e1000 NIC (called PROEFI). The NIC > was located on the same PXB as in the previous point. > > (6) Successfully loaded public web pages with Firefox in an OVMF-booted > Windows Server 2012 R2 guest. The NIC was located on the same PXB as > in the previous point. > > (7) At least one issue remains to be solved (designed) in QEMU, for both > SeaBIOS's and OVMF's sake: booting off devices that are located on > the PXB. The problem is with the "bootorder" fw_cfg file. Consider > the following example: > > /pci@i0cf8/scsi@3/channel@0/disk@0,0 > /pci/pci-bridge@0/ethernet@2/ethernet-phy@0 > > which is generated for the options > > -device virtio-scsi-pci,id=scsi0 \ > -device scsi-cd,bus=scsi0.0,drive=cdrom,bootindex=0 \ > \ > -device pxb,id=bridge1,bus_nr=4 \ > -device e1000,netdev=netdev0,bus=bridge1,addr=2,romfile=,bootindex=1 > > While the first entry is recognized by both SeaBIOS and OVMF, the > second entry (generated for the NIC hanging off the PXB, see above) > is recognized by neither. (I tested OVMF, and investigated the > SeaBIOS source, for this claim.) > > For the SeaBIOS explanation, grep the source code for FW_PCI_DOMAIN. Thanks for bringing it to my attention. > > The OVMF explanation is that OVMF simply rejects the initial > OpenFirmware device path node "/pci" with a controlled parse error > (as opposed to the "/pci@i0cf8" node, which it recognizes and > translates to UEFI in combination with the rest of that OFW device > path). > > The "/pci" node comes from QEMU's sysbus_get_fw_dev_path() function, > file "hw/core/sysbus.c", where *neither* of the (s->num_mmio) and > (s->num_pio) branches apply. (The (s->num_pio) branch applies for > the first entry, ie. "/pci@i0cf8".) > > Something has to be invented here to clue in both firmwares as to > the root bus number (here bus_nr=4), in a format that is compliant > with the "OpenFirmware unit address" concept. (Note that > "/pci-bridge@0" only gives away the slot number *on* the extra root > bus, not the number of the root bus itself.) For example: > > /pci@rootbus4/pci-bridge@0/ethernet@2/ethernet-phy@0 > > would be acceptable. However, I don't know how to implement this in > sysbus_get_fw_dev_path(). I'll look into it. What is the OpenFirmware unit address" concept ? :) Thanks, Marcel > > Thanks > Laszlo > ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel