• Rodrigo Siqueira's avatar
    drm/amd/display: Always get CRTC updated constant values inside commit tail · 8976f73b
    Rodrigo Siqueira authored
    We recently improved our display atomic commit and tail sequence to
    avoid some issues related to concurrency. One of the major changes
    consisted of moving the interrupt disable and the stream release from
    our atomic commit to our atomic tail (commit 6d90a208
    ("drm/amd/display: Move disable interrupt into commit tail")) .
    However, the new code introduced inside our commit tail function was
    inserted right after the function
    drm_atomic_helper_update_legacy_modeset_state(), which has routines for
    updating internal data structs related to timestamps. As a result, in
    certain conditions, the display module can reach a situation where we
    update our constants and, after that, clean it. This situation generates
    the following warning:
    
     amdgpu 0000:03:00.0: drm_WARN_ON_ONCE(drm_drv_uses_atomic_modeset(dev))
     WARNING: CPU: 6 PID: 1269 at drivers/gpu/drm/drm_vblank.c:722
     drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340 [drm]
     ...
     RIP:
     0010:drm_crtc_vblank_helper_get_vblank_timestamp_internal+0x32b/0x340
     [drm]
     ...
     Call Trace:
      ? dc_stream_get_vblank_counter+0x57/0x60 [amdgpu]
      drm_crtc_vblank_helper_get_vblank_timestamp+0x1c/0x20 [drm]
      drm_get_last_vbltimestamp+0xad/0xc0 [drm]
      drm_reset_vblank_timestamp+0x63/0xd0 [drm]
      drm_crtc_vblank_on+0x85/0x150 [drm]
      amdgpu_dm_atomic_commit_tail+0xaf1/0x2330 [amdgpu]
      commit_tail+0x99/0x130 [drm_kms_helper]
      drm_atomic_helper_commit+0x123/0x150 [drm_kms_helper]
      amdgpu_dm_atomic_commit+0x11/0x20 [amdgpu]
      drm_atomic_commit+0x4a/0x50 [drm]
      drm_atomic_helper_set_config+0x7c/0xc0 [drm_kms_helper]
      drm_mode_setcrtc+0x20b/0x7e0 [drm]
      ? tomoyo_path_number_perm+0x6f/0x200
      ? drm_mode_getcrtc+0x190/0x190 [drm]
      drm_ioctl_kernel+0xae/0xf0 [drm]
      drm_ioctl+0x245/0x400 [drm]
      ? drm_mode_getcrtc+0x190/0x190 [drm]
      amdgpu_drm_ioctl+0x4e/0x80 [amdgpu]
      __x64_sys_ioctl+0x91/0xc0
      do_syscall_64+0x38/0x90
      entry_SYSCALL_64_after_hwframe+0x44/0xa9
     ...
    
    For fixing this issue we rely upon a refactor introduced on
    drm_atomic_helper_update_legacy_modeset_state ("Remove the timestamping
    constant update from drm_atomic_helper_update_legacy_modeset_state()")
    which decouples constant values update from
    drm_atomic_helper_update_legacy_modeset_state to a new helper.
    Basically, this commit uses this new helper and place it right after our
    release module to avoid a situation where our CRTC struct gets wrong
    values.
    
    Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1373Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
    Signed-off-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    8976f73b
amdgpu_dm.c 276 KB