On Fri, Apr 10, 2015 at 02:58:39PM +0300, Ander Conselvan de Oliveira wrote: > 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@xxxxxxxxxxxxxxxxxxxxx > Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@xxxxxxxxx> Applied to drm-misc, thanks. -Daniel > --- > drivers/gpu/drm/drm_atomic.c | 62 +++------ > drivers/gpu/drm/drm_atomic_helper.c | 253 +++++++++++------------------------- > include/drm/drm_atomic.h | 24 ++++ > 3 files changed, 117 insertions(+), 222 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 57efdbe..68236bd 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -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; > } > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index e67d4d6..a2fb0d4 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -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 > diff --git a/include/drm/drm_atomic.h b/include/drm/drm_atomic.h > index 51168a8..c1571034 100644 > --- a/include/drm/drm_atomic.h > +++ b/include/drm/drm_atomic.h > @@ -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_ */ > -- > 2.1.0 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel