lkml.org 
[lkml]   [2018]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[WIP PATCH 12/15] drm/dp_mst: Add some atomic state iterator macros
    Date
    Changes since v6:
    - Move EXPORT_SYMBOL() for drm_dp_mst_topology_state_funcs to this
    commit
    - Document __drm_dp_mst_state_iter_get() and note that it shouldn't be
    called directly

    Signed-off-by: Lyude Paul <lyude@redhat.com>
    Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    ---
    drivers/gpu/drm/drm_dp_mst_topology.c | 5 +-
    include/drm/drm_dp_mst_helper.h | 96 +++++++++++++++++++++++++++
    2 files changed, 99 insertions(+), 2 deletions(-)

    diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
    index 93f08bfd2ab3..8d94c8943ac7 100644
    --- a/drivers/gpu/drm/drm_dp_mst_topology.c
    +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
    @@ -3415,10 +3415,11 @@ static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
    kfree(mst_state);
    }

    -static const struct drm_private_state_funcs mst_state_funcs = {
    +const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs = {
    .atomic_duplicate_state = drm_dp_mst_duplicate_state,
    .atomic_destroy_state = drm_dp_mst_destroy_state,
    };
    +EXPORT_SYMBOL(drm_dp_mst_topology_state_funcs);

    /**
    * drm_atomic_get_mst_topology_state: get MST topology state
    @@ -3502,7 +3503,7 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,

    drm_atomic_private_obj_init(dev, &mgr->base,
    &mst_state->base,
    - &mst_state_funcs);
    + &drm_dp_mst_topology_state_funcs);

    return 0;
    }
    diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
    index 50643a39765d..b8a8d75410d0 100644
    --- a/include/drm/drm_dp_mst_helper.h
    +++ b/include/drm/drm_dp_mst_helper.h
    @@ -637,4 +637,100 @@ int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr,
    void drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port);
    void drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port);

    +extern const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs;
    +
    +/**
    + * __drm_dp_mst_state_iter_get - private atomic state iterator function for
    + * macro-internal use
    + * @state: &struct drm_atomic_state pointer
    + * @mgr: pointer to the &struct drm_dp_mst_topology_mgr iteration cursor
    + * @old_state: optional pointer to the old &struct drm_dp_mst_topology_state
    + * iteration cursor
    + * @new_state: optional pointer to the new &struct drm_dp_mst_topology_state
    + * iteration cursor
    + * @i: int iteration cursor, for macro-internal use
    + *
    + * Used by for_each_oldnew_mst_mgr_in_state(),
    + * for_each_old_mst_mgr_in_state(), and for_each_new_mst_mgr_in_state(). Don't
    + * call this directly.
    + *
    + * Returns:
    + * True if the current &struct drm_private_obj is a &struct
    + * drm_dp_mst_topology_mgr, false otherwise.
    + */
    +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)
    + 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.2
    \
     
     \ /
      Last update: 2018-12-14 02:27    [W:4.228 / U:0.136 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site