[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [Xen-unstable][Qemu-xen] HVM Guest reading of Expansion ROM from passthroughed PCI device returns data from emulated VGA rom
Hi, I'm trying to get secondary vga-passthrough on a HVM guest to work with a AMD HD6570 and the native kernel radeon driver and kernel modesetting. So the guest still gets the emulated stdvga or cirrus device(used in my case here) as primary/boot vga adapter. - When i don't passthrough the radeon card, the linux native radeon driver loads fine. - When i do passtrough the device to a HVM with the same kernel: The driver in the guest tries to read the pci expansion rom from the passthroughed device to get the vbios. The driver reports a successful read, but fails because it can't find the right string at the right offset. So I inspected the rom by using sysfs with: echo 1 > /sys/bus/pci/BDF/rom cat /sys/bus/pci/BDF/rom - When i use this in dom0 (so without passthrough) i the contents of the ROM are valid (as expected since the driver loads fine) - When i use this in the Guest (passthrouhed), the contents of the ROM i get are not from the passedthrough adapter, but from the emulated cirrus card. (it's the same as the "tools/firmware/vgabios/VGABIOS-lgpl-latest.cirrus.bin") So i tried both qemu-xen and qemu-xen-traditional, but both with the same result. To see if some addresses get mangled i enabled the xen passthrough debug printk's for both qemu's and added a printk to the radeon driver to see where it tries to read the rom. from dom0 lspci: 07:00.0 VGA compatible controller [0300]: Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6570] [1002:6759] (prog-if 00 [VGA controller]) Subsystem: PC Partner Limited Device [174b:e193] Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Interrupt: pin A routed to IRQ 32 Region 0: Memory at a0000000 (64-bit, prefetchable) [disabled] [size=256M] Region 2: Memory at f99c0000 (64-bit, non-prefetchable) [disabled] [size=128K] Region 4: I/O ports at a000 [disabled] [size=256] Expansion ROM at f99a0000 [disabled] [size=128K] from qemu-dm-log: vgabios-cirrus.bin: ROM id 101300b8 / PCI id 101300b8 pxe-e1000.rom: ROM id 8086100e / PCI id 8086100e xen_platform: changed ro/rw state of ROM memory area. now is rw state. xen: I/O request not ready: 0, ptr: 0, port: 0, data: 0, count: 0, size: 0 xen: I/O request not ready: 0, ptr: 0, port: 0, data: 0, count: 0, size: 0 [00:05.0] xen_pt_initfn: Assigning real physical device 07:00.0 to devfn 0x28 [00:05.0] xen_pt_register_regions: IO region 0 registered (size=0x10000000lx base_addr=0xa0000000lx type: 0x4) [00:05.0] xen_pt_register_regions: IO region 2 registered (size=0x20000lx base_addr=0xf99c0000lx type: 0x4) [00:05.0] xen_pt_register_regions: IO region 4 registered (size=0x100lx base_addr=0xa000lx type: 0x1) [00:05.0] xen_pt_register_regions: Expansion ROM registered (size=0x00020000 base_addr=0xf99a0000) That seems to match ... from guest lspci: 00:05.0 VGA compatible controller [0300]: Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6570] [1002:6759] (prog-if 00 [VGA controller]) Subsystem: PC Partner Limited Device [174b:e193] Physical Slot: 5 Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Interrupt: pin A routed to IRQ 36 Region 0: Memory at e0000000 (64-bit, prefetchable) [size=256M] Region 2: Memory at f3040000 (64-bit, non-prefetchable) [size=128K] Region 4: I/O ports at c100 [size=256] Expansion ROM at f3060000 [disabled] [size=128K] from the radeon driver in the guest: [ 1.283333] pci 0000:00:01.1: BAR 0: reserving [io 0x01f0-0x01f7 flags 0x110] (d=0, p=0) [ 1.283333] pci 0000:00:01.1: BAR 1: reserving [io 0x03f6 flags 0x110] (d=0, p=0) [ 1.283333] pci 0000:00:01.1: BAR 2: reserving [io 0x0170-0x0177 flags 0x110] (d=0, p=0) [ 1.283333] pci 0000:00:01.1: BAR 3: reserving [io 0x0376 flags 0x110] (d=0, p=0) [ 1.283333] pci 0000:00:01.1: BAR 4: reserving [io 0xc260-0xc26f flags 0x40101] (d=0, p=0) [ 1.283333] pci 0000:00:01.2: BAR 4: reserving [io 0xc240-0xc25f flags 0x40101] (d=0, p=0) [ 1.283333] pci 0000:00:02.0: BAR 0: reserving [mem 0xf0000000-0xf1ffffff flags 0x42208] (d=0, p=0) [ 1.283333] pci 0000:00:02.0: BAR 1: reserving [mem 0xf3094000-0xf3094fff flags 0x40200] (d=0, p=0) [ 1.283493] pci 0000:00:03.0: BAR 0: reserving [io 0xc000-0xc0ff flags 0x40101] (d=0, p=0) [ 1.285517] pci 0000:00:03.0: BAR 1: reserving [mem 0xf2000000-0xf2ffffff flags 0x42208] (d=0, p=0) [ 1.286666] pci 0000:00:05.0: BAR 0: reserving [mem 0xe0000000-0xefffffff flags 0x14220c] (d=0, p=0) [ 1.286666] pci 0000:00:05.0: BAR 2: reserving [mem 0xf3040000-0xf305ffff flags 0x140204] (d=0, p=0) [ 1.286666] pci 0000:00:05.0: BAR 4: reserving [io 0xc100-0xc1ff flags 0x40101] (d=0, p=0) [ 1.286666] pci 0000:00:06.0: BAR 0: reserving [mem 0xf3090000-0xf3093fff flags 0x140204] (d=0, p=0) <snip> [ 1.744843] [drm] Initialized drm 1.1.0 20060810 [ 1.746503] [drm] radeon kernel modesetting enabled. [ 1.747964] [drm:drm_pci_init], [ 1.749911] [drm:drm_get_pci_dev], [ 1.752812] xen: --> pirq=32 -> irq=36 (gsi=36) [ 1.755203] [drm:drm_get_minor], [ 1.757902] [drm:drm_get_minor], new minor assigned 64 [ 1.760337] [drm:drm_get_minor], [ 1.762547] [drm:drm_get_minor], new minor assigned 0 [ 1.765509] [drm] initializing kernel modesetting (TURKS 0x1002:0x6759 0x174B:0xE193). [ 1.767705] [drm] register mmio base: 0xF3040000 [ 1.769135] [drm] register mmio size: 131072 [ 1.770551] [drm] radeon_atrm_get_bios: failed [ 1.771878] [drm] radeon_acpi_vfct_bios: failed [ 1.773193] [drm] igp_read_bios_from_vram: failed [ 1.774744] [drm:radeon_read_bios], BIOS radeon_read_bios: size: 0x8c00 biosiomemstart: 0xf3060000 [ 1.777717] [drm] radeon_read_bios: succes [ 1.779057] [drm:radeon_get_bios], BIOS headerstart: 0x2077 bios length: 6|8 headerstring 0xc6 0x7c 0x0 0x0 [ 1.784874] [drm:radeon_get_bios], COMBIOS detected [ 1.786811] radeon 0000:00:05.0: Expecting atombios for evergreen GPU [ 1.788255] radeon 0000:00:05.0: Fatal error during GPU init [ 1.789919] [drm] radeon: finishing device. So the address that the radeon_read_bios function uses, also matches. So i'm pretty clueless how it ends up with the data from the cirrus rom when it's reading the right address ... I'm using: Xen: Xen-unstable git:c5e9596 Linux dom0 + domU: 3.12-mergewindow + konrad's jumplabel patch (i also tested with 3.9.0 kernel) I have attached the qemu-xen logs, but i have the qemu-xen-traditional logs as well. Attached: - xl-dmesg.txt output of "xl dmesg" with start and shutdown of the guest - xl-create.txt output of "xl -vvvvv create" of the guest - lspci-dom0.txt output of "lspci -vvvknn" for dom0 - lspci-guest.txt output of "lspci -vvvknn" for guest - qemu-dm-guest.log - dmesg-guest.txt -- Sander Attachment:
dmesg-guest.txt Attachment:
lspci-dom0.txt Attachment:
lspci-guest.txt Attachment:
qemu-dm-guest.log Attachment:
xl-create.txt Attachment:
xl-dmesg.txt _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |