[igt-dev] [PATCH i-g-t] tests/kms_plane_cursor: Change API for collecting the CRC

Aurabindo Pillai aurabindo.pillai at amd.com
Thu Oct 20 20:04:31 UTC 2022



On 2022-10-20 07:27, Juha-Pekka Heikkila wrote:
> On 19.10.2022 21.38, Aurabindo Pillai wrote:
>>
>>
>> On 2022-10-18 13:18, Juha-Pekka Heikkila wrote:
>>> On 18.10.2022 19.09, Aurabindo Pillai wrote:
>>>>
>>>>
>>>> On 2022-10-15 16:30, Juha-Pekka Heikkila wrote:
>>>>> On 14.10.2022 21.49, Aurabindo Pillai wrote:
>>>>>> On AMD hw, igt_pipe_crc_get_current() does not work correctly, but
>>>>>> igt_pipe_crc_collect_crc() does. The latter is more robust and 
>>>>>> reports
>>>>>> the expected crc. This is due to a delay of 2 frames in the 
>>>>>> hardware for
>>>>>> crc capture.
>>>>>>
>>>>>> The following diff is an alternate fix instead of changing the API:
>>>>>>
>>>>>> diff --git a/lib/igt_debugfs.c b/lib/igt_debugfs.c
>>>>>> index fa1e3b69..dfcb2638 100644
>>>>>> --- a/lib/igt_debugfs.c
>>>>>> +++ b/lib/igt_debugfs.c
>>>>>> @@ -1061,6 +1061,10 @@ igt_pipe_crc_get_current(int drm_fd, 
>>>>>> igt_pipe_crc_t *pipe_crc, igt_crc_t *crc)
>>>>>>   {
>>>>>>          unsigned vblank = kmstest_get_vblank(drm_fd, 
>>>>>> pipe_crc->pipe, 0) + 1;
>>>>>>
>>>>>> +       /* AMD hw has an additional frame delay */
>>>>>> +       if (is_amdgpu_device(drm_fd))
>>>>>> +               vblank += 1;
>>>>>> +
>>>>>>          return igt_pipe_crc_get_for_frame(drm_fd, pipe_crc, 
>>>>>> vblank, crc);
>>>>>>   }
>>>>>>
>>>>>> Since the above solution adds device specific code into core IGT lib,
>>>>>> changing the API is a preferable solution.
>>>>>
>>>>> This sound like you are fixing driver bug in test suite. If pipe 
>>>>> crc doesn't match it mean rendered picture is wrong. If later crcs 
>>>>> match you're probably showing picture too early, I have no amd hw 
>>>>> at hand so I have no real idea what's going wrong.
>>>>
>>>> Looks like patchwork got confused. The hunk above is not part of the 
>>>> change and was just meant to show the underlying problem. Its either 
>>>> the above one, or the one below that fixes the issue.
>>>>
>>>> Since flipping and crc enablement happen asynchronously, more often 
>>>> than not -  we return an 'uncooked' crc on first frame probably 
>>>> because hw isn't ready yet. For this reason, we skip the first two 
>>>> CRC values. Its not a driver bug.
>>>
>>> If crc enablement is where problem is coming from would correct place 
>>> for amd related special case then be at igt_pipe_crc_start() ?
>>>
>>> If you look at that function you see also Intel hw need special 
>>> handling there with fifo underruns.
>>
>> Here is the case that fails:
>>
>> igt_pipe_crc_start()
>> igt_pipe_crc_get_current(ref_crc)
>> igt_pipe_crc_get_current(test_crc)
>> igt_pipe_crc_stop()
>>
>> Once I change the API like in this patch, this sequence becomes:
>>
>> igt_pipe_crc_start()
>> igt_pipe_crc_get_current(ref_crc)
>> igt_pipe_crc_stop()
>>
>> igt_pipe_crc_start()
>> igt_pipe_crc_get_current(test_crc)
>> igt_pipe_crc_stop()
>>
>> Since igt_pipe_crc_start() already calls an igt_pipe_crc_stop(), the 
>> openat syscall within igt_pipe_crc_start() is what helps in a pass, 
>> since inside the driver, we skip the first two CRCs when it's opened.
>>
>> The subsequent calls to igt_pipe_crc_get_current() should technically 
>> be correct, without having to require additional frame delays. 
>> However, cursor updates aren't synchronized with our atomic code path 
>> with the same frame. It's possible that they get deferred to the next.
>>
>> I think a proper fix would be to make the cursor programming an atomic 
>> update for AMDGPU, but that's not a trivial change. Someone else was 
>> working on this, though. Until that solution is ready, I'd like a 
>> device specific call to igt_pipe_crc_collect_crc() so that this test 
>> passes on AMD hw.
> 
> This sound similar issue as guys writing msm driver are having. Their 
> argument was on kms_cursor_crc legacy cursor api is not supposing to be 
> frame exact but they still wanted crc test to pass. You can see 
> discussion here

Sorry, I think my fingers skipped a crucial part in my response. I meant 
to say that cursor updates aren't synchronized with our atomic code path 
with the same frame.

But thanks for linking the other discussion. Skipping a vblank does 
help. I'll send a v4


More information about the igt-dev mailing list