Loading drivers/gpu/drm/drm_crtc.c +20 −0 Original line number Original line Diff line number Diff line Loading @@ -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); drivers/gpu/drm/drm_crtc_helper.c +11 −10 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading drivers/gpu/drm/drm_irq.c +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading Loading @@ -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); drivers/gpu/drm/i915/i915_drv.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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); } } Loading drivers/gpu/drm/i915/i915_irq.c +4 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
drivers/gpu/drm/drm_crtc.c +20 −0 Original line number Original line Diff line number Diff line Loading @@ -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);
drivers/gpu/drm/drm_crtc_helper.c +11 −10 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading
drivers/gpu/drm/drm_irq.c +4 −3 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading Loading @@ -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);
drivers/gpu/drm/i915/i915_drv.c +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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); } } Loading
drivers/gpu/drm/i915/i915_irq.c +4 −4 Original line number Original line Diff line number Diff line Loading @@ -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