From: liang yan <liangy@hpe.com>
To: Laszlo Ersek <lersek@redhat.com>
Cc: "Hayes, Bill" <bill.hayes@hpe.com>,
edk2-devel@ml01.01.org, qemu-devel@nongnu.org, "Ramirez,
Laura L (HP Labs)" <laura.ramirez@hpe.com>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>
Subject: Re: [Qemu-devel] [edk2] Could not add PCI device with big memory to aarch64 VMs
Date: Wed, 2 Dec 2015 10:28:25 -0700 [thread overview]
Message-ID: <565F2A39.5000703@hpe.com> (raw)
In-Reply-To: <565CFBAF.3030707@redhat.com>
Hi, Laszlo,
On 11/30/2015 06:45 PM, Laszlo Ersek wrote:
> On 12/01/15 01:46, liang yan wrote:
>> Hello, Laszlo,
>>
>> On 11/30/2015 03:05 PM, Laszlo Ersek wrote:
> [snip]
>
>>> If you need more room (with large alignments), then there's no way
>>> around supporting QEMU's 64 bit aperture, VIRT_PCIE_MMIO_HIGH (see my
>>> earlier email).
>> I checked the function create_pcie form pathtoqemu/hw/arm/virt.c, it has
>> a flag value use_highmem(which has default "true" value).
>>
>> It set base_mmio_high and size_mmio_high to device tree by function below,
>>
>> qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "ranges",
>> 1, FDT_PCI_RANGE_IOPORT, 2, 0,
>> 2, base_pio, 2, size_pio,
>> 1, FDT_PCI_RANGE_MMIO, 2, base_mmio,
>> 2, base_mmio, 2, size_mmio,
>> 1, FDT_PCI_RANGE_MMIO_64BIT,
>> 2, base_mmio_high,
>> 2, base_mmio_high, 2, size_mmio_high);
>>
>> So basically, I need to add two UINT64 variables like mmio_high_base and
>> mmio_high_size to PCD under function ProcessPciHost(VirtFdtDxe.c),
>> and try to use this high base address and size as new aperture.
>>
>> Is this correct?
> It is correct, but that's only part of the story.
>
> Parsing the 64-bit aperture from the DTB into new PCDs in
> ArmVirtPkg/VirtFdtDxe is the easy part.
>
> The hard part is modifying ArmVirtPkg/PciHostBridgeDxe, so that BAR
> allocation requests (submitted by the platform independent PCI bus
> driver that resides in "MdeModulePkg/Bus/Pci/PciBusDxe") are actually
> serviced from this high aperture too.
>
>>> Unfortunately I can't readily help with that in the
>>> "ArmVirtPkg/PciHostBridgeDxe" driver; there's no such (open-source)
>>> example in the edk2 tree. Of course, I could experiment with it myself
>>> -- only not right now.
>> If possible, I do want to finish this part or help you finish it. I just
>> work on UEFI recently, and thank you so much for your patient and detail
>> explanation. I really appreciate it.
>>> I guess copying and adapting the TypeMem32 logic to TypeMem64 (currently
>>> short-circuited with EFI_ABORTED) could work.
>> Is the 32 or 64 bit determined by BAR(2-3bit) or by the PCI device
>> memory size? Is there an option from QEMU?
> I can't tell. :)
>
>> Does TypeMem32 still keep "VIRT_PCIE_MMIO" aperture and TypeMem64 use
>> "VIRT_PCIE_MMIO_HIGH" aperture? or It's more like device property
>> controlled from QEMU device simulation?
> Good question. I don't know. I think in order to answer this question,
> we should understand the whole dance between the PCI root bridge / host
> bridge driver and the generic PCI bus driver.
>
> The documentation I know of is in the Platform Init spec, version 1.4,
> Volume 5, Chapter 10 "PCI Host Bridge". I've taken multiple stabs at
> that chapter earlier, but I've always given up.
>
> Sorry I can't help more, but this is new area for me as well.
No, already a big help, Really appreciate your generous sharing.
I also have a problem from guest vm kernel side.
Even we change the UEFI side, should the guest kernel still need to modify?
Because, I noticed that the kernel will do rescan. use the example of
256M below.
UEFI side, has two setup, not sure which is the real one.
PciBus: Discovered PCI @ [00|01|00]
BAR[0]: Type = Mem32; Alignment = 0xFFF; Length = 0x100; Offset
= 0x10
BAR[1]: Type = Mem32; Alignment = 0xFFF; Length = 0x1000; Offset
= 0x14
BAR[2]: Type = PMem64; Alignment = 0xFFFFFFF; Length =
0x10000000; Offset = 0x18
===== PMem64 here
PciBus: Resource Map for Root Bridge PciRoot(0x0)
Type = Mem32; Base = 0x20000000; Length = 0x10100000; Alignment =
0xFFFFFFF
Base = 0x20000000; Length = 0x10000000; Alignment =
0xFFFFFFF; Owner = PCI [00|01|00:18]; Type = PMem32
============>Mem32 here
Base = 0x30000000; Length = 0x1000; Alignment = 0xFFF; Owner =
PCI [00|01|00:14]
Base = 0x30001000; Length = 0x100; Alignment = 0xFFF; Owner =
PCI [00|01|00:10]
but kernel side: it becomes 64bit pref
[ 3.005355] pci_bus 0000:00: root bus resource [mem
0x10000000-0x3efeffff window]
[ 3.006028] pci_bus 0000:00: root bus resource [bus 00-0f]
.
.
.
[ 3.135847] pci 0000:00:01.0: BAR 2: assigned [mem
0x10000000-0x1fffffff 64bit pref]
[ 3.137099] pci 0000:00:01.0: BAR 1: assigned [mem 0x20000000-0x20000fff]
[ 3.137382] pci 0000:00:01.0: BAR 0: assigned [mem 0x20001000-0x200010ff]
Also, I found that [mem 0x8000000000 window] was ignored,
[ 2.769608] PCI ECAM: ECAM for domain 0000 [bus 00-0f] at [mem
0x3f000000-0x3fffffff] (base 0x3f000000)
[ 2.962930] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-0f])
[ 2.965787] acpi PNP0A08:00: _OSC: OS supports [ExtendedConfig ASPM
ClockPM Segments MSI]
[ 2.990794] acpi PNP0A08:00: _OSC: OS now controls [PCIeHotplug PME
AER PCIeCapability]
[ 2.994520] acpi PNP0A08:00: host bridge window [mem 0x8000000000
window] (ignored, not CPU addressable)
so when do "cat /proc/iomem"
no "8000000000-8000000000 : PCI Bus 0000:00" shows.
Curious is that it works well and shows in another fedora kernel
provided by Shanon.
Do you have any idea that why this happen? Thanks.
Best,
Liang
> Laszlo
>
next prev parent reply other threads:[~2015-12-02 17:28 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-04 22:22 [Qemu-devel] Could not add PCI device with big memory to aarch64 VMs liang yan
2015-11-05 0:53 ` Laszlo Ersek
2015-11-30 18:45 ` liang yan
2015-11-30 22:05 ` [Qemu-devel] [edk2] " Laszlo Ersek
2015-12-01 0:46 ` liang yan
2015-12-01 1:45 ` Laszlo Ersek
2015-12-02 17:28 ` liang yan [this message]
2015-12-02 18:29 ` Laszlo Ersek
2016-09-02 21:18 ` 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=565F2A39.5000703@hpe.com \
--to=liangy@hpe.com \
--cc=ard.biesheuvel@linaro.org \
--cc=bill.hayes@hpe.com \
--cc=edk2-devel@ml01.01.org \
--cc=laura.ramirez@hpe.com \
--cc=lersek@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).