Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a1dc3ff authored by Chris Wilson's avatar Chris Wilson
Browse files

Merge branch 'drm-intel-fixes' into drm-intel-next

Merge resume fixes from -fixes and an important fix for SDVO GMBUS.
parents 72557b4f 78c6e170
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -2674,3 +2674,23 @@ int drm_mode_page_flip_ioctl(struct drm_device *dev,
	mutex_unlock(&dev->mode_config.mutex);
	mutex_unlock(&dev->mode_config.mutex);
	return ret;
	return ret;
}
}

void drm_mode_config_reset(struct drm_device *dev)
{
	struct drm_crtc *crtc;
	struct drm_encoder *encoder;
	struct drm_connector *connector;

	list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
		if (crtc->funcs->reset)
			crtc->funcs->reset(crtc);

	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
		if (encoder->funcs->reset)
			encoder->funcs->reset(encoder);

	list_for_each_entry(connector, &dev->mode_config.connector_list, head)
		if (connector->funcs->reset)
			connector->funcs->reset(connector);
}
EXPORT_SYMBOL(drm_mode_config_reset);
+11 −10
Original line number Original line Diff line number Diff line
@@ -343,13 +343,12 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
	struct drm_encoder *encoder;
	struct drm_encoder *encoder;
	bool ret = true;
	bool ret = true;


	adjusted_mode = drm_mode_duplicate(dev, mode);

	crtc->enabled = drm_helper_crtc_in_use(crtc);
	crtc->enabled = drm_helper_crtc_in_use(crtc);

	if (!crtc->enabled)
	if (!crtc->enabled)
		return true;
		return true;


	adjusted_mode = drm_mode_duplicate(dev, mode);

	saved_hwmode = crtc->hwmode;
	saved_hwmode = crtc->hwmode;
	saved_mode = crtc->mode;
	saved_mode = crtc->mode;
	saved_x = crtc->x;
	saved_x = crtc->x;
@@ -437,10 +436,9 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
	 */
	 */
	drm_calc_timestamping_constants(crtc);
	drm_calc_timestamping_constants(crtc);


	/* XXX free adjustedmode */
	drm_mode_destroy(dev, adjusted_mode);
	/* FIXME: add subpixel order */
	/* FIXME: add subpixel order */
done:
done:
	drm_mode_destroy(dev, adjusted_mode);
	if (!ret) {
	if (!ret) {
		crtc->hwmode = saved_hwmode;
		crtc->hwmode = saved_hwmode;
		crtc->mode = saved_mode;
		crtc->mode = saved_mode;
@@ -497,14 +495,17 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)


	crtc_funcs = set->crtc->helper_private;
	crtc_funcs = set->crtc->helper_private;


	if (!set->mode)
		set->fb = NULL;

	if (set->fb) {
	if (set->fb) {
		DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
		DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
				set->crtc->base.id, set->fb->base.id,
				set->crtc->base.id, set->fb->base.id,
				(int)set->num_connectors, set->x, set->y);
				(int)set->num_connectors, set->x, set->y);
	} else {
	} else {
		DRM_DEBUG_KMS("[CRTC:%d] [NOFB] #connectors=%d (x y) (%i %i)\n",
		DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
				set->crtc->base.id, (int)set->num_connectors,
		set->mode = NULL;
				set->x, set->y);
		set->num_connectors = 0;
	}
	}


	dev = set->crtc->dev;
	dev = set->crtc->dev;
@@ -649,8 +650,8 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
		mode_changed = true;
		mode_changed = true;


	if (mode_changed) {
	if (mode_changed) {
		set->crtc->enabled = (set->mode != NULL);
		set->crtc->enabled = drm_helper_crtc_in_use(set->crtc);
		if (set->mode != NULL) {
		if (set->crtc->enabled) {
			DRM_DEBUG_KMS("attempting to set mode from"
			DRM_DEBUG_KMS("attempting to set mode from"
					" userspace\n");
					" userspace\n");
			drm_mode_debug_printmodeline(set->mode);
			drm_mode_debug_printmodeline(set->mode);
+4 −3
Original line number Original line Diff line number Diff line
@@ -1250,7 +1250,7 @@ void drm_handle_vblank_events(struct drm_device *dev, int crtc)
 * Drivers should call this routine in their vblank interrupt handlers to
 * Drivers should call this routine in their vblank interrupt handlers to
 * update the vblank counter and send any signals that may be pending.
 * update the vblank counter and send any signals that may be pending.
 */
 */
void drm_handle_vblank(struct drm_device *dev, int crtc)
bool drm_handle_vblank(struct drm_device *dev, int crtc)
{
{
	u32 vblcount;
	u32 vblcount;
	s64 diff_ns;
	s64 diff_ns;
@@ -1258,7 +1258,7 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
	unsigned long irqflags;
	unsigned long irqflags;


	if (!dev->num_crtcs)
	if (!dev->num_crtcs)
		return;
		return false;


	/* Need timestamp lock to prevent concurrent execution with
	/* Need timestamp lock to prevent concurrent execution with
	 * vblank enable/disable, as this would cause inconsistent
	 * vblank enable/disable, as this would cause inconsistent
@@ -1269,7 +1269,7 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
	/* Vblank irq handling disabled. Nothing to do. */
	/* Vblank irq handling disabled. Nothing to do. */
	if (!dev->vblank_enabled[crtc]) {
	if (!dev->vblank_enabled[crtc]) {
		spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
		spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
		return;
		return false;
	}
	}


	/* Fetch corresponding timestamp for this vblank interval from
	/* Fetch corresponding timestamp for this vblank interval from
@@ -1311,5 +1311,6 @@ void drm_handle_vblank(struct drm_device *dev, int crtc)
	drm_handle_vblank_events(dev, crtc);
	drm_handle_vblank_events(dev, crtc);


	spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
	spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
	return true;
}
}
EXPORT_SYMBOL(drm_handle_vblank);
EXPORT_SYMBOL(drm_handle_vblank);
+2 −0
Original line number Original line Diff line number Diff line
@@ -357,6 +357,7 @@ static int i915_drm_thaw(struct drm_device *dev)
		error = i915_gem_init_ringbuffer(dev);
		error = i915_gem_init_ringbuffer(dev);
		mutex_unlock(&dev->struct_mutex);
		mutex_unlock(&dev->struct_mutex);


		drm_mode_config_reset(dev);
		drm_irq_install(dev);
		drm_irq_install(dev);


		/* Resume the modeset for every activated CRTC */
		/* Resume the modeset for every activated CRTC */
@@ -545,6 +546,7 @@ int i915_reset(struct drm_device *dev, u8 flags)


		mutex_unlock(&dev->struct_mutex);
		mutex_unlock(&dev->struct_mutex);
		drm_irq_uninstall(dev);
		drm_irq_uninstall(dev);
		drm_mode_config_reset(dev);
		drm_irq_install(dev);
		drm_irq_install(dev);
		mutex_lock(&dev->struct_mutex);
		mutex_lock(&dev->struct_mutex);
	}
	}
+4 −4
Original line number Original line Diff line number Diff line
@@ -1202,18 +1202,18 @@ irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS)
				intel_finish_page_flip_plane(dev, 1);
				intel_finish_page_flip_plane(dev, 1);
		}
		}


		if (pipea_stats & vblank_status) {
		if (pipea_stats & vblank_status &&
		    drm_handle_vblank(dev, 0)) {
			vblank++;
			vblank++;
			drm_handle_vblank(dev, 0);
			if (!dev_priv->flip_pending_is_done) {
			if (!dev_priv->flip_pending_is_done) {
				i915_pageflip_stall_check(dev, 0);
				i915_pageflip_stall_check(dev, 0);
				intel_finish_page_flip(dev, 0);
				intel_finish_page_flip(dev, 0);
			}
			}
		}
		}


		if (pipeb_stats & vblank_status) {
		if (pipeb_stats & vblank_status &&
		    drm_handle_vblank(dev, 1)) {
			vblank++;
			vblank++;
			drm_handle_vblank(dev, 1);
			if (!dev_priv->flip_pending_is_done) {
			if (!dev_priv->flip_pending_is_done) {
				i915_pageflip_stall_check(dev, 1);
				i915_pageflip_stall_check(dev, 1);
				intel_finish_page_flip(dev, 1);
				intel_finish_page_flip(dev, 1);
Loading