Skip to content
  • Chuck Zmudzinski's avatar
    4f67543b
    xen/pt: reserve PCI slot 2 for Intel igd-passthru · 4f67543b
    Chuck Zmudzinski authored
    
    
    Intel specifies that the Intel IGD must occupy slot 2 on the PCI bus,
    as noted in docs/igd-assign.txt in the Qemu source code.
    
    Currently, when the xl toolstack is used to configure a Xen HVM guest with
    Intel IGD passthrough to the guest with the Qemu upstream device model,
    a Qemu emulated PCI device will occupy slot 2 and the Intel IGD will occupy
    a different slot. This problem often prevents the guest from booting.
    
    The only available workarounds are not good: Configure Xen HVM guests to
    use the old and no longer maintained Qemu traditional device model
    available from xenbits.xen.org which does reserve slot 2 for the Intel
    IGD or use the "pc" machine type instead of the "xenfv" machine type and
    add the xen platform device at slot 3 using a command line option
    instead of patching qemu to fix the "xenfv" machine type directly. The
    second workaround causes some degredation in startup performance such as
    a longer boot time and reduced resolution of the grub menu that is
    displayed on the monitor. This patch avoids that reduced startup
    performance when using the Qemu upstream device model for Xen HVM guests
    configured with the igd-passthru=on option.
    
    To implement this feature in the Qemu upstream device model for Xen HVM
    guests, introduce the following new functions, types, and macros:
    
    * XEN_PT_DEVICE_CLASS declaration, based on the existing TYPE_XEN_PT_DEVICE
    * XEN_PT_DEVICE_GET_CLASS macro helper function for XEN_PT_DEVICE_CLASS
    * typedef XenPTQdevRealize function pointer
    * XEN_PCI_IGD_SLOT_MASK, the value of slot_reserved_mask to reserve slot 2
    * xen_igd_reserve_slot and xen_igd_clear_slot functions
    
    Michael Tsirkin:
    * Introduce XEN_PCI_IGD_DOMAIN, XEN_PCI_IGD_BUS, XEN_PCI_IGD_DEV, and
      XEN_PCI_IGD_FN - use them to compute the value of XEN_PCI_IGD_SLOT_MASK
    
    The new xen_igd_reserve_slot function uses the existing slot_reserved_mask
    member of PCIBus to reserve PCI slot 2 for Xen HVM guests configured using
    the xl toolstack with the gfx_passthru option enabled, which sets the
    igd-passthru=on option to Qemu for the Xen HVM machine type.
    
    The new xen_igd_reserve_slot function also needs to be implemented in
    hw/xen/xen_pt_stub.c to prevent FTBFS during the link stage for the case
    when Qemu is configured with --enable-xen and --disable-xen-pci-passthrough,
    in which case it does nothing.
    
    The new xen_igd_clear_slot function overrides qdev->realize of the parent
    PCI device class to enable the Intel IGD to occupy slot 2 on the PCI bus
    since slot 2 was reserved by xen_igd_reserve_slot when the PCI bus was
    created in hw/i386/pc_piix.c for the case when igd-passthru=on.
    
    Move the call to xen_host_pci_device_get, and the associated error
    handling, from xen_pt_realize to the new xen_igd_clear_slot function to
    initialize the device class and vendor values which enables the checks for
    the Intel IGD to succeed. The verification that the host device is an
    Intel IGD to be passed through is done by checking the domain, bus, slot,
    and function values as well as by checking that gfx_passthru is enabled,
    the device class is VGA, and the device vendor in Intel.
    
    Signed-off-by: default avatarChuck Zmudzinski <brchuckz@aol.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarStefano Stabellini <sstabellini@kernel.org>
    Message-Id: <b1b4a21fe9a600b1322742dda55a40e9961daa57.1674346505.git.brchuckz@aol.com>
    Signed-off-by: default avatarAnthony PERARD <anthony.perard@citrix.com>
    4f67543b
    xen/pt: reserve PCI slot 2 for Intel igd-passthru
    Chuck Zmudzinski authored
    
    
    Intel specifies that the Intel IGD must occupy slot 2 on the PCI bus,
    as noted in docs/igd-assign.txt in the Qemu source code.
    
    Currently, when the xl toolstack is used to configure a Xen HVM guest with
    Intel IGD passthrough to the guest with the Qemu upstream device model,
    a Qemu emulated PCI device will occupy slot 2 and the Intel IGD will occupy
    a different slot. This problem often prevents the guest from booting.
    
    The only available workarounds are not good: Configure Xen HVM guests to
    use the old and no longer maintained Qemu traditional device model
    available from xenbits.xen.org which does reserve slot 2 for the Intel
    IGD or use the "pc" machine type instead of the "xenfv" machine type and
    add the xen platform device at slot 3 using a command line option
    instead of patching qemu to fix the "xenfv" machine type directly. The
    second workaround causes some degredation in startup performance such as
    a longer boot time and reduced resolution of the grub menu that is
    displayed on the monitor. This patch avoids that reduced startup
    performance when using the Qemu upstream device model for Xen HVM guests
    configured with the igd-passthru=on option.
    
    To implement this feature in the Qemu upstream device model for Xen HVM
    guests, introduce the following new functions, types, and macros:
    
    * XEN_PT_DEVICE_CLASS declaration, based on the existing TYPE_XEN_PT_DEVICE
    * XEN_PT_DEVICE_GET_CLASS macro helper function for XEN_PT_DEVICE_CLASS
    * typedef XenPTQdevRealize function pointer
    * XEN_PCI_IGD_SLOT_MASK, the value of slot_reserved_mask to reserve slot 2
    * xen_igd_reserve_slot and xen_igd_clear_slot functions
    
    Michael Tsirkin:
    * Introduce XEN_PCI_IGD_DOMAIN, XEN_PCI_IGD_BUS, XEN_PCI_IGD_DEV, and
      XEN_PCI_IGD_FN - use them to compute the value of XEN_PCI_IGD_SLOT_MASK
    
    The new xen_igd_reserve_slot function uses the existing slot_reserved_mask
    member of PCIBus to reserve PCI slot 2 for Xen HVM guests configured using
    the xl toolstack with the gfx_passthru option enabled, which sets the
    igd-passthru=on option to Qemu for the Xen HVM machine type.
    
    The new xen_igd_reserve_slot function also needs to be implemented in
    hw/xen/xen_pt_stub.c to prevent FTBFS during the link stage for the case
    when Qemu is configured with --enable-xen and --disable-xen-pci-passthrough,
    in which case it does nothing.
    
    The new xen_igd_clear_slot function overrides qdev->realize of the parent
    PCI device class to enable the Intel IGD to occupy slot 2 on the PCI bus
    since slot 2 was reserved by xen_igd_reserve_slot when the PCI bus was
    created in hw/i386/pc_piix.c for the case when igd-passthru=on.
    
    Move the call to xen_host_pci_device_get, and the associated error
    handling, from xen_pt_realize to the new xen_igd_clear_slot function to
    initialize the device class and vendor values which enables the checks for
    the Intel IGD to succeed. The verification that the host device is an
    Intel IGD to be passed through is done by checking the domain, bus, slot,
    and function values as well as by checking that gfx_passthru is enabled,
    the device class is VGA, and the device vendor in Intel.
    
    Signed-off-by: default avatarChuck Zmudzinski <brchuckz@aol.com>
    Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: default avatarStefano Stabellini <sstabellini@kernel.org>
    Message-Id: <b1b4a21fe9a600b1322742dda55a40e9961daa57.1674346505.git.brchuckz@aol.com>
    Signed-off-by: default avatarAnthony PERARD <anthony.perard@citrix.com>
Loading