On Fri, 10 Jun 2022 at 10:30, Maxime Ripard <maxime@xxxxxxxxxx> 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 <maxime@xxxxxxxxxx> Reviewed-by: Dave Stevenson <dave.stevenson@xxxxxxxxxxxxxxx> > --- > 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 >