drm/atomic: Add for_each_{connector,crtc,plane}_in_state helper macros
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Fri, 10 Apr 2015 11:58:39 +0000 (14:58 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sat, 11 Apr 2015 16:50:22 +0000 (18:50 +0200)
This saves some typing whenever a iteration over all the connector,
crtc or plane states in the atomic state is written, which happens
quite often.

Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/drm_atomic.c
drivers/gpu/drm/drm_atomic_helper.c
include/drm/drm_atomic.h

index 0537f327b14542dc654803a1190349e7f7f39a2b..6e3b78ee7d16b824e67421446b407d064fd77be8 100644 (file)
@@ -909,14 +909,13 @@ int
 drm_atomic_connectors_for_crtc(struct drm_atomic_state *state,
                               struct drm_crtc *crtc)
 {
-       int i, num_connected_connectors = 0;
-
-       for (i = 0; i < state->num_connector; i++) {
-               struct drm_connector_state *conn_state;
+       struct drm_connector *connector;
+       struct drm_connector_state *conn_state;
 
-               conn_state = state->connector_states[i];
+       int i, num_connected_connectors = 0;
 
-               if (conn_state && conn_state->crtc == crtc)
+       for_each_connector_in_state(state, connector, conn_state, i) {
+               if (conn_state->crtc == crtc)
                        num_connected_connectors++;
        }
 
@@ -968,19 +967,16 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
 {
        struct drm_device *dev = state->dev;
        struct drm_mode_config *config = &dev->mode_config;
-       int nplanes = config->num_total_plane;
-       int ncrtcs = config->num_crtc;
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *crtc_state;
        int i, ret = 0;
 
        DRM_DEBUG_ATOMIC("checking %p\n", state);
 
-       for (i = 0; i < nplanes; i++) {
-               struct drm_plane *plane = state->planes[i];
-
-               if (!plane)
-                       continue;
-
-               ret = drm_atomic_plane_check(plane, state->plane_states[i]);
+       for_each_plane_in_state(state, plane, plane_state, i) {
+               ret = drm_atomic_plane_check(plane, plane_state);
                if (ret) {
                        DRM_DEBUG_ATOMIC("[PLANE:%d] atomic core check failed\n",
                                         plane->base.id);
@@ -988,13 +984,8 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
                }
        }
 
-       for (i = 0; i < ncrtcs; i++) {
-               struct drm_crtc *crtc = state->crtcs[i];
-
-               if (!crtc)
-                       continue;
-
-               ret = drm_atomic_crtc_check(crtc, state->crtc_states[i]);
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+               ret = drm_atomic_crtc_check(crtc, crtc_state);
                if (ret) {
                        DRM_DEBUG_ATOMIC("[CRTC:%d] atomic core check failed\n",
                                         crtc->base.id);
@@ -1006,13 +997,7 @@ int drm_atomic_check_only(struct drm_atomic_state *state)
                ret = config->funcs->atomic_check(state->dev, state);
 
        if (!state->allow_modeset) {
-               for (i = 0; i < ncrtcs; i++) {
-                       struct drm_crtc *crtc = state->crtcs[i];
-                       struct drm_crtc_state *crtc_state = state->crtc_states[i];
-
-                       if (!crtc)
-                               continue;
-
+               for_each_crtc_in_state(state, crtc, crtc_state, i) {
                        if (crtc_state->mode_changed ||
                            crtc_state->active_changed) {
                                DRM_DEBUG_ATOMIC("[CRTC:%d] requires full modeset\n",
@@ -1210,6 +1195,8 @@ int drm_mode_atomic_ioctl(struct drm_device *dev,
        struct drm_atomic_state *state;
        struct drm_modeset_acquire_ctx ctx;
        struct drm_plane *plane;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *crtc_state;
        unsigned plane_mask = 0;
        int ret = 0;
        unsigned int i, j;
@@ -1313,15 +1300,9 @@ retry:
        }
 
        if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
-               int ncrtcs = dev->mode_config.num_crtc;
-
-               for (i = 0; i < ncrtcs; i++) {
-                       struct drm_crtc_state *crtc_state = state->crtc_states[i];
+               for_each_crtc_in_state(state, crtc, crtc_state, i) {
                        struct drm_pending_vblank_event *e;
 
-                       if (!crtc_state)
-                               continue;
-
                        e = create_vblank_event(dev, file_priv, arg->user_data);
                        if (!e) {
                                ret = -ENOMEM;
@@ -1373,14 +1354,7 @@ fail:
                goto backoff;
 
        if (arg->flags & DRM_MODE_PAGE_FLIP_EVENT) {
-               int ncrtcs = dev->mode_config.num_crtc;
-
-               for (i = 0; i < ncrtcs; i++) {
-                       struct drm_crtc_state *crtc_state = state->crtc_states[i];
-
-                       if (!crtc_state)
-                               continue;
-
+               for_each_crtc_in_state(state, crtc, crtc_state, i) {
                        destroy_vblank_event(dev, file_priv, crtc_state->event);
                        crtc_state->event = NULL;
                }
index e67d4d69faf7473686eb20336e1daba4a0c39a43..a2fb0d45217ad3f98ccabf6653d51212dee09112 100644 (file)
@@ -248,30 +248,24 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx)
 static int
 mode_fixup(struct drm_atomic_state *state)
 {
-       int ncrtcs = state->dev->mode_config.num_crtc;
+       struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
+       struct drm_connector *connector;
        struct drm_connector_state *conn_state;
        int i;
        bool ret;
 
-       for (i = 0; i < ncrtcs; i++) {
-               crtc_state = state->crtc_states[i];
-
-               if (!crtc_state || !crtc_state->mode_changed)
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+               if (!crtc_state->mode_changed)
                        continue;
 
                drm_mode_copy(&crtc_state->adjusted_mode, &crtc_state->mode);
        }
 
-       for (i = 0; i < state->num_connector; i++) {
+       for_each_connector_in_state(state, connector, conn_state, i) {
                const struct drm_encoder_helper_funcs *funcs;
                struct drm_encoder *encoder;
 
-               conn_state = state->connector_states[i];
-
-               if (!conn_state)
-                       continue;
-
                WARN_ON(!!conn_state->best_encoder != !!conn_state->crtc);
 
                if (!conn_state->crtc || !conn_state->best_encoder)
@@ -316,14 +310,10 @@ mode_fixup(struct drm_atomic_state *state)
                }
        }
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc;
 
-               crtc_state = state->crtc_states[i];
-               crtc = state->crtcs[i];
-
-               if (!crtc_state || !crtc_state->mode_changed)
+               if (!crtc_state->mode_changed)
                        continue;
 
                funcs = crtc->helper_private;
@@ -371,18 +361,13 @@ int
 drm_atomic_helper_check_modeset(struct drm_device *dev,
                                struct drm_atomic_state *state)
 {
-       int ncrtcs = dev->mode_config.num_crtc;
        struct drm_crtc *crtc;
        struct drm_crtc_state *crtc_state;
+       struct drm_connector *connector;
+       struct drm_connector_state *connector_state;
        int i, ret;
 
-       for (i = 0; i < ncrtcs; i++) {
-               crtc = state->crtcs[i];
-               crtc_state = state->crtc_states[i];
-
-               if (!crtc)
-                       continue;
-
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                if (!drm_mode_equal(&crtc->state->mode, &crtc_state->mode)) {
                        DRM_DEBUG_ATOMIC("[CRTC:%d] mode changed\n",
                                         crtc->base.id);
@@ -396,7 +381,7 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
                }
        }
 
-       for (i = 0; i < state->num_connector; i++) {
+       for_each_connector_in_state(state, connector, connector_state, i) {
                /*
                 * This only sets crtc->mode_changed for routing changes,
                 * drivers must set crtc->mode_changed themselves when connector
@@ -413,15 +398,9 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
         * configuration. This must be done before calling mode_fixup in case a
         * crtc only changed its mode but has the same set of connectors.
         */
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                int num_connectors;
 
-               crtc = state->crtcs[i];
-               crtc_state = state->crtc_states[i];
-
-               if (!crtc)
-                       continue;
-
                /*
                 * We must set ->active_changed after walking connectors for
                 * otherwise an update that only changes active would result in
@@ -476,17 +455,14 @@ int
 drm_atomic_helper_check_planes(struct drm_device *dev,
                               struct drm_atomic_state *state)
 {
-       int nplanes = dev->mode_config.num_total_plane;
-       int ncrtcs = dev->mode_config.num_crtc;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *crtc_state;
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
        int i, ret = 0;
 
-       for (i = 0; i < nplanes; i++) {
+       for_each_plane_in_state(state, plane, plane_state, i) {
                const struct drm_plane_helper_funcs *funcs;
-               struct drm_plane *plane = state->planes[i];
-               struct drm_plane_state *plane_state = state->plane_states[i];
-
-               if (!plane)
-                       continue;
 
                funcs = plane->helper_private;
 
@@ -503,12 +479,8 @@ drm_atomic_helper_check_planes(struct drm_device *dev,
                }
        }
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc = state->crtcs[i];
-
-               if (!crtc)
-                       continue;
 
                funcs = crtc->helper_private;
 
@@ -567,22 +539,20 @@ EXPORT_SYMBOL(drm_atomic_helper_check);
 static void
 disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 {
-       int ncrtcs = old_state->dev->mode_config.num_crtc;
+       struct drm_connector *connector;
+       struct drm_connector_state *old_conn_state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
        int i;
 
-       for (i = 0; i < old_state->num_connector; i++) {
+       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
                const struct drm_encoder_helper_funcs *funcs;
-               struct drm_connector_state *old_conn_state;
-               struct drm_connector *connector;
                struct drm_encoder *encoder;
                struct drm_crtc_state *old_crtc_state;
 
-               old_conn_state = old_state->connector_states[i];
-               connector = old_state->connectors[i];
-
                /* Shut down everything that's in the changeset and currently
                 * still on. So need to check the old, saved state. */
-               if (!old_conn_state || !old_conn_state->crtc)
+               if (!old_conn_state->crtc)
                        continue;
 
                old_crtc_state = old_state->crtc_states[drm_crtc_index(old_conn_state->crtc)];
@@ -623,16 +593,11 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
                        encoder->bridge->funcs->post_disable(encoder->bridge);
        }
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc;
-               struct drm_crtc_state *old_crtc_state;
-
-               crtc = old_state->crtcs[i];
-               old_crtc_state = old_state->crtc_states[i];
 
                /* Shut down everything that needs a full modeset. */
-               if (!crtc || !needs_modeset(crtc->state))
+               if (!needs_modeset(crtc->state))
                        continue;
 
                if (!old_crtc_state->active)
@@ -657,16 +622,15 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state)
 static void
 set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
 {
-       int ncrtcs = old_state->dev->mode_config.num_crtc;
+       struct drm_connector *connector;
+       struct drm_connector_state *old_conn_state;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
        int i;
 
        /* clear out existing links */
-       for (i = 0; i < old_state->num_connector; i++) {
-               struct drm_connector *connector;
-
-               connector = old_state->connectors[i];
-
-               if (!connector || !connector->encoder)
+       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
+               if (!connector->encoder)
                        continue;
 
                WARN_ON(!connector->encoder->crtc);
@@ -676,12 +640,8 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
        }
 
        /* set new links */
-       for (i = 0; i < old_state->num_connector; i++) {
-               struct drm_connector *connector;
-
-               connector = old_state->connectors[i];
-
-               if (!connector || !connector->state->crtc)
+       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
+               if (!connector->state->crtc)
                        continue;
 
                if (WARN_ON(!connector->state->best_encoder))
@@ -692,14 +652,7 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
        }
 
        /* set legacy state in the crtc structure */
-       for (i = 0; i < ncrtcs; i++) {
-               struct drm_crtc *crtc;
-
-               crtc = old_state->crtcs[i];
-
-               if (!crtc)
-                       continue;
-
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                crtc->mode = crtc->state->mode;
                crtc->enabled = crtc->state->enable;
                crtc->x = crtc->primary->state->src_x >> 16;
@@ -710,16 +663,16 @@ set_routing_links(struct drm_device *dev, struct drm_atomic_state *old_state)
 static void
 crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
 {
-       int ncrtcs = old_state->dev->mode_config.num_crtc;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+       struct drm_connector *connector;
+       struct drm_connector_state *old_conn_state;
        int i;
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc;
-
-               crtc = old_state->crtcs[i];
 
-               if (!crtc || !crtc->state->mode_changed)
+               if (!crtc->state->mode_changed)
                        continue;
 
                funcs = crtc->helper_private;
@@ -732,16 +685,13 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state)
                }
        }
 
-       for (i = 0; i < old_state->num_connector; i++) {
+       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
                const struct drm_encoder_helper_funcs *funcs;
-               struct drm_connector *connector;
                struct drm_crtc_state *new_crtc_state;
                struct drm_encoder *encoder;
                struct drm_display_mode *mode, *adjusted_mode;
 
-               connector = old_state->connectors[i];
-
-               if (!connector || !connector->state->best_encoder)
+               if (!connector->state->best_encoder)
                        continue;
 
                encoder = connector->state->best_encoder;
@@ -809,17 +759,17 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_disables);
 void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
                                              struct drm_atomic_state *old_state)
 {
-       int ncrtcs = old_state->dev->mode_config.num_crtc;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+       struct drm_connector *connector;
+       struct drm_connector_state *old_conn_state;
        int i;
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc;
-
-               crtc = old_state->crtcs[i];
 
                /* Need to filter out CRTCs where only planes change. */
-               if (!crtc || !needs_modeset(crtc->state))
+               if (!needs_modeset(crtc->state))
                        continue;
 
                if (!crtc->state->active)
@@ -838,14 +788,11 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
                }
        }
 
-       for (i = 0; i < old_state->num_connector; i++) {
+       for_each_connector_in_state(old_state, connector, old_conn_state, i) {
                const struct drm_encoder_helper_funcs *funcs;
-               struct drm_connector *connector;
                struct drm_encoder *encoder;
 
-               connector = old_state->connectors[i];
-
-               if (!connector || !connector->state->best_encoder)
+               if (!connector->state->best_encoder)
                        continue;
 
                if (!connector->state->crtc->state->active ||
@@ -879,13 +826,12 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_modeset_enables);
 static void wait_for_fences(struct drm_device *dev,
                            struct drm_atomic_state *state)
 {
-       int nplanes = dev->mode_config.num_total_plane;
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
        int i;
 
-       for (i = 0; i < nplanes; i++) {
-               struct drm_plane *plane = state->planes[i];
-
-               if (!plane || !plane->state->fence)
+       for_each_plane_in_state(state, plane, plane_state, i) {
+               if (!plane->state->fence)
                        continue;
 
                WARN_ON(!plane->state->fb);
@@ -902,16 +848,9 @@ static bool framebuffer_changed(struct drm_device *dev,
 {
        struct drm_plane *plane;
        struct drm_plane_state *old_plane_state;
-       int nplanes = old_state->dev->mode_config.num_total_plane;
        int i;
 
-       for (i = 0; i < nplanes; i++) {
-               plane = old_state->planes[i];
-               old_plane_state = old_state->plane_states[i];
-
-               if (!plane)
-                       continue;
-
+       for_each_plane_in_state(old_state, plane, old_plane_state, i) {
                if (plane->state->crtc != crtc &&
                    old_plane_state->crtc != crtc)
                        continue;
@@ -940,16 +879,9 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
 {
        struct drm_crtc *crtc;
        struct drm_crtc_state *old_crtc_state;
-       int ncrtcs = old_state->dev->mode_config.num_crtc;
        int i, ret;
 
-       for (i = 0; i < ncrtcs; i++) {
-               crtc = old_state->crtcs[i];
-               old_crtc_state = old_state->crtc_states[i];
-
-               if (!crtc)
-                       continue;
-
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                /* No one cares about the old state, so abuse it for tracking
                 * and store whether we hold a vblank reference (and should do a
                 * vblank wait) in the ->enable boolean. */
@@ -974,11 +906,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
                old_crtc_state->last_vblank_count = drm_vblank_count(dev, i);
        }
 
-       for (i = 0; i < ncrtcs; i++) {
-               crtc = old_state->crtcs[i];
-               old_crtc_state = old_state->crtc_states[i];
-
-               if (!crtc || !old_crtc_state->enable)
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
+               if (!old_crtc_state->enable)
                        continue;
 
                ret = wait_event_timeout(dev->vblank[i].queue,
@@ -1176,16 +1105,14 @@ EXPORT_SYMBOL(drm_atomic_helper_prepare_planes);
 void drm_atomic_helper_commit_planes(struct drm_device *dev,
                                     struct drm_atomic_state *old_state)
 {
-       int nplanes = dev->mode_config.num_total_plane;
-       int ncrtcs = dev->mode_config.num_crtc;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *old_crtc_state;
+       struct drm_plane *plane;
+       struct drm_plane_state *old_plane_state;
        int i;
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc = old_state->crtcs[i];
-
-               if (!crtc)
-                       continue;
 
                funcs = crtc->helper_private;
 
@@ -1195,13 +1122,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
                funcs->atomic_begin(crtc);
        }
 
-       for (i = 0; i < nplanes; i++) {
+       for_each_plane_in_state(old_state, plane, old_plane_state, i) {
                const struct drm_plane_helper_funcs *funcs;
-               struct drm_plane *plane = old_state->planes[i];
-               struct drm_plane_state *old_plane_state;
-
-               if (!plane)
-                       continue;
 
                funcs = plane->helper_private;
 
@@ -1220,12 +1142,8 @@ void drm_atomic_helper_commit_planes(struct drm_device *dev,
                        funcs->atomic_update(plane, old_plane_state);
        }
 
-       for (i = 0; i < ncrtcs; i++) {
+       for_each_crtc_in_state(old_state, crtc, old_crtc_state, i) {
                const struct drm_crtc_helper_funcs *funcs;
-               struct drm_crtc *crtc = old_state->crtcs[i];
-
-               if (!crtc)
-                       continue;
 
                funcs = crtc->helper_private;
 
@@ -1252,18 +1170,14 @@ EXPORT_SYMBOL(drm_atomic_helper_commit_planes);
 void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
                                      struct drm_atomic_state *old_state)
 {
-       int nplanes = dev->mode_config.num_total_plane;
+       struct drm_plane *plane;
+       struct drm_plane_state *plane_state;
        int i;
 
-       for (i = 0; i < nplanes; i++) {
+       for_each_plane_in_state(old_state, plane, plane_state, i) {
                const struct drm_plane_helper_funcs *funcs;
-               struct drm_plane *plane = old_state->planes[i];
-               struct drm_plane_state *plane_state = old_state->plane_states[i];
                struct drm_framebuffer *old_fb;
 
-               if (!plane)
-                       continue;
-
                funcs = plane->helper_private;
 
                old_fb = plane_state->fb;
@@ -1512,8 +1426,10 @@ static int update_output_state(struct drm_atomic_state *state,
                               struct drm_mode_set *set)
 {
        struct drm_device *dev = set->crtc->dev;
+       struct drm_crtc *crtc;
+       struct drm_crtc_state *crtc_state;
+       struct drm_connector *connector;
        struct drm_connector_state *conn_state;
-       int ncrtcs = state->dev->mode_config.num_crtc;
        int ret, i, j;
 
        ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
@@ -1529,27 +1445,14 @@ static int update_output_state(struct drm_atomic_state *state,
                        return PTR_ERR(conn_state);
        }
 
-       for (i = 0; i < ncrtcs; i++) {
-               struct drm_crtc *crtc = state->crtcs[i];
-
-               if (!crtc)
-                       continue;
-
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                ret = drm_atomic_add_affected_connectors(state, crtc);
                if (ret)
                        return ret;
        }
 
        /* Then recompute connector->crtc links and crtc enabling state. */
-       for (i = 0; i < state->num_connector; i++) {
-               struct drm_connector *connector;
-
-               connector = state->connectors[i];
-               conn_state = state->connector_states[i];
-
-               if (!connector)
-                       continue;
-
+       for_each_connector_in_state(state, connector, conn_state, i) {
                if (conn_state->crtc == set->crtc) {
                        ret = drm_atomic_set_crtc_for_connector(conn_state,
                                                                NULL);
@@ -1568,13 +1471,7 @@ static int update_output_state(struct drm_atomic_state *state,
                }
        }
 
-       for (i = 0; i < ncrtcs; i++) {
-               struct drm_crtc *crtc = state->crtcs[i];
-               struct drm_crtc_state *crtc_state = state->crtc_states[i];
-
-               if (!crtc)
-                       continue;
-
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
                /* Don't update ->enable for the CRTC in the set_config request,
                 * since a mismatch would indicate a bug in the upper layers.
                 * The actual modeset code later on will catch any
index 51168a8b723a2d45f4ff658eb27d2b54bd5f1d88..c157103492b0d1f02b198685586202e11977bccd 100644 (file)
@@ -75,4 +75,28 @@ int __must_check drm_atomic_check_only(struct drm_atomic_state *state);
 int __must_check drm_atomic_commit(struct drm_atomic_state *state);
 int __must_check drm_atomic_async_commit(struct drm_atomic_state *state);
 
+#define for_each_connector_in_state(state, connector, connector_state, __i) \
+       for ((__i) = 0;                                                 \
+            (connector) = (state)->connectors[__i],                    \
+            (connector_state) = (state)->connector_states[__i],        \
+            (__i) < (state)->num_connector;                            \
+            (__i)++)                                                   \
+               if (connector)
+
+#define for_each_crtc_in_state(state, crtc, crtc_state, __i)   \
+       for ((__i) = 0;                                         \
+            (crtc) = (state)->crtcs[__i],                      \
+            (crtc_state) = (state)->crtc_states[__i],          \
+            (__i) < (state)->dev->mode_config.num_crtc;        \
+            (__i)++)                                           \
+               if (crtc_state)
+
+#define for_each_plane_in_state(state, plane, plane_state, __i)        \
+       for ((__i) = 0;                                         \
+            (plane) = (state)->planes[__i],                    \
+            (plane_state) = (state)->plane_states[__i],        \
+            (__i) < (state)->dev->mode_config.num_total_plane; \
+            (__i)++)                                           \
+               if (plane_state)
+
 #endif /* DRM_ATOMIC_H_ */