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 912ccc4e7c27..b7b0ec7c2d4b 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); + static bool drm_bridge_is_atomic(struct drm_bridge *bridge) { return bridge->funcs->atomic_reset != NULL; } diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index ea5c0f6a7e8d..d14c50460e94 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -1289,10 +1289,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.54.0
