diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 81 | 
1 files changed, 45 insertions, 36 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 432fc04c6bf..2166ee071dd 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -3771,8 +3771,11 @@ static bool g4x_compute_wm0(struct drm_device *dev,  	int entries, tlb_miss;  	crtc = intel_get_crtc_for_plane(dev, plane); -	if (crtc->fb == NULL || !crtc->enabled) +	if (crtc->fb == NULL || !crtc->enabled) { +		*cursor_wm = cursor->guard_size; +		*plane_wm = display->guard_size;  		return false; +	}  	htotal = crtc->mode.htotal;  	hdisplay = crtc->mode.hdisplay; @@ -5602,9 +5605,9 @@ static int intel_crtc_clock_get(struct drm_device *dev, struct drm_crtc *crtc)  	intel_clock_t clock;  	if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0) -		fp = FP0(pipe); +		fp = I915_READ(FP0(pipe));  	else -		fp = FP1(pipe); +		fp = I915_READ(FP1(pipe));  	clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;  	if (IS_PINEVIEW(dev)) { @@ -6215,36 +6218,6 @@ cleanup_work:  	return ret;  } -static void intel_crtc_reset(struct drm_crtc *crtc) -{ -	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); - -	/* Reset flags back to the 'unknown' status so that they -	 * will be correctly set on the initial modeset. -	 */ -	intel_crtc->dpms_mode = -1; -} - -static struct drm_crtc_helper_funcs intel_helper_funcs = { -	.dpms = intel_crtc_dpms, -	.mode_fixup = intel_crtc_mode_fixup, -	.mode_set = intel_crtc_mode_set, -	.mode_set_base = intel_pipe_set_base, -	.mode_set_base_atomic = intel_pipe_set_base_atomic, -	.load_lut = intel_crtc_load_lut, -	.disable = intel_crtc_disable, -}; - -static const struct drm_crtc_funcs intel_crtc_funcs = { -	.reset = intel_crtc_reset, -	.cursor_set = intel_crtc_cursor_set, -	.cursor_move = intel_crtc_cursor_move, -	.gamma_set = intel_crtc_gamma_set, -	.set_config = drm_crtc_helper_set_config, -	.destroy = intel_crtc_destroy, -	.page_flip = intel_crtc_page_flip, -}; -  static void intel_sanitize_modesetting(struct drm_device *dev,  				       int pipe, int plane)  { @@ -6281,6 +6254,42 @@ static void intel_sanitize_modesetting(struct drm_device *dev,  	intel_disable_pipe(dev_priv, pipe);  } +static void intel_crtc_reset(struct drm_crtc *crtc) +{ +	struct drm_device *dev = crtc->dev; +	struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + +	/* Reset flags back to the 'unknown' status so that they +	 * will be correctly set on the initial modeset. +	 */ +	intel_crtc->dpms_mode = -1; + +	/* We need to fix up any BIOS configuration that conflicts with +	 * our expectations. +	 */ +	intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane); +} + +static struct drm_crtc_helper_funcs intel_helper_funcs = { +	.dpms = intel_crtc_dpms, +	.mode_fixup = intel_crtc_mode_fixup, +	.mode_set = intel_crtc_mode_set, +	.mode_set_base = intel_pipe_set_base, +	.mode_set_base_atomic = intel_pipe_set_base_atomic, +	.load_lut = intel_crtc_load_lut, +	.disable = intel_crtc_disable, +}; + +static const struct drm_crtc_funcs intel_crtc_funcs = { +	.reset = intel_crtc_reset, +	.cursor_set = intel_crtc_cursor_set, +	.cursor_move = intel_crtc_cursor_move, +	.gamma_set = intel_crtc_gamma_set, +	.set_config = drm_crtc_helper_set_config, +	.destroy = intel_crtc_destroy, +	.page_flip = intel_crtc_page_flip, +}; +  static void intel_crtc_init(struct drm_device *dev, int pipe)  {  	drm_i915_private_t *dev_priv = dev->dev_private; @@ -6330,8 +6339,6 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)  	setup_timer(&intel_crtc->idle_timer, intel_crtc_idle_timer,  		    (unsigned long)intel_crtc); - -	intel_sanitize_modesetting(dev, intel_crtc->pipe, intel_crtc->plane);  }  int intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, @@ -6572,8 +6579,10 @@ intel_user_framebuffer_create(struct drm_device *dev,  		return ERR_PTR(-ENOENT);  	intel_fb = kzalloc(sizeof(*intel_fb), GFP_KERNEL); -	if (!intel_fb) +	if (!intel_fb) { +		drm_gem_object_unreference_unlocked(&obj->base);  		return ERR_PTR(-ENOMEM); +	}  	ret = intel_framebuffer_init(dev, intel_fb, mode_cmd, obj);  	if (ret) {  |