[PATCH 2/6] drm/bridge: aux-hpd: separate allocation and registration
Johan Hovold
johan at kernel.org
Fri Feb 23 04:46:15 PST 2024
On Thu, Feb 22, 2024 at 10:57:07PM +0200, Dmitry Baryshkov wrote:
> On Sat, 17 Feb 2024 at 17:03, Johan Hovold <johan+linaro at kernel.org> wrote:
> >
> > Combining allocation and registration is an anti-pattern that should be
> > avoided. Add two new functions for allocating and registering an dp-hpd
> > bridge with a proper 'devm' prefix so that it is clear that these are
> > device managed interfaces.
> >
> > devm_drm_dp_hpd_bridge_alloc()
> > devm_drm_dp_hpd_bridge_add()
> >
> > The new interface will be used to fix a use-after-free bug in the
> > Qualcomm PMIC GLINK driver and may prevent similar issues from being
> > introduced elsewhere.
> >
> > The existing drm_dp_hpd_bridge_register() is reimplemented using the
> > above and left in place for now.
> >
> > Signed-off-by: Johan Hovold <johan+linaro at kernel.org>
>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
Thanks for reviewing.
> Minor nit below.
> > diff --git a/include/drm/bridge/aux-bridge.h b/include/drm/bridge/aux-bridge.h
> > index c4c423e97f06..4453906105ca 100644
> > --- a/include/drm/bridge/aux-bridge.h
> > +++ b/include/drm/bridge/aux-bridge.h
> > @@ -9,6 +9,8 @@
> >
> > #include <drm/drm_connector.h>
> >
> > +struct auxiliary_device;
> > +
> > #if IS_ENABLED(CONFIG_DRM_AUX_BRIDGE)
> > int drm_aux_bridge_register(struct device *parent);
> > #else
> > @@ -19,10 +21,23 @@ static inline int drm_aux_bridge_register(struct device *parent)
> > #endif
> >
> > #if IS_ENABLED(CONFIG_DRM_AUX_HPD_BRIDGE)
> > +struct auxiliary_device *devm_drm_dp_hpd_bridge_alloc(struct device *parent, struct device_node *np);
> > +int devm_drm_dp_hpd_bridge_add(struct device *dev, struct auxiliary_device *adev);
>
> I had a pretty close idea during prototyping, but I ended up doing it
> as a single function for the following reasons:
>
> First, this exports the implementation detail that internally the code
> uses an aux device.
That's not an issue. The opposite, with interfaces trying to do too much
and hide details from the developers so that they can no longer reason
about what is going on, is a real problem though.
> Also, by exporting the aux device the code becomes less type-safe. By
> mistake one can call devm_drm_dp_hpd_bridge_add() on any aux device,
> which is not necessarily the HPD bridge.
No. First, that is currently not even an issue either as the
registration interface is safe to use with any aux device.
Second, if you cared about about type-safety you wouldn't have used a
struct device pointer for drm_aux_hpd_bridge_notify() which you back
cast to an aux device.
> I'd prefer to see an opaque device-specific structure instead. WDYT?
That should have been there from the start. But I'm not interested in
cleaning up this mess beyond what is minimally required to fix the
regressions it caused.
This can be reworked for 6.9 or later.
> > struct device *drm_dp_hpd_bridge_register(struct device *parent,
> > struct device_node *np);
> > void drm_aux_hpd_bridge_notify(struct device *dev, enum drm_connector_status status);
Johan
More information about the linux-phy
mailing list