On Wed, Apr 2, 2025 at 4:36 PM AngeloGioacchino Del Regno <angelogioacchino.delre...@collabora.com> wrote: > > When calling component_bind_all(), if a component that is included > in the list fails, all of those that have been successfully bound > will be unbound, but this driver has two components lists for two > actual devices, as in, each mmsys instance has its own components > list. > > In case mmsys0 (or actually vdosys0) is able to bind all of its > components, but the secondary one fails, all of the components of > the first are kept bound, while the ones of mmsys1/vdosys1 are > correctly cleaned up. > > This is not right because, in case of a failure, the components > are re-bound for all of the mmsys/vdosys instances without caring > about the ones that were previously left in a bound state. > > Fix that by calling component_unbind_all() on all of the previous > component masters that succeeded binding all subdevices when any > of the other masters errors out. > > Fixes: 1ef7ed48356c ("drm/mediatek: Modify mediatek-drm for mt8195 multi > mmsys support") > Signed-off-by: AngeloGioacchino Del Regno > <angelogioacchino.delre...@collabora.com>
Makes sense. Reviewed-by: Chen-Yu Tsai <we...@chromium.org> > --- > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > index 6b31df587507..2d6562b29755 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > @@ -482,8 +482,11 @@ static int mtk_drm_kms_init(struct drm_device *drm) > for (i = 0; i < private->data->mmsys_dev_num; i++) { > drm->dev_private = private->all_drm_private[i]; > ret = component_bind_all(private->all_drm_private[i]->dev, > drm); > - if (ret) > + if (ret) { > + while (--i >= 0) > + > component_unbind_all(private->all_drm_private[i]->dev, drm); > return ret; > + } > } > > /* > -- > 2.48.1 >