mirror of
https://github.com/torvalds/linux.git
synced 2024-11-19 02:21:47 +00:00
drm/dp_mst: Add some atomic state iterator macros
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> Cc: David Airlie <airlied@redhat.com> Cc: Jerry Zuo <Jerry.Zuo@amd.com> Cc: Harry Wentland <harry.wentland@amd.com> Cc: Juston Li <juston.li@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190111005343.17443-18-lyude@redhat.com
This commit is contained in:
parent
7aa275ca0e
commit
bea5c38f1e
@ -3521,10 +3521,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
|
||||
@ -3608,7 +3609,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;
|
||||
}
|
||||
|
@ -650,4 +650,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
|
||||
|
Loading…
Reference in New Issue
Block a user