(on the road atm, will reply in full later)
> On 2 sep. 2016, at 14:09, Laszlo Ersek <[email protected]> wrote:
>
>> On 08/31/16 19:59, Ard Biesheuvel wrote:
>> Now that Laszlo's virtio-gpu-pci series has removed the last remaining
>> obstacle,
>> we can get rid of the special PciHostBridgeDxe implementation in ArmVirtPkg,
>> and move to the generic one. On AArch64, this will allow us to perform DMA
>> above
>> 4GB without bounce buffering, and use 64-bit MMIO BARs allocated above 4 GB.
>>
>> Changes since v1:
>> - new patch #2 to move the IoTranslation discovery to FdtPciPcdProducerLib,
>> which is a cleaner approach since other drivers (i.e., ArmPciCpuIo2Dxe)
>> depend on it as well
>> - add support for ARM, i.e., disable the 64-bit range in that case, since we
>> cannot access 64-bit MMIO BARs if they are allocated there
>> - use statically allocated PCI_ROOT_BRIDGE[] array of size 1
>> - enable support for ISA and VGA I/O range decoding
>> - various other minor fixes based on Laszlo's review comments
>> - added ref links and Laszlo's acks where appropriate, i.e., where given and
>> where the version of the patch in this series does not deviate substantially
>> from the suggested version on which the preliminary ack was based
>>
>> Patch #1 removes the linux,pci-probe-only override which does more harm than
>> good now that we switched to virtio-gpu-pci, which does not expose a raw
>> framebuffer.
>>
>> Patch #2 extends FdtPciPcdProducerLib so that it also sets
>> PcdPciIoTranslation,
>> which is required for the FdtPciHostBridgeLib implementation this series
>> introduces, but also for ArmPciCpuIo2Dxe, which produces EFI_CPU_IO2_PROTOCOL
>> on which the generic PciHostBridgeDxe depends as well.
>>
>> Patch #3 implements PciHostBridgeLib for platforms exposing a PCI host bridge
>> using a pci-host-ecam-generic DT node. The initial version is based on the
>> ArmVirtPkg implementation of PciHostBridgeDxe, so it does not support 64-bit
>> MMIO BARs allocated above 4 GB, but it does support DMA above 4 GB without
>> bounce buffering.
>>
>> Patch #4 switches to the generic PciHostBridgeDxe, with no change in
>> functionality other than support for DMA above 4 GB without bounce buffering.
>>
>> Patch #5 adds support for allocating 64-bit MMIO BARs above 4 GB.
>>
>> Patch #6 removes the now obsolete PciHostBridgeDxe from ArmVirtPkg.
>>
>>
>> Ard Biesheuvel (6):
>> ArmVirtPkg/PciHostBridgeDxe: don't set linux,pci-probe-only DT
>> property
>> ArmVirtPkg/FdtPciPcdProducerLib: add handling of PcdPciIoTranslation
>> ArmVirtPkg: implement FdtPciHostBridgeLib
>> ArmVirtPkg/ArmVirtQemu: switch to generic PciHostBridgeDxe
>> ArmVirtPkg/FdtPciHostBridgeLib: add MMIO64 support
>> ArmVirtPkg: remove now unused PciHostBridgeDxe
>>
>> ArmVirtPkg/ArmVirtQemu.dsc | 10 +-
>> ArmVirtPkg/ArmVirtQemuFvMain.fdf.inc | 3 +-
>> ArmVirtPkg/ArmVirtQemuKernel.dsc | 10 +-
>> ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c | 434 ++++
>> ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf | 57 +
>> ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.c | 108 +-
>> ArmVirtPkg/Library/FdtPciPcdProducerLib/FdtPciPcdProducerLib.inf | 2 +
>> ArmVirtPkg/PciHostBridgeDxe/PciHostBridge.c | 1496
>> --------------
>> ArmVirtPkg/PciHostBridgeDxe/PciHostBridge.h | 499 -----
>> ArmVirtPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf | 64 -
>> ArmVirtPkg/PciHostBridgeDxe/PciRootBridgeIo.c | 2144
>> --------------------
>> 11 files changed, 611 insertions(+), 4216 deletions(-)
>> create mode 100644
>> ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.c
>> create mode 100644
>> ArmVirtPkg/Library/FdtPciHostBridgeLib/FdtPciHostBridgeLib.inf
>> delete mode 100644 ArmVirtPkg/PciHostBridgeDxe/PciHostBridge.c
>> delete mode 100644 ArmVirtPkg/PciHostBridgeDxe/PciHostBridge.h
>> delete mode 100644 ArmVirtPkg/PciHostBridgeDxe/PciHostBridgeDxe.inf
>> delete mode 100644 ArmVirtPkg/PciHostBridgeDxe/PciRootBridgeIo.c
>
> Test results:
>
> (1) aarch64 TCG on an x86_64 host, using standard VGA (-device VGA) and USB 3
> keyboard (-device nec-usb-xhci -device usb-kbd). I tested the display
> browser, the UEFI shell, and the GRUB menu. Didn't boot an actual OS. (Ain't
> nobody got time for that using TCG :))
>
> I also checked the ArmVirtQemu debug log, it looks very nice; there was even
> a 64-bit Mem64 BAR that got allocated high.
>
> (2) aarch64 KVM, using virtio-gpu-pci and USB 2 keyboard and tablet. I
> actually booted a Fedora 24 guest with this, and in the guest, everything
> works just fine (display, keyboard, mouse/tablet). Most of the firmware log
> looks good too.
>
> (2a) However, the USB 2 keyboard is broken while in the firmware (in spite of
> it working well in the guest OS).
>
> -device ich9-usb-ehci1,multifunction=on,id=ehci,addr=05.0 \
> -device
> ich9-usb-uhci1,multifunction=on,masterbus=ehci.0,firstport=0,addr=05.1 \
> -device
> ich9-usb-uhci2,multifunction=on,masterbus=ehci.0,firstport=2,addr=05.2 \
> -device
> ich9-usb-uhci3,multifunction=on,masterbus=ehci.0,firstport=4,addr=05.3 \
> -device usb-kbd,bus=ehci.0 \
> -device usb-tablet,bus=ehci.0 \
>
> My QEMU has your commit 5d636e21c44e ("hw/arm/virt: mark the PCIe host
> controller as DMA coherent in the DT"), but I guess the EHCI driver in edk2
> doesn't comply with the "guest drivers should use cacheable accesses as well
> when running under KVM" part. :(
>
> The following snippet repeats in the log:
>
> EhcClearLegacySupport: called to clear legacy support
> processing error - resetting ehci HC
> EhcInitHC: failed to enable period schedule
> EhcDriverBindingStart: failed to init host controller
> EhcCreateUsb2Hc: capability length 32
>
> Interestingly, if I back out your series, then USB2 works in the firmware. I
> don't understand this, given that my build includes commit 3ef3209d3028
> ("ArmVirtPkg: remove PcdKludgeMapPciMmioAsCached") from the master branch!
>
Does it work when you limit DMA to < 4 GB?
> (2b) Your series does not break virtio-{scsi,blk}-pci though, I verified that.
>
> (3) Another issue I noticed in testing is that the following line from patch
> #3 ("ArmVirtPkg: implement FdtPciHostBridgeLib"):
>
> + EISA_PNP_ID(0x0A08), // PCI Express
>
> which I initially thought would be okay actually breaks
> "OvmfPkg/Library/QemuBootOrderLib". The TranslatePciOfwNodes() function
> translates OFW devpaths into textual UEFI devpath fragments that start with
> PciRoot(), not PcieRoot(), and after your patch, these prefixes will no
> longer match the UEFI devpaths of the actual PCI devices.
>
> So, for this I'll have to go back on my initial approval, and ask you to keep
> this as 0x0A03. Yes, I know it won't match QEMU's ACPI payload perfectly, but
> the same is the case with the Q35 x86_64 machine type -- search
> "hw/i386/acpi-build.c" for the string "PNP0A08" -- and in practice it causes
> no problems at all.
>
> (4) This is for the longer term, but now that we have 64-bit MMIO aperture,
> we should include OvmfPkg/IncompatiblePciDeviceSupportDxe in ArmVirtQemu
> (please see commit 855743f71774). The circumstances described in the commit
> message now apply to ArmVirtQemu as well, if at least virtio-net-pci is used
> -- that device has an oprom, and by default that is reason enough for
> PciBusDxe to degrade the 64-bit MMIO BAR to 32-bit. Including
> "OvmfPkg/IncompatiblePciDeviceSupportDxe" will prevent this.
>
>
> I think (3) can be fixed up easily without a repost, and (4) can be addressed
> with a separate patch, later.
>
> However, I'm completely dumbfounded about (2a). Please do not tell me that
> we'll have to implement a virtio-input driver... :( I think there must be a
> mysterious caching difference between "MdeModulePkg/Bus/Pci/PciHostBridgeDxe"
> and "ArmVirtPkg/PciHostBridgeDxe", even after having removed the "kludge"
> from the latter!
>
> Maybe it has to do with the IO aperture. The USB1 companion controllers on
> the EHCI controller have one IO BAR each:
>
> PciBus: Resource Map for Root Bridge PcieRoot(0x0)
> Type = Io16; Base = 0x0; Length = 0x1000; Alignment = 0xFFF
> [...]
> Base = 0x80; Length = 0x20; Alignment = 0x1F; Owner = PCI
> [00|05|03:20]
> Base = 0xA0; Length = 0x20; Alignment = 0x1F; Owner = PCI
> [00|05|02:20]
> Base = 0xC0; Length = 0x20; Alignment = 0x1F; Owner = PCI
> [00|05|01:20]
> [...]
>
> and with your patches applied, accesses to these are now delegated to
> ArmPciCpuIo2Dxe. Maybe that makes a difference? I'm just guessing. (Again,
> the virtio-xxxx-pci devices, even forcing them to use IO BARs, with
> ",disable-modern=on", continue to work fine.)
>
> Since you authored QEMU commit 5d636e21c44e, I reckon (hope!) you have some
> background on the USB thing... What's your take?
>
> Thanks
> Laszlo
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel