[PATCH v2 00/21] drm/dp: Various helper improvements and cleanups

Daniel Vetter daniel at ffwll.ch
Tue Oct 8 09:42:08 UTC 2019


On Wed, Oct 02, 2019 at 06:14:19PM +0200, Thierry Reding wrote:
> On Mon, Sep 23, 2019 at 04:52:02PM +0200, Thierry Reding wrote:
> > On Mon, Sep 23, 2019 at 04:52:50PM +0300, Jani Nikula wrote:
> > > On Fri, 20 Sep 2019, Thierry Reding <thierry.reding at gmail.com> wrote:
> > > > On Mon, Sep 02, 2019 at 01:31:00PM +0200, Thierry Reding wrote:
> > > >> From: Thierry Reding <treding at nvidia.com>
> > > >> 
> > > >> Hi,
> > > >> 
> > > >> this series of patches improves the DP helpers a bit and cleans up some
> > > >> inconsistencies along the way.
> > > >> 
> > > >> v2 incorporates all review comments add collects Reviewed-bys from v1.
> > > >> 
> > > >> Thierry
> > > >> 
> > > >> Thierry Reding (21):
> > > >>   drm/dp: Sort includes alphabetically
> > > >>   drm/dp: Add missing kerneldoc for struct drm_dp_link
> > > >>   drm/dp: Add drm_dp_link_reset() implementation
> > > >>   drm/dp: Track link capabilities alongside settings
> > > >>   drm/dp: Turn link capabilities into booleans
> > > >>   drm/dp: Probe link using existing parsing helpers
> > > >>   drm/dp: Read fast training capability from link
> > > >>   drm/dp: Read TPS3 capability from sink
> > > >>   drm/dp: Read channel coding capability from sink
> > > >>   drm/dp: Read alternate scrambler reset capability from sink
> > > >>   drm/dp: Read eDP version from DPCD
> > > >>   drm/dp: Read AUX read interval from DPCD
> > > >>   drm/dp: Do not busy-loop during link training
> > > >>   drm/dp: Use drm_dp_aux_rd_interval()
> > > >>   drm/dp: Add helper to get post-cursor adjustments
> > > >>   drm/dp: Set channel coding on link configuration
> > > >>   drm/dp: Enable alternate scrambler reset when supported
> > > >>   drm/dp: Add drm_dp_link_choose() helper
> > > >>   drm/dp: Add support for eDP link rates
> > > >>   drm/dp: Remove a gratuituous blank line
> > > >>   drm/bridge: tc358767: Use DP nomenclature
> > > >
> > > > Anyone interested in reviewing these?
> > > 
> > > Thierry, I don't quite know how to put this nicely, but I also don't
> > > think it's nice to not reply at all. So I'll try to be fair but it'll be
> > > blunt. Fair enough?
> > 
> > Fair enough.
> > 
> > > I've glanced over the series, already before you pinged for reviews. It
> > > looks like you've put effort into it, and it all looks nice. However, it
> > > does not look like we could use this in i915, without significant effort
> > > both on top of this work and in i915. It does not feel like there's any
> > > incentive for us to review this in detail.
> > > 
> > > It also feels like there's an increasing disconnect between "small" and
> > > "big" drivers (*) when it comes to handling DP link and training. It
> > > scares me a bit that this work is being done on the terms of the "small"
> > > drivers, and that later in time this might be considered the One True
> > > Way of handling DP.
> > 
> > I'm not sure I understand your concern here. The goal of the series is
> > primarily to extend the existing support for DP. It follows the pattern
> > established by existing helpers and then goes one step further and
> > provides some common way of actually storing the values that are being
> > read from the sink so that they can be used.
> > 
> > These are meant to be helpers and in no way should anyone feel obliged
> > to use them. If you've got this all figured out already, great! If you
> > do this already much better in i915, by all means stay away from this.
> > 
> > At the same time it seems counter-productive to write all of this code
> > as part of the Tegra DRM driver. In my opinion subsystems should provide
> > generic helpers that can help multiple drivers share code. This is
> > especially true for things that are defined in a specification because
> > there's not a lot of room for interpretation. The helpers in these
> > patches are meant to be that kind of helpers.
> > 
> > > One of the technical observations is that you fill the struct
> > > drm_dp_link and struct drm_dp_link_caps from the sink. It's not clear
> > > that the link caps really are an intersection of the source and sink
> > > caps. The eDP 1.4 link rates are the prime example. I think you should
> > > have sets of source and sink rates, and you should intersect those to
> > > find out the available link rates. The max rate is the highest number in
> > > that set. Similarly for many things, like training pattern support. I
> > > think it's only going to get more complicated with DP 2.0.
> > 
> > The idea here was to provide only helpers to collect the DPCD data
> > defined by the specification. Anything specific to the source is meant
> > to be handled by display driver. In case of eDP 1.4 link rates the code
> > will only add the rates read from DPCD. It's up to the driver to filter
> > out rates that it doesn't support from that list.
> > 
> > I think the fact that things will keep getting more complicated is an
> > argument in favour of sharing code rather than keep doing the same
> > (complicated) thing over and over again in every driver.
> > 
> > > Another pain point is the caching of the caps as bits in
> > > drm_dp_link_caps. How far are you going to take it? There's an insane
> > > and growing amount of things in the DPCD that describe the link in one
> > > way or another. Should they all be added to caps? Where do you draw the
> > > line? Do we add both the bit and the helper for getting that bit from
> > > the DPCD? And are you then going to add support for intersecting all
> > > those cap bits between the source and the sink?
> > 
> > Like I said the primary goal here is to have common code to read the
> > common values from DPCD. Once the link has been "probed" it is up to the
> > driver to do whatever it wants with that data.
> > 
> > Originally I had intended this shared code to do much more, but this was
> > shot down during review (I think by Daniel and yourself) for many of the
> > same reasons that you're pointing out. Initially there was code in this
> > series to standardize the link training sequence, for example. This was
> > all strictly according to the specification, so I thought that would
> > give us enough common ground for shared code. But you guys didn't agree,
> > so I've moved that out into Tegra specific patches since then.
> > 
> > As for how far to take this, I think the most sensible is to do what we
> > do everywhere else. We add to this whatever is needed on an on-demand
> > basis. The current series here adds what I found to be necessary to
> > support DP on Tegra. There's not a lot of fancy stuff here, I know, but
> > that doesn't mean this code is useless for everyone else.
> > 
> > So, can i915 use this? Probably yes. Would that be a good idea? Probably
> > not. And that's perfectly fine. But I could imagine that others may very
> > well want to use some shared code to avoid having to copy/paste code and
> > then later fix up cargo-culted bugs in every driver.
> > 
> > I'm also fully aware that this is not a lot and it may not be perfect.
> > But most helpers aren't initially. The point here is to start collecting
> > the common bits in one location and evolve them, just like we do for so
> > many other helpers.
> > 
> > Note also that I haven't made any attempt here to convert any drivers to
> > these helpers. That's because these are meant to be opt-in to simplify
> > drivers. If you want to do everything yourself, feel free to do that. It
> > is perfectly legit to do everything yourself if these helpers aren't
> > flexible enough to do what you want. The better option would be to help
> > improve the helpers to make them work for a wider range of drivers, but
> > if you don't want to, then don't.
> > 
> > > Overall I think there is value in unifying how we handle DP in drm. Even
> > > if just by providing helpers to simplify things in drivers. It's just
> > > that I feel this series isn't taking us closer to that goal, except for
> > > a subset of drivers. In the big picture, it may be increasing the
> > > divide.
> > 
> > So the bulk of this series is stuff that's purely parsing values from
> > DPCD, which is very much in line with existing helpers. I don't think
> > those are in any way contentious. There's also a bit of cleanup here
> > where new helpers are used to simplify existing ones. Maybe a handful
> > of these patches are what you claim might be "increasing the divide".
> > 
> > But I really don't understand where this is coming from. i915 doesn't
> > use a myriad of the other helpers (TTM, CMA, simple KMS, ...) and yet
> > these are not increasing any divide, are they? Why do you think these
> > helpers here are different?
> > 
> > Again, if you've got all of this implemented in i915 (or any of the
> > other "big" drivers), you probably want to stay away from these. But
> > does that mean everyone else has to go and figure all of this out from
> > scratch? Shouldn't we at least attempt to write common code? Or should
> > we all go and write our own DP stacks like the big drivers? I don't see
> > any advantage in that.
> > 
> > > If we get a confirmation from our drm overlords that drivers doing
> > > things the way they see fit in this regard is fine, then I'm okay with
> > > this. But I'm definitely not committing to switching to using the
> > > drm_dp_link structures and helpers in i915, quite the opposite actually.
> > 
> > I don't think anyone's going to force you to convert to the drm_dp_link
> > helpers if you don't want to. It's definitely not my intention to make
> > this "The One And Only Way To Do DP in DRM". The goal here is to create
> > helpers that can simplify adding DP support.
> > 
> > Now, if everyone else thinks the drm_dp_link helpers are a bad idea, I
> > will get over it and move this into Tegra code. But since we're being
> > blunt, I'd like to get a third (and ideally fourth) opinion on whether
> > we really want this stuff to be reinvented in every driver or whether
> > we want to try and come up with something that works for more than one
> > driver.
> > 
> > Thierry
> > 
> > > BR,
> > > Jani.
> > > 
> > > 
> > > (*) Please don't read too much into "small" and "big", just two groups
> > > of drivers handling things differently.
> 
> Dave, Daniel,
> 
> how can we make progress on this? Is it okay to go forward with this
> series if we agree that it's not going to be required for drivers to
> adopt it if they already have a working DP implementation?
> 
> If we can't agree on the struct drm_dp_link helpers, perhaps I should go
> and at least merge the additional DPCD parsing helpers. Those are very
> much in line with existing helpers. I could then move the drm_dp_link
> helpers into the Tegra driver and add replacement code to the other
> drivers that already use struct drm_dp_link. It'd be a shame to
> duplicate the code, but I'm willing to invest that additional work so
> that I can finally make progress on this series and the Tegra DP support
> that depends on this.

I ... don't know.

In general I think helpers are totally ok with being optional (that's the
point after all), but not for color choice reasons. And from very much
afar this feels a bit like that.

I also think that if we want smaller helpers for simpler drivers, it's
better to build that on top of the full-featured helpers and dumb them
down. This worked very well for simple display pipe (built on top of
atomic helpers) and simple vram support (built on top of ttm). Having two
distinct set of helpers for small and big drivers seems wrong.

I also think that the functions/control-flow/callbacks are the important
part of helpers, not really the data structures. Just having common
data structures gives you as much a mess as having a pile of
distinct implementations.

Aside from all these generic thoughts on helpers, for dp specifically I
think the proof of the pudding is in how it integrates with mst. If we
have dp helpers that work for mst (the mst vs sst case decision and
transitions are especially nasty in all drivers), then we can dumb it down
for simple drivers and modularize it for special cases like we do with
other helpers. Without that I fear we're just ending up in a dead-end (but
won't realize it until it's too late).

Finally I'm ok with no helpers in areas where we haven't figured out a
good solution yet. Bunch of copypasta is imo better than going the wrong
way collectively (since it prevents the experiments that might shine a
light on better solutions).

tldr; Still don't know.

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list