Do we really need to increase/decrease MST VC payloads?

Lin, Wayne Wayne.Lin at amd.com
Thu May 5 10:02:15 UTC 2022


[Public]

Hi Lyude,

Thanks for raising this!
Please see my comments inline : )
________________________________________
> From: Zuo, Jerry <Jerry.Zuo at amd.com>
> Sent: Thursday, May 5, 2022 10:30
> To: Lyude Paul; Lin, Wayne; Wentland, Harry; amd-gfx at lists.freedesktop.org
> Subject: RE: Do we really need to increase/decrease MST VC payloads?
>
> [AMD Official Use Only - General]
>
> Hi Lyude:
>
>      Sorry for replying late.
>
>      1. The payload increase/decrease routines are not for DP2.
>      2. mst_bw_update is not used in amdgpu_dm, so those two functions are not getting used for now. I leave it there simply for future possible hook up.
>
> Regards,
> Jerry
>
> > -----Original Message-----
> > From: Lyude Paul <lyude at redhat.com>
> > Sent: Wednesday, May 4, 2022 5:17 PM
> > To: Lin, Wayne <Wayne.Lin at amd.com>; Wentland, Harry
> > <Harry.Wentland at amd.com>; amd-gfx at lists.freedesktop.org; Zuo, Jerry
> > <Jerry.Zuo at amd.com>
> > Subject: Re: Do we really need to increase/decrease MST VC payloads?
> >
> > Some good news: I actually came up with a way of handling this in the new
> > MST code pretty nicely, so I think we should be able to move forward
> > without having to disable this (although it would be very nice to know
> > whether or not this is necessary for amdgpu to work, since it'd still be nice to
> > split this into separate changes to make reviewing my big MST patch series
> > easier. More comments down below:
> >
> > On Mon, 2022-05-02 at 18:40 -0400, Lyude Paul wrote:
> > > Hi! So I kinda hate to ask this, but finding this in amdgpu completely
> > > took me by surprise and unfortunately is (while technically correct)
> > > an enormous pain and not really necessary as far as I'm aware.
> > >
> > > So: it seems that amdgpu is currently the only driver that not only
> > > allocates/deallocates payloads, but it also increases/decreases the
> > > size of payloads as well. This was added in:
> > >
> > >    d740e0bf8ed4 ("drm/amd/display: Add DP 2.0 MST DC Support")
> > >
> > > This is fine, except that it's totally not at all a situation that the
> > > current payload management code we have (which, is the first place
> > > this should have been implemented) knows how to handle, because every
> > > other driver simply allocates/releases payloads. Having to increase
> > > the size of payloads means that we no longer can count on the payload
> > > table being contiguous, and means we have to resort to coming up with
> > > a more complicated solution to actually do payload management
> > > atomically.
> > >
> > > I'm willing to try to do that (it should be doable by using bitmasks
> > > to track non-contiguous allocated slots), but considering:
> > >  * This isn't actually needed for DP 2.0 to work as far as I'm aware
> > > (if I'm
> > >    wrong please correct me! but I see no issue with just deallocating
> > > and
> > >    allocating payloads). It's nice to have, but not necessary.
> > >  * This was from the DSC MST series, which included a lot of code that
> > > I
> > >    mentioned at the time needed to not live in amdgpu and be moved
> > > into other
> > >    helpers. That hasn't really happened yet, and there are no signs of
> > > it
> > >    happening from amd's side - and I just plain do not want to have to
> > > be the
> > >    person to do that when I can help it. Going through amdgpu takes a
> > > serious
> > >    amount of energy because of all of the abstraction layers, enough
> > > so I
> > >    honestly didn't even notice this VC table change when I looked at
> > > the
> > >    series this was from. (Or maybe I did, but didn't fully grasp what
> > > was
> > >    changing at the time :\).
> > >  * Also on that note, are we even sure that this works with subsequent
> > > VC
> > >    changes? E.g. has anyone tested this with physical hardware? I
> > > don't know
> > >    that I actually have the hardware to test this out, but
> > >    drm_dp_update_payload*() absolutely doesn't understand
> > > non-contiguous
> > >    payloads which I would think could lead to the VCPI start slots
> > > getting
> > >    miscalculated if a payload increase/decreases (happy to give
> > > further
> > >    explanation on this if needed). Note if this is the case, please
> > > hold off a
> > >    bit before trying to fix it and consider just not doing this for
> > > the time
> > >    being.
> >
> > Sorry for being a bit vague with this! I typed this email at the end of the
> > workday and didn't feel like going super into detail on this. So I guess I'll do
> > that now (hopefully I didn't misread the MST spec
> > somewhere):
> >
> > For reference: the issue I was mentioning here was regarding the fact that
> > the current payload management code we have doesn't keep track of exactly
> > which VC slots are in use by a payload at any given time - only the starting
> > slots and total slot counts of each payload. Which means that once we
> > increase a MST payload, since the additional VC slots will be put at the end of
> > the VC table regardless of the start of the payload. As such, it's possible that
> > said payload will no longer be contiguous. An example, note for simplicity
> > sake this example pretends we only have 8 VC slots instead of 64:
> >
> > Payloads: #1 == 2 slots, #2 == 1 slot, #3 == 2 slots
> >
> > VC table looks like this, where each number corresponds to a VCPI and X
> > means unused:
> >
> >         |1 1 2 3 3 X X X|
> >
> > We decide we need to increase payload #1 from 2 slots to 3. The MST spec
> > mandates that new slots always are added to the end, so we end up with this
> > surprising VC table:

I think this shouldn't happen. Please refer to the figure 2-98 of DP spec 1.4.
The payload id table should be changed to below I think.

        |1 1 1 2 3 3 X X|

I skimmed over a bit of the implementation in drm. I think it should work fine
except that we have to revise function drm_dp_init_vcpi() a bit.
Since increasing/decreasing time slots should still use the same payload id,
we should add logic to skip trying to assign a new payload id under this case.

> >
> >         |1 1 2 3 3 1 X X|
> >
> > Now, let's say we increase payload #2 to 2 slots:
> >
> >         |1 1 2 3 3 1 2 X|
> >
> > Surprise - the monitor for payload #1 was unplugged, so we need to remove
> > it's payload. Note the MST spec doesn't allow holes between allocations, and
> > makes branches repsonsible for automatically moving payloads to fill in the
> > gaps which we have to keep track of locally.
> > Normally the handling of holes would be fine, as our current payload
> > management code loops through each payload to fill in any holes. But these
> > payloads aren't contiguous and we only kept track of their start slots and
> > total slot counts. So we would end up thinking we now have a VC table like
> > this:
> >
> >         |2 2 3 3 X X X X|
> >
> > But that's wrong, in reality the table will look like this on the MST
> > hub:
> >
> >         |2 3 3 2 X X X X|
> >
> > Now things are broken, because we now have the wrong start slot for
> > payload #3.
> >
> > Just figured I'd clarify :). if anyone is curious, I ended up fixing this by adding
> > a bitmask of assigned VC slots to our atomic payload struct - and using that
> > to keep track of the current start slots for each payload. Since we have a max
> > of 64 VC slots which fits into a u64, this works rather elegantly!
> >
> > >
> > > I'd /very/ much like to just disable this behavior for the time being
> > > (not the whole commit for DP 2.0 support since that'd be unreasonable,
> > > just the increase/decrease payload changes), and eventually have
> > > someone just implement this the proper way by adding support for this
> > > into the MST helpers and teaching them how to handle non-contiguous
> > > payloads. I'm happy to leave as much of the code intact as possible
> > > (maybe with #if 0 or whatever), and ideally just add some code
> > > somewhere to avoid increasing/decreasing payloads without a full
> > > modeset.
> > >
> > > FWIW, the WIP of my atomic MST work is here:
> > >
> > > https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgitl
> > > ab.freedesktop.org%2Flyudess%2Flinux%2F-%2Fcommits%2Fwip%2Fmst-
> > atomic-
> > > only-
> > v1&data=05%7C01%7Cjerry.zuo%40amd.com%7Cf669121b53414c0dbc9
> > 40
> > >
> > 8da2e137e85%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C6378
> > 729585141
> > >
> > 60092%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2lu
> > MzIiLCJB
> > >
> > TiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=IBn%2BF5
> > 0r9WIeUfG
> > > 9MUGStbACr5Kolu3PB5K0dyiiYwg%3D&reserved=0
> > >
> > > I already have i915 and nouveau working with these changes JFYI.
> >
> > --
> > Cheers,
> >  Lyude Paul (she/her)
> >  Software Engineer at Red Hat

--
Regards,
Wayne Lin


More information about the amd-gfx mailing list