On Tue, Jul 09, 2013 at 02:00:51PM +0100, Chris Wilson wrote: > On Tue, Jul 09, 2013 at 11:45:04AM +0200, Daniel Vetter wrote: > > In kernel modeset driver mode we're in full control of the chip, > > always. So there's no need at all to set mm.suspended in > > i915_gem_idle. Hence move that out into the leavevt ioctl. Since > > i915_gem_idle doesn't suspend gem any more we can also drop the > > re-enabling for KMS in the thaw function. > > > > Also clean up the handling of mm.suspend at driver load by coalescing > > all the assignments. > > > > Stumbled over while reading through our resume code for unrelated > > reasons. > > > > v2: Shovel mm.suspended into the (newly created) ums dungeon as > > suggested by Chris Wilson. The plan is that once we've completely > > stopped relying on the register save/restore code we could shovel even > > that in there. > > > > Cc: Chris Wilson <chris at chris-wilson.co.uk> > > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> > > Minor comments inline. Doing the rename in the same patch made it much > easier to check all the users, > Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk> I've merged the updated version with the nitpicks fixed, thanks for your review. -Daniel > > > --- > > drivers/gpu/drm/i915/i915_dma.c | 16 +++++++-------- > > drivers/gpu/drm/i915/i915_drv.c | 5 ++--- > > drivers/gpu/drm/i915/i915_drv.h | 24 +++++++++++++---------- > > drivers/gpu/drm/i915/i915_gem.c | 31 ++++++++++++++++++------------ > > drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +- > > 5 files changed, 43 insertions(+), 35 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c > > index 0e22142..beca2d0 100644 > > --- a/drivers/gpu/drm/i915/i915_dma.c > > +++ b/drivers/gpu/drm/i915/i915_dma.c > > @@ -1323,10 +1323,8 @@ static int i915_load_modeset_init(struct drm_device *dev) > > /* Always safe in the mode setting case. */ > > /* FIXME: do pre/post-mode set stuff in core KMS code */ > > dev->vblank_disable_allowed = 1; > > - if (INTEL_INFO(dev)->num_pipes == 0) { > > - dev_priv->mm.suspended = 0; > > + if (INTEL_INFO(dev)->num_pipes == 0) > > return 0; > > - } > > > > ret = intel_fbdev_init(dev); > > if (ret) > > @@ -1352,9 +1350,6 @@ static int i915_load_modeset_init(struct drm_device *dev) > > > > drm_kms_helper_poll_init(dev); > > > > - /* We're off and running w/KMS */ > > - dev_priv->mm.suspended = 0; > > - > > return 0; > > > > cleanup_gem: > > @@ -1629,9 +1624,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) > > goto out_gem_unload; > > } > > > > - /* Start out suspended */ > > - dev_priv->mm.suspended = 1; > > - > > if (HAS_POWER_WELL(dev)) > > i915_init_power_well(dev); > > > > @@ -1641,6 +1633,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) > > DRM_ERROR("failed to init modeset\n"); > > goto out_gem_unload; > > } > > + > > + /* We're off and running w/KMS */ > > + dev_priv->ums.mm_suspended = 0; > > Just don't bother touching it here (we kzalloc our driver private). > > > + } else { > > + /* Start out suspended in ums mode. */ > > + dev_priv->ums.mm_suspended = 1; > > } > > > > i915_setup_sysfs(dev); > > diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c > > index e6dc81c..50a76f59 100644 > > --- a/drivers/gpu/drm/i915/i915_drv.c > > +++ b/drivers/gpu/drm/i915/i915_drv.c > > @@ -661,7 +661,6 @@ static int __i915_drm_thaw(struct drm_device *dev) > > intel_init_pch_refclk(dev); > > > > mutex_lock(&dev->struct_mutex); > > - dev_priv->mm.suspended = 0; > > > > error = i915_gem_init_hw(dev); > > mutex_unlock(&dev->struct_mutex); > > @@ -960,11 +959,11 @@ int i915_reset(struct drm_device *dev) > > * switched away). > > */ > > if (drm_core_check_feature(dev, DRIVER_MODESET) || > > - !dev_priv->mm.suspended) { > > + !dev_priv->ums.mm_suspended) { > > struct intel_ring_buffer *ring; > > int i; > > > > - dev_priv->mm.suspended = 0; > > + dev_priv->ums.mm_suspended = 0; > > > > i915_gem_init_swizzling(dev); > > > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > > index c8d6104..be2fcd3 100644 > > --- a/drivers/gpu/drm/i915/i915_drv.h > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > @@ -814,6 +814,18 @@ struct i915_dri1_state { > > uint32_t counter; > > }; > > > > +struct i915_ums_state { > > + /** > > + * Flag if the X Server, and thus DRM, is not currently in > > + * control of the device. > > + * > > + * This is set between LeaveVT and EnterVT. It needs to be > > + * replaced with a semaphore. It also needs to be > > + * transitioned away from for kernel modesetting. > > + */ > > + int mm_suspended; > > +}; > > + > > struct intel_l3_parity { > > u32 *remap_info; > > struct work_struct error_work; > > @@ -884,16 +896,6 @@ struct i915_gem_mm { > > */ > > bool interruptible; > > > > - /** > > - * Flag if the X Server, and thus DRM, is not currently in > > - * control of the device. > > - * > > - * This is set between LeaveVT and EnterVT. It needs to be > > - * replaced with a semaphore. It also needs to be > > - * transitioned away from for kernel modesetting. > > - */ > > - int suspended; > > - > > /** Bit 6 swizzling required for X tiling */ > > uint32_t bit_6_swizzle_x; > > /** Bit 6 swizzling required for Y tiling */ > > @@ -1187,6 +1189,8 @@ typedef struct drm_i915_private { > > /* Old dri1 support infrastructure, beware the dragons ya fools entering > > * here! */ > > struct i915_dri1_state dri1; > > + /* Old ums support infrastructure, same warning applies. */ > > + struct i915_ums_state ums; > > } drm_i915_private_t; > > > > /* Iterate over initialised rings */ > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > > index af61be8..5ad9f35 100644 > > --- a/drivers/gpu/drm/i915/i915_gem.c > > +++ b/drivers/gpu/drm/i915/i915_gem.c > > @@ -2082,7 +2082,7 @@ int __i915_add_request(struct intel_ring_buffer *ring, > > trace_i915_gem_request_add(ring, request->seqno); > > ring->outstanding_lazy_request = 0; > > > > - if (!dev_priv->mm.suspended) { > > + if (!dev_priv->ums.mm_suspended) { > > if (i915_enable_hangcheck) { > > mod_timer(&dev_priv->gpu_error.hangcheck_timer, > > round_jiffies_up(jiffies + DRM_I915_HANGCHECK_JIFFIES)); > > @@ -2387,7 +2387,7 @@ i915_gem_retire_work_handler(struct work_struct *work) > > idle &= list_empty(&ring->request_list); > > } > > > > - if (!dev_priv->mm.suspended && !idle) > > + if (!dev_priv->ums.mm_suspended && !idle) > > queue_delayed_work(dev_priv->wq, &dev_priv->mm.retire_work, > > round_jiffies_up_relative(HZ)); > > if (idle) > > @@ -3983,7 +3983,7 @@ i915_gem_idle(struct drm_device *dev) > > > > mutex_lock(&dev->struct_mutex); > > > > - if (dev_priv->mm.suspended) { > > + if (dev_priv->ums.mm_suspended) { > > mutex_unlock(&dev->struct_mutex); > > return 0; > > } > > @@ -3999,11 +3999,6 @@ i915_gem_idle(struct drm_device *dev) > > if (!drm_core_check_feature(dev, DRIVER_MODESET)) > > i915_gem_evict_everything(dev); > > > > - /* Hack! Don't let anybody do execbuf while we don't control the chip. > > - * We need to replace this with a semaphore, or something. > > - * And not confound mm.suspended! > > - */ > > - dev_priv->mm.suspended = 1; > > del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); > > > > i915_kernel_lost_context(dev); > > @@ -4220,7 +4215,7 @@ int > > i915_gem_entervt_ioctl(struct drm_device *dev, void *data, > > struct drm_file *file_priv) > > { > > - drm_i915_private_t *dev_priv = dev->dev_private; > > + struct drm_i915_private *dev_priv = dev->dev_private; > > int ret; > > > > if (drm_core_check_feature(dev, DRIVER_MODESET)) > > @@ -4232,7 +4227,7 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data, > > } > > > > mutex_lock(&dev->struct_mutex); > > - dev_priv->mm.suspended = 0; > > + dev_priv->ums.mm_suspended = 0; > > > > ret = i915_gem_init_hw(dev); > > if (ret != 0) { > > @@ -4252,7 +4247,7 @@ i915_gem_entervt_ioctl(struct drm_device *dev, void *data, > > cleanup_ringbuffer: > > mutex_lock(&dev->struct_mutex); > > i915_gem_cleanup_ringbuffer(dev); > > - dev_priv->mm.suspended = 1; > > + dev_priv->ums.mm_suspended = 1; > > mutex_unlock(&dev->struct_mutex); > > > > return ret; > > @@ -4262,11 +4257,23 @@ int > > i915_gem_leavevt_ioctl(struct drm_device *dev, void *data, > > struct drm_file *file_priv) > > { > > + struct drm_i915_private *dev_priv = dev->dev_private; > > + int ret; > > + > > if (drm_core_check_feature(dev, DRIVER_MODESET)) > > return 0; > > > > drm_irq_uninstall(dev); > > - return i915_gem_idle(dev); > > + ret = i915_gem_idle(dev); > > + > > + /* Hack! Don't let anybody do execbuf while we don't control the chip. > > + * We need to replace this with a semaphore, or something. > > + * And not confound ums.mm_suspended! > > + */ > > + if (ret != 0) > > + dev_priv->ums.mm_suspended = 1; > > ARGH. The locking, it hurts. Please never show this code in public again. > -Chris > > -- > Chris Wilson, Intel Open Source Technology Centre -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch