From 3798332841a5f4440f01d9d04ba767e31bc427ce Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sun, 28 Jun 2015 21:27:31 +0100 Subject: [PATCH] atomic rant --- drivers/gpu/drm/drm_atomic_helper.c | 2 +- drivers/gpu/drm/drm_crtc_helper.c | 3 ++- drivers/gpu/drm/drm_fb_helper.c | 9 +++++---- drivers/gpu/drm/i915/intel_display.c | 22 +++++++++------------- drivers/gpu/drm/i915/intel_dp_mst.c | 5 +++-- drivers/gpu/drm/i915/intel_drv.h | 3 ++- include/drm/drm_crtc_helper.h | 3 ++- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 0898afb..8d9bf2c 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -196,7 +196,7 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx) } funcs = connector->helper_private; - new_encoder = funcs->best_encoder(connector); + new_encoder = funcs->best_encoder(connector, connector_state->crtc); if (!new_encoder) { DRM_DEBUG_ATOMIC("No suitable encoder found for [CONNECTOR:%d:%s]\n", diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c index 393114d..be32e84 100644 --- a/drivers/gpu/drm/drm_crtc_helper.c +++ b/drivers/gpu/drm/drm_crtc_helper.c @@ -568,7 +568,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) new_encoder = connector->encoder; for (ro = 0; ro < set->num_connectors; ro++) { if (set->connectors[ro] == connector) { - new_encoder = connector_funcs->best_encoder(connector); + new_encoder = connector_funcs->best_encoder(connector, + set->crtc); /* if we can't get an encoder for a connector we are setting now - then fail */ if (new_encoder == NULL) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index cac4229..0d466c9 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -1582,15 +1582,17 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, my_score++; connector_funcs = connector->helper_private; - encoder = connector_funcs->best_encoder(connector); - if (!encoder) - goto out; /* select a crtc for this connector and then attempt to configure remaining connectors */ for (c = 0; c < fb_helper->crtc_count; c++) { crtc = &fb_helper->crtc_info[c]; + encoder = connector_funcs->best_encoder(connector, + crtc->mode_set.crtc); + if (!encoder) + continue; + if ((encoder->possible_crtcs & (1 << c)) == 0) continue; @@ -1618,7 +1620,6 @@ static int drm_pick_crtcs(struct drm_fb_helper *fb_helper, sizeof(struct drm_fb_helper_crtc *)); } } -out: kfree(crtcs); return best_score; } diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 281adb6..892d2a0 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -110,14 +110,6 @@ static void skl_init_scalers(struct drm_device *dev, struct intel_crtc *intel_cr static int i9xx_get_refclk(const struct intel_crtc_state *crtc_state, int num_connectors); -static struct intel_encoder *intel_find_encoder(struct intel_connector *connector, int pipe) -{ - if (!connector->mst_port) - return connector->encoder; - else - return &connector->mst_port->mst_encoders[pipe]->base; -} - typedef struct { int min, max; } intel_range_t; @@ -13267,10 +13259,13 @@ intel_modeset_stage_output_state(struct drm_device *dev, if (IS_ERR(connector_state)) return PTR_ERR(connector_state); - if (in_mode_set) { - int pipe = to_intel_crtc(set->crtc)->pipe; - connector_state->best_encoder = - &intel_find_encoder(connector, pipe)->base; + if (in_mode_set && set->crtc) { + connector_state->best_encoder = connector->base.encoder; + if (connector_state->best_encoder == NULL) { + const struct drm_connector_helper_funcs *funcs = connector->base.helper_private; + connector_state->best_encoder = + funcs->best_encoder(&connector->base, set->crtc); + } } if (connector->base.state->crtc != set->crtc) @@ -15593,7 +15588,8 @@ void intel_modeset_cleanup(struct drm_device *dev) /* * Return which encoder is currently attached for connector. */ -struct drm_encoder *intel_best_encoder(struct drm_connector *connector) +struct drm_encoder *intel_best_encoder(struct drm_connector *connector, + struct drm_crtc *crtc) { return &intel_attached_encoder(connector)->base; } diff --git a/drivers/gpu/drm/i915/intel_dp_mst.c b/drivers/gpu/drm/i915/intel_dp_mst.c index 6e4cc53..905cd09 100644 --- a/drivers/gpu/drm/i915/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/intel_dp_mst.c @@ -357,11 +357,12 @@ intel_dp_mst_mode_valid(struct drm_connector *connector, return MODE_OK; } -static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector) +static struct drm_encoder *intel_mst_best_encoder(struct drm_connector *connector, + struct drm_crtc *crtc) { struct intel_connector *intel_connector = to_intel_connector(connector); struct intel_dp *intel_dp = intel_connector->mst_port; - return &intel_dp->mst_encoders[0]->base.base; + return &intel_dp->mst_encoders[to_intel_crtc(crtc)->pipe]->base.base; } static const struct drm_connector_helper_funcs intel_dp_mst_connector_helper_funcs = { diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 7fe7752..9d40aa0 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1023,7 +1023,8 @@ bool ibx_digital_port_connected(struct drm_i915_private *dev_priv, struct intel_digital_port *port); void intel_connector_attach_encoder(struct intel_connector *connector, struct intel_encoder *encoder); -struct drm_encoder *intel_best_encoder(struct drm_connector *connector); +struct drm_encoder *intel_best_encoder(struct drm_connector *connector, + struct drm_crtc *crtc); struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, struct drm_crtc *crtc); enum pipe intel_get_pipe_from_connector(struct intel_connector *connector); diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index c8fc187..51b12b1 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h @@ -175,7 +175,8 @@ struct drm_connector_helper_funcs { int (*get_modes)(struct drm_connector *connector); enum drm_mode_status (*mode_valid)(struct drm_connector *connector, struct drm_display_mode *mode); - struct drm_encoder *(*best_encoder)(struct drm_connector *connector); + struct drm_encoder *(*best_encoder)(struct drm_connector *connector, + struct drm_crtc *crtc); }; extern void drm_helper_disable_unused_functions(struct drm_device *dev); -- 1.9.1