Re: drm state readout helpers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, May 15, 2020 at 04:51:53PM +0300, Ville Syrjälä wrote:
> On Fri, May 15, 2020 at 03:36:13PM +0200, Daniel Vetter wrote:
> > Hi all,
> > 
> > Maxime seems to have a need for a bit more than what the current
> > drm_mode_config_reste can do, so here's a bunch of ideas inspired by
> > i915.
> > 
> > I think minimally what you need is a drm_atomic_state_helper_readout()
> > functions, which instead of resetting, allocates all the obj->state
> > pointers and fills them out. For that I think the simplest is to add
> > atomic_readout_state functions to crtc, connector and plane (if you
> > want to take over the firmware fb allocation too), which take as
> > parameter the object, and return the read-out state. Important, they
> > must _not_ touch anything persistent, otherwise the following stuff
> > here doesn't work.
> > 
> > Next up is the challenge of bridges and encoders. If the goal is to
> > properly shut down encoders/bridges, they also need their state. And
> > on most hw, they need a mix of the crtc and connector state, so best
> > to pass both of those (plus bridge state for bridges) to them. You can
> > do that if we assume that connector_helper_funcs->atomic_readout_state
> > sets the drm_connector_state->crtc pointer correctly. So the
> > drm_atomic_state_helper_readout function would first loop through
> > connectors and crtcs, and then loop through encoders and bridges to
> > fill in the gaps. Last you probably want to go through planes.
> > 
> > Now even more fun hw will have trouble and might need to look up
> > random other objects to set stuff, so we need a drm_atomic_state
> > structure to tie all these things together. For reasons that will
> > become obvious later on these read-out states should be stored in the
> > old_ state pointers.
> > 
> > Finally we need the actual helper which takes that read-out state and
> > smashes it into the real obj->state pointers, essentially a swap_state
> > but in reverse (since we need to write the old_ state pointers into
> > obj->state).
> > 
> > One thing i915 does, but I don't think is really needed: We read out
> > the connector->crtc routing as a first step, and once we have that, we
> > read out the connector/encoder/crtc steps. I think if you first read
> > out (and hence allocate) crtrc states, and then connector, and then
> > encoder/bridges that should work, and simplifies the flow a bit. So we
> > need another drm_atomic_state_helper_reset_to_readout or whatever,
> > which uses _readout and then does the reverse swap. Drivers call this
> > instead of drm_mode_config_reset.
> > 
> > Now the real issue: How do you make sure this actually works? Testing
> > with different fw configurations is usually impossible, you cant
> > easily tell the firmware to boot with different modes. Or at least
> > it's cumbersome since manual testing and lots of reboots. Waiting for
> > bug reports and then fixing them, while probably breaking something
> > else is a game of whack-a-mole.
> > 
> > So what i915 does is read out the hw state on every nonblocking
> > modeset (the additional time spent doesn't matter), but _only_ for the
> > objects touched in that modeset state. This is why you need to read
> > out into old_ state pointers, since after a blocking modeset those are
> > unused and available.
> 
> I have a feeling this old vs. new thing is still going to bite
> someone. But atm don't really have any sane alternative ideas.
> 
> Hmm, maybe we could at least tag the atomic_state as "readout only"
> for the duration of the actual readout and WARN/fail if anyone does
> drm_atomic_get_new_foo_state() and for_each_new/oldnew...() on it?

Oh, and I also had some fun with the readout overwriting
old_crtc_state->commit when I playing around with vblank workers.
I'm not even sure why that doesn't blow up currently as well. 

I think we should try to remove that confusing new_crtc_state->commit
vs. old_crtc_state->commit switcheroo. But I have a feeling that is
going to require quite a few changes since I guess it's the
old_crtc_state that currently gets plumbed into various places.

Another related annoyance is the old_foo_state->state vs.
new_foo_state->state which routinely trips up people with null ptr
derefs.

I guess trying to type up some cocci to plumb drm_atomic_state
everywhere might be a start...

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux