On 5/20/25 01:15, Alex Williamson wrote: > [Please Cc maintainers - added here] > > On Mon, 19 May 2025 18:08:39 +0300 > Qwinci <qwinci...@gmail.com> wrote: > >> Change the IGD detection logic to also accept gpus with >> PCI_CLASS_DISPLAY_OTHER class which is used if the igpu is not >> set as the primary boot gpu. >> >> Signed-off-by: Qwinci <qwinci...@gmail.com> >> --- >> hw/vfio/igd.c | 16 +++++++++++++--- >> 1 file changed, 13 insertions(+), 3 deletions(-) >> >> diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c >> index e7952d15a0..1ddfcc2c17 100644 >> --- a/hw/vfio/igd.c >> +++ b/hw/vfio/igd.c >> @@ -454,6 +454,16 @@ static bool vfio_pci_igd_override_gms(int gen, uint32_t >> gms, uint32_t *gmch) >> #define IGD_GGC_MMIO_OFFSET 0x108040 >> #define IGD_BDSM_MMIO_OFFSET 0x1080C0 >> >> +static bool is_igd(VFIOPCIDevice *vdev) { >> + if (vfio_is_vga(vdev)) { >> + return true; >> + } >> + >> + PCIDevice *pdev = &vdev->pdev; >> + uint16_t class = pci_get_word(pdev->config + PCI_CLASS_DEVICE); >> + return class == PCI_CLASS_DISPLAY_OTHER; >> +} > > But the function isn't detecting IGD, it's detecting VGA or DISPLAY > class devices. So it's misnamed and we might want a new > vfio_is_display() and if necessary a wrapper for both that tests > vfio_is_vga_or_display(), or maybe a vfio_is_base_display() if we want > to test only the base class.
+1, matching the base class is enough here I think. > More importantly maybe, sure there might be IGD as non-primary > configurations, but are the quirks still relevant to those devices? > Which ones? Thanks, > > Alex Actually this is what I've worked on for a while. Only the OpRegion quirk is needed in this configuration, Windows driver requires it. Additionally, legacy mode should be disabled when IGD is non-primary as VGA ranges are not routed to IGD. It also requires a more recent version kernel (6.15+) [1] for OpRegion support on IGD as non-primary graphics. [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=41112160ca87d6b5280813ef61f1c35bb9ee2f82 Thanks, Moeko >> void vfio_probe_igd_bar0_quirk(VFIOPCIDevice *vdev, int nr) >> { >> VFIOQuirk *ggc_quirk, *bdsm_quirk; >> @@ -461,7 +471,7 @@ void vfio_probe_igd_bar0_quirk(VFIOPCIDevice *vdev, int >> nr) >> int gen; >> >> if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) || >> - !vfio_is_vga(vdev) || nr != 0) { >> + !is_igd(vdev) || nr != 0) { >> return; >> } >> >> @@ -519,7 +529,7 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice >> *vdev, Error **errp) >> Error *err = NULL; >> >> if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) || >> - !vfio_is_vga(vdev)) { >> + !is_igd(vdev)) { >> return true; >> } >> >> @@ -685,7 +695,7 @@ static bool vfio_pci_kvmgt_config_quirk(VFIOPCIDevice >> *vdev, Error **errp) >> int gen; >> >> if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) || >> - !vfio_is_vga(vdev)) { >> + !is_igd(vdev)) { >> return true; >> } >> >