[Nouveau] Rewriting Intel PCI bridge prefetch base address bits solves nvidia graphics issues
Peter Wu
peter at lekensteyn.nl
Wed Sep 5 16:02:37 UTC 2018
On Wed, Sep 05, 2018 at 02:26:51PM +0800, Daniel Drake wrote:
> On Tue, Aug 28, 2018 at 5:57 PM, Peter Wu <peter at lekensteyn.nl> wrote:
> > Only non-bridge devices can be passed to a guest, but perhaps logging
> > access to the emulated bridge is already sufficient. The Prefetchable
> > Base Upper 32 Bits register is at offset 0x28.
> >
> > In a trace where the Nvidia device is disabled/enabled via Device
> > Manager, I see writes on the enable path:
> >
> > 2571 at 1535108904.593107:rp_write_config (ioh3420, @0x28, 0x0, len=0x4)
>
> Did you do anything special to get an emulated bridge included in this setup?
Yes, I followed instructions in QEMU's docs/pcie.txt and ended up with:
-device ioh3420,id=rp1,bus=pcie.0,addr=1c.0,port=1
-device vfio-pci,bus=rp1,host=01:00.0,rombar=0,x-pci-sub-vendor-id=0x1028,x-pci-sub-device-id=0x07be
(Subvendor/device IDs are from lspci -nnv).
> Folllowing the instructions at
> https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF I can
> successfully pass through devices to windows running under
> virt-manager. In the nvidia GPU case I haven't got passed the driver
> installation failure, but I can pass through other devices OK and
> install their drivers.
After installing drivers, it would still not start. For that to work I
had to pass the VBIOS via an ACPI _ROM method:
-acpitable file=fakedev.aml
-fw_cfg name=opt/nl.lekensteyn/vfio-vbios,file=vbios.rom
These options were taken from:
https://github.com/Lekensteyn/acpi-stuff/blob/master/d3test/XPS9560/boot-vm
fakedev.asl source file and instructions to extract the VBIOS:
https://github.com/Lekensteyn/acpi-stuff/tree/master/d3test
> However I do not end up with any PCI-to-PCI bridges in this setup. The
> passed through device sits at address 00:08.0, parent is the PCI host
> bridge 00:00.0.
>
> (I'm trying to spy if Windows appears to restore or reset the PCI
> bridge prefetch registers upon resume)
If you want to suspend the guest, note that Windows refuses suspend
with the default VGA adapter (see "devicequery /a"). Try the QXL adapter
with https://gitlab.freedesktop.org/spice/win32/qxl-wddm-dod
-vga qxl -device qemu-xhci -device usb-tablet
Not sure how well tested this is, I had to patch Linux to avoid an oops.
If I try this on Windows, it successfully suspends ("info status" in
QEMU monitor says "paused (suspended)"), but resume ends up with a black
screen...
Luckily, the important information is already logged. Windows 10 indeed
seems to write to "Prefetchable Base Upper 32 Bits" on resume[1].
--
Kind regards,
Peter Wu
https://lekensteyn.nl
[1]: QEMU output (annotated with register names) for
./run-vm.sh -device usb-tablet -vga qxl /tmp/w10.qcow2 -trace rp_read_config,file=/dev/stdout -trace rp_write_config,file=/dev/stdout
<suspend>
NET._PS3
32481 at 1536163097.415976:rp_write_config (ioh3420, @0x12c, 0x0, len=0x4) AER: Root Error Command
32481 at 1536163097.415999:rp_write_config (ioh3420, @0xac, 0x0, len=0x2) PCIE: Root Control
32481 at 1536163097.416008:rp_read_config (ioh3420, @0xac, len=0x2) 0x0 PCIE: Root Control
32481 at 1536163097.416017:rp_read_config (ioh3420, @0xa0, len=0x2) 0x0 PCIE: Link Control
32481 at 1536163097.416024:rp_write_config (ioh3420, @0xb0, 0x10000, len=0x4) PCIE: Root Status
32481 at 1536163097.416057:rp_read_config (ioh3420, @0x4, len=0x2) 0x506 Command
32481 at 1536163097.416066:rp_read_config (ioh3420, @0xc, len=0x1) 0x0 Cacheline Size
32481 at 1536163097.416073:rp_read_config (ioh3420, @0xd, len=0x1) 0x0 Latency Timer
32481 at 1536163097.416081:rp_read_config (ioh3420, @0x3c, len=0x1) 0x0 Interrupt Line
32481 at 1536163097.416088:rp_read_config (ioh3420, @0x19, len=0x1) 0x1 Secondary Bus Number
32481 at 1536163097.416095:rp_read_config (ioh3420, @0x1a, len=0x1) 0x1 Subordiante Bus Number
32481 at 1536163097.416103:rp_read_config (ioh3420, @0x3e, len=0x2) 0x2 Bridge Control
32481 at 1536163097.416129:rp_read_config (ioh3420, @0x0, len=0x2) 0x8086 Device ID
32481 at 1536163097.416136:rp_read_config (ioh3420, @0x2, len=0x2) 0x3420 Vendor ID
32481 at 1536163097.416143:rp_read_config (ioh3420, @0x8, len=0x1) 0x2 Revision
32481 at 1536163097.416150:rp_read_config (ioh3420, @0x9, len=0x1) 0x0 Class Code
32481 at 1536163097.416156:rp_read_config (ioh3420, @0xa, len=0x1) 0x4 +1 Class Code
32481 at 1536163097.416164:rp_read_config (ioh3420, @0xb, len=0x1) 0x6 +2 Class Code
32481 at 1536163097.416172:rp_read_config (ioh3420, @0xe, len=0x1) 0x1 Header Type
32481 at 1536163097.416180:rp_read_config (ioh3420, @0x6, len=0x2) 0x10 Status
32481 at 1536163097.416187:rp_read_config (ioh3420, @0x34, len=0x1) 0xe0 Capabilities Pointer
32481 at 1536163097.416195:rp_read_config (ioh3420, @0xe0, len=0x2) 0x9001
32481 at 1536163097.416203:rp_read_config (ioh3420, @0x90, len=0x2) 0x6010 PCI Express
32481 at 1536163097.416210:rp_read_config (ioh3420, @0x60, len=0x2) 0x4005 Message Signaled Interrupts
32481 at 1536163097.416218:rp_read_config (ioh3420, @0x40, len=0x2) 0xd Bridge subsystem vendor/device ID
32481 at 1536163097.416226:rp_read_config (ioh3420, @0x44, len=0x2) 0x8086
32481 at 1536163097.416234:rp_read_config (ioh3420, @0x46, len=0x2) 0x0
32481 at 1536163097.416241:rp_read_config (ioh3420, @0x98, len=0x2) 0x7 PCIE: Device Control
32481 at 1536163097.416249:rp_read_config (ioh3420, @0xb8, len=0x2) 0x0 PCIE: Device Control 2
32481 at 1536163097.416257:rp_read_config (ioh3420, @0x0, len=0x2) 0x8086 Device ID
32481 at 1536163097.416265:rp_read_config (ioh3420, @0x2, len=0x2) 0x3420 Vendor ID
32481 at 1536163097.416272:rp_read_config (ioh3420, @0x8, len=0x1) 0x2 Revision
32481 at 1536163097.416280:rp_read_config (ioh3420, @0x9, len=0x1) 0x0 Class Code
32481 at 1536163097.416287:rp_read_config (ioh3420, @0xa, len=0x1) 0x4 +1 Class Code
32481 at 1536163097.416295:rp_read_config (ioh3420, @0xb, len=0x1) 0x6 +2 Class Code
32481 at 1536163097.416303:rp_read_config (ioh3420, @0xe, len=0x1) 0x1 Header Type
32481 at 1536163097.416310:rp_read_config (ioh3420, @0x6, len=0x2) 0x10 Status
32481 at 1536163097.416318:rp_read_config (ioh3420, @0x34, len=0x1) 0xe0 Capabilities Pointer
32481 at 1536163097.416325:rp_read_config (ioh3420, @0xe0, len=0x2) 0x9001
32481 at 1536163097.416333:rp_read_config (ioh3420, @0x90, len=0x2) 0x6010 PCI Express
32481 at 1536163097.416341:rp_read_config (ioh3420, @0x60, len=0x2) 0x4005 Message Signaled Interrupts
32481 at 1536163097.416349:rp_read_config (ioh3420, @0x40, len=0x2) 0xd Bridge subsystem vendor/device ID
32481 at 1536163097.416356:rp_read_config (ioh3420, @0x44, len=0x2) 0x8086
32481 at 1536163097.416364:rp_read_config (ioh3420, @0x46, len=0x2) 0x0
32481 at 1536163097.416372:rp_read_config (ioh3420, @0x4, len=0x2) 0x506 Command
32481 at 1536163097.416380:rp_write_config (ioh3420, @0x4, 0x506, len=0x2) Command
32481 at 1536163097.416742:rp_read_config (ioh3420, @0x62, len=0x2) 0x103 MSI: Message Control
32481 at 1536163097.416753:rp_write_config (ioh3420, @0x62, 0x102, len=0x2) MSI: Message Control
32481 at 1536163097.416762:rp_read_config (ioh3420, @0x4, len=0x2) 0x506 Command
32481 at 1536163097.416770:rp_write_config (ioh3420, @0x4, 0x500, len=0x2) Command
32481 at 1536163097.417356:rp_read_config (ioh3420, @0x9a, len=0x2) 0x0 PCIE: Device Status
32481 at 1536163097.417367:rp_read_config (ioh3420, @0xe0, len=0x4) 0xc8039001
32481 at 1536163097.417375:rp_read_config (ioh3420, @0xe4, len=0x4) 0x8
32481 at 1536163097.417383:rp_write_config (ioh3420, @0xe4, 0xb, len=0x2)
32481 at 1536163097.456781:rp_read_config (ioh3420, @0xe4, len=0x2) 0xb
_PS3
PG00._ON
PG00._OFF
<resume>
PG00._ON
PG00._ON
_PS0
32481 at 1536163120.049599:rp_read_config (ioh3420, @0x0, len=0x2) 0x8086 Device ID
32481 at 1536163120.049655:rp_read_config (ioh3420, @0x2, len=0x2) 0x3420 Vendor ID
32481 at 1536163120.049680:rp_read_config (ioh3420, @0x8, len=0x1) 0x2 Revision
32481 at 1536163120.049708:rp_read_config (ioh3420, @0x9, len=0x1) 0x0 Class Code
32481 at 1536163120.049734:rp_read_config (ioh3420, @0xa, len=0x1) 0x4 +1 Class Code
32481 at 1536163120.049760:rp_read_config (ioh3420, @0xb, len=0x1) 0x6 +2 Class Code
32481 at 1536163120.049785:rp_read_config (ioh3420, @0xe, len=0x1) 0x1 Header Type
32481 at 1536163120.049811:rp_read_config (ioh3420, @0x6, len=0x2) 0x10 Status
32481 at 1536163120.049837:rp_read_config (ioh3420, @0x34, len=0x1) 0xe0 Capabilities Pointer
32481 at 1536163120.049862:rp_read_config (ioh3420, @0xe0, len=0x2) 0x9001
32481 at 1536163120.049887:rp_read_config (ioh3420, @0x90, len=0x2) 0x6010 PCI Express
32481 at 1536163120.049909:rp_read_config (ioh3420, @0x60, len=0x2) 0x4005 Message Signaled Interrupts
32481 at 1536163120.049932:rp_read_config (ioh3420, @0x40, len=0x2) 0xd Bridge subsystem vendor/device ID
32481 at 1536163120.049958:rp_read_config (ioh3420, @0x44, len=0x2) 0x8086
32481 at 1536163120.049985:rp_read_config (ioh3420, @0x46, len=0x2) 0x0
32481 at 1536163120.050015:rp_read_config (ioh3420, @0xe0, len=0x4) 0xc8039001
32481 at 1536163120.050040:rp_read_config (ioh3420, @0xe4, len=0x4) 0xb
32481 at 1536163120.050072:rp_write_config (ioh3420, @0xe4, 0x8, len=0x2)
32481 at 1536163120.068096:rp_read_config (ioh3420, @0x0, len=0x2) 0x8086 Device ID
32481 at 1536163120.068157:rp_read_config (ioh3420, @0x2, len=0x2) 0x3420 Vendor ID
32481 at 1536163120.068194:rp_read_config (ioh3420, @0x8, len=0x1) 0x2 Revision
32481 at 1536163120.068222:rp_read_config (ioh3420, @0x9, len=0x1) 0x0 Class Code
32481 at 1536163120.068250:rp_read_config (ioh3420, @0xa, len=0x1) 0x4 +1 Class Code
32481 at 1536163120.068284:rp_read_config (ioh3420, @0xb, len=0x1) 0x6 +2 Class Code
32481 at 1536163120.068309:rp_read_config (ioh3420, @0xe, len=0x1) 0x1 Header Type
32481 at 1536163120.068333:rp_read_config (ioh3420, @0x6, len=0x2) 0x10 Status
32481 at 1536163120.068361:rp_read_config (ioh3420, @0x34, len=0x1) 0xe0 Capabilities Pointer
32481 at 1536163120.068395:rp_read_config (ioh3420, @0xe0, len=0x2) 0x9001
32481 at 1536163120.068421:rp_read_config (ioh3420, @0x90, len=0x2) 0x6010 PCI Express
32481 at 1536163120.068446:rp_read_config (ioh3420, @0x60, len=0x2) 0x4005 Message Signaled Interrupts
32481 at 1536163120.068471:rp_read_config (ioh3420, @0x40, len=0x2) 0xd Bridge subsystem vendor/device ID
32481 at 1536163120.068495:rp_read_config (ioh3420, @0x44, len=0x2) 0x8086
32481 at 1536163120.068519:rp_read_config (ioh3420, @0x46, len=0x2) 0x0
32481 at 1536163120.068547:rp_read_config (ioh3420, @0xe4, len=0x2) 0x8
32481 at 1536163120.068575:rp_write_config (ioh3420, @0x10, 0x0, len=0x4) BAR0
32481 at 1536163120.068607:rp_write_config (ioh3420, @0x14, 0x0, len=0x4) BAR1
32481 at 1536163120.068636:rp_write_config (ioh3420, @0x1c, 0xff, len=0x2) I/O Base
32481 at 1536163120.069825:rp_write_config (ioh3420, @0x20, 0xfc10fc00, len=0x4) Memory Base
32481 at 1536163120.070928:rp_write_config (ioh3420, @0x24, 0xfeb0fea0, len=0x4) Prefetchable Memory Base
32481 at 1536163120.071968:rp_write_config (ioh3420, @0x28, 0x0, len=0x4) Prefetchable Base Upper 32 Bits
32481 at 1536163120.072946:rp_write_config (ioh3420, @0x2c, 0x0, len=0x4) Prefetchable Limit Upper 32 Bits
32481 at 1536163120.073901:rp_write_config (ioh3420, @0x30, 0x0, len=0x4) I/O Base Upper 16 Bits
32481 at 1536163120.074969:rp_write_config (ioh3420, @0x38, 0x0, len=0x4)
32481 at 1536163120.075006:rp_write_config (ioh3420, @0x3c, 0x0, len=0x1) Interrupt Line
32481 at 1536163120.075028:rp_write_config (ioh3420, @0x3e, 0x2, len=0x2) Bridge Control
32481 at 1536163120.075996:rp_read_config (ioh3420, @0x3e, len=0x2) 0x2 Bridge Control
32481 at 1536163120.076028:rp_write_config (ioh3420, @0x18, 0x0, len=0x1) Primary Bus Number
32481 at 1536163120.076051:rp_write_config (ioh3420, @0x19, 0x1, len=0x1) Secondary Bus Number
32481 at 1536163120.076074:rp_write_config (ioh3420, @0x1a, 0x1, len=0x1) Subordiante Bus Number
32481 at 1536163120.076097:rp_write_config (ioh3420, @0xc, 0x0, len=0x1) Cacheline Size
32481 at 1536163120.076118:rp_write_config (ioh3420, @0xd, 0x0, len=0x1) Latency Timer
32481 at 1536163120.076137:rp_write_config (ioh3420, @0x4, 0x500, len=0x2) Command
32481 at 1536163120.077194:rp_write_config (ioh3420, @0x98, 0x7, len=0x2) PCIE: Device Control
32481 at 1536163120.077225:rp_write_config (ioh3420, @0xb8, 0x0, len=0x2) PCIE: Device Control 2
32481 at 1536163120.077246:rp_read_config (ioh3420, @0x4, len=0x2) 0x500 Command
32481 at 1536163120.077270:rp_write_config (ioh3420, @0x4, 0x506, len=0x2) Command
32481 at 1536163120.078918:rp_write_config (ioh3420, @0x6, 0xf900, len=0x2) Status
32481 at 1536163120.078950:rp_write_config (ioh3420, @0x1e, 0xf900, len=0x2) Secondary Status
32481 at 1536163120.078972:rp_read_config (ioh3420, @0x4, len=0x2) 0x506 Command
32481 at 1536163120.078995:rp_write_config (ioh3420, @0x4, 0x506, len=0x2) Command
32481 at 1536163120.079701:rp_read_config (ioh3420, @0x62, len=0x2) 0x102 MSI: Message Control
32481 at 1536163120.079722:rp_write_config (ioh3420, @0x62, 0x102, len=0x2) MSI: Message Control
32481 at 1536163120.079739:rp_read_config (ioh3420, @0x62, len=0x2) 0x102 MSI: Message Control
32481 at 1536163120.079753:rp_write_config (ioh3420, @0x64, 0xfee0100c, len=0x4) MSI: Message Address
32481 at 1536163120.079770:rp_write_config (ioh3420, @0x68, 0x4950, len=0x2) MSI: Message Upper Address
32481 at 1536163120.079786:rp_write_config (ioh3420, @0x6c, 0xfffffffe, len=0x4) MSI: Message Data
32481 at 1536163120.079801:rp_write_config (ioh3420, @0x62, 0x103, len=0x2) MSI: Message Control
32481 at 1536163120.079855:rp_write_config (ioh3420, @0xac, 0x0, len=0x2) PCIE: Root Control
32481 at 1536163120.079872:rp_write_config (ioh3420, @0xa0, 0x0, len=0x2) PCIE: Link Control
32481 at 1536163120.079887:rp_read_config (ioh3420, @0x98, len=0x2) 0x7 PCIE: Device Control
32481 at 1536163120.079903:rp_write_config (ioh3420, @0x98, 0x7, len=0x2) PCIE: Device Control
32481 at 1536163120.079918:rp_read_config (ioh3420, @0xb0, len=0x4) 0x0 PCIE: Root Status
32481 at 1536163120.079934:rp_write_config (ioh3420, @0x12c, 0x7, len=0x4) AER: Root Error Command
32481 at 1536163120.079950:rp_write_config (ioh3420, @0xac, 0x8, len=0x2) PCIE: Root Control
NET._PS0
32481 at 1536163120.175514:rp_write_config (ioh3420, @0xb8, 0x0, len=0x2) PCIE: Device Control 2
More information about the Nouveau
mailing list