@@ -2335,7 +2335,6 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
23352335 drm_rect_height (& sprstate -> dst ) != drm_rect_height (& sprstate -> src ) >> 16 );
23362336 }
23372337
2338-
23392338 usable_level = max_level ;
23402339
23412340 /* ILK/SNB: LP2+ watermarks only w/o sprites */
@@ -2347,7 +2346,10 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
23472346 usable_level = 0 ;
23482347
23492348 ilk_compute_wm_level (dev_priv , intel_crtc , 0 , cstate ,
2350- pristate , sprstate , curstate , & pipe_wm -> wm [0 ]);
2349+ pristate , sprstate , curstate , & pipe_wm -> raw_wm [0 ]);
2350+
2351+ memset (& pipe_wm -> wm , 0 , sizeof (pipe_wm -> wm ));
2352+ pipe_wm -> wm [0 ] = pipe_wm -> raw_wm [0 ];
23512353
23522354 if (IS_HASWELL (dev ) || IS_BROADWELL (dev ))
23532355 pipe_wm -> linetime = hsw_compute_linetime_wm (dev , cstate );
@@ -2358,7 +2360,7 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
23582360 ilk_compute_wm_reg_maximums (dev , 1 , & max );
23592361
23602362 for (level = 1 ; level <= max_level ; level ++ ) {
2361- struct intel_wm_level * wm = & pipe_wm -> wm [level ];
2363+ struct intel_wm_level * wm = & pipe_wm -> raw_wm [level ];
23622364
23632365 ilk_compute_wm_level (dev_priv , intel_crtc , level , cstate ,
23642366 pristate , sprstate , curstate , wm );
@@ -2368,12 +2370,13 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
23682370 * register maximums since such watermarks are
23692371 * always invalid.
23702372 */
2371- if (level > usable_level ) {
2372- wm -> enable = false;
2373- } else if (!ilk_validate_wm_level (level , & max , wm )) {
2374- wm -> enable = false;
2373+ if (level > usable_level )
2374+ continue ;
2375+
2376+ if (ilk_validate_wm_level (level , & max , wm ))
2377+ pipe_wm -> wm [level ] = * wm ;
2378+ else
23752379 usable_level = level ;
2376- }
23772380 }
23782381
23792382 return 0 ;
0 commit comments