drm/i915: introduce for_each_encoder_on_crtc
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 5 Jul 2012 07:50:24 +0000 (09:50 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 5 Jul 2012 13:06:33 +0000 (15:06 +0200)
We already have this pattern at quite a few places, and moving part of
the modeset helper stuff into the driver will add more.

v2: Don't clobber the crtc struct name with the macro parameter ...

v3: Convert two more places noticed by Paulo Zanoni.

Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_tv.c

index 6c3a0bb..476c64c 100644 (file)
@@ -79,6 +79,10 @@ enum port {
 
 #define for_each_pipe(p) for ((p) = 0; (p) < dev_priv->num_pipe; (p)++)
 
+#define for_each_encoder_on_crtc(dev, __crtc, intel_encoder) \
+       list_for_each_entry((intel_encoder), &(dev)->mode_config.encoder_list, base.head) \
+               if ((intel_encoder)->base.crtc == (__crtc))
+
 struct intel_pch_pll {
        int refcount; /* count of number of CRTCs sharing this PLL */
        int active; /* count of number of active CRTCs (i.e. DPMS on) */
index ca1068b..0972f49 100644 (file)
@@ -627,11 +627,10 @@ static void intel_clock(struct drm_device *dev, int refclk, intel_clock_t *clock
 bool intel_pipe_has_type(struct drm_crtc *crtc, int type)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_mode_config *mode_config = &dev->mode_config;
        struct intel_encoder *encoder;
 
-       list_for_each_entry(encoder, &mode_config->encoder_list, base.head)
-               if (encoder->base.crtc == crtc && encoder->type == type)
+       for_each_encoder_on_crtc(dev, crtc, encoder)
+               if (encoder->type == type)
                        return true;
 
        return false;
@@ -2836,16 +2835,13 @@ static void intel_crtc_wait_for_pending_flips(struct drm_crtc *crtc)
 static bool intel_crtc_driving_pch(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_mode_config *mode_config = &dev->mode_config;
        struct intel_encoder *encoder;
 
        /*
         * If there's a non-PCH eDP on this crtc, it must be DP_A, and that
         * must be driven by its own crtc; no sharing is possible.
         */
-       list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
-               if (encoder->base.crtc != crtc)
-                       continue;
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
 
                /* On Haswell, LPT PCH handles the VGA connection via FDI, and Haswell
                 * CPU handles all others */
@@ -3734,16 +3730,12 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
 {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct drm_encoder *encoder;
        struct drm_connector *connector;
+       struct intel_encoder *intel_encoder;
        unsigned int display_bpc = UINT_MAX, bpc;
 
        /* Walk the encoders & connectors on this crtc, get min bpc */
-       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-               struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
-
-               if (encoder->crtc != crtc)
-                       continue;
+       for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
 
                if (intel_encoder->type == INTEL_OUTPUT_LVDS) {
                        unsigned int lvds_bpc;
@@ -3775,7 +3767,7 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
                /* Not one of the known troublemakers, check the EDID */
                list_for_each_entry(connector, &dev->mode_config.connector_list,
                                    head) {
-                       if (connector->encoder != encoder)
+                       if (connector->encoder != &intel_encoder->base)
                                continue;
 
                        /* Don't use an invalid EDID bpc value */
@@ -4244,15 +4236,11 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
        u32 dspcntr, pipeconf, vsyncshift;
        bool ok, has_reduced_clock = false, is_sdvo = false;
        bool is_lvds = false, is_tv = false, is_dp = false;
-       struct drm_mode_config *mode_config = &dev->mode_config;
        struct intel_encoder *encoder;
        const intel_limit_t *limit;
        int ret;
 
-       list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
-               if (encoder->base.crtc != crtc)
-                       continue;
-
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
                switch (encoder->type) {
                case INTEL_OUTPUT_LVDS:
                        is_lvds = true;
@@ -4555,15 +4543,11 @@ static int ironlake_get_refclk(struct drm_crtc *crtc)
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_encoder *encoder;
-       struct drm_mode_config *mode_config = &dev->mode_config;
        struct intel_encoder *edp_encoder = NULL;
        int num_connectors = 0;
        bool is_lvds = false;
 
-       list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
-               if (encoder->base.crtc != crtc)
-                       continue;
-
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
                switch (encoder->type) {
                case INTEL_OUTPUT_LVDS:
                        is_lvds = true;
@@ -4600,7 +4584,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
        u32 dpll, fp = 0, fp2 = 0, dspcntr, pipeconf;
        bool ok, has_reduced_clock = false, is_sdvo = false;
        bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
-       struct drm_mode_config *mode_config = &dev->mode_config;
        struct intel_encoder *encoder, *edp_encoder = NULL;
        const intel_limit_t *limit;
        int ret;
@@ -4611,10 +4594,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
        bool dither;
        bool is_cpu_edp = false, is_pch_edp = false;
 
-       list_for_each_entry(encoder, &mode_config->encoder_list, base.head) {
-               if (encoder->base.crtc != crtc)
-                       continue;
-
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
                switch (encoder->type) {
                case INTEL_OUTPUT_LVDS:
                        is_lvds = true;
index 611080b..95817c4 100644 (file)
@@ -793,8 +793,7 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
                 struct drm_display_mode *adjusted_mode)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_mode_config *mode_config = &dev->mode_config;
-       struct drm_encoder *encoder;
+       struct intel_encoder *encoder;
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int lane_count = 4;
@@ -804,13 +803,9 @@ intel_dp_set_m_n(struct drm_crtc *crtc, struct drm_display_mode *mode,
        /*
         * Find the lane count in the intel_encoder private
         */
-       list_for_each_entry(encoder, &mode_config->encoder_list, head) {
-               struct intel_dp *intel_dp;
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
+               struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 
-               if (encoder->crtc != crtc)
-                       continue;
-
-               intel_dp = enc_to_intel_dp(encoder);
                if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT ||
                    intel_dp->base.type == INTEL_OUTPUT_EDP)
                {
@@ -2404,16 +2399,11 @@ int
 intel_trans_dp_port_sel(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
-       struct drm_mode_config *mode_config = &dev->mode_config;
-       struct drm_encoder *encoder;
+       struct intel_encoder *encoder;
 
-       list_for_each_entry(encoder, &mode_config->encoder_list, head) {
-               struct intel_dp *intel_dp;
-
-               if (encoder->crtc != crtc)
-                       continue;
+       for_each_encoder_on_crtc(dev, crtc, encoder) {
+               struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 
-               intel_dp = enc_to_intel_dp(encoder);
                if (intel_dp->base.type == INTEL_OUTPUT_DISPLAYPORT ||
                    intel_dp->base.type == INTEL_OUTPUT_EDP)
                        return intel_dp->output_reg;
index 05fcadb..9b706a5 100644 (file)
@@ -236,7 +236,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
        struct intel_lvds *intel_lvds = to_intel_lvds(encoder);
-       struct drm_encoder *tmp_encoder;
+       struct intel_encoder *tmp_encoder;
        u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
        int pipe;
 
@@ -247,8 +247,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
        }
 
        /* Should never happen!! */
-       list_for_each_entry(tmp_encoder, &dev->mode_config.encoder_list, head) {
-               if (tmp_encoder != encoder && tmp_encoder->crtc == encoder->crtc) {
+       for_each_encoder_on_crtc(dev, encoder->crtc, tmp_encoder) {
+               if (&tmp_encoder->base != encoder) {
                        DRM_ERROR("Can't enable LVDS and another "
                               "encoder on the same pipe\n");
                        return false;
index a233a51..3b413c9 100644 (file)
@@ -895,20 +895,16 @@ intel_tv_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
                    struct drm_display_mode *adjusted_mode)
 {
        struct drm_device *dev = encoder->dev;
-       struct drm_mode_config *drm_config = &dev->mode_config;
        struct intel_tv *intel_tv = enc_to_intel_tv(encoder);
        const struct tv_mode *tv_mode = intel_tv_mode_find(intel_tv);
-       struct drm_encoder *other_encoder;
+       struct intel_encoder *other_encoder;
 
        if (!tv_mode)
                return false;
 
-       /* FIXME: lock encoder list */
-       list_for_each_entry(other_encoder, &drm_config->encoder_list, head) {
-               if (other_encoder != encoder &&
-                   other_encoder->crtc == encoder->crtc)
+       for_each_encoder_on_crtc(dev, encoder->crtc, other_encoder)
+               if (&other_encoder->base != encoder)
                        return false;
-       }
 
        adjusted_mode->clock = tv_mode->clock;
        return true;