From: Marcel Apfelbaum <marcel@redhat.com>
To: Laszlo Ersek <lersek@redhat.com>,
qemu devel list <qemu-devel@nongnu.org>,
edk2-devel list <edk2-devel@lists.sourceforge.net>,
Marcel Apfelbaum <marcel.a@redhat.com>,
Michael Tsirkin <mtsirkin@redhat.com>,
"Gabriel L. Somlo (CMU)" <somlo@cmu.edu>
Subject: Re: [Qemu-devel] PXB fixes for QEMU, and extra root buses for OVMF
Date: Wed, 10 Jun 2015 12:09:07 +0300 [thread overview]
Message-ID: <5577FEB3.4070600@redhat.com> (raw)
In-Reply-To: <5572347E.1030105@redhat.com>
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
>
next prev parent reply other threads:[~2015-06-10 9:09 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-05 23:45 [Qemu-devel] PXB fixes for QEMU, and extra root buses for OVMF Laszlo Ersek
2015-06-05 23:46 ` [Qemu-devel] [PATCH 0/4] PXB tweaks and fixes Laszlo Ersek
2015-06-05 23:46 ` [Qemu-devel] [PATCH 1/4] i386/acpi-build: more traditional _UID and _HID for PXB root buses Laszlo Ersek
2015-06-10 9:16 ` Marcel Apfelbaum
2015-06-05 23:46 ` [Qemu-devel] [PATCH 2/4] i386/acpi-build: fix PXB workarounds for unsupported BIOSes Laszlo Ersek
2015-06-10 9:17 ` Marcel Apfelbaum
2015-06-05 23:46 ` [Qemu-devel] [PATCH 3/4] hw/pci: allow the caller of pci_bar_address() to ignore command register Laszlo Ersek
2015-06-05 23:46 ` [Qemu-devel] [PATCH 4/4] i386/acpi-build: build_crs(): fetch BAR from PCI config space directly Laszlo Ersek
2015-06-07 9:23 ` Michael S. Tsirkin
2015-06-08 7:56 ` Laszlo Ersek
2015-06-08 9:40 ` Michael S. Tsirkin
2015-06-09 20:34 ` Laszlo Ersek
2015-06-10 10:06 ` Marcel Apfelbaum
2015-06-10 11:07 ` Laszlo Ersek
2015-06-10 16:21 ` Michael S. Tsirkin
2015-06-10 16:19 ` Michael S. Tsirkin
2015-06-10 9:09 ` Marcel Apfelbaum [this message]
2015-06-10 11:04 ` [Qemu-devel] PXB fixes for QEMU, and extra root buses for OVMF Laszlo Ersek
2015-06-10 11:55 ` Marcel Apfelbaum
2015-06-10 12:05 ` Laszlo Ersek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5577FEB3.4070600@redhat.com \
--to=marcel@redhat.com \
--cc=edk2-devel@lists.sourceforge.net \
--cc=lersek@redhat.com \
--cc=marcel.a@redhat.com \
--cc=mtsirkin@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=somlo@cmu.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).