drm/bridge: Add helper to reset bridge pipeline

Let's provide an helper to make it easier for bridge drivers to
power-cycle their bridge.

In order to avoid a circular dependency between that new helper and
drm_atomic_helper_reset_crtc(), this new helper will be in a
drm_bridge_helper.c file to follow the pattern we have for other
objects.

Reviewed-by: Herve Codina <herve.codina@bootlin.com>
Reviewed-by: Simona Vetter <simona.vetter@ffwll.ch>
Tested-by: Herve Codina <herve.codina@bootlin.com>
Co-developed-by: Simona Vetter <simona.vetter@intel.com>
Signed-off-by: Simona Vetter <simona.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250313-bridge-connector-v6-8-511c54a604fb@kernel.org
Signed-off-by: Maxime Ripard <mripard@kernel.org>
This commit is contained in:
Maxime Ripard 2025-03-13 13:00:02 +01:00
parent e0c358e2ed
commit 56ae621241
No known key found for this signature in database
GPG Key ID: 275FCE19A23DBE76
4 changed files with 74 additions and 0 deletions

View File

@ -133,6 +133,7 @@ obj-$(CONFIG_DRM_TTM_HELPER) += drm_ttm_helper.o
drm_kms_helper-y := \
drm_atomic_helper.o \
drm_atomic_state_helper.o \
drm_bridge_helper.o \
drm_crtc_helper.o \
drm_damage_helper.o \
drm_flip_work.o \

View File

@ -3409,6 +3409,9 @@ EXPORT_SYMBOL(drm_atomic_helper_disable_all);
* This implies a reset of all active components available between the CRTC and
* connectors.
*
* A variant of this function exists with
* drm_bridge_helper_reset_crtc(), dedicated to bridges.
*
* NOTE: This relies on resetting &drm_crtc_state.connectors_changed.
* For drivers which optimize out unnecessary modesets this will result in
* a no-op commit, achieving nothing.

View File

@ -0,0 +1,58 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_bridge_helper.h>
#include <drm/drm_modeset_lock.h>
/**
* drm_bridge_helper_reset_crtc - Reset the pipeline feeding a bridge
* @bridge: DRM bridge to reset
* @ctx: lock acquisition context
*
* Reset a @bridge pipeline. It will power-cycle all active components
* between the CRTC and connector that bridge is connected to.
*
* As it relies on drm_atomic_helper_reset_crtc(), the same limitations
* apply.
*
* Returns:
*
* 0 on success or a negative error code on failure. If the error
* returned is EDEADLK, the whole atomic sequence must be restarted.
*/
int drm_bridge_helper_reset_crtc(struct drm_bridge *bridge,
struct drm_modeset_acquire_ctx *ctx)
{
struct drm_connector *connector;
struct drm_encoder *encoder = bridge->encoder;
struct drm_device *dev = encoder->dev;
struct drm_crtc *crtc;
int ret;
ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ctx);
if (ret)
return ret;
connector = drm_atomic_get_connector_for_encoder(encoder, ctx);
if (IS_ERR(connector)) {
ret = PTR_ERR(connector);
goto out;
}
if (!connector->state) {
ret = -EINVAL;
goto out;
}
crtc = connector->state->crtc;
ret = drm_atomic_helper_reset_crtc(crtc, ctx);
if (ret)
goto out;
out:
drm_modeset_unlock(&dev->mode_config.connection_mutex);
return ret;
}
EXPORT_SYMBOL(drm_bridge_helper_reset_crtc);

View File

@ -0,0 +1,12 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#ifndef __DRM_BRIDGE_HELPER_H_
#define __DRM_BRIDGE_HELPER_H_
struct drm_bridge;
struct drm_modeset_acquire_ctx;
int drm_bridge_helper_reset_crtc(struct drm_bridge *bridge,
struct drm_modeset_acquire_ctx *ctx);
#endif // __DRM_BRIDGE_HELPER_H_