The SRO readout helpers need to distinguish bridge-backed private objects from other private objects, because bridges require special readout ordering through the encoder bridge chains.
Add drm_private_obj_is_bridge() which checks whether a private object's funcs pointer matches the bridge private state funcs. Signed-off-by: Maxime Ripard <[email protected]> --- drivers/gpu/drm/drm_bridge.c | 15 +++++++++++++++ include/drm/drm_bridge.h | 2 ++ 2 files changed, 17 insertions(+) diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c index 27bb9963c234..186a4c14faef 100644 --- a/drivers/gpu/drm/drm_bridge.c +++ b/drivers/gpu/drm/drm_bridge.c @@ -554,10 +554,25 @@ static const struct drm_private_state_funcs drm_bridge_priv_state_funcs = { .atomic_create_state = drm_bridge_atomic_create_priv_state, .atomic_duplicate_state = drm_bridge_atomic_duplicate_priv_state, .atomic_destroy_state = drm_bridge_atomic_destroy_priv_state, }; +/** + * drm_private_obj_is_bridge - check if a private object backs a bridge + * @obj: private object to check + * + * RETURNS: + * + * True if @obj is the &drm_private_obj embedded in a &struct drm_bridge, + * false otherwise. + */ +bool drm_private_obj_is_bridge(struct drm_private_obj *obj) +{ + return obj->funcs && obj->funcs == &drm_bridge_priv_state_funcs; +} +EXPORT_SYMBOL(drm_private_obj_is_bridge); + /** * drm_bridge_attach - attach the bridge to an encoder's chain * * @encoder: DRM encoder * @bridge: bridge to attach diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 389dcab3c3f3..a6b0ad25eea8 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1183,10 +1183,12 @@ static inline struct drm_bridge * drm_priv_to_bridge(struct drm_private_obj *priv) { return container_of(priv, struct drm_bridge, base); } +bool drm_private_obj_is_bridge(struct drm_private_obj *obj); + bool drm_bridge_enter(struct drm_bridge *bridge, int *idx); void drm_bridge_exit(int idx); void drm_bridge_unplug(struct drm_bridge *bridge); struct drm_bridge *drm_bridge_get(struct drm_bridge *bridge); -- 2.55.0
