[igt-dev] [i-g-t V3 1/3] tests/kms_vrr: Add Negative tests to validate VRR
Modem, Bhanuprakash
bhanuprakash.modem at intel.com
Fri Sep 30 07:57:44 UTC 2022
On Fri-30-09-2022 12:37 am, Navare, Manasi wrote:
> On Thu, Sep 29, 2022 at 01:45:45PM +0530, Bhanuprakash Modem wrote:
>> This patch will try to enable VRR on Non-VRR panel. VRR should
>> not be enabled on the Non-VRR panel. It is unlikely to reject the
>> commit/modeset. And the expected behavior is the same as disabling
>> VRR on a VRR capable panel.
>>
>> V2, V3:
>> - Fix the condition check to run basic tests
>>
>> Cc: Manasi Navare <manasi.d.navare at intel.com>
>> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
>
> This now looks good to me
> Do you think, we need to add dmesg debug print in the kernel for this
> condition saying enabling without VRR?
I think it would be good if we have that debug print.
- Bhanu
>
> Reviewed-by: Manasi Navare<manasi.d.navare at intel.com>
>
> Manasi
>
>> ---
>> tests/kms_vrr.c | 66 ++++++++++++++++++++++++++++++++++++-------------
>> 1 file changed, 49 insertions(+), 17 deletions(-)
>>
>> diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
>> index 8976d4a6..3aa9920a 100644
>> --- a/tests/kms_vrr.c
>> +++ b/tests/kms_vrr.c
>> @@ -41,10 +41,11 @@
>> (m)->type, (m)->flags
>>
>> enum {
>> - TEST_NONE = 0,
>> - TEST_DPMS = 1 << 0,
>> - TEST_SUSPEND = 1 << 1,
>> - TEST_FLIPLINE = 1 << 2,
>> + TEST_BASIC = 1 << 0,
>> + TEST_DPMS = 1 << 1,
>> + TEST_SUSPEND = 1 << 2,
>> + TEST_FLIPLINE = 1 << 3,
>> + TEST_NEGATIVE = 1 << 4,
>> };
>>
>> typedef struct range {
>> @@ -179,11 +180,16 @@ static vtest_ns_t get_test_rate_ns(range_t range)
>> return vtest_ns;
>> }
>>
>> -/* Returns true if an output supports VRR. */
>> +/* Returns true if driver supports VRR. */
>> static bool has_vrr(igt_output_t *output)
>> {
>> - return igt_output_has_prop(output, IGT_CONNECTOR_VRR_CAPABLE) &&
>> - igt_output_get_prop(output, IGT_CONNECTOR_VRR_CAPABLE);
>> + return igt_output_has_prop(output, IGT_CONNECTOR_VRR_CAPABLE);
>> +}
>> +
>> +/* Returns true if an output supports VRR. */
>> +static bool vrr_capable(igt_output_t *output)
>> +{
>> + return igt_output_get_prop(output, IGT_CONNECTOR_VRR_CAPABLE);
>> }
>>
>> /* Toggles variable refresh rate on the pipe. */
>> @@ -398,7 +404,8 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
>> * Flip will happen right away so returned refresh rate is 50Hz.
>> * if refresh_rate < 40Hz:
>> * h/w will terminate the vblank at Vmax which is obvious.
>> - * So, for now we can safely ignore the lower refresh rates
>> + * So, vblank termination should happen at Vmax, and flip done at
>> + * next Vmin.
>> */
>> if (flags & TEST_FLIPLINE) {
>> rate = rate_from_refresh(range.max + 5);
>> @@ -408,17 +415,31 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
>> (range.max + 5), rate, result);
>> }
>>
>> - rate = vtest_ns.mid;
>> - result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
>> - igt_assert_f(result > 75,
>> - "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
>> - ((range.max + range.min) / 2), rate, result);
>> + if (flags & ~TEST_NEGATIVE) {
>> + rate = vtest_ns.mid;
>> + result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
>> + igt_assert_f(result > 75,
>> + "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
>> + ((range.max + range.min) / 2), rate, result);
>>
>> - set_vrr_on_pipe(data, pipe, false);
>> + rate = rate_from_refresh(range.min - 5);
>> + result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
>> + igt_assert_f(result < 50,
>> + "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR on threshold exceeded, result was %u%%\n",
>> + (range.min - 5), rate, result);
>> + }
>> +
>> + /*
>> + * If we request VRR on a non-VRR panel, it is unlikely to reject the
>> + * modeset. And the expected behavior is the same as disabling VRR on
>> + * a VRR capable panel.
>> + */
>> + set_vrr_on_pipe(data, pipe, (flags & TEST_NEGATIVE)? true : false);
>> + rate = vtest_ns.mid;
>> result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
>> igt_assert_f(result < 10,
>> - "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR off threshold exceeded, result was %u%%\n",
>> - ((range.max + range.min) / 2), rate, result);
>> + "Refresh rate (%u Hz) %"PRIu64"ns: Target VRR %s threshold exceeded, result was %u%%\n",
>> + ((range.max + range.min) / 2), rate, (flags & TEST_NEGATIVE)? "on" : "off", result);
>>
>> /* Clean-up */
>> igt_plane_set_fb(data->primary, NULL);
>> @@ -442,6 +463,13 @@ run_vrr_test(data_t *data, test_t test, uint32_t flags)
>> if (!has_vrr(output))
>> continue;
>>
>> + /* For Negative tests, panel should be non-vrr. */
>> + if ((flags & TEST_NEGATIVE) && vrr_capable(output))
>> + continue;
>> +
>> + if ((flags & ~TEST_NEGATIVE) && !vrr_capable(output))
>> + continue;
>> +
>> for_each_pipe(&data->display, pipe) {
>> if (igt_pipe_connector_valid(pipe, output)) {
>> igt_dynamic_f("pipe-%s-%s",
>> @@ -470,7 +498,7 @@ igt_main
>> igt_describe("Tests that VRR is enabled and that the difference between flip "
>> "timestamps converges to the requested rate");
>> igt_subtest_with_dynamic("flip-basic")
>> - run_vrr_test(&data, test_basic, 0);
>> + run_vrr_test(&data, test_basic, TEST_BASIC);
>>
>> igt_describe("Tests with DPMS that VRR is enabled and that the difference between flip "
>> "timestamps converges to the requested rate.");
>> @@ -486,6 +514,10 @@ igt_main
>> igt_subtest_with_dynamic("flipline")
>> run_vrr_test(&data, test_basic, TEST_FLIPLINE);
>>
>> + igt_describe("Make sure that VRR should not be enabled on the Non-VRR panel.");
>> + igt_subtest_with_dynamic("negative-basic")
>> + run_vrr_test(&data, test_basic, TEST_NEGATIVE);
>> +
>> igt_fixture {
>> igt_display_fini(&data.display);
>> }
>> --
>> 2.37.3
>>
More information about the igt-dev
mailing list