[igt-dev] [PATCH i-g-t v1] tests/kms_universal_plane: Skip pageflip_test_pipe subtest if pipe has more than 1 primary plane

Rob Clark robdclark at chromium.org
Tue May 3 03:36:03 UTC 2022


On Mon, May 2, 2022 at 4:08 PM Abhinav Kumar <quic_abhinavk at quicinc.com> wrote:
>
>
>
> On 5/2/2022 3:42 PM, Rob Clark wrote:
> > On Mon, May 2, 2022 at 3:31 PM Jessica Zhang <quic_jesszhan at quicinc.com> wrote:
> >>
> >>
> >>
> >> On 5/2/2022 2:50 PM, Rob Clark wrote:
> >>> On Thu, Apr 28, 2022 at 6:11 PM Jessica Zhang <quic_jesszhan at quicinc.com> wrote:
> >>>>
> >>>> Currently, IGT assumes that the first primary plane it encounters in
> >>>> display->planes is the primary plane being assigned to the current pipe
> >>>> in the driver [1]. However, this is not always the case when planes are
> >>>> being shared between pipes and there are multiple possible primary
> >>>> planes.
> >>>
> >>> I wonder if it is actually worse than that.. igt_pipe_t seems designed
> >>> around the idea that CRTCs have exclusive ownership of planes.  Not
> >>> sure if there are any tests that drive multiple CRTCs at the same
> >>> time, which could end up trying to use the same plane on multiple
> >>> pipes..
> >>>
> >>> BR,
> >>> -R
> >> Yep, there are at least a few cases in kms_atomic_transition where, with
> >> DP connected, IGT will try to do a commit for 2 CRTCs within the same
> >> commit [1]. Planning to submit a patch addressing that after we sort out
> >> the shared planes-related failures for the no DP case.
> >
> > Ok.. then perhaps until igt handles planes that can move between CRTCs
> > better, we should statically assign planes to no more than a single
> > pipe in igt_display_require()?  I _think_ that would solve both
> > issues..
> >
> > BR,
> > -R
>
> There are two concerns / issues with this:
>
> 1) How would we know which planes to assign to which pipe?
> Today we use possible_crtcs and both the crtcs are listed for the plane
> in the possible_crtcs.
>
> 2) Even if we assign one of the primary planes like IGT does today, we
> do not know if whatever we picked is what was selected even in the driver.
>
> The only way to reliably do this is if driver exposes something like
> "primary_plane_id" in the drm_mode_crtc?

no, I don't think we need new uabi for this.. just for igl to assign
planes to pipes in a sort of round-robin fashion.

BR,
-R

> 111 struct drm_mode_crtc {
> 112     __u64 set_connectors_ptr;
> 113     __u32 count_connectors;
> 114
> 115     __u32 crtc_id; /**< Id */
> 116     __u32 fb_id; /**< Id of framebuffer */
> 117
> 118     __u32 x, y; /**< Position on the frameuffer */
> 119
> 120     __u32 gamma_size;
> 121     __u32 mode_valid;
> 122     struct drm_mode_modeinfo mode;
> 123 };
>
> >
> >> (BTW, to elaborate some more on the issue we were facing with this
> >> subtest on trogdor: an -EBUSY was being thrown from the page flip ioctl
> >> [2] because we were assigning an fb to an unused primary plane.)
> >>
> >> Best,
> >>
> >> Jessica Zhang
> >>
> >> [1]
> >> https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/tests/kms_atomic_transition.c#L709
> >> (note: `mask` in this method is a mask for which CRTC to commit to, and
> >> with DP connected it can go up to 3)
> >>
> >> [2]
> >> https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/commit/ed944b45563c694dc6373bc48dc83b8ba7edb19f
> >>
> >>>
> >>>> It's possible for IGT to set pipe->plane_primary to a primary plane
> >>>> that's different from the one being used in the driver, since IGT uses
> >>>> possible_crtcs to find the primary planes and stops at the first match.
> >>>>
> >>>> Unfortunately, DRM doesn't expose which primary plane is being used by a
> >>>> pipe, so let's skip pageflip_test_pipe for cases where there are
> >>>> multiple possible primary planes.
> >>>>
> >>>> [1]
> >>>> https://gitlab.freedesktop.org/drm/igt-gpu-tools/-/blob/master/lib/igt_kms.c#L2305
> >>>>
> >>>> Signed-off-by: Jessica Zhang <quic_jesszhan at quicinc.com>
> >>>> ---
> >>>>    tests/kms_universal_plane.c | 14 +++++++++++++-
> >>>>    1 file changed, 13 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/tests/kms_universal_plane.c b/tests/kms_universal_plane.c
> >>>> index 3cb6d704a6ef..95cae2be1aaf 100644
> >>>> --- a/tests/kms_universal_plane.c
> >>>> +++ b/tests/kms_universal_plane.c
> >>>> @@ -470,13 +470,25 @@ static void
> >>>>    pageflip_test_pipe(data_t *data, enum pipe pipe, igt_output_t *output)
> >>>>    {
> >>>>           pageflip_test_t test = { .data = data };
> >>>> -       igt_plane_t *primary;
> >>>> +       igt_plane_t *primary, *plane;
> >>>>           struct timeval timeout = { .tv_sec = 0, .tv_usec = 500 };
> >>>>           drmEventContext evctx = { .version = 2 };
> >>>>
> >>>>           fd_set fds;
> >>>> +       int primary_plane_count = 0;
> >>>>           int ret = 0;
> >>>>
> >>>> +       for_each_plane_on_pipe(&data->display, pipe, plane)
> >>>> +               if (plane->type == DRM_PLANE_TYPE_PRIMARY)
> >>>> +                       primary_plane_count++;
> >>>> +
> >>>> +       /*
> >>>> +        * Skip subtest when there are multiple primary planes since we
> >>>> +        * aren't able to distinguish which primary plane is actually being
> >>>> +        * assigned a pipe
> >>>> +        */
> >>>> +       igt_skip_on(primary_plane_count > 1);
> >>>> +
> >>>>           igt_require_pipe(&data->display, pipe);
> >>>>
> >>>>           igt_output_set_pipe(output, pipe);
> >>>> --
> >>>> 2.31.0
> >>>>


More information about the igt-dev mailing list