[Intel-gfx] [PATCH RESEND] drm/i915: register vga switcheroo later, unregister earlier

Lukas Wunner lukas at wunner.de
Sun Oct 6 10:48:53 UTC 2019


On Sun, Oct 06, 2019 at 12:46:43PM +0300, Jani Nikula wrote:
> Move vga switcheroo and dsm handler register later in
> i915_driver_register(), and unregister in i915_driver_unregister(). The
> dsm handler unregister is a nop, and is only added for completeness.
> 
> My unsubstantiated suspicion is that the vga switcheroo state change
> would not work as early as we register the hooks currently. In any case
> exposing the interfaces to the world only after we've got everything set
> up seems prudent.
> 
> Also replace the error handling in vga switcheroo register with a simple
> error message. This is done at the same time due to lack of error
> propagation from i915_driver_register().
> 
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>

Acked-by: Lukas Wunner <lukas at wunner.de>

Seems like a good idea to limp on instead of bailing out if vga_switcheroo
registration fails.

Taking a brief look at intel_acpi.c, I notice intel_dsm_detect() checks
for presence of exactly 2 devices with class PCI_CLASS_DISPLAY_VGA.
This breaks if a third GPU is attached via Thunderbolt or CardBus.
Not sure if that can happen in reality, I suspect the DSM is only
present on older laptops?

I'm also confused that intel_acpi.c doesn't register a vga_switcheroo
handler.  Is the mux controlled by a separate ACPI method and the one
checked for in intel_acpi.c is only used to gather system information?

Thanks,

Lukas

> ---
>  drivers/gpu/drm/i915/i915_drv.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 9354924576c4..63d47d699305 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -289,12 +289,6 @@ static int i915_driver_modeset_probe(struct drm_i915_private *i915)
>  	if (ret)
>  		goto out;
>  
> -	intel_register_dsm_handler();
> -
> -	ret = i915_switcheroo_register(i915);
> -	if (ret)
> -		goto cleanup_vga_client;
> -
>  	/* must happen before intel_power_domains_init_hw() on VLV/CHV */
>  	intel_update_rawclk(i915);
>  
> @@ -343,8 +337,6 @@ static int i915_driver_modeset_probe(struct drm_i915_private *i915)
>  cleanup_csr:
>  	intel_csr_ucode_fini(i915);
>  	intel_power_domains_driver_remove(i915);
> -	i915_switcheroo_unregister(i915);
> -cleanup_vga_client:
>  	intel_vga_unregister(i915);
>  out:
>  	return ret;
> @@ -356,8 +348,6 @@ static void i915_driver_modeset_remove(struct drm_i915_private *i915)
>  
>  	intel_bios_driver_remove(i915);
>  
> -	i915_switcheroo_unregister(i915);
> -
>  	intel_vga_unregister(i915);
>  
>  	intel_csr_ucode_fini(i915);
> @@ -1344,6 +1334,11 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
>  
>  	intel_power_domains_enable(dev_priv);
>  	intel_runtime_pm_enable(&dev_priv->runtime_pm);
> +
> +	intel_register_dsm_handler();
> +
> +	if (i915_switcheroo_register(dev_priv))
> +		DRM_ERROR("Failed to register vga switcheroo!\n");
>  }
>  
>  /**
> @@ -1352,6 +1347,10 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
>   */
>  static void i915_driver_unregister(struct drm_i915_private *dev_priv)
>  {
> +	i915_switcheroo_unregister(dev_priv);
> +
> +	intel_unregister_dsm_handler();
> +
>  	intel_runtime_pm_disable(&dev_priv->runtime_pm);
>  	intel_power_domains_disable(dev_priv);
>  
> -- 
> 2.20.1
> 


More information about the Intel-gfx mailing list