* [igt-dev] ✓ Fi.CI.BAT: success for New subtest for VRR Flipline mode (rev5)
2020-09-24 14:48 [igt-dev] [v4 0/2] New subtest for VRR Flipline mode bhanuprakash.modem
@ 2020-09-24 7:46 ` Patchwork
2020-09-24 9:15 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2020-09-24 7:46 UTC (permalink / raw)
To: bhanuprakash.modem; +Cc: igt-dev
[-- Attachment #1.1: Type: text/plain, Size: 7799 bytes --]
== Series Details ==
Series: New subtest for VRR Flipline mode (rev5)
URL : https://patchwork.freedesktop.org/series/77128/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_9045 -> IGTPW_5008
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
Known issues
------------
Here are the changes found in IGTPW_5008 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_flink_basic@flink-lifetime:
- fi-tgl-y: [PASS][1] -> [DMESG-WARN][2] ([i915#402])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-tgl-y/igt@gem_flink_basic@flink-lifetime.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-tgl-y/igt@gem_flink_basic@flink-lifetime.html
* igt@i915_module_load@reload:
- fi-tgl-y: [PASS][3] -> [DMESG-WARN][4] ([i915#1982] / [k.org#205379])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-tgl-y/igt@i915_module_load@reload.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-tgl-y/igt@i915_module_load@reload.html
* igt@i915_pm_rpm@module-reload:
- fi-bsw-n3050: [PASS][5] -> [DMESG-WARN][6] ([i915#1982])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-bsw-n3050/igt@i915_pm_rpm@module-reload.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-bsw-n3050/igt@i915_pm_rpm@module-reload.html
* igt@kms_chamelium@common-hpd-after-suspend:
- fi-kbl-7500u: [PASS][7] -> [DMESG-WARN][8] ([i915#2203])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-7500u/igt@kms_chamelium@common-hpd-after-suspend.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-7500u/igt@kms_chamelium@common-hpd-after-suspend.html
* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic:
- fi-bsw-kefka: [PASS][9] -> [DMESG-WARN][10] ([i915#1982])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-bsw-kefka/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-bsw-kefka/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-atomic.html
* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-icl-u2: [PASS][11] -> [DMESG-WARN][12] ([i915#1982])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-icl-u2/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-icl-u2/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html
* igt@kms_psr@primary_page_flip:
- fi-tgl-y: [PASS][13] -> [DMESG-WARN][14] ([i915#1982])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-tgl-y/igt@kms_psr@primary_page_flip.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-tgl-y/igt@kms_psr@primary_page_flip.html
* igt@vgem_basic@unload:
- fi-kbl-x1275: [PASS][15] -> [DMESG-WARN][16] ([i915#62] / [i915#92])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-x1275/igt@vgem_basic@unload.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-x1275/igt@vgem_basic@unload.html
#### Possible fixes ####
* {igt@core_hotunplug@unbind-rebind}:
- fi-kbl-x1275: [DMESG-WARN][17] ([i915#62] / [i915#92] / [i915#95]) -> [PASS][18]
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-x1275/igt@core_hotunplug@unbind-rebind.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-x1275/igt@core_hotunplug@unbind-rebind.html
* igt@debugfs_test@read_all_entries:
- {fi-kbl-7560u}: [INCOMPLETE][19] ([i915#2417]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-7560u/igt@debugfs_test@read_all_entries.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-7560u/igt@debugfs_test@read_all_entries.html
* igt@gem_tiled_fence_blits@basic:
- fi-tgl-y: [DMESG-WARN][21] ([i915#402]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-tgl-y/igt@gem_tiled_fence_blits@basic.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-tgl-y/igt@gem_tiled_fence_blits@basic.html
* igt@kms_flip@basic-flip-vs-wf_vblank@b-edp1:
- fi-icl-u2: [DMESG-WARN][23] ([i915#1982]) -> [PASS][24] +1 similar issue
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-icl-u2/igt@kms_flip@basic-flip-vs-wf_vblank@b-edp1.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-icl-u2/igt@kms_flip@basic-flip-vs-wf_vblank@b-edp1.html
#### Warnings ####
* igt@i915_pm_rpm@basic-pci-d3-state:
- fi-tgl-y: [DMESG-WARN][25] ([i915#1982] / [i915#2411]) -> [DMESG-WARN][26] ([i915#2411])
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-tgl-y/igt@i915_pm_rpm@basic-pci-d3-state.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-tgl-y/igt@i915_pm_rpm@basic-pci-d3-state.html
* igt@i915_pm_rpm@module-reload:
- fi-kbl-x1275: [DMESG-FAIL][27] ([i915#62]) -> [DMESG-FAIL][28] ([i915#62] / [i915#95])
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-x1275/igt@i915_pm_rpm@module-reload.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-x1275/igt@i915_pm_rpm@module-reload.html
* igt@kms_flip@basic-flip-vs-dpms@a-dp1:
- fi-kbl-x1275: [DMESG-WARN][29] ([i915#62] / [i915#92]) -> [DMESG-WARN][30] ([i915#62] / [i915#92] / [i915#95])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-x1275/igt@kms_flip@basic-flip-vs-dpms@a-dp1.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-x1275/igt@kms_flip@basic-flip-vs-dpms@a-dp1.html
* igt@kms_force_connector_basic@force-edid:
- fi-kbl-x1275: [DMESG-WARN][31] ([i915#62] / [i915#92] / [i915#95]) -> [DMESG-WARN][32] ([i915#62] / [i915#92]) +6 similar issues
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/fi-kbl-x1275/igt@kms_force_connector_basic@force-edid.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/fi-kbl-x1275/igt@kms_force_connector_basic@force-edid.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
[i915#2203]: https://gitlab.freedesktop.org/drm/intel/issues/2203
[i915#2411]: https://gitlab.freedesktop.org/drm/intel/issues/2411
[i915#2417]: https://gitlab.freedesktop.org/drm/intel/issues/2417
[i915#402]: https://gitlab.freedesktop.org/drm/intel/issues/402
[i915#62]: https://gitlab.freedesktop.org/drm/intel/issues/62
[i915#92]: https://gitlab.freedesktop.org/drm/intel/issues/92
[i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95
[k.org#205379]: https://bugzilla.kernel.org/show_bug.cgi?id=205379
Participating hosts (46 -> 40)
------------------------------
Missing (6): fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-byt-clapper fi-bdw-samus
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5787 -> IGTPW_5008
CI-20190529: 20190529
CI_DRM_9045: c090e19126310a35b72cafa971bdbdfa1c5c87db @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_5008: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
IGT_5787: 0ec962017c8131de14e0cb038f7f76b1f17ed637 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@kms_vrr@flipline
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
[-- Attachment #1.2: Type: text/html, Size: 10302 bytes --]
[-- Attachment #2: Type: text/plain, Size: 154 bytes --]
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* [igt-dev] ✓ Fi.CI.IGT: success for New subtest for VRR Flipline mode (rev5)
2020-09-24 14:48 [igt-dev] [v4 0/2] New subtest for VRR Flipline mode bhanuprakash.modem
2020-09-24 7:46 ` [igt-dev] ✓ Fi.CI.BAT: success for New subtest for VRR Flipline mode (rev5) Patchwork
@ 2020-09-24 9:15 ` Patchwork
2020-09-24 14:48 ` [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip bhanuprakash.modem
2020-09-24 14:48 ` [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode bhanuprakash.modem
3 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2020-09-24 9:15 UTC (permalink / raw)
To: bhanuprakash.modem; +Cc: igt-dev
[-- Attachment #1.1: Type: text/plain, Size: 13614 bytes --]
== Series Details ==
Series: New subtest for VRR Flipline mode (rev5)
URL : https://patchwork.freedesktop.org/series/77128/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_9045_full -> IGTPW_5008_full
====================================================
Summary
-------
**WARNING**
Minor unknown changes coming with IGTPW_5008_full need to be verified
manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_5008_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_5008_full:
### IGT changes ###
#### Possible regressions ####
* {igt@kms_vrr@flipline} (NEW):
- shard-tglb: NOTRUN -> [SKIP][1]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-tglb6/igt@kms_vrr@flipline.html
- shard-iclb: NOTRUN -> [SKIP][2]
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb3/igt@kms_vrr@flipline.html
#### Warnings ####
* igt@kms_ccs@pipe-d-crc-primary-basic:
- shard-hsw: [SKIP][3] ([fdo#109271]) -> [INCOMPLETE][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-hsw2/igt@kms_ccs@pipe-d-crc-primary-basic.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-hsw1/igt@kms_ccs@pipe-d-crc-primary-basic.html
New tests
---------
New tests have been introduced between CI_DRM_9045_full and IGTPW_5008_full:
### New IGT tests (1) ###
* igt@kms_vrr@flipline:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_5008_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_exec_reloc@basic-many-active@rcs0:
- shard-apl: [PASS][5] -> [FAIL][6] ([i915#1635] / [i915#2389])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-apl6/igt@gem_exec_reloc@basic-many-active@rcs0.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-apl8/igt@gem_exec_reloc@basic-many-active@rcs0.html
* igt@gem_exec_whisper@basic-fds-forked-all:
- shard-glk: [PASS][7] -> [DMESG-WARN][8] ([i915#118] / [i915#95])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk2/igt@gem_exec_whisper@basic-fds-forked-all.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk3/igt@gem_exec_whisper@basic-fds-forked-all.html
* igt@kms_big_fb@yf-tiled-32bpp-rotate-270:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([i915#1635] / [i915#1982]) +3 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-apl2/igt@kms_big_fb@yf-tiled-32bpp-rotate-270.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-apl7/igt@kms_big_fb@yf-tiled-32bpp-rotate-270.html
* igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1:
- shard-glk: [PASS][11] -> [FAIL][12] ([i915#2122])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk8/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk4/igt@kms_flip@flip-vs-expired-vblank@a-hdmi-a1.html
* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes:
- shard-kbl: [PASS][13] -> [INCOMPLETE][14] ([i915#155])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-kbl4/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-kbl6/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-c-planes.html
* igt@kms_plane_cursor@pipe-b-overlay-size-128:
- shard-snb: [PASS][15] -> [SKIP][16] ([fdo#109271])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-snb5/igt@kms_plane_cursor@pipe-b-overlay-size-128.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-snb1/igt@kms_plane_cursor@pipe-b-overlay-size-128.html
* igt@kms_psr@psr2_sprite_mmap_gtt:
- shard-iclb: [PASS][17] -> [SKIP][18] ([fdo#109441]) +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb2/igt@kms_psr@psr2_sprite_mmap_gtt.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb5/igt@kms_psr@psr2_sprite_mmap_gtt.html
* igt@kms_vblank@pipe-a-ts-continuation-suspend:
- shard-kbl: [PASS][19] -> [DMESG-WARN][20] ([i915#180]) +4 similar issues
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-kbl1/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-kbl1/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
* igt@kms_vblank@pipe-b-wait-busy:
- shard-kbl: [PASS][21] -> [DMESG-WARN][22] ([i915#1982])
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-kbl1/igt@kms_vblank@pipe-b-wait-busy.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-kbl6/igt@kms_vblank@pipe-b-wait-busy.html
* igt@kms_vblank@pipe-c-wait-busy:
- shard-tglb: [PASS][23] -> [DMESG-WARN][24] ([i915#1982])
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-tglb8/igt@kms_vblank@pipe-c-wait-busy.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-tglb2/igt@kms_vblank@pipe-c-wait-busy.html
#### Possible fixes ####
* igt@gem_exec_whisper@basic-queues-priority:
- shard-glk: [DMESG-WARN][25] ([i915#118] / [i915#95]) -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk7/igt@gem_exec_whisper@basic-queues-priority.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk5/igt@gem_exec_whisper@basic-queues-priority.html
* igt@i915_pm_dc@dc6-psr:
- shard-iclb: [FAIL][27] ([i915#1899]) -> [PASS][28]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb3/igt@i915_pm_dc@dc6-psr.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb6/igt@i915_pm_dc@dc6-psr.html
* igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy:
- shard-glk: [FAIL][29] ([i915#72]) -> [PASS][30]
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk5/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk4/igt@kms_cursor_legacy@2x-long-flip-vs-cursor-legacy.html
* igt@kms_flip@2x-flip-vs-expired-vblank@ab-hdmi-a1-hdmi-a2:
- shard-glk: [FAIL][31] ([i915#2122]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank@ab-hdmi-a1-hdmi-a2.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk2/igt@kms_flip@2x-flip-vs-expired-vblank@ab-hdmi-a1-hdmi-a2.html
* igt@kms_flip@flip-vs-suspend-interruptible@a-dp1:
- shard-kbl: [DMESG-WARN][33] ([i915#180]) -> [PASS][34] +3 similar issues
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-kbl7/igt@kms_flip@flip-vs-suspend-interruptible@a-dp1.html
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-kbl4/igt@kms_flip@flip-vs-suspend-interruptible@a-dp1.html
* igt@kms_flip@flip-vs-suspend@b-vga1:
- shard-snb: [INCOMPLETE][35] ([i915#82]) -> [PASS][36]
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-snb1/igt@kms_flip@flip-vs-suspend@b-vga1.html
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-snb4/igt@kms_flip@flip-vs-suspend@b-vga1.html
* igt@kms_flip_event_leak:
- shard-glk: [INCOMPLETE][37] -> [PASS][38]
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-glk7/igt@kms_flip_event_leak.html
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-glk9/igt@kms_flip_event_leak.html
* igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-pwrite:
- shard-iclb: [DMESG-WARN][39] ([i915#1982]) -> [PASS][40]
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb3/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-pwrite.html
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb5/igt@kms_frontbuffer_tracking@fbc-1p-offscren-pri-shrfb-draw-pwrite.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw:
- shard-tglb: [DMESG-WARN][41] ([i915#1982]) -> [PASS][42] +2 similar issues
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-tglb8/igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw.html
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-tglb8/igt@kms_frontbuffer_tracking@fbcpsr-1p-pri-indfb-multidraw.html
* igt@kms_psr@psr2_primary_page_flip:
- shard-iclb: [SKIP][43] ([fdo#109441]) -> [PASS][44] +2 similar issues
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb8/igt@kms_psr@psr2_primary_page_flip.html
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb2/igt@kms_psr@psr2_primary_page_flip.html
* igt@perf@polling-small-buf:
- shard-iclb: [FAIL][45] ([i915#1722]) -> [PASS][46]
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb3/igt@perf@polling-small-buf.html
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb3/igt@perf@polling-small-buf.html
#### Warnings ####
* igt@kms_content_protection@atomic:
- shard-apl: [TIMEOUT][47] ([i915#1319] / [i915#1635] / [i915#1958]) -> [FAIL][48] ([fdo#110321] / [fdo#110336] / [i915#1635])
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-apl7/igt@kms_content_protection@atomic.html
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-apl7/igt@kms_content_protection@atomic.html
* igt@kms_dp_dsc@basic-dsc-enable-edp:
- shard-iclb: [SKIP][49] ([fdo#109349]) -> [DMESG-WARN][50] ([i915#1226])
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-iclb6/igt@kms_dp_dsc@basic-dsc-enable-edp.html
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move:
- shard-hsw: [INCOMPLETE][51] -> [SKIP][52] ([fdo#109271])
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-hsw8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move.html
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-hsw8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move.html
* igt@kms_plane_alpha_blend@pipe-a-alpha-7efc:
- shard-apl: [FAIL][53] ([fdo#108145] / [i915#1635] / [i915#265]) -> [DMESG-FAIL][54] ([fdo#108145] / [i915#1635] / [i915#1982])
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_9045/shard-apl1/igt@kms_plane_alpha_blend@pipe-a-alpha-7efc.html
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/shard-apl7/igt@kms_plane_alpha_blend@pipe-a-alpha-7efc.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#108145]: https://bugs.freedesktop.org/show_bug.cgi?id=108145
[fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271
[fdo#109349]: https://bugs.freedesktop.org/show_bug.cgi?id=109349
[fdo#109441]: https://bugs.freedesktop.org/show_bug.cgi?id=109441
[fdo#110321]: https://bugs.freedesktop.org/show_bug.cgi?id=110321
[fdo#110336]: https://bugs.freedesktop.org/show_bug.cgi?id=110336
[i915#118]: https://gitlab.freedesktop.org/drm/intel/issues/118
[i915#1226]: https://gitlab.freedesktop.org/drm/intel/issues/1226
[i915#1319]: https://gitlab.freedesktop.org/drm/intel/issues/1319
[i915#155]: https://gitlab.freedesktop.org/drm/intel/issues/155
[i915#1635]: https://gitlab.freedesktop.org/drm/intel/issues/1635
[i915#1722]: https://gitlab.freedesktop.org/drm/intel/issues/1722
[i915#180]: https://gitlab.freedesktop.org/drm/intel/issues/180
[i915#1899]: https://gitlab.freedesktop.org/drm/intel/issues/1899
[i915#1958]: https://gitlab.freedesktop.org/drm/intel/issues/1958
[i915#1982]: https://gitlab.freedesktop.org/drm/intel/issues/1982
[i915#2122]: https://gitlab.freedesktop.org/drm/intel/issues/2122
[i915#2389]: https://gitlab.freedesktop.org/drm/intel/issues/2389
[i915#265]: https://gitlab.freedesktop.org/drm/intel/issues/265
[i915#72]: https://gitlab.freedesktop.org/drm/intel/issues/72
[i915#82]: https://gitlab.freedesktop.org/drm/intel/issues/82
[i915#95]: https://gitlab.freedesktop.org/drm/intel/issues/95
Participating hosts (11 -> 8)
------------------------------
Missing (3): pig-skl-6260u pig-glk-j5005 pig-icl-1065g7
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5787 -> IGTPW_5008
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_9045: c090e19126310a35b72cafa971bdbdfa1c5c87db @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_5008: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
IGT_5787: 0ec962017c8131de14e0cb038f7f76b1f17ed637 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_5008/index.html
[-- Attachment #1.2: Type: text/html, Size: 16157 bytes --]
[-- Attachment #2: Type: text/plain, Size: 154 bytes --]
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* [igt-dev] [v4 0/2] New subtest for VRR Flipline mode
@ 2020-09-24 14:48 bhanuprakash.modem
2020-09-24 7:46 ` [igt-dev] ✓ Fi.CI.BAT: success for New subtest for VRR Flipline mode (rev5) Patchwork
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: bhanuprakash.modem @ 2020-09-24 14:48 UTC (permalink / raw)
To: igt-dev
From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
To validate Adaptive-Sync's Flipline mode, make sure that flips happen at
flipline decision boundary.
Example: if monitor vrr range is 40 - 60Hz and
* flip at refresh_rate > 60Hz:
Flip should happen at the flipline boundary & returned refresh rate
would be 60Hz.
* flip at refresh_rate == 50Hz:
Flip should happen right away so returned refresh rate is 50Hz.
* flip at refresh_rate < 40Hz:
Flip should happen at the vmax so the returned refresh rate
would be 40Hz.
Bhanuprakash Modem (2):
tests/kms_vrr: Use atomic API for page flip
tests/kms_vrr: Add new subtest to validate Flipline mode
tests/kms_vrr.c | 181 +++++++++++++++++++++++++++++++-----------------
1 file changed, 117 insertions(+), 64 deletions(-)
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip
2020-09-24 14:48 [igt-dev] [v4 0/2] New subtest for VRR Flipline mode bhanuprakash.modem
2020-09-24 7:46 ` [igt-dev] ✓ Fi.CI.BAT: success for New subtest for VRR Flipline mode (rev5) Patchwork
2020-09-24 9:15 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
@ 2020-09-24 14:48 ` bhanuprakash.modem
2020-09-29 19:41 ` Navare, Manasi
2020-09-24 14:48 ` [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode bhanuprakash.modem
3 siblings, 1 reply; 10+ messages in thread
From: bhanuprakash.modem @ 2020-09-24 14:48 UTC (permalink / raw)
To: igt-dev
From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
We should avoid using drmModePageFlip as it'll only be used for
legacy drivers, instead, use igt_display_commit_atomic() API to
page flip for atomic display code path.
v2:
* Look for the page flip event not for the vblank event (Nicholas)
* Fix to flip with different FBs (Bhanu)
v3:
* s/get_vblank_event_ns/get_kernel_event_ns/ (Manasi)
* Add a comment to capture the flip event (Manasi)
* Make sure we are reading valid event (Bhanu)
* Test clean-up (Bhanu)
v4:
* s/*vblank_ns/*event_ns/ (Manasi)
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
---
tests/kms_vrr.c | 76 +++++++++++++++++++++++++------------------------
1 file changed, 39 insertions(+), 37 deletions(-)
diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
index a0db90006d..471d765dec 100644
--- a/tests/kms_vrr.c
+++ b/tests/kms_vrr.c
@@ -47,6 +47,7 @@ typedef struct range {
typedef struct data {
igt_display_t display;
int drm_fd;
+ igt_plane_t *primary;
igt_fb_t fb0;
igt_fb_t fb1;
} data_t;
@@ -60,15 +61,18 @@ static uint64_t timespec_to_ns(struct timespec *ts)
}
/*
- * Gets a vblank event from DRM and returns its timestamp in nanoseconds.
+ * Gets an event from DRM and returns its timestamp in nanoseconds.
+ * Asserts if the event from DRM is not matched with requested one.
+ *
* This blocks until the event is received.
*/
-static uint64_t get_vblank_event_ns(data_t *data)
+static uint64_t get_kernel_event_ns(data_t *data, uint32_t event)
{
struct drm_event_vblank ev;
- igt_set_timeout(1, "Waiting for vblank event\n");
+ igt_set_timeout(1, "Waiting for an event\n");
igt_assert_eq(read(data->drm_fd, &ev, sizeof(ev)), sizeof(ev));
+ igt_assert_eq(ev.base.type, event);
igt_reset_timeout();
return ev.tv_sec * NSECS_PER_SEC + ev.tv_usec * 1000ull;
@@ -126,11 +130,11 @@ static range_t get_vrr_range(data_t *data, igt_output_t *output)
}
/* Returns a suitable vrr test frequency. */
-static uint32_t get_test_rate_ns(data_t *data, igt_output_t *output)
+static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
{
drmModeModeInfo *mode = igt_output_get_mode(output);
range_t range;
- uint32_t vtest;
+ uint64_t vtest;
/*
* The frequency with the fastest convergence speed should be
@@ -165,7 +169,6 @@ static void set_vrr_on_pipe(data_t *data, enum pipe pipe, bool enabled)
static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
{
drmModeModeInfo mode = *igt_output_get_mode(output);
- igt_plane_t *primary;
cairo_t *cr;
/* Reset output */
@@ -189,8 +192,8 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
igt_put_cairo_ctx(cr);
/* Take care of any required modesetting before the test begins. */
- primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
- igt_plane_set_fb(primary, &data->fb0);
+ data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+ igt_plane_set_fb(data->primary, &data->fb0);
igt_display_commit_atomic(&data->display,
DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
@@ -207,35 +210,28 @@ wait_for_vblank(data_t *data, enum pipe pipe)
vbl.request.sequence = 1;
drmWaitVBlank(data->drm_fd, &vbl);
- return get_vblank_event_ns(data);
+ return get_kernel_event_ns(data, DRM_EVENT_VBLANK);
}
-/* Performs an asynchronous non-blocking page-flip on a pipe. */
-static int
-do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
+/* Performs an atomic non-blocking page-flip on a pipe. */
+static void
+do_flip(data_t *data, igt_fb_t *fb)
{
- igt_pipe_t *pipe = &data->display.pipes[pipe_id];
int ret;
igt_set_timeout(1, "Scheduling page flip\n");
- /*
- * Only the legacy flip ioctl supports async flips.
- * It's also non-blocking, but returns -EBUSY if flipping too fast.
- * 2x monitor tests will need async flips in the atomic API.
- */
+ igt_plane_set_fb(data->primary, fb);
+
do {
- ret = drmModePageFlip(data->drm_fd, pipe->crtc_id,
- fb->fb_id,
- DRM_MODE_PAGE_FLIP_EVENT |
- DRM_MODE_PAGE_FLIP_ASYNC,
- data);
+ ret = igt_display_try_commit_atomic(&data->display,
+ DRM_MODE_ATOMIC_NONBLOCK |
+ DRM_MODE_PAGE_FLIP_EVENT,
+ data);
} while (ret == -EBUSY);
igt_assert_eq(ret, 0);
igt_reset_timeout();
-
- return 0;
}
/*
@@ -246,34 +242,34 @@ do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
* can arbitrarily restrict the bounds further than the absolute
* min and max range. But VRR is really about extending the flip
* to prevent stuttering or to match a source content rate.
- *
- * The only way to "present" at a fixed rate like userspace in a vendor
- * neutral manner is to do it with async flips. This avoids the need
- * to wait for next vblank and it should eventually converge at the
- * desired rate.
*/
static uint32_t
flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
uint64_t rate_ns, uint64_t duration_ns)
{
- uint64_t start_ns, last_vblank_ns;
+ uint64_t start_ns, last_event_ns;
uint32_t total_flip = 0, total_pass = 0;
bool front = false;
/* Align with the vblank region to speed up convergence. */
- last_vblank_ns = wait_for_vblank(data, pipe);
+ last_event_ns = wait_for_vblank(data, pipe);
start_ns = get_time_ns();
for (;;) {
- uint64_t now_ns, vblank_ns, wait_ns, target_ns;
+ uint64_t now_ns, event_ns, wait_ns, target_ns;
int64_t diff_ns;
front = !front;
- do_flip(data, pipe, front ? &data->fb1 : &data->fb0);
+ do_flip(data, front ? &data->fb1 : &data->fb0);
- vblank_ns = get_vblank_event_ns(data);
- diff_ns = rate_ns - (vblank_ns - last_vblank_ns);
- last_vblank_ns = vblank_ns;
+ /* We need to cpture flip event instead of vblank event,
+ * because vblank is triggered after each frame, but depending
+ * on the vblank evasion time flip might or might not happen in
+ * that same frame.
+ */
+ event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
+ diff_ns = rate_ns - (event_ns - last_event_ns);
+ last_event_ns = event_ns;
total_flip += 1;
@@ -359,6 +355,12 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
"Target VRR off threshold exceeded, result was %u%%\n",
result);
+ /* Clean-up */
+ igt_plane_set_fb(data->primary, NULL);
+ igt_output_set_pipe(output, PIPE_NONE);
+ igt_display_commit_atomic(&data->display,
+ DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+
igt_remove_fb(data->drm_fd, &data->fb1);
igt_remove_fb(data->drm_fd, &data->fb0);
}
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode
2020-09-24 14:48 [igt-dev] [v4 0/2] New subtest for VRR Flipline mode bhanuprakash.modem
` (2 preceding siblings ...)
2020-09-24 14:48 ` [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip bhanuprakash.modem
@ 2020-09-24 14:48 ` bhanuprakash.modem
2020-09-29 22:12 ` Navare, Manasi
3 siblings, 1 reply; 10+ messages in thread
From: bhanuprakash.modem @ 2020-09-24 14:48 UTC (permalink / raw)
To: igt-dev
From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Check flipline mode by making sure that flips happen at flipline
decision boundary.
Example: if monitor vrr range is 40 - 60Hz and
* flip at refresh_rate > 60Hz:
Flip should happen at the flipline boundary & returned refresh rate
would be 60Hz.
* flip at refresh_rate == 50Hz:
Flip should happen right away so returned refresh rate is 50Hz.
* flip at refresh_rate < 40Hz:
Flip should happen at the vmax so the returned refresh rate
would be 40Hz.
v2:
* s/*vblank_ns/*event_ns/ (Manasi)
* Reset vrr_enabled state before enabling it (Manasi)
Cc: Harry Wentland <harry.wentland@amd.com>
Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
---
tests/kms_vrr.c | 113 +++++++++++++++++++++++++++++++++++-------------
1 file changed, 82 insertions(+), 31 deletions(-)
diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
index 471d765dec..ac42165bef 100644
--- a/tests/kms_vrr.c
+++ b/tests/kms_vrr.c
@@ -37,6 +37,7 @@ enum {
TEST_NONE = 0,
TEST_DPMS = 1 << 0,
TEST_SUSPEND = 1 << 1,
+ TEST_FLIPLINE = 1 << 2,
};
typedef struct range {
@@ -52,6 +53,12 @@ typedef struct data {
igt_fb_t fb1;
} data_t;
+typedef struct vtest_ns {
+ uint64_t min;
+ uint64_t mid;
+ uint64_t max;
+} vtest_ns_t;
+
typedef void (*test_t)(data_t*, enum pipe, igt_output_t*, uint32_t);
/* Converts a timespec structure to nanoseconds. */
@@ -104,13 +111,18 @@ static uint64_t rate_from_refresh(uint64_t refresh)
return NSECS_PER_SEC / refresh;
}
-/* Returns the min and max vrr range from the connector debugfs. */
+/* Read min and max vrr range from the connector debugfs.
+ * - min range should be less than the current mode vfreq
+ * - if max range is grater than the current mode vfreq, consider
+ * current mode vfreq as the max range.
+ */
static range_t get_vrr_range(data_t *data, igt_output_t *output)
{
char buf[256];
char *start_loc;
int fd, res;
range_t range;
+ drmModeModeInfo *mode = igt_output_get_mode(output);
fd = igt_debugfs_connector_dir(data->drm_fd, output->name, O_RDONLY);
igt_assert(fd >= 0);
@@ -122,32 +134,28 @@ static range_t get_vrr_range(data_t *data, igt_output_t *output)
igt_assert(start_loc = strstr(buf, "Min: "));
igt_assert_eq(sscanf(start_loc, "Min: %u", &range.min), 1);
+ igt_require(mode->vrefresh > range.min);
igt_assert(start_loc = strstr(buf, "Max: "));
igt_assert_eq(sscanf(start_loc, "Max: %u", &range.max), 1);
+ range.max = (mode->vrefresh < range.max) ? mode->vrefresh : range.max;
+
return range;
}
-/* Returns a suitable vrr test frequency. */
-static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
+/* Returns vrr test frequency for min, mid & max range. */
+static vtest_ns_t get_test_rate_ns(data_t *data, igt_output_t *output)
{
- drmModeModeInfo *mode = igt_output_get_mode(output);
range_t range;
- uint64_t vtest;
+ vtest_ns_t vtest_ns;
- /*
- * The frequency with the fastest convergence speed should be
- * the midpoint between the current mode vfreq and the min
- * supported vfreq.
- */
range = get_vrr_range(data, output);
- igt_require(mode->vrefresh > range.min);
-
- vtest = (mode->vrefresh - range.min) / 2 + range.min;
- igt_require(vtest < mode->vrefresh);
+ vtest_ns.min = rate_from_refresh(range.min);
+ vtest_ns.mid = rate_from_refresh(((range.max + range.min) / 2));
+ vtest_ns.max = rate_from_refresh(range.max);
- return rate_from_refresh(vtest);
+ return vtest_ns;
}
/* Returns true if an output supports VRR. */
@@ -195,6 +203,11 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
igt_plane_set_fb(data->primary, &data->fb0);
+ /* Clear vrr_enabled state before enabling it, because
+ * it might be left enabled if the previous test fails.
+ */
+ igt_pipe_set_prop_value(&data->display, pipe, IGT_CRTC_VRR_ENABLED, 0);
+
igt_display_commit_atomic(&data->display,
DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
}
@@ -250,6 +263,7 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
uint64_t start_ns, last_event_ns;
uint32_t total_flip = 0, total_pass = 0;
bool front = false;
+ vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
/* Align with the vblank region to speed up convergence. */
last_event_ns = wait_for_vblank(data, pipe);
@@ -268,10 +282,6 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
* that same frame.
*/
event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
- diff_ns = rate_ns - (event_ns - last_event_ns);
- last_event_ns = event_ns;
-
- total_flip += 1;
/*
* Check if the difference between the two flip timestamps
@@ -281,9 +291,19 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
* difference between 144Hz and 143Hz which should give this
* enough accuracy for most use cases.
*/
+ if ((rate_ns <= vtest_ns.min) && (rate_ns >= vtest_ns.max))
+ diff_ns = rate_ns - (event_ns - last_event_ns);
+ else if (rate_ns > vtest_ns.min)
+ diff_ns = vtest_ns.min - (event_ns - last_event_ns);
+ else if (rate_ns < vtest_ns.max)
+ diff_ns = vtest_ns.max - (event_ns - last_event_ns);
+
if (llabs(diff_ns) < 50000ll)
total_pass += 1;
+ last_event_ns = event_ns;
+ total_flip += 1;
+
now_ns = get_time_ns();
if (now_ns - start_ns > duration_ns)
break;
@@ -310,10 +330,13 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
static void
test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
{
- uint64_t rate;
uint32_t result;
+ vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
+ range_t range = get_vrr_range(data, output);
+ uint64_t rate = vtest_ns.mid;
- rate = get_test_rate_ns(data, output);
+ igt_info("VRR Test execution on %s, PIPE_%s\n",
+ output->name, kmstest_pipe_name(pipe));
prepare_test(data, output, pipe);
@@ -339,21 +362,45 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
SUSPEND_TEST_NONE);
- result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
-
- set_vrr_on_pipe(data, pipe, 0);
+ /*
+ * Check flipline mode by making sure that flips happen at flipline
+ * decision boundary.
+ *
+ * Example: if range is 40 - 60Hz and
+ * if refresh_rate > 60Hz:
+ * Flip should happen at the flipline boundary & returned refresh rate
+ * would be 60Hz.
+ * if refresh_rate is 50Hz:
+ * Flip will happen right away so returned refresh rate is 50Hz.
+ * if refresh_rate < 40Hz:
+ * Flip should happen at the vmax so the returned refresh rate
+ * would be 40Hz.
+ */
+ if (flags & TEST_FLIPLINE) {
+ rate = rate_from_refresh(range.min - 5);
+ result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
+ igt_assert_f(result > 75,
+ "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
+ rate, result);
+
+ rate = rate_from_refresh(range.max + 5);
+ result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
+ igt_assert_f(result > 75,
+ "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
+ rate, result);
+ }
- /* This check is delayed until after VRR is disabled so it isn't
- * left enabled if the test fails. */
+ rate = vtest_ns.mid;
+ result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
igt_assert_f(result > 75,
- "Target VRR on threshold not reached, result was %u%%\n",
- result);
+ "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
+ rate, result);
+ set_vrr_on_pipe(data, pipe, 0);
result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
-
igt_assert_f(result < 10,
- "Target VRR off threshold exceeded, result was %u%%\n",
- result);
+ "Refresh rate %"PRIu64"ns: Target VRR off threshold exceeded, result was %u%%\n",
+ rate, result);
/* Clean-up */
igt_plane_set_fb(data->primary, NULL);
@@ -413,6 +460,10 @@ igt_main
igt_subtest("flip-suspend")
run_vrr_test(&data, test_basic, TEST_SUSPEND);
+ igt_describe("Make sure that flips happen at flipline decision boundary.");
+ igt_subtest("flipline")
+ run_vrr_test(&data, test_basic, TEST_FLIPLINE);
+
igt_fixture {
igt_display_fini(&data.display);
}
--
2.20.1
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip
2020-09-24 14:48 ` [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip bhanuprakash.modem
@ 2020-09-29 19:41 ` Navare, Manasi
2020-09-29 22:14 ` Navare, Manasi
0 siblings, 1 reply; 10+ messages in thread
From: Navare, Manasi @ 2020-09-29 19:41 UTC (permalink / raw)
To: bhanuprakash.modem; +Cc: igt-dev
On Thu, Sep 24, 2020 at 08:18:01PM +0530, bhanuprakash.modem@intel.com wrote:
> From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
>
> We should avoid using drmModePageFlip as it'll only be used for
> legacy drivers, instead, use igt_display_commit_atomic() API to
> page flip for atomic display code path.
>
> v2:
> * Look for the page flip event not for the vblank event (Nicholas)
> * Fix to flip with different FBs (Bhanu)
> v3:
> * s/get_vblank_event_ns/get_kernel_event_ns/ (Manasi)
> * Add a comment to capture the flip event (Manasi)
> * Make sure we are reading valid event (Bhanu)
> * Test clean-up (Bhanu)
> v4:
> * s/*vblank_ns/*event_ns/ (Manasi)
>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> Cc: Manasi Navare <manasi.d.navare@intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Looks good to me, so like we discussed the set_vrr_on_pipe setting it to 0 after the test should clear it out
and then beginning of test we set it to 1 again. This should work when the test executes fully. If it fails in between
then thats a problem.
So I had suggested that before calling test_basic, we should startw ith setting vrr_on_pipe(0)
With that change:
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
Manasi
> ---
> tests/kms_vrr.c | 76 +++++++++++++++++++++++++------------------------
> 1 file changed, 39 insertions(+), 37 deletions(-)
>
> diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
> index a0db90006d..471d765dec 100644
> --- a/tests/kms_vrr.c
> +++ b/tests/kms_vrr.c
> @@ -47,6 +47,7 @@ typedef struct range {
> typedef struct data {
> igt_display_t display;
> int drm_fd;
> + igt_plane_t *primary;
> igt_fb_t fb0;
> igt_fb_t fb1;
> } data_t;
> @@ -60,15 +61,18 @@ static uint64_t timespec_to_ns(struct timespec *ts)
> }
>
> /*
> - * Gets a vblank event from DRM and returns its timestamp in nanoseconds.
> + * Gets an event from DRM and returns its timestamp in nanoseconds.
> + * Asserts if the event from DRM is not matched with requested one.
> + *
> * This blocks until the event is received.
> */
> -static uint64_t get_vblank_event_ns(data_t *data)
> +static uint64_t get_kernel_event_ns(data_t *data, uint32_t event)
> {
> struct drm_event_vblank ev;
>
> - igt_set_timeout(1, "Waiting for vblank event\n");
> + igt_set_timeout(1, "Waiting for an event\n");
> igt_assert_eq(read(data->drm_fd, &ev, sizeof(ev)), sizeof(ev));
> + igt_assert_eq(ev.base.type, event);
> igt_reset_timeout();
>
> return ev.tv_sec * NSECS_PER_SEC + ev.tv_usec * 1000ull;
> @@ -126,11 +130,11 @@ static range_t get_vrr_range(data_t *data, igt_output_t *output)
> }
>
> /* Returns a suitable vrr test frequency. */
> -static uint32_t get_test_rate_ns(data_t *data, igt_output_t *output)
> +static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
> {
> drmModeModeInfo *mode = igt_output_get_mode(output);
> range_t range;
> - uint32_t vtest;
> + uint64_t vtest;
>
> /*
> * The frequency with the fastest convergence speed should be
> @@ -165,7 +169,6 @@ static void set_vrr_on_pipe(data_t *data, enum pipe pipe, bool enabled)
> static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> {
> drmModeModeInfo mode = *igt_output_get_mode(output);
> - igt_plane_t *primary;
> cairo_t *cr;
>
> /* Reset output */
> @@ -189,8 +192,8 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> igt_put_cairo_ctx(cr);
>
> /* Take care of any required modesetting before the test begins. */
> - primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> - igt_plane_set_fb(primary, &data->fb0);
> + data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> + igt_plane_set_fb(data->primary, &data->fb0);
>
> igt_display_commit_atomic(&data->display,
> DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> @@ -207,35 +210,28 @@ wait_for_vblank(data_t *data, enum pipe pipe)
> vbl.request.sequence = 1;
> drmWaitVBlank(data->drm_fd, &vbl);
>
> - return get_vblank_event_ns(data);
> + return get_kernel_event_ns(data, DRM_EVENT_VBLANK);
> }
>
> -/* Performs an asynchronous non-blocking page-flip on a pipe. */
> -static int
> -do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
> +/* Performs an atomic non-blocking page-flip on a pipe. */
> +static void
> +do_flip(data_t *data, igt_fb_t *fb)
> {
> - igt_pipe_t *pipe = &data->display.pipes[pipe_id];
> int ret;
>
> igt_set_timeout(1, "Scheduling page flip\n");
>
> - /*
> - * Only the legacy flip ioctl supports async flips.
> - * It's also non-blocking, but returns -EBUSY if flipping too fast.
> - * 2x monitor tests will need async flips in the atomic API.
> - */
> + igt_plane_set_fb(data->primary, fb);
> +
> do {
> - ret = drmModePageFlip(data->drm_fd, pipe->crtc_id,
> - fb->fb_id,
> - DRM_MODE_PAGE_FLIP_EVENT |
> - DRM_MODE_PAGE_FLIP_ASYNC,
> - data);
> + ret = igt_display_try_commit_atomic(&data->display,
> + DRM_MODE_ATOMIC_NONBLOCK |
> + DRM_MODE_PAGE_FLIP_EVENT,
> + data);
> } while (ret == -EBUSY);
>
> igt_assert_eq(ret, 0);
> igt_reset_timeout();
> -
> - return 0;
> }
>
> /*
> @@ -246,34 +242,34 @@ do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
> * can arbitrarily restrict the bounds further than the absolute
> * min and max range. But VRR is really about extending the flip
> * to prevent stuttering or to match a source content rate.
> - *
> - * The only way to "present" at a fixed rate like userspace in a vendor
> - * neutral manner is to do it with async flips. This avoids the need
> - * to wait for next vblank and it should eventually converge at the
> - * desired rate.
> */
> static uint32_t
> flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> uint64_t rate_ns, uint64_t duration_ns)
> {
> - uint64_t start_ns, last_vblank_ns;
> + uint64_t start_ns, last_event_ns;
> uint32_t total_flip = 0, total_pass = 0;
> bool front = false;
>
> /* Align with the vblank region to speed up convergence. */
> - last_vblank_ns = wait_for_vblank(data, pipe);
> + last_event_ns = wait_for_vblank(data, pipe);
> start_ns = get_time_ns();
>
> for (;;) {
> - uint64_t now_ns, vblank_ns, wait_ns, target_ns;
> + uint64_t now_ns, event_ns, wait_ns, target_ns;
> int64_t diff_ns;
>
> front = !front;
> - do_flip(data, pipe, front ? &data->fb1 : &data->fb0);
> + do_flip(data, front ? &data->fb1 : &data->fb0);
>
> - vblank_ns = get_vblank_event_ns(data);
> - diff_ns = rate_ns - (vblank_ns - last_vblank_ns);
> - last_vblank_ns = vblank_ns;
> + /* We need to cpture flip event instead of vblank event,
> + * because vblank is triggered after each frame, but depending
> + * on the vblank evasion time flip might or might not happen in
> + * that same frame.
> + */
> + event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
> + diff_ns = rate_ns - (event_ns - last_event_ns);
> + last_event_ns = event_ns;
>
> total_flip += 1;
>
> @@ -359,6 +355,12 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
> "Target VRR off threshold exceeded, result was %u%%\n",
> result);
>
> + /* Clean-up */
> + igt_plane_set_fb(data->primary, NULL);
> + igt_output_set_pipe(output, PIPE_NONE);
> + igt_display_commit_atomic(&data->display,
> + DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> +
> igt_remove_fb(data->drm_fd, &data->fb1);
> igt_remove_fb(data->drm_fd, &data->fb0);
> }
> --
> 2.20.1
>
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode
2020-09-24 14:48 ` [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode bhanuprakash.modem
@ 2020-09-29 22:12 ` Navare, Manasi
2020-09-30 15:34 ` Modem, Bhanuprakash
0 siblings, 1 reply; 10+ messages in thread
From: Navare, Manasi @ 2020-09-29 22:12 UTC (permalink / raw)
To: bhanuprakash.modem; +Cc: igt-dev
On Thu, Sep 24, 2020 at 08:18:02PM +0530, bhanuprakash.modem@intel.com wrote:
> From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
>
> Check flipline mode by making sure that flips happen at flipline
> decision boundary.
>
> Example: if monitor vrr range is 40 - 60Hz and
>
> * flip at refresh_rate > 60Hz:
> Flip should happen at the flipline boundary & returned refresh rate
> would be 60Hz.
> * flip at refresh_rate == 50Hz:
> Flip should happen right away so returned refresh rate is 50Hz.
> * flip at refresh_rate < 40Hz:
> Flip should happen at the vmax so the returned refresh rate
> would be 40Hz.
>
> v2:
> * s/*vblank_ns/*event_ns/ (Manasi)
> * Reset vrr_enabled state before enabling it (Manasi)
>
> Cc: Harry Wentland <harry.wentland@amd.com>
> Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> Cc: Manasi Navare <manasi.d.navare@intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> ---
> tests/kms_vrr.c | 113 +++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 82 insertions(+), 31 deletions(-)
>
> diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
> index 471d765dec..ac42165bef 100644
> --- a/tests/kms_vrr.c
> +++ b/tests/kms_vrr.c
> @@ -37,6 +37,7 @@ enum {
> TEST_NONE = 0,
> TEST_DPMS = 1 << 0,
> TEST_SUSPEND = 1 << 1,
> + TEST_FLIPLINE = 1 << 2,
> };
>
> typedef struct range {
> @@ -52,6 +53,12 @@ typedef struct data {
> igt_fb_t fb1;
> } data_t;
>
> +typedef struct vtest_ns {
> + uint64_t min;
> + uint64_t mid;
> + uint64_t max;
> +} vtest_ns_t;
> +
> typedef void (*test_t)(data_t*, enum pipe, igt_output_t*, uint32_t);
>
> /* Converts a timespec structure to nanoseconds. */
> @@ -104,13 +111,18 @@ static uint64_t rate_from_refresh(uint64_t refresh)
> return NSECS_PER_SEC / refresh;
> }
>
> -/* Returns the min and max vrr range from the connector debugfs. */
> +/* Read min and max vrr range from the connector debugfs.
> + * - min range should be less than the current mode vfreq
> + * - if max range is grater than the current mode vfreq, consider
> + * current mode vfreq as the max range.
> + */
> static range_t get_vrr_range(data_t *data, igt_output_t *output)
> {
> char buf[256];
> char *start_loc;
> int fd, res;
> range_t range;
> + drmModeModeInfo *mode = igt_output_get_mode(output);
>
> fd = igt_debugfs_connector_dir(data->drm_fd, output->name, O_RDONLY);
> igt_assert(fd >= 0);
> @@ -122,32 +134,28 @@ static range_t get_vrr_range(data_t *data, igt_output_t *output)
>
> igt_assert(start_loc = strstr(buf, "Min: "));
> igt_assert_eq(sscanf(start_loc, "Min: %u", &range.min), 1);
> + igt_require(mode->vrefresh > range.min);
>
> igt_assert(start_loc = strstr(buf, "Max: "));
> igt_assert_eq(sscanf(start_loc, "Max: %u", &range.max), 1);
>
> + range.max = (mode->vrefresh < range.max) ? mode->vrefresh : range.max;
> +
> return range;
> }
>
> -/* Returns a suitable vrr test frequency. */
> -static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
> +/* Returns vrr test frequency for min, mid & max range. */
> +static vtest_ns_t get_test_rate_ns(data_t *data, igt_output_t *output)
> {
> - drmModeModeInfo *mode = igt_output_get_mode(output);
> range_t range;
> - uint64_t vtest;
> + vtest_ns_t vtest_ns;
>
> - /*
> - * The frequency with the fastest convergence speed should be
> - * the midpoint between the current mode vfreq and the min
> - * supported vfreq.
> - */
> range = get_vrr_range(data, output);
> - igt_require(mode->vrefresh > range.min);
> -
> - vtest = (mode->vrefresh - range.min) / 2 + range.min;
> - igt_require(vtest < mode->vrefresh);
> + vtest_ns.min = rate_from_refresh(range.min);
> + vtest_ns.mid = rate_from_refresh(((range.max + range.min) / 2));
> + vtest_ns.max = rate_from_refresh(range.max);
>
> - return rate_from_refresh(vtest);
> + return vtest_ns;
> }
>
> /* Returns true if an output supports VRR. */
> @@ -195,6 +203,11 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> igt_plane_set_fb(data->primary, &data->fb0);
>
> + /* Clear vrr_enabled state before enabling it, because
> + * it might be left enabled if the previous test fails.
> + */
> + igt_pipe_set_prop_value(&data->display, pipe, IGT_CRTC_VRR_ENABLED, 0);
Like I said in my comment below this shouldhappen before calling
prepare_test()
Also the set_vrr_pipe(1) call should happen at the beginning of prepare_test() so that
VRR prop is set before doing a modeset with the desired fb.
What I have in my code for testing is:
test_basic()
{
set_vrr_on_pipe(0)
prepare_test()
.
.
.
}
And in prepare_test()
{
set_vrr_on_pipe(1);
create_fb
.
.
.
atomic_commit();
}
> +
> igt_display_commit_atomic(&data->display,
> DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> }
> @@ -250,6 +263,7 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> uint64_t start_ns, last_event_ns;
> uint32_t total_flip = 0, total_pass = 0;
> bool front = false;
> + vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
>
> /* Align with the vblank region to speed up convergence. */
> last_event_ns = wait_for_vblank(data, pipe);
> @@ -268,10 +282,6 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> * that same frame.
> */
> event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
> - diff_ns = rate_ns - (event_ns - last_event_ns);
> - last_event_ns = event_ns;
> -
> - total_flip += 1;
>
> /*
> * Check if the difference between the two flip timestamps
> @@ -281,9 +291,19 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> * difference between 144Hz and 143Hz which should give this
> * enough accuracy for most use cases.
> */
> + if ((rate_ns <= vtest_ns.min) && (rate_ns >= vtest_ns.max))
> + diff_ns = rate_ns - (event_ns - last_event_ns);
> + else if (rate_ns > vtest_ns.min)
> + diff_ns = vtest_ns.min - (event_ns - last_event_ns);
> + else if (rate_ns < vtest_ns.max)
> + diff_ns = vtest_ns.max - (event_ns - last_event_ns);
> +
> if (llabs(diff_ns) < 50000ll)
> total_pass += 1;
>
> + last_event_ns = event_ns;
> + total_flip += 1;
> +
> now_ns = get_time_ns();
> if (now_ns - start_ns > duration_ns)
> break;
> @@ -310,10 +330,13 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> static void
> test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
> {
> - uint64_t rate;
> uint32_t result;
> + vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
> + range_t range = get_vrr_range(data, output);
> + uint64_t rate = vtest_ns.mid;
>
> - rate = get_test_rate_ns(data, output);
> + igt_info("VRR Test execution on %s, PIPE_%s\n",
> + output->name, kmstest_pipe_name(pipe));
>
The reseting of vrr_enabled prop should be done before prepare test so before we set the
desrired fb. I would recommend a call set_vrr_on_pipe(0) before calling prepare_test()
This is what I had to do for testing the kernel code. It should be a complete set_vrr_on_pipe() call
which will set the prop to 0 and commit
Manasi
> prepare_test(data, output, pipe);
>
> @@ -339,21 +362,45 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
> igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
> SUSPEND_TEST_NONE);
>
> - result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
> -
> - set_vrr_on_pipe(data, pipe, 0);
> + /*
> + * Check flipline mode by making sure that flips happen at flipline
> + * decision boundary.
> + *
> + * Example: if range is 40 - 60Hz and
> + * if refresh_rate > 60Hz:
> + * Flip should happen at the flipline boundary & returned refresh rate
> + * would be 60Hz.
> + * if refresh_rate is 50Hz:
> + * Flip will happen right away so returned refresh rate is 50Hz.
> + * if refresh_rate < 40Hz:
> + * Flip should happen at the vmax so the returned refresh rate
> + * would be 40Hz.
> + */
> + if (flags & TEST_FLIPLINE) {
> + rate = rate_from_refresh(range.min - 5);
> + result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
> + igt_assert_f(result > 75,
> + "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
> + rate, result);
> +
> + rate = rate_from_refresh(range.max + 5);
> + result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
> + igt_assert_f(result > 75,
> + "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
> + rate, result);
> + }
>
> - /* This check is delayed until after VRR is disabled so it isn't
> - * left enabled if the test fails. */
> + rate = vtest_ns.mid;
> + result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
> igt_assert_f(result > 75,
> - "Target VRR on threshold not reached, result was %u%%\n",
> - result);
> + "Refresh rate %"PRIu64"ns: Target VRR on threshold not reached, result was %u%%\n",
> + rate, result);
>
> + set_vrr_on_pipe(data, pipe, 0);
> result = flip_and_measure(data, output, pipe, rate, TEST_DURATION_NS);
> -
> igt_assert_f(result < 10,
> - "Target VRR off threshold exceeded, result was %u%%\n",
> - result);
> + "Refresh rate %"PRIu64"ns: Target VRR off threshold exceeded, result was %u%%\n",
> + rate, result);
>
> /* Clean-up */
> igt_plane_set_fb(data->primary, NULL);
> @@ -413,6 +460,10 @@ igt_main
> igt_subtest("flip-suspend")
> run_vrr_test(&data, test_basic, TEST_SUSPEND);
>
> + igt_describe("Make sure that flips happen at flipline decision boundary.");
> + igt_subtest("flipline")
> + run_vrr_test(&data, test_basic, TEST_FLIPLINE);
> +
> igt_fixture {
> igt_display_fini(&data.display);
> }
> --
> 2.20.1
>
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip
2020-09-29 19:41 ` Navare, Manasi
@ 2020-09-29 22:14 ` Navare, Manasi
0 siblings, 0 replies; 10+ messages in thread
From: Navare, Manasi @ 2020-09-29 22:14 UTC (permalink / raw)
To: bhanuprakash.modem; +Cc: igt-dev
On Tue, Sep 29, 2020 at 12:41:43PM -0700, Navare, Manasi wrote:
> On Thu, Sep 24, 2020 at 08:18:01PM +0530, bhanuprakash.modem@intel.com wrote:
> > From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> >
> > We should avoid using drmModePageFlip as it'll only be used for
> > legacy drivers, instead, use igt_display_commit_atomic() API to
> > page flip for atomic display code path.
> >
> > v2:
> > * Look for the page flip event not for the vblank event (Nicholas)
> > * Fix to flip with different FBs (Bhanu)
> > v3:
> > * s/get_vblank_event_ns/get_kernel_event_ns/ (Manasi)
> > * Add a comment to capture the flip event (Manasi)
> > * Make sure we are reading valid event (Bhanu)
> > * Test clean-up (Bhanu)
> > v4:
> > * s/*vblank_ns/*event_ns/ (Manasi)
> >
> > Cc: Harry Wentland <harry.wentland@amd.com>
> > Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> > Cc: Manasi Navare <manasi.d.navare@intel.com>
> > Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> > Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
>
> Looks good to me, so like we discussed the set_vrr_on_pipe setting it to 0 after the test should clear it out
> and then beginning of test we set it to 1 again. This should work when the test executes fully. If it fails in between
> then thats a problem.
>
> So I had suggested that before calling test_basic, we should startw ith setting vrr_on_pipe(0)
>
> With that change:
Just saw that this is done as part of Patch 2 and I have some comments on patch 2.
But for this patch please consider my
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com
Manasi
>
> Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
>
> Manasi
>
> > ---
> > tests/kms_vrr.c | 76 +++++++++++++++++++++++++------------------------
> > 1 file changed, 39 insertions(+), 37 deletions(-)
> >
> > diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
> > index a0db90006d..471d765dec 100644
> > --- a/tests/kms_vrr.c
> > +++ b/tests/kms_vrr.c
> > @@ -47,6 +47,7 @@ typedef struct range {
> > typedef struct data {
> > igt_display_t display;
> > int drm_fd;
> > + igt_plane_t *primary;
> > igt_fb_t fb0;
> > igt_fb_t fb1;
> > } data_t;
> > @@ -60,15 +61,18 @@ static uint64_t timespec_to_ns(struct timespec *ts)
> > }
> >
> > /*
> > - * Gets a vblank event from DRM and returns its timestamp in nanoseconds.
> > + * Gets an event from DRM and returns its timestamp in nanoseconds.
> > + * Asserts if the event from DRM is not matched with requested one.
> > + *
> > * This blocks until the event is received.
> > */
> > -static uint64_t get_vblank_event_ns(data_t *data)
> > +static uint64_t get_kernel_event_ns(data_t *data, uint32_t event)
> > {
> > struct drm_event_vblank ev;
> >
> > - igt_set_timeout(1, "Waiting for vblank event\n");
> > + igt_set_timeout(1, "Waiting for an event\n");
> > igt_assert_eq(read(data->drm_fd, &ev, sizeof(ev)), sizeof(ev));
> > + igt_assert_eq(ev.base.type, event);
> > igt_reset_timeout();
> >
> > return ev.tv_sec * NSECS_PER_SEC + ev.tv_usec * 1000ull;
> > @@ -126,11 +130,11 @@ static range_t get_vrr_range(data_t *data, igt_output_t *output)
> > }
> >
> > /* Returns a suitable vrr test frequency. */
> > -static uint32_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > +static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > {
> > drmModeModeInfo *mode = igt_output_get_mode(output);
> > range_t range;
> > - uint32_t vtest;
> > + uint64_t vtest;
> >
> > /*
> > * The frequency with the fastest convergence speed should be
> > @@ -165,7 +169,6 @@ static void set_vrr_on_pipe(data_t *data, enum pipe pipe, bool enabled)
> > static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> > {
> > drmModeModeInfo mode = *igt_output_get_mode(output);
> > - igt_plane_t *primary;
> > cairo_t *cr;
> >
> > /* Reset output */
> > @@ -189,8 +192,8 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
> > igt_put_cairo_ctx(cr);
> >
> > /* Take care of any required modesetting before the test begins. */
> > - primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> > - igt_plane_set_fb(primary, &data->fb0);
> > + data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
> > + igt_plane_set_fb(data->primary, &data->fb0);
> >
> > igt_display_commit_atomic(&data->display,
> > DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> > @@ -207,35 +210,28 @@ wait_for_vblank(data_t *data, enum pipe pipe)
> > vbl.request.sequence = 1;
> > drmWaitVBlank(data->drm_fd, &vbl);
> >
> > - return get_vblank_event_ns(data);
> > + return get_kernel_event_ns(data, DRM_EVENT_VBLANK);
> > }
> >
> > -/* Performs an asynchronous non-blocking page-flip on a pipe. */
> > -static int
> > -do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
> > +/* Performs an atomic non-blocking page-flip on a pipe. */
> > +static void
> > +do_flip(data_t *data, igt_fb_t *fb)
> > {
> > - igt_pipe_t *pipe = &data->display.pipes[pipe_id];
> > int ret;
> >
> > igt_set_timeout(1, "Scheduling page flip\n");
> >
> > - /*
> > - * Only the legacy flip ioctl supports async flips.
> > - * It's also non-blocking, but returns -EBUSY if flipping too fast.
> > - * 2x monitor tests will need async flips in the atomic API.
> > - */
> > + igt_plane_set_fb(data->primary, fb);
> > +
> > do {
> > - ret = drmModePageFlip(data->drm_fd, pipe->crtc_id,
> > - fb->fb_id,
> > - DRM_MODE_PAGE_FLIP_EVENT |
> > - DRM_MODE_PAGE_FLIP_ASYNC,
> > - data);
> > + ret = igt_display_try_commit_atomic(&data->display,
> > + DRM_MODE_ATOMIC_NONBLOCK |
> > + DRM_MODE_PAGE_FLIP_EVENT,
> > + data);
> > } while (ret == -EBUSY);
> >
> > igt_assert_eq(ret, 0);
> > igt_reset_timeout();
> > -
> > - return 0;
> > }
> >
> > /*
> > @@ -246,34 +242,34 @@ do_flip(data_t *data, enum pipe pipe_id, igt_fb_t *fb)
> > * can arbitrarily restrict the bounds further than the absolute
> > * min and max range. But VRR is really about extending the flip
> > * to prevent stuttering or to match a source content rate.
> > - *
> > - * The only way to "present" at a fixed rate like userspace in a vendor
> > - * neutral manner is to do it with async flips. This avoids the need
> > - * to wait for next vblank and it should eventually converge at the
> > - * desired rate.
> > */
> > static uint32_t
> > flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
> > uint64_t rate_ns, uint64_t duration_ns)
> > {
> > - uint64_t start_ns, last_vblank_ns;
> > + uint64_t start_ns, last_event_ns;
> > uint32_t total_flip = 0, total_pass = 0;
> > bool front = false;
> >
> > /* Align with the vblank region to speed up convergence. */
> > - last_vblank_ns = wait_for_vblank(data, pipe);
> > + last_event_ns = wait_for_vblank(data, pipe);
> > start_ns = get_time_ns();
> >
> > for (;;) {
> > - uint64_t now_ns, vblank_ns, wait_ns, target_ns;
> > + uint64_t now_ns, event_ns, wait_ns, target_ns;
> > int64_t diff_ns;
> >
> > front = !front;
> > - do_flip(data, pipe, front ? &data->fb1 : &data->fb0);
> > + do_flip(data, front ? &data->fb1 : &data->fb0);
> >
> > - vblank_ns = get_vblank_event_ns(data);
> > - diff_ns = rate_ns - (vblank_ns - last_vblank_ns);
> > - last_vblank_ns = vblank_ns;
> > + /* We need to cpture flip event instead of vblank event,
> > + * because vblank is triggered after each frame, but depending
> > + * on the vblank evasion time flip might or might not happen in
> > + * that same frame.
> > + */
> > + event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
> > + diff_ns = rate_ns - (event_ns - last_event_ns);
> > + last_event_ns = event_ns;
> >
> > total_flip += 1;
> >
> > @@ -359,6 +355,12 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
> > "Target VRR off threshold exceeded, result was %u%%\n",
> > result);
> >
> > + /* Clean-up */
> > + igt_plane_set_fb(data->primary, NULL);
> > + igt_output_set_pipe(output, PIPE_NONE);
> > + igt_display_commit_atomic(&data->display,
> > + DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> > +
> > igt_remove_fb(data->drm_fd, &data->fb1);
> > igt_remove_fb(data->drm_fd, &data->fb0);
> > }
> > --
> > 2.20.1
> >
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode
2020-09-29 22:12 ` Navare, Manasi
@ 2020-09-30 15:34 ` Modem, Bhanuprakash
2020-10-13 21:44 ` Navare, Manasi
0 siblings, 1 reply; 10+ messages in thread
From: Modem, Bhanuprakash @ 2020-09-30 15:34 UTC (permalink / raw)
To: Navare, Manasi D; +Cc: igt-dev
> -----Original Message-----
> From: Navare, Manasi <manasi.d.navare@intel.com>
> Sent: Wednesday, September 30, 2020 3:43 AM
> To: Modem, Bhanuprakash <bhanuprakash.modem@intel.com>
> Cc: igt-dev@lists.freedesktop.org; Harry Wentland
> <harry.wentland@amd.com>; Nicholas Kazlauskas
> <nicholas.kazlauskas@amd.com>
> Subject: Re: [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline
> mode
>
> On Thu, Sep 24, 2020 at 08:18:02PM +0530, bhanuprakash.modem@intel.com
> wrote:
> > From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> >
> > Check flipline mode by making sure that flips happen at flipline
> > decision boundary.
> >
> > Example: if monitor vrr range is 40 - 60Hz and
> >
> > * flip at refresh_rate > 60Hz:
> > Flip should happen at the flipline boundary & returned refresh
> rate
> > would be 60Hz.
> > * flip at refresh_rate == 50Hz:
> > Flip should happen right away so returned refresh rate is 50Hz.
> > * flip at refresh_rate < 40Hz:
> > Flip should happen at the vmax so the returned refresh rate
> > would be 40Hz.
> >
> > v2:
> > * s/*vblank_ns/*event_ns/ (Manasi)
> > * Reset vrr_enabled state before enabling it (Manasi)
>
> >
> > Cc: Harry Wentland <harry.wentland@amd.com>
> > Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> > Cc: Manasi Navare <manasi.d.navare@intel.com>
> > Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> > Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> > ---
> > tests/kms_vrr.c | 113 +++++++++++++++++++++++++++++++++++-------------
> > 1 file changed, 82 insertions(+), 31 deletions(-)
> >
> > diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
> > index 471d765dec..ac42165bef 100644
> > --- a/tests/kms_vrr.c
> > +++ b/tests/kms_vrr.c
> > @@ -37,6 +37,7 @@ enum {
> > TEST_NONE = 0,
> > TEST_DPMS = 1 << 0,
> > TEST_SUSPEND = 1 << 1,
> > + TEST_FLIPLINE = 1 << 2,
> > };
> >
> > typedef struct range {
> > @@ -52,6 +53,12 @@ typedef struct data {
> > igt_fb_t fb1;
> > } data_t;
> >
> > +typedef struct vtest_ns {
> > + uint64_t min;
> > + uint64_t mid;
> > + uint64_t max;
> > +} vtest_ns_t;
> > +
> > typedef void (*test_t)(data_t*, enum pipe, igt_output_t*, uint32_t);
> >
> > /* Converts a timespec structure to nanoseconds. */
> > @@ -104,13 +111,18 @@ static uint64_t rate_from_refresh(uint64_t
> refresh)
> > return NSECS_PER_SEC / refresh;
> > }
> >
> > -/* Returns the min and max vrr range from the connector debugfs. */
> > +/* Read min and max vrr range from the connector debugfs.
> > + * - min range should be less than the current mode vfreq
> > + * - if max range is grater than the current mode vfreq, consider
> > + * current mode vfreq as the max range.
> > + */
> > static range_t get_vrr_range(data_t *data, igt_output_t *output)
> > {
> > char buf[256];
> > char *start_loc;
> > int fd, res;
> > range_t range;
> > + drmModeModeInfo *mode = igt_output_get_mode(output);
> >
> > fd = igt_debugfs_connector_dir(data->drm_fd, output->name,
> O_RDONLY);
> > igt_assert(fd >= 0);
> > @@ -122,32 +134,28 @@ static range_t get_vrr_range(data_t *data,
> igt_output_t *output)
> >
> > igt_assert(start_loc = strstr(buf, "Min: "));
> > igt_assert_eq(sscanf(start_loc, "Min: %u", &range.min), 1);
> > + igt_require(mode->vrefresh > range.min);
> >
> > igt_assert(start_loc = strstr(buf, "Max: "));
> > igt_assert_eq(sscanf(start_loc, "Max: %u", &range.max), 1);
> >
> > + range.max = (mode->vrefresh < range.max) ? mode->vrefresh :
> range.max;
> > +
> > return range;
> > }
> >
> > -/* Returns a suitable vrr test frequency. */
> > -static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > +/* Returns vrr test frequency for min, mid & max range. */
> > +static vtest_ns_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > {
> > - drmModeModeInfo *mode = igt_output_get_mode(output);
> > range_t range;
> > - uint64_t vtest;
> > + vtest_ns_t vtest_ns;
> >
> > - /*
> > - * The frequency with the fastest convergence speed should be
> > - * the midpoint between the current mode vfreq and the min
> > - * supported vfreq.
> > - */
> > range = get_vrr_range(data, output);
> > - igt_require(mode->vrefresh > range.min);
> > -
> > - vtest = (mode->vrefresh - range.min) / 2 + range.min;
> > - igt_require(vtest < mode->vrefresh);
> > + vtest_ns.min = rate_from_refresh(range.min);
> > + vtest_ns.mid = rate_from_refresh(((range.max + range.min) / 2));
> > + vtest_ns.max = rate_from_refresh(range.max);
> >
> > - return rate_from_refresh(vtest);
> > + return vtest_ns;
> > }
> >
> > /* Returns true if an output supports VRR. */
> > @@ -195,6 +203,11 @@ static void prepare_test(data_t *data, igt_output_t
> *output, enum pipe pipe)
> > data->primary = igt_output_get_plane_type(output,
> DRM_PLANE_TYPE_PRIMARY);
> > igt_plane_set_fb(data->primary, &data->fb0);
> >
> > + /* Clear vrr_enabled state before enabling it, because
> > + * it might be left enabled if the previous test fails.
> > + */
> > + igt_pipe_set_prop_value(&data->display, pipe, IGT_CRTC_VRR_ENABLED,
> 0);
>
> Like I said in my comment below this shouldhappen before calling
> prepare_test()
> Also the set_vrr_pipe(1) call should happen at the beginning of
> prepare_test() so that
> VRR prop is set before doing a modeset with the desired fb.
>
> What I have in my code for testing is:
>
> test_basic()
> {
> set_vrr_on_pipe(0)
> prepare_test()
> .
> .
> .
> }
>
> And in prepare_test()
> {
> set_vrr_on_pipe(1);
> create_fb
> .
> .
> .
> atomic_commit();
> }
>
>
[Bhanu] Why do we need to enable VRR before modeset? I think Driver will take care of it.
As you mentioned in your Engg changes, in atomic_check:
if (!needs_modeset(new_crtc_state) && old_crtc_state->uapi.vrr_enabled == new_crtc_state->uapi.vrr_enabled)
continue;
For first IGT execution:
vrr_enabled status is 0
create FB & do modeset
set vrr_enabled to 1 & flip
above check will fail & kernel will perform required tasks
set vrr_enabled to 0 & flip
above check will fail & kernel will perform required tasks
For some reason test got failed & vrr_enabled status kept 1.
In next IGT execution:
vrr_enabled status is 1
update to 0 (this patch will update vrr_enabled to 0 before modeset)
remaining execution is same as above.
Is my interpretation correct? Also can you please help to test your code with this patch?
> > +
> > igt_display_commit_atomic(&data->display,
> > DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> > }
> > @@ -250,6 +263,7 @@ flip_and_measure(data_t *data, igt_output_t *output,
> enum pipe pipe,
> > uint64_t start_ns, last_event_ns;
> > uint32_t total_flip = 0, total_pass = 0;
> > bool front = false;
> > + vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
> >
> > /* Align with the vblank region to speed up convergence. */
> > last_event_ns = wait_for_vblank(data, pipe);
> > @@ -268,10 +282,6 @@ flip_and_measure(data_t *data, igt_output_t
> *output, enum pipe pipe,
> > * that same frame.
> > */
> > event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
> > - diff_ns = rate_ns - (event_ns - last_event_ns);
> > - last_event_ns = event_ns;
> > -
> > - total_flip += 1;
> >
> > /*
> > * Check if the difference between the two flip timestamps
> > @@ -281,9 +291,19 @@ flip_and_measure(data_t *data, igt_output_t
> *output, enum pipe pipe,
> > * difference between 144Hz and 143Hz which should give this
> > * enough accuracy for most use cases.
> > */
> > + if ((rate_ns <= vtest_ns.min) && (rate_ns >= vtest_ns.max))
> > + diff_ns = rate_ns - (event_ns - last_event_ns);
> > + else if (rate_ns > vtest_ns.min)
> > + diff_ns = vtest_ns.min - (event_ns - last_event_ns);
> > + else if (rate_ns < vtest_ns.max)
> > + diff_ns = vtest_ns.max - (event_ns - last_event_ns);
> > +
> > if (llabs(diff_ns) < 50000ll)
> > total_pass += 1;
> >
> > + last_event_ns = event_ns;
> > + total_flip += 1;
> > +
> > now_ns = get_time_ns();
> > if (now_ns - start_ns > duration_ns)
> > break;
> > @@ -310,10 +330,13 @@ flip_and_measure(data_t *data, igt_output_t
> *output, enum pipe pipe,
> > static void
> > test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t
> flags)
> > {
> > - uint64_t rate;
> > uint32_t result;
> > + vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
> > + range_t range = get_vrr_range(data, output);
> > + uint64_t rate = vtest_ns.mid;
> >
> > - rate = get_test_rate_ns(data, output);
> > + igt_info("VRR Test execution on %s, PIPE_%s\n",
> > + output->name, kmstest_pipe_name(pipe));
> >
> The reseting of vrr_enabled prop should be done before prepare test
> so before we set the
> desrired fb. I would recommend a call set_vrr_on_pipe(0) before calling
> prepare_test()
> This is what I had to do for testing the kernel code. It should be a
> complete set_vrr_on_pipe() call
> which will set the prop to 0 and commit
>
> Manasi
>
>
> > prepare_test(data, output, pipe);
> >
> > @@ -339,21 +362,45 @@ test_basic(data_t *data, enum pipe pipe,
> igt_output_t *output, uint32_t flags)
> > igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
> > SUSPEND_TEST_NONE);
> >
> > - result = flip_and_measure(data, output, pipe, rate,
> TEST_DURATION_NS);
> > -
> > - set_vrr_on_pipe(data, pipe, 0);
> > + /*
> > + * Check flipline mode by making sure that flips happen at flipline
> > + * decision boundary.
> > + *
> > + * Example: if range is 40 - 60Hz and
> > + * if refresh_rate > 60Hz:
> > + * Flip should happen at the flipline boundary & returned
> refresh rate
> > + * would be 60Hz.
> > + * if refresh_rate is 50Hz:
> > + * Flip will happen right away so returned refresh rate is
> 50Hz.
> > + * if refresh_rate < 40Hz:
> > + * Flip should happen at the vmax so the returned refresh rate
> > + * would be 40Hz.
> > + */
> > + if (flags & TEST_FLIPLINE) {
> > + rate = rate_from_refresh(range.min - 5);
> > + result = flip_and_measure(data, output, pipe, rate,
> TEST_DURATION_NS);
> > + igt_assert_f(result > 75,
> > + "Refresh rate %"PRIu64"ns: Target VRR on threshold
> not reached, result was %u%%\n",
> > + rate, result);
> > +
> > + rate = rate_from_refresh(range.max + 5);
> > + result = flip_and_measure(data, output, pipe, rate,
> TEST_DURATION_NS);
> > + igt_assert_f(result > 75,
> > + "Refresh rate %"PRIu64"ns: Target VRR on threshold
> not reached, result was %u%%\n",
> > + rate, result);
> > + }
> >
> > - /* This check is delayed until after VRR is disabled so it isn't
> > - * left enabled if the test fails. */
> > + rate = vtest_ns.mid;
> > + result = flip_and_measure(data, output, pipe, rate,
> TEST_DURATION_NS);
> > igt_assert_f(result > 75,
> > - "Target VRR on threshold not reached, result was %u%%\n",
> > - result);
> > + "Refresh rate %"PRIu64"ns: Target VRR on threshold not
> reached, result was %u%%\n",
> > + rate, result);
> >
> > + set_vrr_on_pipe(data, pipe, 0);
> > result = flip_and_measure(data, output, pipe, rate,
> TEST_DURATION_NS);
> > -
> > igt_assert_f(result < 10,
> > - "Target VRR off threshold exceeded, result was %u%%\n",
> > - result);
> > + "Refresh rate %"PRIu64"ns: Target VRR off threshold
> exceeded, result was %u%%\n",
> > + rate, result);
> >
> > /* Clean-up */
> > igt_plane_set_fb(data->primary, NULL);
> > @@ -413,6 +460,10 @@ igt_main
> > igt_subtest("flip-suspend")
> > run_vrr_test(&data, test_basic, TEST_SUSPEND);
> >
> > + igt_describe("Make sure that flips happen at flipline decision
> boundary.");
> > + igt_subtest("flipline")
> > + run_vrr_test(&data, test_basic, TEST_FLIPLINE);
> > +
> > igt_fixture {
> > igt_display_fini(&data.display);
> > }
> > --
> > 2.20.1
> >
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode
2020-09-30 15:34 ` Modem, Bhanuprakash
@ 2020-10-13 21:44 ` Navare, Manasi
0 siblings, 0 replies; 10+ messages in thread
From: Navare, Manasi @ 2020-10-13 21:44 UTC (permalink / raw)
To: Modem, Bhanuprakash; +Cc: igt-dev
On Wed, Sep 30, 2020 at 08:34:10AM -0700, Modem, Bhanuprakash wrote:
> > -----Original Message-----
> > From: Navare, Manasi <manasi.d.navare@intel.com>
> > Sent: Wednesday, September 30, 2020 3:43 AM
> > To: Modem, Bhanuprakash <bhanuprakash.modem@intel.com>
> > Cc: igt-dev@lists.freedesktop.org; Harry Wentland
> > <harry.wentland@amd.com>; Nicholas Kazlauskas
> > <nicholas.kazlauskas@amd.com>
> > Subject: Re: [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline
> > mode
> >
> > On Thu, Sep 24, 2020 at 08:18:02PM +0530, bhanuprakash.modem@intel.com
> > wrote:
> > > From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> > >
> > > Check flipline mode by making sure that flips happen at flipline
> > > decision boundary.
> > >
> > > Example: if monitor vrr range is 40 - 60Hz and
> > >
> > > * flip at refresh_rate > 60Hz:
> > > Flip should happen at the flipline boundary & returned refresh
> > rate
> > > would be 60Hz.
> > > * flip at refresh_rate == 50Hz:
> > > Flip should happen right away so returned refresh rate is 50Hz.
> > > * flip at refresh_rate < 40Hz:
> > > Flip should happen at the vmax so the returned refresh rate
> > > would be 40Hz.
> > >
> > > v2:
> > > * s/*vblank_ns/*event_ns/ (Manasi)
> > > * Reset vrr_enabled state before enabling it (Manasi)
> >
> > >
> > > Cc: Harry Wentland <harry.wentland@amd.com>
> > > Cc: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> > > Cc: Manasi Navare <manasi.d.navare@intel.com>
> > > Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
> > > Reviewed-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
> > > ---
> > > tests/kms_vrr.c | 113 +++++++++++++++++++++++++++++++++++-------------
> > > 1 file changed, 82 insertions(+), 31 deletions(-)
> > >
> > > diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
> > > index 471d765dec..ac42165bef 100644
> > > --- a/tests/kms_vrr.c
> > > +++ b/tests/kms_vrr.c
> > > @@ -37,6 +37,7 @@ enum {
> > > TEST_NONE = 0,
> > > TEST_DPMS = 1 << 0,
> > > TEST_SUSPEND = 1 << 1,
> > > +TEST_FLIPLINE = 1 << 2,
> > > };
> > >
> > > typedef struct range {
> > > @@ -52,6 +53,12 @@ typedef struct data {
> > > igt_fb_t fb1;
> > > } data_t;
> > >
> > > +typedef struct vtest_ns {
> > > +uint64_t min;
> > > +uint64_t mid;
> > > +uint64_t max;
> > > +} vtest_ns_t;
> > > +
> > > typedef void (*test_t)(data_t*, enum pipe, igt_output_t*, uint32_t);
> > >
> > > /* Converts a timespec structure to nanoseconds. */
> > > @@ -104,13 +111,18 @@ static uint64_t rate_from_refresh(uint64_t
> > refresh)
> > > return NSECS_PER_SEC / refresh;
> > > }
> > >
> > > -/* Returns the min and max vrr range from the connector debugfs. */
> > > +/* Read min and max vrr range from the connector debugfs.
> > > + * - min range should be less than the current mode vfreq
> > > + * - if max range is grater than the current mode vfreq, consider
> > > + * current mode vfreq as the max range.
> > > + */
> > > static range_t get_vrr_range(data_t *data, igt_output_t *output)
> > > {
> > > char buf[256];
> > > char *start_loc;
> > > int fd, res;
> > > range_t range;
> > > +drmModeModeInfo *mode = igt_output_get_mode(output);
> > >
> > > fd = igt_debugfs_connector_dir(data->drm_fd, output->name,
> > O_RDONLY);
> > > igt_assert(fd >= 0);
> > > @@ -122,32 +134,28 @@ static range_t get_vrr_range(data_t *data,
> > igt_output_t *output)
> > >
> > > igt_assert(start_loc = strstr(buf, "Min: "));
> > > igt_assert_eq(sscanf(start_loc, "Min: %u", &range.min), 1);
> > > +igt_require(mode->vrefresh > range.min);
> > >
> > > igt_assert(start_loc = strstr(buf, "Max: "));
> > > igt_assert_eq(sscanf(start_loc, "Max: %u", &range.max), 1);
> > >
> > > +range.max = (mode->vrefresh < range.max) ? mode->vrefresh :
> > range.max;
> > > +
> > > return range;
> > > }
> > >
> > > -/* Returns a suitable vrr test frequency. */
> > > -static uint64_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > > +/* Returns vrr test frequency for min, mid & max range. */
> > > +static vtest_ns_t get_test_rate_ns(data_t *data, igt_output_t *output)
> > > {
> > > -drmModeModeInfo *mode = igt_output_get_mode(output);
> > > range_t range;
> > > -uint64_t vtest;
> > > +vtest_ns_t vtest_ns;
> > >
> > > -/*
> > > - * The frequency with the fastest convergence speed should be
> > > - * the midpoint between the current mode vfreq and the min
> > > - * supported vfreq.
> > > - */
> > > range = get_vrr_range(data, output);
> > > -igt_require(mode->vrefresh > range.min);
> > > -
> > > -vtest = (mode->vrefresh - range.min) / 2 + range.min;
> > > -igt_require(vtest < mode->vrefresh);
> > > +vtest_ns.min = rate_from_refresh(range.min);
> > > +vtest_ns.mid = rate_from_refresh(((range.max + range.min) / 2));
> > > +vtest_ns.max = rate_from_refresh(range.max);
> > >
> > > -return rate_from_refresh(vtest);
> > > +return vtest_ns;
> > > }
> > >
> > > /* Returns true if an output supports VRR. */
> > > @@ -195,6 +203,11 @@ static void prepare_test(data_t *data, igt_output_t
> > *output, enum pipe pipe)
> > > data->primary = igt_output_get_plane_type(output,
> > DRM_PLANE_TYPE_PRIMARY);
> > > igt_plane_set_fb(data->primary, &data->fb0);
> > >
> > > +/* Clear vrr_enabled state before enabling it, because
> > > + * it might be left enabled if the previous test fails.
> > > + */
> > > +igt_pipe_set_prop_value(&data->display, pipe, IGT_CRTC_VRR_ENABLED,
> > 0);
> >
> > Like I said in my comment below this shouldhappen before calling
> > prepare_test()
> > Also the set_vrr_pipe(1) call should happen at the beginning of
> > prepare_test() so that
> > VRR prop is set before doing a modeset with the desired fb.
> >
> > What I have in my code for testing is:
> >
> > test_basic()
> > {
> > set_vrr_on_pipe(0)
> > prepare_test()
> > .
> > .
> > .
> > }
> >
> > And in prepare_test()
> > {
> > set_vrr_on_pipe(1);
> > create_fb
> > .
> > .
> > .
> > atomic_commit();
> > }
> >
> >
> [Bhanu] Why do we need to enable VRR before modeset? I think Driver will take care of it.
>
> As you mentioned in your Engg changes, in atomic_check:
> if (!needs_modeset(new_crtc_state) && old_crtc_state->uapi.vrr_enabled == new_crtc_state->uapi.vrr_enabled)
> continue;
>
> For first IGT execution:
> vrr_enabled status is 0
> create FB & do modeset
> set vrr_enabled to 1 & flip
> above check will fail & kernel will perform required tasks
> set vrr_enabled to 0 & flip
> above check will fail & kernel will perform required tasks
>
> For some reason test got failed & vrr_enabled status kept 1.
> In next IGT execution:
> vrr_enabled status is 1
> update to 0 (this patch will update vrr_enabled to 0 before modeset)
> remaining execution is same as above.
>
> Is my interpretation correct? Also can you please help to test your code with this patch?
Intially I thought that prepare test() since we are preparing for vrr test would
actually be the modeset where vrr goes from 0 to 1 but
basically here we are using prepare test function to set everything clean
without VRR with vrr prop set to 0 and then set it to 1 before flip.
Yes I think this should work.
Also I do have the kernel patches now with the full enable/disable sequence
implemented and I will test this patch as well as send you my patches
to do the testing on your end.
But so far functionality wise this does look good.
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
Manasi
> > > +
> > > igt_display_commit_atomic(&data->display,
> > > DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
> > > }
> > > @@ -250,6 +263,7 @@ flip_and_measure(data_t *data, igt_output_t *output,
> > enum pipe pipe,
> > > uint64_t start_ns, last_event_ns;
> > > uint32_t total_flip = 0, total_pass = 0;
> > > bool front = false;
> > > +vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
> > >
> > > /* Align with the vblank region to speed up convergence. */
> > > last_event_ns = wait_for_vblank(data, pipe);
> > > @@ -268,10 +282,6 @@ flip_and_measure(data_t *data, igt_output_t
> > *output, enum pipe pipe,
> > > * that same frame.
> > > */
> > > event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
> > > -diff_ns = rate_ns - (event_ns - last_event_ns);
> > > -last_event_ns = event_ns;
> > > -
> > > -total_flip += 1;
> > >
> > > /*
> > > * Check if the difference between the two flip timestamps
> > > @@ -281,9 +291,19 @@ flip_and_measure(data_t *data, igt_output_t
> > *output, enum pipe pipe,
> > > * difference between 144Hz and 143Hz which should give this
> > > * enough accuracy for most use cases.
> > > */
> > > +if ((rate_ns <= vtest_ns.min) && (rate_ns >= vtest_ns.max))
> > > +diff_ns = rate_ns - (event_ns - last_event_ns);
> > > +else if (rate_ns > vtest_ns.min)
> > > +diff_ns = vtest_ns.min - (event_ns - last_event_ns);
> > > +else if (rate_ns < vtest_ns.max)
> > > +diff_ns = vtest_ns.max - (event_ns - last_event_ns);
> > > +
> > > if (llabs(diff_ns) < 50000ll)
> > > total_pass += 1;
> > >
> > > +last_event_ns = event_ns;
> > > +total_flip += 1;
> > > +
> > > now_ns = get_time_ns();
> > > if (now_ns - start_ns > duration_ns)
> > > break;
> > > @@ -310,10 +330,13 @@ flip_and_measure(data_t *data, igt_output_t
> > *output, enum pipe pipe,
> > > static void
> > > test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t
> > flags)
> > > {
> > > -uint64_t rate;
> > > uint32_t result;
> > > +vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
> > > +range_t range = get_vrr_range(data, output);
> > > +uint64_t rate = vtest_ns.mid;
> > >
> > > -rate = get_test_rate_ns(data, output);
> > > +igt_info("VRR Test execution on %s, PIPE_%s\n",
> > > + output->name, kmstest_pipe_name(pipe));
> > >
> > The reseting of vrr_enabled prop should be done before prepare test
> > so before we set the
> > desrired fb. I would recommend a call set_vrr_on_pipe(0) before calling
> > prepare_test()
> > This is what I had to do for testing the kernel code. It should be a
> > complete set_vrr_on_pipe() call
> > which will set the prop to 0 and commit
> >
> > Manasi
> >
> >
> > > prepare_test(data, output, pipe);
> > >
> > > @@ -339,21 +362,45 @@ test_basic(data_t *data, enum pipe pipe,
> > igt_output_t *output, uint32_t flags)
> > > igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
> > > SUSPEND_TEST_NONE);
> > >
> > > -result = flip_and_measure(data, output, pipe, rate,
> > TEST_DURATION_NS);
> > > -
> > > -set_vrr_on_pipe(data, pipe, 0);
> > > +/*
> > > + * Check flipline mode by making sure that flips happen at flipline
> > > + * decision boundary.
> > > + *
> > > + * Example: if range is 40 - 60Hz and
> > > + * if refresh_rate > 60Hz:
> > > + * Flip should happen at the flipline boundary & returned
> > refresh rate
> > > + * would be 60Hz.
> > > + * if refresh_rate is 50Hz:
> > > + * Flip will happen right away so returned refresh rate is
> > 50Hz.
> > > + * if refresh_rate < 40Hz:
> > > + * Flip should happen at the vmax so the returned refresh rate
> > > + * would be 40Hz.
> > > + */
> > > +if (flags & TEST_FLIPLINE) {
> > > +rate = rate_from_refresh(range.min - 5);
> > > +result = flip_and_measure(data, output, pipe, rate,
> > TEST_DURATION_NS);
> > > +igt_assert_f(result > 75,
> > > + "Refresh rate %"PRIu64"ns: Target VRR on threshold
> > not reached, result was %u%%\n",
> > > + rate, result);
> > > +
> > > +rate = rate_from_refresh(range.max + 5);
> > > +result = flip_and_measure(data, output, pipe, rate,
> > TEST_DURATION_NS);
> > > +igt_assert_f(result > 75,
> > > + "Refresh rate %"PRIu64"ns: Target VRR on threshold
> > not reached, result was %u%%\n",
> > > + rate, result);
> > > +}
> > >
> > > -/* This check is delayed until after VRR is disabled so it isn't
> > > - * left enabled if the test fails. */
> > > +rate = vtest_ns.mid;
> > > +result = flip_and_measure(data, output, pipe, rate,
> > TEST_DURATION_NS);
> > > igt_assert_f(result > 75,
> > > - "Target VRR on threshold not reached, result was %u%%\n",
> > > - result);
> > > + "Refresh rate %"PRIu64"ns: Target VRR on threshold not
> > reached, result was %u%%\n",
> > > + rate, result);
> > >
> > > +set_vrr_on_pipe(data, pipe, 0);
> > > result = flip_and_measure(data, output, pipe, rate,
> > TEST_DURATION_NS);
> > > -
> > > igt_assert_f(result < 10,
> > > - "Target VRR off threshold exceeded, result was %u%%\n",
> > > - result);
> > > + "Refresh rate %"PRIu64"ns: Target VRR off threshold
> > exceeded, result was %u%%\n",
> > > + rate, result);
> > >
> > > /* Clean-up */
> > > igt_plane_set_fb(data->primary, NULL);
> > > @@ -413,6 +460,10 @@ igt_main
> > > igt_subtest("flip-suspend")
> > > run_vrr_test(&data, test_basic, TEST_SUSPEND);
> > >
> > > +igt_describe("Make sure that flips happen at flipline decision
> > boundary.");
> > > +igt_subtest("flipline")
> > > +run_vrr_test(&data, test_basic, TEST_FLIPLINE);
> > > +
> > > igt_fixture {
> > > igt_display_fini(&data.display);
> > > }
> > > --
> > > 2.20.1
> > >
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2020-10-13 21:42 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-24 14:48 [igt-dev] [v4 0/2] New subtest for VRR Flipline mode bhanuprakash.modem
2020-09-24 7:46 ` [igt-dev] ✓ Fi.CI.BAT: success for New subtest for VRR Flipline mode (rev5) Patchwork
2020-09-24 9:15 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2020-09-24 14:48 ` [igt-dev] [v4 1/2] tests/kms_vrr: Use atomic API for page flip bhanuprakash.modem
2020-09-29 19:41 ` Navare, Manasi
2020-09-29 22:14 ` Navare, Manasi
2020-09-24 14:48 ` [igt-dev] [v4 2/2] tests/kms_vrr: Add new subtest to validate Flipline mode bhanuprakash.modem
2020-09-29 22:12 ` Navare, Manasi
2020-09-30 15:34 ` Modem, Bhanuprakash
2020-10-13 21:44 ` Navare, Manasi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.