* [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] ✓ 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 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
* 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 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
* [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 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 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.