drm/i915: use i915 and Ironlake CRTC enable/disable functions in prepare/commit
This will allow us to optimize our prepare/commit paths a bit better. Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> [ickle: minor tweak to handle the cursor across pipe resizing] Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
		
					parent
					
						
							
								4d12fe0b48
							
						
					
				
			
			
				commit
				
					
						7e7d76c306
					
				
			
		
					 1 changed files with 60 additions and 9 deletions
				
			
		|  | @ -2478,16 +2478,60 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void intel_crtc_prepare (struct drm_crtc *crtc) | /* Prepare for a mode set.
 | ||||||
|  |  * | ||||||
|  |  * Note we could be a lot smarter here.  We need to figure out which outputs | ||||||
|  |  * will be enabled, which disabled (in short, how the config will changes) | ||||||
|  |  * and perform the minimum necessary steps to accomplish that, e.g. updating | ||||||
|  |  * watermarks, FBC configuration, making sure PLLs are programmed correctly, | ||||||
|  |  * panel fitting is in the proper state, etc. | ||||||
|  |  */ | ||||||
|  | static void i9xx_crtc_prepare(struct drm_crtc *crtc) | ||||||
| { | { | ||||||
| 	struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | 	struct drm_device *dev = crtc->dev; | ||||||
| 	crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_crtc->cursor_on = false; | ||||||
|  | 	intel_crtc_update_cursor(crtc); | ||||||
|  | 
 | ||||||
|  | 	i9xx_crtc_disable(crtc); | ||||||
|  | 	intel_clear_scanline_wait(dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void intel_crtc_commit (struct drm_crtc *crtc) | static void i9xx_crtc_commit(struct drm_crtc *crtc) | ||||||
| { | { | ||||||
| 	struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | 	struct drm_device *dev = crtc->dev; | ||||||
| 	crtc_funcs->dpms(crtc, DRM_MODE_DPMS_ON); | 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_update_watermarks(dev); | ||||||
|  | 	i9xx_crtc_enable(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_crtc->cursor_on = true; | ||||||
|  | 	intel_crtc_update_cursor(crtc); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void ironlake_crtc_prepare(struct drm_crtc *crtc) | ||||||
|  | { | ||||||
|  | 	struct drm_device *dev = crtc->dev; | ||||||
|  | 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_crtc->cursor_on = false; | ||||||
|  | 	intel_crtc_update_cursor(crtc); | ||||||
|  | 
 | ||||||
|  | 	ironlake_crtc_disable(crtc); | ||||||
|  | 	intel_clear_scanline_wait(dev); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void ironlake_crtc_commit(struct drm_crtc *crtc) | ||||||
|  | { | ||||||
|  | 	struct drm_device *dev = crtc->dev; | ||||||
|  | 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_update_watermarks(dev); | ||||||
|  | 	ironlake_crtc_enable(crtc); | ||||||
|  | 
 | ||||||
|  | 	intel_crtc->cursor_on = true; | ||||||
|  | 	intel_crtc_update_cursor(crtc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void intel_encoder_prepare (struct drm_encoder *encoder) | void intel_encoder_prepare (struct drm_encoder *encoder) | ||||||
|  | @ -5184,14 +5228,12 @@ cleanup_work: | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static const struct drm_crtc_helper_funcs intel_helper_funcs = { | static struct drm_crtc_helper_funcs intel_helper_funcs = { | ||||||
| 	.dpms = intel_crtc_dpms, | 	.dpms = intel_crtc_dpms, | ||||||
| 	.mode_fixup = intel_crtc_mode_fixup, | 	.mode_fixup = intel_crtc_mode_fixup, | ||||||
| 	.mode_set = intel_crtc_mode_set, | 	.mode_set = intel_crtc_mode_set, | ||||||
| 	.mode_set_base = intel_pipe_set_base, | 	.mode_set_base = intel_pipe_set_base, | ||||||
| 	.mode_set_base_atomic = intel_pipe_set_base_atomic, | 	.mode_set_base_atomic = intel_pipe_set_base_atomic, | ||||||
| 	.prepare = intel_crtc_prepare, |  | ||||||
| 	.commit = intel_crtc_commit, |  | ||||||
| 	.load_lut = intel_crtc_load_lut, | 	.load_lut = intel_crtc_load_lut, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -5241,6 +5283,15 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) | ||||||
| 
 | 
 | ||||||
| 	intel_crtc->cursor_addr = 0; | 	intel_crtc->cursor_addr = 0; | ||||||
| 	intel_crtc->dpms_mode = -1; | 	intel_crtc->dpms_mode = -1; | ||||||
|  | 
 | ||||||
|  | 	if (HAS_PCH_SPLIT(dev)) { | ||||||
|  | 		intel_helper_funcs.prepare = ironlake_crtc_prepare; | ||||||
|  | 		intel_helper_funcs.commit = ironlake_crtc_commit; | ||||||
|  | 	} else { | ||||||
|  | 		intel_helper_funcs.prepare = i9xx_crtc_prepare; | ||||||
|  | 		intel_helper_funcs.commit = i9xx_crtc_commit; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); | 	drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); | ||||||
| 
 | 
 | ||||||
| 	intel_crtc->busy = false; | 	intel_crtc->busy = false; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jesse Barnes
				Jesse Barnes