@@ -925,7 +925,8 @@ static int dm_dmub_hw_init(struct amdgpu_device *adev)
925925 abm -> dmcu_is_running = dmcu -> funcs -> is_dmcu_initialized (dmcu );
926926 }
927927
928- adev -> dm .dc -> ctx -> dmub_srv = dc_dmub_srv_create (adev -> dm .dc , dmub_srv );
928+ if (!adev -> dm .dc -> ctx -> dmub_srv )
929+ adev -> dm .dc -> ctx -> dmub_srv = dc_dmub_srv_create (adev -> dm .dc , dmub_srv );
929930 if (!adev -> dm .dc -> ctx -> dmub_srv ) {
930931 DRM_ERROR ("Couldn't allocate DC DMUB server!\n" );
931932 return - ENOMEM ;
@@ -1954,7 +1955,6 @@ static int dm_suspend(void *handle)
19541955
19551956 amdgpu_dm_irq_suspend (adev );
19561957
1957-
19581958 dc_set_power_state (dm -> dc , DC_ACPI_CM_POWER_STATE_D3 );
19591959
19601960 return 0 ;
@@ -5500,7 +5500,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
55005500 struct drm_display_mode saved_mode ;
55015501 struct drm_display_mode * freesync_mode = NULL ;
55025502 bool native_mode_found = false;
5503- bool recalculate_timing = dm_state ? (dm_state -> scaling != RMX_OFF ) : false;
5503+ bool recalculate_timing = false;
5504+ bool scale = dm_state ? (dm_state -> scaling != RMX_OFF ) : false;
55045505 int mode_refresh ;
55055506 int preferred_refresh = 0 ;
55065507#if defined(CONFIG_DRM_AMD_DC_DCN )
@@ -5563,19 +5564,18 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
55635564 */
55645565 DRM_DEBUG_DRIVER ("No preferred mode found\n" );
55655566 } else {
5566- recalculate_timing | = amdgpu_freesync_vid_mode &&
5567+ recalculate_timing = amdgpu_freesync_vid_mode &&
55675568 is_freesync_video_mode (& mode , aconnector );
55685569 if (recalculate_timing ) {
55695570 freesync_mode = get_highest_refresh_rate_mode (aconnector , false);
55705571 saved_mode = mode ;
55715572 mode = * freesync_mode ;
55725573 } else {
55735574 decide_crtc_timing_for_drm_display_mode (
5574- & mode , preferred_mode ,
5575- dm_state ? (dm_state -> scaling != RMX_OFF ) : false);
5576- }
5575+ & mode , preferred_mode , scale );
55775576
5578- preferred_refresh = drm_mode_vrefresh (preferred_mode );
5577+ preferred_refresh = drm_mode_vrefresh (preferred_mode );
5578+ }
55795579 }
55805580
55815581 if (recalculate_timing )
@@ -5587,7 +5587,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
55875587 * If scaling is enabled and refresh rate didn't change
55885588 * we copy the vic and polarities of the old timings
55895589 */
5590- if (!recalculate_timing || mode_refresh != preferred_refresh )
5590+ if (!scale || mode_refresh != preferred_refresh )
55915591 fill_stream_properties_from_drm_display_mode (
55925592 stream , & mode , & aconnector -> base , con_state , NULL ,
55935593 requested_bpc );
@@ -9854,7 +9854,7 @@ static int dm_check_crtc_cursor(struct drm_atomic_state *state,
98549854
98559855 if (cursor_scale_w != primary_scale_w ||
98569856 cursor_scale_h != primary_scale_h ) {
9857- DRM_DEBUG_ATOMIC ( "Cursor plane scaling doesn't match primary plane\n" );
9857+ drm_dbg_atomic ( crtc -> dev , "Cursor plane scaling doesn't match primary plane\n" );
98589858 return - EINVAL ;
98599859 }
98609860
@@ -9891,7 +9891,7 @@ static int validate_overlay(struct drm_atomic_state *state)
98919891 int i ;
98929892 struct drm_plane * plane ;
98939893 struct drm_plane_state * old_plane_state , * new_plane_state ;
9894- struct drm_plane_state * primary_state , * overlay_state = NULL ;
9894+ struct drm_plane_state * primary_state , * cursor_state , * overlay_state = NULL ;
98959895
98969896 /* Check if primary plane is contained inside overlay */
98979897 for_each_oldnew_plane_in_state_reverse (state , plane , old_plane_state , new_plane_state , i ) {
@@ -9921,6 +9921,14 @@ static int validate_overlay(struct drm_atomic_state *state)
99219921 if (!primary_state -> crtc )
99229922 return 0 ;
99239923
9924+ /* check if cursor plane is enabled */
9925+ cursor_state = drm_atomic_get_plane_state (state , overlay_state -> crtc -> cursor );
9926+ if (IS_ERR (cursor_state ))
9927+ return PTR_ERR (cursor_state );
9928+
9929+ if (drm_atomic_plane_disabling (plane -> state , cursor_state ))
9930+ return 0 ;
9931+
99249932 /* Perform the bounds check to ensure the overlay plane covers the primary */
99259933 if (primary_state -> crtc_x < overlay_state -> crtc_x ||
99269934 primary_state -> crtc_y < overlay_state -> crtc_y ||
0 commit comments