Message ID | 20220405184118.2714322-1-lucas.demarchi@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [topic/core-for-CI] ALSA: hda/i915 - skip acomp init if no matching display | expand |
On Tue, Apr 05, 2022 at 11:41:18AM -0700, Lucas De Marchi wrote: >From: Kai Vehmanen <kai.vehmanen@linux.intel.com> > >In systems with only a discrete i915 GPU, the acomp init will >always timeout for the PCH HDA controller instance. > >Avoid the timeout by checking the PCI device hierarchy >whether any display class PCI device can be found on the system, >and at the same level as the HDA PCI device. If found, proceed >with the acomp init, which will wait until i915 probe is complete >and component binding can proceed. If no matching display >device is found, the audio component bind can be safely skipped. > >The bind timeout will still be hit if the display is present >in the system, but i915 driver does not bind to it by configuration >choice or probe error. In this case the 60sec timeout will be >hit. > >Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> >Acked-by: Lucas De Marchi <lucas.demarchi@intel.com> >Link: https://lore.kernel.org/r/20220405123622.2874457-1-kai.vehmanen@linux.intel.com >Signed-off-by: Takashi Iwai <tiwai@suse.de> >(cherry picked from commit c9db8a30d9f091aa571b5fb7c3f434cde107b02c) >[ applied on sound/for-linus - cherry-pick it in topic/core-for-CI to > unblock some CI tests ] >Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> with the ack from Kai that it's ok to merge this temporarily to topic/core-for-CI as it's already merged in sound tree, I pushed it. thanks Lucas De Marchi
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index c42790863805..1ce2cea137db 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -116,16 +116,25 @@ static int i915_component_master_match(struct device *dev, int subcomponent, return 0; } -/* check whether intel graphics is present */ -static bool i915_gfx_present(void) +/* check whether Intel graphics is present and reachable */ +static int i915_gfx_present(struct pci_dev *hdac_pci) { - static const struct pci_device_id ids[] = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID), - .class = PCI_BASE_CLASS_DISPLAY << 16, - .class_mask = 0xff << 16 }, - {} - }; - return pci_dev_present(ids); + unsigned int class = PCI_BASE_CLASS_DISPLAY << 16; + struct pci_dev *display_dev = NULL; + bool match = false; + + do { + display_dev = pci_get_class(class, display_dev); + + if (display_dev && display_dev->vendor == PCI_VENDOR_ID_INTEL && + connectivity_check(display_dev, hdac_pci)) + match = true; + + pci_dev_put(display_dev); + + } while (!match && display_dev); + + return match; } static bool dg1_gfx_present(void) @@ -165,7 +174,7 @@ int snd_hdac_i915_init(struct hdac_bus *bus) struct drm_audio_component *acomp; int err; - if (!i915_gfx_present()) + if (!i915_gfx_present(to_pci_dev(bus->dev))) return -ENODEV; if (dg1_gfx_present())