[Intel-gfx] [PATCH] Fix intel_detect_pch() to work in xen environment.

G.R. firemeteor at users.sourceforge.net
Wed Dec 19 05:01:30 CET 2012


On Wed, Dec 19, 2012 at 1:21 AM, Ben Widawsky <ben at bwidawsk.net> wrote:
> On Wed, 19 Dec 2012 00:49:28 +0800
> "G.R." <firemeteor at users.sourceforge.net> wrote:
>
>> Hi guys,
>>
>> In XEN HVM guest, there is always an emulated PIIX3 ISA bridge on slot 01.0.
>> This shadows the PCH ISA bridge on 1f.0 with the current
>> intel_detect_pch() implementation.
>> The issue can be easily solved by looping through all the ISA bridges
>> until the first match is found, instead of just check against the
>> first one.
>>
>> Here I attach the patch I used locally. It's created on Torvalds's git.
>> Looking forward to your comments.
>>
>> Thanks,
>> Timothy
>
> Is this functionally equivalent to
> http://lists.freedesktop.org/archives/intel-gfx/2012-July/019126.html?
>
I don't think so.
The patch you mentioned tries to detect the VM.
The info could be used enables any required workaround later.
Jesse also expressed the same concern in his mail.
The problem is that there is no standard way to detect a VM.
The patch you mentioned should only work for XEN HVM config.

My patch tries to correctly detect the PCH type in a IGD passthrough VM.
This enables PCH specific code path in the driver.
It really fixes some failure related to gaming / video play back with
VAAPI etc in such a config.
(But it's not a cure-all solution of course, since this is specific to
linux driver.
And there may still be other some xen specific issues to triage.
For example, my linux box almost work great now, but win7 still
keeping BSOD and I even have no idea how to debug)

I think it is feasible to combine the two ideas together if you are
willing to provide VM specific support in your driver.
But as I mentioned before, the problem is we may still need to do it
case by case...

>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
>> index 530db83..3f7e5fb 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -408,9 +408,11 @@ void intel_detect_pch(struct drm_device *dev)
>>          * underneath. This is a requirement from virtualization team.
>>          */
>>         pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
>> -       if (pch) {
>> +       while (pch) {
>> +               struct pci_dev * curr = pch;
>>                 if (pch->vendor == PCI_VENDOR_ID_INTEL) {
>>                         unsigned short id;
>> +                       unsigned found = 1;
>>                         id = pch->device & INTEL_PCH_DEVICE_ID_MASK;
>>                         dev_priv->pch_id = id;
>>
>> @@ -440,10 +442,20 @@ void intel_detect_pch(struct drm_device *dev)
>>                                 dev_priv->num_pch_pll = 0;
>>                                 DRM_DEBUG_KMS("Found LynxPoint LP PCH\n");
>>                                 WARN_ON(!IS_HASWELL(dev));
>> +                       } else {
>> +                               found = 0;
>> +                       }
>> +                       if (found) {
>> +                               BUG_ON(dev_priv->num_pch_pll > I915_NUM_PLLS);
>> +                               pci_dev_put(pch);
>> +                               break;
>>                         }
>> -                       BUG_ON(dev_priv->num_pch_pll > I915_NUM_PLLS);
>>                 }
>> -               pci_dev_put(pch);
>> +               pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, curr);
>> +               pci_dev_put(curr);
>> +       }
>> +       if (!pch) {
>> +               DRM_DEBUG_KMS("No PCH found?\n");
>>         }
>>  }
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
>
>
> --
> Ben Widawsky, Intel Open Source Technology Center



More information about the Intel-gfx mailing list