On Fri, 10 Jun 2022 at 10:30, Maxime Ripard <max...@cerno.tech> wrote:
>
> Our current code now mixes some resources whose lifetime are tied to the
> device (clocks, IO mappings, etc.) and some that are tied to the DRM device
> (encoder, bridge).
>
> The device one will be freed at unbind time, but the DRM one will only be
> freed when the last user of the DRM device closes its file handle.
>
> So we end up with a time window during which we can call the encoder hooks,
> but we don't have access to the underlying resources and device.
>
> Let's protect all those sections with drm_dev_enter() and drm_dev_exit() so
> that we bail out if we are during that window.
>
> Signed-off-by: Maxime Ripard <max...@cerno.tech>

Reviewed-by: Dave Stevenson <dave.steven...@raspberrypi.com>

> ---
>  drivers/gpu/drm/vc4/vc4_dpi.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
>
> diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c
> index 9950761449cf..ea3d20651f43 100644
> --- a/drivers/gpu/drm/vc4/vc4_dpi.c
> +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
> @@ -13,6 +13,7 @@
>
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_bridge.h>
> +#include <drm/drm_drv.h>
>  #include <drm/drm_edid.h>
>  #include <drm/drm_of.h>
>  #include <drm/drm_panel.h>
> @@ -111,9 +112,16 @@ static const struct debugfs_reg32 dpi_regs[] = {
>
>  static void vc4_dpi_encoder_disable(struct drm_encoder *encoder)
>  {
> +       struct drm_device *dev = encoder->dev;
>         struct vc4_dpi *dpi = to_vc4_dpi(encoder);
> +       int idx;
> +
> +       if (!drm_dev_enter(dev, &idx))
> +               return;
>
>         clk_disable_unprepare(dpi->pixel_clock);
> +
> +       drm_dev_exit(idx);
>  }
>
>  static void vc4_dpi_encoder_enable(struct drm_encoder *encoder)
> @@ -124,6 +132,7 @@ static void vc4_dpi_encoder_enable(struct drm_encoder 
> *encoder)
>         struct drm_connector_list_iter conn_iter;
>         struct drm_connector *connector = NULL, *connector_scan;
>         u32 dpi_c = DPI_ENABLE | DPI_OUTPUT_ENABLE_MODE;
> +       int idx;
>         int ret;
>
>         /* Look up the connector attached to DPI so we can get the
> @@ -184,6 +193,9 @@ static void vc4_dpi_encoder_enable(struct drm_encoder 
> *encoder)
>         else if (!(mode->flags & DRM_MODE_FLAG_PVSYNC))
>                 dpi_c |= DPI_VSYNC_DISABLE;
>
> +       if (!drm_dev_enter(dev, &idx))
> +               return;
> +
>         DPI_WRITE(DPI_C, dpi_c);
>
>         ret = clk_set_rate(dpi->pixel_clock, mode->clock * 1000);
> @@ -193,6 +205,8 @@ static void vc4_dpi_encoder_enable(struct drm_encoder 
> *encoder)
>         ret = clk_prepare_enable(dpi->pixel_clock);
>         if (ret)
>                 DRM_ERROR("Failed to set clock rate: %d\n", ret);
> +
> +       drm_dev_exit(idx);
>  }
>
>  static enum drm_mode_status vc4_dpi_encoder_mode_valid(struct drm_encoder 
> *encoder,
> --
> 2.36.1
>

Reply via email to