diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 56 | 
1 files changed, 44 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 5d127e06895..da1ad9c80bb 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -8144,10 +8144,6 @@ intel_modeset_stage_output_state(struct drm_device *dev,  			DRM_DEBUG_KMS("encoder changed, full mode switch\n");  			config->mode_changed = true;  		} - -		/* Disable all disconnected encoders. */ -		if (connector->base.status == connector_status_disconnected) -			connector->new_encoder = NULL;  	}  	/* connector->new_encoder is now updated for all connectors. */ @@ -8602,19 +8598,30 @@ int intel_framebuffer_init(struct drm_device *dev,  {  	int ret; -	if (obj->tiling_mode == I915_TILING_Y) +	if (obj->tiling_mode == I915_TILING_Y) { +		DRM_DEBUG("hardware does not support tiling Y\n");  		return -EINVAL; +	} -	if (mode_cmd->pitches[0] & 63) +	if (mode_cmd->pitches[0] & 63) { +		DRM_DEBUG("pitch (%d) must be at least 64 byte aligned\n", +			  mode_cmd->pitches[0]);  		return -EINVAL; +	}  	/* FIXME <= Gen4 stride limits are bit unclear */ -	if (mode_cmd->pitches[0] > 32768) +	if (mode_cmd->pitches[0] > 32768) { +		DRM_DEBUG("pitch (%d) must be at less than 32768\n", +			  mode_cmd->pitches[0]);  		return -EINVAL; +	}  	if (obj->tiling_mode != I915_TILING_NONE && -	    mode_cmd->pitches[0] != obj->stride) +	    mode_cmd->pitches[0] != obj->stride) { +		DRM_DEBUG("pitch (%d) must match tiling stride (%d)\n", +			  mode_cmd->pitches[0], obj->stride);  		return -EINVAL; +	}  	/* Reject formats not supported by any plane early. */  	switch (mode_cmd->pixel_format) { @@ -8625,8 +8632,10 @@ int intel_framebuffer_init(struct drm_device *dev,  		break;  	case DRM_FORMAT_XRGB1555:  	case DRM_FORMAT_ARGB1555: -		if (INTEL_INFO(dev)->gen > 3) +		if (INTEL_INFO(dev)->gen > 3) { +			DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);  			return -EINVAL; +		}  		break;  	case DRM_FORMAT_XBGR8888:  	case DRM_FORMAT_ABGR8888: @@ -8634,18 +8643,22 @@ int intel_framebuffer_init(struct drm_device *dev,  	case DRM_FORMAT_ARGB2101010:  	case DRM_FORMAT_XBGR2101010:  	case DRM_FORMAT_ABGR2101010: -		if (INTEL_INFO(dev)->gen < 4) +		if (INTEL_INFO(dev)->gen < 4) { +			DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);  			return -EINVAL; +		}  		break;  	case DRM_FORMAT_YUYV:  	case DRM_FORMAT_UYVY:  	case DRM_FORMAT_YVYU:  	case DRM_FORMAT_VYUY: -		if (INTEL_INFO(dev)->gen < 6) +		if (INTEL_INFO(dev)->gen < 5) { +			DRM_DEBUG("invalid format: 0x%08x\n", mode_cmd->pixel_format);  			return -EINVAL; +		}  		break;  	default: -		DRM_DEBUG_KMS("unsupported pixel format 0x%08x\n", mode_cmd->pixel_format); +		DRM_DEBUG("unsupported pixel format 0x%08x\n", mode_cmd->pixel_format);  		return -EINVAL;  	} @@ -9167,6 +9180,23 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)  	 * the crtc fixup. */  } +static void i915_redisable_vga(struct drm_device *dev) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	u32 vga_reg; + +	if (HAS_PCH_SPLIT(dev)) +		vga_reg = CPU_VGACNTRL; +	else +		vga_reg = VGACNTRL; + +	if (I915_READ(vga_reg) != VGA_DISP_DISABLE) { +		DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); +		I915_WRITE(vga_reg, VGA_DISP_DISABLE); +		POSTING_READ(vga_reg); +	} +} +  /* Scan out the current hw modeset state, sanitizes it and maps it into the drm   * and i915 state tracking structures. */  void intel_modeset_setup_hw_state(struct drm_device *dev, @@ -9275,6 +9305,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,  			intel_set_mode(&crtc->base, &crtc->base.mode,  				       crtc->base.x, crtc->base.y, crtc->base.fb);  		} + +		i915_redisable_vga(dev);  	} else {  		intel_modeset_update_staged_output_state(dev);  	}  |