dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/9] drm/bridge: get/put the bridge when looping over the encoder chain
@ 2025-08-08 14:49 Luca Ceresoli
  2025-08-08 14:49 ` [PATCH v2 1/9] drm/display: bridge-connector: use scope-specific variable for the bridge pointer Luca Ceresoli
                   ` (9 more replies)
  0 siblings, 10 replies; 17+ messages in thread
From: Luca Ceresoli @ 2025-08-08 14:49 UTC (permalink / raw)
  To: Andrzej Hajda, Neil Armstrong, Robert Foss, Laurent Pinchart,
	Jonas Karlman, Jernej Skrabec, Maarten Lankhorst, Maxime Ripard,
	Thomas Zimmermann, David Airlie, Simona Vetter, Miguel Ojeda,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Tomi Valkeinen
  Cc: Dmitry Baryshkov, Chaoyi Chen, Hui Pu, Thomas Petazzoni,
	dri-devel, linux-kernel, llvm, Luca Ceresoli

This series adds drm_bridge_get/put() calls for DRM bridges used when
looping over bridges in an encoder chain.

This is part of the work towards removal of bridges from a still existing
DRM pipeline without use-after-free. The grand plan was discussed in [1].
Here's the work breakdown (➜ marks the current series):

 1. ➜ add refcounting to DRM bridges (struct drm_bridge)
    (based on devm_drm_bridge_alloc() [0])
    A. ✔ add new alloc API and refcounting (in v6.16-rc1)
    B. ✔ convert all bridge drivers to new API (now in drm-misc-next)
    C. ✔ kunit tests (now in drm-misc-next)
    D. ✔ add get/put to drm_bridge_add/remove() + attach/detach()
         and warn on old allocation pattern (now in drm-misc-next)
    E. ➜ add get/put on drm_bridge accessors
       1. ✔ drm_bridge_chain_get_first_bridge() + add a cleanup action
       2. … drm_bridge_get_prev_bridge()
       3. … drm_bridge_get_next_bridge()
       4. ➜ drm_for_each_bridge_in_chain()
       5. drm_bridge_connector_init
       6. of_drm_find_bridge
       7. drm_of_find_panel_or_bridge, *_of_get_bridge
    F. debugfs improvements
 2. handle gracefully atomic updates during bridge removal
 3. … avoid DSI host drivers to have dangling pointers to DSI devices
 4. finish the hotplug bridge work, removing the "always-disconnected"
    connector, moving code to the core and potentially removing the
    hotplug-bridge itself (this needs to be clarified as points 1-3 are
    developed)

Most loops on the encoder bridge chain are based on
drm_for_each_bridge_in_chain(), which does not get/put the bridge pointed
to by the loop iterator.

Add a scoped variant that ensures ta reference to the bridge pointed to by
the iterator is taken/released before/after every iteration (and when
breaking out of the loop). Using the scoped version, the bridge being
iterated on will always have a reference taken during the shole
iteration. This is similar to what for_each_child_of_node() and similar
for_each_* macros do.

All conversions are trivial except for drm_bridge_connector_init() which
needs some preliminary cleanups (patches 1-2).

omapdrm/omap_encoder.c is the only driver iterating over the encoder bridge
chain starting from a specific bridge, instead of iterating over the whole
list. For this use case, add a drm_for_each_bridge_in_chain_from() variant.

This series depends on:

 * commit 103578241512 ("drm/bridge-connector: Fix bridge in
   drm_connector_hdmi_audio_init()"), currently in drm-misc-fixes, not yet
   on drm-misc-next

[0] https://gitlab.freedesktop.org/drm/misc/kernel/-/commit/0cc6aadd7fc1e629b715ea3d1ba537ef2da95eec
[1] https://lore.kernel.org/lkml/20250206-hotplug-drm-bridge-v6-0-9d6f2c9c3058@bootlin.com/t/#u

Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
---
Changes in v2:
- Prune series dependency list
- Clarify wording in cover letter and patch 3
- Link to v1: https://lore.kernel.org/r/20250723-drm-bridge-alloc-getput-for_each_bridge-v1-0-be8f4ae006e9@bootlin.com

---
Luca Ceresoli (9):
      drm/display: bridge-connector: use scope-specific variable for the bridge pointer
      drm/display: bridge-connector: remove unused variable assignment
      drm/bridge: add drm_for_each_bridge_in_chain_scoped()
      drm/display: bridge-connector: use drm_for_each_bridge_in_chain_scoped()
      drm/atomic: use drm_for_each_bridge_in_chain_scoped()
      drm/bridge: use drm_for_each_bridge_in_chain_scoped()
      drm/bridge: remove drm_for_each_bridge_in_chain()
      drm/bridge: add drm_for_each_bridge_in_chain_from()
      drm/omap: use drm_for_each_bridge_in_chain_from()

 .clang-format                                  |  2 +-
 drivers/gpu/drm/display/drm_bridge_connector.c | 13 +++----
 drivers/gpu/drm/drm_atomic.c                   |  3 +-
 drivers/gpu/drm/drm_bridge.c                   |  3 +-
 drivers/gpu/drm/omapdrm/omap_encoder.c         |  4 +-
 include/drm/drm_bridge.h                       | 52 ++++++++++++++++++++++++--
 6 files changed, 58 insertions(+), 19 deletions(-)
---
base-commit: d2b48f2b30f25997a1ae1ad0cefac68c25f8c330
change-id: 20250718-drm-bridge-alloc-getput-for_each_bridge-f141ae17b65a
prerequisite-message-id: <20250620011616.118-1-kernel@airkyi.com>
prerequisite-patch-id: ba5a6a15ea02bcee387db0e92ffb4cd0e1fbf816

Best regards,
-- 
Luca Ceresoli <luca.ceresoli@bootlin.com>


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2025-09-02 21:53 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-08 14:49 [PATCH v2 0/9] drm/bridge: get/put the bridge when looping over the encoder chain Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 1/9] drm/display: bridge-connector: use scope-specific variable for the bridge pointer Luca Ceresoli
2025-08-19 13:43   ` Maxime Ripard
2025-08-08 14:49 ` [PATCH v2 2/9] drm/display: bridge-connector: remove unused variable assignment Luca Ceresoli
2025-08-19 13:43   ` Maxime Ripard
2025-08-08 14:49 ` [PATCH v2 3/9] drm/bridge: add drm_for_each_bridge_in_chain_scoped() Luca Ceresoli
2025-08-19 13:47   ` Maxime Ripard
2025-08-19 16:01     ` Luca Ceresoli
2025-08-20  9:40       ` Luca Ceresoli
2025-09-02 21:53         ` Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 4/9] drm/display: bridge-connector: use drm_for_each_bridge_in_chain_scoped() Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 5/9] drm/atomic: " Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 6/9] drm/bridge: " Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 7/9] drm/bridge: remove drm_for_each_bridge_in_chain() Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 8/9] drm/bridge: add drm_for_each_bridge_in_chain_from() Luca Ceresoli
2025-08-08 14:49 ` [PATCH v2 9/9] drm/omap: use drm_for_each_bridge_in_chain_from() Luca Ceresoli
2025-08-19 10:15 ` [PATCH v2 0/9] drm/bridge: get/put the bridge when looping over the encoder chain Luca Ceresoli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).