[Intel-gfx] [PATCH 2/4] drm/i915: Adding Panel Filter function for DP

Zhang, Xiong Y xiong.y.zhang at intel.com
Thu Aug 13 22:12:57 PDT 2015


> On Mon, Aug 10, 2015 at 03:26:09PM +0800, Xiong Zhang wrote:
> > Only internal eDP, LVDS, DVI screen could set scalling mode, some
> > customers need to set scalling mode for external DP, HDMI, VGA screen.
> > Let's fulfill this.
> >
> > bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=90989
> >
> > Signed-off-by: Xiong Zhang <xiong.y.zhang at intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_dp.c | 63
> > ++++++++++++++++++++++++++++-------------
> >  1 file changed, 44 insertions(+), 19 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_dp.c
> > b/drivers/gpu/drm/i915/intel_dp.c index f1b9f93..2da334b 100644
> > --- a/drivers/gpu/drm/i915/intel_dp.c
> > +++ b/drivers/gpu/drm/i915/intel_dp.c
> > @@ -207,7 +207,13 @@ intel_dp_mode_valid(struct drm_connector
> *connector,
> >  	int target_clock = mode->clock;
> >  	int max_rate, mode_rate, max_lanes, max_link_clock;
> >
> > -	if (is_edp(intel_dp) && fixed_mode) {
> > +	if (mode->clock < 10000)
> > +		return MODE_CLOCK_LOW;
> > +
> > +	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
> > +		return MODE_H_ILLEGAL;
> > +
> > +	if (!intel_panel_scale_none(&intel_connector->panel)) {
> >  		if (mode->hdisplay > fixed_mode->hdisplay)
> >  			return MODE_PANEL;
> >
> > @@ -226,12 +232,6 @@ intel_dp_mode_valid(struct drm_connector
> *connector,
> >  	if (mode_rate > max_rate)
> >  		return MODE_CLOCK_HIGH;
> >
> > -	if (mode->clock < 10000)
> > -		return MODE_CLOCK_LOW;
> > -
> > -	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
> > -		return MODE_H_ILLEGAL;
> > -
> >  	return MODE_OK;
> >  }
> >
> > @@ -1378,7 +1378,7 @@ intel_dp_compute_config(struct intel_encoder
> *encoder,
> >  	pipe_config->has_drrs = false;
> >  	pipe_config->has_audio = intel_dp->has_audio && port != PORT_A;
> >
> > -	if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
> > +	if (!intel_panel_scale_none(&intel_connector->panel)) {
> >  		intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
> >  				       adjusted_mode);
> >
> > @@ -4592,6 +4592,23 @@ static int intel_dp_get_modes(struct
> drm_connector *connector)
> >  	edid = intel_connector->detect_edid;
> >  	if (edid) {
> >  		int ret = intel_connector_update_modes(connector, edid);
> > +
> > +		if (ret && intel_connector->panel.fixed_mode == NULL) {
> > +			/* init fixed mode as preferred mode for DP */
> > +			struct drm_display_mode *fixed_mode = NULL;
> > +			struct drm_display_mode *scan;
> > +
> > +			list_for_each_entry(scan, &connector->probed_modes, head) {
> > +				if (scan->type & DRM_MODE_TYPE_PREFERRED)
> > +					fixed_mode = drm_mode_duplicate(connector->dev,
> > +									scan);
> > +			}
> > +
> > +			if (fixed_mode)
> > +				intel_panel_init(&intel_connector->panel,
> > +						 fixed_mode, NULL);
> > +		}
> 
> How are we supposed to get rid of a stale fixed_mode when some other
> display gets plugged in?
[Zhang, Xiong Y] Thanks so much for your good question. Yes, we should clear the
stale fitting_mode and fixed_mode when display is disconnect in 
intel_dp_hpd_pulse() function.
> 
> Also what would happen if the preferred mode can't be supported due to some
> source limitation?
[Zhang, Xiong Y] In this case, which mode should be selected as fixed_mode ?
As you said maybe kernel isn't the right place to do such decision.
> 
> In general I'm not entirely happy with having this kind of policy in the kernel.
> I'd much prefer if we could get crtc size and border properties done so that
> userspace could set up the scaling any which way it chooses.
[Zhang, Xiong Y] Could you give more detail about your preference ?

thanks


More information about the Intel-gfx mailing list