All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: Daniel Vetter <daniel.vetter@intel.com>,
	alsa-devel@alsa-project.org, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 1/3] drm/i915/hda: Add audio component stub
Date: Thu, 7 Apr 2016 14:55:52 +0300	[thread overview]
Message-ID: <20160407115552.GB4329@intel.com> (raw)
In-Reply-To: <1460026644-30479-2-git-send-email-tiwai@suse.de>

On Thu, Apr 07, 2016 at 12:57:22PM +0200, Takashi Iwai wrote:
> From: Imre Deak <imre.deak@intel.com>
> 
> User may pass nomodeset or i915.modeset=0 option to disable i915 KMS
> explicitly.  Although this itself works fine, it breaks the weak
> dependency the HD-audio driver requires, and it's the reason the
> delayed component binding isn't implemented in HD-audio.  Since i915
> doesn't notify its disablement, HD-audio would be blocked
> unnecessarily endlessly, waiting for the bind with i915.
> 
> This patch introduces a stub audio component binding when i915 driver
> is loaded with KMS off like the boot options above.  Then i915 driver
> still registers the slave component but with the new "disabled" ops
> flag, so that the master component (HD-audio) can know clearly the
> slave state.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
>  drivers/gpu/drm/i915/i915_drv.c    | 34 +++++++++++++--------
>  drivers/gpu/drm/i915/intel_audio.c | 61 ++++++++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/intel_drv.h   |  2 ++
>  include/drm/i915_component.h       |  5 ++++
>  4 files changed, 90 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 20e82008b8b6..21c6bac5468e 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -950,6 +950,19 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  	struct intel_device_info *intel_info =
>  		(struct intel_device_info *) ent->driver_data;
>  
> +	if (!(driver.driver_features & DRIVER_MODESET)) {
> +		/*
> +		 * Notify the HDA driver so that it doesn't block waiting for
> +		 * i915 to become ready.
> +		 */
> +		i915_audio_component_stub_init(&pdev->dev);
> +
> +		/* Silently fail loading to not upset userspace. */
> +		DRM_DEBUG_DRIVER("KMS and UMS disabled.\n");
> +
> +		return 0;
> +	}
> +

Moving this here means we're actually going to bind to the device even
w/o DRIVER_MODESET. Hopefully the fact that we don't register with any
subsystems would make that OK. But since we need the actual device for
the component stuff, I guess this is the only way.

>  	if (IS_PRELIMINARY_HW(intel_info) && !i915.preliminary_hw_support) {
>  		DRM_INFO("This hardware requires preliminary hardware support.\n"
>  			 "See CONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT, and/or modparam preliminary_hw_support\n");
> @@ -979,8 +992,14 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  static void
>  i915_pci_remove(struct pci_dev *pdev)
>  {
> -	struct drm_device *dev = pci_get_drvdata(pdev);
> +	struct drm_device *dev;
>  
> +	if (!(driver.driver_features & DRIVER_MODESET)) {
> +		i915_audio_component_stub_cleanup(&pdev->dev);
> +		return;
> +	}
> +
> +	dev = pci_get_drvdata(pdev);
>  	drm_put_dev(dev);
>  }
>  
> @@ -1747,24 +1766,15 @@ static int __init i915_init(void)
>  		driver.driver_features &= ~DRIVER_MODESET;
>  #endif
>  
> -	if (!(driver.driver_features & DRIVER_MODESET)) {
> -		/* Silently fail loading to not upset userspace. */
> -		DRM_DEBUG_DRIVER("KMS and UMS disabled.\n");
> -		return 0;
> -	}
> -
>  	if (i915.nuclear_pageflip)
>  		driver.driver_features |= DRIVER_ATOMIC;
>  
> -	return drm_pci_init(&driver, &i915_pci_driver);
> +	return pci_register_driver(&i915_pci_driver);
>  }
>  
>  static void __exit i915_exit(void)
>  {
> -	if (!(driver.driver_features & DRIVER_MODESET))
> -		return; /* Never loaded a driver. */
> -
> -	drm_pci_exit(&driver, &i915_pci_driver);
> +	pci_unregister_driver(&i915_pci_driver);
>  }
>  
>  module_init(i915_init);
> diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
> index 30f921421b0c..bd9e9760903a 100644
> --- a/drivers/gpu/drm/i915/intel_audio.c
> +++ b/drivers/gpu/drm/i915/intel_audio.c
> @@ -835,3 +835,64 @@ void i915_audio_component_cleanup(struct drm_i915_private *dev_priv)
>  	component_del(dev_priv->dev->dev, &i915_audio_component_bind_ops);
>  	dev_priv->audio_component_registered = false;
>  }
> +
> +static const struct i915_audio_component_ops i915_audio_component_stub_ops = {
> +	.owner		= THIS_MODULE,
> +	.disabled	= true,
> +};
> +
> +static int i915_audio_component_stub_bind(struct device *i915_stub_dev,
> +					  struct device *hda_dev, void *data)
> +{
> +	struct i915_audio_component *acomp = data;
> +
> +	if (WARN_ON(acomp->ops || acomp->dev))
> +		return -EEXIST;
> +
> +	acomp->ops = &i915_audio_component_stub_ops;
> +	acomp->dev = i915_stub_dev;
> +
> +	return 0;
> +}
> +
> +static void i915_audio_component_stub_unbind(struct device *i915_stub_dev,
> +					     struct device *hda_dev, void *data)
> +{
> +	struct i915_audio_component *acomp = data;
> +
> +	acomp->ops = NULL;
> +	acomp->dev = NULL;
> +}
> +
> +static const struct component_ops i915_audio_component_stub_bind_ops = {
> +	.bind	= i915_audio_component_stub_bind,
> +	.unbind	= i915_audio_component_stub_unbind,
> +};
> +
> +static const struct file_operations component_stub_dev_ops = {
> +	.owner = THIS_MODULE,
> +};
> +
> +static bool i915_audio_component_stub_registered;
> +
> +void i915_audio_component_stub_init(struct device *dev)
> +{
> +	int ret;
> +
> +	ret = component_add(dev, &i915_audio_component_stub_bind_ops);
> +	if (ret < 0) {
> +		DRM_ERROR("failed to add audio stub component (%d)\n", ret);
> +		return;
> +	}
> +
> +	i915_audio_component_stub_registered = true;

Maybe just fail the probe on error and avoid the flag?

> +}
> +
> +void i915_audio_component_stub_cleanup(struct device *dev)
> +{
> +	if (!i915_audio_component_stub_registered)
> +		return;
> +
> +	component_del(dev, &i915_audio_component_stub_bind_ops);
> +	i915_audio_component_stub_registered = false;
> +}
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 4c027d69fac9..e1d9c33b113e 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1056,6 +1056,8 @@ void intel_audio_codec_enable(struct intel_encoder *encoder);
>  void intel_audio_codec_disable(struct intel_encoder *encoder);
>  void i915_audio_component_init(struct drm_i915_private *dev_priv);
>  void i915_audio_component_cleanup(struct drm_i915_private *dev_priv);
> +void i915_audio_component_stub_init(struct device *dev);
> +void i915_audio_component_stub_cleanup(struct device *dev);
>  
>  /* intel_display.c */
>  extern const struct drm_plane_funcs intel_plane_funcs;
> diff --git a/include/drm/i915_component.h b/include/drm/i915_component.h
> index b46fa0ef3005..33da85aa70c3 100644
> --- a/include/drm/i915_component.h
> +++ b/include/drm/i915_component.h
> @@ -39,6 +39,11 @@ struct i915_audio_component_ops {
>  	 */
>  	struct module *owner;
>  	/**
> +	 * @disabled: i915 driver loaded with modeset=0, the services provided
> +	 * via the audio component interface are not available.
> +	 */
> +	bool disabled;
> +	/**
>  	 * @get_power: get the POWER_DOMAIN_AUDIO power well
>  	 *
>  	 * Request the power well to be turned on.
> -- 
> 2.8.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2016-04-07 11:55 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-07 10:57 [PATCH 0/3] More robust i915 / audio binding Takashi Iwai
2016-04-07 10:57 ` [PATCH 1/3] drm/i915/hda: Add audio component stub Takashi Iwai
2016-04-07 11:55   ` Ville Syrjälä [this message]
2016-04-07 12:30     ` Imre Deak
2016-04-25 12:46       ` Takashi Iwai
2016-05-12 18:06   ` [PATCH v2 " Imre Deak
2016-05-13  7:48     ` Takashi Iwai
2016-05-13  9:50       ` Imre Deak
2016-05-13 10:04         ` Takashi Iwai
2016-05-13 10:44           ` Imre Deak
2016-05-17  7:20     ` Daniel Vetter
2016-05-17  7:37       ` Takashi Iwai
2016-05-17  9:42         ` Daniel Vetter
2016-05-17  9:59           ` Takashi Iwai
2016-05-17 10:22             ` Imre Deak
2016-05-17 11:10               ` Daniel Vetter
2016-05-17 12:11                 ` Imre Deak
2016-05-17 12:34                   ` Daniel Vetter
2016-05-17 12:37                     ` Daniel Vetter
2016-05-17 12:39                       ` Daniel Vetter
2016-05-17 12:53                         ` Takashi Iwai
2016-05-17 13:57                           ` Takashi Iwai
2016-05-17 13:59                             ` Daniel Vetter
2016-05-17 15:03                               ` Takashi Iwai
2016-05-17 12:51                       ` Takashi Iwai
2016-05-17 12:47                     ` Takashi Iwai
2016-05-17 12:56                       ` Daniel Vetter
2016-05-17 13:20                         ` Takashi Iwai
2016-05-17 16:18                           ` Daniel Vetter
2016-05-17 16:23                             ` Daniel Vetter
2016-05-17 18:19                               ` Takashi Iwai
2016-05-17 21:11                                 ` Daniel Vetter
2016-05-18  9:06                                   ` Takashi Iwai
2016-05-17 17:24                             ` Takashi Iwai
2016-05-17  9:10       ` Imre Deak
2016-04-07 10:57 ` [PATCH 2/3] ALSA: hda - Immediately fail if the i915 audio component is disabled Takashi Iwai
2016-04-07 10:57 ` [PATCH 3/3] ALSA: hda - Support deferred i915 audio component binding Takashi Iwai
2016-04-07 14:09 ` ✗ Fi.CI.BAT: failure for More robust i915 / audio binding Patchwork
2016-05-12 18:49 ` ✗ Ro.CI.BAT: failure for More robust i915 / audio binding (rev2) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160407115552.GB4329@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=daniel.vetter@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.