On 4/23/25 14:54, Corvin Köhne wrote:
> On Tue, 2025-04-22 at 00:31 +0800, Tomita Moeko wrote:
>> CAUTION: External Email!!
>> There is currently no straightforward way to distinguish if a Intel
>> graphics device is IGD or discrete GPU. However, only IGD devices expose
>> OpRegion. Use the presence of VFIO_REGION_SUBTYPE_INTEL_IGD_OPREGION
>> to identify IGD devices.
>>
>> Signed-off-by: Tomita Moeko <tomitamo...@gmail.com>
>> ---
>>  hw/vfio/igd.c | 26 ++++++++++++++++++--------
>>  1 file changed, 18 insertions(+), 8 deletions(-)
>>
>> diff --git a/hw/vfio/igd.c b/hw/vfio/igd.c
>> index 36316e50ea..7a7c7735c1 100644
>> --- a/hw/vfio/igd.c
>> +++ b/hw/vfio/igd.c
>> @@ -479,6 +479,7 @@ void vfio_probe_igd_bar0_quirk(VFIOPCIDevice *vdev, int
>> nr)
>>  
>>  static bool vfio_pci_igd_config_quirk(VFIOPCIDevice *vdev, Error **errp)
>>  {
>> +    g_autofree struct vfio_region_info *opregion = NULL;
>>      int ret, gen;
>>      uint64_t gms_size;
>>      uint64_t *bdsm_size;
>> @@ -486,16 +487,20 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice
>> *vdev, Error **errp)
>>      bool legacy_mode_enabled = false;
>>      Error *err = NULL;
>>  
>> -    /*
>> -     * This must be an Intel VGA device at address 00:02.0 for us to even
>> -     * consider enabling legacy mode.  The vBIOS has dependencies on the
>> -     * PCI bus address.
>> -     */
> 
> Why do you remove this comment? Yes, the comment is not correct. Some OS 
> driver
> and the UEFI GOP depend on address 00:02.0 too. Wouldn't it be better to 
> improve
> the comment instead of removing it? This restriction looks a bit odd and IMO a
> comment would help future reader to understand it easier. 

The restriction is documented in doc/igd-assign.txt, keeping the comment here
seems misleading IMO. That's why I decided to remove it here.


>>      if (!vfio_pci_is(vdev, PCI_VENDOR_ID_INTEL, PCI_ANY_ID) ||
>>          !vfio_is_vga(vdev)) {
>>          return true;
>>      }
>>  
>> +    /* IGD device always comes with OpRegion */
>> +    ret = vfio_device_get_region_info_type(&vdev->vbasedev,
>> +                    VFIO_REGION_TYPE_PCI_VENDOR_TYPE | PCI_VENDOR_ID_INTEL,
>> +                    VFIO_REGION_SUBTYPE_INTEL_IGD_OPREGION, &opregion);
>> +    if (ret) {
>> +        return true;
>> +    }
>> +    info_report("OpRegion detected on Intel display %x.", vdev->device_id);
>> +
>>      /*
>>       * IGD is not a standard, they like to change their specs often.  We
>>       * only attempt to support back to SandBridge and we hope that newer
>> @@ -570,9 +575,14 @@ static bool vfio_pci_igd_config_quirk(VFIOPCIDevice
>> *vdev, Error **errp)
>>      }
>>  
>>      /* Setup OpRegion access */
>> -    if ((vdev->features & VFIO_FEATURE_ENABLE_IGD_OPREGION) &&
>> -        !vfio_pci_igd_setup_opregion(vdev, errp)) {
>> -        goto error;
>> +    if ((vdev->features & VFIO_FEATURE_ENABLE_IGD_OPREGION)) {
>> +        if (vdev->pdev.qdev.hotplugged) {
>> +            error_setg(errp, "OpRegion is not supported on hotplugged
>> device");
>> +            goto error;
>> +        }
>> +        if (!vfio_pci_igd_opregion_init(vdev, opregion, errp)) {
>> +            goto error;
>> +        }
> 
> How is this part related to "Detect IGD device by OpRegion"?

As Alex suggested, this part will be refactored in v2.

Thanks,
Moeko

>>      }
>>  
>>      /* Setup LPC bridge / Host bridge PCI IDs */
> 


Reply via email to