... and so remove the confusion as to whether to use the returned crtc
or intel_encoder->base.crtc with the subsequent load-detection. Even
though they were the same, the two instances of load-detection code
disagreed over which was the more correct.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/intel_crt.c     |   17 +++++++----------
 drivers/gpu/drm/i915/intel_display.c |   22 ++++++++++++++--------
 drivers/gpu/drm/i915/intel_drv.h     |    8 ++++----
 drivers/gpu/drm/i915/intel_tv.c      |    6 ++----
 4 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index d03fc05..2eb60cd 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -305,13 +305,11 @@ static bool intel_crt_detect_ddc(struct drm_connector 
*connector)
 }
 
 static enum drm_connector_status
-intel_crt_load_detect(struct drm_crtc *crtc, struct intel_crt *crt)
+intel_crt_load_detect(struct intel_crt *crt)
 {
-       struct drm_encoder *encoder = &crt->base.base;
-       struct drm_device *dev = encoder->dev;
+       struct drm_device *dev = crt->base.base.dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       uint32_t pipe = intel_crtc->pipe;
+       uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe;
        uint32_t save_bclrpat;
        uint32_t save_vtotal;
        uint32_t vtotal, vactive;
@@ -454,15 +452,14 @@ intel_crt_detect(struct drm_connector *connector, bool 
force)
        /* for pre-945g platforms use load detect */
        crtc = crt->base.base.crtc;
        if (crtc && crtc->enabled) {
-               status = intel_crt_load_detect(crtc, crt);
+               status = intel_crt_load_detect(crt);
        } else {
-               crtc = intel_get_load_detect_pipe(&crt->base, connector,
-                                                 NULL, &dpms_mode);
-               if (crtc) {
+               if (intel_get_load_detect_pipe(&crt->base, connector,
+                                              NULL, &dpms_mode)) {
                        if (intel_crt_detect_ddc(connector))
                                status = connector_status_connected;
                        else
-                               status = intel_crt_load_detect(crtc, crt);
+                               status = intel_crt_load_detect(crt);
                        intel_release_load_detect_pipe(&crt->base,
                                                       connector, dpms_mode);
                } else
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index e6df160..92e2f14 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5539,10 +5539,10 @@ static struct drm_display_mode load_detect_mode = {
                 704, 832, 0, 480, 489, 491, 520, 0, DRM_MODE_FLAG_NHSYNC | 
DRM_MODE_FLAG_NVSYNC),
 };
 
-struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder 
*intel_encoder,
-                                           struct drm_connector *connector,
-                                           struct drm_display_mode *mode,
-                                           int *dpms_mode)
+bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
+                               struct drm_connector *connector,
+                               struct drm_display_mode *mode,
+                               int *dpms_mode)
 {
        struct intel_crtc *intel_crtc;
        struct drm_crtc *possible_crtc;
@@ -5575,7 +5575,7 @@ struct drm_crtc *intel_get_load_detect_pipe(struct 
intel_encoder *intel_encoder,
                        crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON);
                        encoder_funcs->dpms(encoder, DRM_MODE_DPMS_ON);
                }
-               return crtc;
+               return true;
        }
 
        /* Find an unused one (if possible) */
@@ -5595,7 +5595,8 @@ struct drm_crtc *intel_get_load_detect_pipe(struct 
intel_encoder *intel_encoder,
         * If we didn't find an unused CRTC, don't use any.
         */
        if (!crtc) {
-               return NULL;
+               DRM_DEBUG_KMS("no pipe available for load-detect\n");
+               return false;
        }
 
        encoder->crtc = crtc;
@@ -5608,7 +5609,11 @@ struct drm_crtc *intel_get_load_detect_pipe(struct 
intel_encoder *intel_encoder,
        if (!crtc->enabled) {
                if (!mode)
                        mode = &load_detect_mode;
-               drm_crtc_helper_set_mode(crtc, mode, 0, 0, crtc->fb);
+
+               if (!drm_crtc_helper_set_mode(crtc, mode, 0, 0, crtc->fb)) {
+                       DRM_DEBUG_KMS("failed to set mode on load-detect 
pipe\n");
+                       return false;
+               }
        } else {
                if (intel_crtc->dpms_mode != DRM_MODE_DPMS_ON) {
                        crtc_funcs = crtc->helper_private;
@@ -5619,10 +5624,11 @@ struct drm_crtc *intel_get_load_detect_pipe(struct 
intel_encoder *intel_encoder,
                encoder_funcs->mode_set(encoder, &crtc->mode, &crtc->mode);
                encoder_funcs->commit(encoder);
        }
+
        /* let the connector get through one full cycle before testing */
        intel_wait_for_vblank(dev, intel_crtc->pipe);
 
-       return crtc;
+       return true;
 }
 
 void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index aeb1b98..7ea4bab 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -298,10 +298,10 @@ static inline void intel_wait_for_crtc_vblank_safe(struct 
drm_crtc *crtc)
                msleep(50);
 }
 extern void intel_wait_for_pipe_off(struct drm_device *dev, int pipe);
-extern struct drm_crtc *intel_get_load_detect_pipe(struct intel_encoder 
*intel_encoder,
-                                                  struct drm_connector 
*connector,
-                                                  struct drm_display_mode 
*mode,
-                                                  int *dpms_mode);
+extern bool intel_get_load_detect_pipe(struct intel_encoder *intel_encoder,
+                                      struct drm_connector *connector,
+                                      struct drm_display_mode *mode,
+                                      int *dpms_mode);
 extern void intel_release_load_detect_pipe(struct intel_encoder *intel_encoder,
                                           struct drm_connector *connector,
                                           int dpms_mode);
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index 3047a66..1174f77 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1370,12 +1370,10 @@ intel_tv_detect(struct drm_connector *connector, bool 
force)
        if (intel_tv->base.base.crtc && intel_tv->base.base.crtc->enabled) {
                type = intel_tv_detect_type(intel_tv, connector);
        } else if (force) {
-               struct drm_crtc *crtc;
                int dpms_mode;
 
-               crtc = intel_get_load_detect_pipe(&intel_tv->base, connector,
-                                                 &mode, &dpms_mode);
-               if (crtc) {
+               if (intel_get_load_detect_pipe(&intel_tv->base, connector,
+                                              &mode, &dpms_mode)) {
                        type = intel_tv_detect_type(intel_tv, connector);
                        intel_release_load_detect_pipe(&intel_tv->base, 
connector,
                                                       dpms_mode);
-- 
1.7.4.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to