Message ID | 20201001151640.14590-2-ville.syrjala@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/6] drm/i915: Shut down displays gracefully on reboot | expand |
On Thu, 01 Oct 2020, Ville Syrjala <ville.syrjala@linux.intel.com> wrote: > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Add a new encoder hook .shutdown() which will get called at the end > of the pci .shutdown() hook. We shall use this to deal with the > panel power cycle delay issues. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Jani Nikula <jani.nikula@intel.com> > --- > drivers/gpu/drm/i915/display/intel_display_types.h | 5 +++++ > drivers/gpu/drm/i915/i915_drv.c | 13 +++++++++++++ > 2 files changed, 18 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h > index d5dc18cb8c39..6f3e3d756383 100644 > --- a/drivers/gpu/drm/i915/display/intel_display_types.h > +++ b/drivers/gpu/drm/i915/display/intel_display_types.h > @@ -199,6 +199,11 @@ struct intel_encoder { > * device interrupts are disabled. > */ > void (*suspend)(struct intel_encoder *); > + /* > + * Called during system reboot/shutdown after all the > + * encoders have been disabled and suspended. > + */ > + void (*shutdown)(struct intel_encoder *encoder); > enum hpd_pin hpd_pin; > enum intel_display_power_domain power_domain; > /* for communication with audio component; protected by av_mutex */ > diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c > index 062b61ebd9c4..d38fceb239ac 100644 > --- a/drivers/gpu/drm/i915/i915_drv.c > +++ b/drivers/gpu/drm/i915/i915_drv.c > @@ -1036,6 +1036,18 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) > drm_modeset_unlock_all(dev); > } > > +static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) > +{ > + struct drm_device *dev = &dev_priv->drm; > + struct intel_encoder *encoder; > + > + drm_modeset_lock_all(dev); > + for_each_intel_encoder(dev, encoder) > + if (encoder->shutdown) > + encoder->shutdown(encoder); > + drm_modeset_unlock_all(dev); > +} > + > void i915_driver_shutdown(struct drm_i915_private *i915) > { > i915_gem_suspend(i915); > @@ -1050,6 +1062,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915) > intel_hpd_cancel_work(i915); > > intel_suspend_encoders(i915); > + intel_shutdown_encoders(i915); > } > > static bool suspend_to_idle(struct drm_i915_private *dev_priv)
diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h index d5dc18cb8c39..6f3e3d756383 100644 --- a/drivers/gpu/drm/i915/display/intel_display_types.h +++ b/drivers/gpu/drm/i915/display/intel_display_types.h @@ -199,6 +199,11 @@ struct intel_encoder { * device interrupts are disabled. */ void (*suspend)(struct intel_encoder *); + /* + * Called during system reboot/shutdown after all the + * encoders have been disabled and suspended. + */ + void (*shutdown)(struct intel_encoder *encoder); enum hpd_pin hpd_pin; enum intel_display_power_domain power_domain; /* for communication with audio component; protected by av_mutex */ diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 062b61ebd9c4..d38fceb239ac 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -1036,6 +1036,18 @@ static void intel_suspend_encoders(struct drm_i915_private *dev_priv) drm_modeset_unlock_all(dev); } +static void intel_shutdown_encoders(struct drm_i915_private *dev_priv) +{ + struct drm_device *dev = &dev_priv->drm; + struct intel_encoder *encoder; + + drm_modeset_lock_all(dev); + for_each_intel_encoder(dev, encoder) + if (encoder->shutdown) + encoder->shutdown(encoder); + drm_modeset_unlock_all(dev); +} + void i915_driver_shutdown(struct drm_i915_private *i915) { i915_gem_suspend(i915); @@ -1050,6 +1062,7 @@ void i915_driver_shutdown(struct drm_i915_private *i915) intel_hpd_cancel_work(i915); intel_suspend_encoders(i915); + intel_shutdown_encoders(i915); } static bool suspend_to_idle(struct drm_i915_private *dev_priv)