On Tue, Jan 8, 2019 at 10:22 AM Andrzej Hajda <a.ha...@samsung.com> wrote:
>
> On 08.01.2019 09:47, Daniel Vetter wrote:
> > On Tue, Jan 8, 2019 at 9:35 AM Andrzej Hajda <a.ha...@samsung.com> wrote:
> >> On 07.01.2019 22:56, Daniel Vetter wrote:
> >>> On Mon, Jan 7, 2019 at 5:27 PM Andrzej Hajda <a.ha...@samsung.com> wrote:
> >>>> On 07.01.2019 17:08, Daniel Vetter wrote:
> >>>>> On Mon, Jan 07, 2019 at 12:26:58PM +0100, Andrzej Hajda wrote:
> >>>>>> On 07.01.2019 11:45, Daniel Vetter wrote:
> >>>>>>> On Thu, Jan 03, 2019 at 01:11:47PM +0000, Russell King - ARM Linux 
> >>>>>>> wrote:
> >>>>>>>> On Thu, Jan 03, 2019 at 10:47:27AM +0100, Lubomir Rintel wrote:
> >>>>>>>>> Hello,
> >>>>>>>>>
> >>>>>>>>> lately I've been trying to make the Himax HX8837 chip that drives 
> >>>>>>>>> the OLPC
> >>>>>>>>> LCD display work with Armada DRM driver. I've been advised to 
> >>>>>>>>> create a
> >>>>>>>>> bridge driver and not an encoder driver since the silicon is 
> >>>>>>>>> separate from
> >>>>>>>>> the LCDC.
> >>>>>>>>>
> >>>>>>>>> The Armada DRM driver (and, I think, the i.MX one) creates the 
> >>>>>>>>> drm_device
> >>>>>>>>> once the component infrastructure sees the necessary sub-devices 
> >>>>>>>>> appear.
> >>>>>>>>> The sub-devices being the LCDCs and the encoders (not bridges) that 
> >>>>>>>>> it
> >>>>>>>>> expects to be created externally.
> >>>>>>>>>
> >>>>>>>>> Currently, it seems, the only driver that can actually work with 
> >>>>>>>>> this (that
> >>>>>>>>> is -- creates a drm_encoder for a drm_device when the component is 
> >>>>>>>>> bound)
> >>>>>>>>> is the tda998x. All other similar drivers create a drm_bridge 
> >>>>>>>>> instead and
> >>>>>>>>> not use the component infrastructure at all. (In fact, tilcdc driver
> >>>>>>>>> contains a  hack to handle tda998x specially.)
> >>>>>>>>>
> >>>>>>>>> I'm wondering how to reconcile the two?
> >>>>>>>>>
> >>>>>>>>> * The tda998x driver has recently been modified to create a bridge 
> >>>>>>>>> on probe
> >>>>>>>>>   and eventually encoder on component bind. Is this an okay thing 
> >>>>>>>>> to do in
> >>>>>>>>>   a new driver? (this probably means the tilcdc hack can be 
> >>>>>>>>> removed...)
> >>>>>>>>>
> >>>>>>>>> * If a non-componentized bridge were to be used (along with a dummy
> >>>>>>>>>   encoder), at what point would it make sense to look for the 
> >>>>>>>>> bridge?
> >>>>>>>>>   Would it be a good idea to defer the probe of crtc until a bridge 
> >>>>>>>>> can be
> >>>>>>>>>   looked up and the attach it on component bind?  What if the 
> >>>>>>>>> bridge goes
> >>>>>>>>>   away (a module is unloaded, etc.) in between?
> >>>>>>>>>
> >>>>>>>>> I'd be thankful for opintions and advice before I move ahead with 
> >>>>>>>>> this.
> >>>>>>>> This is the long-standing problem with the conflict between bridge
> >>>>>>>> support and component support, and I'm not sure that there is really
> >>>>>>>> any answer to it.
> >>>>>>>>
> >>>>>>>> I've gone into the details of the two several times on the list,
> >>>>>>>> particularly about the short-comings of the bridge approach, but it
> >>>>>>>> seems no one cares to fix those short-comings.
> >>>>>>>>
> >>>>>>>> You are re-identifying some of the issues that I've already pointed
> >>>>>>>> out - such as what happens to DRM drives when the bridge driver is
> >>>>>>>> unbound (it's really not about modules being unloaded, and the 
> >>>>>>>> problem
> >>>>>>>> can't be solved by taking a module reference count - all that the
> >>>>>>>> module reference count does is ensure that the module doesn't go
> >>>>>>>> away unexpected, there is no way to ensure that the device isn't
> >>>>>>>> unbound.)
> >>>>>>>>
> >>>>>>>> The issue of unbinding is precisely the issue which the component
> >>>>>>>> support was created to solve - but everyone seems to prefer the buggy
> >>>>>>>> bridge approach, and no one seems willing to do anything about the
> >>>>>>>> bugs or even acknowledge that it's a problem.  It's strange - if one
> >>>>>>>> identifies bugs that result in kernel oops in other kernel 
> >>>>>>>> subsystems,
> >>>>>>>> one is generally taken seriously and the problem is solved.
> >>>>>>> Unbinding is really not the most important feature, especially for 
> >>>>>>> SoC. If
> >>>>>>> you feel different, working together with others, getting some 
> >>>>>>> agreement,
> >>>>>>> getting the patches reviewed and finding someone to get them merged is
> >>>>>>> very much appreciated. But just complaining won't move this forward.
> >>>>>>>
> >>>>>>>> The issue about the encoders is something that I've tried to discuss,
> >>>>>>>> and I've pointed out that moving it into the DRM driver adds 
> >>>>>>>> additional
> >>>>>>>> complexity there, and I'd hoped that my patch set I posted would've
> >>>>>>>> generated discussion, but alas not.
> >>>>>>>>
> >>>>>>>> What I'm not prepared to do is to introduce _known_ bugs into any
> >>>>>>>> driver that I maintain.
> >>>>>>> I thought last time around the idea was to use device links (and teach
> >>>>>>> drm_bridge about them), so that the unloading works correctly.
> >>>>>> With current device_links implementation registering links in probe of
> >>>>>> the consumer is just incorrect - it can happen that neither consumer
> >>>>>> neither provider is fully probed and creating device links in such 
> >>>>>> state
> >>>>>> is wrong according to docs, and my experiments. See [1] for discussion
> >>>>>> and [2] for docs.
> >>>>> We could set up the device link only at drm_dev_register time. At that 
> >>>>> point
> >>>>> we know that driver loading has fully succeeded. We do have a list of
> >>>>> bridges at hand, so that's not going to be an issue.
> >>>>>
> >>>>> The only case where this breaks is if a driver is still using the
> >>>>> deprecated ->load callback. But that ->load callback doesn't mix well 
> >>>>> with
> >>>>> EDEFER_PROBE/component framework anyway, so I think not going to be a
> >>>>> problem hopefully?
> >>>> drm_dev_register usually is called from bind callback, which is called 
> >>>> from probe callback of one of the components or master (depending on 
> >>>> particular probe order). If you want to register device link in this 
> >>>> function it is possible that the bad scenario will happen - there will 
> >>>> be attempt to create device link between not-yet-probed consumer and 
> >>>> not-yet-probed provider.
> >>> If you call drm_dev_register before you have all the components
> >>> assembled (i.e. anywhere else than in master bind) that sounds like a
> >>> driver bug.
> >>
> >> This is how components work, every component calls component_add usually
> >> in probe, and this function checks if all components are present, if yes
> >> (ie. during probe of the last component) master bind is called and it
> >> creates drm device and then registers it. If you add device link at this
> >> moment, it is still before end of probe of the last component.
> >>
> >> On the other side provider is registered (drm_bridge_add in case of
> >> bridges) during its probe so it becomes available to the consumers
> >> BEFORE end of its probe and again it can happen that device link will be
> >> added to early.
> > Hm I read that thread again. Is the reason why we can't add the device
> > link only the exynos behaviour to allow drm_panel to be
> > hot-added/removed?
>
>
> Not only. What I have described above is common to all drivers it has
> nothing specific to Exynos.

I'm pretty sure that most drivers do not hot-add/remove drm things
after drm_dev_register (except drm_connector for dp mst support). It
would be buggy. Do you have more examples? I haven't reviewed them all
in detail, and things might have changed, so could very well be
there's exceptions.

> Of course it was tested on Exynos as this is HW I work on. Linus Walleij
> has also reported in this thread that device links have different issue
> - circular dependencies (last few emails in this lengthy thread). My
> response explains it in detail.
>
>
> >
> > Note that for bridge allowing this is 100% buggy: drm core does not
> > allow you to hotplug/hotunplug bridges.
>
>
> What part of drm core disallows it? As I remember discussions about
> drm_bridge design there were voices that they should be
> hot(un)pluggable, and they are IMO, of course if they are not active.

There's no locking at all to handle bridges appearing/disappearing
while the drm_device can be accessed. There's also no lifetime
management/refcounting. So it "works" but it's racy like mad.

> > In theory drm_panel can be hotplugged (because we can hotplug
> > drm_connector), but I'm pretty sure exynos gets it all wrong since
> > hotplugging panels is no easy thing to do. I don't think this is
> > something we want to support, forcing the entire driver to be unload
> > sounds like what we want to do here.
>
>
> I do not know if it is 'all wrong', but tests shows it is
> hot(un)pluggable. In both cases of panel and bridge :)

There's no drm_connector_get/put in exynos (except the one in
hdmi_mode_fixup, which looks rather fishy tbh). And drm_connector are
the only things in drm you can hotplug/unplug (except the overall
drm_device ofc). So again it maybe "works", but you're guaranteed to
have lots of races all over the place.
-Daniel

>
>
> Regards
>
> Andrzej
>
>
>
> > -Daniel
> >
> >>
> >> Regards
> >>
> >> Andrzej
> >>
> >>
> >>> drm_dev_register publishes the drm device instance to the
> >>> world, if you're not ready to handle userspace requests at that point
> >>> (because not everything is loaded yet) then things will go boom in
> >>> very colorful ways. And from my (admittedly very rough) understanding
> >>> we should be able to register the the device links as the very last
> >>> step in the master bind function (and drm_dev_register should be about
> >>> the last thing you do in the master bind).
> >>>
> >>> So not clear on why this won't work?
> >>
> >>
> >>
> >>> -Daniel
> >>> --
> >>> Daniel Vetter
> >>> Software Engineer, Intel Corporation
> >>> +41 (0) 79 365 57 48 - http://blog.ffwll.ch
> >>>
> >>>
> >
>


-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to