Message ID | 1420836965-10068-9-git-send-email-vandana.kannan@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Great! Although I'd prefer at intel_drrs.c.. ;) Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan <vandana.kannan@intel.com> wrote: > Adding an overview of DRRS in general and the implementation for eDP DRRS. > Also, describing the functions related to eDP DRRS. > > Signed-off-by: Vandana Kannan <vandana.kannan@intel.com> > --- > Documentation/DocBook/drm.tmpl | 11 +++++ > drivers/gpu/drm/i915/intel_dp.c | 95 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 106 insertions(+) > > diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl > index 3b2571e..8c844b4 100644 > --- a/Documentation/DocBook/drm.tmpl > +++ b/Documentation/DocBook/drm.tmpl > @@ -4042,6 +4042,17 @@ int num_ioctls;</synopsis> > !Idrivers/gpu/drm/i915/intel_fbc.c > </sect2> > <sect2> > + <title>Display Refresh Rate Switching (DRRS)</title> > +!Pdrivers/gpu/drm/i915/intel_dp.c Display Refresh Rate Switching (DRRS) > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_set_drrs_state > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_enable > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_disable > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_invalidate > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_flush > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_drrs_init > + > + </sect2> > + <sect2> > <title>DPIO</title> > !Pdrivers/gpu/drm/i915/i915_reg.h DPIO > <table id="dpiox2"> > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > index 42195fe..eda90d6 100644 > --- a/drivers/gpu/drm/i915/intel_dp.c > +++ b/drivers/gpu/drm/i915/intel_dp.c > @@ -4745,6 +4745,18 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, > I915_READ(pp_div_reg)); > } > > +/** > + * intel_dp_set_drrs_state - program registers for RR switch to take effect > + * @dev: DRM device > + * @refresh_rate: RR to be programmed > + * > + * This function gets called when refresh rate (RR) has to be changed from > + * one frequency to another. Switches can be between high and low RR > + * supported by the panel or to any other RR based on media playback (in > + * this case, RR value needs to be passed from user space). > + * > + * The caller of this function needs to take a lock on dev_priv->drrs. > + */ > static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) > { > struct drm_i915_private *dev_priv = dev->dev_private; > @@ -4838,6 +4850,12 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) > DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate); > } > > +/** > + * intel_edp_drrs_enable - init drrs struct if supported > + * @intel_dp: DP struct > + * > + * Initializes frontbuffer_bits and drrs.dp > + */ > void intel_edp_drrs_enable(struct intel_dp *intel_dp) > { > struct drm_device *dev = intel_dp_to_dev(intel_dp); > @@ -4864,6 +4882,11 @@ void intel_edp_drrs_enable(struct intel_dp *intel_dp) > mutex_unlock(&dev_priv->drrs.mutex); > } > > +/** > + * intel_edp_drrs_disable - Disable DRRS > + * @intel_dp: DP struct > + * > + */ > void intel_edp_drrs_disable(struct intel_dp *intel_dp) > { > struct drm_device *dev = intel_dp_to_dev(intel_dp); > @@ -4921,6 +4944,17 @@ unlock: > mutex_unlock(&dev_priv->drrs.mutex); > } > > +/** > + * intel_edp_drrs_invalidate - Invalidate DRRS > + * @dev: DRM device > + * @frontbuffer_bits: frontbuffer plane tracking bits > + * > + * When there is a disturbance on screen (due to cursor movement/time > + * update etc), DRRS needs to be invalidated, i.e. need to switch to > + * high RR. > + * > + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. > + */ > void intel_edp_drrs_invalidate(struct drm_device *dev, > unsigned frontbuffer_bits) > { > @@ -4948,6 +4982,17 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, > mutex_unlock(&dev_priv->drrs.mutex); > } > > +/** > + * intel_edp_drrs_flush - Flush DRRS > + * @dev: DRM device > + * @frontbuffer_bits: frontbuffer plane tracking bits > + * > + * When there is no movement on screen, DRRS work can be scheduled. > + * This DRRS work is responsible for setting relevant registers after a > + * timeout of 1 second. > + * > + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. > + */ > void intel_edp_drrs_flush(struct drm_device *dev, > unsigned frontbuffer_bits) > { > @@ -4972,6 +5017,56 @@ void intel_edp_drrs_flush(struct drm_device *dev, > mutex_unlock(&dev_priv->drrs.mutex); > } > > +/** > + * DOC: Display Refresh Rate Switching (DRRS) > + * > + * Display Refresh Rate Switching (DRRS) is a power conservation feature > + * which enables swtching between low and high refresh rates, > + * dynamically, based on the usage scenario. This feature is applicable > + * for internal panels. > + * > + * Indication that the panel supports DRRS is given by the panel EDID, which > + * would list multiple refresh rates for one resolution. > + * > + * DRRS is of 2 types - static and seamless. > + * Static DRRS involves changing refresh rate (RR) by doing a full modeset > + * (may appear as a blink on screen) and is used in dock-undock scenario. > + * Seamless DRRS involves changing RR without any visual effect to the user > + * and can be used during normal system usage. This is done by programming > + * certain registers. > + * > + * Support for static/seamless DRRS may be indicated in the VBT based on > + * inputs from the panel spec. > + * > + * DRRS saves power by switching to low RR based on usage scenarios. > + * > + * eDP DRRS:- > + * The implementation is based on frontbuffer tracking implementation. > + * When there is a disturbance on the screen triggered by user activity or a > + * periodic system activity, DRRS is disabled (RR is changed to high RR). > + * When there is no movement on screen, after a timeout of 1 second, a switch > + * to low RR is made. > + * For integration with frontbuffer tracking code, > + * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called. > + * > + * DRRS can be further extended to support other internal panels and also > + * the scenario of video playback wherein RR is set based on the rate > + * requested by userspace. > + */ > + > +/** > + * intel_dp_drrs_init - Init basic DRRS work and mutex. > + * @intel_connector: eDP connector > + * @fixed_mode: preferred mode of panel > + * > + * This function is called only once at driver load to initialize basic > + * DRRS stuff. > + * > + * Returns: > + * Downclock mode if panel supports it, else return NULL. > + * DRRS support is determined by the presence of downclock mode (apart > + * from VBT setting). > + */ > static struct drm_display_mode * > intel_dp_drrs_init(struct intel_connector *intel_connector, > struct drm_display_mode *fixed_mode) > -- > 2.0.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Thu, Jan 15, 2015 at 03:16:35PM -0800, Rodrigo Vivi wrote: > Great! > > Although I'd prefer at intel_drrs.c.. ;) > > Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> > > On Fri, Jan 9, 2015 at 12:56 PM, Vandana Kannan > <vandana.kannan@intel.com> wrote: > > Adding an overview of DRRS in general and the implementation for eDP DRRS. > > Also, describing the functions related to eDP DRRS. > > > > Signed-off-by: Vandana Kannan <vandana.kannan@intel.com> > > --- > > Documentation/DocBook/drm.tmpl | 11 +++++ > > drivers/gpu/drm/i915/intel_dp.c | 95 +++++++++++++++++++++++++++++++++++++++++ > > 2 files changed, 106 insertions(+) > > > > diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl > > index 3b2571e..8c844b4 100644 > > --- a/Documentation/DocBook/drm.tmpl > > +++ b/Documentation/DocBook/drm.tmpl > > @@ -4042,6 +4042,17 @@ int num_ioctls;</synopsis> > > !Idrivers/gpu/drm/i915/intel_fbc.c > > </sect2> > > <sect2> > > + <title>Display Refresh Rate Switching (DRRS)</title> > > +!Pdrivers/gpu/drm/i915/intel_dp.c Display Refresh Rate Switching (DRRS) > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_set_drrs_state > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_enable > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_disable > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_invalidate > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_flush > > +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_drrs_init Yeah extracting intel_drrs.c would be better since then we could just slurp in everything from that file. But better to do that once the patches have all been merged. Wrt the series I've merged the first patch, for the others there seems to still be some review comments (and a bit of rebasing) pending. -Daniel > > + > > + </sect2> > > + <sect2> > > <title>DPIO</title> > > !Pdrivers/gpu/drm/i915/i915_reg.h DPIO > > <table id="dpiox2"> > > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c > > index 42195fe..eda90d6 100644 > > --- a/drivers/gpu/drm/i915/intel_dp.c > > +++ b/drivers/gpu/drm/i915/intel_dp.c > > @@ -4745,6 +4745,18 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, > > I915_READ(pp_div_reg)); > > } > > > > +/** > > + * intel_dp_set_drrs_state - program registers for RR switch to take effect > > + * @dev: DRM device > > + * @refresh_rate: RR to be programmed > > + * > > + * This function gets called when refresh rate (RR) has to be changed from > > + * one frequency to another. Switches can be between high and low RR > > + * supported by the panel or to any other RR based on media playback (in > > + * this case, RR value needs to be passed from user space). > > + * > > + * The caller of this function needs to take a lock on dev_priv->drrs. > > + */ > > static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) > > { > > struct drm_i915_private *dev_priv = dev->dev_private; > > @@ -4838,6 +4850,12 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) > > DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate); > > } > > > > +/** > > + * intel_edp_drrs_enable - init drrs struct if supported > > + * @intel_dp: DP struct > > + * > > + * Initializes frontbuffer_bits and drrs.dp > > + */ > > void intel_edp_drrs_enable(struct intel_dp *intel_dp) > > { > > struct drm_device *dev = intel_dp_to_dev(intel_dp); > > @@ -4864,6 +4882,11 @@ void intel_edp_drrs_enable(struct intel_dp *intel_dp) > > mutex_unlock(&dev_priv->drrs.mutex); > > } > > > > +/** > > + * intel_edp_drrs_disable - Disable DRRS > > + * @intel_dp: DP struct > > + * > > + */ > > void intel_edp_drrs_disable(struct intel_dp *intel_dp) > > { > > struct drm_device *dev = intel_dp_to_dev(intel_dp); > > @@ -4921,6 +4944,17 @@ unlock: > > mutex_unlock(&dev_priv->drrs.mutex); > > } > > > > +/** > > + * intel_edp_drrs_invalidate - Invalidate DRRS > > + * @dev: DRM device > > + * @frontbuffer_bits: frontbuffer plane tracking bits > > + * > > + * When there is a disturbance on screen (due to cursor movement/time > > + * update etc), DRRS needs to be invalidated, i.e. need to switch to > > + * high RR. > > + * > > + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. > > + */ > > void intel_edp_drrs_invalidate(struct drm_device *dev, > > unsigned frontbuffer_bits) > > { > > @@ -4948,6 +4982,17 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, > > mutex_unlock(&dev_priv->drrs.mutex); > > } > > > > +/** > > + * intel_edp_drrs_flush - Flush DRRS > > + * @dev: DRM device > > + * @frontbuffer_bits: frontbuffer plane tracking bits > > + * > > + * When there is no movement on screen, DRRS work can be scheduled. > > + * This DRRS work is responsible for setting relevant registers after a > > + * timeout of 1 second. > > + * > > + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. > > + */ > > void intel_edp_drrs_flush(struct drm_device *dev, > > unsigned frontbuffer_bits) > > { > > @@ -4972,6 +5017,56 @@ void intel_edp_drrs_flush(struct drm_device *dev, > > mutex_unlock(&dev_priv->drrs.mutex); > > } > > > > +/** > > + * DOC: Display Refresh Rate Switching (DRRS) > > + * > > + * Display Refresh Rate Switching (DRRS) is a power conservation feature > > + * which enables swtching between low and high refresh rates, > > + * dynamically, based on the usage scenario. This feature is applicable > > + * for internal panels. > > + * > > + * Indication that the panel supports DRRS is given by the panel EDID, which > > + * would list multiple refresh rates for one resolution. > > + * > > + * DRRS is of 2 types - static and seamless. > > + * Static DRRS involves changing refresh rate (RR) by doing a full modeset > > + * (may appear as a blink on screen) and is used in dock-undock scenario. > > + * Seamless DRRS involves changing RR without any visual effect to the user > > + * and can be used during normal system usage. This is done by programming > > + * certain registers. > > + * > > + * Support for static/seamless DRRS may be indicated in the VBT based on > > + * inputs from the panel spec. > > + * > > + * DRRS saves power by switching to low RR based on usage scenarios. > > + * > > + * eDP DRRS:- > > + * The implementation is based on frontbuffer tracking implementation. > > + * When there is a disturbance on the screen triggered by user activity or a > > + * periodic system activity, DRRS is disabled (RR is changed to high RR). > > + * When there is no movement on screen, after a timeout of 1 second, a switch > > + * to low RR is made. > > + * For integration with frontbuffer tracking code, > > + * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called. > > + * > > + * DRRS can be further extended to support other internal panels and also > > + * the scenario of video playback wherein RR is set based on the rate > > + * requested by userspace. > > + */ > > + > > +/** > > + * intel_dp_drrs_init - Init basic DRRS work and mutex. > > + * @intel_connector: eDP connector > > + * @fixed_mode: preferred mode of panel > > + * > > + * This function is called only once at driver load to initialize basic > > + * DRRS stuff. > > + * > > + * Returns: > > + * Downclock mode if panel supports it, else return NULL. > > + * DRRS support is determined by the presence of downclock mode (apart > > + * from VBT setting). > > + */ > > static struct drm_display_mode * > > intel_dp_drrs_init(struct intel_connector *intel_connector, > > struct drm_display_mode *fixed_mode) > > -- > > 2.0.1 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@lists.freedesktop.org > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > > > -- > Rodrigo Vivi > Blog: http://blog.vivi.eng.br > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl index 3b2571e..8c844b4 100644 --- a/Documentation/DocBook/drm.tmpl +++ b/Documentation/DocBook/drm.tmpl @@ -4042,6 +4042,17 @@ int num_ioctls;</synopsis> !Idrivers/gpu/drm/i915/intel_fbc.c </sect2> <sect2> + <title>Display Refresh Rate Switching (DRRS)</title> +!Pdrivers/gpu/drm/i915/intel_dp.c Display Refresh Rate Switching (DRRS) +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_set_drrs_state +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_enable +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_disable +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_invalidate +!Fdrivers/gpu/drm/i915/intel_dp.c intel_edp_drrs_flush +!Fdrivers/gpu/drm/i915/intel_dp.c intel_dp_drrs_init + + </sect2> + <sect2> <title>DPIO</title> !Pdrivers/gpu/drm/i915/i915_reg.h DPIO <table id="dpiox2"> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 42195fe..eda90d6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -4745,6 +4745,18 @@ intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, I915_READ(pp_div_reg)); } +/** + * intel_dp_set_drrs_state - program registers for RR switch to take effect + * @dev: DRM device + * @refresh_rate: RR to be programmed + * + * This function gets called when refresh rate (RR) has to be changed from + * one frequency to another. Switches can be between high and low RR + * supported by the panel or to any other RR based on media playback (in + * this case, RR value needs to be passed from user space). + * + * The caller of this function needs to take a lock on dev_priv->drrs. + */ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) { struct drm_i915_private *dev_priv = dev->dev_private; @@ -4838,6 +4850,12 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate) DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate); } +/** + * intel_edp_drrs_enable - init drrs struct if supported + * @intel_dp: DP struct + * + * Initializes frontbuffer_bits and drrs.dp + */ void intel_edp_drrs_enable(struct intel_dp *intel_dp) { struct drm_device *dev = intel_dp_to_dev(intel_dp); @@ -4864,6 +4882,11 @@ void intel_edp_drrs_enable(struct intel_dp *intel_dp) mutex_unlock(&dev_priv->drrs.mutex); } +/** + * intel_edp_drrs_disable - Disable DRRS + * @intel_dp: DP struct + * + */ void intel_edp_drrs_disable(struct intel_dp *intel_dp) { struct drm_device *dev = intel_dp_to_dev(intel_dp); @@ -4921,6 +4944,17 @@ unlock: mutex_unlock(&dev_priv->drrs.mutex); } +/** + * intel_edp_drrs_invalidate - Invalidate DRRS + * @dev: DRM device + * @frontbuffer_bits: frontbuffer plane tracking bits + * + * When there is a disturbance on screen (due to cursor movement/time + * update etc), DRRS needs to be invalidated, i.e. need to switch to + * high RR. + * + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. + */ void intel_edp_drrs_invalidate(struct drm_device *dev, unsigned frontbuffer_bits) { @@ -4948,6 +4982,17 @@ void intel_edp_drrs_invalidate(struct drm_device *dev, mutex_unlock(&dev_priv->drrs.mutex); } +/** + * intel_edp_drrs_flush - Flush DRRS + * @dev: DRM device + * @frontbuffer_bits: frontbuffer plane tracking bits + * + * When there is no movement on screen, DRRS work can be scheduled. + * This DRRS work is responsible for setting relevant registers after a + * timeout of 1 second. + * + * Dirty frontbuffers relevant to DRRS are tracked in busy_frontbuffer_bits. + */ void intel_edp_drrs_flush(struct drm_device *dev, unsigned frontbuffer_bits) { @@ -4972,6 +5017,56 @@ void intel_edp_drrs_flush(struct drm_device *dev, mutex_unlock(&dev_priv->drrs.mutex); } +/** + * DOC: Display Refresh Rate Switching (DRRS) + * + * Display Refresh Rate Switching (DRRS) is a power conservation feature + * which enables swtching between low and high refresh rates, + * dynamically, based on the usage scenario. This feature is applicable + * for internal panels. + * + * Indication that the panel supports DRRS is given by the panel EDID, which + * would list multiple refresh rates for one resolution. + * + * DRRS is of 2 types - static and seamless. + * Static DRRS involves changing refresh rate (RR) by doing a full modeset + * (may appear as a blink on screen) and is used in dock-undock scenario. + * Seamless DRRS involves changing RR without any visual effect to the user + * and can be used during normal system usage. This is done by programming + * certain registers. + * + * Support for static/seamless DRRS may be indicated in the VBT based on + * inputs from the panel spec. + * + * DRRS saves power by switching to low RR based on usage scenarios. + * + * eDP DRRS:- + * The implementation is based on frontbuffer tracking implementation. + * When there is a disturbance on the screen triggered by user activity or a + * periodic system activity, DRRS is disabled (RR is changed to high RR). + * When there is no movement on screen, after a timeout of 1 second, a switch + * to low RR is made. + * For integration with frontbuffer tracking code, + * intel_edp_drrs_invalidate() and intel_edp_drrs_flush() are called. + * + * DRRS can be further extended to support other internal panels and also + * the scenario of video playback wherein RR is set based on the rate + * requested by userspace. + */ + +/** + * intel_dp_drrs_init - Init basic DRRS work and mutex. + * @intel_connector: eDP connector + * @fixed_mode: preferred mode of panel + * + * This function is called only once at driver load to initialize basic + * DRRS stuff. + * + * Returns: + * Downclock mode if panel supports it, else return NULL. + * DRRS support is determined by the presence of downclock mode (apart + * from VBT setting). + */ static struct drm_display_mode * intel_dp_drrs_init(struct intel_connector *intel_connector, struct drm_display_mode *fixed_mode)
Adding an overview of DRRS in general and the implementation for eDP DRRS. Also, describing the functions related to eDP DRRS. Signed-off-by: Vandana Kannan <vandana.kannan@intel.com> --- Documentation/DocBook/drm.tmpl | 11 +++++ drivers/gpu/drm/i915/intel_dp.c | 95 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+)