On Thu, Nov 15, 2018 at 07:50:03PM -0500, Lyude Paul wrote: > Signed-off-by: Lyude Paul <lyude@xxxxxxxxxx> > Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > --- > include/drm/drm_dp_mst_helper.h | 77 +++++++++++++++++++++++++++++++++ > 1 file changed, 77 insertions(+) > > diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h > index 59f005b419cf..3faceb66f5cb 100644 > --- a/include/drm/drm_dp_mst_helper.h > +++ b/include/drm/drm_dp_mst_helper.h > @@ -628,4 +628,81 @@ int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state, > int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr, > struct drm_dp_mst_port *port, bool power_up); > > +extern const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs; > + > +static inline bool > +__drm_dp_mst_state_iter_get(struct drm_atomic_state *state, > + struct drm_dp_mst_topology_mgr **mgr, > + struct drm_dp_mst_topology_state **old_state, > + struct drm_dp_mst_topology_state **new_state, > + int i) > +{ > + struct __drm_private_objs_state *objs_state = &state->private_objs[i]; > + > + if (objs_state->ptr->funcs != &drm_dp_mst_topology_state_funcs) Just noticed that this patch is missing the EXPORT_SYMBOL, which is burried in patch 3. Needs to be moved. A tiny bit of kerneldoc along the lines of "never use this directly" would be good too :-) -Daniel > + return false; > + > + *mgr = to_dp_mst_topology_mgr(objs_state->ptr); > + if (old_state) > + *old_state = to_dp_mst_topology_state(objs_state->old_state); > + if (new_state) > + *new_state = to_dp_mst_topology_state(objs_state->new_state); > + > + return true; > +} > + > +/** > + * for_each_oldnew_mst_mgr_in_state - iterate over all DP MST topology > + * managers in an atomic update > + * @__state: &struct drm_atomic_state pointer > + * @mgr: &struct drm_dp_mst_topology_mgr iteration cursor > + * @old_state: &struct drm_dp_mst_topology_state iteration cursor for the old > + * state > + * @new_state: &struct drm_dp_mst_topology_state iteration cursor for the new > + * state > + * @__i: int iteration cursor, for macro-internal use > + * > + * This iterates over all DRM DP MST topology managers in an atomic update, > + * tracking both old and new state. This is useful in places where the state > + * delta needs to be considered, for example in atomic check functions. > + */ > +#define for_each_oldnew_mst_mgr_in_state(__state, mgr, old_state, new_state, __i) \ > + for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \ > + for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), &(old_state), &(new_state), (__i))) > + > +/** > + * for_each_old_mst_mgr_in_state - iterate over all DP MST topology managers > + * in an atomic update > + * @__state: &struct drm_atomic_state pointer > + * @mgr: &struct drm_dp_mst_topology_mgr iteration cursor > + * @old_state: &struct drm_dp_mst_topology_state iteration cursor for the old > + * state > + * @__i: int iteration cursor, for macro-internal use > + * > + * This iterates over all DRM DP MST topology managers in an atomic update, > + * tracking only the old state. This is useful in disable functions, where we > + * need the old state the hardware is still in. > + */ > +#define for_each_old_mst_mgr_in_state(__state, mgr, old_state, __i) \ > + for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \ > + for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), &(old_state), NULL, (__i))) > + > +/** > + * for_each_new_mst_mgr_in_state - iterate over all DP MST topology managers > + * in an atomic update > + * @__state: &struct drm_atomic_state pointer > + * @mgr: &struct drm_dp_mst_topology_mgr iteration cursor > + * @new_state: &struct drm_dp_mst_topology_state iteration cursor for the new > + * state > + * @__i: int iteration cursor, for macro-internal use > + * > + * This iterates over all DRM DP MST topology managers in an atomic update, > + * tracking only the new state. This is useful in enable functions, where we > + * need the new state the hardware should be in when the atomic commit > + * operation has completed. > + */ > +#define for_each_new_mst_mgr_in_state(__state, mgr, new_state, __i) \ > + for ((__i) = 0; (__i) < (__state)->num_private_objs; (__i)++) \ > + for_each_if(__drm_dp_mst_state_iter_get((__state), &(mgr), NULL, &(new_state), (__i))) > + > #endif > -- > 2.19.1 > > _______________________________________________ > Nouveau mailing list > Nouveau@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/nouveau -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel